Files
remnawave-bedolaga-telegram…/app/lib/nalogo/dto/user.py
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

111 lines
4.3 KiB
Python

"""
User-related DTO models.
Based on PHP library's Model/User classes.
"""
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field, field_validator
class UserType(BaseModel):
"""
User profile model.
Maps to PHP Model\\User\\UserType.
"""
id: int = Field(..., description='User ID')
last_name: str | None = Field(None, alias='lastName', description='Last name')
display_name: str = Field(..., alias='displayName', description='Display name')
middle_name: str | None = Field(None, alias='middleName', description='Middle name')
email: str | None = Field(None, description='Email address')
phone: str = Field(..., description='Phone number')
inn: str = Field(..., description='INN (tax identification number)')
snils: str | None = Field(None, description='SNILS')
avatar_exists: bool = Field(..., alias='avatarExists', description='Avatar exists')
initial_registration_date: datetime | None = Field(
None, alias='initialRegistrationDate', description='Initial registration date'
)
registration_date: datetime | None = Field(None, alias='registrationDate', description='Registration date')
first_receipt_register_time: datetime | None = Field(
None,
alias='firstReceiptRegisterTime',
description='First receipt registration time',
)
first_receipt_cancel_time: datetime | None = Field(
None,
alias='firstReceiptCancelTime',
description='First receipt cancellation time',
)
hide_cancelled_receipt: bool = Field(..., alias='hideCancelledReceipt', description='Hide cancelled receipts')
register_available: bool | str | None = Field(
None, alias='registerAvailable', description='Register available (mixed type)'
)
status: str | None = Field(None, description='User status')
restricted_mode: bool = Field(..., alias='restrictedMode', description='Restricted mode')
pfr_url: str | None = Field(None, alias='pfrUrl', description='PFR URL')
login: str | None = Field(None, description='Login')
@field_validator(
'initial_registration_date',
'registration_date',
'first_receipt_register_time',
'first_receipt_cancel_time',
mode='before',
)
@classmethod
def parse_datetime(cls, v: Any) -> datetime | None:
"""Parse datetime strings from API."""
if v is None or v == '':
return None
if isinstance(v, str):
try:
return datetime.fromisoformat(v.replace('Z', '+00:00'))
except ValueError:
return None
return v # type: ignore[no-any-return]
def is_avatar_exists(self) -> bool:
"""Check if user has avatar."""
return self.avatar_exists
def is_hide_cancelled_receipt(self) -> bool:
"""Check if cancelled receipts are hidden."""
return self.hide_cancelled_receipt
def is_restricted_mode(self) -> bool:
"""Check if user is in restricted mode."""
return self.restricted_mode
def model_dump(self, **kwargs: Any) -> dict[str, Any]:
"""Custom serialization to match API format."""
_ = kwargs
def serialize_datetime(dt: datetime | None) -> str | None:
if dt is None:
return None
return dt.isoformat()
return {
'id': self.id,
'lastName': self.last_name,
'displayName': self.display_name,
'middleName': self.middle_name,
'email': self.email,
'phone': self.phone,
'inn': self.inn,
'snils': self.snils,
'avatarExists': self.avatar_exists,
'initialRegistrationDate': serialize_datetime(self.initial_registration_date),
'registrationDate': serialize_datetime(self.registration_date),
'firstReceiptRegisterTime': serialize_datetime(self.first_receipt_register_time),
'firstReceiptCancelTime': serialize_datetime(self.first_receipt_cancel_time),
'hideCancelledReceipt': self.hide_cancelled_receipt,
'registerAvailable': self.register_available,
'status': self.status,
'restrictedMode': self.restricted_mode,
'pfrUrl': self.pfr_url,
'login': self.login,
}