Commit e7027a12 authored by Martin Juhás's avatar Martin Juhás
Browse files

feat: add option for questionnaire submission feedback and various fixes

### Additions

* added new field `correct: CorrectnessStatus!` to `QuestionnaireSubmissionInterface`

### Changes

* renamed `QuestionnaireAnswerState` enum to `CorrectnessStatus`

Closes #542
parent c5942adb
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
FROM python:3.8-alpine AS builder
FROM python:3.8-slim AS builder

ENV POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_IN_PROJECT=1 \
@@ -7,9 +7,11 @@ ENV POETRY_NO_INTERACTION=1 \

WORKDIR /backend

# Install poetry
RUN apk add gcc musl-dev libffi-dev && \
    rm -rf /var/cache/apk/
# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc g++ build-essential && \
    rm -rf /var/lib/apt/lists/*

RUN pip install poetry==1.8.2 --no-cache

# Install dependencies and prepare app for run
@@ -19,14 +21,11 @@ RUN poetry config installer.max-workers 5 && \
    poetry install --no-interaction --no-ansi -vvv --without dev --compile && \
    rm -rf ${POETRY_CACHE_DIR}

FROM python:3.8-alpine AS runner
FROM python:3.8-slim AS runner

ENV VIRTUAL_ENV=/backend/.venv \
    PATH="/backend/.venv/bin:$PATH"

RUN apk add musl libffi && \
    rm -rf /var/cache/apk/

COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}

# Copy files to work directory, then cleanup unnecessary junk
+4 −3
Original line number Diff line number Diff line
FROM python:3.8-alpine
FROM python:3.8-slim

ENV POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_IN_PROJECT=1 \
@@ -8,8 +8,9 @@ ENV POETRY_NO_INTERACTION=1 \
WORKDIR /backend

# Install poetry
RUN apk add gcc musl-dev libffi-dev && \
    rm -rf /var/cache/apk/
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc g++ build-essential && \
    rm -rf /var/lib/apt/lists/*

RUN pip install poetry==1.8.2 --no-cache

+2 −4
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ from exercise.models import TeamQuestionnaireState
from exercise_definition.models import QuestionTypes, Feature, InjectTypes
from running_exercise.models import (
    LogType,
    QuestionnaireAnswerStatus,
    CorrectnessStatus,
    MilestoneModificationDetails,
)
from user.models import User, EndpointPermissions
@@ -44,8 +44,6 @@ InjectTypeEnum = graphene.Enum.from_enum(InjectTypes)
LogTypeEnum = graphene.Enum.from_enum(LogType)
QuestionTypeEnum = graphene.Enum.from_enum(QuestionTypes)
ConfigFeatureEnum = graphene.Enum.from_enum(Feature)
QuestionnaireAnswerStateEnum = graphene.Enum.from_enum(
    QuestionnaireAnswerStatus
)
CorrectnessStatusEnum = graphene.Enum.from_enum(CorrectnessStatus)
CauseTypeEnum = graphene.Enum.from_enum(MilestoneModificationDetails.CauseType)
EndpointPermissionsEnum = graphene.Enum.from_enum(EndpointPermissions)
+21 −4
Original line number Diff line number Diff line
@@ -18,12 +18,12 @@ from common_lib.schema.enums import (
    QuestionnaireStateEnum,
    QuestionTypeEnum,
    ConfigFeatureEnum,
    QuestionnaireAnswerStateEnum,
    ExerciseStateEnum,
    LogTypeEnum,
    InjectTypeEnum,
    CauseTypeEnum,
    EndpointPermissionsEnum,
    CorrectnessStatusEnum,
)
from common_lib.schema.inputs import TimeIntervalType
from common_lib.utils import ensure_all_exist, ensure_exists
@@ -80,7 +80,7 @@ from running_exercise.models import (
    InjectDetails,
    CustomInjectDetails,
    QuestionnaireAnswer,
    QuestionnaireAnswerStatus,
    CorrectnessStatus,
    InstructorComment,
    LogType,
    QuestionnaireSubmission,
@@ -635,12 +635,12 @@ class QuestionnaireAnswerType(DjangoObjectType):
    class Meta:
        model = QuestionnaireAnswer

    correct = graphene.Field(QuestionnaireAnswerStateEnum, required=True)
    correct = graphene.Field(CorrectnessStatusEnum, required=True)

    def resolve_correct(self, info):
        user = user_from_context(info.context)
        if user.group == User.AuthGroup.TRAINEE:
            return QuestionnaireAnswerStatus.UNKNOWN
            return CorrectnessStatus.UNKNOWN

        return self.correct

@@ -912,10 +912,27 @@ class QuestionnaireSubmissionInterface(graphene.Interface):
    )
    attempt = graphene.Int(required=True)
    accepted = graphene.Boolean(required=True)
    correct = graphene.Field(CorrectnessStatusEnum, required=True)
    answers = graphene.List(
        graphene.NonNull(QuestionnaireAnswerType), required=True
    )

    def resolve_correct(self, info):
        access = get_access_for_team(
            info.context, self.team_questionnaire_state.team_id
        )

        if access is None:
            return CorrectnessStatus.UNKNOWN

        if (
            access.group == User.AuthGroup.TRAINEE
            and not self.team_questionnaire_state.questionnaire.show_feedback
        ):
            return CorrectnessStatus.UNKNOWN

        return self.correct

    def resolve_answers(self, info):
        return self.answers.all()

+10 −0
Original line number Diff line number Diff line
## 0.24.7
Issues: inject/backend#542

Added an option to questionnaires to show the correctness of a questionnaire submission.

### questionnaires.yml

- added new optional field `show_feedback`


## 0.24.6
Issues: inject/backend#544, inject/inject-issues#240

Loading