From 3483ce62c80af19d83acc970618e428d5b60e531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Mogu=C3=A9rou?= Date: Tue, 16 Apr 2024 13:54:00 +0200 Subject: [PATCH] colloscope web --- colloscope/models.py | 2 + colloscope/pdfexport.py | 76 ------------------- colloscope/table.py | 59 +++++++++++++++ colloscope/templates/404.html | 11 +++ colloscope/templates/base.html | 21 ++++++ colloscope/templates/colloscope.html | 108 ++++++++++++++++----------- colloscope/templatetags/__init__.py | 0 colloscope/templatetags/extras.py | 24 ++++++ colloscope/views.py | 50 ++++++++++++- 9 files changed, 230 insertions(+), 121 deletions(-) create mode 100644 colloscope/table.py create mode 100644 colloscope/templates/404.html create mode 100644 colloscope/templates/base.html create mode 100644 colloscope/templatetags/__init__.py create mode 100644 colloscope/templatetags/extras.py diff --git a/colloscope/models.py b/colloscope/models.py index 334ca9e..108a534 100644 --- a/colloscope/models.py +++ b/colloscope/models.py @@ -13,11 +13,13 @@ calendrier = { ] } + class Lycee(models.Model): uai = models.CharField(max_length=10) libelle = models.CharField(max_length=100) vacances = models.CharField(max_length=1) + class Classe(models.Model): lycee = models.ForeignKey(Lycee, on_delete=models.CASCADE) libelle = models.CharField(max_length=20) diff --git a/colloscope/pdfexport.py b/colloscope/pdfexport.py index 340c8dc..9c780c8 100644 --- a/colloscope/pdfexport.py +++ b/colloscope/pdfexport.py @@ -3,83 +3,7 @@ from datetime import date, timedelta from colloscope.models import * from fpdf import FPDF -from fpdf.fonts import FontFace -from fpdf.enums import TableCellFillMode -""" -etudiants = [ - ['Aboujaib', 'Alexandre', 4, 'A', '', ''], - ['Ajan', 'George', 4, 'A', '', ''], - ['Akrad', 'Lina', 1, 'SI', '', ''], - ['Aubert', 'Nicolas', 1, 'SI', '', ''], - ['Badr', 'Roman', 4, 'A', '', ''], - ['Bazire', 'Aurélien', 5, 'A', '', ''], - ['Boit', 'Arthur', 5, 'A', '', ''], - ['Boubker', 'Youssef', 5, 'A', '', ''], - ['Boudjema', 'Dylan', 1, 'SI', '', ''], - ['Chiriac', 'Mihnea', 6, 'A', '', ''], - ['Courier', 'Marine', 6, 'A', '', ''], - ['Daguin', 'Joseph', 6, 'A', '', ''], - ['Dauguen', 'Gabriel', 7, 'A', '', ''], - ['De Weer', 'Matthias', 7, 'A', '', ''], - ['Desbouis', 'Katell', 2, 'SI', '', ''], - ['Dupouy', 'Jérémie', 7, 'A', '', ''], - ['Hariri--Gautier-Picard', 'Grégoire', 8, 'A', '', ''], - ['Juricevic', 'Matteo', 8, 'A', '', ''], - ['Knanoua', 'Anas', 8, 'A', '', ''], - ['Lesenne', 'Pierrick', 9, 'A', '', ''], - ['Lin', 'Hao', 2, 'SI', '', ''], - ['Masbatin', 'Lucas', 2, 'SI', '', ''], - ['Mayuran', 'Mithushan', 9, 'A', '', ''], - ['Messahli', 'Yassine', 9, 'A', '', ''], - ['Moguérou', 'Valentin', 10, 'B', '', ''], - ['Mohellebi', 'Mathéo', 10, 'B', '', ''], - ['Mouisset--Ferrara', 'Maël', 10, 'B', '', ''], - ['Ottavi', 'Corentin', 11, 'B', '', ''], - ['Ponce', 'Alexian', 11, 'B', '', ''], - ['Pujol', 'Raphaël', 11, 'B', '', ''], - ['Pustetto', 'Mathis', 12, 'B', '', ''], - ['Radice', 'Roman', 12, 'B', '', ''], - ['Rat', 'Evelyn', 12, 'B', '', ''], - ['Rousse', 'Louis', 3, 'SI', '', ''], - ['Roux', 'Gaëtan', 3, 'SI', '', ''], - ['Rouyre--Cros', 'Célian', 3, 'SI', '', ''], - ['Sourbé', 'François-Gabriel', 13, 'B', '', ''], - ['Stourbe', 'Simon', 13, 'B', '', ''], - ['Thai', 'Dany', 13, 'B', '', ''], - ['Théodore', 'Jonathan', 14, 'B', '', ''], - ['Vandroux', 'Benoît', 14, 'B', '', ''], - ['Veyssière', 'Thibaud', 14, 'B', '', ''], - ['Vié', 'Adrien', 15, 'B', '', ''], - ['Ye', 'Luan', 15, 'B', '', ''], - ['Zarka', 'Amélie', 15, 'B', '', ''], -] -""" - -creneaux = [ - ["Mathématiques", "vendredi", "17:00", "M. OUBAHA", "C382"], - ["Anglais", "mercredi", "14:00", "Mme LE GOURIELLEC", "C393"], - ["Mathématiques", "mercredi", "15:00", "M. BOULLY", "R004"], - ["Physique", "mardi", "14:00", "Mme CHEVALIER", "R103"], - ["Mathématiques", "mardi", "18:00", "M. RAPIN", "V152"], - ["Anglais", "mardi", "14:00", "Mme BELAGGOUNE", "C4??"], - ["pas de colle", "", "", "", ""], - ["Physique", "mardi", "17:00", "M. COLIN", "C386"], - ["Mathématiques", "mercredi", "13:30", "M. BOUVEROT", "??"], - ["Anglais", "lundi", "13:00", "M. HERBAUT", "V052"], -] - -semaines = list(range(24, 34)) - -rotations = [ - # [semaine, groupe, creneau] - (24, 1, 1), - (24, 2, 2), - (24, 3, 3), - (27, 3, 3), - (28, 3, 3), - (31, 3, 3), -] class PDF(FPDF): def liste_eleves(self, periode): diff --git a/colloscope/table.py b/colloscope/table.py new file mode 100644 index 0000000..07bba19 --- /dev/null +++ b/colloscope/table.py @@ -0,0 +1,59 @@ +from colloscope.models import * + +def table_colloscope(periode, heading=True, est_colle=True): + semaines = periode.range_semaines() + lundis = [ periode.classe.date_debut_sem(n) for n in semaines ] + creneaux = Creneau.objects.filter(periode=periode, est_colle=est_colle) + jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"] + + s = "" + + s += "\n" + + + if heading: + s += "\n" + + for th in ("Matière", "Jour", "Heure", "Colleur", "Salle"): + s += f"\n" + + for sem in semaines: + s +=f"\n" + + s += "\n\n" + + for lundi in lundis: + s += f"\n" + + s += "\n" + + for i, c in enumerate(creneaux): + matiere = c.matiere + jour = c.jour + heure = c.heure + colleur = c.colleur + salle = c.salle + + s += "\n" + s += f"\n" + s += f"\n" + s += f"\n" + s += "\n".format("M." if colleur.civilite=="M" else "Mme", colleur.nom.upper()) + s += f"\n" + + for sem in semaines: + if Rotation.objects.filter(creneau=c, semaine=sem).exists(): + r = Rotation.objects.get(creneau=c, semaine=sem) + groupes = r.groupes + content = ", ".join(g.libelle for g in groupes.all()) + + if r.est_modifiee(): + s += f"\n" + else: + s += f"\n" + else: + s += "\n" + + s += "
{th}{sem}
{lundi.strftime('%d/%m/%y')}
{matiere.libelle}{jours[jour]}{heure.strftime('%H:%M')}{} {}salle{content}{content}
\n" + + return s diff --git a/colloscope/templates/404.html b/colloscope/templates/404.html new file mode 100644 index 0000000..c00e0b7 --- /dev/null +++ b/colloscope/templates/404.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block title %}Erreur 404{% endblock title %} + +{% block header %} +

404 : GAME OVER

+{% endblock header %} + +{% block main %} +Vous vous êtes perdu. +{% endblock main %} diff --git a/colloscope/templates/base.html b/colloscope/templates/base.html new file mode 100644 index 0000000..e4ded3a --- /dev/null +++ b/colloscope/templates/base.html @@ -0,0 +1,21 @@ +{% load static %} + + + + + + {% block title %}{% endblock title %} + + {% block head %}{% endblock head %} + + +
+ {% block header %}{% endblock header %} +
+
+ {% block main %}{% endblock main %} +
+ + diff --git a/colloscope/templates/colloscope.html b/colloscope/templates/colloscope.html index e768a2e..394c627 100644 --- a/colloscope/templates/colloscope.html +++ b/colloscope/templates/colloscope.html @@ -1,52 +1,72 @@ -{% load static %} - - - - - - Colloscope - - - -
-

Universal Kholloscope Systems™

+{% extends "base.html" %} - +{% load extras %} -
+{% block title %}Colloscope{% endblock title %} -
-

Programme de colles

-

- Mathématiques : Dimension finie et matrices -

-

- Physique : Mécanique du solide -

+{% block header %} +

Colloscope

+{% endblock header %} -

- Colles cette semaine -

- +{% block main %} -
+

+ Lycée : {{ periode.classe.lycee.libelle }}. Classe : {{ periode.classe.libelle }}. +

- - - +

Colloscope : {{ periode.libelle }}

+ + + + + + + + + + + + + {% for lundi in lundis %} + + {% endfor %} + + + + {% for c, rs in rotations %} + + + + + + + + {% for sem, exists, r, est_modifiee, groupes in rs %} + {% if exists %} + {% if est_modifiee %} + + {% else %} + + {% endif %} + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} + +
MatièreJourHeureColleurSalle
{{ lundi | strftime:"%d/%m/%y" }}
{{ c.matiere.libelle }}{{ jours | getitem:c.jour }}{{ c.heure | strftime:"%H:%M" }} + {% if c.colleur.civilite == "M" %} + M. + {% else %} + Mme + {% endif %} + + {{ c.colleur.nom | upper }} + + {{ c.salle }} + {{ groupes | join:"," }}{{ groupes | join:"," }}
+ +{% endblock main %} diff --git a/colloscope/templatetags/__init__.py b/colloscope/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/colloscope/templatetags/extras.py b/colloscope/templatetags/extras.py new file mode 100644 index 0000000..6a32f20 --- /dev/null +++ b/colloscope/templatetags/extras.py @@ -0,0 +1,24 @@ +from django import template + +from colloscope.models import * + +register = template.Library() + +@register.filter(name="strftime") +def strftime(value, arg): + return value.strftime(arg) + +@register.filter(name="getitem") +def getitem(indexable, i): + return indexable[i] + +""" +@register.filter(name="exists") +def exists(queryset): + return queryset.exists() +""" +""" +@register.filter(name="est_modifiee") +def est_modifiee(rotation): + return rotation.est_modifiee() +""" diff --git a/colloscope/views.py b/colloscope/views.py index 43ac19e..1202d3e 100644 --- a/colloscope/views.py +++ b/colloscope/views.py @@ -1,10 +1,58 @@ from django.http import HttpResponse from django.template import loader +from colloscope.models import * +from colloscope.table import table_colloscope from colloscope.pdfexport import main # /!\ temporaire + +def handler404(request): + template = loader.get_template("404.html") + response.status_code = 404 + context = {} + return HttpResponse(template.render(context, response)) + + def colloscope(request): + periode_str = request.GET.get("periode", "") + if periode_str=="": + periode = Periode.objects.get(id=3) + else: + try: + periode = Periode.objects.get(id=int(periode_str)) + except Periode.DoesNotExist: + template = loader.get_template("404.html") + context = {} + response = HttpResponse(template.render(context, request)) + response.status_code = 404 + return response + + creneaux = Creneau.objects.filter(periode=periode, est_colle=True) + semaines = periode.range_semaines() + rotations = [ (c, []) for c in creneaux ] + for c, l in rotations: + for sem in semaines: + rot = Rotation.objects.filter(creneau=c, semaine=sem) + exists = rot.exists() + + if exists: + r = rot.first() + est_modifiee = r.est_modifiee() + groupes = (g.libelle for g in r.groupes.all()) + else: + r = est_modifiee = groupes = None + + l.append((sem, exists, r, est_modifiee, groupes)) + template = loader.get_template("colloscope.html") - return HttpResponse(template.render()) + + context = { + "periode": periode, + "lundis": [periode.classe.date_debut_sem(n) for n in semaines ], + "jours" : ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + "rotations" : rotations + } + + return HttpResponse(template.render(context, request)) def export(request): return HttpResponse(bytes(main().output()), content_type="application/pdf")