From 2191a4cf0b28dc84f38582baef686516a6976ca3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Valentin=20Mogu=C3=A9rou?=
Date: Fri, 19 Apr 2024 23:36:53 +0200
Subject: [PATCH] travail sur le dashboard
---
colloscope/models.py | 26 ++++++++++++
colloscope/pdfexport.py | 37 ++++++++++++-----
colloscope/templates/dashboard.html | 2 +-
colloscope/templates/table.html | 4 +-
colloscope/views.py | 62 ++++++++++++++---------------
5 files changed, 88 insertions(+), 43 deletions(-)
diff --git a/colloscope/models.py b/colloscope/models.py
index b68810a..4f76f57 100644
--- a/colloscope/models.py
+++ b/colloscope/models.py
@@ -101,6 +101,17 @@ class Classe(models.Model):
"""
return Periode.objects.get(classe=self, debut__lte=jour, fin__gte=jour)
+ def periode_actuelle(self):
+ #return self.periode(date.today()) // ne fonctionne pas entre les périodes
+ """
+ On prend la période non révolue la plus récente
+ """
+
+ return Periode.objects \
+ .filter(classe=self, fin__gte=date.today()) \
+ .order_by("-debut") \
+ .first()
+
def __str__(self):
return f"{self.libelle} ({self.lycee.libelle})"
@@ -331,3 +342,18 @@ class Profil(models.Model):
def __str__(self):
return f"Profil {self.utilisateur} : {self.etudiant} ; {self.colleur}"
+
+ @staticmethod
+ def from_request(request, preprocess=lambda query: query):
+ user = request.user
+ session = request.session
+
+ match session.get("profil"):
+ case "etudiant":
+ profil = preprocess(Profil.objects.filter(utilisateur=user)).get()
+ return profil.etudiant
+ case "colleur":
+ profil = preprocess(Profil.objects.filter(utilisateur=user)).get()
+ return profil.colleur
+ case _:
+ raise ValueError("profil non choisi")
diff --git a/colloscope/pdfexport.py b/colloscope/pdfexport.py
index cf2f62b..18fd9cc 100644
--- a/colloscope/pdfexport.py
+++ b/colloscope/pdfexport.py
@@ -84,16 +84,13 @@ class PDF(FPDF):
row.cell()
def generate(periode):
- classe = periode.classe
-
pdf = PDF(orientation="landscape", format="a4")
pdf.set_font("helvetica", size=6)
- titre = f"Colloscope {classe.libelle} {periode.libelle}"
+ titre = f"Colloscope {periode.classe.libelle} {periode.libelle}"
pdf.set_title(titre)
- pdf.set_author("projet colloscope")
- pdf.set_author("projet colloscope")
+ pdf.set_author("colles.mp2i-vms.fr")
pdf.add_page()
pdf.cell(text=titre, center=True, border=1, h=5)
@@ -108,11 +105,31 @@ def generate(periode):
return pdf
-def main():
- classe = Classe.objects.get(id=1)
- periode = Periode.objects.get(classe=classe, libelle="Semestre 5/2")
+
+def handle(request):
+ try:
+ etudiant = Profil.from_request(
+ request,
+ preprocess=lambda query: query \
+ .select_related("etudiant__classe") \
+ .prefetch_related("etudiant__classe__periode_set")
+ )
+ except ValueError:
+ return redirect("colloscope.choix_profil")
+
+ if not isinstance(etudiant, Etudiant):
+ return HttpResponse("pas encore supporté")
+
+
+ periode_str = request.GET.get("periode")
+ if periode_str is None:
+ periode = etudiant.classe.periode_actuelle()
+ else:
+ periode = Periode.objects.get(id=int(periode_str), classe=etudiant.classe)
return generate(periode)
-if __name__ == "__main__":
- main()
+
+def main():
+ periode = Periode.objects.get(id=3)
+ return generate(periode)
diff --git a/colloscope/templates/dashboard.html b/colloscope/templates/dashboard.html
index 1ad71dd..6bc713e 100644
--- a/colloscope/templates/dashboard.html
+++ b/colloscope/templates/dashboard.html
@@ -10,7 +10,7 @@
Bienvenue {{ etudiant }}. Votre lycée est {{ periode.classe.lycee.libelle }}, et votre classe est {{ periode.classe.libelle }}.
-Votre groupe de colle est {{ groupe }}.
+Période actuelle : {{ periode }}. Votre groupe de colle est {{ groupe }}. Consulter le colloscope
{% for n, lundi, colles in rotations %}
diff --git a/colloscope/templates/table.html b/colloscope/templates/table.html
index 87a3458..024a023 100644
--- a/colloscope/templates/table.html
+++ b/colloscope/templates/table.html
@@ -17,11 +17,13 @@
{% block main %}
- Lycée : {{ periode.classe.lycee.libelle }}. Classe : {{ periode.classe.libelle }}.
+ Lycée : {{ periode.classe.lycee.libelle }}. Classe : {{ periode.classe.libelle }}. Retour au tableau de bord
Colloscope : {{ periode.libelle }}
+ Exporter le colloscope
+
diff --git a/colloscope/views.py b/colloscope/views.py
index 58c5d02..beb9dc5 100644
--- a/colloscope/views.py
+++ b/colloscope/views.py
@@ -1,4 +1,4 @@
-from datetime import timedelta
+from datetime import date, timedelta
from django.shortcuts import redirect
from django.http import HttpResponse
@@ -7,7 +7,7 @@ from django.contrib.auth.decorators import login_required
from colloscope.models import *
from colloscope.table import table_colloscope
-from colloscope.pdfexport import main # /!\ temporaire
+from colloscope.pdfexport import handle
def handler404(request):
@@ -18,7 +18,7 @@ def handler404(request):
def home_redirect(request):
- return redirect("/colloscope/table.html")
+ return redirect("/colloscope/dashboard.html")
@login_required
@@ -50,29 +50,27 @@ def choix_profil(request):
}
return HttpResponse(template.render(context))
-
@login_required
def dashboard(request):
user = request.user
session = request.session
+
+ try:
+ etudiant = Profil.from_request(
+ request,
+ preprocess=lambda query: query \
+ .select_related("etudiant__classe") \
+ .prefetch_related("etudiant__classe__periode_set")
+ )
+ except ValueError:
+ return redirect("colloscope.choix_profil")
- match session.get("profil"):
- case "etudiant":
- profil = Profil.objects \
- .select_related("etudiant__classe") \
- .prefetch_related("etudiant__classe__periode_set") \
- .get(utilisateur=user)
- etudiant = profil.etudiant
- case "colleur":
- return HttpResponse("pas (encore) supporté")
- case _:
- return redirect("/colloscope/choix_profil")
+ if not isinstance(etudiant, Etudiant):
+ return HttpResponse("pas encore supporté")
- periode = etudiant.classe.periode_set.order_by("-debut").first()
+ periode = etudiant.classe.periode_actuelle()
groupe = etudiant.groupe_de_colle(periode)
-
rotations = groupe.get_colles_par_sem()
-
template = loader.get_template("dashboard.html")
context = {
@@ -89,22 +87,24 @@ def dashboard(request):
def colloscope(request):
user = request.user
session = request.session
+
+ try:
+ etudiant = Profil.from_request(
+ request,
+ preprocess=lambda query: query \
+ .select_related("etudiant__classe") \
+ .prefetch_related("etudiant__classe__periode_set")
+ )
+ except ValueError:
+ return redirect("colloscope.choix_profil")
+
+ if not isinstance(etudiant, Etudiant):
+ return HttpResponse("pas encore supporté")
- match session.get("profil"):
- case "etudiant":
- profil = Profil.objects \
- .select_related("etudiant__classe") \
- .prefetch_related("etudiant__classe__periode_set") \
- .get(utilisateur=user)
- etudiant = profil.etudiant
- case "colleur":
- return HttpResponse("pas (encore) supporté")
- case _:
- return redirect("/colloscope/choix_profil")
periode_str = request.GET.get("periode")
if periode_str is None:
- periode = etudiant.classe.periode_set.order_by("-debut").first()
+ periode = etudiant.classe.periode_actuelle()
else:
try:
periode = Periode.objects.get(id=int(periode_str), classe=etudiant.classe)
@@ -151,7 +151,7 @@ def colloscope(request):
def export(request):
- return HttpResponse(bytes(main().output()), content_type="application/pdf")
+ return HttpResponse(bytes(handle(request).output()), content_type="application/pdf")
def data_dump(request):
template = loader.get_template("data_dump.html")