[IMP] mail,*: support tracking x2many fields

X2many fields tracking was not supported in the implementation of
`mail` module:
* not needed in the past
* the logic was not hooked in the same place before.  Now that it is
managed pre-commit, x2many values don't have to be handled as commands,
but can be compared as records.
* ...

The support was added for two specific models in specific modules, but
it's a good opportunity to clean that and to support it directly in `mail`.

Task-3316528

Part-of: odoo/odoo#121244
This commit is contained in:
Valeriya(vchu)
2023-06-08 19:15:16 +02:00
committed by Victor Feyens
parent 7a4db8a51e
commit 167944cc93
3 changed files with 5 additions and 39 deletions
@@ -1572,27 +1572,6 @@ class AccountMoveLine(models.Model):
for root in self.env['account.root'].browse(id for [id] in self.env.cr.fetchall())
}
# -------------------------------------------------------------------------
# TRACKING METHODS
# -------------------------------------------------------------------------
def _mail_track(self, tracked_fields, initial):
changes, tracking_value_ids = super()._mail_track(tracked_fields, initial)
if len(changes) > len(tracking_value_ids):
for i, changed_field in enumerate(changes):
if tracked_fields[changed_field]['type'] in ['one2many', 'many2many']:
field = self.env['ir.model.fields']._get(self._name, changed_field)
vals = {
'field': field.id,
'field_desc': field.field_description,
'field_type': field.ttype,
'tracking_sequence': field.tracking,
'old_value_char': ', '.join(initial[changed_field].mapped('name')),
'new_value_char': ', '.join(self[changed_field].mapped('name')),
}
tracking_value_ids.insert(i, Command.create(vals))
return changes, tracking_value_ids
# -------------------------------------------------------------------------
# RECONCILIATION
# -------------------------------------------------------------------------
@@ -81,6 +81,11 @@ class MailTracking(models.Model):
'old_value_char': initial_value and initial_value.sudo().name_get()[0][1] or '',
'new_value_char': new_value and new_value.sudo().name_get()[0][1] or ''
})
elif col_info['type'] in ['many2many', 'one2many']:
values.update({
'old_value_char': initial_value and ', '.join(initial_value.mapped('display_name')) or '',
'new_value_char': new_value and ', '.join(new_value.mapped('display_name')) or ''
})
else:
tracked = False
-18
View File
@@ -1157,24 +1157,6 @@ class Task(models.Model):
pass
return new_followers
def _mail_track(self, tracked_fields, initial_values):
changes, tracking_value_ids = super()._mail_track(tracked_fields, initial_values)
# Many2many tracking
if len(changes) > len(tracking_value_ids):
for changed_field in changes:
if tracked_fields[changed_field]['type'] in ['one2many', 'many2many']:
field = self.env['ir.model.fields']._get(self._name, changed_field)
vals = {
'field': field.id,
'field_desc': field.field_description,
'field_type': field.ttype,
'tracking_sequence': field.tracking,
'old_value_char': ', '.join(initial_values[changed_field].mapped('name')),
'new_value_char': ', '.join(self[changed_field].mapped('name')),
}
tracking_value_ids.append(Command.create(vals))
return changes, tracking_value_ids
def _track_template(self, changes):
res = super(Task, self)._track_template(changes)
test_task = self[0]