Skip to content

Commit

Permalink
Merge branch 'reward-for-completing-task-v1' into backend
Browse files Browse the repository at this point in the history
  • Loading branch information
codEnjoyer committed Dec 16, 2023
2 parents 88a53fc + db6fd87 commit 8ee210e
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 25 deletions.
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 ###
56 changes: 39 additions & 17 deletions backend/src/game/units/tasks/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
from fastapi import APIRouter

from game.units.tasks.enums import TaskStates
from game.units.tasks.questions.answers.schemas import EmployeeAnswerRead
from game.units.tasks.questions.answers.schemas import EmployeeAnswerRead, EmployeeAnswerPost
from game.units.tasks.questions.schemas import EmployeeTestQuestionPost, EmployeeTestQuestionRead, \
EmployeeOpenQuestionPost
from game.units.tasks.schemas import TestTaskUnitRead, TestTaskUnitCreate, TestTaskUnitUpdate, DiscussionTaskUnitCreate, \
DiscussionTaskUnitRead, DiscussionTaskUnitUpdate, EmployeeTaskRead
from utils.types import TaskUnitServiceType, AnswerOptionServiceType, EmployeeTaskServiceType
from users.employees.schemas import EmployeeUpdate
from utils.types import TaskUnitServiceType, AnswerOptionServiceType, EmployeeTaskServiceType, CurrentUser, \
EmployeeServiceType

router = APIRouter(tags=["Task"])

Expand All @@ -34,24 +36,44 @@ async def autocheck_task_unit(map_id: UUID,
level_id: UUID,
task_id: UUID,
employee_questions_answers: list[EmployeeTestQuestionPost],
answer_option_service: AnswerOptionServiceType) -> list[EmployeeTestQuestionRead]:
result = []
answer_option_service: AnswerOptionServiceType,
task_unit_service: TaskUnitServiceType,
user: CurrentUser,
employee_service: EmployeeServiceType) -> list[EmployeeTestQuestionRead]:
result, answers_correctness = await get_all_answers(employee_questions_answers, answer_option_service, task_id)
if all(answers_correctness):

reward = (await task_unit_service.get_one(task_id)).score_reward
await employee_service.update_one(user.employee.id, EmployeeUpdate(coins=user.employee.coins + reward))
return result


async def get_all_answers(
employee_questions_answers: list[EmployeeTestQuestionPost],
answer_option_service: AnswerOptionServiceType,
task_id: UUID) -> (list[EmployeeTestQuestionRead], list[bool]):
result, answers_correctness = [], []
for question_answer in employee_questions_answers:
user_answers_on_question = question_answer.answers
correct_answers_ids_on_question = await answer_option_service.get_all_correct(question_answer.id)
correct_answers_ids_on_question = set(correct_answers_ids_on_question)
question_read_answers = []
for answer in user_answers_on_question:
correct_answer_selected = answer.is_selected and answer.id in correct_answers_ids_on_question
incorrect_answer_not_selected = not answer.is_selected and answer.id not in correct_answers_ids_on_question
answer_was_selected_correct = correct_answer_selected or incorrect_answer_not_selected
answer_read = EmployeeAnswerRead(answer=answer.answer, was_selected_correct=answer_was_selected_correct)
question_read_answers.append(answer_read)
question_read = EmployeeTestQuestionRead(type=question_answer.type,
question=question_answer.question,
results=question_read_answers)
result.append(question_read)
return result
for answer in question_answer.answers:
answer_was_selected_correct = is_answer_selected_correct(answer, set(correct_answers_ids_on_question))

answers_correctness.append(answer_was_selected_correct)
question_read_answers.append(EmployeeAnswerRead(answer=answer.answer,
was_selected_correct=answer_was_selected_correct))
result.append(EmployeeTestQuestionRead(id=question_answer.id,
task_id=task_id,
type=question_answer.type,
question=question_answer.question,
results=question_read_answers))
return result, answers_correctness


def is_answer_selected_correct(answer: EmployeeAnswerPost, correct_answers_ids_on_question: set[UUID]) -> bool:
correct_answer_selected = answer.is_selected and answer.id in correct_answers_ids_on_question
incorrect_answer_not_selected = not answer.is_selected and answer.id not in correct_answers_ids_on_question
return correct_answer_selected or incorrect_answer_not_selected


@router.post("/maps/{map_id}/modules/{module_id}/levels/{level_id}/tasks/{task_id}/review/")
Expand Down
6 changes: 4 additions & 2 deletions backend/src/users/employees/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import uuid
import datetime

from sqlalchemy import UUID, String, Date, func, ForeignKey
from sqlalchemy import UUID, String, Date, func, ForeignKey, Integer
from sqlalchemy.orm import Mapped, mapped_column, relationship

from database import BaseModel
Expand All @@ -25,6 +25,7 @@ class Employee(BaseModel):
last_name: Mapped[str] = mapped_column(String(length=255), nullable=False)
patronymic: Mapped[str] = mapped_column(String(length=255))
hired_at: Mapped[datetime.date] = mapped_column(Date, server_default=func.current_date(), nullable=False)
coins: Mapped[int] = mapped_column(Integer, default=0)

user: Mapped["User"] = relationship(back_populates='employee', lazy='selectin')
tutor: Mapped["Tutor"] = relationship(back_populates='employees', lazy='selectin')
Expand All @@ -38,5 +39,6 @@ def to_read_schema(self) -> EmployeeRead:
tutor_id=self.tutor_id,
name=self.name,
last_name=self.last_name,
patronymic=self.patronymic,
hired_at=self.hired_at,
)
coins=self.coins)
5 changes: 4 additions & 1 deletion backend/src/users/employees/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ class __EmployeeBase(BaseModel):
name: str
last_name: str
hired_at: dt.date
patronymic: str
coins: int

model_config = ConfigDict(from_attributes=True)

Expand All @@ -25,8 +27,9 @@ class EmployeeCreate(__EmployeeBase):


class EmployeeUpdate(__EmployeeBase):
user_id: UUID | None = None
tutor_id: UUID | None = None
name: str | None = None
last_name: str | None = None
patronymic: str | None = None
hired_at: dt.date | None = None
coins: int | None = None
6 changes: 4 additions & 2 deletions backend/src/users/tutors/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ class Tutor(BaseModel):
user_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('users.id'), nullable=False)
name: Mapped[str] = mapped_column(String(length=255), nullable=False)
last_name: Mapped[str] = mapped_column(String(length=255), nullable=False)
patronymic: Mapped[str] = mapped_column(String(length=255))

user: Mapped["User"] = relationship(back_populates='tutor', lazy='selectin')
employees: Mapped[list["Employee"]] = relationship(back_populates='tutor', lazy='selectin')

def to_read_schema(self) -> TutorRead:
return TutorRead(id=self.id,
name=self.name,
user=self.user,
last_name=self.last_name)
last_name=self.last_name,
patronymic=self.patronymic,
user=self.user)
8 changes: 5 additions & 3 deletions backend/src/users/tutors/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
class __TutorBase(BaseModel):
name: str
last_name: str
patronymic: str

model_config = ConfigDict(from_attributes=True)

Expand All @@ -22,6 +23,7 @@ class TutorCreate(__TutorBase):


class TutorUpdate(__TutorBase):
name: str | None = None
last_name: str | None = None
user_id: UUID | None = None
name: str | None
last_name: str | None
user_id: UUID | None
patronymic: str | None

0 comments on commit 8ee210e

Please sign in to comment.