From 3667e3c6190d8a22e358bfd2eac48e0cdca9a8a3 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 14 Dec 2012 11:58:20 +0100 Subject: [PATCH] [IMP] module loading: removed unnecessary indentation, added comments. bzr revid: vmt@openerp.com-20121214105820-9nlgzu9pm7cvh1pz --- openerp/modules/loading.py | 7 +++- openerp/osv/orm.py | 85 +++++++++++++++++++------------------- 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 48f816035ff..b4ad08af7a1 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -146,7 +146,10 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= cr.execute("select (now() at time zone 'UTC')::timestamp") dt_before_load = cr.fetchone()[0] - pool.fields_by_model = {'whatever': {}} + # Query manual fields for all models at once and save them on the registry + # so the initialization code for each model does not have to do it + # one model at a time. + pool.fields_by_model = {'so_this_dict_is_not_empty': {}} cr.execute('SELECT * FROM ir_model_fields WHERE state=%s', ('manual',)) for field in cr.dictfetchall(): pool.fields_by_model.setdefault(field['model'], []).append(field) @@ -227,6 +230,8 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= cr.commit() + # The query won't be valid for models created later (i.e. custom model + # created after the registry has been loaded), so empty its result. pool.fields_by_model = {} cr.commit() diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 4ba3d24b4c4..7d89139b2d5 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -1018,49 +1018,50 @@ class BaseModel(object): # Load manual fields - #cr.execute("SELECT id FROM ir_model_fields WHERE name=%s AND model=%s", ('state', 'ir.model.fields')) - if True: #cr.fetchone(): - if self.pool.fields_by_model: - fields__ = self.pool.fields_by_model.get(self._name, []) - else: - cr.execute('SELECT * FROM ir_model_fields WHERE model=%s AND state=%s', (self._name, 'manual')) - fields__ = cr.dictfetchall() - for field in fields__: - if field['name'] in self._columns: - continue - attrs = { - 'string': field['field_description'], - 'required': bool(field['required']), - 'readonly': bool(field['readonly']), - 'domain': eval(field['domain']) if field['domain'] else None, - 'size': field['size'], - 'ondelete': field['on_delete'], - 'translate': (field['translate']), - 'manual': True, - #'select': int(field['select_level']) - } + # Check the query is already done for all modules of if we need to + # do it ourselves. + if self.pool.fields_by_model: + manual_fields = self.pool.fields_by_model.get(self._name, []) + else: + cr.execute('SELECT * FROM ir_model_fields WHERE model=%s AND state=%s', (self._name, 'manual')) + manual_fields = cr.dictfetchall() + for field in manual_fields: + if field['name'] in self._columns: + continue + attrs = { + 'string': field['field_description'], + 'required': bool(field['required']), + 'readonly': bool(field['readonly']), + 'domain': eval(field['domain']) if field['domain'] else None, + 'size': field['size'], + 'ondelete': field['on_delete'], + 'translate': (field['translate']), + 'manual': True, + #'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']}) + self._columns[field['name']] = fields.sparse(**attrs) + elif field['ttype'] == 'selection': + self._columns[field['name']] = fields.selection(eval(field['selection']), **attrs) + elif field['ttype'] == 'reference': + self._columns[field['name']] = fields.reference(selection=eval(field['selection']), **attrs) + elif field['ttype'] == 'many2one': + self._columns[field['name']] = fields.many2one(field['relation'], **attrs) + elif field['ttype'] == 'one2many': + self._columns[field['name']] = fields.one2many(field['relation'], field['relation_field'], **attrs) + elif field['ttype'] == 'many2many': + _rel1 = field['relation'].replace('.', '_') + _rel2 = field['model'].replace('.', '_') + _rel_name = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name']) + self._columns[field['name']] = fields.many2many(field['relation'], _rel_name, 'id1', 'id2', **attrs) + else: + self._columns[field['name']] = getattr(fields, field['ttype'])(**attrs) - 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']}) - self._columns[field['name']] = fields.sparse(**attrs) - elif field['ttype'] == 'selection': - self._columns[field['name']] = fields.selection(eval(field['selection']), **attrs) - elif field['ttype'] == 'reference': - self._columns[field['name']] = fields.reference(selection=eval(field['selection']), **attrs) - elif field['ttype'] == 'many2one': - self._columns[field['name']] = fields.many2one(field['relation'], **attrs) - elif field['ttype'] == 'one2many': - self._columns[field['name']] = fields.one2many(field['relation'], field['relation_field'], **attrs) - elif field['ttype'] == 'many2many': - _rel1 = field['relation'].replace('.', '_') - _rel2 = field['model'].replace('.', '_') - _rel_name = 'x_%s_%s_%s_rel' % (_rel1, _rel2, field['name']) - self._columns[field['name']] = fields.many2many(field['relation'], _rel_name, 'id1', 'id2', **attrs) - else: - self._columns[field['name']] = getattr(fields, field['ttype'])(**attrs) self._inherits_check() self._inherits_reload() if not self._sequence: