Add shopping cart and related models

This commit is contained in:
2025-11-11 12:08:06 +01:00
parent b3166811e5
commit f4618f4d05
8 changed files with 148 additions and 41 deletions

View File

@@ -2,8 +2,15 @@ import datetime
import decimal
import typing
from sqlalchemy import Column, ForeignKey, Numeric, Table
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from sqlalchemy import Column, ForeignKey, Numeric, Table, select
from sqlalchemy.exc import NoResultFound
from sqlalchemy.orm import (
DeclarativeBase,
Mapped,
mapped_column,
object_session,
relationship,
)
TABLE_PREFIX = "aps_"
@@ -46,6 +53,20 @@ class User(Base):
accounts: Mapped[list["Account"]] = relationship(
"Account", secondary=user_account_association, back_populates="users"
)
orders: Mapped[list["Order"]] = relationship("Order", back_populates="user")
@property
def shopping_cart(self):
for order in self.orders:
if order.account_id is None:
cart = order
break
else:
cart = Order(user=self)
session = object_session(self)
session.add(cart)
return cart
class Area(Base):
@@ -81,6 +102,40 @@ class Product(Base):
image_path: Mapped[str] = mapped_column(nullable=True)
class Order(Base):
__tablename__ = TABLE_PREFIX + "order"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(ForeignKey(TABLE_PREFIX + "user.id"))
user: Mapped[User] = relationship("User", back_populates="orders")
account_id: Mapped[int] = mapped_column(
ForeignKey(TABLE_PREFIX + "account.id"), nullable=True
)
account: Mapped[Account | None] = relationship("Account")
items: Mapped[list["OrderItem"]] = relationship(
"OrderItem", cascade="all, delete-orphan", back_populates="order"
)
@property
def is_in_shopping_cart(self):
return self.account is None
class OrderItem(Base):
__tablename__ = TABLE_PREFIX + "order_item"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
order_id: Mapped[int] = mapped_column(ForeignKey(TABLE_PREFIX + "order.id"))
order: Mapped[Order] = relationship("Order", back_populates="items")
product_id: Mapped[int] = mapped_column(ForeignKey(TABLE_PREFIX + "product.id"))
product: Mapped[Product] = relationship("Product")
quantity: Mapped[int] = mapped_column(nullable=False)
total_amount: Mapped[decimal.Decimal] = mapped_column(
Numeric(10, 2), nullable=False
)
TransactionTypes = typing.Literal[
"product",
"deposit",