travail sur le dashboard

This commit is contained in:
Valentin Moguérou 2024-04-19 23:36:53 +02:00
parent 468b77bb73
commit 2191a4cf0b
5 changed files with 88 additions and 43 deletions

View File

@ -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")

View File

@ -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)

View File

@ -10,7 +10,7 @@
Bienvenue {{ etudiant }}. Votre lycée est {{ periode.classe.lycee.libelle }}, et votre classe est {{ periode.classe.libelle }}.
</p>
<p>Votre groupe de colle est {{ groupe }}.</p>
<p>Période actuelle : {{ periode }}. Votre groupe de colle est {{ groupe }}. <a href="table.html">Consulter le colloscope</a></p>
<ul>
{% for n, lundi, colles in rotations %}

View File

@ -17,11 +17,13 @@
{% block main %}
<p>
Lycée : {{ periode.classe.lycee.libelle }}. Classe : {{ periode.classe.libelle }}.
Lycée : {{ periode.classe.lycee.libelle }}. Classe : {{ periode.classe.libelle }}. <a href="dashboard.html">Retour au tableau de bord</a>
</p>
<h2>Colloscope : {{ periode.libelle }}</h2>
<a href="export.pdf" target="_blank">Exporter le colloscope</a>
<div class="table-wrapper">
<table>

View File

@ -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")