[IMP] models: in _init_manual_fields(), create fields instead of columns

Note that serialized fields are ignored; they are no longer supported, anyway.
This commit is contained in:
Raphael Collet 2014-11-06 15:48:20 +01:00
parent 3c203703db
commit fc2975a9af
2 changed files with 22 additions and 32 deletions

View File

@ -709,41 +709,37 @@ class BaseModel(object):
manual_fields = cr.dictfetchall() manual_fields = cr.dictfetchall()
for field in manual_fields: for field in manual_fields:
if field['name'] in cls._columns: if field['name'] in cls._fields:
continue continue
attrs = { attrs = {
'manual': True,
'string': field['field_description'], 'string': field['field_description'],
'required': bool(field['required']), 'required': bool(field['required']),
'readonly': bool(field['readonly']), 'readonly': bool(field['readonly']),
'domain': eval(field['domain']) if field['domain'] else None,
'size': field['size'] or None,
'ondelete': field['on_delete'],
'translate': (field['translate']),
'manual': True,
'_prefetch': False,
#'select': int(field['select_level'])
} }
if field['serialization_field_id']: # FIXME: ignore field['serialization_field_id']
cr.execute('SELECT name FROM ir_model_fields WHERE id=%s', (field['serialization_field_id'],)) if field['ttype'] in ('char', 'text', 'html'):
attrs.update({'serialization_field': cr.fetchone()[0], 'type': field['ttype']}) attrs['translate'] = bool(field['translate'])
if field['ttype'] in ['many2one', 'one2many', 'many2many']: attrs['size'] = field['size'] or None
attrs.update({'relation': field['relation']}) elif field['ttype'] in ('selection', 'reference'):
cls._columns[field['name']] = fields.sparse(**attrs) attrs['selection'] = eval(field['selection'])
elif field['ttype'] == 'selection':
cls._columns[field['name']] = fields.selection(eval(field['selection']), **attrs)
elif field['ttype'] == 'reference':
cls._columns[field['name']] = fields.reference(selection=eval(field['selection']), **attrs)
elif field['ttype'] == 'many2one': elif field['ttype'] == 'many2one':
cls._columns[field['name']] = fields.many2one(field['relation'], **attrs) attrs['comodel_name'] = field['relation']
attrs['ondelete'] = field['on_delete']
attrs['domain'] = eval(field['domain']) if field['domain'] else None
elif field['ttype'] == 'one2many': elif field['ttype'] == 'one2many':
cls._columns[field['name']] = fields.one2many(field['relation'], field['relation_field'], **attrs) attrs['comodel_name'] = field['relation']
attrs['inverse_name'] = field['relation_field']
attrs['domain'] = eval(field['domain']) if field['domain'] else None
elif field['ttype'] == 'many2many': elif field['ttype'] == 'many2many':
attrs['comodel_name'] = field['relation']
_rel1 = field['relation'].replace('.', '_') _rel1 = field['relation'].replace('.', '_')
_rel2 = field['model'].replace('.', '_') _rel2 = field['model'].replace('.', '_')
_rel_name = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name']) attrs['relation'] = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name'])
cls._columns[field['name']] = fields.many2many(field['relation'], _rel_name, 'id1', 'id2', **attrs) attrs['column1'] = 'id1'
else: attrs['column2'] = 'id2'
cls._columns[field['name']] = getattr(fields, field['ttype'])(**attrs) attrs['domain'] = eval(field['domain']) if field['domain'] else None
cls._add_field(field['name'], Field.by_type[field['ttype']](**attrs))
@classmethod @classmethod
def _init_constraints_onchanges(cls): def _init_constraints_onchanges(cls):
@ -2913,11 +2909,6 @@ class BaseModel(object):
cls._inherit_fields = res cls._inherit_fields = res
cls._all_columns = cls._get_column_infos() cls._all_columns = cls._get_column_infos()
# interface columns with new-style fields
for attr, column in cls._columns.items():
if attr not in cls._fields:
cls._add_field(attr, column.to_field())
# interface inherited fields with new-style fields (note that the # interface inherited fields with new-style fields (note that the
# reverse order is for being consistent with _all_columns above) # reverse order is for being consistent with _all_columns above)
for parent_model, parent_field in reversed(cls._inherits.items()): for parent_model, parent_field in reversed(cls._inherits.items()):

View File

@ -136,9 +136,8 @@ class _column(object):
for key, val in args.iteritems(): for key, val in args.iteritems():
setattr(self, key, val) setattr(self, key, val)
# prefetch only if self._classic_write, not self.groups, and not # prefetch only if _classic_write, not deprecated and not manual
# self.deprecated if not self._classic_write or self.deprecated or self.manual:
if not self._classic_write or self.deprecated:
self._prefetch = False self._prefetch = False
def new(self, **args): def new(self, **args):