diff --git a/.env b/.env index ca5e610..224e164 100644 --- a/.env +++ b/.env @@ -6,7 +6,7 @@ DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] # PostgreSQL settings POSTGRES_DB=players_db POSTGRES_USER=42student -POSTGRES_PASSWORD=qwerty#42 +POSTGRES_PASSWORD=qwerty DB_HOST=db DB_PORT=5432 diff --git a/myapp/admin.py b/myapp/admin.py deleted file mode 100644 index ab97222..0000000 --- a/myapp/admin.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.contrib import admin - -# Register your models here. -from .models import Player - -# Register your models here. -admin.site.register(Player) diff --git a/myapp/apps.py b/myapp/apps.py deleted file mode 100644 index c34fb20..0000000 --- a/myapp/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class MyappConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'myapp' diff --git a/myapp/migrations/0001_initial.py b/myapp/migrations/0001_initial.py deleted file mode 100644 index 37afe33..0000000 --- a/myapp/migrations/0001_initial.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.0.6 on 2024-07-08 15:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Article', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=100)), - ('content', models.TextField()), - ('published_date', models.DateTimeField(auto_now_add=True)), - ], - ), - ] diff --git a/myapp/migrations/0002_alter_article_title.py b/myapp/migrations/0002_alter_article_title.py deleted file mode 100644 index d066c17..0000000 --- a/myapp/migrations/0002_alter_article_title.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.6 on 2024-07-10 16:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('myapp', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='article', - name='title', - field=models.CharField(max_length=200), - ), - ] diff --git a/myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py b/myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py deleted file mode 100644 index c667a92..0000000 --- a/myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py +++ /dev/null @@ -1,89 +0,0 @@ -# Generated by Django 5.0.6 on 2024-07-11 14:54 - -import django.contrib.auth.models -import django.contrib.auth.validators -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('myapp', '0002_alter_article_title'), - ] - - operations = [ - migrations.CreateModel( - name='Player', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(auto_now_add=True)), - ('last_login', models.DateTimeField(auto_now=True)), - ('groups', models.ManyToManyField(blank=True, related_name='player_set', related_query_name='player', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, related_name='player_set', related_query_name='player', to='auth.permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - migrations.CreateModel( - name='Match', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('score_player1', models.IntegerField()), - ('score_player2', models.IntegerField()), - ('date', models.DateTimeField(auto_now_add=True)), - ('player1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='matches_as_player1', to='myapp.player')), - ('player2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='matches_as_player2', to='myapp.player')), - ('winner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='matches_won', to='myapp.player')), - ], - ), - migrations.CreateModel( - name='PlayerStatistics', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('matches_played', models.IntegerField(default=0)), - ('matches_won', models.IntegerField(default=0)), - ('matches_lost', models.IntegerField(default=0)), - ('tournaments_won', models.IntegerField(default=0)), - ('total_score', models.IntegerField(default=0)), - ('average_score', models.FloatField(default=0.0)), - ('player', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='myapp.player')), - ], - ), - migrations.CreateModel( - name='Tournament', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('start_date', models.DateTimeField()), - ('end_date', models.DateTimeField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('winner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tournaments_won', to='myapp.player')), - ], - ), - migrations.CreateModel( - name='TournamentParticipation', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('match', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='myapp.match')), - ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myapp.player')), - ('tournament', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myapp.tournament')), - ], - ), - ] diff --git a/myapp/migrations/__init__.py b/myapp/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/myapp/models.py b/myapp/models.py deleted file mode 100644 index 7075e1d..0000000 --- a/myapp/models.py +++ /dev/null @@ -1,48 +0,0 @@ -from django.db import models -from django.core.exceptions import ValidationError - -# Create your models here. - -class Player(models.Model): - name = models.CharField(max_length=100) - - def __str__(self): - return self.name - -class Tournoi(models.model): - name = models.CharField(max_length=200) - nbr_player = models.PositiveSmallIntegerField() - date = models.DateField() - winner = models.ForeignKey('Player', on_delete=models.SET_NULL, null=True) - - def __str__(self): - return self.name - -class Match(models.Model): - player1 = models.ForeignKey('Player', related_query_name='match_as_player1', on_delete=models.CASCADE) - player2 = models.ForeignKey('Player', related_query_name='match_as_player2', on_delete=models.CASCADE) - score_player1 = models.PositiveSmallIntegerField() - score_player2 = models.PositiveSmallIntegerField() - winner = models.ForeignKey('Player', related_query_name='won_matches',on_delete=models.CASCADE) - nbr_ball_touch_p1 = models.PositiveIntegerField() - nbr_ball_touch_p2 = models.PositiveIntegerField() - duration = models.DurationField() - date = models.DateField(auto_now_add=True) - is_tournoi = models.BooleanField() - tournoi = models.ForeignKey('Tournoi', related_query_name='matches', on_delete=models.SET_NULL, null=True) - - def clean(self): - if self.score_player1 < 0 or self.score_player2 < 0: - raise ValidationError('Les scores doivent être positifs.') - if self.score_player1 > self.score_player2 and self.winner != self.player1: - raise ValidationError('Le gagnant ne correspond pas aux scores.') - if self.score_player2 > self.score_player1 and self.winner != self.player2: - raise ValidationError('Le gagnant ne correspond pas aux scores.') - super().clean() - - def save(self, *args, **kwargs): - self.full_clean() # Appel de la méthode clean() avant d'enregistrer - super().save(*args, **kwargs) - - def __str__(self): - return f"{self.player1.name} vs {self.player2.name}" diff --git a/myapp/tests.py b/myapp/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/myapp/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/myapp/urls.py b/myapp/urls.py deleted file mode 100644 index e71bb21..0000000 --- a/myapp/urls.py +++ /dev/null @@ -1,4 +0,0 @@ -# myapp/urls.py - -from django.urls import path -from . import views diff --git a/myapp/utils.py b/myapp/utils.py deleted file mode 100644 index 027fb71..0000000 --- a/myapp/utils.py +++ /dev/null @@ -1,60 +0,0 @@ -from myapp.models import Player, Tournoi, Match -from django.core.exceptions import ValidationError - -def create_player(name): - player = Player(name=name) - player.save() - return player - -def create_tournoi(name, nbr_player, date, winner=None): - tournoi = Tournoi(name=name, nbr_player=nbr_player, date=date, winner=winner) - tournoi.save() - return tournoi - -def create_match(player1, player2, score_player1=0, score_player2=0, winner=None, nbr_ball_touch_p1=0, nbr_ball_touch_p2=0, duration=None, is_tournoi=False, tournoi=None): - match = Match( - player1=player1, - player2=player2, - score_player1=score_player1, - score_player2=score_player2, - winner=winner, - nbr_ball_touch_p1=nbr_ball_touch_p1, - nbr_ball_touch_p2=nbr_ball_touch_p2, - duration=duration, - is_tournoi=is_tournoi, - tournoi=tournoi - ) - match.save() - return match - -def complete_match(match_id, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration): - try: - match = Match.objects.get(id=match_id) - except Match.DoesNotExist: - raise ValidationError(f"Match with id {match_id} does not exist") - - match.score_player1 = score_player1 - match.score_player2 = score_player2 - match.nbr_ball_touch_p1 = nbr_ball_touch_p1 - match.nbr_ball_touch_p2 = nbr_ball_touch_p2 - match.duration = duration - - if score_player1 > score_player2: - match.winner = match.player1 - elif score_player2 > score_player1: - match.winner = match.player2 - else: - match.winner = None - - match.save() - return match - -def complete_tournoi(tournoi_id, player): - try: - tournoi = Tournoi.objects.get(id = tournoi_id) - except Tournoi.DoesNotExist: - raise ValidationError(f"Tournoi with id {tournoi_id} does not exist") - - tournoi.winner = player - tournoi.save() - return tournoi \ No newline at end of file diff --git a/pong/game/migrations/0001_initial.py b/pong/game/migrations/0001_initial.py new file mode 100644 index 0000000..5cab0e6 --- /dev/null +++ b/pong/game/migrations/0001_initial.py @@ -0,0 +1,49 @@ +# Generated by Django 5.0.7 on 2024-07-23 16:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Tournoi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('nbr_player', models.PositiveSmallIntegerField()), + ('date', models.DateField()), + ('winner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='game.player')), + ], + ), + migrations.CreateModel( + name='Match', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score_player1', models.PositiveSmallIntegerField()), + ('score_player2', models.PositiveSmallIntegerField()), + ('nbr_ball_touch_p1', models.PositiveIntegerField()), + ('nbr_ball_touch_p2', models.PositiveIntegerField()), + ('duration', models.DurationField()), + ('date', models.DateField(auto_now_add=True)), + ('is_tournoi', models.BooleanField()), + ('player1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='match_as_player1', to='game.player')), + ('player2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='match_as_player2', to='game.player')), + ('winner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='won_matches', to='game.player')), + ('tournoi', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='matches', to='game.tournoi')), + ], + ), + ] diff --git a/myapp/__init__.py b/pong/game/migrations/__init__.py similarity index 100% rename from myapp/__init__.py rename to pong/game/migrations/__init__.py diff --git a/pong/game/models.py b/pong/game/models.py index 85b415b..6068904 100644 --- a/pong/game/models.py +++ b/pong/game/models.py @@ -3,4 +3,49 @@ from django.db import models from django.contrib.auth.models import User -User.add_to_class('auth_token', models.CharField(max_length=100, null=True, blank=True, unique=True)) \ No newline at end of file +User.add_to_class('auth_token', models.CharField(max_length=100, null=True, blank=True, unique=True)) +# Create your models here. + +class Player(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + +class Tournoi(models.Model): + name = models.CharField(max_length=200) + nbr_player = models.PositiveSmallIntegerField() + date = models.DateField() + winner = models.ForeignKey('Player', on_delete=models.SET_NULL, null=True) + + def __str__(self): + return self.name + +class Match(models.Model): + player1 = models.ForeignKey('Player', related_name='match_as_player1', on_delete=models.CASCADE) + player2 = models.ForeignKey('Player', related_name='match_as_player2', on_delete=models.CASCADE) + score_player1 = models.PositiveSmallIntegerField() + score_player2 = models.PositiveSmallIntegerField() + winner = models.ForeignKey('Player', related_name='won_matches',on_delete=models.CASCADE) + nbr_ball_touch_p1 = models.PositiveIntegerField() + nbr_ball_touch_p2 = models.PositiveIntegerField() + duration = models.DurationField() + date = models.DateField(auto_now_add=True) + is_tournoi = models.BooleanField() + tournoi = models.ForeignKey('Tournoi', related_name='matches', on_delete=models.SET_NULL, null=True) + + def clean(self): + if self.score_player1 < 0 or self.score_player2 < 0: + raise ValidationError('Les scores doivent être positifs.') + if self.score_player1 > self.score_player2 and self.winner != self.player1: + raise ValidationError('Le gagnant ne correspond pas aux scores.') + if self.score_player2 > self.score_player1 and self.winner != self.player2: + raise ValidationError('Le gagnant ne correspond pas aux scores.') + super().clean() + + def save(self, *args, **kwargs): + self.full_clean() # Appel de la méthode clean() avant d'enregistrer + super().save(*args, **kwargs) + + def __str__(self): + return f"{self.player1.name} vs {self.player2.name}" \ No newline at end of file diff --git a/myapp/views.py b/pong/game/utils.py similarity index 53% rename from myapp/views.py rename to pong/game/utils.py index 8fff235..4985d59 100644 --- a/myapp/views.py +++ b/pong/game/utils.py @@ -1,9 +1,63 @@ -# myapp/views.py +from myapp.models import Player, Tournoi, Match +from django.core.exceptions import ValidationError -from django.shortcuts import render, get_object_or_404 -from .models import Player, Match, Tournoi -from django.http import JsonResponse -from django.db.models import Max +def create_player(name): + player = Player(name=name) + player.save() + return player + +def create_tournoi(name, nbr_player, date, winner=None): + tournoi = Tournoi(name=name, nbr_player=nbr_player, date=date, winner=winner) + tournoi.save() + return tournoi + +def create_match(player1, player2, score_player1=0, score_player2=0, winner=None, nbr_ball_touch_p1=0, nbr_ball_touch_p2=0, duration=None, is_tournoi=False, tournoi=None): + match = Match( + player1=player1, + player2=player2, + score_player1=score_player1, + score_player2=score_player2, + winner=winner, + nbr_ball_touch_p1=nbr_ball_touch_p1, + nbr_ball_touch_p2=nbr_ball_touch_p2, + duration=duration, + is_tournoi=is_tournoi, + tournoi=tournoi + ) + match.save() + return match + +def complete_match(match_id, score_player1, score_player2, nbr_ball_touch_p1, nbr_ball_touch_p2, duration): + try: + match = Match.objects.get(id=match_id) + except Match.DoesNotExist: + raise ValidationError(f"Match with id {match_id} does not exist") + + match.score_player1 = score_player1 + match.score_player2 = score_player2 + match.nbr_ball_touch_p1 = nbr_ball_touch_p1 + match.nbr_ball_touch_p2 = nbr_ball_touch_p2 + match.duration = duration + + if score_player1 > score_player2: + match.winner = match.player1 + elif score_player2 > score_player1: + match.winner = match.player2 + else: + match.winner = None + + match.save() + return match + +def complete_tournoi(tournoi_id, player): + try: + tournoi = Tournoi.objects.get(id = tournoi_id) + except Tournoi.DoesNotExist: + raise ValidationError(f"Tournoi with id {tournoi_id} does not exist") + + tournoi.winner = player + tournoi.save() + return tournoi def player_statistics(request, player_name): player = get_object_or_404(Player, nam = player_name) @@ -45,6 +99,8 @@ def player_statistics(request, player_name): 'num_won_tournaments': num_won_tournaments } + return data +