"""Модель пользователя.""" from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy import func, String from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base if TYPE_CHECKING: from app.models.task import Task from app.models.document import UsageLog class User(Base): """Пользователь системы.""" __tablename__ = "users" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) email: Mapped[str] = mapped_column(String(255), unique=True, index=True, nullable=False) hashed_password: Mapped[str] = mapped_column(String(255), nullable=False) name: Mapped[str] = mapped_column(String(255), nullable=False) is_verified: Mapped[bool] = mapped_column(default=False) # Администратор системы (доступ к админ-панели) is_admin: Mapped[bool] = mapped_column(default=False) # Тарифный план: free / student / premium / science plan: Mapped[str] = mapped_column(String(20), default="free") verification_token: Mapped[str | None] = mapped_column(String(255), nullable=True) created_at: Mapped[datetime] = mapped_column(server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( server_default=func.now(), onupdate=func.now(), ) # Связи tasks: Mapped[list["Task"]] = relationship(back_populates="user", lazy="select") usage: Mapped[list["UsageLog"]] = relationship(back_populates="user", lazy="select") def __repr__(self) -> str: return f""