Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Frontend #11

Merged
merged 94 commits into from
Dec 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
748e3b5
Добавляет нерабочий эндпоинт для автопроверки заданий
codEnjoyer Nov 21, 2023
f953a17
разбил авторизацию, переделываю логики отрисовки taskов
semant1cs Nov 23, 2023
c5b9b46
добавляет кастомный хэдер в модальном окне
semant1cs Nov 23, 2023
a5cbaa2
добавляет единый метод для рендера элементов меню
semant1cs Nov 23, 2023
4e41856
добавляет выделение выбранной таски ч1
semant1cs Nov 23, 2023
c9ff272
добавляет выделение выбранной таски и обнуление при закрытии уровня
semant1cs Nov 23, 2023
bcfeee3
Делает куки insecure
codEnjoyer Nov 23, 2023
91ae93d
добавляет отображение тестов и теории на одном уровне
semant1cs Nov 24, 2023
9303056
разделяет на суперпользователя и сотрудника
semant1cs Nov 27, 2023
755ae1f
разбил store на store для карты и модулей
semant1cs Nov 27, 2023
ae87cba
добавляет возможность супер пользователю создать карту
semant1cs Nov 27, 2023
05bf9e0
Merge pull request #7 from codEnjoyer/decomposition-front
semant1cs Nov 27, 2023
d6c89f0
добавляет просмотр карт и их создание и удаление
semant1cs Nov 28, 2023
180e8aa
добавляет изменения выбор карты по индексу
semant1cs Nov 28, 2023
a5b1b74
добавляет подрузку модулей под карту, разделяет на блоки интерфейс су…
semant1cs Nov 28, 2023
5708a54
добавляет фильтрацию модулей на фронте
semant1cs Nov 28, 2023
74a7e35
подготовил код к добавлению списка пользователей
semant1cs Nov 28, 2023
205afc9
Merge pull request #8 from codEnjoyer/decomposition-front
semant1cs Nov 28, 2023
d4223d8
добавляет карточки и стили для карточек
semant1cs Nov 28, 2023
17bbb2f
добавляет стили для карточек
semant1cs Nov 28, 2023
725b157
Merge branch 'frontend' into cards-users
semant1cs Nov 28, 2023
47d2b5e
добавляет .css и .map в gitignore, хорошее изображение карточек
semant1cs Nov 28, 2023
7b00c9c
Удаляет username из модели пользователя
codEnjoyer Dec 3, 2023
ef5691a
Добавляет директории для лучшей организации файлов
codEnjoyer Dec 3, 2023
9b288ef
Исправлен баг с получением модулей конкретной карты
codEnjoyer Dec 3, 2023
9ed3b39
поправил стили
semant1cs Dec 5, 2023
7aa200e
корректно показывает всех пользователей системы
semant1cs Dec 5, 2023
34bc743
добавляет карточки с достижениями на профиль
semant1cs Dec 5, 2023
a9c72be
добавил типов для ачивок, декомпозировал профиль, +оптимизация
semant1cs Dec 5, 2023
2f97a41
Добавялет каскадное удаление объектов
codEnjoyer Dec 5, 2023
b6d7da6
Добавялет отчество для сотрудника
codEnjoyer Dec 5, 2023
26a7ca9
Merge branch 'clean-up-v1' into task-units-checking-v1
codEnjoyer Dec 5, 2023
c54e90d
Добавляет сырую автоматическую проверку тестовых заданий
codEnjoyer Dec 5, 2023
0f0a93f
перешёл на react-hook-form, поправил кастомные элементы
semant1cs Dec 10, 2023
4c0ab59
валидация формы, восстановление чекбокса видимости пароля
semant1cs Dec 10, 2023
0926fdb
скомбинировал типы, продолжил переделывать валидацию
semant1cs Dec 10, 2023
3532e0e
почистил глобальное состояние, допиливаю авторизацию,
semant1cs Dec 11, 2023
93ee7db
доделал валидацию авторизации
semant1cs Dec 11, 2023
15871c3
добавляет анимацию фона звёздами
semant1cs Dec 11, 2023
e0bdad8
Автопроверка тестовых заданий работает корректно
codEnjoyer Dec 11, 2023
eddd0ce
Добавляет сервис для работы с заданиями с ручной проверкой
codEnjoyer Dec 11, 2023
2f9bd86
начал добавлять прогресс бар
semant1cs Dec 11, 2023
d27eb9e
Разделяет схемы заданий и вопросов на тесты и открытые
codEnjoyer Dec 11, 2023
ac4f5d0
Добавляет пару значений enum'ов
codEnjoyer Dec 11, 2023
087f64d
Добавил рабочий прогресс бар
semant1cs Dec 12, 2023
5af0164
переделал данных в уровень
semant1cs Dec 12, 2023
6148388
отформатировал импорты
semant1cs Dec 12, 2023
2ef917e
Merge branch 'decomposition-front' into frontend
semant1cs Dec 12, 2023
c36de98
убрал file watcher для scss
semant1cs Dec 12, 2023
acd741e
Добавляет пометку
codEnjoyer Dec 11, 2023
b295002
Merge branch 'task-units-checking-v1' into backend
codEnjoyer Dec 12, 2023
4e01cec
Добавляет поправки
codEnjoyer Dec 12, 2023
0cf6f98
Добавляет поправки
codEnjoyer Dec 12, 2023
88a53fc
Merge remote-tracking branch 'origin/backend' into backend
codEnjoyer Dec 12, 2023
4360b1b
вернул кастомную кнопку
semant1cs Dec 13, 2023
6a3eb0d
переделал конфигурацию eslint в json
semant1cs Dec 13, 2023
75fe3bd
вернул кнопку, добавил колбэк на навигацию
semant1cs Dec 14, 2023
3ce39af
Merge branch 'frontend' of https://github.com/codEnjoyer/Adaptify int…
semant1cs Dec 14, 2023
3260f0e
поправил линтер, добавил кнопку добавления
semant1cs Dec 14, 2023
68961f2
убрал лишнее со страницы карт, добавил обработку плюсика
semant1cs Dec 14, 2023
98e3249
делает обновление списка карт при добавлении/удалении
semant1cs Dec 14, 2023
23200d1
Merge branch 'backend' into frontend
semant1cs Dec 14, 2023
6245aa9
Merge branch 'super-user-interface-adding-content' into frontend
semant1cs Dec 14, 2023
adc47bd
временно переделал авторизацию
semant1cs Dec 14, 2023
2e8a823
добавление карты, модуля, уровня v1
semant1cs Dec 14, 2023
5dade9f
удаление карты, модуля, уровня v1
semant1cs Dec 14, 2023
6eb910e
добавление модулей
semant1cs Dec 14, 2023
8e66cde
сделал более удобное расположение создания, удаления
semant1cs Dec 14, 2023
5fce461
добавляет кнопку выхода, работа над карточками
semant1cs Dec 15, 2023
78f1e18
собрал создание карт, модулей, уровней в один компонент
semant1cs Dec 15, 2023
49f5a2f
чистка глобального стейта, перенос в локальный
semant1cs Dec 15, 2023
6a6343e
чистка глобального стейтменеджера
semant1cs Dec 15, 2023
db6fd87
Теперь за автопроверку начисляются монеты авторизованному пользователю
codEnjoyer Dec 16, 2023
8ee210e
Merge branch 'reward-for-completing-task-v1' into backend
codEnjoyer Dec 16, 2023
e107fb7
Обновляет головную миграцию
codEnjoyer Dec 17, 2023
ad9881a
пришёл к нормально организованному коду с удалением карт
semant1cs Dec 17, 2023
631ff53
обработка ошибок при выборе удалении модулей, уровней
semant1cs Dec 17, 2023
6ad4412
разделил на обновление данных после удаления и не после
semant1cs Dec 17, 2023
209765d
добавляет монетки
semant1cs Dec 17, 2023
cf111c3
добавляет дату найма в компанию
semant1cs Dec 17, 2023
db402f4
добавляет рендер меню заданий
semant1cs Dec 17, 2023
f2835ea
добавляет переключение между задачами уровня
semant1cs Dec 17, 2023
bc19fbb
отображение ФИО в списке сотрудников
semant1cs Dec 17, 2023
bb6ef96
поправил стили и превьюшку пользователя
semant1cs Dec 17, 2023
bb3cac1
добавляет ключи
semant1cs Dec 17, 2023
7f5ab70
Делает эндпоинт автопроверки заданий незащищенным
codEnjoyer Dec 18, 2023
c3914f2
шрифты на главной странице
semant1cs Dec 18, 2023
7908eba
добавляет разделение на типы тестов
semant1cs Dec 18, 2023
251cedd
добавляет крутой редактор текста
semant1cs Dec 18, 2023
622c324
поправил шрифты для форм и остального
semant1cs Dec 18, 2023
800d84f
добавляет запрос при отправке формы
semant1cs Dec 18, 2023
32e48da
добавляет отправку запроса на открытый вопрос
semant1cs Dec 18, 2023
ed9aad3
кидает ошибку, если в уровне нет заданий
semant1cs Dec 18, 2023
2cf0661
Merge branch 'backend' into frontend
semant1cs Dec 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,4 +182,8 @@ dist-ssr
*.ntvs*
*.njsproj
*.sln
*.sw?
*.sw?
*.map
*.css
*.css
*.map
2 changes: 1 addition & 1 deletion backend/docker-launch.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
# При запуске стоит указывать здесь номер последней миграции
alembic revision --autogenerate
alembic upgrade head || alembic upgrade 1d75241f340c
alembic upgrade head || alembic upgrade ee38e6a7803e
cd src || exit
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:"$BACK_APP_PORT" --timeout 300
2 changes: 1 addition & 1 deletion backend/migrations/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
# target_metadata = mymodel.Base.metadata

from game.map import Map
from game.modules import Module
from game.modules import Level
from game.levels import Level
from game.units.tasks import TaskUnit, EmployeeTask
from game.units.theory import TheoryUnit # , TheoryVideo
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""удаляет поле username из user

Revision ID: 5b1fc71a077e
Revises: 1d75241f340c
Create Date: 2023-12-03 21:39:14.428463

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '5b1fc71a077e'
down_revision: Union[str, None] = '1d75241f340c'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('users_username_key', 'users', type_='unique')
op.drop_column('users', 'username')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('users', sa.Column('username', sa.VARCHAR(), autoincrement=False, nullable=False))
op.create_unique_constraint('users_username_key', 'users', ['username'])
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""добавляет каскадное удаление моделей уровней

Revision ID: c4fba311583c
Revises: 5b1fc71a077e
Create Date: 2023-12-05 22:47:33.455372

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'c4fba311583c'
down_revision: Union[str, None] = '5b1fc71a077e'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('answer_options_question_id_fkey', 'answer_options', type_='foreignkey')
op.create_foreign_key(None, 'answer_options', 'questions', ['question_id'], ['id'], ondelete='CASCADE')
op.drop_constraint('levels_module_id_fkey', 'levels', type_='foreignkey')
op.create_foreign_key(None, 'levels', 'modules', ['module_id'], ['id'], ondelete='CASCADE')
op.drop_constraint('modules_map_id_fkey', 'modules', type_='foreignkey')
op.create_foreign_key(None, 'modules', 'maps', ['map_id'], ['id'], ondelete='CASCADE')
op.drop_constraint('questions_task_id_fkey', 'questions', type_='foreignkey')
op.create_foreign_key(None, 'questions', 'task_units', ['task_id'], ['id'], ondelete='CASCADE')
op.drop_constraint('task_units_level_id_fkey', 'task_units', type_='foreignkey')
op.create_foreign_key(None, 'task_units', 'levels', ['level_id'], ['id'], ondelete='CASCADE')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'task_units', type_='foreignkey')
op.create_foreign_key('task_units_level_id_fkey', 'task_units', 'levels', ['level_id'], ['id'])
op.drop_constraint(None, 'questions', type_='foreignkey')
op.create_foreign_key('questions_task_id_fkey', 'questions', 'task_units', ['task_id'], ['id'])
op.drop_constraint(None, 'modules', type_='foreignkey')
op.create_foreign_key('modules_map_id_fkey', 'modules', 'maps', ['map_id'], ['id'])
op.drop_constraint(None, 'levels', type_='foreignkey')
op.create_foreign_key('levels_module_id_fkey', 'levels', 'modules', ['module_id'], ['id'])
op.drop_constraint(None, 'answer_options', type_='foreignkey')
op.create_foreign_key('answer_options_question_id_fkey', 'answer_options', 'questions', ['question_id'], ['id'])
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""добавляет каскадное удаление блоков теории

Revision ID: 2f3cf6083f65
Revises: c4fba311583c
Create Date: 2023-12-05 22:50:06.893743

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '2f3cf6083f65'
down_revision: Union[str, None] = 'c4fba311583c'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('theory_units_level_id_fkey', 'theory_units', type_='foreignkey')
op.create_foreign_key(None, 'theory_units', 'levels', ['level_id'], ['id'], ondelete='CASCADE')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'theory_units', type_='foreignkey')
op.create_foreign_key('theory_units_level_id_fkey', 'theory_units', 'levels', ['level_id'], ['id'])
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
"""добавляет отчество для сотрудника

Revision ID: e3d254cf74f4
Revises: 2f3cf6083f65
Create Date: 2023-12-05 23:10:14.243329

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'e3d254cf74f4'
down_revision: Union[str, None] = '2f3cf6083f65'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('employees', sa.Column('patronymic', sa.String(length=255), nullable=False))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('employees', 'patronymic')
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""дополняет таблицы заданий

Revision ID: 920ca0aa0ea3
Revises: e3d254cf74f4
Create Date: 2023-12-11 20:40:52.871135

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '920ca0aa0ea3'
down_revision: Union[str, None] = 'e3d254cf74f4'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'question_types', ['SingleChoice', 'MultipleChoice', 'Open'],
[('questions', 'type')],
enum_values_to_rename=[])
op.sync_enum_values('public', 'task_types', ['Test', 'Discussion'],
[('task_units', 'type')],
enum_values_to_rename=[])
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.sync_enum_values('public', 'task_types', ['Test'],
[('task_units', 'type')],
enum_values_to_rename=[])
op.sync_enum_values('public', 'question_types', ['SingleChoice', 'MultipleChoice'],
[('questions', 'type')],
enum_values_to_rename=[])
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""добавляет монеты сотруднику

Revision ID: 753c2ee49c0d
Revises: 920ca0aa0ea3
Create Date: 2023-12-16 18:26:49.202369

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '753c2ee49c0d'
down_revision: Union[str, None] = '920ca0aa0ea3'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('ix_oauth_account_account_id', table_name='oauth_account')
op.drop_index('ix_oauth_account_oauth_name', table_name='oauth_account')
op.drop_table('oauth_account')
op.add_column('employees', sa.Column('coins', sa.Integer(), nullable=False))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('employees', 'coins')
op.create_table('oauth_account',
sa.Column('user_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('oauth_name', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
sa.Column('access_token', sa.VARCHAR(length=1024), autoincrement=False, nullable=False),
sa.Column('expires_at', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('refresh_token', sa.VARCHAR(length=1024), autoincrement=False, nullable=True),
sa.Column('account_id', sa.VARCHAR(length=320), autoincrement=False, nullable=False),
sa.Column('account_email', sa.VARCHAR(length=320), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], name='oauth_account_user_id_fkey', ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name='oauth_account_pkey')
)
op.create_index('ix_oauth_account_oauth_name', 'oauth_account', ['oauth_name'], unique=False)
op.create_index('ix_oauth_account_account_id', 'oauth_account', ['account_id'], unique=False)
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
"""добавляет отчество сотрдуникам и куратору

Revision ID: ee38e6a7803e
Revises: 753c2ee49c0d
Create Date: 2023-12-16 18:32:42.403504

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'ee38e6a7803e'
down_revision: Union[str, None] = '753c2ee49c0d'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('tutors', sa.Column('patronymic', sa.String(length=255), nullable=False))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('tutors', 'patronymic')
# ### end Alembic commands ###
2 changes: 1 addition & 1 deletion backend/src/auth/base_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def get_jwt_strategy() -> JWTStrategy:
return JWTStrategy(secret=Settings.secret_jwt, lifetime_seconds=60 * 60)


cookie_transport = CookieTransport(cookie_name="adaptify", cookie_max_age=60 * 60)
cookie_transport = CookieTransport(cookie_name="adaptify", cookie_max_age=60 * 60, cookie_secure=False)

auth_backend = AuthenticationBackend(
name="jwt",
Expand Down
36 changes: 24 additions & 12 deletions backend/src/game/dependencies.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
from repository.level_repository import LevelRepository
from repository.map_repository import MapRepository
from repository.module_repository import ModuleRepository
from repository.question_repository import QuestionRepository
from repository.task_unit_repository import TaskUnitRepository
from repository.theory_unit_repository import TheoryUnitRepository
from services.level_service import LevelService
from services.map_service import MapService
from services.module_service import ModuleService
from services.question_service import QuestionService
from services.task_unit_service import TaskUnitService
from services.theory_unit_service import TheoryUnitService
from repository.game.level_repository import LevelRepository
from repository.game.map_repository import MapRepository
from repository.game.module_repository import ModuleRepository
from repository.game.units.answer_option_repository import AnswerOptionRepository
from repository.game.units.employee_task_repository import EmployeeTaskRepository
from repository.game.units.question_repository import QuestionRepository
from repository.game.units.task_unit_repository import TaskUnitRepository
from repository.game.units.theory_unit_repository import TheoryUnitRepository
from services.game.level_service import LevelService
from services.game.map_service import MapService
from services.game.module_service import ModuleService
from services.game.units.answer_option_service import AnswerOptionService
from services.game.units.employee_task_service import EmployeeTaskService
from services.game.units.question_service import QuestionService
from services.game.units.task_unit_service import TaskUnitService
from services.game.units.theory_unit_service import TheoryUnitService


def map_service() -> MapService:
Expand All @@ -28,9 +32,17 @@ def task_unit_service() -> TaskUnitService:
return TaskUnitService(TaskUnitRepository)


def employee_task_service() -> EmployeeTaskService:
return EmployeeTaskService(EmployeeTaskRepository)


def theory_unit_service() -> TheoryUnitService:
return TheoryUnitService(TheoryUnitRepository)


def question_service() -> QuestionService:
return QuestionService(QuestionRepository)


def answer_option_service() -> AnswerOptionService:
return AnswerOptionService(AnswerOptionRepository)
12 changes: 7 additions & 5 deletions backend/src/game/levels/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from game.units import TaskUnit, TheoryUnit

if typing.TYPE_CHECKING:
from game.modules.models import Module
from game.modules.models import Level
from game.units.tasks.models import TaskUnit
from game.units.theory.models import TheoryUnit

Expand All @@ -20,14 +20,16 @@ class Level(BaseModel):
__tablename__ = 'levels'

id: Mapped[uuid.UUID] = mapped_column(UUID, primary_key=True, default=uuid.uuid4)
module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'))
module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id', ondelete="CASCADE"))
title: Mapped[str] = mapped_column(String(length=255), nullable=False)

module: Mapped["Module"] = relationship(back_populates='levels')
module: Mapped["Level"] = relationship(back_populates='levels')

theory_units: Mapped[list["TheoryUnit"]] = relationship(back_populates='level', lazy='selectin')
theory_units: Mapped[list["TheoryUnit"]] = relationship(
back_populates='level', lazy='selectin', cascade='all, delete-orphan')

task_units: Mapped[list["TaskUnit"]] = relationship(back_populates='level', lazy='selectin')
task_units: Mapped[list["TaskUnit"]] = relationship(
back_populates='level', lazy='selectin', cascade='all, delete-orphan')

def to_read_schema(self) -> LevelRead:
return LevelRead(id=self.id,
Expand Down
2 changes: 1 addition & 1 deletion backend/src/game/levels/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ async def post_level_to_module(map_id: UUID,
module_id: UUID,
level_create: LevelCreate,
level_service: LevelServiceType) -> LevelRead:
return await level_service.create_one(level_create)
return await level_service.create_one(module_id, level_create)


@router.delete("/maps/{map_id}/modules/{module_id}/levels/{level_id}/")
Expand Down
Loading