From 3d4a7c842183c59ae231e304e316b048c8e3ffe2 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 11 Sep 2026 15:45:46 +0200 Subject: [PATCH] release: v2.8.4 fix order export safety config --- MDfile/RELEASE_NOTES_v2.8.4.md | 13 +++++++ VERSION | 2 +- app/modules/orders/backend/economic_export.py | 13 +++++-- tests/test_order_economic_safety_config.py | 35 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 MDfile/RELEASE_NOTES_v2.8.4.md create mode 100644 tests/test_order_economic_safety_config.py diff --git a/MDfile/RELEASE_NOTES_v2.8.4.md b/MDfile/RELEASE_NOTES_v2.8.4.md new file mode 100644 index 0000000..f53cc23 --- /dev/null +++ b/MDfile/RELEASE_NOTES_v2.8.4.md @@ -0,0 +1,13 @@ +# BMC Hub v2.8.4 + +## e-conomic ordreeksport + +- Ordremodulet arver nu de globale `ECONOMIC_READ_ONLY` og `ECONOMIC_DRY_RUN`, når de valgfrie `ORDRE_ECONOMIC_*`-indstillinger ikke er defineret. +- Eksplicitte ordreindstillinger har fortsat førsteprioritet. +- Sikker standard bevares: uden eksplicit konfiguration er eksport stadig read-only/dry-run. + +## Verifikation + +- Regressionstest for både global fallback og eksplicit ordreoverride består. +- Relevante faktura- og internettests består. +- Python-syntaks og diff-kontrol består. diff --git a/VERSION b/VERSION index 9f8d8a9..2701a22 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.8.3 +2.8.4 diff --git a/app/modules/orders/backend/economic_export.py b/app/modules/orders/backend/economic_export.py index 912cad7..75fc438 100644 --- a/app/modules/orders/backend/economic_export.py +++ b/app/modules/orders/backend/economic_export.py @@ -20,8 +20,17 @@ class OrdreEconomicExportService: self.app_secret_token = settings.ECONOMIC_APP_SECRET_TOKEN self.agreement_grant_token = settings.ECONOMIC_AGREEMENT_GRANT_TOKEN - self.read_only = settings.ORDRE_ECONOMIC_READ_ONLY - self.dry_run = settings.ORDRE_ECONOMIC_DRY_RUN + configured_fields = getattr(settings, "model_fields_set", set()) + self.read_only = ( + settings.ORDRE_ECONOMIC_READ_ONLY + if "ORDRE_ECONOMIC_READ_ONLY" in configured_fields + else settings.ECONOMIC_READ_ONLY + ) + self.dry_run = ( + settings.ORDRE_ECONOMIC_DRY_RUN + if "ORDRE_ECONOMIC_DRY_RUN" in configured_fields + else settings.ECONOMIC_DRY_RUN + ) self.default_layout = settings.ORDRE_ECONOMIC_LAYOUT self.default_product = settings.ORDRE_ECONOMIC_PRODUCT diff --git a/tests/test_order_economic_safety_config.py b/tests/test_order_economic_safety_config.py new file mode 100644 index 0000000..36fdf73 --- /dev/null +++ b/tests/test_order_economic_safety_config.py @@ -0,0 +1,35 @@ +def test_order_export_inherits_global_safety_flags_when_order_flags_are_unset(monkeypatch): + from app.modules.orders.backend import economic_export + + settings = economic_export.settings + monkeypatch.setattr(settings, "ECONOMIC_READ_ONLY", False) + monkeypatch.setattr(settings, "ECONOMIC_DRY_RUN", False) + monkeypatch.setattr(settings, "ORDRE_ECONOMIC_READ_ONLY", True) + monkeypatch.setattr(settings, "ORDRE_ECONOMIC_DRY_RUN", True) + fields_set = set(settings.model_fields_set) + fields_set.discard("ORDRE_ECONOMIC_READ_ONLY") + fields_set.discard("ORDRE_ECONOMIC_DRY_RUN") + monkeypatch.setattr(settings, "__pydantic_fields_set__", fields_set) + + service = economic_export.OrdreEconomicExportService() + + assert service.read_only is False + assert service.dry_run is False + + +def test_order_export_respects_explicit_order_safety_flags(monkeypatch): + from app.modules.orders.backend import economic_export + + settings = economic_export.settings + monkeypatch.setattr(settings, "ECONOMIC_READ_ONLY", False) + monkeypatch.setattr(settings, "ECONOMIC_DRY_RUN", False) + monkeypatch.setattr(settings, "ORDRE_ECONOMIC_READ_ONLY", True) + monkeypatch.setattr(settings, "ORDRE_ECONOMIC_DRY_RUN", True) + fields_set = set(settings.model_fields_set) + fields_set.update({"ORDRE_ECONOMIC_READ_ONLY", "ORDRE_ECONOMIC_DRY_RUN"}) + monkeypatch.setattr(settings, "__pydantic_fields_set__", fields_set) + + service = economic_export.OrdreEconomicExportService() + + assert service.read_only is True + assert service.dry_run is True