summaryrefslogtreecommitdiff
path: root/addons/base_sparse_field
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2018-09-24 11:51:35 +0200
committerRaphael Collet <rco@odoo.com>2018-09-26 11:46:30 +0200
commita99e04dfeeef11a781b35574dd625e4007ab5654 (patch)
treee245ec479472b38b0ae659d5095c05e5459ca521 /addons/base_sparse_field
parentc2b4790be426f039ec47b0888b5e58c7970c3dae (diff)
[FIX] base: perform field reflection in batch
Speedup 4% of installation time.
Diffstat (limited to 'addons/base_sparse_field')
-rw-r--r--addons/base_sparse_field/models/models.py40
1 files changed, 27 insertions, 13 deletions
diff --git a/addons/base_sparse_field/models/models.py b/addons/base_sparse_field/models/models.py
index f3aed505e76..c9e79a6fbb8 100644
--- a/addons/base_sparse_field/models/models.py
+++ b/addons/base_sparse_field/models/models.py
@@ -28,19 +28,33 @@ class IrModelFields(models.Model):
return super(IrModelFields, self).write(vals)
- def _reflect_field_params(self, field):
- params = super(IrModelFields, self)._reflect_field_params(field)
-
- params['serialization_field_id'] = None
- if getattr(field, 'sparse', None):
- model = self.env[field.model_name]
- serialization_field = model._fields.get(field.sparse)
- if serialization_field is None:
- raise UserError(_("Serialization field `%s` not found for sparse field `%s`!") % (field.sparse, field.name))
- serialization_record = self._reflect_field(serialization_field)
- params['serialization_field_id'] = serialization_record.id
-
- return params
+ def _reflect_model(self, model):
+ super(IrModelFields, self)._reflect_model(model)
+
+ # set 'serialization_field_id' on sparse fields; it is done here to
+ # ensure that the serialized field is reflected already
+ cr = self._cr
+ query = """ UPDATE ir_model_fields
+ SET serialization_field_id=%s
+ WHERE model=%s AND name=%s
+ RETURNING id
+ """
+ fields_data = self._existing_field_data(model._name)
+
+ for field in model._fields.values():
+ ser_field_id = None
+ ser_field_name = getattr(field, 'sparse', None)
+ if ser_field_name:
+ if ser_field_name not in fields_data:
+ msg = _("Serialization field `%s` not found for sparse field `%s`!")
+ raise UserError(msg % (ser_field_name, field.name))
+ ser_field_id = fields_data[ser_field_name]['id']
+
+ if fields_data[field.name]['serialization_field_id'] != ser_field_id:
+ cr.execute(query, (ser_field_id, model._name, field.name))
+ record = self.browse(cr.fetchone())
+ self.pool.post_init(record.modified, ['serialization_field_id'])
+ self.clear_caches()
def _instanciate_attrs(self, field_data):
attrs = super(IrModelFields, self)._instanciate_attrs(field_data)