First Commit
This commit is contained in:
commit
ce0758fbbb
496 changed files with 52062 additions and 0 deletions
149
quiz/views.py
Normal file
149
quiz/views.py
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
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})
|
||||
Loading…
Add table
Add a link
Reference in a new issue