84 lines
3.1 KiB
Python
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
|
|
)
|