From d1b11a0c510b6435305ebe75d1356c24ed7da4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhn-Vitus=20Sa=C3=9F?= Date: Sat, 15 Mar 2025 13:46:34 +0100 Subject: [PATCH 1/6] Update Gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3d492e8..f4cd75e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ __pycache__ .venv db.sqlite3 tailwindcss.exe -t-style.css \ No newline at end of file +t-style.css +dump.rdb \ No newline at end of file From 7120dcd31705c29d96343c837587b72bbdac2f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhn-Vitus=20Sa=C3=9F?= Date: Sat, 15 Mar 2025 14:50:57 +0100 Subject: [PATCH 2/6] =?UTF-8?q?DB=20Model=20f=C3=BCr=20Quiz=20Spiele?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/play/admin.py | 3 +++ core/play/migrations/0001_initial.py | 37 ++++++++++++++++++++++++++++ core/play/models.py | 24 ++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 core/play/migrations/0001_initial.py diff --git a/core/play/admin.py b/core/play/admin.py index 8c38f3f..bdfc9d0 100644 --- a/core/play/admin.py +++ b/core/play/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from . import models # Register your models here. +admin.site.register(QuizGame) +admin.site.register(QuizGameParticipant) \ No newline at end of file diff --git a/core/play/migrations/0001_initial.py b/core/play/migrations/0001_initial.py new file mode 100644 index 0000000..169302f --- /dev/null +++ b/core/play/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# Generated by Django 5.1.7 on 2025-03-15 13:48 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('library', '0015_alter_qivipquiz_difficulty'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='QuizGame', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('join_code', models.CharField(max_length=6, unique=True)), + ('host_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='host_user', to=settings.AUTH_USER_MODEL)), + ('quiz_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='library.qivipquiz')), + ], + ), + migrations.CreateModel( + name='QuizGameParticipant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('display_name', models.CharField(max_length=15, verbose_name='Anzeigename')), + ('score', models.IntegerField(max_length=10, verbose_name='Punkte')), + ('avatar', models.CharField(max_length=200)), + ('quiz_game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participant', to='play.quizgame')), + ], + ), + ] diff --git a/core/play/models.py b/core/play/models.py index 71a8362..ce16a5d 100644 --- a/core/play/models.py +++ b/core/play/models.py @@ -1,3 +1,27 @@ from django.db import models +from django.contrib.auth.models import User +from library.models import QivipQuiz +import random, string # Create your models here. +class QuizGame(models.Model): + host_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='host_user') + join_code = models.CharField(max_length=6, unique=True) + quiz_id = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE) + + def save(self, *args, **kwargs): + if not self.join_code: + self.join_code = self.generate_unique_code() + super().save(*args, **kwargs) + + def generate_unique_code(self): + for i in range(10): + new_code = ''.join(random.choices(string.ascii_letters + string.digits, k=6)) + if not QuizGame.objects.filter(join_code=new_code).exists(): + return new_code + +class QuizGameParticipant(models.Model): + display_name = models.CharField(verbose_name="Anzeigename", max_length=15) + quiz_game = models.ForeignKey(QuizGame, on_delete=models.CASCADE, related_name="participant") + score = models.IntegerField(verbose_name="Punkte", max_length=10) + avatar = models.CharField(max_length=200) \ No newline at end of file From c8bf38dd366be36cf2983effbb2f7c3e962d25b4 Mon Sep 17 00:00:00 2001 From: Henrik Mildner Date: Sat, 15 Mar 2025 14:51:36 +0100 Subject: [PATCH 3/6] Structure Installed Apps --- core/core/settings.py | 2 +- core/templates/play/game/score_overview.html | 5 +++++ core/templates/play/game/wait_for_other_players.html | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/core/settings.py b/core/core/settings.py index ae0192c..ebf1574 100644 --- a/core/core/settings.py +++ b/core/core/settings.py @@ -35,7 +35,7 @@ INSTALLED_APPS = [ 'homepage.apps.HomepageConfig', 'components.apps.ComponentsConfig', 'accounts.apps.AccountsConfig', - 'play.apps.PlayConfig', + 'play', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/core/templates/play/game/score_overview.html b/core/templates/play/game/score_overview.html index e69de29..f90e7b5 100644 --- a/core/templates/play/game/score_overview.html +++ b/core/templates/play/game/score_overview.html @@ -0,0 +1,5 @@ + + Spieler sehen ihre Punktzahl, Platzierung und Richtig/Falsch + + Host: Scoreboard, Button: 'Weiter' + \ No newline at end of file diff --git a/core/templates/play/game/wait_for_other_players.html b/core/templates/play/game/wait_for_other_players.html index e69de29..8094ed8 100644 --- a/core/templates/play/game/wait_for_other_players.html +++ b/core/templates/play/game/wait_for_other_players.html @@ -0,0 +1,5 @@ + + Spieler: Countdown, automatische Weiterleitung + + (Host: Frage) + \ No newline at end of file From 9f51def959e08369c3190da3fe0722e36bbe123a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhn-Vitus=20Sa=C3=9F?= Date: Sat, 15 Mar 2025 14:52:58 +0100 Subject: [PATCH 4/6] Fix Admin --- core/play/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/play/admin.py b/core/play/admin.py index bdfc9d0..f06dea8 100644 --- a/core/play/admin.py +++ b/core/play/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from . import models +from .models import QuizGame, QuizGameParticipant # Register your models here. admin.site.register(QuizGame) From 838eaab9be385f2e34fff5d8ee6af5cfb0c9b579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhn-Vitus=20Sa=C3=9F?= Date: Sat, 15 Mar 2025 14:59:53 +0100 Subject: [PATCH 5/6] Fix Code generation --- .../0002_alter_quizgame_join_code.py | 18 ++++++++++++++++++ core/play/models.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 core/play/migrations/0002_alter_quizgame_join_code.py diff --git a/core/play/migrations/0002_alter_quizgame_join_code.py b/core/play/migrations/0002_alter_quizgame_join_code.py new file mode 100644 index 0000000..388daea --- /dev/null +++ b/core/play/migrations/0002_alter_quizgame_join_code.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.7 on 2025-03-15 13:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('play', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='quizgame', + name='join_code', + field=models.CharField(blank=True, max_length=6, unique=True), + ), + ] diff --git a/core/play/models.py b/core/play/models.py index ce16a5d..b4e16f0 100644 --- a/core/play/models.py +++ b/core/play/models.py @@ -6,7 +6,7 @@ import random, string # Create your models here. class QuizGame(models.Model): host_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='host_user') - join_code = models.CharField(max_length=6, unique=True) + join_code = models.CharField(max_length=6, unique=True, blank=True) quiz_id = models.ForeignKey(QivipQuiz, on_delete=models.CASCADE) def save(self, *args, **kwargs): From 346ac69046241e7af64c6a117fea2298117987a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhn-Vitus=20Sa=C3=9F?= Date: Sat, 15 Mar 2025 15:25:39 +0100 Subject: [PATCH 6/6] Join Mechanik erstellen --- core/play/urls.py | 2 +- core/play/views.py | 16 ++++++++++++++-- core/templates/play/join_game.html | 2 +- core/templates/play/lobby.html | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/play/urls.py b/core/play/urls.py index f69a807..72f8362 100644 --- a/core/play/urls.py +++ b/core/play/urls.py @@ -4,6 +4,6 @@ from . import views app_name = 'play' urlpatterns = [ - path('lobby', views.lobby, name='lobby'), + path('lobby/', views.lobby, name='lobby'), path('join', views.join_game, name='join_game'), ] \ No newline at end of file diff --git a/core/play/views.py b/core/play/views.py index b0daa44..69e57fc 100644 --- a/core/play/views.py +++ b/core/play/views.py @@ -1,8 +1,20 @@ from django.shortcuts import render +from django.shortcuts import render, redirect, get_object_or_404 +from play.models import QuizGame +from library.models import QivipQuiz # Create your views here. -def lobby(request): - return render(request, 'play/lobby.html') +def lobby(request, join_code): + quiz_game = get_object_or_404(QuizGame, join_code=join_code) + return render(request, 'play/lobby.html', {'debug': "test"}) def join_game(request): + if request.method == 'POST': + join_code = request.POST.get('game_code') + try: + quiz = QuizGame.objects.get(join_code=join_code) + return redirect('play:lobby', join_code=join_code) + except QuizGame.DoesNotExist: + # TODO: Mit message eine Fehlermeldung weitergeben (und im entsprechenden Template Designen) + pass return render(request, 'play/join_game.html') \ No newline at end of file diff --git a/core/templates/play/join_game.html b/core/templates/play/join_game.html index 526050e..7b951b5 100644 --- a/core/templates/play/join_game.html +++ b/core/templates/play/join_game.html @@ -7,7 +7,7 @@
{% csrf_token %}
- +