Merge PR #1163 into 16.0

Signed-off-by simahawk
pull/1231/head
OCA-git-bot 2023-10-03 19:39:22 +00:00
commit 05c7a9b5e1
13 changed files with 584 additions and 0 deletions

View File

@ -0,0 +1,77 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
==============================
Tracking value change improved
==============================
This module extends the mail_tracking_value functionality that records
value changes on predefined fields.
It adds support for many2many and one2many fields, which are not handled
well by default.
It also implements a new view (little bit more user friendly than the
existing one) to watch for changes
Installation
============
To install this module, you need to:
#. Just install the module
Configuration
=============
To configure this module, you need to:
# No configuration is necessary
Usage
=====
To access the new view displaying value changes :
Settings -> Technical -> Improved tracking values
Known issues / Roadmap
======================
* Improve rendering of values depending of type using qweb widgets
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/mail_improved_tracking_value/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

View File

@ -0,0 +1,4 @@
# Copyright 2018 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models

View File

@ -0,0 +1,15 @@
# Copyright 2018 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Improved tracking value change",
"version": "16.0.1.0.0",
"summary": "Improves tracking changed values for certain type of fields."
"Adds a user-friendly view to consult them.",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Tools",
"website": "https://github.com/OCA/social",
"depends": ["base", "mail"],
"data": ["views/mail_tracking_value.xml"],
}

View File

@ -0,0 +1,88 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_improved_tracking_value
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_form_view
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list
msgid "Field changed"
msgstr ""
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_form_view
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list
msgid "For"
msgstr ""
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list_filter
msgid "Group By"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.ui.menu,name:mail_improved_tracking_value.menu_action_view_tracking_changes
msgid "Improved Tracking Values"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model,name:mail_improved_tracking_value.model_mail_tracking_value
msgid "Mail Tracking Value"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model.fields,field_description:mail_improved_tracking_value.field_mail_tracking_value__record_name
msgid "Message Record Name"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model.fields,field_description:mail_improved_tracking_value.field_mail_tracking_value__model
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list_filter
msgid "Model"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model.fields,help:mail_improved_tracking_value.field_mail_tracking_value__record_name
msgid "Name get of the related document."
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model.fields,field_description:mail_improved_tracking_value.field_mail_tracking_value__new_value_formatted
msgid "New value"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.model.fields,field_description:mail_improved_tracking_value.field_mail_tracking_value__old_value_formatted
msgid "Old value"
msgstr ""
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list
msgid "On"
msgstr ""
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list_filter
msgid "Search"
msgstr ""
#. module: mail_improved_tracking_value
#: model_terms:ir.ui.view,arch_db:mail_improved_tracking_value.tracking_change_list
msgid "Tracking change list"
msgstr ""
#. module: mail_improved_tracking_value
#: model:ir.actions.act_window,name:mail_improved_tracking_value.action_view_tracking_changes
msgid "View last tracked changes"
msgstr ""

View File

@ -0,0 +1,5 @@
# Copyright 2017 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import mail_tracking_value
from . import mail_message

View File

@ -0,0 +1,19 @@
from odoo import api, models
class MailMessage(models.Model):
_inherit = "mail.message"
@api.model
def name_get(self):
res = super(MailMessage, self).name_get()
params = self.env.context.get("params")
if params:
model = params.get("model")
view_type = params.get("view_type")
if model == "mail.tracking.value" and view_type == "form":
for rec in res:
if rec[1] == "False":
new_name = (rec[0], "Message ID - " + str(rec[0]))
res[res.index(rec)] = new_name
return res

View File

@ -0,0 +1,103 @@
# 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,
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1 @@
from . import test_improved_tracking_value

View File

@ -0,0 +1,184 @@
# Copyright 2018 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import json
from odoo.tests.common import TransactionCase
class TestImproveTrackingValue(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.model = cls.env["mail.tracking.value"]
cls.msg = cls.env["mail.message"].create({"message_type": "email"})
cls.mr = cls.env.ref("base.res_partner_title_mister")
cls.dr = cls.env.ref("base.res_partner_title_doctor")
cls.mm = cls.env.ref("base.res_partner_title_madam")
cls.pf = cls.env.ref("base.res_partner_title_prof")
def test_change_one2many(self):
"""Test tracking one2many changes"""
tracking = self.model.create_tracking_values(
self.mr,
self.dr,
"title",
{"string": "TestingField", "type": "one2many"},
tracking_sequence=100,
model_name="res.partner",
)
self.assertEqual(tracking["old_value_char"], self.mr.display_name)
self.assertEqual(tracking["new_value_char"], self.dr.display_name)
self.assertEqual(tracking["old_value_text"], json.dumps([self.mr.id]))
self.assertEqual(tracking["new_value_text"], json.dumps([self.dr.id]))
def test_change_one2many_empty(self):
"""Test tracking one2many changes emtpy"""
tracking = self.model.create_tracking_values(
self.mr,
None,
"title",
{"string": "TestingField", "type": "one2many"},
tracking_sequence=100,
model_name="res.partner",
)
self.assertEqual(tracking["old_value_char"], self.mr.display_name)
self.assertEqual(tracking["new_value_char"], "")
self.assertEqual(tracking["old_value_text"], json.dumps([self.mr.id]))
self.assertEqual(tracking["new_value_text"], json.dumps([]))
def test_change_many2many(self):
"""Test tracking many2many changes"""
oldvalue = self.env["res.partner.title"].browse([self.mr.id, self.dr.id])
newvalue = self.env["res.partner.title"].browse([self.mm.id, self.pf.id])
tracking = self.model.create_tracking_values(
oldvalue,
newvalue,
"title",
{"string": "TestingField", "type": "many2many"},
tracking_sequence=100,
model_name="res.partner",
)
self.assertEqual(
tracking["old_value_char"],
self.mr.display_name + ", " + self.dr.display_name,
)
self.assertEqual(
tracking["new_value_char"],
self.mm.display_name + ", " + self.pf.display_name,
)
self.assertEqual(tracking["old_value_text"], json.dumps(oldvalue.ids))
self.assertEqual(tracking["new_value_text"], json.dumps(newvalue.ids))
def test_char_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "char",
"old_value_char": "weakness",
"new_value_char": "strength",
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, "weakness")
self.assertEqual(r.new_value_formatted, "strength")
def test_many2many_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "many2many",
"old_value_char": "123",
"new_value_char": "456",
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, "123")
self.assertEqual(r.new_value_formatted, "456")
def test_one2many_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "one2many",
"old_value_char": "123",
"new_value_char": "456",
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, "123")
self.assertEqual(r.new_value_formatted, "456")
def test_integer_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "integer",
"old_value_integer": 1,
"new_value_integer": 3,
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, str(1))
self.assertEqual(r.new_value_formatted, str(3))
def test_float_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "float",
"old_value_float": 1.1,
"new_value_float": 3.14159,
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, str(1.1))
self.assertEqual(r.new_value_formatted, str(3.14159))
def test_monetary_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "monetary",
"old_value_monetary": 3.45,
"new_value_monetary": 5.45,
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, str(3.45))
self.assertEqual(r.new_value_formatted, str(5.45))
def test_datetime_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "datetime",
"old_value_datetime": "2018-01-01",
"new_value_datetime": "2018-01-04",
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, "2018-01-01 00:00:00")
self.assertEqual(r.new_value_formatted, "2018-01-04 00:00:00")
def test_text_tracking_value(self):
r = self.model.create(
{
"mail_message_id": self.msg.id,
"field_type": "text",
"old_value_text": "previous",
"new_value_text": "next",
"field": self.env["ir.model.fields"]._get("res.partner", "name").id,
"field_desc": "desc",
}
)
self.assertEqual(r.old_value_formatted, "previous")
self.assertEqual(r.new_value_formatted, "next")

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="tracking_change_list" model="ir.ui.view">
<field name="name">Tracking change list"</field>
<field name="model">mail.tracking.value</field>
<field name="arch" type="xml">
<tree
default_order="create_date desc"
create="false"
edit="false"
delete="false"
>
<field name="create_date" string="On" />
<field name="record_name" string="For" />
<field name="field_desc" string="Field changed" />
<field name="old_value_formatted" />
<field name="new_value_formatted" />
<field name="model" />
</tree>
</field>
</record>
<record id="tracking_change_form_view" model="ir.ui.view">
<field name="name">Tracking change form</field>
<field name="model">mail.tracking.value</field>
<field name="priority" eval="20" />
<field name="arch" type="xml">
<form>
<sheet>
<field name="create_date" class="oe-inline" />
<group name="main">
<field name="mail_message_id" string="For" />
<field name="field_desc" string="Field changed" />
<field name="old_value_formatted" />
<field name="new_value_formatted" />
<field name="model" />
</group>
</sheet>
</form>
</field>
</record>
<record id="tracking_change_list_filter" model="ir.ui.view">
<field name="name">Tracking change list filter</field>
<field name="model">mail.tracking.value</field>
<field name="arch" type="xml">
<search string="Search">
<field name="model" />
<group expand="1" string="Group By">
<filter
name="model"
string="Model"
context="{'group_by':'model'}"
/>
</group>
</search>
</field>
</record>
<record id="action_view_tracking_changes" model="ir.actions.act_window">
<field name="name">View last tracked changes</field>
<field name="res_model">mail.tracking.value</field>
<field name="view_mode">tree,form</field>
<field
name="view_ids"
eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('tracking_change_list')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('tracking_change_form_view')})]"
/>
</record>
<menuitem
action="action_view_tracking_changes"
id="menu_action_view_tracking_changes"
name="Improved Tracking Values"
parent="base.menu_email"
sequence="10"
/>
</odoo>

View File

@ -0,0 +1 @@
../../../../mail_improved_tracking_value

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)