diff --git a/addons/mail/models/mail_tracking_value.py b/addons/mail/models/mail_tracking_value.py index 92ae0601028..40fdb7d057f 100644 --- a/addons/mail/models/mail_tracking_value.py +++ b/addons/mail/models/mail_tracking_value.py @@ -71,7 +71,7 @@ class MailTracking(models.Model): }) elif col_info['type'] == 'selection': values.update({ - 'old_value_char': initial_value and dict(col_info['selection'])[initial_value] or '', + 'old_value_char': initial_value and dict(col_info['selection']).get(initial_value, initial_value) or '', 'new_value_char': new_value and dict(col_info['selection'])[new_value] or '' }) elif col_info['type'] == 'many2one': diff --git a/addons/test_mail/models/test_mail_corner_case_models.py b/addons/test_mail/models/test_mail_corner_case_models.py index 24ea27fdf42..e59aa431e40 100644 --- a/addons/test_mail/models/test_mail_corner_case_models.py +++ b/addons/test_mail/models/test_mail_corner_case_models.py @@ -105,6 +105,16 @@ class MailTestTrackMonetary(models.Model): revenue = fields.Monetary('Revenue', currency_field='company_currency', tracking=True) +class MailTestSelectionTracking(models.Model): + """ Test tracking for selection fields """ + _description = 'Test Selection Tracking' + _name = 'mail.test.track.selection' + _inherit = ['mail.thread'] + + name = fields.Char() + selection_type = fields.Selection([('first', 'First'), ('second', 'Second')], tracking=True) + + class MailTestTrackAll(models.Model): _name = 'mail.test.track.all' _description = 'Test tracking on all field types' diff --git a/addons/test_mail/security/ir.model.access.csv b/addons/test_mail/security/ir.model.access.csv index edaf3f4e64c..0c6126ffb34 100644 --- a/addons/test_mail/security/ir.model.access.csv +++ b/addons/test_mail/security/ir.model.access.csv @@ -31,6 +31,8 @@ access_mail_test_multi_company_user,mail.test.multi.company.user,model_mail_test access_mail_test_multi_company_portal,mail.test.multi.company.portal,model_mail_test_multi_company,base.group_portal,1,0,0,0 access_mail_test_nothread_user,mail.test.nothread.user,model_mail_test_nothread,base.group_user,1,1,1,1 access_mail_test_nothread_portal,mail.test.nothread.portal,model_mail_test_nothread,base.group_portal,1,0,0,0 +access_mail_test_track_all,mail.test.track.all,model_mail_test_track_all,base.group_user,1,1,1,1 access_mail_test_track_compute,mail.test.track.compute,model_mail_test_track_compute,base.group_user,1,1,1,1 access_mail_test_track_monetary,mail.test.track.monetary,model_mail_test_track_monetary,base.group_user,1,1,1,1 -access_mail_test_track_all,mail.test.track.all,model_mail_test_track_all,base.group_user,1,1,1,1 +access_mail_test_track_selection_portal,mail.test.track.selection.portal,model_mail_test_track_selection,base.group_portal,0,0,0,0 +access_mail_test_track_selection_user,mail.test.track.selection.user,model_mail_test_track_selection,base.group_user,1,1,1,1 diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py index 1388a7f3baa..b64dbb61822 100644 --- a/addons/test_mail/tests/test_message_track.py +++ b/addons/test_mail/tests/test_message_track.py @@ -165,6 +165,37 @@ class TestTracking(TestMailCommon): self.assertTrue(new_partner) self.assertEqual(new_partner.company_id, company1) + def test_track_invalid_selection(self): + # Test: Check that initial invalid selection values are allowed when tracking + # Create a record with an initially invalid selection value + invalid_value = 'I love writing tests!' + record = self.env['mail.test.track.selection'].create({ + 'name': 'Test Invalid Selection Values', + 'selection_type': 'first', + }) + + self.flush_tracking() + self.env.cr.execute( + """ + UPDATE mail_test_track_selection + SET selection_type = %s + WHERE id = %s + """, + [invalid_value, record.id] + ) + + record.invalidate_recordset() + + self.assertEqual(record.selection_type, invalid_value) + + # Write a valid selection value + record.selection_type = "second" + + self.flush_tracking() + self.assertTracking(record.message_ids, [ + ('selection_type', 'char', invalid_value, 'Second'), + ]) + def test_track_template(self): # Test: Check that default_* keys are not taken into account in _message_track_post_template magic_code = 'Up-Up-Down-Down-Left-Right-Left-Right-Square-Triangle'