diff --git a/django/library/migrations/0058_qivipquiz_quiz_played_lernmodus_and_more.py b/django/library/migrations/0058_qivipquiz_quiz_played_lernmodus_and_more.py new file mode 100644 index 0000000..df07756 --- /dev/null +++ b/django/library/migrations/0058_qivipquiz_quiz_played_lernmodus_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.1.7 on 2025-11-14 14:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0057_quizcategory_color'), + ] + + operations = [ + migrations.AddField( + model_name='qivipquiz', + name='quiz_played_Lernmodus', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='qivipquiz', + name='quiz_played_Moderiermodus', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='qivipquiz', + name='quiz_played_Moderiermodus_players', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='qivipquiz', + name='single_player_or_multiple', + field=models.CharField(blank=True, max_length=20), + ), + ] diff --git a/django/library/migrations/0059_remove_qivipquiz_single_player_or_multiple.py b/django/library/migrations/0059_remove_qivipquiz_single_player_or_multiple.py new file mode 100644 index 0000000..7b011d1 --- /dev/null +++ b/django/library/migrations/0059_remove_qivipquiz_single_player_or_multiple.py @@ -0,0 +1,17 @@ +# Generated by Django 5.1.7 on 2025-11-14 15:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0058_qivipquiz_quiz_played_lernmodus_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='qivipquiz', + name='single_player_or_multiple', + ), + ] diff --git a/django/library/models.py b/django/library/models.py index 10d307b..e7291a9 100644 --- a/django/library/models.py +++ b/django/library/models.py @@ -43,7 +43,11 @@ class QivipQuiz(models.Model): on_delete=models.PROTECT, related_name="quizzes" ) + + quiz_played_Lernmodus = models.IntegerField(null=True, blank=True, default=0) + quiz_played_Moderiermodus= models.IntegerField(null=True, blank=True, default=0) + quiz_played_Moderiermodus_players= models.IntegerField(null=True, blank=True, default=0) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz') diff --git a/django/library/views.py b/django/library/views.py index bc62d6f..832b076 100644 --- a/django/library/views.py +++ b/django/library/views.py @@ -811,6 +811,9 @@ def copy_quiz(request, pk): new_quiz.base_quiz_id = pk new_quiz.rating_count = 0 new_quiz.average_rating = 3.0 + new_quiz.quiz_played_Lernmodus = 0 + new_quiz.quiz_played_Moderiermodus = 0 + new_quiz.quiz_played_Moderiermodus_players = 0 if original_quiz.status=="öffentlich": new_quiz.published_at = timezone.now() else: diff --git a/django/play/consumers/game.py b/django/play/consumers/game.py index 21ac078..7298541 100644 --- a/django/play/consumers/game.py +++ b/django/play/consumers/game.py @@ -4,7 +4,7 @@ from channels.generic.websocket import AsyncWebsocketConsumer from channels.db import database_sync_to_async from django.utils import timezone from django.urls import reverse -from play.models import QuizGame, QuizGameParticipant, QuizAnswer +from play.models import QuizGame, QuizGameParticipant, QuizAnswer,QivipQuiz from django.conf import settings from geopy.distance import geodesic @@ -149,6 +149,7 @@ class GameConsumer(AsyncWebsocketConsumer): await self.show_scoreboard() elif message_type == 'finish_game': + host_id = text_data_json['host_id'] if await self.verify_host(host_id): await self.finish_game() @@ -625,11 +626,35 @@ class GameConsumer(AsyncWebsocketConsumer): 'redirect_url': reverse('play:scores', kwargs={'join_code': self.join_code}) } ) - + + @database_sync_to_async + def counter_played_quizzes(self): # Zähler, wie oft ein Quiz gespielt worden ist. + + quiz = QuizGame.objects.get(join_code=self.join_code).quiz_id + quiz_game = QuizGame.objects.get(join_code=self.join_code) + + + + + + if quiz_game.single_player_or_multiple=="multiple": + quiz.quiz_played_Moderiermodus+=1 + + active_participants = QuizGameParticipant.objects.filter( + quiz_game=quiz_game + ).count() + quiz.quiz_played_Moderiermodus_players+=active_participants + + else: + quiz.quiz_played_Lernmodus+=1 + quiz.save() + @database_sync_to_async def _finish_game(self): try: + quiz_game = QuizGame.objects.get(join_code=self.join_code) + quiz_game.current_state = 'finished' quiz_game.save() return True @@ -638,6 +663,7 @@ class GameConsumer(AsyncWebsocketConsumer): async def finish_game(self): success = await self._finish_game() + await self.counter_played_quizzes() if success: # Notify clients to redirect to finished page await self.channel_layer.group_send( diff --git a/django/play/migrations/0017_quizgame_quiz_played_lernmodus_and_more.py b/django/play/migrations/0017_quizgame_quiz_played_lernmodus_and_more.py new file mode 100644 index 0000000..7be4668 --- /dev/null +++ b/django/play/migrations/0017_quizgame_quiz_played_lernmodus_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1.7 on 2025-11-14 13:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('play', '0016_quizgameparticipant_coordinate_answer'), + ] + + operations = [ + migrations.AddField( + model_name='quizgame', + name='quiz_played_Lernmodus', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='quizgame', + name='quiz_played_Moderiermodus', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='quizgame', + name='quiz_played_Moderiermodus_players', + field=models.IntegerField(blank=True, default=0, null=True), + ), + ] diff --git a/django/play/migrations/0018_quizgame_single_player_or_multiple.py b/django/play/migrations/0018_quizgame_single_player_or_multiple.py new file mode 100644 index 0000000..1e6f584 --- /dev/null +++ b/django/play/migrations/0018_quizgame_single_player_or_multiple.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-11-14 14:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('play', '0017_quizgame_quiz_played_lernmodus_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='quizgame', + name='single_player_or_multiple', + field=models.CharField(blank=True, max_length=20), + ), + ] diff --git a/django/play/migrations/0019_remove_quizgame_quiz_played_lernmodus_and_more.py b/django/play/migrations/0019_remove_quizgame_quiz_played_lernmodus_and_more.py new file mode 100644 index 0000000..fb56a4b --- /dev/null +++ b/django/play/migrations/0019_remove_quizgame_quiz_played_lernmodus_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.7 on 2025-11-14 14:50 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('play', '0018_quizgame_single_player_or_multiple'), + ] + + operations = [ + migrations.RemoveField( + model_name='quizgame', + name='quiz_played_Lernmodus', + ), + migrations.RemoveField( + model_name='quizgame', + name='quiz_played_Moderiermodus', + ), + migrations.RemoveField( + model_name='quizgame', + name='quiz_played_Moderiermodus_players', + ), + migrations.RemoveField( + model_name='quizgame', + name='single_player_or_multiple', + ), + ] diff --git a/django/play/migrations/0020_quizgame_single_player_or_multiple.py b/django/play/migrations/0020_quizgame_single_player_or_multiple.py new file mode 100644 index 0000000..950d4c0 --- /dev/null +++ b/django/play/migrations/0020_quizgame_single_player_or_multiple.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-11-14 15:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('play', '0019_remove_quizgame_quiz_played_lernmodus_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='quizgame', + name='single_player_or_multiple', + field=models.CharField(blank=True, max_length=20), + ), + ] diff --git a/django/play/models.py b/django/play/models.py index 6d47299..70aa7c7 100644 --- a/django/play/models.py +++ b/django/play/models.py @@ -15,7 +15,7 @@ class QuizGame(models.Model): ('scoreboard', 'Scoreboard'), ] - + single_player_or_multiple=models.CharField(max_length=20, blank=True) host_id = models.CharField(max_length=200, unique=True) join_code = models.CharField(max_length=6, unique=True, blank=True) quiz_id = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE) diff --git a/django/play/views.py b/django/play/views.py index daeba2a..55d7091 100644 --- a/django/play/views.py +++ b/django/play/views.py @@ -419,14 +419,24 @@ def waiting_room(request, join_code): def selected_mode(request, join_code): - - mode = request.GET.get('mode','default') request.session['mode'] = mode + + quiz_game = QuizGame.objects.get(join_code=join_code) + if mode=="learn": + + quiz_game.single_player_or_multiple="single" + else: + + quiz_game.single_player_or_multiple="multiple" + + quiz_game.save() + + quiz_game = get_object_or_404(QuizGame, join_code=join_code) quiz = get_object_or_404(QivipQuiz, pk=quiz_game.quiz_id.id) - QuizGameParticipant.objects.filter(quiz_game=quiz_game).delete() + QuizGameParticipant.objects.filter(quiz_game=quiz_game).delete() # Hier werden die Fragen gemischt! import random diff --git a/django/templates/library/detail_quiz.html b/django/templates/library/detail_quiz.html index 83d30dd..47c8f54 100644 --- a/django/templates/library/detail_quiz.html +++ b/django/templates/library/detail_quiz.html @@ -31,7 +31,7 @@ - Quiz kopieren + Quiz duplizieren {% if quiz.questions.count != 0 %} @@ -405,6 +405,28 @@ +
+

+ Quiz-Statistik +

+ +
+

+ {{ quiz.quiz_played_Lernmodus }} + mal im Lernmodus gespielt +

+ +

+ {{ quiz.quiz_played_Moderiermodus }} + mal im Moderiermodus gespielt + + (insg. {{ quiz.quiz_played_Moderiermodus_players }} Spieler) + +

+
+
+ + {% endblock %}