170 lines
4.2 KiB
Python
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
|