changeset 9f5055b5f4b2 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=9f5055b5f4b2
description:
Add resource relate on notification log
We store on the log the record as resource but also the notification to
get
the email subject.
issue9457
review307901002
diffstat:
trytond/ir/resource.py | 135 +++++++++++++++++++++++++-----------------------
1 files changed, 70 insertions(+), 65 deletions(-)
diffs (162 lines):
diff -r acdbdcac6687 -r 9f5055b5f4b2 trytond/ir/resource.py
--- a/trytond/ir/resource.py Mon Aug 10 23:24:02 2020 +0200
+++ b/trytond/ir/resource.py Tue Aug 11 22:00:26 2020 +0200
@@ -8,13 +8,78 @@
from trytond.pyson import Eval
from trytond.transaction import Transaction
-__all__ = ['ResourceMixin', 'resource_copy']
+__all__ = ['ResourceAccessMixin', 'ResourceMixin', 'resource_copy']
-class ResourceMixin(ModelStorage, ModelView):
+class ResourceAccessMixin(ModelStorage):
+
+ resource = fields.Reference(
+ "Resource", selection='get_models', required=True, select=True)
+
+ @classmethod
+ def default_resource(cls):
+ return Transaction().context.get('resource')
+
+ @staticmethod
+ def get_models():
+ pool = Pool()
+ Model = pool.get('ir.model')
+ ModelAccess = pool.get('ir.model.access')
+ models = Model.search([])
+ access = ModelAccess.get_access([m.model for m in models])
+ return [(m.model, m.name) for m in models if access[m.model]['read']]
+
+ @classmethod
+ def check_access(cls, ids, mode='read'):
+ pool = Pool()
+ ModelAccess = pool.get('ir.model.access')
+ if ((Transaction().user == 0)
+ or not Transaction().context.get('_check_access')):
+ return
+ model_names = set()
+ with Transaction().set_context(_check_access=False):
+ for record in cls.browse(ids):
+ if record.resource:
+ model_names.add(str(record.resource).split(',')[0])
+ for model_name in model_names:
+ checks = cls._convert_check_access(model_name, mode)
+ for model, check_mode in checks:
+ ModelAccess.check(model, mode=check_mode)
- resource = fields.Reference('Resource', selection='get_models',
- required=True, select=True)
+ @classmethod
+ def _convert_check_access(cls, model, mode):
+ return [
+ (model, {'create': 'write', 'delete': 'write'}.get(mode, mode))]
+
+ @classmethod
+ def read(cls, ids, fields_names):
+ cls.check_access(ids, mode='read')
+ return super().read(ids, fields_names)
+
+ @classmethod
+ def delete(cls, records):
+ cls.check_access([a.id for a in records], mode='delete')
+ super().delete(records)
+
+ @classmethod
+ def write(cls, records, values, *args):
+ all_records = []
+ actions = iter((records, values) + args)
+ for other_records, _ in zip(actions, actions):
+ all_records += other_records
+ cls.check_access([a.id for a in all_records], mode='write')
+ super().write(records, values, *args)
+ cls.check_access(all_records, mode='write')
+
+ @classmethod
+ def create(cls, vlist):
+ records = super().create(vlist)
+ cls.check_access([r.id for r in records], mode='create')
+ return records
+
+
+class ResourceMixin(ResourceAccessMixin, ModelStorage, ModelView):
+
copy_to_resources = fields.MultiSelection(
'get_copy_to_resources', "Copy to Resources",
states={
@@ -39,19 +104,7 @@
def __setup__(cls):
super(ResourceMixin, cls).__setup__()
cls._order.insert(0, ('last_modification', 'DESC'))
-
- @staticmethod
- def default_resource():
- return Transaction().context.get('resource')
-
- @staticmethod
- def get_models():
- pool = Pool()
- Model = pool.get('ir.model')
- ModelAccess = pool.get('ir.model.access')
- models = Model.search([])
- access = ModelAccess.get_access([m.model for m in models])
- return [(m.model, m.name) for m in models if access[m.model]['read']]
+ cls.resource.required = True
@fields.depends('resource')
def get_copy_to_resources(self):
@@ -84,54 +137,6 @@
table, _ = tables[None]
return [Coalesce(table.write_date, table.create_date)]
- @classmethod
- def check_access(cls, ids, mode='read'):
- pool = Pool()
- ModelAccess = pool.get('ir.model.access')
- if ((Transaction().user == 0)
- or not Transaction().context.get('_check_access')):
- return
- model_names = set()
- with Transaction().set_context(_check_access=False):
- for record in cls.browse(ids):
- if record.resource:
- model_names.add(str(record.resource).split(',')[0])
- for model_name in model_names:
- checks = cls._convert_check_access(model_name, mode)
- for model, check_mode in checks:
- ModelAccess.check(model, mode=check_mode)
-
- @classmethod
- def _convert_check_access(cls, model, mode):
- return [
- (model, {'create': 'write', 'delete': 'write'}.get(mode, mode))]
-
- @classmethod
- def read(cls, ids, fields_names):
- cls.check_access(ids, mode='read')
- return super(ResourceMixin, cls).read(ids, fields_names)
-
- @classmethod
- def delete(cls, records):
- cls.check_access([a.id for a in records], mode='delete')
- super(ResourceMixin, cls).delete(records)
-
- @classmethod
- def write(cls, records, values, *args):
- all_records = []
- actions = iter((records, values) + args)
- for other_records, _ in zip(actions, actions):
- all_records += other_records
- cls.check_access([a.id for a in all_records], mode='write')
- super(ResourceMixin, cls).write(records, values, *args)
- cls.check_access(all_records, mode='write')
-
- @classmethod
- def create(cls, vlist):
- records = super(ResourceMixin, cls).create(vlist)
- cls.check_access([r.id for r in records], mode='create')
- return records
-
class ResourceCopyMixin(ModelStorage):