mirror of
https://github.com/OCA/server-backend.git
synced 2025-02-18 09:52:42 +02:00
[9.0][ADD] - base_user_role_history
This commit is contained in:
2
base_user_role_history/models/__init__.py
Normal file
2
base_user_role_history/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import res_users
|
||||
from . import base_user_role_line_history
|
||||
145
base_user_role_history/models/base_user_role_line_history.py
Normal file
145
base_user_role_history/models/base_user_role_line_history.py
Normal file
@@ -0,0 +1,145 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2019 ACSONE SA/NV
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from openerp import api, fields, models
|
||||
|
||||
|
||||
class BaseUserRoleLineHistory(models.Model):
|
||||
_name = 'base.user.role.line.history'
|
||||
_description = "History of user roles"
|
||||
_order = 'id desc'
|
||||
|
||||
performed_action = fields.Selection(
|
||||
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 suspend security
|
||||
# (nobody has the create right)
|
||||
for role_history_vals in role_history_line_vals_by_role_line.values():
|
||||
self.suspend_security().create(role_history_vals)
|
||||
75
base_user_role_history/models/res_users.py
Normal file
75
base_user_role_history/models/res_users.py
Normal file
@@ -0,0 +1,75 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2019 ACSONE SA/NV
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from openerp 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': fields.Date.from_string(role_line.date_from),
|
||||
'date_to': fields.Date.from_string(role_line.date_to),
|
||||
'is_enabled': role_line.is_enabled,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
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
|
||||
def create(self, vals):
|
||||
res = super(ResUsers, self).create(vals)
|
||||
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
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'role_line_ids' not in vals:
|
||||
return super(ResUsers, self).write(vals)
|
||||
old_role_line_values_by_user = self._get_role_line_values_by_user()
|
||||
res = super(ResUsers, self).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
|
||||
|
||||
@api.multi
|
||||
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,
|
||||
}
|
||||
Reference in New Issue
Block a user