Automated Action 5570e6e49e Add database models for food delivery API
- 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
2025-05-31 03:41:37 +00:00

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}>"