diff --git a/trytond/ir/action.py b/trytond/ir/action.py index ec8d3c375f..8df6839a69 100644 --- a/trytond/ir/action.py +++ b/trytond/ir/action.py @@ -187,7 +187,7 @@ class ActionKeyword(ModelSQL, ModelView): 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 --git a/trytond/ir/model.py b/trytond/ir/model.py index 0bb2e7c1a6..0ebf8b588b 100644 --- a/trytond/ir/model.py +++ b/trytond/ir/model.py @@ -58,7 +58,7 @@ class Model(ModelSQL, ModelView): 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 @@ class Model(ModelSQL, ModelView): [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 @@ -143,11 +144,24 @@ class Model(ModelSQL, ModelView): return [name for name, model in Pool().iterobject() 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 @@ class Model(ModelSQL, ModelView): @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 --git a/trytond/ir/resource.py b/trytond/ir/resource.py index 16d89c5660..d9138d4a9c 100644 --- a/trytond/ir/resource.py +++ b/trytond/ir/resource.py @@ -25,9 +25,9 @@ class ResourceAccessMixin(ModelStorage): 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 @@ class ResourceMixin(ResourceAccessMixin, ModelStorage, ModelView): 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 --git a/trytond/ir/translation.py b/trytond/ir/translation.py index 086de9fc4f..4f5faa088b 100644 --- a/trytond/ir/translation.py +++ b/trytond/ir/translation.py @@ -604,7 +604,7 @@ class Translation(ModelSQL, ModelView): 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 @@ class Translation(ModelSQL, ModelView): 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 @@ class Translation(ModelSQL, ModelView): 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 --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py index 8eedc5a2b9..dee162e044 100644 --- a/trytond/model/modelsql.py +++ b/trytond/model/modelsql.py @@ -1224,12 +1224,7 @@ class ModelSQL(ModelStorage): 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 += '...'