[FIX][IMP] mail: make tracking great again

When changing tracking mecanism in v9 'always' tracked fields lost their meaning.
They were managed like 'onchange' fields. This commit sets the old behavior back.

 * 'onchange' fields are displayed in tracking every time they change
 * 'always' fields are displayed in tracking every time they change or whenever
   other tracking exist; those are used to display some contextual
   information
This commit is contained in:
Thibault Delavallée
2016-09-30 14:39:31 +02:00
parent 30656599de
commit 8acd298a56
4 changed files with 24 additions and 8 deletions
+14 -1
View File
@@ -441,11 +441,14 @@ class MailThread(models.AbstractModel):
- a set of updated column names
- a list of changes (initial value, new value, column name, column info) """
self.ensure_one()
changes = set()
changes = set() # contains always and onchange tracked fields that changed
displays = set() # contains always tracked field that did not change but displayed for information
tracking_value_ids = []
display_values_ids = []
# generate tracked_values data structure: {'col_name': {col_info, new_value, old_value}}
for col_name, col_info in tracked_fields.items():
track_visibility = getattr(self._fields[col_name], 'track_visibility', 'onchange')
initial_value = initial[col_name]
new_value = getattr(self, col_name)
@@ -456,6 +459,16 @@ class MailThread(models.AbstractModel):
if col_name in tracked_fields:
changes.add(col_name)
# 'always' tracked fields in separate variable; added if other changes
elif new_value == initial_value and track_visibility == 'always' and col_name in tracked_fields:
tracking = self.env['mail.tracking.value'].create_tracking_values(initial_value, initial_value, col_name, col_info)
if tracking:
display_values_ids.append([0, 0, tracking])
displays.add(col_name)
if changes and displays:
tracking_value_ids = display_values_ids + tracking_value_ids
return changes, tracking_value_ids
@api.multi
@@ -10,6 +10,7 @@ class MailTracking(models.Model):
_name = 'mail.tracking.value'
_description = 'Mail Tracking Value'
# TDE CLEANME: why not a m2o to ir model field ?
field = fields.Char('Changed Field', required=True, readonly=1)
field_desc = fields.Char('Field Description', required=True, readonly=1)
field_type = fields.Char('Field Type')
+4 -2
View File
@@ -154,9 +154,11 @@
<t t-esc="value.changed_field"/>:
<t t-if="value.old_value">
<span> <t t-esc="value.old_value || ((value.field_type !== 'boolean') and '')"/> </span>
<span class="fa fa-long-arrow-right"/>
<span t-if="value.old_value != value.new_value" class="fa fa-long-arrow-right"/>
</t>
<span> <t t-esc="value.new_value || ((value.field_type !== 'boolean') and '')"/> </span>
<span t-if="value.old_value != value.new_value">
<t t-esc="value.new_value || ((value.field_type !== 'boolean') and '')"/>
</span>
</li>
</t>
</ul>
+5 -5
View File
@@ -122,10 +122,10 @@ class TestTracking(TestMail):
self.assertEqual(len(self.group_pigs.message_ids), 3)
last_msg = self.group_pigs.message_ids[0]
self.assertEqual(last_msg.subtype_id, mt_group_public_set)
self.assertEqual(len(last_msg.tracking_value_ids), 2)
self.assertEqual(set(last_msg.tracking_value_ids.mapped('field')), set(['group_public_id', 'public']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('field_desc')), set(['Authorized Group', 'Privacy']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('old_value_char')), set([group_user.name_get()[0][1], 'Invited people only']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('new_value_char')), set([group_system.name_get()[0][1], 'Everyone']))
self.assertEqual(len(last_msg.tracking_value_ids), 3)
self.assertEqual(set(last_msg.tracking_value_ids.mapped('field')), set(['group_public_id', 'public', 'name']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('field_desc')), set(['Authorized Group', 'Privacy', 'Name']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('old_value_char')), set([group_user.name_get()[0][1], 'Invited people only', 'supername']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('new_value_char')), set([group_system.name_get()[0][1], 'Everyone', 'supername']))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('old_value_integer')), set([0, group_user.id]))
self.assertEqual(set(last_msg.tracking_value_ids.mapped('new_value_integer')), set([0, group_system.id]))