Files
remnawave-bedolaga-telegram…/app/cabinet/schemas/servers.py
T
c0mrade 9a2aea038a chore: add uv package manager and ruff linter configuration
- 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
2026-01-24 17:45:27 +03:00

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