From 88623de45d07a70327711cdd4e4b98e26a95541f Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Tue, 3 Sep 2024 17:06:43 +0200 Subject: [PATCH] (PC-31638)[PRO] fix: soften rules to edit legacy offers As of today, all offers do not have their OffererAddress. In order for the users to modify older offers, we need to let them update physical offers that do not have OffererAddress associated. --- api/src/pcapi/core/offers/validation.py | 3 ++- .../individual_offers/v1/post_product_test.py | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/api/src/pcapi/core/offers/validation.py b/api/src/pcapi/core/offers/validation.py index f1fe0a3336d..6d85607a696 100644 --- a/api/src/pcapi/core/offers/validation.py +++ b/api/src/pcapi/core/offers/validation.py @@ -24,6 +24,7 @@ from pcapi.domain import music_types from pcapi.domain import show_types from pcapi.models import api_errors +from pcapi.models.feature import FeatureToggle from pcapi.models.offer_mixin import OfferValidationStatus from pcapi.routes.public.books_stocks import serialization from pcapi.utils import date @@ -404,7 +405,7 @@ def check_digital_offer_fields(offer: models.Offer) -> None: if offer.subcategory.is_online_only: errors.add_error("url", f'Une offre de catégorie {offer.subcategory.id} doit contenir un champ "url"') - if offer.offererAddress is None: + if offer.offererAddress is None and FeatureToggle.WIP_ENABLE_OFFER_ADDRESS.is_active(): errors.add_error("offererAddress", "Une offre physique doit avoir une adresse") if errors.errors: diff --git a/api/tests/routes/public/individual_offers/v1/post_product_test.py b/api/tests/routes/public/individual_offers/v1/post_product_test.py index dc0dc859f29..8af84f8cddd 100644 --- a/api/tests/routes/public/individual_offers/v1/post_product_test.py +++ b/api/tests/routes/public/individual_offers/v1/post_product_test.py @@ -11,6 +11,7 @@ from pcapi.core.offerers import factories as offerers_factories from pcapi.core.offers import factories as offers_factories from pcapi.core.offers import models as offers_models +from pcapi.core.testing import override_features from pcapi.models import offer_mixin from pcapi.utils import date as date_utils from pcapi.utils import human_ids @@ -24,6 +25,7 @@ class PostProductTest(PublicAPIVenueEndpointHelper): endpoint_url = "/public/offers/v1/products" + endpoint_method = "post" @staticmethod def _get_base_payload(venue_id: int) -> dict: @@ -384,6 +386,7 @@ def test_extra_data_deserialization(self, client): } @pytest.mark.usefixtures("db_session") + @override_features(WIP_ENABLE_OFFER_ADDRESS=True) def test_physical_product_attached_to_digital_venue(self, client): venue, _ = utils.create_offerer_provider_linked_to_venue(is_virtual=True) @@ -407,6 +410,26 @@ def test_physical_product_attached_to_digital_venue(self, client): } assert offers_models.Offer.query.first() is None + @pytest.mark.usefixtures("db_session") + @override_features(WIP_ENABLE_OFFER_ADDRESS=False) + def test_physical_product_without_offerer_address_legacy(self, client): + venue, _ = utils.create_offerer_provider_linked_to_venue(is_virtual=False) + + response = client.with_explicit_token(offerers_factories.DEFAULT_CLEAR_API_KEY).post( + "/public/offers/v1/products", + json={ + "location": {"type": "physical", "venueId": venue.id}, + "categoryRelatedFields": { + "category": "SUPPORT_PHYSIQUE_FILM", + "ean": "1234567891234", + }, + "accessibility": utils.ACCESSIBILITY_FIELDS, + "name": "Le champ des possibles", + }, + ) + + assert response.status_code == 200 + @pytest.mark.usefixtures("db_session") def test_event_category_not_accepted(self, client): venue, _ = utils.create_offerer_provider_linked_to_venue()