From a58496488b8e988bd6af062fce209f41529c9e03 Mon Sep 17 00:00:00 2001 From: Thibault Coudray Date: Tue, 3 Sep 2024 13:50:33 +0200 Subject: [PATCH] (PC-31395)[API] feat: add `idAtProvider` in `PriceCategory` Add unique index on `PriceCategory` couple value (`idAtProvider`, `offerId`). This index will be transformed into a unique constraint in a later migration --- api/alembic_version_conflict_detection.txt | 4 +-- ...d7d6_add_idatprovider_in_price_category.py | 21 ++++++++++++ ...ue_index_on_price_category_idatprovider.py | 34 +++++++++++++++++++ api/src/pcapi/core/offers/models.py | 5 +++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 api/src/pcapi/alembic/versions/20240903T113527_8523f3e2d7d6_add_idatprovider_in_price_category.py create mode 100644 api/src/pcapi/alembic/versions/20240903T114208_404b3075d1a4_add_unique_index_on_price_category_idatprovider.py diff --git a/api/alembic_version_conflict_detection.txt b/api/alembic_version_conflict_detection.txt index 88b47edc82b..ce0e56384d0 100644 --- a/api/alembic_version_conflict_detection.txt +++ b/api/alembic_version_conflict_detection.txt @@ -1,2 +1,2 @@ -869f0d3be788 (pre) (head) -63fa42fd8352 (post) (head) +8523f3e2d7d6 (pre) (head) +404b3075d1a4 (post) (head) diff --git a/api/src/pcapi/alembic/versions/20240903T113527_8523f3e2d7d6_add_idatprovider_in_price_category.py b/api/src/pcapi/alembic/versions/20240903T113527_8523f3e2d7d6_add_idatprovider_in_price_category.py new file mode 100644 index 00000000000..242e4ddb0b8 --- /dev/null +++ b/api/src/pcapi/alembic/versions/20240903T113527_8523f3e2d7d6_add_idatprovider_in_price_category.py @@ -0,0 +1,21 @@ +"""Add idAtProvider in `price_category` +""" + +from alembic import op +import sqlalchemy as sa + + +# pre/post deployment: pre +# revision identifiers, used by Alembic. +revision = "8523f3e2d7d6" +down_revision = "869f0d3be788" +branch_labels: tuple[str] | None = None +depends_on: list[str] | None = None + + +def upgrade() -> None: + op.add_column("price_category", sa.Column("idAtProvider", sa.Text(), nullable=True)) + + +def downgrade() -> None: + op.drop_column("price_category", "idAtProvider") diff --git a/api/src/pcapi/alembic/versions/20240903T114208_404b3075d1a4_add_unique_index_on_price_category_idatprovider.py b/api/src/pcapi/alembic/versions/20240903T114208_404b3075d1a4_add_unique_index_on_price_category_idatprovider.py new file mode 100644 index 00000000000..c1ce9d17b60 --- /dev/null +++ b/api/src/pcapi/alembic/versions/20240903T114208_404b3075d1a4_add_unique_index_on_price_category_idatprovider.py @@ -0,0 +1,34 @@ +"""Add unique index on (`idAProvider`, `offerId`) in `price_category` table +""" + +from alembic import op + + +# pre/post deployment: post +# revision identifiers, used by Alembic. +revision = "404b3075d1a4" +down_revision = "63fa42fd8352" +branch_labels: tuple[str] | None = None +depends_on: list[str] | None = None + + +def upgrade() -> None: + with op.get_context().autocommit_block(): + op.create_index( + "unique_ix_offer_id_id_at_provider", + "price_category", + ["offerId", "idAtProvider"], + unique=True, + postgresql_concurrently=True, + if_not_exists=True, + ) + + +def downgrade() -> None: + with op.get_context().autocommit_block(): + op.drop_index( + "unique_ix_offer_id_id_at_provider", + table_name="price_category", + postgresql_concurrently=True, + if_exists=True, + ) diff --git a/api/src/pcapi/core/offers/models.py b/api/src/pcapi/core/offers/models.py index 431dc4645ab..f51f54af573 100644 --- a/api/src/pcapi/core/offers/models.py +++ b/api/src/pcapi/core/offers/models.py @@ -1243,6 +1243,11 @@ class PriceCategory(PcObject, Base, Model): "PriceCategoryLabel", back_populates="priceCategory" ) stocks: sa_orm.Mapped[list["Stock"]] = relationship("Stock", back_populates="priceCategory", cascade="all") + idAtProvider = sa.Column(sa.Text, nullable=True) + + # First step : Create a unique index on offerId/idAtProvider + # Next step : (TO DO) Create a unique constraint based on this index + sa.Index("unique_ix_offer_id_id_at_provider", offerId, idAtProvider, unique=True) @property def label(self) -> str: