From b65af0fe0a33d7e76d704391eca4e7a2cc5e0505 Mon Sep 17 00:00:00 2001 From: Theouche Date: Thu, 18 Jul 2024 14:38:03 +0200 Subject: [PATCH 1/2] Tab ok --- docker-compose.yaml | 4 +- makefile | 4 +- myapp/__init__.py | 0 myapp/admin.py | 7 ++ myapp/apps.py | 6 ++ myapp/migrations/0001_initial.py | 23 +++++ myapp/migrations/0002_alter_article_title.py | 18 ++++ ...ch_playerstatistics_tournament_and_more.py | 89 +++++++++++++++++++ myapp/migrations/__init__.py | 0 myapp/models.py | 42 +++++++++ myapp/tests.py | 3 + myapp/urls.py | 4 + myapp/views.py | 4 + 13 files changed, 200 insertions(+), 4 deletions(-) create mode 100644 myapp/__init__.py create mode 100644 myapp/admin.py create mode 100644 myapp/apps.py create mode 100644 myapp/migrations/0001_initial.py create mode 100644 myapp/migrations/0002_alter_article_title.py create mode 100644 myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py create mode 100644 myapp/migrations/__init__.py create mode 100644 myapp/models.py create mode 100644 myapp/tests.py create mode 100644 myapp/urls.py create mode 100644 myapp/views.py diff --git a/docker-compose.yaml b/docker-compose.yaml index d67d45c..142f4c9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -52,13 +52,13 @@ volumes: driver: local driver_opts: type: none - device: /home/motoko/ft_transcendence/data/db + device: /home/theouche/trans/git_trans/data/db o: bind helloword_project: driver: local driver_opts: type: none - device: /home/motoko/ft_transcendence/helloworld + device: /home/theouche/trans/git_trans/helloworld o: bind networks: diff --git a/makefile b/makefile index e892915..11636f9 100644 --- a/makefile +++ b/makefile @@ -2,7 +2,7 @@ all: build @echo "Building Docker images..." - sudo mkdir -p $$HOME/ft_transcendence/data/db + sudo mkdir -p $$PWD/data/db sudo docker compose -f ./docker-compose.yaml up -d --build down: @@ -15,7 +15,7 @@ clean: sudo docker rm $$(docker ps -qa);\ sudo docker rmi $$(docker image ls -q);\ sudo docker volume rm $$(docker volume ls -q);\ - sudo rm -rf $$HOME/ft_transcendence/data/db ;\ + sudo rm -rf $$PWD/data/db ;\ logs: @echo "Displaying Docker logs..." diff --git a/myapp/__init__.py b/myapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/admin.py b/myapp/admin.py new file mode 100644 index 0000000..ab97222 --- /dev/null +++ b/myapp/admin.py @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..c34fb20 --- /dev/null +++ b/myapp/apps.py @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..37afe33 --- /dev/null +++ b/myapp/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# 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 new file mode 100644 index 0000000..d066c17 --- /dev/null +++ b/myapp/migrations/0002_alter_article_title.py @@ -0,0 +1,18 @@ +# 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 new file mode 100644 index 0000000..c667a92 --- /dev/null +++ b/myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py @@ -0,0 +1,89 @@ +# 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 new file mode 100644 index 0000000..e69de29 diff --git a/myapp/models.py b/myapp/models.py new file mode 100644 index 0000000..69525a6 --- /dev/null +++ b/myapp/models.py @@ -0,0 +1,42 @@ +from django.db import models + +# Create your models here. + +class Player(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.nom + +class Tournoi(models.model): + nom = 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.nom + +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() + 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.') + 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 new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/myapp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/myapp/urls.py b/myapp/urls.py new file mode 100644 index 0000000..e71bb21 --- /dev/null +++ b/myapp/urls.py @@ -0,0 +1,4 @@ +# myapp/urls.py + +from django.urls import path +from . import views diff --git a/myapp/views.py b/myapp/views.py new file mode 100644 index 0000000..cee9e6b --- /dev/null +++ b/myapp/views.py @@ -0,0 +1,4 @@ +# myapp/views.py + +from django.shortcuts import render, get_object_or_404 + From 4c5de99f3b3ec051a8848b36365fecd7fdf999cc Mon Sep 17 00:00:00 2001 From: Theouche Date: Tue, 23 Jul 2024 18:10:12 +0200 Subject: [PATCH 2/2] data merge avec le groupe --- .env | 2 +- myapp/admin.py | 7 -- myapp/apps.py | 6 -- myapp/migrations/0001_initial.py | 23 ----- myapp/migrations/0002_alter_article_title.py | 18 ---- ...ch_playerstatistics_tournament_and_more.py | 89 ------------------- myapp/migrations/__init__.py | 0 myapp/models.py | 48 ---------- myapp/tests.py | 3 - myapp/urls.py | 4 - myapp/utils.py | 60 ------------- pong/game/migrations/0001_initial.py | 49 ++++++++++ {myapp => pong/game/migrations}/__init__.py | 0 pong/game/models.py | 47 +++++++++- myapp/views.py => pong/game/utils.py | 66 ++++++++++++-- 15 files changed, 157 insertions(+), 265 deletions(-) delete mode 100644 myapp/admin.py delete mode 100644 myapp/apps.py delete mode 100644 myapp/migrations/0001_initial.py delete mode 100644 myapp/migrations/0002_alter_article_title.py delete mode 100644 myapp/migrations/0003_player_match_playerstatistics_tournament_and_more.py delete mode 100644 myapp/migrations/__init__.py delete mode 100644 myapp/models.py delete mode 100644 myapp/tests.py delete mode 100644 myapp/urls.py delete mode 100644 myapp/utils.py create mode 100644 pong/game/migrations/0001_initial.py rename {myapp => pong/game/migrations}/__init__.py (100%) rename myapp/views.py => pong/game/utils.py (53%) 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 +