From 72d637cec98187288e2ee498f7091eb8ad37d2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 21 Nov 2025 11:50:54 +0100 Subject: [PATCH] Test if field_names is None instead of empty in ModelStorage hooks Closes #14382 --- modules/account_invoice/invoice.py | 2 +- modules/account_payment/payment.py | 2 +- modules/account_stock_eu/stock.py | 4 ++-- modules/attendance/attendance.py | 2 +- modules/bank/bank.py | 2 +- modules/company/company.py | 2 +- modules/party/contact_mechanism.py | 2 +- modules/party/party.py | 2 +- modules/project_plan/work.py | 6 +++--- modules/stock/move.py | 2 +- modules/stock/shipment.py | 2 +- modules/stock_product_location_place/stock.py | 6 ++++-- modules/stock_shipment_measurements/stock.py | 4 ++-- trytond/trytond/ir/email_.py | 2 +- trytond/trytond/tests/modelstorage.py | 2 +- 15 files changed, 22 insertions(+), 20 deletions(-) diff --git a/modules/account_invoice/invoice.py b/modules/account_invoice/invoice.py index e07c681f91..c94e125a03 100644 --- a/modules/account_invoice/invoice.py +++ b/modules/account_invoice/invoice.py @@ -1585,7 +1585,7 @@ class Invoice( def compute_fields(self, field_names=None): values = super().compute_fields(field_names=field_names) - if (not field_names or 'number' in field_names): + if (field_names is None or 'number' in field_names): values['number_alnum'] = ( re.sub(r'[\W_]', '', self.number) if self.number is not None else None) diff --git a/modules/account_payment/payment.py b/modules/account_payment/payment.py index 38536703d3..1edb0d929a 100644 --- a/modules/account_payment/payment.py +++ b/modules/account_payment/payment.py @@ -675,7 +675,7 @@ class Payment(Workflow, ModelSQL, ModelView, ChatMixin): Line = pool.get('account.move.line') super().on_modification(mode, payments, field_names=field_names) if mode in {'create', 'write'}: - if not field_names or 'line' in field_names: + if field_names is None or 'line' in field_names: if lines := Line.browse({p.line for p in payments if p.line}): Line.set_payment_amount(lines) diff --git a/modules/account_stock_eu/stock.py b/modules/account_stock_eu/stock.py index b9ec85c21e..47f305285e 100644 --- a/modules/account_stock_eu/stock.py +++ b/modules/account_stock_eu/stock.py @@ -186,12 +186,12 @@ class Move(metaclass=PoolMeta): cls = self.__class__ values = super().compute_fields(field_names=field_names) if (self.state not in {'done', 'cancelled'} - and (not field_names + and (field_names is None or (cls.intrastat_type.on_change_with & field_names))): intrastat_type = self.on_change_with_intrastat_type() if getattr(self, 'intrastat_type', None) != intrastat_type: values['intrastat_type'] = intrastat_type - if (not field_names + if (field_names is None or (cls.intrastat_value.on_change_with & field_names)): intrastat_value = self.on_change_with_intrastat_value() if getattr(self, 'intrastat_value', None) != intrastat_value: diff --git a/modules/attendance/attendance.py b/modules/attendance/attendance.py index ab156b472b..20977fce15 100644 --- a/modules/attendance/attendance.py +++ b/modules/attendance/attendance.py @@ -89,7 +89,7 @@ class Line(ModelSQL, ModelView): def compute_fields(self, field_names=None): cls = self.__class__ values = super().compute_fields(field_names=field_names) - if (not field_names + if (field_names is None or (cls.date.on_change_with & field_names)): date = self.on_change_with_date() if getattr(self, 'date', None) != date: diff --git a/modules/bank/bank.py b/modules/bank/bank.py index 03f29274ff..1d42b943d9 100644 --- a/modules/bank/bank.py +++ b/modules/bank/bank.py @@ -277,7 +277,7 @@ class AccountNumber(DeactivableMixin, sequence_ordered(), ModelSQL, ModelView): def compute_fields(self, field_names=None): values = super().compute_fields(field_names=field_names) - if ((not field_names or {'type', 'number'} & field_names) + if ((field_names is None or {'type', 'number'} & field_names) and getattr(self, 'type', None) == 'iban'): number = getattr(self, 'number', None) if number: diff --git a/modules/company/company.py b/modules/company/company.py index b623ceca86..a34710845e 100644 --- a/modules/company/company.py +++ b/modules/company/company.py @@ -126,7 +126,7 @@ class Company(ModelSQL, ModelView): Rule = pool.get('ir.rule') super().on_modification(mode, companies, field_names=field_names) if mode == 'write': - if not field_names or 'logo' in field_names: + if field_names is None or 'logo' in field_names: cls._logo_clear_cache(companies) Rule._domain_get_cache.clear() diff --git a/modules/party/contact_mechanism.py b/modules/party/contact_mechanism.py index a1a6511dce..96583d21e4 100644 --- a/modules/party/contact_mechanism.py +++ b/modules/party/contact_mechanism.py @@ -273,7 +273,7 @@ class ContactMechanism( def compute_fields(self, field_names=None): values = super().compute_fields(field_names=field_names) - if not field_names or {'value', 'type'} & field_names: + if field_names is None or {'value', 'type'} & field_names: if getattr(self, 'value', None) and getattr(self, 'type', None): value = self.format_value(value=self.value, type_=self.type) if self.value != value: diff --git a/modules/party/party.py b/modules/party/party.py index 040616ef75..cd2f1dd772 100644 --- a/modules/party/party.py +++ b/modules/party/party.py @@ -300,7 +300,7 @@ class Party( def compute_fields(self, field_names=None): values = super().compute_fields(field_names=field_names) - if (not field_names or 'code' in field_names): + if (field_names is None or 'code' in field_names): values['code_alnum'] = ( re.sub(r'[\W_]', '', self.code) if self.code is not None else None) diff --git a/modules/project_plan/work.py b/modules/project_plan/work.py index dcaaf7863d..946513a131 100644 --- a/modules/project_plan/work.py +++ b/modules/project_plan/work.py @@ -554,9 +554,9 @@ class Work(tree(parent='successors'), metaclass=PoolMeta): super().on_modification(mode, works, field_names=field_names) if mode in {'create', 'write'}: for work in works: - if not field_names or 'effort' in field_names: + if field_names is None or 'effort' in field_names: work.reset_leveling() - if not field_names or field_names & { + if field_names is None or field_names & { 'constraint_start_time', 'constraint_finish_time', 'effort'}: work.compute_dates() @@ -590,7 +590,7 @@ class PredecessorSuccessor(ModelSQL): def on_modification(cls, mode, records, field_names=None): super().on_modification(mode, records, field_names=field_names) if mode == 'create': - if not field_names or field_names & { + if field_names is None or field_names & { 'predecessor', 'successor', 'parent'}: for record in records: record.predecessor.reset_leveling() diff --git a/modules/stock/move.py b/modules/stock/move.py index f8b75a8d2e..8d06807184 100644 --- a/modules/stock/move.py +++ b/modules/stock/move.py @@ -997,7 +997,7 @@ class Move(Workflow, ModelSQL, ModelView): def compute_fields(self, field_names=None): cls = self.__class__ values = super().compute_fields(field_names=field_names) - if (not field_names + if (field_names is None or (cls.internal_quantity.on_change_with & field_names)): internal_quantity = self.on_change_with_internal_quantity() if getattr(self, 'internal_quantity', None) != internal_quantity: diff --git a/modules/stock/shipment.py b/modules/stock/shipment.py index 83a40437e8..ee208ea710 100644 --- a/modules/stock/shipment.py +++ b/modules/stock/shipment.py @@ -165,7 +165,7 @@ class ShipmentMixin: Move = pool.get('stock.move') super().on_modification(mode, shipments, field_names=field_names) if (mode in {'create', 'write'} - and (not field_names or 'planned_date' in field_names)): + and (field_names is None or 'planned_date' in field_names)): cls._set_move_planned_date(shipments) elif mode == 'delete': if hasattr(cls, 'moves'): diff --git a/modules/stock_product_location_place/stock.py b/modules/stock_product_location_place/stock.py index 842bc99915..8565158e28 100644 --- a/modules/stock_product_location_place/stock.py +++ b/modules/stock_product_location_place/stock.py @@ -127,11 +127,13 @@ class Move(metaclass=PoolMeta): cls = self.__class__ values = super().compute_fields(field_names=field_names) if getattr(self, 'state', None) not in {'done', 'cancelled'}: - if not field_names or cls.from_place.on_change_with & field_names: + if (field_names is None + or cls.from_place.on_change_with & field_names): from_place = self.on_change_with_from_place() if getattr(self, 'from_place', None) != from_place: values['from_place'] = from_place - if not field_names or cls.to_place.on_change_with & field_names: + if (field_names is None + or cls.to_place.on_change_with & field_names): to_place = self.on_change_with_to_place() if getattr(self, 'to_place', None) != to_place: values['to_place'] = to_place diff --git a/modules/stock_shipment_measurements/stock.py b/modules/stock_shipment_measurements/stock.py index 2c61683383..fafaf60cda 100644 --- a/modules/stock_shipment_measurements/stock.py +++ b/modules/stock_shipment_measurements/stock.py @@ -136,12 +136,12 @@ class Move(metaclass=PoolMeta): def compute_fields(self, field_names=None): cls = self.__class__ values = super().compute_fields(field_names=field_names) - if (not field_names + if (field_names is None or (cls.internal_weight.on_change_with & field_names)): internal_weight = self.on_change_with_internal_weight() if self.internal_weight != internal_weight: values['internal_weight'] = internal_weight - if (not field_names + if (field_names is None or (cls.internal_volume.on_change_with & field_names)): internal_volume = self.on_change_with_internal_volume() if getattr(self, 'internal_volume', None) != internal_volume: diff --git a/trytond/trytond/ir/email_.py b/trytond/trytond/ir/email_.py index d93e120eef..607d0be4e3 100644 --- a/trytond/trytond/ir/email_.py +++ b/trytond/trytond/ir/email_.py @@ -566,7 +566,7 @@ class EmailTemplate(ModelSQL, ModelView): @classmethod def on_modification(cls, mode, records, field_names=None): super().on_modification(mode, records, field_names=field_names) - if not field_names or {'name', 'model'} & set(field_names): + if field_names is None or {'name', 'model'} & set(field_names): ModelView._view_toolbar_get_cache.clear() diff --git a/trytond/trytond/tests/modelstorage.py b/trytond/trytond/tests/modelstorage.py index ea1ccca450..43af27e39d 100644 --- a/trytond/trytond/tests/modelstorage.py +++ b/trytond/trytond/tests/modelstorage.py @@ -192,7 +192,7 @@ class ModelStorageComputeFields(ModelSQL): def compute_fields(self, field_names=None): values = super().compute_fields(field_names=field_names) - if not field_names or 'value' in field_names: + if field_names is None or 'value' in field_names: values['computed_value'] = self.value + 1 return values