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):
 

Reply via email to