# Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models class ResUsers(models.Model): _inherit = "res.users" last_role_line_modification = fields.Datetime( string="Last roles modification", readonly=True ) @api.model def _prepare_role_line_history_dict(self, role_line): return { "user_id": role_line.user_id.id, "role_id": role_line.role_id.id, "date_from": role_line.date_from, "date_to": role_line.date_to, "is_enabled": role_line.is_enabled, } def _get_role_line_values_by_user(self): role_line_values_by_user = {} for rec in self: role_line_values_by_user.setdefault(rec, {}) for role_line in rec.role_line_ids: role_line_values_by_user[rec][ role_line.id ] = self._prepare_role_line_history_dict(role_line) return role_line_values_by_user @api.model_create_multi def create(self, vals_list): res = super().create(vals_list) for vals in vals_list: if "role_line_ids" not in vals: return res new_role_line_values_by_user = res._get_role_line_values_by_user() self.env["base.user.role.line.history"].create_from_vals( {}, new_role_line_values_by_user ) res.last_role_line_modification = fields.Datetime.now() return res def write(self, vals): if "role_line_ids" not in vals: return super().write(vals) old_role_line_values_by_user = self._get_role_line_values_by_user() res = super().write(vals) new_role_line_values_by_user = self._get_role_line_values_by_user() self.env["base.user.role.line.history"].create_from_vals( old_role_line_values_by_user, new_role_line_values_by_user ) self.write({"last_role_line_modification": fields.Datetime.now()}) return res def show_role_lines_history(self): # pragma: no cover self.ensure_one() domain = [("user_id", "=", self.id)] return { "name": _("Roles history"), "type": "ir.actions.act_window", "view_mode": "tree,form", "res_model": "base.user.role.line.history", "domain": domain, }