Skip to content
Snippets Groups Projects
Commit a2d5a1b0 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

Avancement sur la home, création de la template de base, ajout d'un champ...

Avancement sur la home, création de la template de base, ajout d'un champ image sur le modèle des véhicules, création des autres urls et d'un helper twig pour les liens actifs.
parent a0fdb4bb
No related branches found
No related tags found
No related merge requests found
# WSR Website
## Python & paquet à installer
Il est nécessaire d'avoir python > 3.10, ainsi que les paquets suivants :
- Django
- Pillow
- django-compressor
- django-libsass
\ No newline at end of file
......@@ -8,5 +8,4 @@ admin.site.register(Race)
admin.site.register(Result)
admin.site.register(Vehicle)
admin.site.register(Driver)
admin.site.register(Participation)
admin.site.register(Season)
\ No newline at end of file
# Generated by Django 4.2.2 on 2023-06-12 13:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('WSR', '0014_alter_race_circuit'),
]
operations = [
migrations.AlterField(
model_name='race',
name='circuit',
field=models.CharField(choices=[('Pacfic Way', 'Pacific Way'), ('Marina City', 'Marina City'), ('Boucle Art Deco', 'Art Deco'), ('Ocean Drive', 'Ocean Drive'), ('Lake Shore Point', 'Lake Shore Point'), ('Le Trocadéro', 'Trocadero'), ('Boucle de la fontaine', 'Fontaine'), ('Route de la corniche', 'Corniche'), ('Baie de colombe', 'Colombe Bay'), ('Champs Elysées', 'Champs Elysees'), ('Villefranche-sur-mer', 'Villefranche'), ('Liveroutes', 'Liveroutes'), ('La turbie', 'Turbie'), ('Ap Lei Chau', 'Ap Lei Chau'), ('Route des Toriis', 'Torris'), ('Pok Fu Lam', 'Pok Fu Lam'), ('Col Sakura', 'Sakura'), ('Boucle du quai Orra', 'Orra Loop'), ('Voie Hattan', 'Hattan Way'), ('Belvédère de Nakheel', 'Nakheel'), ('Circuit GP', 'Circuit Gp')], max_length=100),
),
migrations.AlterField(
model_name='race',
name='location',
field=models.CharField(choices=[('Californie', 'Califoria'), ('Chicago', 'Chicago'), ('Miami', 'Miami'), ('Paris', 'Paris'), ('Barcelone', 'Barcelona'), ("Côte d'Azur", 'Cot'), ('Hong Kong', 'Hong Kong'), ('Okutama', 'Okutama'), ('Dubaï', 'Dubai'), ('Yas Marina', 'Yas Marina')], max_length=100),
),
migrations.DeleteModel(
name='Participation',
),
]
# Generated by Django 4.2.2 on 2023-06-12 17:04
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('WSR', '0015_alter_race_circuit_alter_race_location_and_more'),
]
operations = [
migrations.AddField(
model_name='vehicle',
name='image',
field=models.ImageField(blank=True, default='', upload_to='vehicles', verbose_name="Image d'illustration"),
),
migrations.AlterField(
model_name='driver',
name='vehicle',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='WSR.vehicle', verbose_name='Véhicule'),
),
migrations.AlterField(
model_name='race',
name='finishing_position',
field=models.PositiveIntegerField(verbose_name="Position d'arrivée"),
),
migrations.AlterField(
model_name='race',
name='image',
field=models.ImageField(upload_to='race_images', verbose_name="Image d'illustration"),
),
migrations.AlterField(
model_name='result',
name='finishing_position',
field=models.PositiveIntegerField(verbose_name="Position d'arrivée"),
),
migrations.AlterField(
model_name='result',
name='starting_position',
field=models.PositiveIntegerField(verbose_name='Position de départ'),
),
migrations.AlterField(
model_name='vehicle',
name='fabrication_year',
field=models.PositiveIntegerField(verbose_name='Année de fabrication'),
),
migrations.AlterField(
model_name='vehicle',
name='model',
field=models.CharField(max_length=100, verbose_name='Modèle'),
),
]
......@@ -12,7 +12,7 @@ class Season(models.Model):
class Driver(models.Model):
name = models.CharField(max_length=100)
vehicle = models.ForeignKey('Vehicle', on_delete=models.CASCADE, verbose_name="Vehicle")
vehicle = models.ForeignKey('Vehicle', on_delete=models.CASCADE, verbose_name="Véhicule")
def __str__(self):
return self.name
......@@ -20,8 +20,9 @@ class Driver(models.Model):
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")
model = models.CharField(max_length=100, verbose_name="Modèle")
fabrication_year = models.PositiveIntegerField(verbose_name="Année de fabrication")
image = models.ImageField(upload_to='vehicles', default="", blank=True, verbose_name="Image d'illustration")
def __str__(self):
return f"{self.brand} {self.model}"
......@@ -54,6 +55,7 @@ class Race(models.Model):
HONG_KONG= "Hong Kong"
OKUTAMA = "Okutama"
DUBAI = "Dubaï"
YAS_MARINA = "Yas Marina"
class Circuits(models.TextChoices):
PACIFIC_WAY = "Pacfic Way"
......@@ -76,12 +78,13 @@ class Race(models.Model):
ORRA_LOOP = "Boucle du quai Orra"
HATTAN_WAY = "Voie Hattan"
NAKHEEL = "Belvédère de Nakheel"
CIRCUIT_GP = "Circuit GP"
location = models.CharField(max_length=100, choices=Locations.choices)
circuit = models.CharField(max_length=100, choices=Circuits.choices)
finishing_position = models.PositiveIntegerField(verbose_name="Finishing Position")
finishing_position = models.PositiveIntegerField(verbose_name="Position d'arrivée")
season = models.ForeignKey(Season, on_delete=models.CASCADE)
image = models.ImageField(upload_to='race_images', verbose_name="Illustration Image")
image = models.ImageField(upload_to='race_images', verbose_name="Image d'illustration")
type = models.CharField(max_length=100, choices=RaceType.choices, default=RaceType.SINGLE_RACE)
participation_type = models.CharField(
max_length=100,
......@@ -107,19 +110,10 @@ class Article(models.Model):
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")
finishing_position = models.PositiveIntegerField(verbose_name="Position d'arrivée")
starting_position = models.PositiveIntegerField(verbose_name="Position de départ")
score = models.IntegerField()
def __str__(self):
return f"{self.driver} - {self.race}"
class Participation(models.Model):
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.season} - {self.race}"
WSR/static/images/codemastersracing.png

13.4 KiB

......@@ -166,6 +166,7 @@
flex-direction: column;
padding: 32px 24px;
background-color: $white;
width: 1076px;
.news-cards {
display: grid;
......
{% load static %}
{% load compress %}
{% load is_active %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>World Series Racing</title>
{% compress css %}
<link type="text/x-scss" href="{% static 'scss/app.scss' %}" rel="stylesheet" media="screen">
{% endcompress %}
</head>
<body>
<header class="container">
<a class="logo" href="/">
<img src="{% static 'images/WSR.png' %}" alt="Logo WSR">
</a>
<nav class="navbar">
<a class="link {% is_active request 'home' %}" href="{% url 'home' %}">Page d’accueil</a>
<a class="link {% is_active request 'races_types' %}" href="{% url 'races_types' %}">Épreuves</a>
<a class="link {% is_active request 'vehicles' %}" href="{% url 'vehicles' %}">Nos Véhicules</a>
<a class="link {% is_active request 'seasons' %}" href="{% url 'seasons' %}">Anciennes saisons</a>
</nav>
</header>
{% block content %}{% endblock %}
<footer class="container">
<div class="row">
<div class="col">
<div class="logo">
<img src="{% static 'images/WSR.png' %}" alt="Logo WSR">
</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
à titre scolaire.</p>
</div>
<div class="col">
<a href="https://www.codemasters.com/" target="_blank">
<img src="{% static 'images/codemastersracing.png' %}" alt="Logo Codemasters" width="128">
</a>
</div>
<div class="col">
<p>Juin 2023 - Sofiane LASRI-TRIENPONT<br><a href="/admin">Connexion à l'administration</a></p>
</div>
</div>
</footer>
<script type="text/javascript">
// Si le footer n'est pas tout en bas de la page car il y a peu de contenu
// On le place tout en bas de la page
function footerPosition() {
const footer = document.querySelector("footer");
const windowHeight = window.innerHeight;
const bodyHeight = document.body.offsetHeight;
if (bodyHeight < windowHeight) {
footer.style.position = 'absolute';
footer.style.bottom = '0';
} else {
footer.style.position = 'relative';
footer.style.bottom = '0';
}
}
footerPosition();
window.addEventListener('resize', footerPosition);
</script>
{% block javascripts %}{% endblock %}
</body>
</html>
\ No newline at end of file
{% extends 'base.html' %}
{% load static %}
{% load compress %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>World Series Racing</title>
{% compress css %}
<link type="text/x-scss" href="{% static 'scss/app.scss' %}" rel="stylesheet" media="screen">
{% endcompress %}
</head>
<body>
<header class="container">
<a class="logo" href="/">
<img src="{% static 'images/WSR.png' %}" alt="Logo WSR">
</a>
<nav class="navbar">
<a class="link active" href="/">Page d’accueil</a>
<a class="link" href="#">Épreuves</a>
<a class="link" href="#">nos Véhicules</a>
<a class="link" href="#">Anciennes saisons</a>
</nav>
</header>
{% block content %}
<div class="container vitrine">
<div class="main-frame eurostile">
<div>
{% if race.participation_type == 'invitation' %}
<div class="mid">{{ last_race_details.season_name }}</div>
<div class="large">{{ last_race_details.race.type_string }} {{ last_race_details.race.name }}</div>
<div class="mid">{{ last_race_details.race.location }}, {{ last_race_details.race.circuit }}</div>
{% else %}
<div class="mid">{{ last_race_details.season_name }}</div>
<div class="large">{{ last_race_details.race.location }}</div>
<div class="mid">{{ last_race_details.race.circuit }}</div>
{% endif %}
</div>
<div class="detail">
{% for stat in last_race_details.results %}
......@@ -84,11 +57,12 @@
<div class="d-flex">
<div class="menu flex-grow-1">
<h4 class="eurostile title">Menu</h4>
<a class="link active" href="#">Actualité WSR</a>
<a class="link" href="#">Résultats des courses</a>
<a class="link" href="#">Participations</a>
<a class="link active" href="#" id="news" data-type="changePageContent">Actualité WSR</a>
<a class="link" href="#" id="racesResults" data-type="changePageContent">Résultats des courses</a>
<a class="link" href="#" id="calendar" data-type="changePageContent">Calendrier</a>
</div>
<div class="content">
<div class="content" id="pageContent">
<div id="newsContainer">
<h4 class="eurostile title">Actualité WSR</h4>
<div class="news-cards">
......@@ -110,25 +84,105 @@
<a class="btn" href="#">Voir tout</a>
</div>
</div>
<div id="racesResultsContainer" style="display: none;">
<h4 class="eurostile title">Résultat des courses</h4>
{% for race in three_last_races_results %}
<h5>Saison {{ race.race.season_id }} - {{ race.race.location }}, {{ race.race.circuit }}</h5>
<table class="table">
<thead>
<tr>
<th scope="col">Position de départ</th>
<th scope="col">Position d'arrivée</th>
<th scope="col">Score</th>
<th scope="col">Pilote</th>
<th scope="col">Véhicule</th>
</tr>
</thead>
<tbody>
{% for result in race.results %}
<tr>
<th>{{ result.starting_position }}</th>
<th scope="row">{{ result.finishing_position }}</th>
<td>{{ result.score }}</td>
<td>{{ result.driver_name }}</td>
<td>{{ result.vehicle_brand }} {{ result.vehicle_model }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endfor %}
<div class="d-flex justify-content-end">
<a class="btn" href="#">Voir tout</a>
</div>
</div>
<footer class="container">
<div class="row">
<div class="col">
<div class="logo">
<img src="{% static 'images/WSR.png' %}" alt="Logo WSR">
</div>
<div id="calendarContainer" style="display: none;">
<h4 class="eurostile title">Calendrier des courses</h4>
<p>Nous sommes désolés, mais cet onglet n'est pas encore opérationnel.</p>
</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
à titre scolaire.</p>
</div>
<div class="col"></div>
<div class="col">
<p>Juin 2023 - Sofiane LASRI-TRIENPONT<br><a href="/admin">Connexion à l'administration</a></p>
</div>
</div>
</footer>
</body>
</html>
\ No newline at end of file
{% endblock %}
{% block javascripts %}
<script type="text/javascript">
const links = document.querySelectorAll("[data-type='changePageContent']");
const containers = {};
function hideAllContainers() {
for (var container in containers) {
containers[container].style.display = 'none';
}
}
function showContainer(container) {
hideAllContainers();
container.style.display = 'block';
}
function setActiveLink(link) {
for (var i = 0; i < links.length; i++) {
links[i].classList.remove('active');
}
link.classList.add('active');
}
function getUrlParameter(name) {
name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
const regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
const results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
links.forEach(function (link) {
link.addEventListener('click', function (event) {
event.preventDefault();
setActiveLink(link);
var linkId = link.getAttribute('id');
var containerId = linkId + 'Container';
var container = document.getElementById(containerId);
if (container) {
showContainer(container);
history.replaceState(null, null, '?content=' + linkId);
}
});
});
links.forEach(function (link) {
const linkId = link.getAttribute('id');
const containerId = linkId + 'Container';
const container = document.getElementById(containerId);
if (container) {
containers[containerId] = container;
}
});
const contentParam = getUrlParameter('content');
if (contentParam !== '') {
const targetLink = document.getElementById(contentParam);
if (targetLink) {
targetLink.click();
}
}
</script>
{% endblock %}
\ No newline at end of file
from django import template
from django.urls import reverse
register = template.Library()
@register.simple_tag
def is_active(request, url_name):
if request.path == reverse(url_name):
return 'active'
return ''
......@@ -86,3 +86,18 @@ def home(request):
"three_last_races_results": three_last_races_results
}
)
def view_article(request, id):
article = Article.objects.get(id)
return None
def races_types(request):
return None
def vehicles(request):
return None
def seasons(request):
return None
\ No newline at end of file
......@@ -23,7 +23,11 @@ from WSR import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home)
path('', views.home, name="home"),
path('article/<int:id>', views.view_article, name="article"),
path('races-types', views.races_types, name="races_types"),
path('vehicles', views.vehicles, name="vehicles"),
path('seasons', views.seasons, name="seasons")
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment