Files

52 lines
1.4 KiB
Python

from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from typing import Annotated
from pydantic import BaseModel, ConfigDict, Field, StrictInt, model_validator
from app.models.order import OrderStatusEnum
class OrderCreateItem(BaseModel):
model_config = ConfigDict(extra="forbid")
product_id: Annotated[StrictInt, Field(gt=0)]
quantity: Annotated[StrictInt, Field(gt=0, le=1000)]
class OrderCreate(BaseModel):
model_config = ConfigDict(extra="forbid")
items: Annotated[list[OrderCreateItem], Field(min_length=1, max_length=100)]
@model_validator(mode="after")
def validate_unique_products(self) -> "OrderCreate":
product_ids = [item.product_id for item in self.items]
if len(product_ids) != len(set(product_ids)):
raise ValueError("Each product may only appear once per order")
return self
class OrderItemResponse(BaseModel):
model_config = ConfigDict(from_attributes=True, extra="forbid")
id: int
product_id: int
product_name: str
quantity: int
unit_price: Decimal
subtotal: Decimal
class OrderResponse(BaseModel):
model_config = ConfigDict(from_attributes=True, extra="forbid")
id: int
status: OrderStatusEnum
total_amount: Decimal
created_at: datetime
paid_at: datetime | None
items: list[OrderItemResponse]