[MIG] base_user_role_history: Migration to 17.0

This commit is contained in:
Christopher Rogos
2024-07-08 14:25:28 +00:00
parent 5bc11801a0
commit 6e671c0fb0
12 changed files with 297 additions and 152 deletions

View File

@@ -1,2 +1,3 @@
from . import res_users
from . import base_user_role_line_history
from . import res_users_role_line

View File

@@ -1,7 +1,7 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from odoo import fields, models
class BaseUserRoleLineHistory(models.Model):
@@ -13,105 +13,28 @@ class BaseUserRoleLineHistory(models.Model):
string="Action",
selection=[("add", "Add"), ("unlink", "Delete"), ("edit", "Edit")],
required=True,
readonly=True,
)
user_id = fields.Many2one(
string="User",
comodel_name="res.users",
ondelete="cascade",
readonly=True,
index=True,
)
old_role_id = fields.Many2one(
string="Old role",
comodel_name="res.users.role",
ondelete="cascade",
readonly=True,
index=True,
)
new_role_id = fields.Many2one(
string="New role",
comodel_name="res.users.role",
ondelete="cascade",
readonly=True,
index=True,
)
old_date_from = fields.Date(string="Old start date", readonly=True)
new_date_from = fields.Date(string="New start date", readonly=True)
old_date_to = fields.Date(string="Old end date", readonly=True)
new_date_to = fields.Date(string="New end date", readonly=True)
old_is_enabled = fields.Boolean(string="Active before edit", readonly=True)
new_is_enabled = fields.Boolean(string="Active after edit", readonly=True)
@api.model
def _prepare_create_from_vals(
self, old_role_line_values_by_user, new_role_line_values_by_user
):
role_history_line_vals_by_role_line = {}
for key, value in new_role_line_values_by_user.items():
old_vals = old_role_line_values_by_user.get(key, {})
new_vals = value
# Manage deletion of role lines and old values of modified lines
for role_line_id, role_line_vals in old_vals.items():
action = "unlink" if role_line_id not in new_vals else "edit"
if action == "edit":
# Skip if no change
if not any(
role_line_vals[k] != new_vals[role_line_id][k]
for k in role_line_vals
):
continue
role_history_line_vals_by_role_line.setdefault(role_line_id, {})
role_history_line_vals_by_role_line[role_line_id].update(
{
"performed_action": action,
"user_id": role_line_vals["user_id"],
"old_role_id": role_line_vals["role_id"],
"old_date_from": role_line_vals["date_from"],
"old_date_to": role_line_vals["date_to"],
"old_is_enabled": role_line_vals["is_enabled"],
}
)
# Manage addition of role lines and new values of modified ones
for role_line_id, role_line_vals in new_vals.items():
action = "add" if role_line_id not in old_vals else "edit"
if action == "edit":
# Skip if no change
if not any(
role_line_vals[k] != old_vals[role_line_id][k]
for k in role_line_vals
):
continue
role_history_line_vals_by_role_line.setdefault(role_line_id, {})
role_history_line_vals_by_role_line[role_line_id].update(
{
"performed_action": action,
"user_id": role_line_vals["user_id"],
"new_role_id": role_line_vals["role_id"],
"new_date_from": role_line_vals["date_from"],
"new_date_to": role_line_vals["date_to"],
"new_is_enabled": role_line_vals["is_enabled"],
}
)
return role_history_line_vals_by_role_line
@api.model
def create_from_vals(
self, old_role_line_values_by_user, new_role_line_values_by_user
):
"""
This method creates user role line history objects based on given
old/new values.
old_role_line_values_by_user and new_role_line_values_by_user are like:
{user_id:
{role_line_id:
{role_line_values},
},
}
"""
role_history_line_vals_by_role_line = self._prepare_create_from_vals(
old_role_line_values_by_user, new_role_line_values_by_user
)
# Create the history lines with sudo
# (nobody has the create right)
self.sudo().create(list(role_history_line_vals_by_role_line.values()))
old_date_from = fields.Date(string="Old start date")
new_date_from = fields.Date(string="New start date")
old_date_to = fields.Date(string="Old end date")
new_date_to = fields.Date(string="New end date")
old_is_enabled = fields.Boolean(string="Active before edit")
new_is_enabled = fields.Boolean(string="Active after edit")

View File

@@ -1,65 +1,22 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo import _, fields, models
class ResUsers(models.Model):
_inherit = "res.users"
last_role_line_modification = fields.Datetime(
string="Last roles modification", readonly=True
compute="_compute_last_role_line_modification",
)
@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)
if all("role_line_ids" not in vals for vals in vals_list):
return res
new_role_line_values_by_user = res._get_role_line_values_by_user()
new_role_line_to_create = {}
users = self.browse()
for user, lines in new_role_line_values_by_user.items():
if lines:
new_role_line_to_create[user] = lines
user |= user
self.env["base.user.role.line.history"].create_from_vals(
{}, new_role_line_to_create
)
users.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()
vals["last_role_line_modification"] = fields.Datetime.now()
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
)
return res
def _compute_last_role_line_modification(self):
for user in self:
res = self.env["base.user.role.line.history"].search(
[("user_id", "=", user.id)], limit=1, order="id desc"
)
user.last_role_line_modification = res.create_date if res else False
def show_role_lines_history(self): # pragma: no cover
self.ensure_one()

View File

@@ -0,0 +1,72 @@
from odoo import api, models
class ResUsersRoleLine(models.Model):
_inherit = "res.users.role.line"
def write(self, vals):
history_lines = []
for line in self:
history_line = {
"performed_action": "edit",
"user_id": line.user_id.id,
"old_role_id": line.role_id.id,
"old_date_from": line.date_from,
"old_date_to": line.date_to,
"old_is_enabled": line.is_enabled,
"new_role_id": vals.get("role_id", line.role_id.id),
"new_date_from": vals.get("date_from", line.date_from),
"new_date_to": vals.get("date_to", line.date_to),
"new_is_enabled": vals.get("is_enabled", line.is_enabled),
}
if (
history_line["old_role_id"] == history_line["new_role_id"]
and history_line["old_date_from"] == history_line["new_date_from"]
and history_line["old_date_to"] == history_line["new_date_to"]
and history_line["old_is_enabled"] == history_line["new_is_enabled"]
):
continue
history_lines.append(history_line)
res = super().write(vals)
self.env["base.user.role.line.history"].sudo().create(history_lines)
return res
@api.model_create_multi
def create(self, vals_list):
history_lines = []
for line in vals_list:
history_line = {
"performed_action": "add",
"user_id": line.get("user_id", False),
"new_role_id": line.get("role_id", False),
"new_date_from": line.get("date_from", False),
"new_date_to": line.get("date_to", False),
"new_is_enabled": line.get("is_enabled", True),
}
history_lines.append(history_line)
res = super().create(vals_list)
self.env["base.user.role.line.history"].sudo().create(history_lines)
return res
def unlink(self):
history_lines = []
for line in self:
history_line = {
"performed_action": "unlink",
"user_id": line.user_id.id,
"old_role_id": line.role_id.id,
"old_date_from": line.date_from,
"old_date_to": line.date_to,
"old_is_enabled": line.is_enabled,
}
history_lines.append(history_line)
res = super().unlink()
self.env["base.user.role.line.history"].sudo().create(history_lines)
return res