9a2aea038a
- Add pyproject.toml with uv and ruff configuration - Pin Python version to 3.13 via .python-version - Add Makefile commands: lint, format, fix - Apply ruff formatting to entire codebase - Remove unused imports (base64 in yookassa/simple_subscription) - Update .gitignore for new config files
130 lines
2.9 KiB
Python
130 lines
2.9 KiB
Python
"""Schemas for server management in cabinet."""
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class PromoGroupInfo(BaseModel):
|
|
"""Promo group info for server."""
|
|
|
|
id: int
|
|
name: str
|
|
is_selected: bool = False
|
|
|
|
|
|
class ServerListItem(BaseModel):
|
|
"""Server item for list view."""
|
|
|
|
id: int
|
|
squad_uuid: str
|
|
display_name: str
|
|
original_name: str | None = None
|
|
country_code: str | None = None
|
|
is_available: bool
|
|
is_trial_eligible: bool
|
|
price_kopeks: int
|
|
price_rubles: float
|
|
max_users: int | None = None
|
|
current_users: int
|
|
sort_order: int
|
|
is_full: bool
|
|
availability_status: str
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class ServerListResponse(BaseModel):
|
|
"""Response with list of servers."""
|
|
|
|
servers: list[ServerListItem]
|
|
total: int
|
|
|
|
|
|
class ServerDetailResponse(BaseModel):
|
|
"""Detailed server response."""
|
|
|
|
id: int
|
|
squad_uuid: str
|
|
display_name: str
|
|
original_name: str | None = None
|
|
country_code: str | None = None
|
|
description: str | None = None
|
|
is_available: bool
|
|
is_trial_eligible: bool
|
|
price_kopeks: int
|
|
price_rubles: float
|
|
max_users: int | None = None
|
|
current_users: int
|
|
sort_order: int
|
|
is_full: bool
|
|
availability_status: str
|
|
promo_groups: list[PromoGroupInfo]
|
|
active_subscriptions: int
|
|
tariffs_using: list[str] # Names of tariffs using this server
|
|
created_at: datetime
|
|
updated_at: datetime | None = None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class ServerUpdateRequest(BaseModel):
|
|
"""Request to update a server."""
|
|
|
|
display_name: str | None = Field(None, min_length=1, max_length=255)
|
|
description: str | None = None
|
|
country_code: str | None = Field(None, max_length=5)
|
|
is_available: bool | None = None
|
|
is_trial_eligible: bool | None = None
|
|
price_kopeks: int | None = Field(None, ge=0)
|
|
max_users: int | None = Field(None, ge=0)
|
|
sort_order: int | None = Field(None, ge=0)
|
|
promo_group_ids: list[int] | None = None
|
|
|
|
|
|
class ServerToggleResponse(BaseModel):
|
|
"""Response after toggling server."""
|
|
|
|
id: int
|
|
is_available: bool
|
|
message: str
|
|
|
|
|
|
class ServerTrialToggleResponse(BaseModel):
|
|
"""Response after toggling trial eligibility."""
|
|
|
|
id: int
|
|
is_trial_eligible: bool
|
|
message: str
|
|
|
|
|
|
class ServerStatsResponse(BaseModel):
|
|
"""Server statistics."""
|
|
|
|
id: int
|
|
display_name: str
|
|
squad_uuid: str
|
|
current_users: int
|
|
max_users: int | None
|
|
active_subscriptions: int
|
|
trial_subscriptions: int
|
|
usage_percent: float | None = None
|
|
|
|
|
|
class ServerSyncResponse(BaseModel):
|
|
"""Response after syncing with RemnaWave."""
|
|
|
|
created: int
|
|
updated: int
|
|
removed: int
|
|
message: str
|
|
|
|
|
|
class ServerSyncRequest(BaseModel):
|
|
"""Request to sync servers."""
|
|
|
|
force: bool = False # Force sync even if recently synced
|