[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:
parent
e2ea691cef
commit
0f9b452c33
|
@ -111,9 +111,6 @@ class TestPropertyField(common.TransactionCase):
|
||||||
self.partner._columns.update({
|
self.partner._columns.update({
|
||||||
'property_country': fields.property(type='many2one', relation="res.country", string="Country by company"),
|
'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)
|
self.partner._field_create(cr)
|
||||||
|
|
||||||
partner_id = self.partner.create(cr, alice, {
|
partner_id = self.partner.create(cr, alice, {
|
||||||
|
|
|
@ -341,7 +341,7 @@ class BaseModel(object):
|
||||||
# 1. includes self fields,
|
# 1. includes self fields,
|
||||||
# 2. uses column_info instead of a triple.
|
# 2. uses column_info instead of a triple.
|
||||||
# Warning: _all_columns is deprecated, use _fields instead
|
# Warning: _all_columns is deprecated, use _fields instead
|
||||||
_all_columns = {}
|
# _all_columns = {}
|
||||||
|
|
||||||
_table = None
|
_table = None
|
||||||
_log_create = False
|
_log_create = False
|
||||||
|
@ -491,7 +491,6 @@ class BaseModel(object):
|
||||||
"""
|
"""
|
||||||
field = cls._fields.pop(name)
|
field = cls._fields.pop(name)
|
||||||
cls._columns.pop(name, None)
|
cls._columns.pop(name, None)
|
||||||
cls._all_columns.pop(name, None)
|
|
||||||
if hasattr(cls, name):
|
if hasattr(cls, name):
|
||||||
delattr(cls, name)
|
delattr(cls, name)
|
||||||
return field
|
return field
|
||||||
|
@ -2898,7 +2897,7 @@ class BaseModel(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _inherits_reload(cls):
|
def _inherits_reload(cls):
|
||||||
""" Recompute the _inherit_fields and _all_columns mappings. """
|
""" Recompute the _inherit_fields mapping. """
|
||||||
cls._inherit_fields = struct = {}
|
cls._inherit_fields = struct = {}
|
||||||
for parent_model, parent_field in cls._inherits.iteritems():
|
for parent_model, parent_field in cls._inherits.iteritems():
|
||||||
parent = cls.pool[parent_model]
|
parent = cls.pool[parent_model]
|
||||||
|
@ -2908,19 +2907,17 @@ class BaseModel(object):
|
||||||
for name, source in parent._inherit_fields.iteritems():
|
for name, source in parent._inherit_fields.iteritems():
|
||||||
struct[name] = (parent_model, parent_field, source[2], source[3])
|
struct[name] = (parent_model, parent_field, source[2], source[3])
|
||||||
|
|
||||||
# old-api stuff
|
@property
|
||||||
cls._all_columns = cls._get_column_infos()
|
def _all_columns(self):
|
||||||
|
""" Returns a dict mapping all fields names (direct fields and inherited
|
||||||
@classmethod
|
field via _inherits) to a ``column_info`` struct giving detailed columns.
|
||||||
def _get_column_infos(cls):
|
Deprecated.
|
||||||
"""Returns a dict mapping all fields names (direct fields and
|
"""
|
||||||
inherited field via _inherits) to a ``column_info`` struct
|
|
||||||
giving detailed columns """
|
|
||||||
result = {}
|
result = {}
|
||||||
# do not inverse for loops, since local fields may hide inherited ones!
|
# 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)
|
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)
|
result[k] = fields.column_info(k, col)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -3024,7 +3021,7 @@ class BaseModel(object):
|
||||||
field = model._fields[field_name]
|
field = model._fields[field_name]
|
||||||
field._triggers.update(triggers)
|
field._triggers.update(triggers)
|
||||||
|
|
||||||
# determine old-api cls._inherit_fields and cls._all_columns
|
# determine old-api structures about inherited fields
|
||||||
cls._inherits_reload()
|
cls._inherits_reload()
|
||||||
|
|
||||||
# register stuff about low-level function fields
|
# register stuff about low-level function fields
|
||||||
|
|
|
@ -1681,6 +1681,8 @@ class column_info(object):
|
||||||
contains it i.e in case of multilevel inheritance, ``None`` for
|
contains it i.e in case of multilevel inheritance, ``None`` for
|
||||||
local columns.
|
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):
|
def __init__(self, name, column, parent_model=None, parent_column=None, original_parent=None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.column = column
|
self.column = column
|
||||||
|
|
Loading…
Reference in New Issue