diff options
| author | Raphael Collet <rco@odoo.com> | 2018-09-24 11:51:35 +0200 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2018-09-26 11:46:30 +0200 |
| commit | a99e04dfeeef11a781b35574dd625e4007ab5654 (patch) | |
| tree | e245ec479472b38b0ae659d5095c05e5459ca521 /addons/base_sparse_field | |
| parent | c2b4790be426f039ec47b0888b5e58c7970c3dae (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.py | 40 |
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) |
