Filter_library
This commit is contained in:
@@ -10,3 +10,21 @@ class QuestionForm(forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = QivipQuestion
|
model = QivipQuestion
|
||||||
fields = ['quiz_id', 'data']
|
fields = ['quiz_id', 'data']
|
||||||
|
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
class QuizFilterForm(forms.Form):
|
||||||
|
search = forms.CharField(required=False, label="Suche", widget=forms.TextInput(attrs={
|
||||||
|
'class': 'flex flex-grow rounded-lg p-2' ,'placeholder': 'Suche ...',
|
||||||
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
max_amout_questions = forms.IntegerField(required=False, label="Maximale Anzahl an Fragen", widget=forms.NumberInput(attrs={
|
||||||
|
'class': 'border-2 border-gray-300 rounded-lg p-2 w-full'
|
||||||
|
}))
|
||||||
|
user = forms.CharField(required=False, label="von User", widget=forms.TextInput(attrs={
|
||||||
|
'class': 'border-2 border-gray-300 rounded-lg p-2 w-full'
|
||||||
|
}))
|
||||||
|
|
||||||
|
|||||||
@@ -7,17 +7,74 @@ from .models import QivipQuiz, QivipQuestion
|
|||||||
from .forms import QuizForm, QuestionForm
|
from .forms import QuizForm, QuestionForm
|
||||||
import json
|
import json
|
||||||
from django.core.paginator import Paginator
|
from django.core.paginator import Paginator
|
||||||
|
from .models import QivipQuiz
|
||||||
|
from .forms import QuizFilterForm
|
||||||
|
from django.db.models import Count
|
||||||
|
from django.contrib.auth.models import User
|
||||||
# Übersicht aller Quizze
|
# Übersicht aller Quizze
|
||||||
|
|
||||||
def overview_quiz(request):
|
def overview_quiz(request):
|
||||||
|
|
||||||
|
|
||||||
|
#Filter
|
||||||
|
form = QuizFilterForm(request.GET)
|
||||||
|
# GET statt POST für URL-Parameter
|
||||||
|
|
||||||
|
my_quizzes = QivipQuiz.objects.filter(user_id=request.user).annotate(max_amout_questions=Count('question'))
|
||||||
|
filter_quizzes = QivipQuiz.objects.annotate(max_amout_questions=Count('question')) # Frageanzahl berechnen
|
||||||
|
|
||||||
|
if form.is_valid():
|
||||||
|
search = form.cleaned_data.get('search')
|
||||||
|
username= form.cleaned_data.get('user')
|
||||||
|
max_amout_questions= form.cleaned_data.get('max_amout_questions')
|
||||||
|
if search: # Suche nach Namen
|
||||||
|
filter_quizzes = filter_quizzes.filter(name__icontains=search)
|
||||||
|
my_quizzes = my_quizzes.filter(name__icontains=search)
|
||||||
|
if max_amout_questions:
|
||||||
|
filter_quizzes = filter_quizzes.filter(max_amout_questions__lte=max_amout_questions)
|
||||||
|
my_quizzes = my_quizzes.filter(max_amout_questions__lte=max_amout_questions)
|
||||||
|
if username:
|
||||||
|
try:
|
||||||
|
user = User.objects.get(username=username) # Benutzer anhand des Namens holen
|
||||||
|
filter_quizzes = filter_quizzes.filter(user_id=user.id)
|
||||||
|
my_quizzes = my_quizzes.filter(user_id=user.id) # Nach der user_id filtern
|
||||||
|
except User.DoesNotExist:
|
||||||
|
filter_quizzes = QivipQuiz.objects.none() # Falls User nicht existiert, leere Query zurückgeben
|
||||||
|
my_quizzes = QivipQuiz.objects.none()
|
||||||
|
all_quizzes=filter_quizzes.exclude(user_id=request.user)
|
||||||
|
quizzes=my_quizzes
|
||||||
|
#WICHTIG: HIER sind all_quizzes nicht alle Quizze sondern die herausgefilterten Quizze
|
||||||
|
context = {
|
||||||
|
'show_search': True,
|
||||||
|
'quizzes': quizzes,
|
||||||
|
'all_quizzes': all_quizzes,
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
return render(request, 'library/overview_quiz.html', context)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
quizzes = QivipQuiz.objects.filter(user_id=request.user)
|
quizzes = QivipQuiz.objects.filter(user_id=request.user)
|
||||||
all_quizzes = QivipQuiz.objects.filter(status='öffentlich').exclude(user_id=request.user).filter(question__isnull=False).distinct()
|
all_quizzes = QivipQuiz.objects.filter(status='öffentlich').exclude(user_id=request.user).filter(question__isnull=False).distinct()
|
||||||
return render(request, 'library/overview_quiz.html', {'quizzes': quizzes, 'all_quizzes': all_quizzes})
|
context = {
|
||||||
|
'show_search': True,
|
||||||
|
'quizzes': quizzes,
|
||||||
|
'all_quizzes': all_quizzes,
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
return render(request, 'library/overview_quiz.html', context)
|
||||||
|
|
||||||
except:
|
except:
|
||||||
all_quizzes = QivipQuiz.objects.filter(status='öffentlich').filter(question__isnull=False).distinct()
|
all_quizzes = QivipQuiz.objects.filter(status='öffentlich').filter(question__isnull=False).distinct()
|
||||||
return render(request, 'library/overview_quiz.html', {'quizzes': None, 'all_quizzes': all_quizzes})
|
context = {
|
||||||
|
'show_search': True,
|
||||||
|
'quizzes': None,
|
||||||
|
'all_quizzes': all_quizzes,
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
return render(request, 'library/overview_quiz.html', context)
|
||||||
|
|
||||||
# Neues Quiz erstellen
|
# Neues Quiz erstellen
|
||||||
@login_required
|
@login_required
|
||||||
|
|||||||
@@ -1,9 +1,28 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="flex justify-end mr-2">
|
<div class="flex justify-end mr-2">
|
||||||
<a href="{% url 'library:new_quiz' %}" class="mt-2 p-2 shadow-md border-blue-600 border-2 rounded-md text-black mb-12">Neues Quiz erstellen</a>
|
<a href="{% url 'library:new_quiz' %}" class="mt-2 p-2 shadow-md border-blue-600 border-2 rounded-md text-black mb-12">Neues Quiz erstellen</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="w-screen flex justify-center items-center">
|
||||||
|
<div class="w-full m-4 border-blue-600 border-2 rounded-xl shadow-md p-6 lg:w-1/4">
|
||||||
|
<form method="get" class="flex flex-col space-y-4">
|
||||||
|
<h1 class="text-xl font-bold">Filter</h1>
|
||||||
|
Maximale Anzahl an Fragen {{ form.max_amout_questions }}
|
||||||
|
von User {{ form.user }}
|
||||||
|
<!-- Rendert die Form-Felder -->
|
||||||
|
<button type="submit" class="qp-a-button-small border-2 border-blue-600 text-black">Filtern</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if quizzes %}
|
{% if quizzes %}
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 px-4 place-items-center">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 px-4 place-items-center">
|
||||||
<h1 class="font-bold mb-4 px-4 bg-blue-100">meine eigenen Quiz</h1></div>
|
<h1 class="font-bold mb-4 px-4 bg-blue-100">meine eigenen Quiz</h1></div>
|
||||||
@@ -31,7 +50,7 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
{% if all_quizzes %}
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 px-4 place-items-center">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 px-4 place-items-center">
|
||||||
<h1 class="font-bold px-4 bg-blue-100 mt-8 mb-4">Quiz von anderen Nutzern</h1></div>
|
<h1 class="font-bold px-4 bg-blue-100 mt-8 mb-4">Quiz von anderen Nutzern</h1></div>
|
||||||
|
|
||||||
@@ -55,7 +74,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<div class="text-center font-bold">Es wurde kein passendes Quiz von einem anderen Nutzer gefunden.</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,10 +1,27 @@
|
|||||||
<nav class="flex justify-between bg-blue-600 h-12 px-4 sm:px-6 lg:px-8 rounded-lg m-2 shadow-md">
|
<nav class="flex justify-between items-center bg-blue-600 h-12 px-4 sm:px-6 lg:px-8 rounded-lg m-2 shadow-md overflow-x-auto whitespace-nowrap">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center flex-shrink-0">
|
||||||
<h2 class="text-xl font-bold text-white hover:scale-110 transition duration-200"><a href="{% url 'homepage:home' %}">qivip</a></h2>
|
<h2 class="text-xl font-bold text-white hover:scale-110 transition duration-200">
|
||||||
|
<a href="{% url 'homepage:home' %}">qivip</a>
|
||||||
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
|
||||||
|
{% if show_search %}
|
||||||
|
<form method="get" class="mr-2 ml-2 flex items-center w-full max-w-sm bg-white rounded-full px-4 py-1 shadow-md">
|
||||||
|
<input type="text" name="search" placeholder="Suche ..." value="{{ request.GET.search }}"
|
||||||
|
class="w-full px-3 py-1 text-black bg-transparent focus:outline-none">
|
||||||
|
<button type="submit" class=" py-1 text-blue-600">
|
||||||
|
🔍
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="flex items-center space-x-4">
|
||||||
<ul class="flex space-x-4 qp-nav-list">
|
<ul class="flex space-x-4 qp-nav-list">
|
||||||
|
{% if show_search %}
|
||||||
|
<li class="hidden md:flex"><a href="{% url 'library:overview_quiz' %}">Bibliothek</a></li>
|
||||||
|
{% else%}
|
||||||
<li><a href="{% url 'library:overview_quiz' %}">Bibliothek</a></li>
|
<li><a href="{% url 'library:overview_quiz' %}">Bibliothek</a></li>
|
||||||
|
{% endif %}
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<li><a href="{% url 'accounts:home' %}">Konto</a></li>
|
<li><a href="{% url 'accounts:home' %}">Konto</a></li>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
Reference in New Issue
Block a user