odex30_standard/hr_delegation_management/models/ir_rule.py

131 lines
6.2 KiB
Python

from odoo import models, fields, api, _, tools, SUPERUSER_ID
from datetime import date
from odoo.tools.safe_eval import safe_eval
from odoo.osv import expression
from odoo.tools import config
import logging
_logger = logging.getLogger(__name__)
class IrRuleInherit(models.Model):
_inherit = 'ir.rule'
@api.model
def _compute_domain(self, model_name, mode="read"):
if self.env.su:
return self.browse(())
user_id = self.env.user
today = date.today()
if user_id:
employee_id = user_id.employee_id.id or False
has_delegation = False
delegation_ids = self.env['authority.delegation']
domain = []
if employee_id:
delegation_ids = self.env['authority.delegation'].sudo().search([
('state', '=', 'approved'),
('date_from', '<=', str(today)),
('date_to', '>=', str(today)),
('delegate_id', '=', employee_id)
])
for delegation_id in delegation_ids:
has_delegation = True
if delegation_id.delegation_line_ids and model_name in delegation_id.delegation_line_ids. \
mapped('model_configuration_id').mapped('model_id').mapped('model') \
and delegation_id.delegator_id and delegation_id.delegator_id.user_id:
user_id = delegation_id.delegator_id.user_id
action_domain = delegation_id.delegation_line_ids.mapped('action_id') \
.filtered(lambda act: act.res_model == model_name).domain
if action_domain:
domain.append(safe_eval(action_domain))
if mode not in self._MODES:
raise ValueError('Invalid mode: %r' % (mode,))
if self._uid == SUPERUSER_ID:
return None
if mode not in self._MODES:
raise ValueError('Invalid mode: %r' % (mode,))
rules = self._get_rules(model_name, mode=mode)
if not rules:
return
eval_context = self._eval_context()
if has_delegation and user_id == self.env.user:
user_groups = self.env['res.groups'].browse([group_id.id for group_id in
delegation_ids.mapped('user_group_ids')])
else:
user_groups = user_id.groups_id
global_domains = [] # list of domains
group_domains = domain # list of domains
for rule in rules.sudo():
# evaluate the domain for the current user
eval_context['user'] = user_id
dom = safe_eval(rule.domain_force, eval_context) if rule.domain_force else []
dom = expression.normalize_domain(dom)
if not rule.groups:
global_domains.append(dom)
elif rule.groups & user_groups:
group_domains.append(dom)
# combine global domains and group domains
if not group_domains:
return expression.AND(global_domains)
return expression.AND(global_domains + [expression.OR(group_domains)])
# def _compute_domain(self, model_name, mode="read"):
# user_id = self.env.user
# today = date.today()
# if user_id:
# employee_id = user_id.employee_id.id or False
# has_delegation = False
# delegation_ids = self.env['authority.delegation']
# domain = []
# if employee_id:
# delegation_ids = self.env['authority.delegation'].sudo().search([
# ('state', '=', 'approved'),
# ('date_from', '<=', str(today)),
# ('date_to', '>=', str(today)),
# ('delegate_id', '=', employee_id)
# ])
# for delegation_id in delegation_ids:
# has_delegation = True
# if delegation_id.delegation_line_ids and model_name in delegation_id.delegation_line_ids. \
# mapped('model_configuration_id').mapped('model_id').mapped('model') \
# and delegation_id.delegator_id and delegation_id.delegator_id.user_id:
# user_id = delegation_id.delegator_id.user_id
# action_domain = delegation_id.delegation_line_ids.mapped('action_id') \
# .filtered(lambda act: act.res_model == model_name).domain
# if action_domain:
# domain.append(safe_eval(action_domain))
# rules = self._get_rules(model_name, mode=mode)
# if not rules:
# return
#
# # browse user and rules as SUPERUSER_ID to avoid access errors!
# eval_context = self._eval_context()
# if has_delegation and user_id == self.env.user:
# user_groups = self.env['res.groups'].browse([group_id.id for group_id in
# delegation_ids.mapped('user_group_ids')])
# else:
# user_groups = user_id.groups_id
# global_domains = [] # list of domains
# group_domains = domain # list of domains
# for rule in self.browse(rules).sudo():
# # evaluate the domain for the current user
# eval_context['user'] = user_id
# dom = safe_eval(rule.domain_force, eval_context) if rule.domain_force else []
# dom = expression.normalize_domain(dom)
# if not rule.groups:
# global_domains.append(dom)
# elif rule.groups & user_groups:
# group_domains.append(dom)
#
# # combine global domains and group domains
# if not group_domains:
# return expression.AND(global_domains)
# return expression.AND(global_domains + [expression.OR(group_domains)])