Skip to content

Commit

Permalink
Feature/549 response tracking (#641)
Browse files Browse the repository at this point in the history
* Track user quiz question responses.

* Update tests.
  • Loading branch information
john-labbate authored Sep 13, 2024
1 parent 7fa0243 commit dda77ed
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 2 deletions.
32 changes: 32 additions & 0 deletions alembic/versions/12049328fd0a_add_results_to_quiz_completions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""add results to quiz completions
Revision ID: 12049328fd0a
Revises: 291331bea272
Create Date: 2024-09-11 10:23:37.753893
"""
from alembic import op
from sqlalchemy.dialects import postgresql
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '12049328fd0a'
down_revision = '291331bea272'
branch_labels = None
depends_on = None


def upgrade():
# Add the 'responses' column
op.add_column('quiz_completions', sa.Column(
'responses',
postgresql.JSONB(astext_type=sa.Text()),
nullable=False,
server_default=sa.text("'{}'::jsonb")
))


def downgrade():
# Remove the 'responses' column
op.drop_column('quiz_completions', 'responses')
2 changes: 2 additions & 0 deletions training/models/quiz_completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from training.models import Base
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy import ForeignKey, func
from typing import Any


class QuizCompletion(Base):
Expand All @@ -12,3 +13,4 @@ class QuizCompletion(Base):
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
passed: Mapped[bool] = mapped_column()
submit_ts: Mapped[datetime] = mapped_column(server_default=func.now())
responses: Mapped[dict[str, Any]] = mapped_column()
3 changes: 2 additions & 1 deletion training/repositories/quiz_completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ def create(self, quiz_completion: schemas.QuizCompletionCreate) -> models.QuizCo
return self.save(models.QuizCompletion(
quiz_id=quiz_completion.quiz_id,
user_id=quiz_completion.user_id,
passed=quiz_completion.passed
passed=quiz_completion.passed,
responses=quiz_completion.responses
))
2 changes: 2 additions & 0 deletions training/schemas/quiz_completion.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from datetime import datetime
from pydantic import ConfigDict, BaseModel
from typing import Any


class QuizCompletionBase(BaseModel):
quiz_id: int
user_id: int
passed: bool
responses: dict[str, Any]


class QuizCompletionCreate(QuizCompletionBase):
Expand Down
3 changes: 3 additions & 0 deletions training/services/quiz.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,13 @@ def grade(self, quiz_id: int, user_id: int, submission: QuizSubmission) -> QuizG
quiz_completion_id=None
)

responses_dict = submission.model_dump()

result = self.quiz_completion_repo.create(QuizCompletionCreate(
quiz_id=quiz_id,
user_id=user_id,
passed=grade.passed,
responses=responses_dict
))

grade.quiz_completion_id = result.id
Expand Down
3 changes: 2 additions & 1 deletion training/tests/test_quiz_completion_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ def valid_quiz_completion_create(
return schemas.QuizCompletionCreate(
quiz_id=valid_quiz_ids[-1],
user_id=valid_user_ids[-1],
passed=True
passed=True,
responses=dict([{'question_id': 0, 'response_ids': [1]}, {'question_id': 1, 'response_ids': [1]}, {'question_id': 2, 'response_ids': [2]}])
)


Expand Down

0 comments on commit dda77ed

Please sign in to comment.