Add shopping cart and related models
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user