109 lines
2.5 KiB
Python
109 lines
2.5 KiB
Python
from pydantic import BaseModel, Field, EmailStr, field_validator, validator, ConfigDict
|
|
from typing import List, Optional
|
|
from datetime import datetime
|
|
from bson import ObjectId
|
|
|
|
|
|
def validate_object_id(value: str) -> ObjectId:
|
|
if not ObjectId.is_valid(value):
|
|
raise ValueError("Invalid ObjectId")
|
|
return ObjectId(value)
|
|
|
|
|
|
class MongoBaseModel(BaseModel):
|
|
id: Optional[str] = Field(
|
|
default_factory=lambda: str(ObjectId()), alias="_id")
|
|
|
|
model_config = ConfigDict(
|
|
populate_by_name=True,
|
|
arbitrary_types_allowed=True,
|
|
json_encoders={ObjectId: str}
|
|
)
|
|
|
|
# @field_validator("id", pre=True)
|
|
# def validate_id(cls, v):
|
|
# if isinstance(v, ObjectId):
|
|
# return str(v)
|
|
# return v
|
|
|
|
|
|
class Item(MongoBaseModel):
|
|
name: str
|
|
price: float
|
|
quantity: int
|
|
unit: str
|
|
related_items: List[str] = []
|
|
|
|
|
|
class OrderItem(BaseModel):
|
|
item_id: str
|
|
quantity: int
|
|
price_at_order: float
|
|
|
|
# @field_validator("item_id")
|
|
# def validate_item_id(cls, v):
|
|
# return validate_object_id(v)
|
|
|
|
|
|
class Order(MongoBaseModel):
|
|
user_id: str
|
|
items: List[OrderItem]
|
|
total_amount: float
|
|
payment_method: Optional[str] = None
|
|
payment_status: str = "pending"
|
|
order_status: str = "created"
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
|
updated_at: Optional[datetime] = None
|
|
discount_applied: Optional[float] = None
|
|
notes: Optional[str] = None
|
|
|
|
# @validator("user_id")
|
|
# def validate_user_id(cls, v):
|
|
# return validate_object_id(v)
|
|
|
|
# @validator("order_status")
|
|
# def valid_order_status(cls, v):
|
|
# allowed_statuses = ["created", "processing",
|
|
# "shipped", "delivered", "cancelled"]
|
|
# if v not in allowed_statuses:
|
|
# raise ValueError(f"Invalid order status. Must be one of: {
|
|
# ', '.join(allowed_statuses)}")
|
|
# return v
|
|
|
|
# @validator("payment_status")
|
|
# def valid_payment_status(cls, v):
|
|
# allowed_statuses = ["pending", "paid", "refunded", "failed"]
|
|
# if v not in allowed_statuses:
|
|
# raise ValueError(f"Invalid payment status. Must be one of: {
|
|
# ', '.join(allowed_statuses)}")
|
|
# return v
|
|
|
|
|
|
class UserBase(BaseModel):
|
|
username: str
|
|
email: EmailStr
|
|
full_name: str
|
|
is_active: bool = True
|
|
is_superuser: bool = False
|
|
|
|
|
|
class UserCreate(UserBase):
|
|
password: str
|
|
|
|
|
|
class UserInDB(UserBase, MongoBaseModel):
|
|
hashed_password: str
|
|
|
|
|
|
class User(UserBase, MongoBaseModel):
|
|
pass
|
|
|
|
|
|
class Token(BaseModel):
|
|
access_token: str
|
|
token_type: str
|
|
|
|
|
|
class TokenData(BaseModel):
|
|
username: Optional[str] = None
|