From 0f9b452c33edd012824bf2b7c82cbc529502f73e Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 4 Mar 2015 10:25:55 +0100 Subject: [PATCH] [IMP] models: convert deprecated model._all_columns into a dynamic property The mappings model._all_columns takes quite some memory (around 2MB per registry) because of the numerous dictionaries (one per model) and inefficient memory storage of column_info. Since it is deprecated and almost no longer used, it can be computed on demand. --- .../addons/test_new_api/tests/test_related.py | 3 --- openerp/models.py | 25 ++++++++----------- openerp/osv/fields.py | 2 ++ 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/openerp/addons/test_new_api/tests/test_related.py b/openerp/addons/test_new_api/tests/test_related.py index b7bb773c056..32869da69ca 100644 --- a/openerp/addons/test_new_api/tests/test_related.py +++ b/openerp/addons/test_new_api/tests/test_related.py @@ -111,9 +111,6 @@ class TestPropertyField(common.TransactionCase): self.partner._columns.update({ 'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"), }) - self.partner._all_columns.update({ - 'property_country': fields.column_info('property_country', self.partner._columns['property_country'], None, None, None), - }) self.partner._field_create(cr) partner_id = self.partner.create(cr, alice, { diff --git a/openerp/models.py b/openerp/models.py index 2f820cec4e2..3b93d2c4158 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -341,7 +341,7 @@ class BaseModel(object): # 1. includes self fields, # 2. uses column_info instead of a triple. # Warning: _all_columns is deprecated, use _fields instead - _all_columns = {} + # _all_columns = {} _table = None _log_create = False @@ -491,7 +491,6 @@ class BaseModel(object): """ field = cls._fields.pop(name) cls._columns.pop(name, None) - cls._all_columns.pop(name, None) if hasattr(cls, name): delattr(cls, name) return field @@ -2898,7 +2897,7 @@ class BaseModel(object): @classmethod def _inherits_reload(cls): - """ Recompute the _inherit_fields and _all_columns mappings. """ + """ Recompute the _inherit_fields mapping. """ cls._inherit_fields = struct = {} for parent_model, parent_field in cls._inherits.iteritems(): parent = cls.pool[parent_model] @@ -2908,19 +2907,17 @@ class BaseModel(object): for name, source in parent._inherit_fields.iteritems(): struct[name] = (parent_model, parent_field, source[2], source[3]) - # old-api stuff - cls._all_columns = cls._get_column_infos() - - @classmethod - def _get_column_infos(cls): - """Returns a dict mapping all fields names (direct fields and - inherited field via _inherits) to a ``column_info`` struct - giving detailed columns """ + @property + def _all_columns(self): + """ Returns a dict mapping all fields names (direct fields and inherited + field via _inherits) to a ``column_info`` struct giving detailed columns. + Deprecated. + """ result = {} # do not inverse for loops, since local fields may hide inherited ones! - for k, (parent, m2o, col, original_parent) in cls._inherit_fields.iteritems(): + for k, (parent, m2o, col, original_parent) in self._inherit_fields.iteritems(): result[k] = fields.column_info(k, col, parent, m2o, original_parent) - for k, col in cls._columns.iteritems(): + for k, col in self._columns.iteritems(): result[k] = fields.column_info(k, col) return result @@ -3024,7 +3021,7 @@ class BaseModel(object): field = model._fields[field_name] field._triggers.update(triggers) - # determine old-api cls._inherit_fields and cls._all_columns + # determine old-api structures about inherited fields cls._inherits_reload() # register stuff about low-level function fields diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 53ac8d9e942..cc11669ef33 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1681,6 +1681,8 @@ class column_info(object): contains it i.e in case of multilevel inheritance, ``None`` for local columns. """ + __slots__ = ['name', 'column', 'parent_model', 'parent_column', 'original_parent'] + def __init__(self, name, column, parent_model=None, parent_column=None, original_parent=None): self.name = name self.column = column