odex25_standard/odex25_base/hspl_user_simulation/models/models.py

84 lines
3.1 KiB
Python

# Copyright 2018, 2020 Heliconia Solutions Pvt Ltd (https://heliconia.io)
import logging
from odoo import SUPERUSER_ID, api, models
from odoo.exceptions import AccessDenied
from odoo.http import request
_logger = logging.getLogger(__name__)
class ResUsers(models.Model):
_inherit = "res.users"
@classmethod
def _login(cls, db, login, password, user_agent_env):
if not password:
return False
user_id = False
try:
with cls.pool.cursor() as cr:
self = api.Environment(cr, SUPERUSER_ID, {})[cls._name]
# env = {'interactive': False}' # added because need parameter
user = self.search([("login", "=", login)])
if user:
user_id = user.id
if type(request.params).__name__ == "OrderedDict":
user.with_user(user_id)._check_credentials(
password, {"interactive": False}
)
# user.with_user(user_id)._check_credentials(password)
user.with_user(user_id)._update_last_login()
else:
user.with_user(user_id)._update_last_login()
except AccessDenied:
user_id = False
status = "successful" if user_id else "failed"
ip = request.httprequest.environ["REMOTE_ADDR"] if request else "n/a"
_logger.info("Login %s for db:%s login:%s from %s", status, db, login, ip)
return user_id
@classmethod
def authenticate(cls, db, login, password, user_agent_env):
uid = cls._login(db, login, password, user_agent_env)
if uid == SUPERUSER_ID:
if user_agent_env and user_agent_env.get("base_location"):
try:
with cls.pool.cursor() as cr:
base = user_agent_env["base_location"]
ICP = api.Environment(cr, uid, {})["ir.config_parameter"]
if not ICP.get_param("web.base.url.freeze"):
ICP.set_param("web.base.url", base)
except Exception:
_logger.exception(
"Failed to update web.base.url configuration parameter"
)
return uid
@api.model
def check_for_user_simulation(self, user_id):
# got the call here : we will check here the group and if it is simulated or not
if request.session.get("is_simulated"):
return True
if user_id in [
user.id
for user in self.env.ref("hspl_user_simulation.group_user_simulation").users
]:
return True
return False
@api.model
def name_search(self, name="", args=None, operator="ilike", limit=100):
if self.env.context.get("user_simulation_context"):
user_ids = [user.id for user in self.env.ref("base.group_user").users]
args = args or []
args += [("id", "in", user_ids)]
return super(ResUsers, self).name_search(
name=name, args=args, operator=operator, limit=limit
)