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

181 lines
4.6 KiB
Python

from datetime import datetime
from pydantic import BaseModel, EmailStr, Field
from app.models.enums import AdminRole, EventStatus, EventType, OrderStatus, TicketTypeStatus
class AdminLoginRequest(BaseModel):
email: EmailStr
password: str = Field(min_length=8, max_length=128)
class AdminToken(BaseModel):
access_token: str
token_type: str = "bearer"
class AdminUserPublic(BaseModel):
id: int
email: EmailStr
role: AdminRole
model_config = {"from_attributes": True}
class DashboardMetrics(BaseModel):
total_revenue_paise: int
tickets_sold: int
tickets_remaining: int
orders_total: int
orders_paid: int
orders_pending: int
attendance: int
upcoming_events: int
class EventStatsRow(BaseModel):
event_id: int
event_title: str
starts_at: datetime
tickets_sold: int
tickets_remaining: int
revenue_paise: int
attendance: int
class VenueAdmin(BaseModel):
id: int
slug: str
name: str
area: str
city: str
address: str
map_url: str | None = None
description: str | None = None
model_config = {"from_attributes": True}
class VenueCreate(BaseModel):
slug: str = Field(min_length=2, max_length=120)
name: str = Field(min_length=2, max_length=200)
area: str = Field(min_length=2, max_length=120)
city: str = Field(default="Bengaluru", max_length=80)
address: str = Field(min_length=5, max_length=512)
map_url: str | None = Field(default=None, max_length=512)
description: str | None = None
class VenueUpdate(BaseModel):
slug: str | None = Field(default=None, max_length=120)
name: str | None = Field(default=None, max_length=200)
area: str | None = Field(default=None, max_length=120)
city: str | None = Field(default=None, max_length=80)
address: str | None = Field(default=None, max_length=512)
map_url: str | None = Field(default=None, max_length=512)
description: str | None = None
class EventAdmin(BaseModel):
id: int
slug: str
title: str
category: EventType
status: EventStatus
venue_id: int
description: str | None
starts_at: datetime
ends_at: datetime | None
is_featured: bool
cover_image_url: str | None
cover_image_alt: str | None
model_config = {"from_attributes": True}
class EventCreate(BaseModel):
slug: str = Field(min_length=2, max_length=200)
title: str = Field(min_length=2, max_length=240)
category: EventType
status: EventStatus = EventStatus.draft
venue_id: int
description: str | None = None
starts_at: datetime
ends_at: datetime | None = None
is_featured: bool = False
cover_image_url: str | None = None
cover_image_alt: str | None = None
class EventUpdate(BaseModel):
slug: str | None = Field(default=None, max_length=200)
title: str | None = Field(default=None, max_length=240)
category: EventType | None = None
status: EventStatus | None = None
venue_id: int | None = None
description: str | None = None
starts_at: datetime | None = None
ends_at: datetime | None = None
is_featured: bool | None = None
cover_image_url: str | None = None
cover_image_alt: str | None = None
class TicketTypeAdmin(BaseModel):
id: int
event_id: int
name: str
description: str | None
price_paise: int
quantity_total: int
quantity_sold: int
remaining: int
status: TicketTypeStatus
sort_order: int
model_config = {"from_attributes": True}
class TicketTypeCreate(BaseModel):
event_id: int
name: str = Field(min_length=1, max_length=120)
description: str | None = Field(default=None, max_length=512)
price_paise: int = Field(ge=0)
quantity_total: int = Field(ge=0)
status: TicketTypeStatus = TicketTypeStatus.active
sort_order: int = 0
class TicketTypeUpdate(BaseModel):
name: str | None = Field(default=None, max_length=120)
description: str | None = Field(default=None, max_length=512)
price_paise: int | None = Field(default=None, ge=0)
quantity_total: int | None = Field(default=None, ge=0)
status: TicketTypeStatus | None = None
sort_order: int | None = None
class OrderAdmin(BaseModel):
id: int
user_id: int
event_id: int
status: OrderStatus
total_paise: int
currency: str
provider_order_id: str | None
provider_payment_id: str | None
paid_at: datetime | None
created_at: datetime
model_config = {"from_attributes": True}
class PaymentAdmin(BaseModel):
order_id: int
event_id: int
status: OrderStatus
total_paise: int
provider_payment_id: str | None
payment_reference: str | None
paid_at: datetime | None