[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.
This commit is contained in:
Raphael Collet 2015-03-04 10:25:55 +01:00
parent e2ea691cef
commit 0f9b452c33
3 changed files with 13 additions and 17 deletions

View File

@ -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, {

View File

@ -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

View File

@ -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