
- Create base model with timestamp mixin - Add user model with roles - Add restaurant model - Add menu item model with categories - Add order and order item models - Add delivery model - Fix import issues and linting errors
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
from enum import Enum
|
|
|
|
from sqlalchemy import Column, DateTime, Enum as SQLEnum, Float, ForeignKey, Integer, String, Text
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from app.models.base import BaseModel, TimestampMixin
|
|
|
|
|
|
class OrderStatus(str, Enum):
|
|
"""Enum for order statuses."""
|
|
|
|
PENDING = "pending"
|
|
CONFIRMED = "confirmed"
|
|
PREPARING = "preparing"
|
|
READY_FOR_PICKUP = "ready_for_pickup"
|
|
OUT_FOR_DELIVERY = "out_for_delivery"
|
|
DELIVERED = "delivered"
|
|
CANCELLED = "cancelled"
|
|
|
|
|
|
class PaymentMethod(str, Enum):
|
|
"""Enum for payment methods."""
|
|
|
|
CREDIT_CARD = "credit_card"
|
|
DEBIT_CARD = "debit_card"
|
|
CASH = "cash"
|
|
DIGITAL_WALLET = "digital_wallet"
|
|
|
|
|
|
class PaymentStatus(str, Enum):
|
|
"""Enum for payment statuses."""
|
|
|
|
PENDING = "pending"
|
|
PAID = "paid"
|
|
FAILED = "failed"
|
|
REFUNDED = "refunded"
|
|
|
|
|
|
class Order(BaseModel, TimestampMixin):
|
|
"""Order model."""
|
|
|
|
customer_id = Column(Integer, ForeignKey("user.id"), nullable=False)
|
|
restaurant_id = Column(Integer, ForeignKey("restaurant.id"), nullable=False)
|
|
delivery_id = Column(Integer, ForeignKey("delivery.id"), nullable=True)
|
|
status = Column(SQLEnum(OrderStatus), default=OrderStatus.PENDING, nullable=False)
|
|
total_amount = Column(Float, nullable=False)
|
|
delivery_address = Column(String, nullable=False)
|
|
delivery_notes = Column(Text, nullable=True)
|
|
payment_method = Column(SQLEnum(PaymentMethod), nullable=False)
|
|
payment_status = Column(SQLEnum(PaymentStatus), default=PaymentStatus.PENDING, nullable=False)
|
|
estimated_delivery_time = Column(DateTime, nullable=True)
|
|
actual_delivery_time = Column(DateTime, nullable=True)
|
|
|
|
# Relationships
|
|
customer = relationship("User", foreign_keys=[customer_id], backref="orders")
|
|
restaurant = relationship("Restaurant", backref="orders")
|
|
delivery = relationship("Delivery", back_populates="order")
|
|
order_items = relationship("OrderItem", back_populates="order", cascade="all, delete-orphan")
|
|
|
|
def __repr__(self) -> str:
|
|
return f"<Order {self.id}>"
|
|
|
|
|
|
class OrderItem(BaseModel, TimestampMixin):
|
|
"""Order item model."""
|
|
|
|
order_id = Column(Integer, ForeignKey("order.id"), nullable=False)
|
|
menu_item_id = Column(Integer, ForeignKey("menuitem.id"), nullable=False)
|
|
quantity = Column(Integer, nullable=False)
|
|
unit_price = Column(Float, nullable=False)
|
|
special_instructions = Column(Text, nullable=True)
|
|
|
|
# Relationships
|
|
order = relationship("Order", back_populates="order_items")
|
|
menu_item = relationship("MenuItem", back_populates="order_items")
|
|
|
|
def __repr__(self) -> str:
|
|
return f"<OrderItem {self.id}>" |