from datetime import datetime from pydantic import BaseModel from app.schemas.tag import TagOut from app.schemas.user import UserInfo class SpotCreate(BaseModel): title: str city: str longitude: float latitude: float description: str | None = None transport: str | None = None best_time: str | None = None difficulty: str | None = None is_free: bool = True price_min: float | None = None price_max: float | None = None image_urls: list[str] = [] tag_ids: list[int] = [] class SpotUpdate(BaseModel): title: str | None = None city: str | None = None longitude: float | None = None latitude: float | None = None description: str | None = None transport: str | None = None best_time: str | None = None difficulty: str | None = None is_free: bool | None = None price_min: float | None = None price_max: float | None = None tag_ids: list[int] | None = None class SpotImageOut(BaseModel): id: int image_url: str is_cover: bool sort_order: int model_config = {"from_attributes": True} class SpotBrief(BaseModel): id: int title: str city: str longitude: float | None = None latitude: float | None = None cover_image_url: str | None = None audit_status: str avg_rating: float | None = None favorite_count: int = 0 is_free: bool = True price_min: float | None = None price_max: float | None = None created_at: datetime | None = None model_config = {"from_attributes": True} class SpotDetail(SpotBrief): description: str | None = None transport: str | None = None best_time: str | None = None difficulty: str | None = None creator: UserInfo | None = None images: list[SpotImageOut] = [] tags: list[TagOut] = [] rating_count: int = 0 is_favorited: bool = False class SpotImageCreate(BaseModel): image_url: str is_cover: bool = False sort_order: int = 0