social/mail_improved_tracking_value/models/mail_tracking_value.py

104 lines
3.7 KiB
Python

# Copyright 2018-2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import json
from odoo import api, fields, models
class MailTrackingValue(models.Model):
_inherit = "mail.tracking.value"
new_value_formatted = fields.Char(
compute="_compute_formatted_value", string="New value"
)
old_value_formatted = fields.Char(
compute="_compute_formatted_value", string="Old value"
)
record_name = fields.Char(related="mail_message_id.record_name")
model = fields.Char(related="mail_message_id.model", store="True", string="Model")
@api.depends(
"new_value_char",
"new_value_integer",
"new_value_float",
"new_value_text",
"new_value_datetime",
"new_value_monetary",
"old_value_char",
"old_value_integer",
"old_value_float",
"old_value_text",
"old_value_datetime",
"old_value_monetary",
)
def _compute_formatted_value(self):
"""Sets the value formatted field used in the view"""
for record in self:
if record.field_type in ("many2many", "one2many", "char"):
record.new_value_formatted = record.new_value_char
record.old_value_formatted = record.old_value_char
elif record.field_type == "integer":
record.new_value_formatted = str(record.new_value_integer)
record.old_value_formatted = str(record.old_value_integer)
elif record.field_type == "float":
record.new_value_formatted = str(record.new_value_float)
record.old_value_formatted = str(record.old_value_float)
elif record.field_type == "monetary":
record.new_value_formatted = str(record.new_value_monetary)
record.old_value_formatted = str(record.old_value_monetary)
elif record.field_type == "datetime":
record.new_value_formatted = str(record.new_value_datetime)
record.old_value_formatted = str(record.old_value_datetime)
elif record.field_type == "text":
record.new_value_formatted = record.new_value_text
record.old_value_formatted = record.old_value_text
@api.model
def create_tracking_values(
self,
initial_value,
new_value,
col_name,
col_info,
tracking_sequence,
model_name,
):
"""Add tacking capabilities for many2many and one2many fields"""
if col_info["type"] in ("many2many", "one2many"):
def get_values(source, prefix):
if source:
names = ", ".join(source.exists().mapped("display_name"))
json_ids = json.dumps(source.ids)
else:
names = ""
json_ids = json.dumps([])
return {
"{}_value_char".format(prefix): names,
"{}_value_text".format(prefix): json_ids,
}
field = self.env["ir.model.fields"]._get(model_name, col_name)
if not field:
return
values = {
"field": field.id,
"field_desc": col_info["string"],
"field_type": col_info["type"],
}
values.update(get_values(initial_value, "old"))
values.update(get_values(new_value, "new"))
return values
else:
return super().create_tracking_values(
initial_value,
new_value,
col_name,
col_info,
tracking_sequence,
model_name,
)