Mon commit initial
This commit is contained in:
0
gestion_vehicule/__init__.py
Normal file
0
gestion_vehicule/__init__.py
Normal file
BIN
gestion_vehicule/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/admin.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/admin.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/admin.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/apps.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/apps.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/apps.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/apps.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/forms.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/forms.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/forms.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/forms.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/models.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/models.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/models.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/tests.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/tests.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/urls.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/urls.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/urls.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/urls.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/views.cpython-310.pyc
Normal file
BIN
gestion_vehicule/__pycache__/views.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/__pycache__/views.cpython-313.pyc
Normal file
BIN
gestion_vehicule/__pycache__/views.cpython-313.pyc
Normal file
Binary file not shown.
3
gestion_vehicule/admin.py
Normal file
3
gestion_vehicule/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin # noqa: F401
|
||||
|
||||
# Register your models here.
|
||||
6
gestion_vehicule/apps.py
Normal file
6
gestion_vehicule/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class GestionVehiculeConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "gestion_vehicule"
|
||||
105
gestion_vehicule/forms.py
Normal file
105
gestion_vehicule/forms.py
Normal file
@@ -0,0 +1,105 @@
|
||||
"""Gestion des formulaires liés aux véhicules."""
|
||||
|
||||
from . import models
|
||||
from django import forms
|
||||
|
||||
|
||||
class EnregistrerVehicule(forms.ModelForm):
|
||||
"""Formulaire pour enregistrer un véhicule."""
|
||||
|
||||
class Meta:
|
||||
"""Métadonnées du formulaire."""
|
||||
|
||||
model = models.Vehicule
|
||||
fields = ("image", "immatriculation")
|
||||
widgets = {
|
||||
"immatriculation": forms.TextInput(
|
||||
attrs={"class": "form-control"}
|
||||
),
|
||||
# "image": forms.TextInput(attrs=
|
||||
# {"class": "form-control", "type": "image"}),
|
||||
}
|
||||
|
||||
|
||||
class EnregistrerDemande(forms.ModelForm):
|
||||
"""Formulaire pour enregistrer une demande de véhicule."""
|
||||
|
||||
class Meta:
|
||||
"""Métadonnées du formulaire."""
|
||||
|
||||
model = models.DemandeVehicule
|
||||
fields = ("lieu_depart", "lieu_arrive", "date_heure")
|
||||
widgets = {
|
||||
"lieu_depart": forms.TextInput(attrs={"class": "form-control"}),
|
||||
"lieu_arrive": forms.TextInput(attrs={"class": "form-control"}),
|
||||
"date_heure": forms.DateTimeInput(
|
||||
attrs={"class": "form-control", "type": "datetime-local"}
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
class CarnetBord(forms.ModelForm):
|
||||
"""Formulaire pour le carnet de bord d'un véhicule."""
|
||||
|
||||
class Meta:
|
||||
"""Métadonnées du formulaire."""
|
||||
|
||||
model = models.CarnetBord
|
||||
fields = (
|
||||
"vehicule",
|
||||
"course",
|
||||
"heure_effectif_depart",
|
||||
"km_depart",
|
||||
"heure_arrive",
|
||||
"km_arrive",
|
||||
"course_termine",
|
||||
)
|
||||
|
||||
widgets = {
|
||||
"vehicule": forms.TextInput(attrs={"class": "form-control"}),
|
||||
"mois_concerne": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "month"}
|
||||
),
|
||||
"km_debut_mois": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "number"}
|
||||
),
|
||||
"km_fin_mois": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "number"}
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
class PriseCarburant(forms.ModelForm):
|
||||
"""Formulaire pour enregistrer une prise de carburant."""
|
||||
|
||||
class Meta:
|
||||
"""Métadonnées du formulaire."""
|
||||
|
||||
model = models.CarnetCarburant
|
||||
fields = (
|
||||
"date",
|
||||
"nom_station",
|
||||
"type_carburant",
|
||||
"litre",
|
||||
"prix",
|
||||
"kilometrage",
|
||||
"observation",
|
||||
)
|
||||
widgets = {
|
||||
"vehicule": forms.TextInput(attrs={"class": "form-control"}),
|
||||
"date": forms.DateInput(
|
||||
attrs={"class": "form-control", "type": "date"}
|
||||
),
|
||||
"nom_station": forms.TextInput(attrs={"class": "form-control"}),
|
||||
"type_carburant": forms.Select(attrs={"class": "form-select"}),
|
||||
"litre": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "number"}
|
||||
),
|
||||
"prix": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "number"}
|
||||
),
|
||||
"kilometrage": forms.TextInput(
|
||||
attrs={"class": "form-control", "type": "number"}
|
||||
),
|
||||
"observation": forms.Textarea(attrs={"class": "form-control"}),
|
||||
}
|
||||
59
gestion_vehicule/migrations/0001_initial.py
Normal file
59
gestion_vehicule/migrations/0001_initial.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-06 12:10
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Vehicule',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('immatriculation', models.TextField(max_length=15, verbose_name='Immatriculation')),
|
||||
('image', models.ImageField(upload_to='vehicule_image', verbose_name='Image de la voiture')),
|
||||
('disponible', models.BooleanField(default=True, verbose_name='Vehicule disponible ?')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DemandeVehicule',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('lieu_depart', models.TextField(verbose_name='Lieu de départ')),
|
||||
('lieu_arrive', models.TextField(verbose_name="Lieu d'arrivée")),
|
||||
('date_heure', models.DateTimeField(verbose_name="Date et heure d'arrivée")),
|
||||
('validation', models.BooleanField(default=None, verbose_name='Validation par le logisticien')),
|
||||
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CarnetCarburant',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('date', models.DateField(verbose_name='Date')),
|
||||
('nom_station', models.TextField(verbose_name='Nom de la station-service')),
|
||||
('type_carburant', models.TextField(choices=[('essence', 'Essence'), ('gazoil', 'Gazoil')], verbose_name='Type du carburant')),
|
||||
('litre', models.IntegerField(verbose_name='Litre')),
|
||||
('prix', models.IntegerField(verbose_name='Prix par litre (en GNF)')),
|
||||
('kilometrage', models.IntegerField(verbose_name='Kilometrage')),
|
||||
('observation', models.TextField(verbose_name='Observation')),
|
||||
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CarnetBord',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('mois_concerne', models.DateField(verbose_name='Mois et année concernée')),
|
||||
('km_debut_mois', models.IntegerField(verbose_name='Km en début du mois')),
|
||||
('km_fin_mois', models.IntegerField(verbose_name='Km en fin du mois')),
|
||||
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-06 12:56
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='demandevehicule',
|
||||
name='date_heure',
|
||||
field=models.DateTimeField(verbose_name='Date et heure de départ'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='demandevehicule',
|
||||
name='vehicule',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-06 12:57
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0002_alter_demandevehicule_date_heure_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='demandevehicule',
|
||||
name='validation',
|
||||
field=models.BooleanField(default=None, null=True, verbose_name='Validation par le logisticien'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-06 18:37
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0003_alter_demandevehicule_validation'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='demandevehicule',
|
||||
name='motif_refus',
|
||||
field=models.TextField(default='', verbose_name='Motifs du refus'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-07 09:29
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0004_demandevehicule_motif_refus'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='demandevehicule',
|
||||
name='course_terminer',
|
||||
field=models.BooleanField(default=False, verbose_name='La course est terminée'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='demandevehicule',
|
||||
name='heure_course_termine',
|
||||
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date et heure de fin de course'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-07 17:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0005_demandevehicule_course_terminer_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='carnetbord',
|
||||
name='id',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='mois_concerne',
|
||||
field=models.DateField(primary_key=True, serialize=False, verbose_name='Mois et année concernée'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-10 15:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0006_remove_carnetbord_id_alter_carnetbord_mois_concerne'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='km_fin_mois',
|
||||
field=models.IntegerField(blank=True, null=True, verbose_name='Km en fin du mois'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-12 12:03
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('authentification', '0001_initial'),
|
||||
('gestion_vehicule', '0007_alter_carnetbord_km_fin_mois'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='demandevehicule',
|
||||
name='chauffeur',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chauffeur_affecter_course', to='authentification.profile'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='demandevehicule',
|
||||
name='nom_passager',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='passager_de_la_demande', to='authentification.profile'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,69 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-23 10:56
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0008_demandevehicule_chauffeur_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='carnetbord',
|
||||
name='km_debut_mois',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='carnetbord',
|
||||
name='km_fin_mois',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='carnetbord',
|
||||
name='mois_concerne',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='demandevehicule',
|
||||
name='course_terminer',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='demandevehicule',
|
||||
name='heure_course_termine',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='course',
|
||||
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.demandevehicule'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='course_termine',
|
||||
field=models.BooleanField(blank=True, default=None, null=True, verbose_name='Course terminée :'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='heure_arrive',
|
||||
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name="Date et heure d'arrivee :"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='heure_effectif_depart',
|
||||
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date et heure effectif de départ :'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='km_arrive',
|
||||
field=models.IntegerField(default=0, verbose_name="Kilometrage d'arrivé :"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='carnetbord',
|
||||
name='km_depart',
|
||||
field=models.IntegerField(blank=True, default=None, null=True, verbose_name='Kilometrage de départ :'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-23 13:13
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0009_remove_carnetbord_km_debut_mois_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='carnetcarburant',
|
||||
name='course',
|
||||
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.demandevehicule'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='course_termine',
|
||||
field=models.BooleanField(default=False, verbose_name='Course terminée :'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-23 13:26
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0010_carnetcarburant_course_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='carnetcarburant',
|
||||
name='vehicule',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-23 15:07
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0011_remove_carnetcarburant_vehicule'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='vehicule',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-24 11:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gestion_vehicule', '0012_alter_carnetbord_vehicule'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='km_arrive',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name="Kilometrage d'arrivé :"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetbord',
|
||||
name='km_depart',
|
||||
field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='Kilometrage de départ :'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetcarburant',
|
||||
name='kilometrage',
|
||||
field=models.PositiveIntegerField(verbose_name='Kilometrage'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetcarburant',
|
||||
name='litre',
|
||||
field=models.PositiveIntegerField(verbose_name='Litre'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='carnetcarburant',
|
||||
name='prix',
|
||||
field=models.PositiveIntegerField(verbose_name='Prix par litre (en GNF)'),
|
||||
),
|
||||
]
|
||||
0
gestion_vehicule/migrations/__init__.py
Normal file
0
gestion_vehicule/migrations/__init__.py
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
gestion_vehicule/migrations/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
gestion_vehicule/migrations/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_vehicule/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
gestion_vehicule/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
122
gestion_vehicule/models.py
Normal file
122
gestion_vehicule/models.py
Normal file
@@ -0,0 +1,122 @@
|
||||
"""Modèles de l'application gestion_vehicule."""
|
||||
|
||||
from django.db import models
|
||||
from authentification.models import Profile
|
||||
|
||||
|
||||
class Vehicule(models.Model):
|
||||
"""Modèle représentant un véhicule."""
|
||||
|
||||
immatriculation = models.TextField(
|
||||
verbose_name="Immatriculation",
|
||||
max_length=15
|
||||
)
|
||||
image = models.ImageField(
|
||||
verbose_name="Image de la voiture", upload_to="vehicule_image"
|
||||
)
|
||||
disponible = models.BooleanField(
|
||||
verbose_name="Vehicule disponible ?",
|
||||
default=True)
|
||||
|
||||
def __str__(self):
|
||||
"""Retourne une représentation en chaîne de caractères du véhicule."""
|
||||
return f"{self.immatriculation}"
|
||||
|
||||
|
||||
class DemandeVehicule(models.Model):
|
||||
"""Modèle représentant une demande de véhicule."""
|
||||
|
||||
vehicule = models.ForeignKey(Vehicule, on_delete=models.CASCADE, null=True)
|
||||
nom_passager = models.ForeignKey(
|
||||
Profile,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="passager_de_la_demande",
|
||||
)
|
||||
chauffeur = models.ForeignKey(
|
||||
Profile,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="chauffeur_affecter_course",
|
||||
)
|
||||
lieu_depart = models.TextField(verbose_name="Lieu de départ")
|
||||
lieu_arrive = models.TextField(verbose_name="Lieu d'arrivée")
|
||||
date_heure = models.DateTimeField(verbose_name="Date et heure de départ")
|
||||
validation = models.BooleanField(
|
||||
verbose_name="Validation par le logisticien", default=None, null=True
|
||||
)
|
||||
motif_refus = models.TextField(verbose_name="Motifs du refus", default="")
|
||||
|
||||
def __str__(self):
|
||||
"""Retourne une représentation en chaîne de caractères."""
|
||||
return (f"DemandeVehicule {self.pk} -"
|
||||
f"{self.lieu_depart} à {self.lieu_arrive}"
|
||||
f" le {self.date_heure}"
|
||||
)
|
||||
|
||||
|
||||
class CarnetBord(models.Model):
|
||||
"""Modèle représentant le carnet de bord d'un véhicule."""
|
||||
|
||||
vehicule = models.ForeignKey(
|
||||
Vehicule, null=True, blank=True, on_delete=models.CASCADE
|
||||
)
|
||||
course = models.ForeignKey(
|
||||
DemandeVehicule, on_delete=models.CASCADE,
|
||||
default=None, null=True, blank=True
|
||||
)
|
||||
heure_effectif_depart = models.DateTimeField(
|
||||
verbose_name="Date et heure effectif de départ :",
|
||||
default=None,
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
km_depart = models.PositiveIntegerField(
|
||||
verbose_name="Kilometrage de départ :", default=None, null=True,
|
||||
blank=True
|
||||
)
|
||||
heure_arrive = models.DateTimeField(
|
||||
verbose_name="Date et heure d'arrivee :", default=None, null=True,
|
||||
blank=True
|
||||
)
|
||||
km_arrive = models.PositiveIntegerField(
|
||||
verbose_name="Kilometrage d'arrivé :", default=0
|
||||
)
|
||||
course_termine = models.BooleanField(
|
||||
verbose_name="Course terminée :", default=False
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
"""Retourne une représentation en chaîne de caractères."""
|
||||
return f"CarnetBord {self.pk} - Vehicule: {self.vehicule}"
|
||||
|
||||
class CarnetCarburant(models.Model):
|
||||
"""Modèle représentant le carnet de carburant d'un véhicule."""
|
||||
|
||||
date = models.DateField(verbose_name="Date")
|
||||
nom_station = models.TextField(verbose_name="Nom de la station-service")
|
||||
type_carburant = models.TextField(
|
||||
verbose_name="Type du carburant",
|
||||
choices={
|
||||
"essence": "Essence",
|
||||
"gazoil": "Gazoil",
|
||||
},
|
||||
)
|
||||
litre = models.PositiveIntegerField(verbose_name="Litre")
|
||||
prix = models.PositiveIntegerField(verbose_name="Prix par litre (en GNF)")
|
||||
kilometrage = models.PositiveIntegerField(verbose_name="Kilometrage")
|
||||
observation = models.TextField(verbose_name="Observation")
|
||||
course = models.ForeignKey(
|
||||
DemandeVehicule,
|
||||
default=None,
|
||||
on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
"""Retourne une représentation en chaîne de caractères."""
|
||||
return (
|
||||
f"CarnetCarburant {self.pk} - Station: {self.nom_station} - "
|
||||
f"Date: {self.date}"
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
{% extends "BASE.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block page_titre %} SGL - Carnet du carburant {% endblock %}
|
||||
|
||||
{% block "contenu" %}
|
||||
<h3 class="text-center mt-2">Carnet de carburant</h3>
|
||||
|
||||
<div class="row my-3">
|
||||
<div class="col">
|
||||
<label for="">Selectionner le mois concerné :</label>
|
||||
<input type="month" name="" id="filtreMois" class="form-control" data-url="{% url 'gestion_vehicule:filtre-carnet-carburant' %}">
|
||||
<input type="hidden" name="" id="id_vehicule" value="{{ id_vehicule }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tableau-carnet"></div>
|
||||
{% endblock %}
|
||||
|
||||
{% block "js" %}
|
||||
<script src="{% static 'js/carnet_carburant.js' %}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,22 @@
|
||||
{% extends "BASE.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block page_titre %} SGL - Carnet du carburant {% endblock %}
|
||||
|
||||
{% block "contenu" %}
|
||||
<h3 class="text-center mt-2">Carnet de carburant</h3>
|
||||
|
||||
<div class="row my-3">
|
||||
<div class="col">
|
||||
<label for="">Selectionner le mois concerné :</label>
|
||||
<input type="month" name="" id="filtreMois" class="form-control" data-url="{% url 'gestion_vehicule:filtre-sortie-vehicule' %}">
|
||||
<input type="hidden" name="" id="id_vehicule" value="{{ id_vehicule }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="tableau-sortie-vehicule"></div>
|
||||
{% endblock %}
|
||||
|
||||
{% block "js" %}
|
||||
<script src="{% static 'js/carnet_sortie_vehicule.js' %}"></script>
|
||||
{% endblock %}
|
||||
131
gestion_vehicule/templates/gestion_vehicule/detail_course.html
Normal file
131
gestion_vehicule/templates/gestion_vehicule/detail_course.html
Normal file
@@ -0,0 +1,131 @@
|
||||
{% extends "BASE.html" %}
|
||||
{% load static %}
|
||||
{% load tags_personnaliser %}
|
||||
{% load l10n %}
|
||||
|
||||
{% block page_titre %} SGL - Détails du véhicule {% endblock %}
|
||||
|
||||
{% block "contenu" %}
|
||||
<a href="{% url 'gestion_vehicule:index' %}" class="btn btn-primary my-2">Retour</a>
|
||||
<h3>Détails de la course</h3>
|
||||
|
||||
<div class="row mt-2 mt-lg-5">
|
||||
<div class="col-12 col-lg-6">
|
||||
<h5 class="text-center">Informations sur la course</h5>
|
||||
<form action="">
|
||||
<div class="form-group">
|
||||
<label for="">Nom du passager :</label>
|
||||
<input type="text" class="form-control" value="{{ detail_demande.nom_passager }}" readonly>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="">Lieu de départ :</label>
|
||||
<input type="text" class="form-control" value="{{ detail_demande.lieu_depart }}" readonly>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="">Date et heure de départ prévu :</label>
|
||||
<input type="datetime-local" class="form-control" value="{{ detail_demande.date_heure|date:'Y-m-d\\TH:i' }}" readonly>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="">Lieu d'arrivée :</label>
|
||||
<input type="text" class="form-control" value="{{ detail_demande.lieu_arrive }}" readonly>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="">Véhicule attribué :</label>
|
||||
<input type="text" class="form-control" value="{{ detail_demande.immatriculation }}" readonly>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-12 col-lg-6 mt-3 mt-lg-0">
|
||||
<h5 class="text-center">Renseigner par le chauffeur</h5>
|
||||
<div class="accordion mt-2" id="accordionExample">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||
Au départ
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<form method="post" action="{% url 'gestion_vehicule:enregistrer-details-course-depart' detail_demande.id %}">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="id-vehicule" value="{{ detail_demande.id_vehicule }}">
|
||||
<div class="form-group">
|
||||
<label for="">Heure effectif de départ :</label>
|
||||
<input type="datetime-local" class="form-control" value="{{ detail_demande.details_course.heure_effectif_depart|date:'Y-m-d\\TH:i' }}" name="heure-depart">
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Kilométrage de départ :</label>
|
||||
<input type="number" class="form-control" name="kilometrage_depart" value="{{ detail_demande.details_course.km_depart }}">
|
||||
</div>
|
||||
|
||||
{% if user|has_group:"Chauffeur" %}
|
||||
<button type="submit" class="btn btn-primary mt-2 enregistrerButton">Enregistrer</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||
A l'arrivée
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<form method="post" action="{% url 'gestion_vehicule:enregistrer-details-course-arrivee' detail_demande.id %}">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="id-vehicule" value="{{ detail_demande.vehicule.id }}">
|
||||
<div class="form-group">
|
||||
<label for="">Heure effectif d'arrivée :</label>
|
||||
<input type="datetime-local" class="form-control" value="{{ detail_demande.details_course.heure_arrive|date:'Y-m-d\\TH:i' }}" name="heure-effectif-arrivee">
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Kilométrage d'arrivée :</label>
|
||||
<input type="number" class="form-control" name="kilometrage-arrivee" value="{{ detail_demande.details_course.km_arrive }}">
|
||||
</div>
|
||||
<div class="form-check mt-2">
|
||||
<label for="" class="form-check-label">Course terminée</label>
|
||||
<input type="checkbox" class="form-check-input" name="course-terminer" id="course-terminer" data-state="{{ detail_demande.details_course.course_termine }}">
|
||||
</div>
|
||||
{% if user|has_group:"Chauffeur" %}
|
||||
<button type="submit" class="btn btn-primary mt-2 enregistrerButton">Enregistrer</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-2">
|
||||
<div class="col">
|
||||
<h3>Carburant</h3>
|
||||
<div class="accordion mt-4" id="accordionCarburant">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCarburant" aria-expanded="false" aria-controls="collapseThree">
|
||||
Enregistrer une prise de carburant
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseCarburant" class="accordion-collapse collapse" data-bs-parent="#accordionCarburant">
|
||||
<div class="accordion-body">
|
||||
<form action="{% url 'gestion_vehicule:enregistrer-prise-carburant' detail_demande.id %}" method="post">
|
||||
{% csrf_token %}
|
||||
{{ detail_demande.prise_carburant_formulaire.as_p }}
|
||||
<button type="submit" class="btn btn-primary">Enregistrer</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- --------------------------------- -->
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block "js" %}
|
||||
<script src="{% static 'js/detail_course.js' %}"></script>
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,79 @@
|
||||
{% extends "BASE.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block page_titre %} SGL - Détails du véhicule {% endblock %}
|
||||
|
||||
{% block "contenu" %}
|
||||
<a class="btn btn-primary mt-2" href="{% url 'gestion_vehicule:index' %}" >Retour</a>
|
||||
<div class="row flex-column flex-lg-row p-2 border rounded m-2">
|
||||
<div class="col d-flex flex-column justify-content-center">
|
||||
<img src="{{ vehicule.image.url }}" class="w-100" alt="Image non disponible">
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="text-center">Carnet de bord du vehicule</h3>
|
||||
<form action="{% url 'gestion_vehicule:enregistrer-carnetBord' vehicule.id %}" id="carnetBordForm" method="post">
|
||||
<div class="form-group">
|
||||
<label for="">Immatriculation :</label>
|
||||
<input type="text" class="form-control" value="{{ vehicule.immatriculation }}">
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Mois concerné :</label>
|
||||
<input type="month" class="form-control">
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Total kilomètre parcourue :</label>
|
||||
<input type="number" class="form-control">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<a href="{% url 'gestion_vehicule:carnet-carburant' vehicule.id %}" class="btn btn-lg btn-primary d-block m-auto">Carnet de carburant</a>
|
||||
</div>
|
||||
<div class="col">
|
||||
<a href="{% url 'gestion_vehicule:carnet-sortie-vehicule' vehicule.id %}" class="btn btn-lg btn-primary d-block m-auto">Sortie du vehicule</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="accordion mt-2" id="accordionExample">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||
Prise de carburant
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<form action="{% url 'gestion_vehicule:enregistrer-prise-carburant' vehicule.id %}" method="post">
|
||||
{% csrf_token %}
|
||||
{{ prise_carburant_formulaire.as_p }}
|
||||
<button type="submit" class="btn btn-primary">Enregistrer</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||
Carnet de bord du vehicule
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<form action="{% url 'gestion_vehicule:enregistrer-carnetBord' vehicule.id %}" id="carnetBordForm" method="post">
|
||||
{% csrf_token %}
|
||||
{{ carnet_bord_formulaire.as_p }}
|
||||
<button type="submit" class="btn btn-primary">Enregistrer</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block "js" %}
|
||||
<script src="{% static 'js/detail_gestion_vehicule.js' %}"></script>
|
||||
{% endblock %}
|
||||
202
gestion_vehicule/templates/gestion_vehicule/index.html
Normal file
202
gestion_vehicule/templates/gestion_vehicule/index.html
Normal file
@@ -0,0 +1,202 @@
|
||||
{% extends "BASE.html" %}
|
||||
{% load static %}
|
||||
{% load tags_personnaliser %}
|
||||
|
||||
{% block page_titre %} SGL - Gestion des véhicules {% endblock %}
|
||||
|
||||
{% block "contenu" %}
|
||||
<div class="row p-2">
|
||||
<div class="col d-flex justify-content-between">
|
||||
<h3>PARC AUTOMOBILE</h3>
|
||||
{% if user|has_group:"Logisticien" %}
|
||||
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#enregistrerVehiculeModal">Ajouter un véhicule</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row p-2">
|
||||
{% for vehicule in parc_vehicule %}
|
||||
<div class="card p-2" style="width: 14rem;">
|
||||
{% if vehicule.image %}
|
||||
<img class="card-img-top m-auto d-block" src="{{ vehicule.image.url }}" style="width: 150px;">
|
||||
{% else %}
|
||||
<img class="card-img-top m-auto d-block" src="{% static 'images/exemple-produit.jpg' %}" style="width: 120px;" alt="Image par défaut">
|
||||
{% endif %}
|
||||
<div class="card-body">
|
||||
<h5 class="card-title text-center">{{ vehicule.immatriculation }}</h5>
|
||||
|
||||
{% if user|has_group:"Logisticien" %}
|
||||
<a href="{% url 'gestion_vehicule:detail-voiture' vehicule.id %}" class="d-block m-auto btn btn-primary d-block voir-demande">Voir</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-center">Aucun véhicule enregistré.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="row d-flex mt-3">
|
||||
<div class="col d-flex justify-content-between">
|
||||
<h4>LISTE DES DEMANDES</h4>
|
||||
{% if user|has_group:"Employe" %}
|
||||
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#enregistrerDemandeModal">Faire une demande</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user|has_group:"Employe" %}
|
||||
<div class="row d-flex mt-2 mb-2">
|
||||
<!-- <div class="col">
|
||||
<label>Filtrer par date et heure de depart</label>
|
||||
<input type="datetime-local" class="form-control">
|
||||
</div> -->
|
||||
<div class="col">
|
||||
<label>Statut de la demande :</label>
|
||||
<select name="filtreStatutDemande" id="filtreStatutDemande" class="form-select">
|
||||
<option value="tout">Toutes les demandes</option>
|
||||
<option value="mes_demandes">Mes demandes</option>
|
||||
<option value="valider">Demande validée</option>
|
||||
<option value="refuser">Demande Refusée</option>
|
||||
<option value="attente">Demande en attente</option>
|
||||
<option value="terminer">Course terminée</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div id="tableau-demande-vehicule" data-userid = "{{ user.id }}" data-url = "{% url 'gestion_vehicule:liste-demande' %}"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- ---------------------------------------- MODAL ENREGISTREMENT VEHICULE ----------------------------------- -->
|
||||
|
||||
<div class="modal fade" id="enregistrerVehiculeModal" tabindex="-1" aria-labelledby="enregistrerVehiculeModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="enregistrerVehiculeModalLabel">Enregistrer un véhicule</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form action="{% url 'gestion_vehicule:enregistrer-voiture' %}" method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ formulaire_enregistrer_vehicule.as_p }}
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
|
||||
<button type="submit" class="btn btn-primary">Enregistrer</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ------------------------------------ MODAL ENREGISTREMENT DEMANDE ------------------------------------ -->
|
||||
<div class="modal fade" id="enregistrerDemandeModal" tabindex="-1" aria-labelledby="enregistrerDemandeModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="enregistrerDemandeModalLabel">Enregistrer une demande</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="messageZone"></div>
|
||||
<form data-url ="{% url 'gestion_vehicule:enregistrer-demande' %}" id="enregistrer-demande-form" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ formulaire_demande_vehicule.as_p }}
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
|
||||
<button type="submit" class="btn btn-primary">Enregistrer</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ---------------------------------------- Modal confirmer sortie de la voiture ----------------------- -->
|
||||
<div class="modal fade" id="confirmerDemandeModal" tabindex="-1" aria-labelledby="confirmerDemandeModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="confirmerDemandeModalLabel">Détail de la demande</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form action="{% url 'gestion_vehicule:statut_demande' %}" method="post">
|
||||
{% csrf_token %}
|
||||
<h5 class="text-center">Décision du logisticien</h5>
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="radioValider" id="radioValider" value="Valider">
|
||||
<label class="form-check-label" for="radioValider">
|
||||
Valider la demande
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="radioValider" id="radioRefuser" value="Refuser">
|
||||
<label class="form-check-label" for="radioRefuser">
|
||||
Refuser la demande
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="affichage-formulaire">
|
||||
<h5 class="text-center mt-3">Détail de la demande</h5>
|
||||
<input type="hidden" name="id-demande" id="id-demande">
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Nom du passager :</label>
|
||||
<input type="text" class="form-control" id="nom-passager" readonly>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Lieu de départ</label>
|
||||
<input type="text" class="form-control" id="lieu-depart" readonly>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Lieu d'arrivé :</label>
|
||||
<input type="text" class="form-control" id="lieu-arrivee" readonly>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Date et heure de départ :</label>
|
||||
<input type="text" class="form-control" id="date-heure-depart" readonly>
|
||||
</div>
|
||||
<h5 class="text-center mt-3">Attribution</h5>
|
||||
<div class="form-group">
|
||||
<label for="">Véhicule : </label>
|
||||
<select name="vehicule" id="vehicule" class="form-select"></select>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Chauffeur :</label>
|
||||
<select name="chauffeur" id="chauffeur" class="form-select"></select>
|
||||
</div>
|
||||
<!-- <h5 class="text-center mt-3">Fin de course</h5>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" name="course_termine" type="checkbox" role="switch" id="courseTermine">
|
||||
<label class="form-check-label" for="courseTermine">Course terminée</label>
|
||||
</div>
|
||||
<div class="form-group mt-2">
|
||||
<label for="">Date et heure de retour :</label>
|
||||
<input type="datetime-local" name="date_heure_retour" id="date_heure_retour" class="form-control">
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="form-group mt-2" id="refus">
|
||||
<label for="">Motifs du refus :</label>
|
||||
<textarea class="form-control" name="motif" id="motif-refus"></textarea>
|
||||
</div>
|
||||
<div class="modal-footer" id="validation-sortie-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
|
||||
<button type="submit" class="btn btn-primary" id="demanderValiderEnregistrer">Enregistrer</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block "js" %}
|
||||
<script src="{% static 'js/gestion_vehicule.js' %}"></script>
|
||||
{% endblock %}
|
||||
3
gestion_vehicule/tests.py
Normal file
3
gestion_vehicule/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
88
gestion_vehicule/urls.py
Normal file
88
gestion_vehicule/urls.py
Normal file
@@ -0,0 +1,88 @@
|
||||
"""Gestion des URLs de l'application gestion_vehicule."""
|
||||
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = "gestion_vehicule"
|
||||
|
||||
urlpatterns = [
|
||||
path(
|
||||
"",
|
||||
views.index,
|
||||
name="index"
|
||||
),
|
||||
path(
|
||||
"enregistrer-voiture",
|
||||
views.enregistrer_voiture,
|
||||
name="enregistrer-voiture"
|
||||
),
|
||||
path(
|
||||
"enregistrer-demande",
|
||||
views.enregistrer_demande,
|
||||
name="enregistrer-demande"
|
||||
),
|
||||
path(
|
||||
"liste-demande",
|
||||
views.liste_demande,
|
||||
name="liste-demande"
|
||||
),
|
||||
path(
|
||||
"statut-demande",
|
||||
views.statut_demande,
|
||||
name="statut_demande"
|
||||
),
|
||||
path(
|
||||
"filtre-carnet-carburant",
|
||||
views.filtre_carnet_carburant,
|
||||
name="filtre-carnet-carburant",
|
||||
),
|
||||
path(
|
||||
"filtre-sortie-vehicule",
|
||||
views.filtre_sortie_vehicule,
|
||||
name="filtre-sortie-vehicule",
|
||||
),
|
||||
path(
|
||||
"detail-voiture/<int:vehicule_id>",
|
||||
views.detail_voiture,
|
||||
name="detail-voiture"
|
||||
),
|
||||
path(
|
||||
"enregistrer-prise-carburant/<int:course_id>",
|
||||
views.enregistrer_prise_carburant,
|
||||
name="enregistrer-prise-carburant",
|
||||
),
|
||||
path(
|
||||
"carnet-carburant/<int:vehicule_id>",
|
||||
views.carnet_carburant,
|
||||
name="carnet-carburant",
|
||||
),
|
||||
path(
|
||||
"carnet-sortie-vehicule/<int:vehicule_id>",
|
||||
views.carnet_sortie_vehicule,
|
||||
name="carnet-sortie-vehicule",
|
||||
),
|
||||
path(
|
||||
"enregistrer-carnetBord/<int:vehicule_id>",
|
||||
views.enregistrer_carnet_bord,
|
||||
name="enregistrer-carnetBord",
|
||||
),
|
||||
path(
|
||||
"carnet-vehicule-information/<str:mois_concerne>",
|
||||
views.carnet_vehicule_information,
|
||||
name="carnet-vehicule-information",
|
||||
),
|
||||
path(
|
||||
"detail-course/<int:id_demande>",
|
||||
views.detail_course,
|
||||
name="detail-course"),
|
||||
path(
|
||||
"enregistrer-details-course-depart/<int:id_demande>",
|
||||
views.enregistrer_information_course_depart,
|
||||
name="enregistrer-details-course-depart",
|
||||
),
|
||||
path(
|
||||
"enregistrer-details-course-arrivee/<int:id_demande>",
|
||||
views.enregistrer_information_course_arrive,
|
||||
name="enregistrer-details-course-arrivee",
|
||||
),
|
||||
]
|
||||
648
gestion_vehicule/views.py
Normal file
648
gestion_vehicule/views.py
Normal file
@@ -0,0 +1,648 @@
|
||||
"""Views pour la gestion des véhicules."""
|
||||
|
||||
from django.shortcuts import render, redirect
|
||||
from django.http import JsonResponse
|
||||
|
||||
from authentification.models import Profile
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from . import forms
|
||||
from . import models
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def index(request):
|
||||
"""Page d'accueil de la gestion des véhicules.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP avec le rendu de la page d'accueil de la gestion des
|
||||
véhicules.
|
||||
|
||||
"""
|
||||
formulaire_enregistrer_vehicule = forms.EnregistrerVehicule()
|
||||
formulaire_demande_vehicule = forms.EnregistrerDemande()
|
||||
parc_vehicule = models.Vehicule.objects.all().order_by("-id")
|
||||
|
||||
return render(
|
||||
request,
|
||||
"gestion_vehicule/index.html",
|
||||
{
|
||||
"formulaire_enregistrer_vehicule": formulaire_enregistrer_vehicule,
|
||||
"parc_vehicule": parc_vehicule,
|
||||
"formulaire_demande_vehicule": formulaire_demande_vehicule,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def enregistrer_voiture(request):
|
||||
"""Enregistrer un nouveau véhicule dans le système.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page d'accueil de la gestion des véhicules après
|
||||
l'enregistrement du véhicule.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
form_enregistrement = forms.EnregistrerVehicule(
|
||||
request.POST,
|
||||
request.FILES,
|
||||
)
|
||||
if form_enregistrement.is_valid:
|
||||
form_enregistrement.save()
|
||||
|
||||
return redirect("gestion_vehicule:index")
|
||||
return None
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def enregistrer_demande(request):
|
||||
"""Enregistrer une nouvelle demande de véhicule.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON indiquant le succès ou l'échec de l'enregistrement
|
||||
de la demande de véhicule.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
form_demande = forms.EnregistrerDemande(request.POST)
|
||||
if form_demande.is_valid():
|
||||
form = form_demande.save(commit=False)
|
||||
form.nom_passager = request.user.profile
|
||||
form.save()
|
||||
|
||||
models.CarnetBord.objects.create(
|
||||
course=models.DemandeVehicule.objects.get(id=form.id)
|
||||
)
|
||||
|
||||
return JsonResponse(
|
||||
{"success": True, "message": "Demande enregistrée avec succès"}
|
||||
)
|
||||
return JsonResponse(
|
||||
{
|
||||
"success": False,
|
||||
"message": (
|
||||
"Une erreur s'est produit lors de "
|
||||
"l'enregistrement de la demande"
|
||||
),
|
||||
}
|
||||
)
|
||||
return None
|
||||
|
||||
@login_required(login_url="login")
|
||||
def liste_demande(request):
|
||||
"""Afficher la liste des demandes de véhicules.
|
||||
|
||||
La liste des demandes affichées dépend du groupe de l'utilisateur connecté:
|
||||
- Si l'utilisateur appartient au groupe "Chauffeur", seules les demandes
|
||||
qui lui sont assignées sont affichées.
|
||||
- Sinon, toutes les demandes de véhicules sont affichées.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des demandes de véhicules.
|
||||
|
||||
"""
|
||||
liste_demande_vehicule = []
|
||||
|
||||
if request.user.groups.filter(name="Chauffeur").exists():
|
||||
liste_demande_vehicule = models.DemandeVehicule.objects.filter(
|
||||
chauffeur__user_id=request.user.id
|
||||
)
|
||||
else:
|
||||
liste_demande_vehicule = models.DemandeVehicule.objects.all()
|
||||
|
||||
demandes_en_cours = []
|
||||
parc_vehicule = [
|
||||
{"id": vehicule.id, "immatriculation": vehicule.immatriculation}
|
||||
for vehicule in models.Vehicule.objects.filter(disponible=True)
|
||||
]
|
||||
chauffeur_group = Group.objects.get(name="Chauffeur")
|
||||
chauffeurs = [
|
||||
{
|
||||
"chauffeur_id": chauffeur.user.id,
|
||||
"chauffeur_name": (
|
||||
f"{chauffeur.user.first_name} {chauffeur.user.last_name}"
|
||||
),
|
||||
}
|
||||
for chauffeur in Profile.objects.filter(user__groups=chauffeur_group)
|
||||
]
|
||||
|
||||
demandes_en_cours = [
|
||||
{
|
||||
"id_demande": demande.id,
|
||||
"nom_passager": (
|
||||
f"{demande.nom_passager.user.first_name} "
|
||||
f"{demande.nom_passager.user.last_name}"
|
||||
),
|
||||
"lieu_depart": demande.lieu_depart,
|
||||
"date_heure_depart": demande.date_heure.strftime("%d/%m/%Y %H:%M"),
|
||||
"lieu_arrivee": demande.lieu_arrive,
|
||||
"validation": demande.validation,
|
||||
"vehicule": parc_vehicule,
|
||||
"chauffeurs": chauffeurs,
|
||||
"motif_refus": demande.motif_refus,
|
||||
"user_id": demande.nom_passager.user.id,
|
||||
"is_logisticien": (
|
||||
request.user.profile.departement
|
||||
.nom_departement == "Logistique"
|
||||
),
|
||||
"is_chauffeur": (
|
||||
request.user.groups.filter(name="Chauffeur")
|
||||
.exists()
|
||||
),
|
||||
}
|
||||
for demande in liste_demande_vehicule
|
||||
]
|
||||
|
||||
return JsonResponse(demandes_en_cours, safe=False)
|
||||
|
||||
|
||||
def detail_course(request, id_demande):
|
||||
"""Afficher les détails d'une demande de véhicule spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
id_demande : int
|
||||
L'identifiant de la demande de véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP avec le rendu de la page de détails de la demande de
|
||||
véhicule.
|
||||
|
||||
"""
|
||||
la_demande = models.DemandeVehicule.objects.get(id=id_demande)
|
||||
vehicule = la_demande.vehicule
|
||||
|
||||
details_course = models.CarnetBord.objects.get(course=la_demande)
|
||||
|
||||
print("Détails course:", la_demande.id)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"gestion_vehicule/detail_course.html",
|
||||
{
|
||||
"detail_demande": {
|
||||
"id": la_demande.id,
|
||||
"nom_passager": (
|
||||
f"{la_demande.nom_passager.user.first_name} "
|
||||
f"{la_demande.nom_passager.user.last_name}"
|
||||
),
|
||||
"lieu_depart": la_demande.lieu_depart,
|
||||
"date_heure": la_demande.date_heure,
|
||||
"lieu_arrive": la_demande.lieu_arrive,
|
||||
"immatriculation": la_demande.vehicule.immatriculation,
|
||||
"id_vehicule": la_demande.vehicule.id,
|
||||
"details_course": details_course,
|
||||
"prise_carburant_formulaire": forms.PriseCarburant(
|
||||
initial={"vehicule": vehicule.immatriculation}
|
||||
),
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def statut_demande(request):
|
||||
"""Mettre à jour le statut d'une demande de véhicule.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
request.id-demande : int
|
||||
L'identifiant de la demande de véhicule à mettre à jour.
|
||||
request.radioValider : str
|
||||
Le statut de validation de la demande
|
||||
("Valider", "Refuser", ou autre).
|
||||
request.vehicule : int
|
||||
L'identifiant du véhicule assigné (si validée).
|
||||
request.chauffeur : int
|
||||
L'identifiant du chauffeur assigné (si validée).
|
||||
request.motif : str
|
||||
Le motif de refus (si refusée).
|
||||
request.course_termine : str
|
||||
Indique si la course est terminée ("on" si cochée).
|
||||
request.date_heure_retour : str
|
||||
La date et l'heure de retour de la course (si terminée).
|
||||
request.heure_course_termine : str
|
||||
L'heure de fin de la course (si terminée).
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page d'accueil de la gestion des véhicules après
|
||||
la mise à jour du statut de la demande.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
demande = models.DemandeVehicule.objects.get(
|
||||
id=request.POST["id-demande"]
|
||||
)
|
||||
|
||||
if "radioValider" in request.POST:
|
||||
if request.POST["radioValider"] == "Valider":
|
||||
demande.validation = True
|
||||
demande.vehicule = models.Vehicule.objects.get(
|
||||
id=request.POST["vehicule"]
|
||||
)
|
||||
demande.chauffeur = models.Profile.objects.get(
|
||||
user_id=request.POST["chauffeur"]
|
||||
)
|
||||
elif request.POST["radioValider"] == "Refuser":
|
||||
demande.validation = False
|
||||
demande.motif_refus = request.POST["motif"]
|
||||
else:
|
||||
demande.validation = None
|
||||
|
||||
if (
|
||||
"course_termine" in request.POST
|
||||
and "date_heure_retour" in request.POST
|
||||
and request.POST["course_termine"] == "on"
|
||||
and request.POST["date_heure_retour"] != ""
|
||||
):
|
||||
demande.course_terminer = True
|
||||
demande.heure_course_termine = request.POST["date_heure_retour"]
|
||||
|
||||
demande.save()
|
||||
|
||||
return redirect("gestion_vehicule:index")
|
||||
|
||||
@login_required(login_url="login")
|
||||
def detail_voiture(request, vehicule_id):
|
||||
"""Afficher les détails d'un véhicule spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
vehicule_id : int
|
||||
L'identifiant du véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP avec le rendu de la page de détails du véhicule.
|
||||
|
||||
"""
|
||||
vehicule = models.Vehicule.objects.get(id=vehicule_id)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"gestion_vehicule/detail_vehicule.html",
|
||||
{
|
||||
"vehicule": vehicule,
|
||||
"carnet_bord_formulaire": forms.CarnetBord(
|
||||
initial={"vehicule": vehicule.immatriculation}
|
||||
),
|
||||
},
|
||||
)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def enregistrer_prise_carburant(request, course_id):
|
||||
"""Enregistrer une prise de carburant pour une course spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
course_id : int
|
||||
L'identifiant de la course pour laquelle enregistrer la prise de
|
||||
carburant.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page de détails de la course après l'enregistrement
|
||||
de la prise de carburant.
|
||||
|
||||
"""
|
||||
course = models.DemandeVehicule(id=course_id)
|
||||
if request.method == "POST":
|
||||
prise_carburant = forms.PriseCarburant(request.POST)
|
||||
if prise_carburant.is_valid():
|
||||
d = prise_carburant.save(commit=False)
|
||||
d.course = course
|
||||
d.save()
|
||||
|
||||
return redirect("gestion_vehicule:detail-course", id_demande=course_id)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def carnet_carburant(request, vehicule_id):
|
||||
"""Afficher le carnet de carburant d'un véhicule spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
vehicule_id : int
|
||||
L'identifiant du véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP avec le rendu de la page du carnet de carburant
|
||||
du véhicule.
|
||||
|
||||
"""
|
||||
return render(
|
||||
request,
|
||||
"gestion_vehicule/carnet_carburant.html",
|
||||
{
|
||||
"id_vehicule": vehicule_id
|
||||
}
|
||||
)
|
||||
|
||||
def carnet_sortie_vehicule(request, vehicule_id):
|
||||
"""Afficher le carnet de sortie d'un véhicule spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
|
||||
vehicule_id : int
|
||||
L'identifiant du véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponse
|
||||
La réponse HTTP avec le rendu de la page du carnet de sortie
|
||||
du véhicule.
|
||||
|
||||
"""
|
||||
return render(
|
||||
request,
|
||||
"gestion_vehicule/carnet_sortie_vehicule.html",
|
||||
{"id_vehicule": vehicule_id},
|
||||
)
|
||||
|
||||
|
||||
@login_required(login_url="login")
|
||||
def filtre_carnet_carburant(request):
|
||||
"""Filtrer les prises de carburant d'un véhicule pour un mois spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
request.id_vehicule : int
|
||||
L'identifiant du véhicule.
|
||||
request.mois : str
|
||||
Le mois au format "YYYY-MM".
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des prises de carburant
|
||||
filtrées.
|
||||
|
||||
"""
|
||||
id_vehicule = request.GET["id_vehicule"]
|
||||
annee, mois = request.GET["mois"].split("-")
|
||||
|
||||
prises_carburant = models.CarnetCarburant.objects.filter(
|
||||
course__vehicule=models.Vehicule.objects.get(id=id_vehicule),
|
||||
date__year=annee,
|
||||
date__month=mois,
|
||||
)
|
||||
|
||||
mon_carnet = [
|
||||
{
|
||||
"date": p.date,
|
||||
"nom_station": p.nom_station,
|
||||
"type_carburant": p.type_carburant,
|
||||
"litre": p.litre,
|
||||
"prix": p.prix,
|
||||
"montant_total": p.litre * p.prix,
|
||||
"kilometrage": p.kilometrage,
|
||||
"observation": p.observation,
|
||||
"nom_chauffeur": (
|
||||
f"{p.course.chauffeur.user.first_name} "
|
||||
f"{p.course.chauffeur.user.last_name}"
|
||||
),
|
||||
}
|
||||
for p in prises_carburant
|
||||
]
|
||||
|
||||
return JsonResponse(mon_carnet, safe=False)
|
||||
|
||||
def filtre_sortie_vehicule(request):
|
||||
"""Filtrer les sorties d'un véhicule pour un mois spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
request.id_vehicule : int
|
||||
L'identifiant du véhicule.
|
||||
request.mois : str
|
||||
Le mois au format "YYYY-MM".
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant la liste des sorties de véhicule
|
||||
filtrées.
|
||||
|
||||
"""
|
||||
id_vehicule = request.GET["id_vehicule"]
|
||||
annee, mois = request.GET["mois"].split("-")
|
||||
|
||||
sortie_vehicule = models.CarnetBord.objects.filter(
|
||||
course__vehicule=models.Vehicule.objects.get(id=id_vehicule),
|
||||
heure_effectif_depart__year=annee,
|
||||
heure_effectif_depart__month=mois,
|
||||
)
|
||||
|
||||
mes_sorties = [
|
||||
{
|
||||
"nom_passager": (
|
||||
f"{p.course.nom_passager.user.first_name} "
|
||||
f"{p.course.nom_passager.user.last_name}"
|
||||
),
|
||||
"lieu_depart": p.course.lieu_depart,
|
||||
"heure_depart_prevu": p.course.date_heure,
|
||||
"heure_depart_effectif": p.heure_effectif_depart,
|
||||
"lieu_arrive": p.course.lieu_arrive,
|
||||
"heure_arrive": p.heure_arrive,
|
||||
"nom_chauffeur": (
|
||||
f"{p.course.chauffeur.user.first_name} "
|
||||
f"{p.course.chauffeur.user.last_name}"
|
||||
),
|
||||
}
|
||||
for p in sortie_vehicule
|
||||
]
|
||||
|
||||
return JsonResponse(mes_sorties, safe=False)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def enregistrer_carnet_bord(request, vehicule_id):
|
||||
"""Enregistrer ou mettre à jour le carnet de bord d'un véhicule.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
request.mois_concerne : str
|
||||
Le mois concerné au format "YYYY-MM".
|
||||
request.km_debut_mois : int
|
||||
Le kilométrage au début du mois.
|
||||
request.km_fin_mois : int
|
||||
Le kilométrage à la fin du mois.
|
||||
|
||||
vehicule_id : int
|
||||
L'identifiant du véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page de détails du véhicule après l'enregistrement
|
||||
ou la mise à jour du carnet de bord.
|
||||
|
||||
"""
|
||||
if request.method == "POST":
|
||||
annee, mois = request.POST["mois_concerne"].split("-")
|
||||
carnet_bord, created = models.CarnetBord.objects.update_or_create(
|
||||
mois_concerne="-".join([annee, mois, "01"]),
|
||||
defaults={
|
||||
"km_debut_mois": request.POST["km_debut_mois"],
|
||||
"km_fin_mois": request.POST["km_fin_mois"],
|
||||
"vehicule": models.Vehicule.objects.get(id=vehicule_id),
|
||||
},
|
||||
)
|
||||
|
||||
if created:
|
||||
print("Création effectuée")
|
||||
else:
|
||||
print("Mise à jour effectué")
|
||||
|
||||
return redirect(detail_voiture, vehicule_id)
|
||||
|
||||
@login_required(login_url="login")
|
||||
def carnet_vehicule_information(request, mois_concerne): # noqa: ARG001
|
||||
"""Récupérer les informations du carnet de bord pour un mois spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
mois_concerne : str
|
||||
Le mois concerné au format "YYYY-MM".
|
||||
|
||||
Returns
|
||||
-------
|
||||
JsonResponse
|
||||
Une réponse JSON contenant les informations du carnet de bord
|
||||
pour le mois spécifié.
|
||||
|
||||
"""
|
||||
annee, mois = mois_concerne.split("-")
|
||||
try:
|
||||
carnet_bord = models.CarnetBord.objects.get(
|
||||
mois_concerne="-".join([annee, mois, "01"])
|
||||
)
|
||||
except models.CarnetBord.DoesNotExist:
|
||||
carnet_dict = {}
|
||||
else:
|
||||
carnet_dict = {
|
||||
"km_debut": carnet_bord.km_debut_mois,
|
||||
"km_fin": carnet_bord.km_fin_mois,
|
||||
}
|
||||
|
||||
return JsonResponse(carnet_dict)
|
||||
|
||||
def enregistrer_information_course_depart(request, id_demande):
|
||||
"""Enregistrer les informations de départ d'une course spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
id_demande : int
|
||||
L'identifiant de la demande de véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page de détails de la course après l'enregistrement
|
||||
des informations de départ.
|
||||
|
||||
"""
|
||||
demande = models.DemandeVehicule.objects.get(id=id_demande)
|
||||
vehicule = models.Vehicule.objects.get(id=request.POST["id-vehicule"])
|
||||
course = models.CarnetBord.objects.get(course=demande)
|
||||
|
||||
course.vehicule = vehicule
|
||||
course.course = demande
|
||||
course.heure_effectif_depart = request.POST["heure-depart"]
|
||||
course.km_depart = request.POST["kilometrage_depart"]
|
||||
course.save()
|
||||
|
||||
return redirect("gestion_vehicule:detail-course", id_demande)
|
||||
|
||||
def enregistrer_information_course_arrive(request, id_demande):
|
||||
"""Enregistrer les informations d'arrivée d'une course spécifique.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
request : HttpRequest
|
||||
La requête HTTP reçue.
|
||||
id_demande : int
|
||||
L'identifiant de la demande de véhicule.
|
||||
|
||||
Returns
|
||||
-------
|
||||
HttpResponseRedirect
|
||||
Redirige vers la page de détails de la course après l'enregistrement
|
||||
des informations d'arrivée.
|
||||
|
||||
"""
|
||||
demande = models.DemandeVehicule.objects.get(id=id_demande)
|
||||
vehicule = models.Vehicule.objects.get(id=demande.vehicule.id)
|
||||
|
||||
course_termier = False
|
||||
if "course_terminer" in request.POST:
|
||||
course_termier = True
|
||||
|
||||
course = models.CarnetBord.objects.get(course=demande)
|
||||
|
||||
course.vehicule = vehicule
|
||||
course.course = demande
|
||||
course.heure_arrive = request.POST["heure-effectif-arrivee"]
|
||||
course.km_arrive = request.POST["kilometrage-arrivee"]
|
||||
course.course_termine = course_termier
|
||||
course.save()
|
||||
|
||||
return redirect("gestion_vehicule:detail-course", id_demande)
|
||||
Reference in New Issue
Block a user