from enum import Enum as PyEnum from sqlalchemy import Column, Integer, VARCHAR, Enum, DateTime, Date, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func from werkzeug.security import check_password_hash, generate_password_hash from app.infrastructure.database.models import Base class UserGenderEnum(PyEnum): MALE = 'мужской' FEMALE = 'женский' NOTHING = 'не указан' class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) first_name = Column(VARCHAR(150), nullable=False) last_name = Column(VARCHAR(150), nullable=False) patronymic = Column(VARCHAR(150)) gender = Column(Enum(UserGenderEnum), nullable=False) birthday = Column(Date, nullable=False) registration_date = Column(DateTime, nullable=False, default=func.utcnow) login = Column(VARCHAR(150), nullable=False, unique=True) password = Column(String, nullable=False) email = Column(VARCHAR(200), nullable=False) role_id = Column(Integer, ForeignKey('roles.id'), nullable=False) role = relationship('Role', back_populates='users') appeals = relationship('Appeal', back_populates='user') owned_courses = relationship('Course', back_populates='owner_user') enrolled_courses = relationship('CourseStudent', back_populates='user') notifications = relationship('Notification', back_populates='user') test_answers = relationship('TestAnswer', back_populates='user') task_answers = relationship('TaskAnswer', back_populates='user') def check_password(self, password): return check_password_hash(self.password, password) def set_password(self, password): self.password = generate_password_hash(password)