Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions test-requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
odoo-addon-tracking_manager @ git+https://github.com/oca/server-tools.git@refs/pull/3596/head#subdirectory=tracking_manager
103 changes: 103 additions & 0 deletions tracking_manager_domain/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

=======================
Tracking Manager Domain
=======================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:b0730db6a25a61791c804b38d6ae18e8f6934cafe024c1121aa23e9967e0b532
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/19.0/tracking_manager_domain
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-19-0/server-tools-19-0-tracking_manager_domain
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=19.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module extends the Tracking Manager module to allow defining a
domain filter on tracked fields. Changes are only recorded when the
specified domain condition is satisfied on the parent record.

This is useful when you want to limit tracking to specific record states
or conditions, for example only tracking a field when a partner is a
company.

**Table of contents**

.. contents::
:local:

Usage
=====

- Add an optional domain on the field to limit tracking on certain
condition.

.. image:: https://raw.githubusercontent.com/OCA/server-tools/19.0/tracking_manager_domain/static/description/fields.drawio.png
:alt: fields

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/server-tools/issues/new?body=module:%20tracking_manager_domain%0Aversion:%2019.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* glueckkanja AG

Contributors
------------

- Christopher Rogos <[email protected]>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

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.

.. |maintainer-CRogos| image:: https://github.com/CRogos.png?size=40px
:target: https://github.com/CRogos
:alt: CRogos

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-CRogos|

This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/19.0/tracking_manager_domain>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions tracking_manager_domain/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
21 changes: 21 additions & 0 deletions tracking_manager_domain/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2025 glueckkanja AG (<https://www.glueckkanja.com>) - Christopher Rogos
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Tracking Manager Domain",
"summary": "This module extends the tracking manager to"
" allow to define a domain on fields to track changes "
"only when certain conditions apply.",
"version": "19.0.1.0.0",
"category": "Tools",
"website": "https://github.com/OCA/server-tools",
"author": "glueckkanja AG, Odoo Community Association (OCA)",
"maintainers": ["CRogos"],
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": ["tracking_manager"],
"data": [
"views/ir_model_fields.xml",
],
}
41 changes: 41 additions & 0 deletions tracking_manager_domain/i18n/it.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * tracking_manager_domain
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-04-08 06:44+0000\n"
"Last-Translator: mymage <[email protected]>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\n"

#. module: tracking_manager_domain
#: model:ir.model.fields,help:tracking_manager_domain.field_ir_model_fields__tracking_domain
msgid ""
"Add a domain filter to only track changes when certain condition apply on "
"the parent record."
msgstr ""
"Aggiungere un filtro di dominio per tracciare le modifiche solo quando si "
"applicano determinate condizioni al record padre."

#. module: tracking_manager_domain
#: model:ir.model,name:tracking_manager_domain.model_base
msgid "Base"
msgstr "Base"

#. module: tracking_manager_domain
#: model:ir.model,name:tracking_manager_domain.model_ir_model_fields
msgid "Fields"
msgstr "Campi"

#. module: tracking_manager_domain
#: model:ir.model.fields,field_description:tracking_manager_domain.field_ir_model_fields__tracking_domain
msgid "Tracking Domain"
msgstr "Dominio tracciamento"
46 changes: 46 additions & 0 deletions tracking_manager_domain/i18n/tracking_manager_domain.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * tracking_manager_domain
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.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: tracking_manager_domain
#: model:ir.model.fields,help:tracking_manager_domain.field_ir_model_fields__tracking_domain
msgid ""
"Add a domain filter to only track changes when certain condition apply on "
"the parent record."
msgstr ""

#. module: tracking_manager_domain
#: model:ir.model.fields,field_description:tracking_manager_domain.field_ir_model_fields__assigned_attachment_ids
msgid "Assigned Attachments"
msgstr ""

#. module: tracking_manager_domain
#: model:ir.model,name:tracking_manager_domain.model_base
msgid "Base"
msgstr ""

#. module: tracking_manager_domain
#: model:ir.model,name:tracking_manager_domain.model_ir_model_fields
msgid "Fields"
msgstr ""

#. module: tracking_manager_domain
#: model:ir.model.fields,field_description:tracking_manager_domain.field_ir_model_fields__smart_search
msgid "Smart Search"
msgstr ""

#. module: tracking_manager_domain
#: model:ir.model.fields,field_description:tracking_manager_domain.field_ir_model_fields__tracking_domain
msgid "Tracking Domain"
msgstr ""
2 changes: 2 additions & 0 deletions tracking_manager_domain/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import ir_model_fields
from . import models
22 changes: 22 additions & 0 deletions tracking_manager_domain/models/ir_model_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2025 glueckkanja AG (<https://www.glueckkanja.com>) - Christopher Rogos
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


class IrModelFields(models.Model):
_inherit = "ir.model.fields"

tracking_domain = fields.Char(
help="Add a domain filter to only track changes when"
" certain condition apply on the parent record."
)

def write(self, vals):
if "tracking_domain" in vals:
self.env.registry.clear_cache()
self.check_access("write")
custom_tracking_domain = vals.pop("tracking_domain")
self._write({"tracking_domain": custom_tracking_domain})
self.invalidate_model(fnames=["tracking_domain"])
return super().write(vals)
98 changes: 98 additions & 0 deletions tracking_manager_domain/models/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Copyright 2025 glueckkanja AG (<https://www.glueckkanja.com>) - Christopher Rogos
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).


from ast import literal_eval
from collections import defaultdict

from odoo import models, tools


class Base(models.AbstractModel):
_inherit = "base"

@tools.ormcache()
def _tm_all_tracking_domain_fields(self):
cr = self.env.cr
cr.execute(
"""
SELECT id, model, name, tracking_domain
FROM ir_model_fields
WHERE tracking_domain is not null
and tracking_domain != ''
and tracking_domain != '[]'
"""
)
result = defaultdict(dict)
for row in cr.dictfetchall():
result[row["model"]][row["name"]] = row
return result

def _tm_post_message(self, data):
for model_name, model_data in data.items():
all_tracking_domain_fields = self._tm_all_tracking_domain_fields()[
model_name
]
# check if any fields with tracking_domain
if not all_tracking_domain_fields:
continue
record_to_remove = []
for record_id, messages_by_field in model_data.items():
fields_to_remove = []
record = self.env[model_name].browse(record_id)
if not record.exists():
# if a record have been modify and then deleted
# it's not need to track the change so skip it
continue
for field_name, _messages in messages_by_field.items():
field_data = all_tracking_domain_fields.get(field_name, False)
if field_data and not record.filtered_domain(
literal_eval(field_data["tracking_domain"])
):
fields_to_remove.append(field_name)
for field_name in fields_to_remove:
del model_data[record_id][field_name]
if not model_data[record_id]:
record_to_remove.append(record_id)

for record_id in record_to_remove:
del model_data[record_id]
return super()._tm_post_message(data)

def _mail_track(self, tracked_fields, initial_values):
changes, tracking_value_ids = super()._mail_track(
tracked_fields, initial_values
)

# TODO: add properties support on domain filters
tracking_value_field_ids = [
tracking_value_id[2]["field_id"]
for tracking_value_id in tracking_value_ids
if "field_id" in tracking_value_id[2]
]
if tracking_value_field_ids:
all_tracking_domain_fields = self._tm_all_tracking_domain_fields()[
self._name
]

if all_tracking_domain_fields:
# remove entries that are not matching the tracking_domain of the field
fields_to_remove = []
for field_name in tracked_fields:
field_data = all_tracking_domain_fields.get(field_name, False)
if field_data and not self.filtered_domain(
literal_eval(field_data["tracking_domain"])
):
fields_to_remove.append(field_data["id"])
res_changes = []
res_tracking_value_ids = []
# remove values from tracking result
for change, tracking_value_id in zip(
changes, tracking_value_ids, strict=True
):
if tracking_value_id[2]["field_id"] not in fields_to_remove:
res_changes.append(change)
res_tracking_value_ids.append(tracking_value_id)
changes = res_changes
tracking_value_ids = res_tracking_value_ids
return changes, tracking_value_ids
3 changes: 3 additions & 0 deletions tracking_manager_domain/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
1 change: 1 addition & 0 deletions tracking_manager_domain/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Christopher Rogos \<<[email protected]>\>
6 changes: 6 additions & 0 deletions tracking_manager_domain/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
This module extends the Tracking Manager module to allow defining a domain
filter on tracked fields. Changes are only recorded when the specified domain
condition is satisfied on the parent record.

This is useful when you want to limit tracking to specific record states or
conditions, for example only tracking a field when a partner is a company.
3 changes: 3 additions & 0 deletions tracking_manager_domain/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Add an optional domain on the field to limit tracking on certain condition.

![fields](./static/description/fields.drawio.png)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading