import uuid from datetime import datetime from typing import Any from pydantic import ConfigDict, Field from common.enums import LocalContentStatus, LocalContentType, LocalSource from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol class LocalContentData(WebPacketProtocol): model_config = ConfigDict(from_attributes=True) local_content_id: uuid.UUID region_code: str content_type: LocalContentType source: LocalSource external_id: str | None = None title: str | None = None body: dict[str, Any] status: LocalContentStatus collected_at: datetime | None = None published_at: datetime | None = None display_start_at: datetime | None = None display_end_at: datetime | None = None class ReqSyncFestivals(WebPacketProtocol): region_code: str = Field(min_length=1, max_length=10) area_code: str | None = None start_date: str | None = Field(default=None, pattern=r"^\d{8}$") class ReqPublishLocalContent(WebPacketProtocol): content_ids: list[uuid.UUID] = Field(min_length=1, max_length=100) class ReqUpdateLocalContent(WebPacketProtocol): title: str | None = Field(default=None, min_length=1, max_length=300) body: dict[str, Any] | None = None display_start_at: datetime | None = None display_end_at: datetime | None = None class ResLocalContentList(Res_WebPacketProtocol): contents: list[LocalContentData] = [] class ResSyncFestivals(Res_WebPacketProtocol): collected: int = 0 skipped: int = 0 class WeatherData(WebPacketProtocol): temperature: float weather_code: int wind_speed: float | None = None observed_at: str timezone: str | None = None latitude: float longitude: float class ResWeather(Res_WebPacketProtocol): weather: WeatherData | None = None cached: bool = False stale: bool = False