from datetime import datetime from enum import IntEnum from typing import Self from aiogram.types import Chat from aiogram.types import User as TgUser from pydantic import BaseModel from sqlalchemy.orm import Mapped, mapped_column from models import BaseTable class UserCache(BaseModel): id: int username: str | None = None full_name: str @classmethod def from_chat(cls, chat: Chat) -> Self: return cls( id=chat.id, username=chat.username, full_name=chat.full_name, ) @classmethod def from_user(cls, user: TgUser) -> Self: return cls( id=user.id, username=user.username, full_name=user.full_name, ) @property def mention(self) -> str: if self.username is not None: return f'{self.full_name}' else: return f'{self.full_name}' class UserRole(IntEnum): REGULAR = 0 ADMIN = 1 class User(BaseTable): __tablename__ = "user" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=False) role: Mapped[UserRole] = mapped_column(default=UserRole.REGULAR) vpn_link: Mapped[str] datetime: Mapped[datetime] def is_regular(self) -> bool: return self.role >= UserRole.REGULAR def is_admin(self) -> bool: return self.role == UserRole.ADMIN