Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(PC-32571)[API] chore: filter product extra data to copy in offer #14689

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
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
23 changes: 21 additions & 2 deletions api/src/pcapi/core/offers/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,22 @@ class StocksStats:
remaining_quantity: int | None


def _filter_unwanted(extra_data: typing.Any) -> models.OfferExtraData:
# Offers linked to a product should use product extraData.
# The remaining informations are denormalized to improvde performance
whitelist_extra_data = {
"visa",
"allocine_id",
"ean",
"gtl_id",
"musicType",
"musicSubType",
"showType",
"showSubtypes",
}
return models.OfferExtraData(**{key: value for key, value in extra_data.items() if key in whitelist_extra_data})


def build_new_offer_from_product(
venue: offerers_models.Venue,
product: models.Product,
Expand All @@ -122,7 +138,7 @@ def build_new_offer_from_product(
) -> models.Offer:
return models.Offer(
bookingEmail=venue.bookingEmail,
extraData=product.extraData,
extraData=_filter_unwanted(product.extraData),
idAtProvider=id_at_provider,
lastProviderId=provider_id,
name=product.name,
Expand Down Expand Up @@ -221,7 +237,10 @@ def create_draft_offer(
if feature.FeatureToggle.WIP_SUGGESTED_SUBCATEGORIES.is_active():
venue = _get_coherent_venue_with_subcategory(venue, body.subcategory_id)

body.extra_data = _format_extra_data(body.subcategory_id, body.extra_data) or {}
if product:
body.extra_data = _filter_unwanted(product.extraData)
else:
body.extra_data = _format_extra_data(body.subcategory_id, body.extra_data) or {}
validation.check_offer_extra_data(body.subcategory_id, body.extra_data, venue, is_from_private_api)

if feature.FeatureToggle.WIP_EAN_CREATION.is_active():
Expand Down
9 changes: 2 additions & 7 deletions api/src/pcapi/local_providers/allocine/allocine_stocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,11 @@ def fill_object_attributes(self, pc_object: Model) -> None:

def update_from_movie_information(self, offer: offers_models.Offer) -> None:
offer.name = self.product.name
offer.extraData = offer.extraData or offers_models.OfferExtraData()
offer.durationMinutes = self.product.durationMinutes
offer.product = self.product
offer.extraData = offers_models.OfferExtraData()
if self.product.extraData:
offer.extraData.update(self.product.extraData)

offer.extraData["theater"] = {
"allocine_movie_id": self.movie.internalId,
"allocine_room_id": self.room_internal_id,
}
offer.extraData = offers_api._filter_unwanted(self.product.extraData)

def fill_offer_attributes(self, offer: offers_models.Offer) -> None:
offer.venueId = self.venue.id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,18 +86,20 @@ def fill_object_attributes(self, pc_object: Model) -> None:
def update_from_movie_information(
self, offer: offers_models.Offer, movie_information: boost_serializers.Film2
) -> None:
offer.extraData = offer.extraData or offers_models.OfferExtraData()
offer.extraData = offers_models.OfferExtraData()
if self.product:
offer.name = self.product.name
offer.durationMinutes = self.product.durationMinutes
if self.product.extraData:
offer.extraData.update(self.product.extraData)
offer.extraData = offers_api._filter_unwanted(self.product.extraData)
else:
offer.name = self.showtime_details.film.titleCnc
if movie_information.duration:
offer.durationMinutes = movie_information.duration

# CHECK if used somewhere. If not we can delete following lines
offer.extraData["allocineId"] = offer.extraData.get("allocineId") or movie_information.idFilmAllocine
# Also, there is an index on visa but maybe unused
if movie_information.numVisa != 0:
offer.extraData["visa"] = offer.extraData.get("visa") or str(movie_information.numVisa)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,19 +118,20 @@ def fill_object_attributes(self, pc_object: Model) -> None:
self.fill_stock_attributes(pc_object)

def update_from_movie_information(self, offer: offers_models.Offer) -> None:
offer.extraData = offer.extraData or offers_models.OfferExtraData()
offer.extraData = offers_models.OfferExtraData()
if self.product:
offer.name = self.product.name
offer.durationMinutes = self.product.durationMinutes
if self.product.extraData:
offer.extraData.update(self.product.extraData)
offer.extraData = offers_api._filter_unwanted(self.product.extraData)
else:
offer.name = self.movie_information.title
if self.movie_information.storyline:
offer.description = self.movie_information.storyline
if self.movie_information.duration:
offer.durationMinutes = self.movie_information.duration

# CHECK if necessary to keep following
if self.movie_information.allocineid:
offer.extraData["allocineId"] = offer.extraData.get("allocineId") or int(self.movie_information.allocineid)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,19 @@ def fill_object_attributes(self, pc_object: Model) -> None:
self.fill_stock_attributes(pc_object)

def update_from_movie_information(self, offer: offers_models.Offer) -> None:
offer.extraData = offer.extraData or offers_models.OfferExtraData()
offer.extraData = offers_models.OfferExtraData()
if self.product:
offer.name = self.product.name
offer.description = self.product.description
offer.durationMinutes = self.product.durationMinutes
if self.product.extraData:
offer.extraData.update(self.product.extraData)
offer.extraData = offers_api._filter_unwanted(self.product.extraData)
else:
offer.name = self.film_infos.Titre
offer.description = self.film_infos.Synopsis
offer.durationMinutes = self.film_infos.Duree

# CHECK if necessary to keep
offer.extraData["allocineId"] = offer.extraData.get("allocineId") or self.film_infos.IDFilmAlloCine
if self.film_infos.NumVisa:
offer.extraData["visa"] = offer.extraData.get("visa") or str(self.film_infos.NumVisa)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,14 +164,13 @@ def fill_offer_attributes(self, offer: offers_models.Offer, event: ems_serialize
if event.duration:
offer.durationMinutes = event.duration
offer.isDuo = self.is_duo

offer.extraData = {}
if offer.product:
offer.name = offer.product.name
offer.description = offer.product.description
offer.durationMinutes = offer.product.durationMinutes
if offer.product.extraData:
offer.extraData = offer.extraData or offers_models.OfferExtraData()
offer.extraData.update(offer.product.extraData)
offer.extraData = offers_api._filter_unwanted(offer.product.extraData)

return offer

Expand Down
3 changes: 2 additions & 1 deletion api/tests/routes/pro/post_draft_offer_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ def test_created_offer_from_product_should_return_product_id(self, client):
offerer = venue.managingOfferer
offerers_factories.UserOffererFactory(offerer=offerer, user__email="user@example.com")
product = offers_factories.ProductFactory(
subcategoryId=subcategories.LIVRE_PAPIER.id, extraData=dict({"ean": "9782123456803"})
subcategoryId=subcategories.LIVRE_PAPIER.id,
extraData=dict({"ean": "9782123456803", "20 years anniversary box": True}),
)

data = {
Expand Down
Loading