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/play/admin.py b/core/play/admin.py index 8c38f3f..f06dea8 100644 --- a/core/play/admin.py +++ b/core/play/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import QuizGame, QuizGameParticipant # 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/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 71a8362..b4e16f0 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, blank=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 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/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 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 %}
- +