[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:
committed by
Victor Feyens
parent
7a4db8a51e
commit
167944cc93
@@ -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
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user