New enterprise feature
This commit is contained in:
89
services/tenant/app/schemas/tenant_locations.py
Normal file
89
services/tenant/app/schemas/tenant_locations.py
Normal file
@@ -0,0 +1,89 @@
|
||||
"""
|
||||
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"
|
||||
)
|
||||
Reference in New Issue
Block a user