Files
tryton/modules/user_role/res.py
T

133 lines
4.0 KiB
Python
Raw Normal View History

2018-10-28 00:20:56 +02:00
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
2022-04-19 13:18:10 +02:00
import datetime as dt
2018-10-28 00:20:56 +02:00
from trytond.model import ModelSQL, ModelView, fields
2021-12-11 17:58:45 +01:00
from trytond.pool import Pool, PoolMeta
2026-09-10 16:07:26 +02:00
from trytond.pyson import Bool, Eval, Id, If
2018-10-28 00:20:56 +02:00
class Role(ModelSQL, ModelView):
"Role"
__name__ = 'res.role'
name = fields.Char("Name", required=True, translate=True)
groups = fields.Many2Many('res.role-res.group', 'role', 'group', "Groups")
@classmethod
def write(cls, *args):
pool = Pool()
User = pool.get('res.user')
roles = sum(args[0:None:2], [])
super().write(*args)
users = User.search([
('roles.role', 'in', [r.id for r in roles]),
2018-10-28 00:20:56 +02:00
])
User.sync_roles(users)
class RoleGroup(ModelSQL):
"Role - Group"
__name__ = 'res.role-res.group'
role = fields.Many2One(
'res.role', "Role", ondelete='CASCADE', required=True)
2018-10-28 00:20:56 +02:00
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
class User(metaclass=PoolMeta):
__name__ = 'res.user'
2026-09-10 16:07:26 +02:00
roles = fields.One2Many(
'res.user.role', 'user', "Roles",
states={
'invisible': Eval('id', -1) == Id('res', 'user_admin'),
})
2018-10-28 00:20:56 +02:00
@classmethod
def __setup__(cls):
super().__setup__()
group_readonly = Bool(Eval('roles', []))
if 'readonly' in cls.groups.states:
group_readonly |= cls.groups.states['readonly']
cls.groups.states['readonly'] = group_readonly
cls._context_fields.append('roles')
@classmethod
def create(cls, vlist):
users = super().create(vlist)
cls.sync_roles(users)
return users
@classmethod
def write(cls, *args):
users = sum(args[0:None:2], [])
super().write(*args)
cls.sync_roles(users)
@classmethod
def sync_roles(cls, users=None, date=None):
2026-09-10 16:07:26 +02:00
pool = Pool()
ModelData = pool.get('ir.model.data')
admin_id = ModelData.get_id('res', 'user_admin')
2018-10-28 00:20:56 +02:00
if date is None:
2022-04-19 13:18:10 +02:00
date = dt.datetime.now()
2018-10-28 00:20:56 +02:00
if users is None:
users = cls.search([])
to_write = []
for user in users:
2026-09-10 16:07:26 +02:00
if user.id == admin_id:
continue
2018-10-28 00:20:56 +02:00
if not user.roles:
continue
new = {g.id for r in user.roles for g in r.role.groups
if r.valid(date)}
old = {g.id for g in user.groups}
if new != old:
to_write.append([user])
to_write.append({'groups': [
('add', new - old),
('remove', old - new),
]})
if to_write:
cls.write(*to_write)
class UserRole(ModelSQL, ModelView):
"User Role"
__name__ = 'res.user.role'
user = fields.Many2One(
2026-09-10 16:07:26 +02:00
'res.user', "User", ondelete='CASCADE', required=True,
domain=[
If(Eval('user', -1) == Id('res', 'user_admin'),
('id', '=', -1),
()),
])
2018-10-28 00:20:56 +02:00
role = fields.Many2One('res.role', "Role", required=True)
2022-04-19 13:18:10 +02:00
from_date = fields.DateTime(
2018-10-28 00:20:56 +02:00
"From Date",
domain=[
If(Eval('from_date') & Eval('to_date'),
('from_date', '<=', Eval('to_date', None)),
()),
])
2022-04-19 13:18:10 +02:00
to_date = fields.DateTime(
2018-10-28 00:20:56 +02:00
"To Date",
domain=[
If(Eval('from_date') & Eval('to_date'),
('to_date', '>=', Eval('from_date', None)),
()),
])
2018-10-28 00:20:56 +02:00
@classmethod
def __setup__(cls):
super().__setup__()
cls._order.insert(0, ('from_date', 'DESC NULLS FIRST'))
cls._order.insert(1, ('to_date', 'ASC NULLS FIRST'))
def valid(self, date):
2022-04-19 13:18:10 +02:00
from_date = self.from_date or dt.datetime.min
to_date = self.to_date or dt.datetime.max
2018-10-28 00:20:56 +02:00
return from_date <= date <= to_date