1
0
This commit is contained in:
2025-12-22 03:19:48 +01:00
parent d6bd08d11f
commit f1c93c47b6
16 changed files with 288 additions and 31 deletions

View File

@@ -1,8 +1,11 @@
from django.http import HttpResponse
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.views.decorators.http import require_http_methods
from django.db.models import Q
from .models import Question, QuizResult, Tag
from .forms import CreateQuizForm
def handle_tag_filter(request):
@@ -14,6 +17,35 @@ def handle_tag_filter(request):
else:
request.session['quiz_tag'] = tag_slug
def create_quiz(request):
if request.method == 'POST':
form = CreateQuizForm(request.POST)
if form.is_valid():
# clear existing session data
keys_to_clear = ['quiz_filter_course_id', 'quiz_filter_tag_ids', 'quiz_filter_types', 'quiz_tag']
for key in keys_to_clear:
if key in request.session:
del request.session[key]
course = form.cleaned_data.get('course')
tags = form.cleaned_data.get('tags')
question_types = form.cleaned_data.get('question_type')
if course:
request.session['quiz_filter_course_id'] = course.id
if tags:
request.session['quiz_filter_tag_ids'] = list(tags.values_list('id', flat=True))
if question_types:
request.session['quiz_filter_types'] = question_types
return redirect('next_question')
else:
form = CreateQuizForm()
return render(request, 'quiz_create.html', {'form': form})
def index(request):
handle_tag_filter(request)
total_questions = Question.objects.count()
@@ -33,13 +65,40 @@ def get_next_question(request):
handle_tag_filter(request)
current_tag = request.session.get('quiz_tag')
# New filters
filter_course_id = request.session.get('quiz_filter_course_id')
filter_tag_ids = request.session.get('quiz_filter_tag_ids')
filter_types = request.session.get('quiz_filter_types')
answered_ids = QuizResult.objects.filter(user=request.quiz_user).values_list('question_id', flat=True)
questions = Question.objects.exclude(id__in=answered_ids)
# Apply filters
if current_tag:
questions = questions.filter(tags__slug=current_tag)
if filter_course_id:
questions = questions.filter(exam__course_id=filter_course_id)
if filter_tag_ids:
questions = questions.filter(tags__id__in=filter_tag_ids)
if filter_types:
# "single" -> no comma
# "multi" -> comma
q_objs = Q()
if 'single' in filter_types:
q_objs |= ~Q(correct_answer__contains=',')
if 'multi' in filter_types:
q_objs |= Q(correct_answer__contains=',')
if q_objs:
questions = questions.filter(q_objs)
# Distinguish questions based on filters to ensure we don't get duplicates if filtering by many-to-many
questions = questions.distinct()
next_question = questions.first()