from datetime import datetime from pydantic import BaseModel, EmailStr, Field from app.models.enums import AdminRole, EventType, PlatformKind class Token(BaseModel): access_token: str token_type: str = "bearer" class LoginRequest(BaseModel): email: EmailStr password: str class SubscribeRequest(BaseModel): email: EmailStr neighborhood: str | None = Field(default=None, max_length=120) class SubscriberPublic(BaseModel): id: int email: str neighborhood: str | None created_at: datetime model_config = {"from_attributes": True} class AdminUserPublic(BaseModel): id: int email: str role: AdminRole created_at: datetime model_config = {"from_attributes": True} class AdminUserCreate(BaseModel): email: EmailStr password: str = Field(min_length=8, max_length=128) role: AdminRole = AdminRole.editor class PlatformLinkPublic(BaseModel): id: int kind: PlatformKind label: str url: str sort_order: int model_config = {"from_attributes": True} class PlatformLinkCreate(BaseModel): kind: PlatformKind label: str = Field(max_length=120) url: str = Field(max_length=512) sort_order: int = 0 is_active: bool = True class PlatformLinkUpdate(BaseModel): kind: PlatformKind | None = None label: str | None = Field(default=None, max_length=120) url: str | None = Field(default=None, max_length=512) sort_order: int | None = None is_active: bool | None = None class EditionTicketsPublic(BaseModel): bookmyshow: str | None = None district: str | None = None instagram: str | None = None class MediaAssetPublic(BaseModel): id: int url: str thumb_url: str | None = None caption: str | None sort_order: int model_config = {"from_attributes": True} class ClickSummaryItem(BaseModel): link_kind: str count: int class OutboundClickPublic(BaseModel): id: int link_kind: str destination_url: str edition_id: int | None created_at: datetime model_config = {"from_attributes": True} class EventEditionPublic(BaseModel): id: int title: str slug: str event_type: EventType city: str venue_name: str | None event_date: datetime | None description: str | None is_featured: bool cover_image_url: str | None cover_thumb_url: str | None = None tickets: EditionTicketsPublic meta_description: str | None media: list[MediaAssetPublic] model_config = {"from_attributes": True} class EventEditionAdmin(EventEditionPublic): is_published: bool sort_order: int class EventEditionCreate(BaseModel): title: str = Field(max_length=200) slug: str = Field(max_length=200) event_type: EventType venue_name: str | None = Field(default=None, max_length=200) event_date: datetime | None = None description: str | None = None is_published: bool = False is_featured: bool = False sort_order: int = 0 bookmyshow_url: str | None = Field(default=None, max_length=512) district_url: str | None = Field(default=None, max_length=512) instagram_url: str | None = Field(default=None, max_length=512) meta_description: str | None = Field(default=None, max_length=320) class EventEditionUpdate(BaseModel): title: str | None = Field(default=None, max_length=200) slug: str | None = Field(default=None, max_length=200) event_type: EventType | None = None venue_name: str | None = None event_date: datetime | None = None description: str | None = None is_published: bool | None = None is_featured: bool | None = None sort_order: int | None = None bookmyshow_url: str | None = Field(default=None, max_length=512) district_url: str | None = Field(default=None, max_length=512) instagram_url: str | None = Field(default=None, max_length=512) meta_description: str | None = Field(default=None, max_length=320) class SiteConfigPublic(BaseModel): city: str = "Bengaluru" tagline: str platform_links: list[PlatformLinkPublic] featured_edition: EventEditionPublic | None recent_editions: list[EventEditionPublic] class MediaReorderItem(BaseModel): id: int sort_order: int