diff --git a/.gitignore b/.gitignore index f4cd75e..d8cc1f7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ __pycache__ db.sqlite3 tailwindcss.exe t-style.css -dump.rdb \ No newline at end of file +dump.rdb +media \ No newline at end of file diff --git a/django/core/settings.py b/django/core/settings.py index ebf1574..a79c5ec 100644 --- a/django/core/settings.py +++ b/django/core/settings.py @@ -128,4 +128,8 @@ STATICFILES_DIRS = [BASE_DIR / 'static'] DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -LOGIN_URL = '/account/login/' \ No newline at end of file +LOGIN_URL = '/account/login/' +import os + +MEDIA_URL = '/media/' # URL, um auf Medien-Dateien zuzugreifen +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Speicherort für hochgeladene Dateien diff --git a/django/library/forms.py b/django/library/forms.py index e23cc6e..4ca84f8 100644 --- a/django/library/forms.py +++ b/django/library/forms.py @@ -4,7 +4,7 @@ from .models import QivipQuiz, QivipQuestion class QuizForm(forms.ModelForm): class Meta: model = QivipQuiz - fields = ['name', 'description', 'status', 'category', 'tags',"difficulty"] + fields = ['name', 'description','image', 'status', 'category', 'tags',"difficulty"] class QuestionForm(forms.ModelForm): class Meta: @@ -29,4 +29,3 @@ class QuizFilterForm(forms.Form): user = forms.CharField(required=False, label="von User", widget=forms.TextInput(attrs={ 'class': 'border-2 border-gray-300 rounded-lg p-2 w-full' })) - diff --git a/django/library/migrations/0023_qivipquiz_image.py b/django/library/migrations/0023_qivipquiz_image.py new file mode 100644 index 0000000..13d3803 --- /dev/null +++ b/django/library/migrations/0023_qivipquiz_image.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-03-21 17:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0022_alter_qivipquiz_description_alter_qivipquiz_name'), + ] + + operations = [ + migrations.AddField( + model_name='qivipquiz', + name='image', + field=models.ImageField(blank=True, null=True, upload_to='quiz_images/'), + ), + ] diff --git a/django/library/migrations/0024_alter_qivipquiz_image.py b/django/library/migrations/0024_alter_qivipquiz_image.py new file mode 100644 index 0000000..122bbfb --- /dev/null +++ b/django/library/migrations/0024_alter_qivipquiz_image.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-03-22 10:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0023_qivipquiz_image'), + ] + + operations = [ + migrations.AlterField( + model_name='qivipquiz', + name='image', + field=models.ImageField(blank=True, max_length=256, null=True, upload_to='quiz_images/'), + ), + ] diff --git a/django/library/models.py b/django/library/models.py index fe0989a..a35d6d9 100644 --- a/django/library/models.py +++ b/django/library/models.py @@ -24,7 +24,7 @@ class QivipQuiz(models.Model): if value.strip() == "In dem Quiz geht es um ...": 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/ uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz') creation_date = models.DateTimeField(auto_now_add=True) diff --git a/django/library/urls.py b/django/library/urls.py index a480676..45d780c 100644 --- a/django/library/urls.py +++ b/django/library/urls.py @@ -1,6 +1,8 @@ from django.urls import path -from . import views +from django.conf import settings +from . import views +from django.conf.urls.static import static app_name = 'library' urlpatterns = [ @@ -12,4 +14,6 @@ urlpatterns = [ path('question/new/', views.new_question, name='new_question'), path('question/edit//', views.edit_question, name='edit_question'), path('question/delete//', views.delete_question, name='delete_question'), -] +]# Nur für die Entwicklungsumgebung +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/django/library/views.py b/django/library/views.py index 1c0fe62..ac823f6 100644 --- a/django/library/views.py +++ b/django/library/views.py @@ -18,6 +18,7 @@ def overview_quiz(request): #Filter form = QuizFilterForm(request.GET) + try: filter_my_quizzes = QivipQuiz.objects.filter(user_id=request.user).annotate(max_amout_questions=Count('question')) @@ -65,16 +66,8 @@ def overview_quiz(request): filter_other_quizzes=filter_other_quizzes.exclude(user_id=request.user) except: filter_other_quizzes=filter_other_quizzes - - my_paginator = Paginator(filter_my_quizzes, 3) # 3 Quiz pro Seite - my_page_number = request.GET.get('my_page') - filter_my_quizzes = my_paginator.get_page(my_page_number) - - # Paginator für fremde Quizze - other_paginator = Paginator(filter_other_quizzes, 3) # 3 Quiz pro Seite - other_page_number = request.GET.get('other_page') - filter_other_quizzes = other_paginator.get_page(other_page_number) - + + # Anzahl der Quiz pro Seite für Swiper context = { @@ -116,7 +109,7 @@ def overview_quiz(request): @login_required def new_quiz(request): if request.method == 'POST': - form = QuizForm(request.POST) + form = QuizForm(request.POST, request.FILES) if form.is_valid(): quiz = form.save(commit=False) quiz.user_id = request.user @@ -133,7 +126,7 @@ def new_quiz(request): def edit_quiz(request, pk): quiz = get_object_or_404(QivipQuiz, pk=pk, user_id=request.user) if request.method == 'POST': - form = QuizForm(request.POST, instance=quiz) + form = QuizForm(request.POST, instance=quiz, files=request.FILES) if form.is_valid(): form.save() return redirect('library:detail_quiz', pk=quiz.pk) diff --git a/django/templates/library/form.html b/django/templates/library/form.html index a5dfd14..582cc39 100644 --- a/django/templates/library/form.html +++ b/django/templates/library/form.html @@ -2,7 +2,7 @@ {% block content %}
-
+ {% csrf_token %} {{ form.as_p }} diff --git a/django/templates/library/overview_quiz.html b/django/templates/library/overview_quiz.html index f3a2bef..df878f6 100644 --- a/django/templates/library/overview_quiz.html +++ b/django/templates/library/overview_quiz.html @@ -1,6 +1,33 @@ {% extends 'base.html' %} {% block content %} + + + Swiper Demo + + + +
Neues Quiz erstellen @@ -21,84 +48,146 @@
- - - - - + {% if filter_my_quizzes %}
-

eigene Quiz

-
+

Eigene Quiz

+
+ +
+
{% for quiz in filter_my_quizzes %} -
-

{{ quiz.name }}

-

{{ quiz.description }}
Status: {{ quiz.status }} -
Schwierigkeit: {{ quiz.difficulty }} -
Anzahl der Fragen: {{ quiz.question.count }}

- - -
-
- Spiel starten - -
- - 🗑 -
-
+
+
+
+ +

{{ quiz.name }}

+ +

+ {{ quiz.description }}
+ Schwierigkeit: {{ quiz.difficulty }}
+ Anzahl der Fragen: {{ quiz.question.count }}
+ Status: {{ quiz.status }} +

+ + +
+ Spiel starten +
+ + 🗑 +
+ +
- {% endfor %} - {% endif %} + +
+ + {% if filter_my_quizzes|length > 1 %} +
+
+ {% endif %}
- - - -{% if filter_my_quizzes or filter_other_quizzes %} -
-

Quiz von anderen Nutzer

{% endif %} + + {% if filter_other_quizzes %} - - -
- {% for quiz in filter_other_quizzes %} - -
-

{{ quiz.name }}

-

{{ quiz.description }}
Schwierigkeit: - {{ quiz.difficulty }}
Anzahl der Fragen: {{ quiz.question.count }} -
Erstmalig erstellt am: {{ quiz.creation_date }} -

- -
- - - {% endfor %} - {% elif not filter_my_quizzes %} -
Es wurde kein passendes Quiz gefunden.
- {% else %} - - - -
Es wurde kein passendes Quiz von einem anderen Nutzer gefunden.
- {% endif %} +
+

Quiz von anderen Nutzern

- + +
+
+ + + {% for quiz in filter_other_quizzes %} +
+
+
+ +

{{ quiz.name }}

+ +

+ {{ quiz.description }}
+ Schwierigkeit: {{ quiz.difficulty }}
+ Anzahl der Fragen: {{ quiz.question.count }}
+ Erstellt am: {{ quiz.creation_date }} +

+ + +
+ Spiel starten + +
+ +
+
+ +
+
+ {% endfor %} + +
+ + + + {% if filter_other_quizzes|length > 1 %} +
+
+ {% endif %} +
+{% endif %} + +{% if not filter_other_quizzes and not filter_my_quizzes %} +
Es wurde kein Quiz passendes gefunden!
+{% endif %} + + + + + + + + {% endblock %} diff --git a/requirements.txt b/requirements.txt index b387401..ccc9eda 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ django~=5.1.4 channels~=4.2.0 -daphne~=4.1.2 \ No newline at end of file +daphne~=4.1.2 +pillow~=11.1.0 \ No newline at end of file