89 lines
3.5 KiB
Python
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"
|
|
) |