diff --git a/django/library/migrations/0051_alter_qivipquestion_image_alter_qivipquiz_image.py b/django/library/migrations/0051_alter_qivipquestion_image_alter_qivipquiz_image.py new file mode 100644 index 0000000..28594d5 --- /dev/null +++ b/django/library/migrations/0051_alter_qivipquestion_image_alter_qivipquiz_image.py @@ -0,0 +1,24 @@ +# Generated by Django 5.1.7 on 2025-04-23 12:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0050_questionimage_quizimages_alter_qivipquestion_image_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='qivipquestion', + name='image', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='library.questionimage'), + ), + migrations.AlterField( + model_name='qivipquiz', + name='image', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='quizzes', to='library.quizimage'), + ), + ] diff --git a/django/library/migrations/0052_alter_qivipquestion_image_alter_qivipquiz_image_and_more.py b/django/library/migrations/0052_alter_qivipquestion_image_alter_qivipquiz_image_and_more.py new file mode 100644 index 0000000..05b791b --- /dev/null +++ b/django/library/migrations/0052_alter_qivipquestion_image_alter_qivipquiz_image_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.7 on 2025-04-23 12:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0051_alter_qivipquestion_image_alter_qivipquiz_image'), + ] + + operations = [ + migrations.AlterField( + model_name='qivipquestion', + name='image', + field=models.ImageField(blank=True, null=True, upload_to='question_images/', verbose_name='Bild'), + ), + 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.DeleteModel( + name='QuestionImage', + ), + migrations.DeleteModel( + name='QuizImage', + ), + ] diff --git a/django/library/migrations/0053_questionimage_quizimage_alter_qivipquestion_image_and_more.py b/django/library/migrations/0053_questionimage_quizimage_alter_qivipquestion_image_and_more.py new file mode 100644 index 0000000..c935670 --- /dev/null +++ b/django/library/migrations/0053_questionimage_quizimage_alter_qivipquestion_image_and_more.py @@ -0,0 +1,38 @@ +# Generated by Django 5.1.7 on 2025-04-23 13:15 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0052_alter_qivipquestion_image_alter_qivipquiz_image_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='QuestionImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(blank=True, null=True, upload_to='question_images/', verbose_name='Bild')), + ], + ), + migrations.CreateModel( + name='QuizImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(blank=True, max_length=256, null=True, upload_to='quiz_images/', verbose_name='Bild')), + ], + ), + migrations.AlterField( + model_name='qivipquestion', + name='image', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='questions', to='library.questionimage'), + ), + migrations.AlterField( + model_name='qivipquiz', + name='image', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='quizzes', to='library.quizimage'), + ), + ] diff --git a/django/library/models.py b/django/library/models.py index 358e93f..9b17d6f 100644 --- a/django/library/models.py +++ b/django/library/models.py @@ -40,7 +40,7 @@ class QivipQuiz(models.Model): QuizImage, null=True, blank=True, - on_delete=models.SET_NULL, # Bild bleibt erhalten, selbst wenn das Quiz gelöscht wird + on_delete=models.PROTECT, related_name="quizzes" ) @@ -95,7 +95,7 @@ class QivipQuestion(models.Model): QuestionImage, null=True, blank=True, - on_delete=models.SET_NULL, + on_delete=models.PROTECT, related_name="questions" ) diff --git a/django/library/views.py b/django/library/views.py index 315dec2..d2fcc16 100644 --- a/django/library/views.py +++ b/django/library/views.py @@ -197,20 +197,18 @@ def new_quiz(request): if request.method == 'POST': + form = QuizForm(request.POST, request.FILES) - try: - uploaded_file = request.FILES["quiz_image"] - quiz_img = QuizImage.objects.create(image=uploaded_file) - except Exception: - pass if form.is_valid(): quiz = form.save(commit=False) - try: - - quiz.image = quiz_img - except Exception: + quiz_image=request.FILES['quiz_image'] + imagequiz=QuizImage.objects.create(image=quiz_image) + quiz.image=imagequiz + + except: pass + quiz.user_id = request.user #quiz.creator = request.user @@ -229,19 +227,27 @@ def edit_quiz(request, pk): if request.method == 'POST': form = QuizForm(request.POST, instance=quiz, files=request.FILES) if form.is_valid(): - try: - - uploaded_file = request.FILES["quiz_image"] - quiz_img = QuizImage.objects.create(image=uploaded_file) - quiz.image = quiz_img - quiz.save() - except Exception: - pass + if 'reset_image' in request.POST: quiz.image = None + + try: + quiz_image=request.FILES['quiz_image'] + imagequiz=QuizImage.objects.create(image=quiz_image) + quiz.image=imagequiz + + + except: + pass + form.save() + for img in QuizImage.objects.all(): + try: + img.delete() + except: + pass return redirect('library:detail_quiz', pk=pk) #return modified(request, pk) @@ -254,11 +260,19 @@ def edit_quiz(request, pk): def delete_quiz(request, pk): quiz = get_object_or_404(QivipQuiz, pk=pk, user_id=request.user) if request.method == 'POST': - if quiz.image: - quiz.image = None # Entfernt das Bild aus der Datenbank, aber löscht es nicht - quiz.save() # Speichere die Änderungen in der Datenbank - quiz.delete() + for img in QuizImage.objects.all(): + try: + img.delete() + img.image.delete(save=False) + except: + pass + for img in QuestionImage.objects.all(): + try: + img.delete() + img.image.delete(save=False) + except: + pass return redirect('library:overview_quiz') return render(request, 'library/delete_confirmation.html', {'object': quiz}) @@ -309,6 +323,7 @@ def copy_quiz(request, pk): question.pk = None # Setze pk auf None, damit es als neues Objekt gespeichert wird question.quiz_id = original_quiz # Verknüpfe mit dem neuen Quiz question.data = question.data # `data`-Feld wird explizit übernommen # Verknüpfe mit dem neuen Quiz + question.save() messages.success(request, "Quiz wurde erfolgreich kopiert!") @@ -349,7 +364,6 @@ def new_question(request): if request.method == 'POST': question_text = request.POST.get('question', '') - question_image = request.FILES.get('question_image', None) # Handle different question types if question_type == 'true_false': @@ -389,17 +403,10 @@ def new_question(request): question = QivipQuestion() question.data = json.dumps(json_data) question.quiz_id = quiz - if request.method == 'POST': - try: - question_image = request.FILES['question_image'] - except Exception: - pass - try: - if question_image: - question_img = QuestionImage.objects.create(image=question_image) # Erstelle das QuestionImage-Objekt - question.image = question_img # Weise es dem Bildfeld zu - question.save() + question_image=request.FILES['question_image'] + imagequestion=QuestionImage.objects.create(image=question_image) + question.image=imagequestion except: pass @@ -500,7 +507,9 @@ def edit_question(request, pk): if request.method == 'POST': question_text = request.POST.get('question', '') try: - question_image = request.FILES['question_image'] + question_image=request.FILES['question_image'] + imagequestion=QuestionImage.objects.create(image=question_image) + question.image=imagequestion except Exception: pass @@ -545,16 +554,14 @@ def edit_question(request, pk): question.data = json.dumps(json_data) question.time_per_question = request.POST.get('time_per_question', '30') - try: - if question_image: - question_img = QuestionImage.objects.create(image=question_image) # Erstelle das QuestionImage-Objekt - question.image = question_img # Weise es dem Bildfeld zu - question.save() - except: - pass question.save() + for img in QuestionImage.objects.all(): + try: + img.delete() + except: + pass #return modified(request, question.quiz_id.pk) return redirect('library:detail_quiz', pk=question.quiz_id.pk) @@ -582,5 +589,10 @@ def delete_question(request, pk): if request.method == 'POST': question.delete() + for img in QuestionImage.objects.all(): + try: + img.delete() + except: + pass return redirect('library:detail_quiz', pk=question.quiz_id.pk) return render(request, 'library/delete_confirmation.html', {'object': question}) diff --git a/django/templates/library/form.html b/django/templates/library/form.html index ec33d31..2352368 100644 --- a/django/templates/library/form.html +++ b/django/templates/library/form.html @@ -5,6 +5,7 @@
{% csrf_token %} {{ form.as_p }} + {% if form.instance.image %} Bild der Frage