diff --git a/addons/account/tests/test_account_move_send.py b/addons/account/tests/test_account_move_send.py index 23e8976563e..850ab19d246 100644 --- a/addons/account/tests/test_account_move_send.py +++ b/addons/account/tests/test_account_move_send.py @@ -261,7 +261,7 @@ class TestAccountComposerPerformance(AccountTestInvoicingCommon, MailCommon): # tracking: is_move_sent self.assertEqual(track_msg.author_id, self.env.user.partner_id) self.assertEqual(track_msg.email_from, self.env.user.email_formatted) - self.assertTrue('is_move_sent' in track_msg.tracking_value_ids.field.mapped('name')) + self.assertTrue('is_move_sent' in track_msg.tracking_value_ids.field_id.mapped('name')) # sent email self.assertMailMail( test_customer, @@ -348,7 +348,7 @@ class TestAccountComposerPerformance(AccountTestInvoicingCommon, MailCommon): # tracking: is_move_sent self.assertEqual(track_msg.author_id, self.env.user.partner_id) self.assertEqual(track_msg.email_from, self.env.user.email_formatted) - self.assertTrue('is_move_sent' in track_msg.tracking_value_ids.field.mapped('name')) + self.assertTrue('is_move_sent' in track_msg.tracking_value_ids.field_id.mapped('name')) # sent email self.assertMailMail( test_customer, diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 9cb195d54ed..6f2ca58a5d4 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -4404,14 +4404,14 @@ class MailThread(models.AbstractModel): tracking_message = return_line + message.subtype_id.description + return_line for value in message.sudo().tracking_value_ids.filtered(lambda tracking: not tracking.field_groups): - if value.field.ttype == 'boolean': + if value.field_id.ttype == 'boolean': old_value = str(bool(value.old_value_integer)) new_value = str(bool(value.new_value_integer)) else: old_value = value.old_value_char if value.old_value_char else str(value.old_value_integer) new_value = value.new_value_char if value.new_value_char else str(value.new_value_integer) - tracking_message += value.field.field_description + ': ' + old_value + tracking_message += value.field_id.field_description + ': ' + old_value if old_value != new_value: tracking_message += ' → ' + new_value tracking_message += return_line diff --git a/addons/mail/models/mail_tracking_duration_mixin.py b/addons/mail/models/mail_tracking_duration_mixin.py index c97385538aa..43a1461eaf1 100644 --- a/addons/mail/models/mail_tracking_duration_mixin.py +++ b/addons/mail/models/mail_tracking_duration_mixin.py @@ -53,7 +53,7 @@ class MailTrackingDurationMixin(models.AbstractModel): FROM mail_tracking_value v LEFT JOIN mail_message m ON m.id = v.mail_message_id - AND v.field = %(field_id)s + AND v.field_id = %(field_id)s WHERE m.model = %(model_name)s AND m.res_id IN %(record_ids)s ORDER BY v.id diff --git a/addons/mail/models/mail_tracking_value.py b/addons/mail/models/mail_tracking_value.py index a39f3dfbcb7..a0c67933d56 100644 --- a/addons/mail/models/mail_tracking_value.py +++ b/addons/mail/models/mail_tracking_value.py @@ -3,16 +3,18 @@ from datetime import datetime -from odoo import api, fields, models, _ +from odoo import api, fields, models class MailTracking(models.Model): _name = 'mail.tracking.value' _description = 'Mail Tracking Value' - _rec_name = 'field' + _rec_name = 'field_id' _order = 'id DESC' - field = fields.Many2one('ir.model.fields', required=True, readonly=True, index=True, ondelete='cascade') + field_id = fields.Many2one( + 'ir.model.fields', required=True, readonly=True, + index=True, ondelete='cascade') field_groups = fields.Char(compute='_compute_field_groups') old_value_integer = fields.Integer('Old Value Integer', readonly=True) @@ -32,11 +34,11 @@ class MailTracking(models.Model): mail_message_id = fields.Many2one('mail.message', 'Message ID', required=True, index=True, ondelete='cascade') - @api.depends('mail_message_id', 'field') + @api.depends('mail_message_id', 'field_id') def _compute_field_groups(self): for tracking in self: model = self.env[tracking.mail_message_id.model] - field = model._fields.get(tracking.field.name) + field = model._fields.get(tracking.field_id.name) tracking.field_groups = field.groups if field else 'base.group_system' @api.model @@ -59,7 +61,7 @@ class MailTracking(models.Model): if not field: raise ValueError(f'Unknown field {col_name} on model {record._name}') - values = {'field': field.id} + values = {'field_id': field.id} if col_info['type'] in {'integer', 'float', 'char', 'text', 'datetime'}: values.update({ @@ -114,19 +116,19 @@ class MailTracking(models.Model): """ if not self: return [] - field_models = self.field.mapped('model') + field_models = self.field_id.mapped('model') if len(set(field_models)) != 1: raise ValueError('All tracking value should belong to the same model.') TrackedModel = self.env[field_models[0]] - tracked_fields = TrackedModel.fields_get(self.field.mapped('name'), attributes={'string', 'type'}) - fields_col_info = (tracked_fields.get(tracking.field.name) for tracking in self) + tracked_fields = TrackedModel.fields_get(self.field_id.mapped('name'), attributes={'string', 'type'}) + fields_col_info = (tracked_fields.get(tracking.field_id.name) for tracking in self) fields_sequence_map = dict(TrackedModel._mail_track_order_fields(tracked_fields)) formatted = [ { 'changedField': col_info['string'], 'id': tracking.id, - 'fieldName': tracking.field.name, + 'fieldName': tracking.field_id.name, 'fieldType': col_info['type'], 'newValue': { 'currencyId': tracking.currency_id.id, diff --git a/addons/mail/static/tests/helpers/mock_server/models/mail_tracking_value.js b/addons/mail/static/tests/helpers/mock_server/models/mail_tracking_value.js index 11033372674..db012f0404f 100644 --- a/addons/mail/static/tests/helpers/mock_server/models/mail_tracking_value.js +++ b/addons/mail/static/tests/helpers/mock_server/models/mail_tracking_value.js @@ -53,7 +53,7 @@ patch(MockServer.prototype, { return; } - const values = {field: irField.id}; + const values = {field_id: irField.id}; switch (irField.ttype) { case "char": case "datetime": @@ -105,7 +105,7 @@ patch(MockServer.prototype, { _mockMailTrackingValue_TrackingValueFormat(tracking_value_ids) { const trackingValues = tracking_value_ids.map((tracking) => { const irField = this.models["ir.model.fields"].records.find( - (field) => field.id === tracking.field + (field) => field.id === tracking.field_id ); return { changedField: capitalize(irField.ttype), @@ -127,7 +127,7 @@ patch(MockServer.prototype, { */ _mockMailTrackingValue_FormatDisplayValue(record, type) { const irField = this.models["ir.model.fields"].records.find( - (field) => field.id === record.field + (field) => field.id === record.field_id ); switch (irField.ttype) { case "float": diff --git a/addons/mail/tests/common.py b/addons/mail/tests/common.py index afc3d566783..1311678506e 100644 --- a/addons/mail/tests/common.py +++ b/addons/mail/tests/common.py @@ -1150,7 +1150,7 @@ class MailCase(MockEmail): 'text': 'text', } for field_name, value_type, old_value, new_value in data: - tracking = tracking_values.filtered(lambda track: track.field.name == field_name) + tracking = tracking_values.filtered(lambda track: track.field_id.name == field_name) self.assertEqual(len(tracking), 1, f'Tracking: not found for {field_name}') msg_base = f'Tracking: {field_name} ({value_type}: ' if value_type in suffix_mapping: diff --git a/addons/mail/tests/test_res_partner.py b/addons/mail/tests/test_res_partner.py index dafe82b13e7..5f5b48fc8ed 100644 --- a/addons/mail/tests/test_res_partner.py +++ b/addons/mail/tests/test_res_partner.py @@ -109,7 +109,7 @@ class TestPartner(MailCommon): self.assertIn(f'{self.env.company.name}, Some Other Street Name, Some Other City Name CA 94134, United States', tracking_values.new_value_char) # none of the address fields are logged at the same time - self.assertEqual(set(), set(partner._address_fields()) & set(tracking_values.sudo().field.mapped('name'))) + self.assertEqual(set(), set(partner._address_fields()) & set(tracking_values.sudo().field_id.mapped('name'))) def test_discuss_mention_suggestions_priority(self): name = uuid4() # unique name to avoid conflict with already existing users diff --git a/addons/mail/views/mail_tracking_value_views.xml b/addons/mail/views/mail_tracking_value_views.xml index d9fe1b47e25..8000999e5cb 100644 --- a/addons/mail/views/mail_tracking_value_views.xml +++ b/addons/mail/views/mail_tracking_value_views.xml @@ -8,7 +8,7 @@ 12 - + @@ -31,7 +31,7 @@
- + diff --git a/addons/project/__init__.py b/addons/project/__init__.py index e5493f8675a..c98181dad52 100644 --- a/addons/project/__init__.py +++ b/addons/project/__init__.py @@ -31,5 +31,5 @@ def _project_post_init(env): 'mail_tracking_value_mail_message_id_old_value_integer_task_stage', env['mail.tracking.value']._table, ['mail_message_id', 'old_value_integer'], - where=f'field={project_task_stage_field_id}' + where=f'field_id={project_task_stage_field_id}' ) diff --git a/addons/project/data/project_demo.xml b/addons/project/data/project_demo.xml index b562716dadd..bba772e4030 100644 --- a/addons/project/data/project_demo.xml +++ b/addons/project/data/project_demo.xml @@ -303,7 +303,7 @@ - + New In Progress 1 @@ -311,7 +311,7 @@ - + In Progress Done 2 @@ -349,7 +349,7 @@ - + New In Progress 1 @@ -357,7 +357,7 @@ - + In Progress Done 2 @@ -395,7 +395,7 @@ - + New In Progress 1 @@ -403,7 +403,7 @@ - + In Progress Done 2 @@ -433,7 +433,7 @@ - + New In Progress 1 @@ -474,7 +474,7 @@ - + New In Progress 1 @@ -512,7 +512,7 @@ - + New In Progress 1 @@ -544,7 +544,7 @@ - + New In Progress 1 @@ -726,7 +726,7 @@ - + New In Progress 1 @@ -742,7 +742,7 @@ - + In Progress Done 2 @@ -770,7 +770,7 @@ - + New In Progress 1 @@ -786,7 +786,7 @@ - + In Progress Done 2 @@ -815,7 +815,7 @@ - + New In Progress 1 @@ -879,7 +879,7 @@ Send it ASAP, its urgent. - + New In Progress 1 @@ -909,7 +909,7 @@ Send it ASAP, its urgent. - + New In Progress 1 @@ -937,7 +937,7 @@ Send it ASAP, its urgent. - + New In Progress 1 @@ -967,7 +967,7 @@ Send it ASAP, its urgent. - + New In Progress 1 @@ -983,7 +983,7 @@ Send it ASAP, its urgent. - + In Progress Done 2 @@ -1013,7 +1013,7 @@ Send it ASAP, its urgent. - + New In Progress 1 diff --git a/addons/project/models/project_update.py b/addons/project/models/project_update.py index 7bc2ff393bf..5fe9f7705b7 100644 --- a/addons/project/models/project_update.py +++ b/addons/project/models/project_update.py @@ -159,7 +159,7 @@ class ProjectUpdate(models.Model): INNER JOIN mail_tracking_value mtv ON mm.id = mtv.mail_message_id INNER JOIN ir_model_fields imf - ON mtv.field = imf.id + ON mtv.field_id = imf.id AND imf.model = 'project.milestone' AND imf.name = 'deadline' INNER JOIN project_milestone pm diff --git a/addons/project/report/project_task_burndown_chart_report.py b/addons/project/report/project_task_burndown_chart_report.py index 43449977ddb..de35f6b98fc 100644 --- a/addons/project/report/project_task_burndown_chart_report.py +++ b/addons/project/report/project_task_burndown_chart_report.py @@ -124,7 +124,7 @@ class ReportProjectTaskBurndownChart(models.AbstractModel): LEFT JOIN ( mail_message mm JOIN mail_tracking_value mtv ON mm.id = mtv.mail_message_id - AND mtv.field = %(field_id)s + AND mtv.field_id = %(field_id)s AND mm.model='project.task' AND mm.message_type = 'notification' JOIN project_task_type ptt ON ptt.id = mtv.old_value_integer @@ -154,7 +154,7 @@ class ReportProjectTaskBurndownChart(models.AbstractModel): SELECT mm.date FROM mail_message mm JOIN mail_tracking_value mtv ON mm.id = mtv.mail_message_id - AND mtv.field = %(field_id)s + AND mtv.field_id = %(field_id)s AND mm.model='project.task' AND mm.message_type = 'notification' AND mm.res_id = pt.id diff --git a/addons/purchase_stock/models/account_move_line.py b/addons/purchase_stock/models/account_move_line.py index 99888bcded6..c8e18da5210 100644 --- a/addons/purchase_stock/models/account_move_line.py +++ b/addons/purchase_stock/models/account_move_line.py @@ -70,7 +70,7 @@ class AccountMoveLine(models.Model): move = aml.move_id if move.state != 'posted': continue - state_trackings = move.message_ids.tracking_value_ids.filtered(lambda t: t.field == am_state_field).sorted('id') + state_trackings = move.message_ids.tracking_value_ids.filtered(lambda t: t.field_id == am_state_field).sorted('id') time = state_trackings[-1:].create_date or move.create_date # `or` in case it has been created in posted state history.append((time, aml, False)) # Sort history based on the datetime. In case of equality, the prority is given to SVLs, then to IDs. diff --git a/addons/test_mail/tests/test_message_track.py b/addons/test_mail/tests/test_message_track.py index 783d70b4497..714199b3b6d 100644 --- a/addons/test_mail/tests/test_message_track.py +++ b/addons/test_mail/tests/test_message_track.py @@ -681,7 +681,7 @@ class TestTrackingInternals(MailCommon): [('mail_message_id', '=', record.message_ids[0].id)] ) self.assertEqual( - tracking_values.field.mapped('name'), + tracking_values.field_id.mapped('name'), ordered_fnames, 'Track: order, based on ID DESC, should follow tracking sequence (or name) on field' ) @@ -698,7 +698,7 @@ class TestTrackingInternals(MailCommon): ] self.env['mail.tracking.value'].sudo().create([ { - 'field': field_id, + 'field_id': field_id, 'mail_message_id': new_msg.id, 'old_value_char': 'unimportant', 'new_value_char': 'unimportant', @@ -709,7 +709,7 @@ class TestTrackingInternals(MailCommon): [('mail_message_id', '=', record.message_ids[0].id)] ) self.assertEqual( - tracking_values.field.mapped('name'), + tracking_values.field_id.mapped('name'), list(reversed(custom_order_fnames)), 'Tracking model: order, based on ID DESC, following reverted insertion' ) diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py index 08f7b90f0fa..11ec5ba5004 100644 --- a/addons/test_mail/tests/test_performance.py +++ b/addons/test_mail/tests/test_performance.py @@ -853,12 +853,12 @@ class TestMailComplexPerformance(BaseMailPerformance): 'subtype_id': comment_subtype_id, 'tracking_value_ids': [ (0, 0, { - 'field': name_field.id, + 'field_id': name_field.id, 'new_value_char': 'new 0', 'old_value_char': 'old 0', }), (0, 0, { - 'field': customer_id_field.id, + 'field_id': customer_id_field.id, 'new_value_char': 'new 1', 'new_value_integer': cls.partners[(record_idx * 5)].id, 'old_value_char': 'old 1', diff --git a/addons/test_mail_full/tests/test_mail_performance.py b/addons/test_mail_full/tests/test_mail_performance.py index 11e4da070f9..fa05fb676cb 100644 --- a/addons/test_mail_full/tests/test_mail_performance.py +++ b/addons/test_mail_full/tests/test_mail_performance.py @@ -198,8 +198,7 @@ class TestPortalFormatPerformance(FullBaseMailPerformance): ], 'tracking_value_ids': [ (0, 0, { - 'field': user_id_field.id, - 'field_desc': 'Responsible', + 'field_id': user_id_field.id, 'new_value_char': 'new 1', 'new_value_integer': record.user_id.id, 'old_value_char': 'old 1',