From 44b2fa8d98f6a1320ba0d67fd40b7c39520a7f3f Mon Sep 17 00:00:00 2001 From: Andrei Duvakin Date: Sun, 26 Jan 2025 20:16:39 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../database/models/answer_files.py | 16 +++++++++++++ .../database/models/answer_options.py | 18 +++++++++++++++ .../database/models/step_tasks.py | 2 ++ .../database/models/task_answers.py | 23 +++++++++++++++++++ .../database/models/test_answers.py | 18 +++++++++++++++ .../infrastructure/database/models/users.py | 4 +++- 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 API/app/infrastructure/database/models/answer_files.py create mode 100644 API/app/infrastructure/database/models/answer_options.py create mode 100644 API/app/infrastructure/database/models/task_answers.py create mode 100644 API/app/infrastructure/database/models/test_answers.py diff --git a/API/app/infrastructure/database/models/answer_files.py b/API/app/infrastructure/database/models/answer_files.py new file mode 100644 index 0000000..51c6d1e --- /dev/null +++ b/API/app/infrastructure/database/models/answer_files.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class AnswerFile(Base): + __tablename__ = 'answer_files' + + id = Column(Integer, primary_key=True, autoincrement=True) + file_path = Column(String, nullable=False) + file_title = Column(String, nullable=False) + + answer_id = Column(Integer, ForeignKey('task_answers.id'), nullable=False) + + answer = relationship('TaskAnswer', back_populates='files') diff --git a/API/app/infrastructure/database/models/answer_options.py b/API/app/infrastructure/database/models/answer_options.py new file mode 100644 index 0000000..1aab522 --- /dev/null +++ b/API/app/infrastructure/database/models/answer_options.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, String, Boolean, ForeignKey +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class AnswerOption(Base): + __tablename__ = 'answer_options' + + id = Column(Integer, primary_key=True, autoincrement=True) + answer = Column(String, nullable=False) + is_current = Column(Boolean, nullable=False, default=False) + + task_id = Column(Integer, ForeignKey('step_tasks.id'), nullable=False) + + task = relationship('StepTask', back_populates='answer_options') + + test_answers = relationship('TestAnswer', back_populates='answer') diff --git a/API/app/infrastructure/database/models/step_tasks.py b/API/app/infrastructure/database/models/step_tasks.py index 6f773dc..4821c4f 100644 --- a/API/app/infrastructure/database/models/step_tasks.py +++ b/API/app/infrastructure/database/models/step_tasks.py @@ -17,3 +17,5 @@ class StepTask(Base): type = relationship('TaskType', back_populates='tasks') files = relationship('TaskFile', back_populates='task') + answer_options = relationship('AnswerOption', back_populates='task') + answers = relationship('TaskAnswer', back_populates='task') diff --git a/API/app/infrastructure/database/models/task_answers.py b/API/app/infrastructure/database/models/task_answers.py new file mode 100644 index 0000000..4f7bcc2 --- /dev/null +++ b/API/app/infrastructure/database/models/task_answers.py @@ -0,0 +1,23 @@ +from sqlalchemy import Column, Integer, ForeignKey, DateTime, String, Boolean +from sqlalchemy.sql import func +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class TaskAnswer(Base): + __tablename__ = 'task_answers' + + id = Column(Integer, primary_key=True, autoincrement=True) + answer_date = Column(DateTime, nullable=False, default=func.utcnow) + text = Column(String, nullable=False) + is_current = Column(Boolean, default=None) + comment = Column(String) + + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + task_id = Column(Integer, ForeignKey('step_tasks.id'), nullable=False) + + user = relationship('User', back_populates='task_answers') + task = relationship('StepTask', back_populates='answers') + + files = relationship('AnswerFile', back_populates='answer') diff --git a/API/app/infrastructure/database/models/test_answers.py b/API/app/infrastructure/database/models/test_answers.py new file mode 100644 index 0000000..025e723 --- /dev/null +++ b/API/app/infrastructure/database/models/test_answers.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, ForeignKey, DateTime +from sqlalchemy.sql import func +from sqlalchemy.orm import relationship + +from app.infrastructure.database.models import Base + + +class TestAnswer(Base): + __tablename__ = 'test_answers' + + id = Column(Integer, primary_key=True, autoincrement=True) + answer_date = Column(DateTime, nullable=False, default=func.utcnow) + + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + answer_id = Column(Integer, ForeignKey('answer_options.id'), nullable=False) + + user = relationship('User', back_populates='test_answers') + answer = relationship('AnswerOption', back_populates='test_answers') diff --git a/API/app/infrastructure/database/models/users.py b/API/app/infrastructure/database/models/users.py index 4310f90..5f7dc9d 100644 --- a/API/app/infrastructure/database/models/users.py +++ b/API/app/infrastructure/database/models/users.py @@ -33,9 +33,11 @@ class User(Base): role = relationship('Role', back_populates='users') appeals = relationship('Appeal', back_populates='user') - owned_courses = relationship('Course', back_populates='owned_courses') + 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)