from enum import StrEnum from typing import TYPE_CHECKING from sqlalchemy import INTEGER, Enum, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from db.base import Base if TYPE_CHECKING: from db.models import User class OrderStatus(StrEnum): PENDING = "pending" PAID = "paid" DISCARDED = "discarded" class OrderAddon(Base): __tablename__ = "order_addons" id: Mapped[int] = mapped_column( INTEGER, nullable=False, unique=True, autoincrement=True, primary_key=True ) order_id: Mapped[int] = mapped_column(ForeignKey("orders.id"), nullable=False) addon_id: Mapped[str] = mapped_column(ForeignKey("addons.id"), nullable=False) order: Mapped["Order"] = relationship("Order", back_populates="addons", lazy="selectin") class Order(Base): __tablename__ = "orders" id: Mapped[int] = mapped_column( INTEGER, nullable=False, autoincrement=True, unique=True, primary_key=True ) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False) devices: Mapped[int] = mapped_column(INTEGER, nullable=False) duration_days: Mapped[int] = mapped_column(INTEGER, nullable=False) status: Mapped[OrderStatus] = mapped_column( Enum(OrderStatus, name="orderstatus"), nullable=False, default=OrderStatus.PENDING ) user: Mapped["User"] = relationship("User", back_populates="orders", lazy="selectin") addons: Mapped[list["OrderAddon"]] = relationship( "OrderAddon", back_populates="order", lazy="selectin" )