Files
tradon/res/ir.py
2025-12-26 13:11:43 +00:00

280 lines
8.2 KiB
Python
Executable File

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.cache import Cache
from trytond.model import DeactivableMixin, ModelSQL, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction, without_check_access
class UIMenu(metaclass=PoolMeta):
__name__ = 'ir.ui.menu'
groups = fields.Many2Many(
'ir.ui.menu-res.group', 'menu', 'group', "Groups")
class UIMenuGroup(ModelSQL):
"UI Menu - Group"
__name__ = 'ir.ui.menu-res.group'
menu = fields.Many2One('ir.ui.menu', 'Menu', ondelete='CASCADE',
required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
class ActionGroup(ModelSQL):
"Action - Group"
__name__ = 'ir.action-res.group'
action = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',
required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
@classmethod
def create(cls, vlist):
Action = Pool().get('ir.action')
vlist = [x.copy() for x in vlist]
for vals in vlist:
if vals.get('action'):
vals['action'] = Action.get_action_id(vals['action'])
res = super(ActionGroup, cls).create(vlist)
return res
@classmethod
def write(cls, records, values, *args):
Action = Pool().get('ir.action')
actions = iter((records, values) + args)
args = []
for records, values in zip(actions, actions):
if values.get('action'):
values = values.copy()
values['action'] = Action.get_action_id(values['action'])
args.extend((records, values))
super(ActionGroup, cls).write(*args)
class Action(metaclass=PoolMeta):
__name__ = 'ir.action'
groups = fields.Many2Many(
'ir.action-res.group', 'action', 'group', "Groups")
class ActionMixin(metaclass=PoolMeta):
@classmethod
@without_check_access
def get_groups(cls, name, action_id=None):
# TODO add cache
domain = [
(cls._action_name, '=', name),
]
if action_id:
domain.append(('id', '=', action_id))
actions = cls.search(domain)
groups = {g.id for a in actions for g in a.groups}
return groups
class ActionReport(ActionMixin):
__name__ = 'ir.action.report'
class ActionActWindow(ActionMixin):
__name__ = 'ir.action.act_window'
class ActionWizard(ActionMixin):
__name__ = 'ir.action.wizard'
class ActionURL(ActionMixin):
__name__ = 'ir.action.url'
class ActionKeyword(metaclass=PoolMeta):
__name__ = 'ir.action.keyword'
groups = fields.Function(fields.One2Many('res.group', None, 'Groups'),
'get_groups', searcher='search_groups')
def get_groups(self, name):
return [g.id for g in self.action.groups]
@classmethod
def search_groups(cls, name, clause):
return [('action.' + clause[0],) + tuple(clause[1:])]
class ModelButton(metaclass=PoolMeta):
__name__ = 'ir.model.button'
groups = fields.Many2Many(
'ir.model.button-res.group', 'button', 'group', "Groups")
_groups_cache = Cache('ir.model.button.groups')
@classmethod
def create(cls, vlist):
result = super().create(vlist)
cls._groups_cache.clear()
return result
@classmethod
def write(cls, buttons, values, *args):
super().write(buttons, values, *args)
cls._groups_cache.clear()
@classmethod
def delete(cls, buttons):
super().delete(buttons)
cls._groups_cache.clear()
@classmethod
def get_groups(cls, model, name):
'''
Return a set of group ids for the named button on the model.
'''
key = (model, name)
groups = cls._groups_cache.get(key)
if groups is not None:
return groups
buttons = cls.search([
('model.model', '=', model),
('name', '=', name),
])
if not buttons:
groups = set()
else:
button, = buttons
groups = set(g.id for g in button.groups)
cls._groups_cache.set(key, groups)
return groups
class ModelButtonGroup(DeactivableMixin, ModelSQL):
"Model Button - Group"
__name__ = 'ir.model.button-res.group'
button = fields.Many2One('ir.model.button', 'Button',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
@classmethod
def create(cls, vlist):
pool = Pool()
result = super(ModelButtonGroup, cls).create(vlist)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
return result
@classmethod
def write(cls, records, values, *args):
pool = Pool()
super(ModelButtonGroup, cls).write(records, values, *args)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
@classmethod
def delete(cls, records):
pool = Pool()
super(ModelButtonGroup, cls).delete(records)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
class ModelButtonRule(metaclass=PoolMeta):
__name__ = 'ir.model.button.rule'
group = fields.Many2One('res.group', "Group", ondelete='CASCADE')
class ModelButtonClick(metaclass=PoolMeta):
__name__ = 'ir.model.button.click'
user = fields.Many2One('res.user', "User", ondelete='CASCADE')
class RuleGroup(metaclass=PoolMeta):
__name__ = 'ir.rule.group'
groups = fields.Many2Many(
'ir.rule.group-res.group', 'rule_group', 'group', "Groups")
class RuleGroupGroup(ModelSQL):
"Rule Group - Group"
__name__ = 'ir.rule.group-res.group'
rule_group = fields.Many2One('ir.rule.group', 'Rule Group',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
class Rule(metaclass=PoolMeta):
__name__ = 'ir.rule'
@classmethod
def _get_context(cls, model_name):
context = super()._get_context(model_name)
if model_name in {'res.user.warning', 'res.user.application'}:
context['user_id'] = Transaction().user
return context
@classmethod
def _get_cache_key(cls, model_names):
key = super()._get_cache_key(model_names)
if model_names & {'res.user.warning', 'res.user.application'}:
key = (*key, Transaction().user)
return key
class SequenceType(metaclass=PoolMeta):
__name__ = 'ir.sequence.type'
groups = fields.Many2Many('ir.sequence.type-res.group', 'sequence_type',
'group', 'User Groups',
help='Groups allowed to edit the sequences of this type.')
class SequenceTypeGroup(ModelSQL):
'Sequence Type - Group'
__name__ = 'ir.sequence.type-res.group'
sequence_type = fields.Many2One('ir.sequence.type', 'Sequence Type',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'User Groups',
ondelete='CASCADE', required=True)
class Export(metaclass=PoolMeta):
__name__ = 'ir.export'
groups = fields.Many2Many(
'ir.export-res.group', 'export', 'group', "Groups",
help="The user groups that can use the export.")
write_groups = fields.Many2Many(
'ir.export-write-res.group', 'export', 'group',
"Modification Groups",
domain=[
('id', 'in', Eval('groups', [])),
],
states={
'invisible': ~Eval('groups'),
},
depends=['groups'],
help="The user groups that can modify the export.")
class Export_Group(ModelSQL):
"Export Group"
__name__ = 'ir.export-res.group'
export = fields.Many2One(
'ir.export', "Export", required=True, ondelete='CASCADE')
group = fields.Many2One(
'res.group', "Group", required=True, ondelete='CASCADE')
class Export_Write_Group(Export_Group):
"Export Modification Group"
__name__ = 'ir.export-write-res.group'
_table = None # Needed to reset Export_Group._table