diff --git a/django/library/admin.py b/django/library/admin.py index 685ee1c..7d617a5 100644 --- a/django/library/admin.py +++ b/django/library/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import QivipQuiz, QivipQuestion, QuizCategory +from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite, QuizCategory # Für das QivipQuiz Modell class QivipQuizAdmin(admin.ModelAdmin): @@ -18,13 +18,13 @@ class QuizCategoryAdmin(admin.ModelAdmin): search_fields = ('name',) prepopulated_fields = {'slug': ('name',)} # Erstelle automatisch den Slug basierend auf dem Namen -# Für das Tag Modell -class TagAdmin(admin.ModelAdmin): - list_display = ('name',) # Zeige nur den Namen des Tags - search_fields = ('name',) + + +class QivipQuizFavoriteAdmin(admin.ModelAdmin): + list_display = ('user', 'favorite', 'quiz') # Welche Felder sollen in der Übersicht angezeigt werden # Registrierung der Modelle im Admin admin.site.register(QivipQuiz, QivipQuizAdmin) admin.site.register(QivipQuestion, QivipQuestionAdmin) admin.site.register(QuizCategory, QuizCategoryAdmin) - +admin.site.register(QivipQuizFavorite, QivipQuizFavoriteAdmin) diff --git a/django/library/migrations/0035_qivipquiz_favorite.py b/django/library/migrations/0035_qivipquiz_favorite.py new file mode 100644 index 0000000..756b801 --- /dev/null +++ b/django/library/migrations/0035_qivipquiz_favorite.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-04-10 14:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0034_alter_qivipquiz_status'), + ] + + operations = [ + migrations.AddField( + model_name='qivipquiz', + name='favorite', + field=models.BooleanField(default=False), + ), + ] diff --git a/django/library/migrations/0036_remove_qivipquiz_favorite_quizfavorite.py b/django/library/migrations/0036_remove_qivipquiz_favorite_quizfavorite.py new file mode 100644 index 0000000..f0efab0 --- /dev/null +++ b/django/library/migrations/0036_remove_qivipquiz_favorite_quizfavorite.py @@ -0,0 +1,32 @@ +# Generated by Django 5.1.7 on 2025-04-10 16:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0035_qivipquiz_favorite'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RemoveField( + model_name='qivipquiz', + name='favorite', + ), + migrations.CreateModel( + name='QuizFavorite', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('favorite', models.BooleanField(default=False)), + ('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='library.qivipquiz')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user', 'quiz')}, + }, + ), + ] diff --git a/django/library/migrations/0037_rename_quizfavorite_qivipquizfavorite.py b/django/library/migrations/0037_rename_quizfavorite_qivipquizfavorite.py new file mode 100644 index 0000000..6eb61d5 --- /dev/null +++ b/django/library/migrations/0037_rename_quizfavorite_qivipquizfavorite.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.7 on 2025-04-10 16:05 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0036_remove_qivipquiz_favorite_quizfavorite'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RenameModel( + old_name='QuizFavorite', + new_name='QivipQuizFavorite', + ), + ] diff --git a/django/library/migrations/0038_alter_qivipquizfavorite_quiz.py b/django/library/migrations/0038_alter_qivipquizfavorite_quiz.py new file mode 100644 index 0000000..1efd121 --- /dev/null +++ b/django/library/migrations/0038_alter_qivipquizfavorite_quiz.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.7 on 2025-04-10 17:08 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0037_rename_quizfavorite_qivipquizfavorite'), + ] + + operations = [ + migrations.AlterField( + model_name='qivipquizfavorite', + name='quiz', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='favorites', to='library.qivipquiz'), + ), + ] diff --git a/django/library/models.py b/django/library/models.py index 82fcc5a..2d63668 100644 --- a/django/library/models.py +++ b/django/library/models.py @@ -43,6 +43,13 @@ class QivipQuiz(models.Model): return self.name +class QivipQuizFavorite(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) # Verknüpfung zu User + quiz = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE, related_name='favorites') # Verknüpfung zu Quiz + favorite = models.BooleanField(default=False) # Favoritenstatus + + class Meta: + unique_together = ('user', 'quiz') # Sicherstellen, dass es nur ein Favorit pro User und Quiz gibt # Create your models here. diff --git a/django/library/urls.py b/django/library/urls.py index 28b2b76..1721a2b 100644 --- a/django/library/urls.py +++ b/django/library/urls.py @@ -15,5 +15,6 @@ urlpatterns = [ path('question/edit//', views.edit_question, name='edit_question'), path('question/delete//', views.delete_question, name='delete_question'), path('detail/copy//', views.copy_quiz, name='copy_quiz'), + path('favorite_quiz//', views.favorite_quiz, name='favorite_quiz'), ] diff --git a/django/library/views.py b/django/library/views.py index 5f16d54..15ba724 100644 --- a/django/library/views.py +++ b/django/library/views.py @@ -1,10 +1,11 @@ import uuid +from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.urls import reverse from django.contrib import messages -from .models import QivipQuiz, QivipQuestion +from .models import QivipQuiz, QivipQuestion, QivipQuizFavorite from .forms import QuizForm, QuestionForm import json from django.core.paginator import Paginator @@ -17,6 +18,10 @@ from django.contrib.auth.models import User def overview_quiz(request): # Filter form = QuizFilterForm(request.GET) + + favorite_quizzes = QivipQuizFavorite.objects.filter(user=request.user, favorite=True) + favorite_quiz_ids = favorite_quizzes.values_list('quiz', flat=True) + favorite_quizzes = QivipQuiz.objects.filter(id__in=favorite_quiz_ids) # Initialize querysets if request.user.is_authenticated: @@ -82,6 +87,8 @@ def overview_quiz(request): context = { 'show_search': True, + 'favorite_quiz_ids': favorite_quiz_ids, + 'favorite_quizzes':favorite_quizzes, 'my_quizzes': my_quizzes, 'other_quizzes': other_quizzes, 'form': form, @@ -90,7 +97,21 @@ def overview_quiz(request): return render(request, 'library/overview_quiz.html', context) - +# Neues Quiz erstellen +@login_required +def favorite_quiz(request, pk): + quiz= get_object_or_404(QivipQuiz, pk=pk) + favorite = QivipQuizFavorite.objects.filter(user=request.user, quiz=quiz).first() + if favorite: + favorite.favorite=not favorite.favorite + print(favorite.favorite) + favorite.save() + + else: + QivipQuizFavorite.objects.create(user=request.user, quiz=quiz, favorite=True) + + + return redirect('library:overview_quiz') # Neues Quiz erstellen @login_required @@ -102,7 +123,7 @@ def new_quiz(request): quiz.user_id = request.user #quiz.creator = request.user quiz.save() - form.save_m2m() # Speichert die Many-to-Many Beziehungen (Tags) + #form.save_m2m() # Speichert die Many-to-Many Beziehungen (Tags) return redirect('library:detail_quiz', pk=quiz.pk) else: diff --git a/django/templates/library/overview_quiz.html b/django/templates/library/overview_quiz.html index 955cb27..72e46e4 100644 --- a/django/templates/library/overview_quiz.html +++ b/django/templates/library/overview_quiz.html @@ -77,6 +77,7 @@ + {% if user.is_authenticated %}
@@ -92,13 +93,40 @@
{% if quiz.image %} -
+
+ +
+
+
+ {% else %}
{% endif %} + {% if quiz.id not in favorite_quiz_ids %} +
+ + + + + + +
+ + {% else %} + + {% endif %}
+ +
@@ -228,6 +256,197 @@
{% endif %} + + + +{% if user.is_authenticated %} +
+
+

Meine Favoriten

+
+
+
+ +
+
+ {% for quiz in favorite_quizzes %} +
+ +
+ {% if quiz.image %} +
+ +
+
+
+ + + {% else %} +
+ {% endif %} + + {% if quiz.favorite == False %} + +
+ + + + + + +
+ + {% else %} + + {% endif %} +
+ + + + +
+ +

+ {{ quiz.name }} +

+ +

{{ quiz.description }}

+ + +
+ +
+ + + + {{ quiz.difficulty }} +
+ + +
+ + + + {{ quiz.questions.count }} Fragen +
+ + +
+ + + + {{ quiz.status }} +
+ + +
+ {% for i in '12345'|make_list %} + {% if forloop.counter <= quiz.average_rating|floatformat:0|add:0 %} + + {% else %} + + {% endif %} + {% endfor %} + ({{ quiz.rating_count }}) +
+
+ + + {% if quiz.authors.all %} +
+ + + + + {% for author in quiz.authors.all %} + {{ author.username }}{% if not forloop.last %}, {% endif %} + {% endfor %} + +
+ {% endif %} + + +
+ + + + + + Spielen + +
+ + + + + + + {% if quiz.user == request.user %} + + + + + + + + + + + {% endif %} +
+
+
+
+ {% endfor %} + +
+ + + {% if favorite_quizzes.paginator.num_pages > 1 %} +
+ {% if favorite_quizzes.has_previous %} + + + + + + {% endif %} + + Seite {{ favorite_quizzes.number }} von {{ favorite_quizzes.paginator.num_pages }} + + {% if my_quizzes.has_next %} + + + + + + {% endif %} +
+ {% endif %} +
+{% endif %} + + + + + + + + +
@@ -244,11 +463,37 @@
{% if quiz.image %} -
+
+ +
+
+
+ + {% else %}
{% endif %} + {% if quiz.id not in favorite_quiz_ids %} +
+ + + + + + +
+ + {% else %} + + {% endif %}