From 72c96ec7780754d6667370eae7a103dca079df17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 19 Feb 2025 23:01:52 +0100 Subject: [PATCH] Add on_modification to ModelStorage --- trytond/CHANGELOG | 1 + trytond/doc/ref/models.rst | 11 +++++++++++ trytond/trytond/model/modelstorage.py | 7 +++++++ trytond/trytond/model/multivalue.py | 15 ++------------- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index bf19bd17fd..5227199b9a 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Add on_modification to ModelStorage * Add preprocess_values to ModelStorage * Remove trigger methods on ModelStorage * Add compute fields to ModelStorage diff --git a/trytond/doc/ref/models.rst b/trytond/doc/ref/models.rst index b9aa2581a7..5968b4e0b6 100644 --- a/trytond/doc/ref/models.rst +++ b/trytond/doc/ref/models.rst @@ -414,6 +414,17 @@ Class methods: Delete records. +.. classmethod:: ModelStorage.on_modification(mode, records[, field_names]) + + Method called after ``records`` have been modified. + ``mode`` can be either ``create``, ``write`` or ``delete``. + When the ``mode`` is ``write``, ``field_names`` is a :py:class:`set ` + containing modified fields. + + .. note:: + + It is used to trigger actions based on what has been modified. + .. classmethod:: ModelStorage.copy(records[, default]) Duplicate the records. diff --git a/trytond/trytond/model/modelstorage.py b/trytond/trytond/model/modelstorage.py index 645f5614d4..a8bed7d4d4 100644 --- a/trytond/trytond/model/modelstorage.py +++ b/trytond/trytond/model/modelstorage.py @@ -291,6 +291,7 @@ class ModelStorage(Model): records = cls.browse(sub_ids) cls._validate(records) cls._compute_fields(records) + cls.on_modification('create', records) if triggers: for trigger in triggers: trigger.queue_trigger_action(records) @@ -397,6 +398,7 @@ class ModelStorage(Model): records = cls.browse(sub_ids) cls._validate(records, field_names=field_names) cls._compute_fields(records, field_names=field_names) + cls.on_modification('write', records, field_names) for trigger, records in trigger_eligibles.items(): trigger.queue_trigger_action(records) @@ -422,6 +424,7 @@ class ModelStorage(Model): ModelData.clean(records) if check_access: cls.log(records, 'delete') + cls.on_modification('delete', records) triggers = Trigger.get_triggers(cls.__name__, 'delete') if triggers: @@ -476,6 +479,10 @@ class ModelStorage(Model): for f in cls._fields.values()): Translation.delete_ids(cls.__name__, 'model', ids) + @classmethod + def on_modification(cls, mode, records, field_names=None): + assert mode in {'create', 'write', 'delete'} + @classmethod def copy(cls, records, default=None): ''' diff --git a/trytond/trytond/model/multivalue.py b/trytond/trytond/model/multivalue.py index 6ff065ef67..d23a6daf45 100644 --- a/trytond/trytond/model/multivalue.py +++ b/trytond/trytond/model/multivalue.py @@ -134,19 +134,8 @@ class ValueMixin(MatchMixin, ModelStorage): return records @classmethod - def create(cls, vlist): - records = super().create(vlist) - cls._values_cache().clear() - return records - - @classmethod - def write(cls, *args): - super().write(*args) - cls._values_cache().clear() - - @classmethod - def delete(cls, records): - super().delete(records) + def on_modification(cls, mode, records, field_names=None): + super().on_modification(mode, records, field_names=field_names) cls._values_cache().clear()