181 lines
4.6 KiB
Python
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
|