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 @@
-
+
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',