Desi-Clans/backend/app/schemas/domain.py
2026-10-08 02:52:58 +05:30

170 lines
4.2 KiB
Python

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