108 lines
2.5 KiB
Python

import json
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field, validator
from app.models.order import OrderStatus, ShippingMethod
class AddressSchema(BaseModel):
first_name: str
last_name: str
address_line1: str
address_line2: str | None = None
city: str
state: str
postal_code: str
country: str
phone_number: str | None = None
email: str | None = None
class OrderItemBase(BaseModel):
product_id: str
quantity: int = Field(..., gt=0)
unit_price: float
product_options: dict[str, Any] | None = None
class OrderItemCreate(OrderItemBase):
pass
class OrderItemInDB(OrderItemBase):
id: str
order_id: str
subtotal: float
discount: float = 0.0
tax_amount: float = 0.0
product_name: str
product_sku: str | None = None
created_at: datetime
class Config:
orm_mode = True
@validator('product_options', pre=True)
def parse_product_options(cls, v):
if isinstance(v, str):
try:
return json.loads(v)
except:
return None
return v
class OrderBase(BaseModel):
shipping_method: ShippingMethod
shipping_address: AddressSchema
billing_address: AddressSchema | None = None
notes: str | None = None
class OrderCreate(OrderBase):
cart_items: list[str] = [] # List of cart item IDs
coupon_code: str | None = None
use_default_addresses: bool = False
class OrderUpdate(BaseModel):
status: OrderStatus | None = None
tracking_number: str | None = None
notes: str | None = None
class OrderInDBBase(OrderBase):
id: str
user_id: str
order_number: str
status: OrderStatus
total_amount: float
subtotal: float
tax_amount: float
shipping_amount: float
discount_amount: float = 0.0
tracking_number: str | None = None
created_at: datetime
updated_at: datetime | None = None
class Config:
orm_mode = True
@validator('shipping_address', 'billing_address', pre=True)
def parse_address(cls, v):
if isinstance(v, str):
try:
return json.loads(v)
except:
return {}
return v
class Order(OrderInDBBase):
items: list[OrderItemInDB] = []
class OrderSummary(BaseModel):
id: str
order_number: str
status: OrderStatus
total_amount: float
created_at: datetime
item_count: int
class Config:
orm_mode = True