Skip to content

Commit

Permalink
(PC-33865)[API] chore: add atomic to POST offer price categories route
Browse files Browse the repository at this point in the history
  • Loading branch information
pcharlet-pass committed Feb 7, 2025
1 parent 5c3e75a commit c206562
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 30 deletions.
17 changes: 10 additions & 7 deletions api/src/pcapi/core/offers/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1030,11 +1030,14 @@ def edit_stock(
if "beginningDatetime" in modifications:
finance_api.update_finance_event_pricing_date(stock)

repository.add_to_session(stock)
search.async_index_offer_ids(
[stock.offerId],
reason=search.IndexationReason.STOCK_UPDATE,
log_extra={"changes": set(modifications.keys())},
db.session.add(stock)
on_commit(
partial(
search.async_index_offer_ids,
[stock.offerId],
reason=search.IndexationReason.STOCK_UPDATE,
log_extra={"changes": set(modifications.keys())},
),
)

log_extra_data: dict[str, typing.Any] = {
Expand Down Expand Up @@ -1818,7 +1821,7 @@ def create_price_category(
created_price_category = models.PriceCategory(
offer=offer, price=price, priceCategoryLabel=price_category_label, idAtProvider=id_at_provider
)
repository.add_to_session(created_price_category)
db.session.add(created_price_category)
return created_price_category


Expand Down Expand Up @@ -1848,7 +1851,7 @@ def edit_price_category(
)
price_category.idAtProvider = id_at_provider

repository.add_to_session(price_category)
db.session.add(price_category)

stocks_to_edit = [stock for stock in offer.stocks if stock.priceCategoryId == price_category.id]
for stock in stocks_to_edit:
Expand Down
45 changes: 22 additions & 23 deletions api/src/pcapi/routes/pro/offers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from sqlalchemy.orm import load_only
import sqlalchemy.orm.exc as sa_exceptions

from pcapi import repository
from pcapi.core.categories import categories
from pcapi.core.categories import subcategories_v2 as subcategories
from pcapi.core.categories.categories import TITELIVE_MUSIC_TYPES
Expand Down Expand Up @@ -584,6 +583,7 @@ def _get_offer_for_price_categories_upsert(
response_model=offers_serialize.GetIndividualOfferResponseModel,
api=blueprint.pro_private_schema,
)
@atomic()
def post_price_categories(
offer_id: int, body: offers_serialize.PriceCategoryBody
) -> offers_serialize.GetIndividualOfferResponseModel:
Expand All @@ -608,28 +608,27 @@ def post_price_categories(

existing_price_categories_by_id = {category.id: category for category in offer.priceCategories}

with repository.transaction():
for price_category_to_create in price_categories_to_create:
offers_api.create_price_category(offer, price_category_to_create.label, price_category_to_create.price)

for price_category_to_edit in price_categories_to_edit:
if price_category_to_edit.id not in existing_price_categories_by_id:
raise api_errors.ApiErrors(
{"price_category_id": ["Le tarif avec l'id %s n'existe pas" % price_category_to_edit.id]},
status_code=400,
)
data = price_category_to_edit.dict(exclude_unset=True)
try:
offers_api.edit_price_category(
offer,
price_category=existing_price_categories_by_id[data["id"]],
label=data.get("label", offers_api.UNCHANGED),
price=data.get("price", offers_api.UNCHANGED),
)
except exceptions.RejectedOrPendingOfferNotEditable:
raise api_errors.ApiErrors(
{"offer": ["Offer is not editable (because rejected or pending)"]}, status_code=400
)
for price_category_to_create in price_categories_to_create:
offers_api.create_price_category(offer, price_category_to_create.label, price_category_to_create.price)

for price_category_to_edit in price_categories_to_edit:
if price_category_to_edit.id not in existing_price_categories_by_id:
raise api_errors.ApiErrors(
{"price_category_id": ["Le tarif avec l'id %s n'existe pas" % price_category_to_edit.id]},
status_code=400,
)
data = price_category_to_edit.dict(exclude_unset=True)
try:
offers_api.edit_price_category(
offer,
price_category=existing_price_categories_by_id[data["id"]],
label=data.get("label", offers_api.UNCHANGED),
price=data.get("price", offers_api.UNCHANGED),
)
except exceptions.RejectedOrPendingOfferNotEditable:
raise api_errors.ApiErrors(
{"offer": ["Offer is not editable (because rejected or pending)"]}, status_code=400
)

return offers_serialize.GetIndividualOfferResponseModel.from_orm(offer)

Expand Down

0 comments on commit c206562

Please sign in to comment.