byceps/byceps

View on GitHub
byceps/services/shop/order/dbmodels/order_action.py

Summary

Maintainability
A
0 mins
Test Coverage
A
96%
"""
byceps.services.shop.order.dbmodels.order_action
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from typing import TYPE_CHECKING
from uuid import UUID

from sqlalchemy.orm import Mapped, mapped_column, relationship


if TYPE_CHECKING:
    hybrid_property = property
else:
    from sqlalchemy.ext.hybrid import hybrid_property

from byceps.database import db
from byceps.services.shop.article.dbmodels.article import DbArticle
from byceps.services.shop.article.models import ArticleID
from byceps.services.shop.order.models.action import ActionParameters
from byceps.services.shop.order.models.order import PaymentState
from byceps.util.uuid import generate_uuid4


class DbOrderAction(db.Model):
    """A procedure to execute when an order for that article is marked
    as paid.
    """

    __tablename__ = 'shop_order_actions'

    id: Mapped[UUID] = mapped_column(
        db.Uuid, default=generate_uuid4, primary_key=True
    )
    article_id: Mapped[ArticleID] = mapped_column(
        db.Uuid, db.ForeignKey('shop_articles.id'), index=True
    )
    article: Mapped[DbArticle] = relationship(
        DbArticle, backref='order_actions'
    )
    _payment_state: Mapped[str] = mapped_column(
        'payment_state', db.UnicodeText, index=True
    )
    procedure: Mapped[str] = mapped_column(db.UnicodeText)
    parameters: Mapped[ActionParameters] = mapped_column(db.JSONB)

    def __init__(
        self,
        article_id: ArticleID,
        payment_state: PaymentState,
        procedure: str,
        parameters: ActionParameters,
    ) -> None:
        self.article_id = article_id
        self.payment_state = payment_state
        self.procedure = procedure
        self.parameters = parameters

    @hybrid_property
    def payment_state(self) -> PaymentState:
        return PaymentState[self._payment_state]

    @payment_state.setter
    def payment_state(self, state: PaymentState) -> None:
        self._payment_state = state.name