Initial import from Docker volume
This commit is contained in:
95
res/group.py
Executable file
95
res/group.py
Executable file
@@ -0,0 +1,95 @@
|
||||
# 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 itertools import chain
|
||||
|
||||
from sql import With
|
||||
|
||||
from trytond.model import (
|
||||
DeactivableMixin, ModelSQL, ModelView, Unique, fields, tree)
|
||||
from trytond.pool import Pool
|
||||
from trytond.tools import grouped_slice
|
||||
|
||||
|
||||
class MenuMany2Many(fields.Many2Many):
|
||||
|
||||
def get(self, ids, model, name, values=None):
|
||||
Menu = self.get_target()
|
||||
res = super(MenuMany2Many, self).get(ids, model, name,
|
||||
values=values)
|
||||
menu_ids = list(set(chain(*res.values())))
|
||||
test_ids = []
|
||||
for sub_ids in grouped_slice(menu_ids):
|
||||
test_ids.append(list(map(int, Menu.search([
|
||||
('id', 'in', sub_ids),
|
||||
]))))
|
||||
menu_ids = set(chain(*test_ids))
|
||||
for group_id, ids in res.items():
|
||||
res[group_id] = tuple(id_ for id_ in ids if id_ in menu_ids)
|
||||
return res
|
||||
|
||||
|
||||
class Group(DeactivableMixin, tree(), ModelSQL, ModelView):
|
||||
"Group"
|
||||
__name__ = "res.group"
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
|
||||
parent = fields.Many2One(
|
||||
'res.group', "Parent",
|
||||
help="The group to inherit accesses from.")
|
||||
model_access = fields.One2Many('ir.model.access', 'group',
|
||||
'Access Model')
|
||||
field_access = fields.One2Many('ir.model.field.access', 'group',
|
||||
'Access Field')
|
||||
buttons = fields.Many2Many(
|
||||
'ir.model.button-res.group', 'group', 'button', "Buttons")
|
||||
rule_groups = fields.Many2Many('ir.rule.group-res.group',
|
||||
'group', 'rule_group', 'Rules',
|
||||
domain=[('global_p', '!=', True), ('default_p', '!=', True)])
|
||||
menu_access = MenuMany2Many('ir.ui.menu-res.group',
|
||||
'group', 'menu', 'Access Menu')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(Group, cls).__setup__()
|
||||
table = cls.__table__()
|
||||
cls._sql_constraints += [
|
||||
('name_uniq', Unique(table, table.name),
|
||||
'The name of the group must be unique!')
|
||||
]
|
||||
cls._order.insert(0, ('name', 'ASC'))
|
||||
|
||||
@classmethod
|
||||
def write(cls, *args):
|
||||
super().write(*args)
|
||||
pool = Pool()
|
||||
# Restart the cache for get_groups
|
||||
pool.get('res.user')._get_groups_cache.clear()
|
||||
|
||||
@classmethod
|
||||
def copy(cls, groups, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default = default.copy()
|
||||
|
||||
new_groups = []
|
||||
for group in groups:
|
||||
i = 1
|
||||
while True:
|
||||
name = '%s (%d)' % (group.name, i)
|
||||
if not cls.search([('name', '=', name)], order=[]):
|
||||
break
|
||||
i += 1
|
||||
default['name'] = name
|
||||
new_groups.extend(super(Group, cls).copy([group], default=default))
|
||||
return new_groups
|
||||
|
||||
@classmethod
|
||||
def group_parent_all_cte(cls):
|
||||
group = cls.__table__()
|
||||
parents = With('id', 'parent', recursive=True)
|
||||
parents.query = group.select(group.id, group.parent)
|
||||
parents.query |= group.select(group.id, group.id)
|
||||
parents.query |= (group
|
||||
.join(parents, condition=group.parent == parents.id)
|
||||
.select(group.id, parents.parent))
|
||||
return parents
|
||||
Reference in New Issue
Block a user