Skip to content

Commit 36c0a1b

Browse files
committed
[IMP] tracking_manager: add domain condition for tracking fields
1 parent 0fc4704 commit 36c0a1b

File tree

11 files changed

+133
-22
lines changed

11 files changed

+133
-22
lines changed

tracking_manager/README.rst

+21-18
Original file line numberDiff line numberDiff line change
@@ -42,29 +42,31 @@ order_line in a sale order).
4242
Usage
4343
=====
4444

45-
- In setting > models: select a model
46-
- Check "Active" under Custom Tracking.
47-
- You have two options - 1) manually configure tracked fields one by
48-
one, or 2) determine tracked fields based on a specific domain.
49-
- For 1) manually configure tracked fields one by one
45+
- In setting > models: select a model
46+
- Check "Active" under Custom Tracking.
47+
- Add an optional domain on the field to limit tracking on certain
48+
condition.
49+
- You have two options - 1) manually configure tracked fields one by
50+
one, or 2) determine tracked fields based on a specific domain.
51+
- For 1) manually configure tracked fields one by one
5052

51-
- Click on Tracked Fields smart button, and select/unselect Custom
52-
Tracking.
53+
- Click on Tracked Fields smart button, and select/unselect Custom
54+
Tracking.
5355

54-
- For 2) determine tracked fields based on a specific domain
56+
- For 2) determine tracked fields based on a specific domain
5557

56-
- Select "Automatic configuration", and then set the domain
57-
accordingly.
58-
- Click "Update" for the domain to take effect.
58+
- Select "Automatic configuration", and then set the domain
59+
accordingly.
60+
- Click "Update" for the domain to take effect.
5961

60-
|image|
62+
|model_view|
6163

62-
- Then select the fields to track
64+
- Then select the fields to track
6365

64-
|image1|
66+
|fields|
6567

66-
.. |image| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/model_view.png
67-
.. |image1| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/fields.png
68+
.. |model_view| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/model_view.png
69+
.. |fields| image:: https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/fields.drawio.png
6870

6971
Bug Tracker
7072
===========
@@ -87,8 +89,9 @@ Authors
8789
Contributors
8890
------------
8991

90-
- Kévin Roche <[email protected]>
91-
- Sébastien BEAU <[email protected]>
92+
- Kévin Roche <[email protected]>
93+
- Sébastien BEAU <[email protected]>
94+
- Christopher Rogos <[email protected]>
9295

9396
Maintainers
9497
-----------

tracking_manager/models/ir_model_fields.py

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class IrModelFields(models.Model):
2424
store=True,
2525
)
2626

27+
tracking_domain = fields.Char(
28+
help="Add a domain filter to only track changes when"
29+
" certain condition apply on the parent record."
30+
)
31+
2732
@api.depends("native_tracking")
2833
def _compute_custom_tracking(self):
2934
for record in self:
@@ -59,4 +64,11 @@ def write(self, vals):
5964
custom_tracking = vals.pop("custom_tracking")
6065
self._write({"custom_tracking": custom_tracking})
6166
self.invalidate_model(fnames=["custom_tracking"])
67+
68+
if "tracking_domain" in vals:
69+
self.env.registry.clear_cache()
70+
self.check_access_rights("write")
71+
custom_tracking_domain = vals.pop("tracking_domain")
72+
self._write({"tracking_domain": custom_tracking_domain})
73+
self.invalidate_model(fnames=["tracking_domain"])
6274
return super().write(vals)

tracking_manager/models/models.py

+36
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
44

55

6+
from ast import literal_eval
67
from collections import defaultdict
78

89
from odoo import api, models, tools
@@ -21,6 +22,41 @@ class Base(models.AbstractModel):
2122
def is_tracked_by_o2m(self):
2223
return self._name in self.env["ir.model"]._get_model_tracked_by_o2m()
2324

25+
def _mail_track(self, tracked_fields, initial_values):
26+
changes, tracking_value_ids = super()._mail_track(
27+
tracked_fields, initial_values
28+
)
29+
tracking_value_field_ids = [
30+
tracking_value_id[2]["field_id"] for tracking_value_id in tracking_value_ids
31+
]
32+
if tracking_value_field_ids:
33+
# if there are fields to track, load tracking_domain information
34+
field_with_domain = self.env["ir.model.fields"].search(
35+
[
36+
("id", "in", tracking_value_field_ids),
37+
("tracking_domain", "!=", False),
38+
("tracking_domain", "!=", "[]"),
39+
]
40+
)
41+
if field_with_domain:
42+
# remove entries that are not matching the tracking_domain of the field
43+
fields_to_remove = []
44+
for field in field_with_domain:
45+
if not self.filtered_domain(literal_eval(field.tracking_domain)):
46+
fields_to_remove.append(field.id)
47+
res_changes = []
48+
res_tracking_value_ids = []
49+
# remove values from tracking result
50+
for change, tracking_value_id in zip(
51+
changes, tracking_value_ids, strict=True
52+
):
53+
if tracking_value_id[2]["field_id"] not in fields_to_remove:
54+
res_changes.append(change)
55+
res_tracking_value_ids.append(tracking_value_id)
56+
changes = res_changes
57+
tracking_value_ids = res_tracking_value_ids
58+
return changes, tracking_value_ids
59+
2460
def _tm_get_fields_to_notify(self):
2561
return (
2662
self.env["ir.model"]
+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
- Kévin Roche \<<[email protected]>\>
22
- Sébastien BEAU \<<[email protected]>\>
3+
- Christopher Rogos \<<[email protected]>\>

tracking_manager/readme/USAGE.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
- In setting \> models: select a model
22
- Check "Active" under Custom Tracking.
3+
- Add an optional domain on the field to limit tracking on certain condition.
34
- You have two options - 1) manually configure tracked fields one by
45
one, or 2) determine tracked fields based on a specific domain.
56
- For 1) manually configure tracked fields one by one
@@ -10,8 +11,8 @@
1011
accordingly.
1112
- Click "Update" for the domain to take effect.
1213

13-
![image](./static/description/model_view.png)
14+
![model_view](./static/description/model_view.png)
1415

1516
- Then select the fields to track
1617

17-
![image](./static/description/fields.png)
18+
![fields](./static/description/fields.drawio.png)
Loading
-72.2 KB
Binary file not shown.

tracking_manager/static/description/index.html

+5-2
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ <h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
393393
<ul class="simple">
394394
<li>In setting &gt; models: select a model</li>
395395
<li>Check “Active” under Custom Tracking.</li>
396+
<li>Add an optional domain on the field to limit tracking on certain
397+
condition.</li>
396398
<li>You have two options - 1) manually configure tracked fields one by
397399
one, or 2) determine tracked fields based on a specific domain.</li>
398400
<li>For 1) manually configure tracked fields one by one<ul>
@@ -407,11 +409,11 @@ <h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
407409
</ul>
408410
</li>
409411
</ul>
410-
<p><img alt="image" src="https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/model_view.png" /></p>
412+
<p><img alt="model_view" src="https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/model_view.png" /></p>
411413
<ul class="simple">
412414
<li>Then select the fields to track</li>
413415
</ul>
414-
<p><img alt="image1" src="https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/fields.png" /></p>
416+
<p><img alt="fields" src="https://raw.githubusercontent.com/OCA/server-tools/17.0/tracking_manager/static/description/fields.drawio.png" /></p>
415417
</div>
416418
<div class="section" id="bug-tracker">
417419
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
@@ -434,6 +436,7 @@ <h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
434436
<ul class="simple">
435437
<li>Kévin Roche &lt;<a class="reference external" href="mailto:kevin.roche&#64;akretion.com">kevin.roche&#64;akretion.com</a>&gt;</li>
436438
<li>Sébastien BEAU &lt;<a class="reference external" href="mailto:sebastien.beau&#64;akretion.com">sebastien.beau&#64;akretion.com</a>&gt;</li>
439+
<li>Christopher Rogos &lt;<a class="reference external" href="mailto:crogos&#64;gmail.com">crogos&#64;gmail.com</a>&gt;</li>
437440
</ul>
438441
</div>
439442
<div class="section" id="maintainers">

tracking_manager/tests/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from . import test_tracking_manager
22
from . import test_mail_tracking_value
3+
from . import test_models

tracking_manager/tests/test_models.py

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from odoo.tests.common import TransactionCase
2+
3+
4+
class TestMailTrack(TransactionCase):
5+
def setUp(self):
6+
super().setUp()
7+
8+
self.Field = self.env["ir.model.fields"]
9+
self.field_mobile = self.Field.search(
10+
[("model", "=", "res.partner"), ("name", "=", "mobile")], limit=1
11+
)
12+
self.field_mobile.write({"tracking_domain": "[('is_company', '=', True)]"})
13+
14+
def test_mail_track(self):
15+
# arrange
16+
company = self.env.ref("base.res_partner_12")
17+
tracked_fields = {"mobile": {"string": "Mobile", "type": "char"}}
18+
initial_values = {"mobile": "1234"}
19+
20+
# act
21+
changes, tracking_value_ids = company._mail_track(
22+
tracked_fields, initial_values
23+
)
24+
25+
# assert
26+
# Check if changes and tracking_value_ids are returned correctly
27+
self.assertEqual(len(changes), 1)
28+
self.assertEqual(len(tracking_value_ids), 1)
29+
30+
# Check if the field is tracked correctly
31+
tracking_value = tracking_value_ids[0][2]
32+
self.assertEqual(tracking_value["field_id"], self.field_mobile.id)
33+
34+
def test_mail_track_with_non_matching_domain(self):
35+
# arrange
36+
person = self.env.ref("base.partner_admin")
37+
38+
tracked_fields = {"mobile": {"string": "Mobile", "type": "char"}}
39+
initial_values = {"mobile": "1234"}
40+
41+
# act
42+
changes, tracking_value_ids = person._mail_track(tracked_fields, initial_values)
43+
44+
# assert
45+
# Check if changes and tracking_value_ids are empty when domain does not match
46+
self.assertEqual(len(changes), 0)
47+
self.assertEqual(len(tracking_value_ids), 0)

tracking_manager/views/ir_model_fields.xml

+7
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,18 @@
2020
<field name="model">ir.model.fields</field>
2121
<field name="arch" type="xml">
2222
<tree editable="bottom" create="0" delete="0" duplicate="0">
23+
<field name="model" invisible="1" />
2324
<field name="name" readonly="True" />
2425
<field name="field_description" readonly="True" />
2526
<field name="ttype" readonly="True" />
2627
<field name="native_tracking" readonly="True" />
2728
<field name="custom_tracking" widget="boolean_toggle" />
29+
<field
30+
name="tracking_domain"
31+
widget="domain"
32+
options="{'model': 'model'}"
33+
optional="hide"
34+
/>
2835
</tree>
2936
</field>
3037
</record>

0 commit comments

Comments
 (0)