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 +