Add basic quiz functionality

This commit is contained in:
2024-11-23 22:25:24 +01:00
parent 6bf0a56b88
commit 27b8c40c1c
40 changed files with 2471 additions and 53 deletions

View File

@@ -0,0 +1 @@
from .selectseasonview import SelectSeasonView

View File

@@ -0,0 +1,51 @@
from crispy_forms.helper import FormHelper
from django import forms
from django.http import Http404
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from ..models import Season, Candidate
class EnterNameForm(forms.Form):
name = forms.CharField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
class EnterNameView(View):
template_name = "quiz/enter_name.html"
forms_class = EnterNameForm
def get(self, request, season: Season, *args, **kwargs):
if season.active_quiz == None:
raise Http404("No quiz active")
return render(
request,
self.template_name,
{"form": self.forms_class(), "season": season},
)
def post(self, request, season: Season, *args, **kwargs):
name = request.POST.get("name")
if season.preregister_candidates:
try:
candidate = Candidate.objects.get(season=season, name=name)
except Candidate.DoesNotExist:
raise Http404("Candidate not found")
else:
candidate, created = Candidate.objects.get_or_create(
season=season, name=name
)
return redirect(
reverse(
"question",
kwargs={"candidate": candidate},
)
)

View File

@@ -0,0 +1,44 @@
from django.contrib import messages
from django.core.exceptions import BadRequest
from django.http import Http404, HttpRequest, HttpResponse
from django.shortcuts import render
from django.utils.translation import gettext as _
from django.views import View
from ..models import Candidate, Answer, GivenAnswer
from ..models.question import NoActiveTestForSeason
class QuestionView(View):
template_name = "quiz/question.html"
def get(
self, request: HttpRequest, candidate: Candidate, *args, **kwargs
) -> HttpResponse:
try:
question = candidate.get_next_question(candidate)
except NoActiveTestForSeason:
messages.error(request, _("No active Quiz for season"))
raise Http404("No active Quiz for seaon")
return render(
request,
"quiz/question.html",
{"candidate": candidate, "question": question},
)
def post(self, request: HttpRequest, candidate: Candidate, *args, **kwargs):
answer_id = request.POST.get("answer")
if answer_id == None:
raise BadRequest
try:
answer = Answer.objects.get(id=answer_id)
except Answer.DoesNotExist:
raise BadRequest
GivenAnswer.objects.create(
candidate=candidate, question=answer.question, answer=answer
)
return self.get(request, candidate, args, kwargs)

View File

@@ -0,0 +1,29 @@
from crispy_forms.helper import FormHelper
from django.http import Http404
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic.edit import FormView
from django import forms
from ..models import Season
class SelectSeasonForm(forms.Form):
code = forms.CharField(max_length=5)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
class SelectSeasonView(FormView):
form_class = SelectSeasonForm
template_name = "quiz/select_season.html"
def form_valid(self, form):
try:
season = Season.objects.get(season_code=form.cleaned_data["code"].upper())
except Season.DoesNotExist:
raise Http404("Season does not exist")
return redirect(reverse("quiz", kwargs={"season": season}))