from django.shortcuts import render, get_object_or_404, redirect from django.contrib.auth.decorators import login_required from .models import * from users.models import UserLevel, UserInventory from shop.models import Item from .forms import * @login_required def home(request): quizes = Quiz.objects.filter(is_active=True) my_quizes = Quiz.objects.filter(author=request.user) if request.user.is_superuser: quizes = Quiz.objects.all() # Récupérer les meilleurs scores de l'utilisateur pour chaque quiz user_scores = {} if request.user.is_authenticated: user_quiz_scores = UserQuiz.objects.filter( user=request.user ).values('quiz_id').annotate( best_score=models.Max('score') ) user_scores = {score['quiz_id']: score['best_score'] for score in user_quiz_scores} return render(request, "games/quiz/home.html", { "quizes": quizes, "my_quizes": my_quizes, "user_scores": user_scores }) @login_required def quiz(request, quiz_id): quiz = get_object_or_404(Quiz, id=quiz_id) if request.method == 'POST': # Vérifier si l'utilisateur a déjà participé à ce quiz user_quiz = UserQuiz.objects.filter(user=request.user, quiz=quiz).first() if user_quiz: # Si oui, supprimer les anciennes réponses UserAnswer.objects.filter(user_quiz=user_quiz).delete() else: # Si non, créer une nouvelle entrée user_quiz = UserQuiz.objects.create(user=request.user, quiz=quiz) score = 0 for question in quiz.questions.all(): choice_id = request.POST.get(f'question_{question.id}') if choice_id: choice = Choice.objects.get(id=choice_id) UserAnswer.objects.create( user_quiz=user_quiz, question=question, choice=choice ) if choice.is_correct: score += 1 user_quiz.score = score user_quiz.save() return redirect('quiz_result', user_quiz_id=user_quiz.id) return render(request, "games/quiz/quiz.html", { "quiz": quiz, "questions": quiz.questions.all() }) @login_required def result(request, user_quiz_id): user_quiz = get_object_or_404(UserQuiz, id=user_quiz_id, user=request.user) total_questions = user_quiz.quiz.questions.count() # Vérifiez si l'utilisateur a déjà joué à ce quiz if not UserQuiz.objects.filter(user=request.user, quiz=user_quiz.quiz).exists(): # Si c'est la première fois que l'on joue, alors on gagne 10 pièces d'or + 10 points d'expérience par réponse correcte inventory_item = UserInventory.objects.get(user=user_quiz.user, item=Item.objects.get(name='Or')) inventory_item.quantity += 10 inventory_item.save() user_level = request.user.level user_level.experience += 10 * user_quiz.score user_level.save() else: # Si l'utilisateur a déjà joué, ajoutez 1 point d'expérience par réponse correcte user_level = request.user.level user_level.experience += 1 * user_quiz.score user_level.save() return render(request, "games/quiz/result.html", { "user_quiz": user_quiz, "total_questions": total_questions, "percentage": (user_quiz.score / total_questions) * 100 if total_questions > 0 else 0 }) @login_required def create_quiz(request): form = QuizForm() if request.method == 'POST': quiz = Quiz.objects.create(author=request.user, name=request.POST.get('name'), description=request.POST.get('description'), is_active=False) return redirect('create_responses_quiz', quiz_id=quiz.id) return render(request, "games/quiz/create_quiz.html", {"form": form}) @login_required def create_responses_quiz(request, quiz_id): quiz = get_object_or_404(Quiz, id=quiz_id, author=request.user) questions = quiz.questions.all() choices = [] for question in questions: choices.append(question.choices.all()) form = QuestionForm() if request.method == 'POST': # Parcourir les données POST pour trouver les questions et réponses for key in request.POST: if key.startswith('ask-'): question_text = request.POST[key] if question_text: # Vérifie si la question n'est pas vide # Créer la question question = Question.objects.create( quiz=quiz, question=question_text ) # Récupérer le numéro de la question depuis la clé question_num = key.split('-')[1] # Chercher toutes les réponses associées à cette question response_prefix = f'response-{question_num}-' correct_response_key = f'is_correct-{question_num}' correct_response_value = request.POST.get(correct_response_key) for response_key in request.POST: if response_key.startswith(response_prefix): response_text = request.POST[response_key] if response_text: # Vérifie si la réponse n'est pas vide response_num = response_key.split('-')[-1] is_correct = (response_num == correct_response_value) Choice.objects.create( question=question, choice=response_text, is_correct=is_correct # Par défaut, aucune réponse n'est correcte ) return redirect('create_responses_quiz', quiz.id) # Redirection vers la page d'accueil return render(request, "games/quiz/create_responses_quiz.html", {"form": form, "quiz": quiz})