Files
bakery-ia/services/tenant/app/schemas/tenant_locations.py
2025-11-30 09:12:40 +01:00

89 lines
3.5 KiB
Python

"""
Tenant Location Schemas
"""
from pydantic import BaseModel, Field, field_validator
from typing import Optional, List, Dict, Any
from datetime import datetime
from uuid import UUID
class TenantLocationBase(BaseModel):
"""Base schema for tenant location"""
name: str = Field(..., min_length=1, max_length=200)
location_type: str = Field(..., pattern=r'^(central_production|retail_outlet|warehouse|store|branch)$')
address: str = Field(..., min_length=10, max_length=500)
city: str = Field(default="Madrid", max_length=100)
postal_code: str = Field(..., min_length=3, max_length=10)
latitude: Optional[float] = Field(None, ge=-90, le=90)
longitude: Optional[float] = Field(None, ge=-180, le=180)
contact_person: Optional[str] = Field(None, max_length=200)
contact_phone: Optional[str] = Field(None, max_length=20)
contact_email: Optional[str] = Field(None, max_length=255)
is_active: bool = True
delivery_windows: Optional[Dict[str, Any]] = None
operational_hours: Optional[Dict[str, Any]] = None
capacity: Optional[int] = Field(None, ge=0)
max_delivery_radius_km: Optional[float] = Field(None, ge=0)
delivery_schedule_config: Optional[Dict[str, Any]] = None
metadata: Optional[Dict[str, Any]] = Field(None)
class TenantLocationCreate(TenantLocationBase):
"""Schema for creating a tenant location"""
tenant_id: str # This will be validated as UUID in the API layer
class TenantLocationUpdate(BaseModel):
"""Schema for updating a tenant location"""
name: Optional[str] = Field(None, min_length=1, max_length=200)
location_type: Optional[str] = Field(None, pattern=r'^(central_production|retail_outlet|warehouse|store|branch)$')
address: Optional[str] = Field(None, min_length=10, max_length=500)
city: Optional[str] = Field(None, max_length=100)
postal_code: Optional[str] = Field(None, min_length=3, max_length=10)
latitude: Optional[float] = Field(None, ge=-90, le=90)
longitude: Optional[float] = Field(None, ge=-180, le=180)
contact_person: Optional[str] = Field(None, max_length=200)
contact_phone: Optional[str] = Field(None, max_length=20)
contact_email: Optional[str] = Field(None, max_length=255)
is_active: Optional[bool] = None
delivery_windows: Optional[Dict[str, Any]] = None
operational_hours: Optional[Dict[str, Any]] = None
capacity: Optional[int] = Field(None, ge=0)
max_delivery_radius_km: Optional[float] = Field(None, ge=0)
delivery_schedule_config: Optional[Dict[str, Any]] = None
metadata: Optional[Dict[str, Any]] = Field(None)
class TenantLocationResponse(TenantLocationBase):
"""Schema for tenant location response"""
id: str
tenant_id: str
created_at: datetime
updated_at: Optional[datetime]
@field_validator('id', 'tenant_id', mode='before')
@classmethod
def convert_uuid_to_string(cls, v):
"""Convert UUID objects to strings for JSON serialization"""
if isinstance(v, UUID):
return str(v)
return v
class Config:
from_attributes = True
populate_by_name = True
class TenantLocationsResponse(BaseModel):
"""Schema for multiple tenant locations response"""
locations: List[TenantLocationResponse]
total: int
class TenantLocationTypeFilter(BaseModel):
"""Schema for filtering locations by type"""
location_types: List[str] = Field(
default=["central_production", "retail_outlet", "warehouse", "store", "branch"],
description="List of location types to include"
)