From fc2975a9afd04be227b21235d0acd3d493713072 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 6 Nov 2014 15:48:20 +0100 Subject: [PATCH] [IMP] models: in _init_manual_fields(), create fields instead of columns Note that serialized fields are ignored; they are no longer supported, anyway. --- openerp/models.py | 49 ++++++++++++++++++++----------------------------- openerp/osv/fields.py | 5 ++--- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/openerp/models.py b/openerp/models.py index 0dd16a6..e871dff 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -709,41 +709,37 @@ class BaseModel(object): manual_fields = cr.dictfetchall() for field in manual_fields: - if field['name'] in cls._columns: + if field['name'] in cls._fields: continue attrs = { + 'manual': True, 'string': field['field_description'], 'required': bool(field['required']), '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']: - cr.execute('SELECT name FROM ir_model_fields WHERE id=%s', (field['serialization_field_id'],)) - attrs.update({'serialization_field': cr.fetchone()[0], 'type': field['ttype']}) - if field['ttype'] in ['many2one', 'one2many', 'many2many']: - attrs.update({'relation': field['relation']}) - cls._columns[field['name']] = fields.sparse(**attrs) - 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) + # FIXME: ignore field['serialization_field_id'] + if field['ttype'] in ('char', 'text', 'html'): + attrs['translate'] = bool(field['translate']) + attrs['size'] = field['size'] or None + elif field['ttype'] in ('selection', 'reference'): + attrs['selection'] = eval(field['selection']) 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': - 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': + attrs['comodel_name'] = field['relation'] _rel1 = field['relation'].replace('.', '_') _rel2 = field['model'].replace('.', '_') - _rel_name = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name']) - cls._columns[field['name']] = fields.many2many(field['relation'], _rel_name, 'id1', 'id2', **attrs) - else: - cls._columns[field['name']] = getattr(fields, field['ttype'])(**attrs) + attrs['relation'] = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name']) + attrs['column1'] = 'id1' + attrs['column2'] = 'id2' + attrs['domain'] = eval(field['domain']) if field['domain'] else None + cls._add_field(field['name'], Field.by_type[field['ttype']](**attrs)) @classmethod def _init_constraints_onchanges(cls): @@ -2913,11 +2909,6 @@ class BaseModel(object): cls._inherit_fields = res 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 # reverse order is for being consistent with _all_columns above) for parent_model, parent_field in reversed(cls._inherits.items()): diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index e8d4166..59e607b 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -136,9 +136,8 @@ class _column(object): for key, val in args.iteritems(): setattr(self, key, val) - # prefetch only if self._classic_write, not self.groups, and not - # self.deprecated - if not self._classic_write or self.deprecated: + # prefetch only if _classic_write, not deprecated and not manual + if not self._classic_write or self.deprecated or self.manual: self._prefetch = False def new(self, **args): -- 1.7.10.4