Favoritenfunktion! #55
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 12:40
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0038_alter_qivipquizfavorite_quiz'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='qivipquizfavorite',
|
||||||
|
name='favorite_date',
|
||||||
|
field=models.DateTimeField(auto_now=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 13:15
|
||||||
|
|
||||||
|
import library.models
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0039_qivipquizfavorite_favorite_date'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='description',
|
||||||
|
field=models.TextField(default='In dem Quiz geht es um ...', max_length=200, validators=[library.models.QivipQuiz.validate_description], verbose_name='Beschreibung'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 13:21
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0040_alter_qivipquiz_description'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='category',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quiz', to='library.quizcategory', verbose_name='Kategorie'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='difficulty',
|
||||||
|
field=models.CharField(choices=[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('nicht gesetzt', 'nicht gesetzt')], default='nicht gesetzt', help_text='1: niedrigste Schwierigkeit und 5: höchste Schwierigkeit', max_length=13, verbose_name='Schwierigkeit'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='image',
|
||||||
|
field=models.ImageField(blank=True, max_length=256, null=True, upload_to='quiz_images/', verbose_name='Bild'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(max_length=75, verbose_name='Name des Quizzes'),
|
||||||
|
),
|
||||||
|
]
|
||||||
19
django/library/migrations/0042_qivipquiz_favorite.py
Normal file
19
django/library/migrations/0042_qivipquiz_favorite.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 13:43
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0041_alter_qivipquiz_category_alter_qivipquiz_difficulty_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='favorite',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='quizzes', to='library.qivipquizfavorite'),
|
||||||
|
),
|
||||||
|
]
|
||||||
17
django/library/migrations/0043_remove_qivipquiz_favorite.py
Normal file
17
django/library/migrations/0043_remove_qivipquiz_favorite.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 15:25
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0042_qivipquiz_favorite'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='favorite',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-04-11 16:03
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('library', '0043_remove_qivipquiz_favorite'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='qivipquizfavorite',
|
||||||
|
name='favorite_date',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='qivipquiz',
|
||||||
|
name='favorite_date',
|
||||||
|
field=models.DateTimeField(auto_now=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -24,7 +24,7 @@ class QivipQuiz(models.Model):
|
|||||||
if value.strip() == "In dem Quiz geht es um ...":
|
if value.strip() == "In dem Quiz geht es um ...":
|
||||||
raise ValidationError("Bitte gib eine aussagekräftige Beschreibung ein.")
|
raise ValidationError("Bitte gib eine aussagekräftige Beschreibung ein.")
|
||||||
|
|
||||||
image = models.ImageField(max_length=256, upload_to='quiz_images/', blank=True, null=True) # Bild speichern in media/quiz_images/
|
image = models.ImageField(max_length=256,verbose_name="Bild", upload_to='quiz_images/', blank=True, null=True) # Bild speichern in media/quiz_images/
|
||||||
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
||||||
user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz')
|
user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz')
|
||||||
#creator = models.ForeignKey(User, on_delete=models.SET_NULL,blank=True, null=True, related_name='creator_quiz')
|
#creator = models.ForeignKey(User, on_delete=models.SET_NULL,blank=True, null=True, related_name='creator_quiz')
|
||||||
@@ -32,13 +32,14 @@ class QivipQuiz(models.Model):
|
|||||||
creation_date = models.DateTimeField(auto_now_add=True)
|
creation_date = models.DateTimeField(auto_now_add=True)
|
||||||
update_date = models.DateTimeField(auto_now=True)
|
update_date = models.DateTimeField(auto_now=True)
|
||||||
status = models.CharField(max_length=10, choices=list(STATUS_VALUES.items()), default="öffentlich")
|
status = models.CharField(max_length=10, choices=list(STATUS_VALUES.items()), default="öffentlich")
|
||||||
category = models.ForeignKey('QuizCategory', related_name='quiz', on_delete=models.CASCADE)
|
category = models.ForeignKey('QuizCategory',verbose_name="Kategorie", related_name='quiz', on_delete=models.CASCADE)
|
||||||
name = models.CharField(max_length=75)
|
name = models.CharField(max_length=75,verbose_name="Name des Quizzes")
|
||||||
description = models.TextField(validators=[validate_description],max_length=200,blank=False, default="In dem Quiz geht es um ...")
|
description = models.TextField(validators=[validate_description],max_length=200,blank=False, default="In dem Quiz geht es um ...", verbose_name="Beschreibung")
|
||||||
difficulty= models.CharField(max_length=13, choices=list(DIFFICULTY_VALUES.items()), default="nicht gesetzt", help_text="1: niedrigste Schwierigkeit und 5: höchste Schwierigkeit")
|
difficulty= models.CharField(verbose_name="Schwierigkeit", max_length=13, choices=list(DIFFICULTY_VALUES.items()), default="nicht gesetzt", help_text="1: niedrigste Schwierigkeit und 5: höchste Schwierigkeit")
|
||||||
credits=models.TextField(blank=True, editable=True)
|
credits=models.TextField(blank=True, editable=True)
|
||||||
average_rating = models.FloatField(default=3.0)
|
average_rating = models.FloatField(default=3.0)
|
||||||
rating_count = models.IntegerField(default=0)
|
rating_count = models.IntegerField(default=0)
|
||||||
|
favorite_date=models.DateTimeField(auto_now=True)
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
||||||
return self.name
|
return self.name
|
||||||
@@ -48,6 +49,7 @@ class QivipQuizFavorite(models.Model):
|
|||||||
quiz = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE, related_name='favorites') # Verknüpfung zu Quiz
|
quiz = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE, related_name='favorites') # Verknüpfung zu Quiz
|
||||||
favorite = models.BooleanField(default=False) # Favoritenstatus
|
favorite = models.BooleanField(default=False) # Favoritenstatus
|
||||||
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('user', 'quiz') # Sicherstellen, dass es nur ein Favorit pro User und Quiz gibt
|
unique_together = ('user', 'quiz') # Sicherstellen, dass es nur ein Favorit pro User und Quiz gibt
|
||||||
|
|
||||||
|
|||||||
@@ -19,20 +19,22 @@ def overview_quiz(request):
|
|||||||
# Filter
|
# Filter
|
||||||
form = QuizFilterForm(request.GET)
|
form = QuizFilterForm(request.GET)
|
||||||
try:
|
try:
|
||||||
favorite_quizzes = QivipQuizFavorite.objects.filter(user=request.user, favorite=True)
|
favorite_quizzes_data = QivipQuizFavorite.objects.filter(user=request.user, favorite=True)
|
||||||
favorite_quiz_ids = favorite_quizzes.values_list('quiz', flat=True)
|
favorite_quiz_ids = favorite_quizzes_data.values_list('quiz', flat=True)
|
||||||
favorite_quizzes = QivipQuiz.objects.filter(id__in=favorite_quiz_ids)
|
favorite_quizzes = QivipQuiz.objects.filter(id__in=favorite_quiz_ids)
|
||||||
except:
|
except:
|
||||||
|
favorite_quizzes_data = QivipQuizFavorite.objects.none()
|
||||||
favorite_quizzes = QivipQuizFavorite.objects.none()
|
favorite_quizzes = QivipQuizFavorite.objects.none()
|
||||||
favorite_quiz_ids = favorite_quizzes.none()
|
favorite_quiz_ids = favorite_quizzes.none()
|
||||||
favorite_quizzes = QivipQuiz.objects.none()
|
favorite_quizzes = QivipQuiz.objects.none()
|
||||||
|
|
||||||
|
|
||||||
# Initialize querysets
|
# Initialize querysets
|
||||||
if request.user.is_authenticated:
|
if request.user.is_authenticated:
|
||||||
filter_my_quizzes = QivipQuiz.objects.filter(user_id=request.user).annotate(max_amout_questions=Count('questions'))
|
filter_my_quizzes = QivipQuiz.objects.filter(user_id=request.user).annotate(max_amout_questions=Count('questions'))
|
||||||
|
favorite_quizzes = QivipQuiz.objects.filter(id__in=favorite_quiz_ids).annotate(max_amout_questions=Count('questions'))
|
||||||
filter_other_quizzes = QivipQuiz.objects.exclude(user_id=request.user)
|
filter_other_quizzes = QivipQuiz.objects.exclude(user_id=request.user)
|
||||||
else:
|
else:
|
||||||
|
favorite_quizzes = QivipQuiz.objects.none()
|
||||||
filter_my_quizzes = QivipQuiz.objects.none()
|
filter_my_quizzes = QivipQuiz.objects.none()
|
||||||
filter_other_quizzes = QivipQuiz.objects.all()
|
filter_other_quizzes = QivipQuiz.objects.all()
|
||||||
|
|
||||||
@@ -40,11 +42,49 @@ def overview_quiz(request):
|
|||||||
filter_other_quizzes = filter_other_quizzes.annotate(max_amout_questions=Count('questions'))
|
filter_other_quizzes = filter_other_quizzes.annotate(max_amout_questions=Count('questions'))
|
||||||
filter_other_quizzes = filter_other_quizzes.filter(max_amout_questions__gte=1, status='öffentlich')
|
filter_other_quizzes = filter_other_quizzes.filter(max_amout_questions__gte=1, status='öffentlich')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
search = form.cleaned_data.get('search')
|
search = form.cleaned_data.get('search')
|
||||||
username= form.cleaned_data.get('user')
|
username= form.cleaned_data.get('user')
|
||||||
max_amout_questions= form.cleaned_data.get('max_amout_questions')
|
max_amout_questions= form.cleaned_data.get('max_amout_questions')
|
||||||
min_amout_questions= form.cleaned_data.get('min_amout_questions')
|
min_amout_questions= form.cleaned_data.get('min_amout_questions')
|
||||||
|
|
||||||
|
filters = {}
|
||||||
|
if username:
|
||||||
|
try:
|
||||||
|
user = User.objects.get(username=username)
|
||||||
|
filters['user_id'] = user.id
|
||||||
|
except User.DoesNotExist:
|
||||||
|
favorite_quizzes = QivipQuiz.objects.none()
|
||||||
|
filter_my_quizzes = QivipQuiz.objects.none()
|
||||||
|
filter_other_quizzes=QivipQuiz.objects.none()
|
||||||
|
|
||||||
|
if search:
|
||||||
|
filters['name__icontains'] = search
|
||||||
|
if min_amout_questions:
|
||||||
|
filters['max_amout_questions__gte'] = min_amout_questions
|
||||||
|
if max_amout_questions:
|
||||||
|
filters['max_amout_questions__lte'] = max_amout_questions
|
||||||
|
|
||||||
|
try:
|
||||||
|
filter_other_quizzes = filter_other_quizzes.filter(**filters)
|
||||||
|
except:
|
||||||
|
filter_other_quizzes=QivipQuiz.objects.none()
|
||||||
|
try:
|
||||||
|
filter_my_quizzes = filter_my_quizzes.filter(**filters)
|
||||||
|
except:
|
||||||
|
filter_my_quizzes=QivipQuiz.objects.none()
|
||||||
|
|
||||||
|
try:
|
||||||
|
favorite_quizzes = favorite_quizzes.filter(**filters)
|
||||||
|
except:
|
||||||
|
favorite_quizzes=QivipQuiz.objects.none()
|
||||||
|
|
||||||
|
"""
|
||||||
if search: # Suche nach Namen
|
if search: # Suche nach Namen
|
||||||
filter_other_quizzes = filter_other_quizzes.filter(name__icontains=search)
|
filter_other_quizzes = filter_other_quizzes.filter(name__icontains=search)
|
||||||
filter_my_quizzes = filter_my_quizzes.filter(name__icontains=search)
|
filter_my_quizzes = filter_my_quizzes.filter(name__icontains=search)
|
||||||
@@ -73,7 +113,7 @@ def overview_quiz(request):
|
|||||||
filter_other_quizzes=filter_other_quizzes.exclude(user_id=request.user)
|
filter_other_quizzes=filter_other_quizzes.exclude(user_id=request.user)
|
||||||
except:
|
except:
|
||||||
filter_other_quizzes=filter_other_quizzes
|
filter_other_quizzes=filter_other_quizzes
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
# Pagination for my quizzes
|
# Pagination for my quizzes
|
||||||
@@ -90,6 +130,19 @@ def overview_quiz(request):
|
|||||||
except:
|
except:
|
||||||
other_quizzes = other_quizzes_paginator.page(1)
|
other_quizzes = other_quizzes_paginator.page(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Pagination for favorite_quizzes
|
||||||
|
favorite_quizzes_paginator = Paginator(favorite_quizzes.order_by("-favorite_date"), 8) # 8 quizzes per page
|
||||||
|
try:
|
||||||
|
favorite_quizzes = favorite_quizzes_paginator.page(request.GET.get('my_page', 1))
|
||||||
|
except:
|
||||||
|
favorite_quizzes = favorite_quizzes_paginator.page(1)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'show_search': True,
|
'show_search': True,
|
||||||
'favorite_quiz_ids': favorite_quiz_ids,
|
'favorite_quiz_ids': favorite_quiz_ids,
|
||||||
@@ -101,22 +154,31 @@ def overview_quiz(request):
|
|||||||
|
|
||||||
return render(request, 'library/overview_quiz.html', context)
|
return render(request, 'library/overview_quiz.html', context)
|
||||||
|
|
||||||
|
|
||||||
# Neues Quiz erstellen
|
# Neues Quiz erstellen
|
||||||
@login_required
|
@login_required
|
||||||
def favorite_quiz(request, pk):
|
def favorite_quiz(request, pk):
|
||||||
quiz= get_object_or_404(QivipQuiz, pk=pk)
|
quiz= get_object_or_404(QivipQuiz, pk=pk)
|
||||||
favorite = QivipQuizFavorite.objects.filter(user=request.user, quiz=quiz).first()
|
favorite = QivipQuizFavorite.objects.filter(user=request.user, quiz=quiz).first()
|
||||||
|
|
||||||
if favorite:
|
if favorite:
|
||||||
favorite.favorite=not favorite.favorite
|
favorite.favorite=not favorite.favorite
|
||||||
print(favorite.favorite)
|
|
||||||
favorite.save()
|
favorite.save()
|
||||||
|
|
||||||
|
if favorite.favorite==True:
|
||||||
|
quiz.save(update_fields=['favorite_date'])
|
||||||
|
statement="Das Quiz '"+ favorite.quiz.name+ "' wurde erfolgreich zu den Favoriten hinzugefügt!"
|
||||||
|
messages.success(request,statement )
|
||||||
|
else:
|
||||||
|
statement="Das Quiz '"+ favorite.quiz.name+ "' wurde erfolgreich von den Favoriten entfernt!"
|
||||||
|
messages.error(request, statement)
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
QivipQuizFavorite.objects.create(user=request.user, quiz=quiz, favorite=True)
|
QivipQuizFavorite.objects.create(user=request.user, quiz=quiz, favorite=True)
|
||||||
|
|
||||||
|
|
||||||
return redirect('library:overview_quiz')
|
return redirect(request.META.get('HTTP_REFERER', 'library:overview_quiz'))
|
||||||
|
|
||||||
# Neues Quiz erstellen
|
# Neues Quiz erstellen
|
||||||
@login_required
|
@login_required
|
||||||
|
|||||||
@@ -619,5 +619,20 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
document.getElementById('filterPanel').classList.toggle('show');
|
document.getElementById('filterPanel').classList.toggle('show');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (window.location.pathname === "/library/") {
|
||||||
|
window.addEventListener("beforeunload", function () {
|
||||||
|
localStorage.setItem("meine_seite_scroll", window.scrollY);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("load", function () {
|
||||||
|
const scrollPos = localStorage.getItem("meine_seite_scroll");
|
||||||
|
if (scrollPos !== null) {
|
||||||
|
window.scrollTo(0, parseInt(scrollPos));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
Reference in New Issue
Block a user