REFACTOR - Database logic
This commit is contained in:
@@ -156,5 +156,15 @@ class SalesExportRequest(BaseModel):
|
||||
location_ids: Optional[List[str]] = None
|
||||
include_metadata: bool = Field(default=True)
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
class SalesValidationRequest(BaseModel):
|
||||
"""Schema for JSON-based sales data validation request"""
|
||||
data: str = Field(..., description="Raw data content (CSV, JSON, etc.)")
|
||||
data_format: str = Field(..., pattern="^(csv|json|excel)$", description="Format of the data")
|
||||
validate_only: bool = Field(default=True, description="Only validate, don't import")
|
||||
source: str = Field(default="onboarding_upload", description="Source of the data")
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
71
services/data/app/schemas/traffic.py
Normal file
71
services/data/app/schemas/traffic.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# ================================================================
|
||||
# services/data/app/schemas/traffic.py
|
||||
# ================================================================
|
||||
"""Traffic data schemas"""
|
||||
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from datetime import datetime
|
||||
from typing import Optional, List
|
||||
from uuid import UUID
|
||||
|
||||
class TrafficDataBase(BaseModel):
|
||||
"""Base traffic data schema"""
|
||||
location_id: str = Field(..., max_length=100, description="Traffic monitoring location ID")
|
||||
date: datetime = Field(..., description="Date and time of traffic measurement")
|
||||
traffic_volume: Optional[int] = Field(None, ge=0, description="Vehicles per hour")
|
||||
pedestrian_count: Optional[int] = Field(None, ge=0, description="Pedestrians per hour")
|
||||
congestion_level: Optional[str] = Field(None, regex="^(low|medium|high)$", description="Traffic congestion level")
|
||||
average_speed: Optional[float] = Field(None, ge=0, le=200, description="Average speed in km/h")
|
||||
source: str = Field("madrid_opendata", max_length=50, description="Data source")
|
||||
raw_data: Optional[str] = Field(None, description="Raw data from source")
|
||||
|
||||
class TrafficDataCreate(TrafficDataBase):
|
||||
"""Schema for creating traffic data"""
|
||||
pass
|
||||
|
||||
class TrafficDataUpdate(BaseModel):
|
||||
"""Schema for updating traffic data"""
|
||||
traffic_volume: Optional[int] = Field(None, ge=0)
|
||||
pedestrian_count: Optional[int] = Field(None, ge=0)
|
||||
congestion_level: Optional[str] = Field(None, regex="^(low|medium|high)$")
|
||||
average_speed: Optional[float] = Field(None, ge=0, le=200)
|
||||
raw_data: Optional[str] = None
|
||||
|
||||
class TrafficDataResponse(TrafficDataBase):
|
||||
"""Schema for traffic data responses"""
|
||||
id: str = Field(..., description="Unique identifier")
|
||||
created_at: datetime = Field(..., description="Creation timestamp")
|
||||
updated_at: datetime = Field(..., description="Last update timestamp")
|
||||
|
||||
@validator('id', pre=True)
|
||||
def convert_uuid_to_string(cls, v):
|
||||
if isinstance(v, UUID):
|
||||
return str(v)
|
||||
return v
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
|
||||
class TrafficDataList(BaseModel):
|
||||
"""Schema for paginated traffic data responses"""
|
||||
data: List[TrafficDataResponse]
|
||||
total: int = Field(..., description="Total number of records")
|
||||
page: int = Field(..., description="Current page number")
|
||||
per_page: int = Field(..., description="Records per page")
|
||||
has_next: bool = Field(..., description="Whether there are more pages")
|
||||
has_prev: bool = Field(..., description="Whether there are previous pages")
|
||||
|
||||
class TrafficAnalytics(BaseModel):
|
||||
"""Schema for traffic analytics"""
|
||||
location_id: str
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
avg_traffic_volume: Optional[float] = None
|
||||
avg_pedestrian_count: Optional[float] = None
|
||||
peak_traffic_hour: Optional[int] = None
|
||||
peak_pedestrian_hour: Optional[int] = None
|
||||
congestion_distribution: dict = Field(default_factory=dict)
|
||||
avg_speed: Optional[float] = None
|
||||
121
services/data/app/schemas/weather.py
Normal file
121
services/data/app/schemas/weather.py
Normal file
@@ -0,0 +1,121 @@
|
||||
# ================================================================
|
||||
# services/data/app/schemas/weather.py
|
||||
# ================================================================
|
||||
"""Weather data schemas"""
|
||||
|
||||
from pydantic import BaseModel, Field, validator
|
||||
from datetime import datetime
|
||||
from typing import Optional, List
|
||||
from uuid import UUID
|
||||
|
||||
class WeatherDataBase(BaseModel):
|
||||
"""Base weather data schema"""
|
||||
location_id: str = Field(..., max_length=100, description="Weather monitoring location ID")
|
||||
date: datetime = Field(..., description="Date and time of weather measurement")
|
||||
temperature: Optional[float] = Field(None, ge=-50, le=60, description="Temperature in Celsius")
|
||||
precipitation: Optional[float] = Field(None, ge=0, description="Precipitation in mm")
|
||||
humidity: Optional[float] = Field(None, ge=0, le=100, description="Humidity percentage")
|
||||
wind_speed: Optional[float] = Field(None, ge=0, le=200, description="Wind speed in km/h")
|
||||
pressure: Optional[float] = Field(None, ge=800, le=1200, description="Atmospheric pressure in hPa")
|
||||
description: Optional[str] = Field(None, max_length=200, description="Weather description")
|
||||
source: str = Field("aemet", max_length=50, description="Data source")
|
||||
raw_data: Optional[str] = Field(None, description="Raw data from source")
|
||||
|
||||
class WeatherDataCreate(WeatherDataBase):
|
||||
"""Schema for creating weather data"""
|
||||
pass
|
||||
|
||||
class WeatherDataUpdate(BaseModel):
|
||||
"""Schema for updating weather data"""
|
||||
temperature: Optional[float] = Field(None, ge=-50, le=60)
|
||||
precipitation: Optional[float] = Field(None, ge=0)
|
||||
humidity: Optional[float] = Field(None, ge=0, le=100)
|
||||
wind_speed: Optional[float] = Field(None, ge=0, le=200)
|
||||
pressure: Optional[float] = Field(None, ge=800, le=1200)
|
||||
description: Optional[str] = Field(None, max_length=200)
|
||||
raw_data: Optional[str] = None
|
||||
|
||||
class WeatherDataResponse(WeatherDataBase):
|
||||
"""Schema for weather data responses"""
|
||||
id: str = Field(..., description="Unique identifier")
|
||||
created_at: datetime = Field(..., description="Creation timestamp")
|
||||
updated_at: datetime = Field(..., description="Last update timestamp")
|
||||
|
||||
@validator('id', pre=True)
|
||||
def convert_uuid_to_string(cls, v):
|
||||
if isinstance(v, UUID):
|
||||
return str(v)
|
||||
return v
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
|
||||
class WeatherForecastBase(BaseModel):
|
||||
"""Base weather forecast schema"""
|
||||
location_id: str = Field(..., max_length=100, description="Location ID")
|
||||
forecast_date: datetime = Field(..., description="Date for forecast")
|
||||
temperature: Optional[float] = Field(None, ge=-50, le=60, description="Forecasted temperature")
|
||||
precipitation: Optional[float] = Field(None, ge=0, description="Forecasted precipitation")
|
||||
humidity: Optional[float] = Field(None, ge=0, le=100, description="Forecasted humidity")
|
||||
wind_speed: Optional[float] = Field(None, ge=0, le=200, description="Forecasted wind speed")
|
||||
description: Optional[str] = Field(None, max_length=200, description="Forecast description")
|
||||
source: str = Field("aemet", max_length=50, description="Data source")
|
||||
raw_data: Optional[str] = Field(None, description="Raw forecast data")
|
||||
|
||||
class WeatherForecastCreate(WeatherForecastBase):
|
||||
"""Schema for creating weather forecasts"""
|
||||
pass
|
||||
|
||||
class WeatherForecastResponse(WeatherForecastBase):
|
||||
"""Schema for weather forecast responses"""
|
||||
id: str = Field(..., description="Unique identifier")
|
||||
generated_at: datetime = Field(..., description="When forecast was generated")
|
||||
created_at: datetime = Field(..., description="Creation timestamp")
|
||||
updated_at: datetime = Field(..., description="Last update timestamp")
|
||||
|
||||
@validator('id', pre=True)
|
||||
def convert_uuid_to_string(cls, v):
|
||||
if isinstance(v, UUID):
|
||||
return str(v)
|
||||
return v
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
|
||||
class WeatherDataList(BaseModel):
|
||||
"""Schema for paginated weather data responses"""
|
||||
data: List[WeatherDataResponse]
|
||||
total: int = Field(..., description="Total number of records")
|
||||
page: int = Field(..., description="Current page number")
|
||||
per_page: int = Field(..., description="Records per page")
|
||||
has_next: bool = Field(..., description="Whether there are more pages")
|
||||
has_prev: bool = Field(..., description="Whether there are previous pages")
|
||||
|
||||
class WeatherForecastList(BaseModel):
|
||||
"""Schema for paginated weather forecast responses"""
|
||||
forecasts: List[WeatherForecastResponse]
|
||||
total: int = Field(..., description="Total number of forecasts")
|
||||
page: int = Field(..., description="Current page number")
|
||||
per_page: int = Field(..., description="Forecasts per page")
|
||||
|
||||
class WeatherAnalytics(BaseModel):
|
||||
"""Schema for weather analytics"""
|
||||
location_id: str
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
avg_temperature: Optional[float] = None
|
||||
min_temperature: Optional[float] = None
|
||||
max_temperature: Optional[float] = None
|
||||
total_precipitation: Optional[float] = None
|
||||
avg_humidity: Optional[float] = None
|
||||
avg_wind_speed: Optional[float] = None
|
||||
avg_pressure: Optional[float] = None
|
||||
weather_conditions: dict = Field(default_factory=dict)
|
||||
rainy_days: int = 0
|
||||
sunny_days: int = 0
|
||||
Reference in New Issue
Block a user