Reviewers: ,


Please review this at http://codereview.tryton.org/598002/

Affected files:
  M trytond/ir/model.py
  M trytond/model/model.py


Index: trytond/ir/model.py
===================================================================

--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -435,6 +435,53 @@
         return True

     @classmethod
+    def get_access(cls, models):
+        'Return fields access for models'
+        pool = Pool()
+        Model = pool.get('ir.model')
+        ModelField = pool.get('ir.model.field')
+        UserGroup = pool.get('res.user-res.group')
+        cursor = Transaction().cursor
+        user = Transaction().user
+
+        accesses = {}
+        for model in models:
+            maccesses = cls._get_access_cache.get((user, model))
+            if maccesses is None:
+                break
+            accesses[model] = maccesses
+        else:
+            return accesses
+
+        default = {}
+        accesses = dict((m, default) for m in models)
+        cursor.execute(('SELECT '
+                    'm.model, '
+                    'f.name, '
+                    'MAX(CASE WHEN a.perm_read THEN 1 ELSE 0 END), '
+                    'MAX(CASE WHEN a.perm_write THEN 1 ELSE 0 END), '
+                    'MAX(CASE WHEN a.perm_create THEN 1 ELSE 0 END), '
+                    'MAX(CASE WHEN a.perm_delete THEN 1 ELSE 0 END) '
+                'FROM "%s" AS a '
+                'JOIN "%s" AS f '
+                    'ON (a.field = f.id) '
+                'JOIN "%s" AS m '
+                    'ON (f.model = m.id) '
+                'LEFT JOIN "%s" AS gu '
+                    'ON (gu."group" = a."group") '
+ 'WHERE m.model IN (' + ','.join(('%%s',) * len(models)) + ') '
+                    'AND (gu."user" = %%s OR a."group" IS NULL) '
+                'GROUP BY m.model, f.name')
+            % (cls._table, ModelField._table,
+                Model._table, UserGroup._table),
+                list(models) + [Transaction().user])
+        for m, f, r, w, c, d in cursor.fetchall():
+ accesses[m][f] = {'read': r, 'write': w, 'create': c, 'delete': d}
+        for model, maccesses in accesses.iteritems():
+            cls._get_access_cache.set((user, model), maccesses)
+        return accesses
+
+    @classmethod
     def check(cls, model_name, fields, mode='read', raise_exception=True,
             access=False):
         '''
@@ -447,33 +494,8 @@
                 return dict((x, True) for x in fields)
             return True

-        pool = Pool()
-        Model = pool.get('ir.model')
-        ModelField = pool.get('ir.model.field')
-        UserGroup = pool.get('res.user-res.group')
-
-        cursor = Transaction().cursor
-        key = (model_name, mode, access, Transaction().user)
-        accesses = cls._get_access_cache.get(key)
-
-        if accesses is None:
-            cursor.execute('SELECT f.name, '
-                'MAX(CASE WHEN a.perm_%s THEN 1 ELSE 0 END) '
-                'FROM "%s" AS a '
-                'JOIN "%s" AS f '
-                    'ON (a.field = f.id) '
-                'JOIN "%s" AS m '
-                    'ON (f.model = m.id) '
-                'LEFT JOIN "%s" AS gu '
-                    'ON (gu."group" = a."group") '
-                'WHERE m.model = %%s '
-                    'AND (gu."user" = %%s OR a."group" IS NULL) '
-                'GROUP BY f.name'
-                % (mode, cls._table, ModelField._table,
-                    Model._table, UserGroup._table), (model_name,
-                    Transaction().user))
-            accesses = dict(cursor.fetchall())
-            cls._get_access_cache.set(key, accesses)
+        accesses = dict((f, a[mode])
+ for f, a in cls.get_access([model_name])[model_name].iteritems())
         if access:
             return accesses
         for field in fields:

Index: trytond/model/model.py
===================================================================

--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -451,12 +451,7 @@

         encoder = PYSONEncoder()

-        fwrite_accesses = FieldAccess.check(cls.__name__, fields_names or
-            cls._fields.keys(), 'write', access=True)
-        fcreate_accesses = FieldAccess.check(cls.__name__, fields_names or
-            cls._fields.keys(), 'create', access=True)
-        fdelete_accesses = FieldAccess.check(cls.__name__, fields_names or
-            cls._fields.keys(), 'delete', access=True)
+        accesses = FieldAccess.get_access([cls.__name__])[cls.__name__]
         for field in (x for x in cls._fields.keys()
                 if ((not fields_names) or x in fields_names)):
             res[field] = {
@@ -484,7 +479,7 @@
                 if getattr(cls._fields[field], arg, None) is not None:
                     res[field][arg] = copy.copy(getattr(cls._fields[field],
                         arg))
-            if not fwrite_accesses.get(field, True):
+            if not accesses.get(field, {}).get('read', True):
                 res[field]['readonly'] = True
                 if res[field].get('states') and \
                         'readonly' in res[field]['states']:
@@ -554,8 +549,10 @@
                 res[field]['relation'] = relation
                 res[field]['domain'] = copy.copy(cls._fields[field].domain)
res[field]['context'] = copy.copy(cls._fields[field].context)
-                res[field]['create'] = fcreate_accesses.get(field, True)
-                res[field]['delete'] = fdelete_accesses.get(field, True)
+ res[field]['create'] = accesses.get(field, {}).get('create',
+                    True)
+ res[field]['delete'] = accesses.get(field, {}).get('delete',
+                    True)
             if res[field]['type'] == 'one2many' \
                     and hasattr(cls._fields[field], 'field'):
                 res[field]['relation_field'] = copy.copy(



--
--
[email protected] mailing list



Reply via email to