/
BarakovskayaMaria
/
RGB
Обзор
Документация
Войти
/
BarakovskayaMaria
/
RGB
Код
Запросы
2
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/models.py
150 строк
6 KB
BarakovskayaMaria
Аутентификация по email и паролю, сброс пароля по коду на почту, SMTP через переменные окружения.
13 май 2026, 19:23
13 май 2026, 19:23
30ec7b9
Код
Авторство
О чём код?
from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, ForeignKey, Text from sqlalchemy.orm import relationship from datetime import datetime from app.database import Base from sqlalchemy import JSON class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) first_name = Column(String(255)) last_name = Column(String(255)) phone_number = Column(String(255), index=True, nullable=True) email = Column(String(255), nullable=True, index=True) password_hash = Column(String(255), nullable=True) role = Column(String(50)) student = relationship("Student", back_populates="user", uselist=False) tutor = relationship("Tutor", back_populates="user", uselist=False) class PasswordResetCode(Base): __tablename__ = "password_reset_codes" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) code = Column(String(16), nullable=False) expires_at = Column(DateTime, nullable=False) used = Column(Boolean, default=False, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) user = relationship("User") class Student(Base): __tablename__ = "students" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) tutor_id = Column(Integer, ForeignKey("tutors.id")) user = relationship("User", back_populates="student") tutor = relationship("Tutor", back_populates="students") results = relationship("Result", back_populates="student") recommendations = relationship("Recommendation", back_populates="student") topic_progress = relationship("TopicProgress", back_populates="student") class Tutor(Base): __tablename__ = "tutors" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) unique_link = Column(String(255)) user = relationship("User", back_populates="tutor") students = relationship("Student", back_populates="tutor") class Topic(Base): __tablename__ = "topics" id = Column(Integer, primary_key=True, index=True) name = Column(String(255)) description = Column(Text) tasks = relationship("Task", back_populates="topic") topic_progress = relationship("TopicProgress", back_populates="topic") recommendations = relationship("Recommendation", back_populates="topic") # связь с рекомендациями class Task(Base): __tablename__ = "tasks" id = Column(Integer, primary_key=True, index=True) topic_id = Column(Integer, ForeignKey("topics.id")) question = Column(Text) answer = Column(String) difficulty_level = Column(Integer) images = Column(JSON, nullable=True) is_synthetic = Column(Integer, default=1) oge_task_number = Column(Integer, nullable=True, index=True) complex_task_data = Column(Text, nullable=True) topic = relationship("Topic", back_populates="tasks") results = relationship("Result", back_populates="task") class Result(Base): __tablename__ = "results" id = Column(Integer, primary_key=True, index=True) student_id = Column(Integer, ForeignKey("students.id")) task_id = Column(Integer, ForeignKey("tasks.id")) answer = Column(Text) is_correct = Column(Boolean) diagnostic_id = Column(Integer, nullable=True) subquestion_order = Column(Integer, nullable=True) timestamp = Column(DateTime, default=datetime.utcnow) student = relationship("Student", back_populates="results") task = relationship("Task", back_populates="results") class Recommendation(Base): __tablename__ = "recommendations" id = Column(Integer, primary_key=True, index=True) student_id = Column(Integer, ForeignKey("students.id")) topic_id = Column(Integer, ForeignKey("topics.id")) # теперь тема, а не задача chosen_task_id = Column(Integer, ForeignKey("tasks.id"), nullable=True, index=True) subquestion_order = Column(Integer, nullable=True) question_snapshot = Column(Text, nullable=True) images_snapshot = Column(JSON, nullable=True) reason = Column(String(20)) # 'weak' или 'advanced' generated_at = Column(DateTime, default=datetime.utcnow) is_used = Column(Boolean, default=False) student = relationship("Student", back_populates="recommendations") topic = relationship("Topic", back_populates="recommendations") chosen_task = relationship("Task") class TopicProgress(Base): __tablename__ = "topic_progress" id = Column(Integer, primary_key=True, index=True) student_id = Column(Integer, ForeignKey("students.id")) topic_id = Column(Integer, ForeignKey("topics.id")) progress_percentage = Column(Integer) last_accessed = Column(DateTime, default=datetime.utcnow) student = relationship("Student", back_populates="topic_progress") topic = relationship("Topic", back_populates="topic_progress") class AnswerDraft(Base): __tablename__ = "answer_drafts" id = Column(Integer, primary_key=True, index=True) student_id = Column(Integer, ForeignKey("students.id"), nullable=False, index=True) mode = Column(String(20), nullable=False, index=True) # diagnostic | homework session_key = Column(String(120), nullable=False, index=True) task_id = Column(Integer, ForeignKey("tasks.id"), nullable=False) answer = Column(Text, nullable=False) subquestion_order = Column(Integer, nullable=True) recommendation_id = Column(Integer, ForeignKey("recommendations.id"), nullable=True, index=True) updated_at = Column(DateTime, default=datetime.utcnow, nullable=False) student = relationship("Student") task = relationship("Task") recommendation = relationship("Recommendation")