diff --git a/WSR/admin.py b/WSR/admin.py index 88c7819f7ee2f0ff60d3ee3c5aa357cbbbfa1b4e..2a282912958622d090e1a596d34b42c2f3ac6cea 100644 --- a/WSR/admin.py +++ b/WSR/admin.py @@ -4,9 +4,9 @@ from WSR.models import * # Register your models here. admin.site.register(Article) -admin.site.register(Course) -admin.site.register(Resultat) -admin.site.register(Vehicule) -admin.site.register(Pilote) +admin.site.register(Race) +admin.site.register(Result) +admin.site.register(Vehicle) +admin.site.register(Driver) admin.site.register(Participation) -admin.site.register(Saison) \ No newline at end of file +admin.site.register(Season) \ No newline at end of file diff --git a/WSR/migrations/0001_initial.py b/WSR/migrations/0001_initial.py index f0e0af190cf20cbaf75c11c1e0496e80d250a648..44e07f1a89f97c6af5bf43e65d334562f9d94b8e 100644 --- a/WSR/migrations/0001_initial.py +++ b/WSR/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 4.2.1 on 2023-06-03 15:45 +# Generated by Django 4.2.2 on 2023-06-10 16:59 +import datetime from django.db import migrations, models import django.db.models.deletion @@ -16,71 +17,75 @@ class Migration(migrations.Migration): name='Article', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('titre', models.CharField(max_length=100)), - ('contenu', models.TextField()), - ('date_publication', models.DateTimeField(auto_now_add=True)), + ('title', models.CharField(max_length=100)), + ('content', models.TextField()), + ('publication_date', models.DateTimeField(auto_now_add=True)), ], ), migrations.CreateModel( - name='Course', + name='Driver', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nom', models.CharField(max_length=100)), - ('circuit', models.CharField(max_length=100)), - ('image', models.ImageField(upload_to='course_images')), + ('name', models.CharField(max_length=100)), ], ), migrations.CreateModel( - name='Pilote', + name='Race', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nom', models.CharField(max_length=100)), + ('name', models.CharField(max_length=100)), + ('circuit', models.CharField(max_length=100)), + ('finishing_position', models.PositiveIntegerField(verbose_name='Finishing Position')), + ('image', models.ImageField(upload_to='race_images', verbose_name='Illustration Image')), + ('type', models.CharField(choices=[('invitation', 'Invitation'), ('championship', 'Championship'), ('single_race', 'Single Race')], default='single_race', max_length=100)), + ('date', models.DateField(default=datetime.date.today)), ], ), migrations.CreateModel( - name='Saison', + name='Season', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nom', models.CharField(max_length=100)), - ('annee', models.PositiveIntegerField()), + ('name', models.CharField(max_length=100)), + ('year', models.PositiveIntegerField(verbose_name='Year')), ], ), migrations.CreateModel( - name='Vehicule', + name='Vehicle', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('marque', models.CharField(max_length=100)), - ('modele', models.CharField(max_length=100)), - ('annee_fabrication', models.PositiveIntegerField()), + ('brand', models.CharField(max_length=100)), + ('model', models.CharField(max_length=100, verbose_name='Model')), + ('fabrication_year', models.PositiveIntegerField(verbose_name='Fabrication Year')), ], ), migrations.CreateModel( - name='Resultat', + name='Result', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('position_arrivee', models.PositiveIntegerField()), - ('position_depart', models.PositiveIntegerField()), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.course')), - ('pilote', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.pilote')), + ('finishing_position', models.PositiveIntegerField(verbose_name='Finishing Position')), + ('starting_position', models.PositiveIntegerField(verbose_name='Starting Position')), + ('score', models.IntegerField()), + ('driver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.driver')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.race')), ], ), migrations.AddField( - model_name='pilote', - name='vehicule', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.vehicule'), + model_name='race', + name='season', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.season'), ), migrations.CreateModel( name='Participation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.course')), - ('pilotes', models.ManyToManyField(to='WSR.pilote')), - ('saison', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.saison')), + ('drivers', models.ManyToManyField(to='WSR.driver')), + ('race', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.race')), + ('season', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.season')), ], ), migrations.AddField( - model_name='course', - name='saison', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.saison'), + model_name='driver', + name='vehicle', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.vehicle', verbose_name='Vehicle'), ), ] diff --git a/WSR/migrations/0002_course_date_course_type_alter_course_image_and_more.py b/WSR/migrations/0002_course_date_course_type_alter_course_image_and_more.py deleted file mode 100644 index 2cf92209c1eb0f0596a0b9a538252241e4436110..0000000000000000000000000000000000000000 --- a/WSR/migrations/0002_course_date_course_type_alter_course_image_and_more.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.2.1 on 2023-06-06 19:52 - -import datetime -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('WSR', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='course', - name='date', - field=models.DateField(default=datetime.date.today), - ), - migrations.AddField( - model_name='course', - name='type', - field=models.CharField(choices=[('invitation', 'Invitation'), ('championnat', 'Championnat'), ('course_simple', 'Course Simple')], default='course_simple', max_length=100), - ), - migrations.AlterField( - model_name='course', - name='image', - field=models.ImageField(upload_to='course_images', verbose_name="Image d'illustration"), - ), - migrations.AlterField( - model_name='pilote', - name='vehicule', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.vehicule', verbose_name='Véhicule'), - ), - migrations.AlterField( - model_name='resultat', - name='position_arrivee', - field=models.PositiveIntegerField(verbose_name="Position à l'arrivée"), - ), - migrations.AlterField( - model_name='resultat', - name='position_depart', - field=models.PositiveIntegerField(verbose_name='Position de départ'), - ), - migrations.AlterField( - model_name='saison', - name='annee', - field=models.PositiveIntegerField(verbose_name='Année'), - ), - migrations.AlterField( - model_name='vehicule', - name='annee_fabrication', - field=models.PositiveIntegerField(verbose_name='Année de fabrication'), - ), - migrations.AlterField( - model_name='vehicule', - name='modele', - field=models.CharField(max_length=100, verbose_name='Modèle'), - ), - ] diff --git a/WSR/migrations/0003_resultat_score.py b/WSR/migrations/0003_resultat_score.py deleted file mode 100644 index a2a1d54a6b6a311005428e1e4221dc56e5b6dad8..0000000000000000000000000000000000000000 --- a/WSR/migrations/0003_resultat_score.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.1 on 2023-06-06 20:05 -import random - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('WSR', '0002_course_date_course_type_alter_course_image_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='resultat', - name='score', - field=models.IntegerField(default=random.randrange(500, 8000, 500)), - preserve_default=False, - ), - ] diff --git a/WSR/models.py b/WSR/models.py index 96755091b94b0bbdf95994ec26d9a454d9804fc1..fc5d1e68eade15d9fb45a7b6e56b17e01e3e6200 100644 --- a/WSR/models.py +++ b/WSR/models.py @@ -2,72 +2,74 @@ import datetime from django.db import models -class Saison(models.Model): - nom = models.CharField(max_length=100) - annee = models.PositiveIntegerField(verbose_name="Année") +class Season(models.Model): + name = models.CharField(max_length=100) + year = models.PositiveIntegerField(verbose_name="Year") def __str__(self): - return self.nom + return self.name -class Pilote(models.Model): - nom = models.CharField(max_length=100) - vehicule = models.ForeignKey('Vehicule', on_delete=models.CASCADE, verbose_name="Véhicule") +class Driver(models.Model): + name = models.CharField(max_length=100) + vehicle = models.ForeignKey('Vehicle', on_delete=models.CASCADE, verbose_name="Vehicle") def __str__(self): - return self.nom + return self.name -class Vehicule(models.Model): - marque = models.CharField(max_length=100) - modele = models.CharField(max_length=100, verbose_name="Modèle") - annee_fabrication = models.PositiveIntegerField(verbose_name="Année de fabrication") +class Vehicle(models.Model): + brand = models.CharField(max_length=100) + model = models.CharField(max_length=100, verbose_name="Model") + fabrication_year = models.PositiveIntegerField(verbose_name="Fabrication Year") def __str__(self): - return f"{self.marque} {self.modele}" + return f"{self.brand} {self.model}" -class Course(models.Model): - class TypeCourse(models.TextChoices): +class Race(models.Model): + class RaceType(models.TextChoices): INVITATION = "invitation" - CHAMPIONNAT = "championnat" - COURSE_SIMPLE = "course_simple" + CHAMPIONSHIP = "championship" + SINGLE_RACE = "single_race" - nom = models.CharField(max_length=100) + name = models.CharField(max_length=100) circuit = models.CharField(max_length=100) - saison = models.ForeignKey(Saison, on_delete=models.CASCADE) - image = models.ImageField(upload_to='course_images', verbose_name="Image d'illustration") - type = models.CharField(max_length=100, choices=TypeCourse.choices, default=TypeCourse.COURSE_SIMPLE) + finishing_position = models.PositiveIntegerField(verbose_name="Finishing Position") + season = models.ForeignKey(Season, on_delete=models.CASCADE) + image = models.ImageField(upload_to='race_images', verbose_name="Illustration Image") + type = models.CharField(max_length=100, choices=RaceType.choices, default=RaceType.SINGLE_RACE) date = models.DateField(default=datetime.date.today) def __str__(self): - return self.nom + return self.name class Article(models.Model): - titre = models.CharField(max_length=100) - contenu = models.TextField() - date_publication = models.DateTimeField(auto_now_add=True) + title = models.CharField(max_length=100) + content = models.TextField() + publication_date = models.DateTimeField(auto_now_add=True) def __str__(self): - return self.titre + return self.title -class Resultat(models.Model): - pilote = models.ForeignKey(Pilote, on_delete=models.CASCADE) - course = models.ForeignKey(Course, on_delete=models.CASCADE) - position_arrivee = models.PositiveIntegerField(verbose_name="Position à l'arrivée") - position_depart = models.PositiveIntegerField(verbose_name="Position de départ") +class Result(models.Model): + driver = models.ForeignKey(Driver, on_delete=models.CASCADE) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + finishing_position = models.PositiveIntegerField(verbose_name="Finishing Position") + starting_position = models.PositiveIntegerField(verbose_name="Starting Position") score = models.IntegerField() def __str__(self): - return f"{self.pilote} - {self.course}" + return f"{self.driver} - {self.race}" class Participation(models.Model): - saison = models.ForeignKey(Saison, on_delete=models.CASCADE) - course = models.ForeignKey(Course, on_delete=models.CASCADE) - pilotes = models.ManyToManyField(Pilote) + season = models.ForeignKey(Season, on_delete=models.CASCADE) + race = models.ForeignKey(Race, on_delete=models.CASCADE) + drivers = models.ManyToManyField(Driver) def __str__(self): - return f"{self.saison} - {self.course}" + return f"{self.season} - {self.race}" + diff --git a/WSR/templates/home.html b/WSR/templates/home.html index c40ea9fa3220ac16dca5bdb8fe52b983228480ac..2145f854022dc3f6091754d4f0ff3423f32f32c7 100644 --- a/WSR/templates/home.html +++ b/WSR/templates/home.html @@ -26,43 +26,52 @@ <div class="container vitrine"> <div class="main-frame eurostile"> <div> - <div class="mid">SAISON 4</div> - <div class="large">Chicago</div> - <div class="mid">La boucle</div> + <div class="mid">{{ last_race_details.season_name }}</div> + <div class="large">{{ last_race_details.race.circuit }}</div> + <div class="mid">{{ last_race_details.race.name }}</div> </div> <div class="detail"> - <div> - <div class="title">Billy Rosewood</div> - <div class="score">2ème position <br>13 500 PTS</div> - </div> - <div> - <div class="title">John Carter</div> - <div class="score">4ème position <br>7 500 PTS</div> - </div> + {% for stat in last_race_details.results %} + <div> + <div class="title">{{ stat.driver_name }}</div> + <div class="score">{{ stat.pos_string }} position <br>{{ stat.score }} PTS</div> + </div> + {% endfor %} </div> - <div class="mid">WSR Admis en finale</div> + {% if last_race_details.race.finishing_position < 5 %} + <div class="mid">WSR Admis en finale</div> + {% else %} + <div class="mid">WSR recalé</div> + {% endif %} </div> <div class="seconds-frames"> - <div class="second-frame"> - <div class="header"> - <div class="pos">1er</div> - </div> - <div class="event-type"><i class="fa-solid fa-envelope"></i> Invitation évènement</div> - <div class="event-desc"> - <div class="eurostile w-75">Rockstar Energy Race Series</div> - <div class="event-meta-info">Pacific Way</div> - </div> - </div> - <div class="second-frame"> - <div class="header"> - <div class="pos second">2ème</div> - </div> - <div class="event-type"><i class="fa-solid fa-flag-checkered"></i> championnat</div> - <div class="event-desc"> - <div class="eurostile w-75">Séries de courses etnies</div> - <div class="event-meta-info">3 manches</div> + {% for race in second_frame_races %} + <div class="second-frame"> + <div class="header"> + {% if race.finishing_position == 1 %} + <div class="pos">{{ race.pos_string }}</div> + {% else %} + <div class="pos second">{{ race.pos_string }}</div> + {% endif %} + </div> + {% if race.type == 'invitation' %} + <div class="event-type"><i class="fa-solid fa-envelope"></i> Invitation évènement</div> + {% elif race.type == 'championship' %} + <div class="event-type"><i class="fa-solid fa-flag-checkered"></i> Championnat</div> + {% else %} + <div class="event-type"><i class="fa-solid fa-flag-checkered"></i> Course simple</div> + {% endif %} + + <div class="event-desc"> + <div class="eurostile w-75">{{ race.name }}</div> + {% if race.type == 'invitation' %} + <div class="event-meta-info">{{ race.circuit }}</div> + {% else %} + <div class="event-meta-info">3 manches</div> + {% endif %} + </div> </div> - </div> + {% endfor %} </div> </div> @@ -189,7 +198,8 @@ </div> </div> <div class="col"> - <p>Copyright 2023 - World Series Racing ou “WSR” est une marque déposée par Codemasters. <br>Ceci est un projet + <p>Copyright 2023 - World Series Racing ou “WSR” est une marque déposée par Codemasters. <br>Ceci est un + projet à titre scolaire.</p> </div> <div class="col"></div> diff --git a/WSR/views.py b/WSR/views.py index 5c5a592323b7794ab059984ec917929a868531d9..f847e8b6f0c9a17ad74231118293451444ecae6a 100644 --- a/WSR/views.py +++ b/WSR/views.py @@ -1,8 +1,63 @@ from django.shortcuts import render +from WSR.models import * + + # Create your views here. def home(request): + three_last_races = Race.objects.order_by('-date')[:3] + last_race = three_last_races[0] + last_race_season = last_race.season.name + last_race_results = Result.objects.filter(race=last_race) + + for race_result in last_race_results: + race_result.driver_name = race_result.driver.name + if race_result.finishing_position == 1: + race_result.pos_string = "1ère" + else: + race_result.pos_string = str(race_result.finishing_position) + "ème" + + last_race_details = { + 'race': last_race, + 'season_name': last_race_season, + 'results': last_race_results + } + + second_frame_races = [] + + for race in three_last_races[1:3]: + pos_string = "1er" if race.finishing_position == 1 else str(race.finishing_position) + "ème" + race.pos_string = pos_string + second_frame_races.append(race) + + six_last_articles = Article.objects.order_by('-publication_date')[:6] + + for article in six_last_articles: + article.summary = ' '.join(article.content.split()[:14]) + + three_last_races_results = [] + + for race in three_last_races: + results = Result.objects.filter(race=race) + race_results = { + 'race': race, + 'results': results + } + + for result in results: + result.driver_name = result.driver.name + result.vehicle_brand = result.driver.vehicle.brand + result.vehicle_model = result.driver.vehicle.model + + three_last_races_results.append(race_results) + return render( request, 'home.html', + { + "last_race_details": last_race_details, + "second_frame_races": second_frame_races, + "six_last_articles": six_last_articles, + "three_last_races_results": three_last_races_results + } )