changeset c6f80e10b331 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=c6f80e10b331
description:
        Use cache to fill Reference selections

        issue9235
        review335301003
diffstat:

 trytond/ir/action.py      |   2 +-
 trytond/ir/model.py       |  31 ++++++++++++++++++-------------
 trytond/ir/resource.py    |  12 ++++--------
 trytond/ir/translation.py |   6 +++---
 trytond/model/modelsql.py |   7 +------
 5 files changed, 27 insertions(+), 31 deletions(-)

diffs (152 lines):

diff -r 7c595aefe04e -r c6f80e10b331 trytond/ir/action.py
--- a/trytond/ir/action.py      Sat Dec 26 21:49:29 2020 +0100
+++ b/trytond/ir/action.py      Sun Dec 27 00:19:30 2020 +0100
@@ -187,7 +187,7 @@
     def models_get():
         pool = Pool()
         Model = pool.get('ir.model')
-        return [(None, '')] + [(m.model, m.name) for m in Model.search([])]
+        return [(None, '')] + Model.get_name_items()
 
     @classmethod
     def delete(cls, keywords):
diff -r 7c595aefe04e -r c6f80e10b331 trytond/ir/model.py
--- a/trytond/ir/model.py       Sat Dec 26 21:49:29 2020 +0100
+++ b/trytond/ir/model.py       Sun Dec 27 00:19:30 2020 +0100
@@ -58,7 +58,7 @@
     global_search_p = fields.Boolean('Global Search')
     fields = fields.One2Many('ir.model.field', 'model', 'Fields',
        required=True)
-    _get_name_cache = Cache('ir.model.get_name')
+    _get_names_cache = Cache('ir.model.get_names')
 
     @classmethod
     def __setup__(cls):
@@ -105,6 +105,7 @@
                     [ir_model.name, ir_model.info],
                     [model._get_name(), model.__doc__],
                     where=ir_model.id == model_id))
+        cls._get_names_cache.clear()
         return model_id
 
     @classmethod
@@ -144,10 +145,23 @@
             if getattr(model, '_history', False)]
 
     @classmethod
+    def get_name_items(cls):
+        "Return a list of couple mapping models to names"
+        items = cls._get_names_cache.get('items')
+        if items is None:
+            models = cls.search([])
+            items = [(m.model, m.name) for m in models]
+            cls._get_names_cache.set('items', items)
+        return items
+
+    @classmethod
     def get_names(cls):
         "Return a dictionary mapping models to names"
-        models = cls.search([])
-        return {m.model: m.name for m in models}
+        dict_ = cls._get_names_cache.get('dict')
+        if dict_ is None:
+            dict_ = dict(cls.get_name_items())
+            cls._get_names_cache.set('dict', dict_)
+        return dict_
 
     @classmethod
     def global_search(cls, text, limit, menu='ir.ui.menu'):
@@ -189,16 +203,7 @@
 
     @classmethod
     def get_name(cls, model):
-        name = cls._get_name_cache.get(model)
-        if name is None:
-            models = cls.search([('model', '=', model)], limit=1)
-            if models:
-                model, = models
-                name = model.name
-                cls._get_name_cache.set(model, name)
-            else:
-                name = model
-        return name
+        return cls.get_names().get(model, model)
 
 
 class ModelField(ModelSQL, ModelView):
diff -r 7c595aefe04e -r c6f80e10b331 trytond/ir/resource.py
--- a/trytond/ir/resource.py    Sat Dec 26 21:49:29 2020 +0100
+++ b/trytond/ir/resource.py    Sun Dec 27 00:19:30 2020 +0100
@@ -25,9 +25,9 @@
         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']]
+        models = Model.get_name_items()
+        access = ModelAccess.get_access([m for m, _ in models])
+        return [(m, n) for m, n in models if access[m]['read']]
 
     @classmethod
     def check_access(cls, ids, mode='read'):
@@ -113,11 +113,7 @@
         resources = []
         if isinstance(self.resource, ResourceCopyMixin):
             models = self.resource.get_resources_to_copy(self.__name__)
-            if models:
-                models = Model.search([
-                        ('model', 'in', models),
-                        ])
-                resources.extend((m.model, m.name) for m in models)
+            resources.extend((m, Model.get_name(m)) for m in models)
         return resources
 
     @fields.depends(methods=['get_copy_to_resources'])
diff -r 7c595aefe04e -r c6f80e10b331 trytond/ir/translation.py
--- a/trytond/ir/translation.py Sat Dec 26 21:49:29 2020 +0100
+++ b/trytond/ir/translation.py Sun Dec 27 00:19:30 2020 +0100
@@ -604,7 +604,7 @@
         Model = pool.get('ir.model')
         ModelField = pool.get('ir.model.field')
         Message._message_cache.clear()
-        Model._get_name_cache.clear()
+        Model._get_names_cache.clear()
         ModelField._get_name_cache.clear()
         cls._translation_cache.clear()
         cls._translation_report_cache.clear()
@@ -618,7 +618,7 @@
         Model = pool.get('ir.model')
         ModelField = pool.get('ir.model.field')
         Message._message_cache.clear()
-        Model._get_name_cache.clear()
+        Model._get_names_cache.clear()
         ModelField._get_name_cache.clear()
         cls._translation_cache.clear()
         cls._translation_report_cache.clear()
@@ -638,7 +638,7 @@
         Model = pool.get('ir.model')
         ModelField = pool.get('ir.model.field')
         Message._message_cache.clear()
-        Model._get_name_cache.clear()
+        Model._get_names_cache.clear()
         ModelField._get_name_cache.clear()
         cls._translation_cache.clear()
         cls._translation_report_cache.clear()
diff -r 7c595aefe04e -r c6f80e10b331 trytond/model/modelsql.py
--- a/trytond/model/modelsql.py Sat Dec 26 21:49:29 2020 +0100
+++ b/trytond/model/modelsql.py Sun Dec 27 00:19:30 2020 +0100
@@ -1224,12 +1224,7 @@
         if wrong_ids:
             model = cls.__name__
             if Model:
-                models = Model.search([
-                        ('model', '=', cls.__name__),
-                        ], limit=1)
-                if models:
-                    model, = models
-                    model = model.name
+                model = Model.get_name(cls.__name__)
             ids = ', '.join(map(str, ids[:5]))
             if len(wrong_ids) > 5:
                 ids += '...'

Reply via email to