diff --git a/app/scodoc/sco_gen_cal.py b/app/scodoc/sco_gen_cal.py new file mode 100644 index 00000000..b29f7d94 --- /dev/null +++ b/app/scodoc/sco_gen_cal.py @@ -0,0 +1,119 @@ +""" +Génération d'un calendrier +(Classe abstraite à implémenter dans les classes filles) +""" + +import datetime +from flask import render_template + +import app.scodoc.sco_utils as scu +from app import g + + +class Jour: + """ + Représente un jour dans le calendrier + Permet d'obtenir les informations sur le jour + et générer une représentation html + """ + + def __init__(self, date: datetime.date): + self.date = date + + def get_nom(self, short=True): + """ + Renvoie le nom du jour + "M19" ou "Mer 19" + + par défaut en version courte + """ + str_jour: str = scu.DAY_NAMES[self.date.weekday()].capitalize() + return ( + f"{str_jour[0] if short or self.is_non_work() else str_jour[:3]+' '}" + + f"{self.date.day}" + ) + + def is_non_work(self): + """ + Renvoie True si le jour est un jour non travaillé + (en fonction de la préférence du département) + """ + return self.date.weekday() in scu.NonWorkDays.get_all_non_work_days( + dept_id=g.scodoc_dept_id + ) + + def get_date(self) -> str: + """ + Renvoie la date du jour au format "dd/mm/yyyy" + """ + return self.date.strftime(scu.DATE_FMT) + + def get_html(self): + """ + Renvoie le code html du jour + à surcharger dans les classes filles + """ + raise NotImplementedError("Méthode à implémenter dans les classes filles") + + +class Calendrier: + """ + Représente un calendrier + Permet d'obtenir les informations sur les jours + et générer une représentation html + """ + + def __init__(self, date_debut: datetime.date, date_fin: datetime.date): + self.date_debut = date_debut + self.date_fin = date_fin + self.jours: dict[str, list[Jour]] = {} + + self.organize_by_month() + + def _get_dates_between(self) -> list[datetime.date]: + """ + get_dates_between Renvoie la liste des dates entre date_debut et date_fin + + Returns: + list[datetime.date]: liste des dates entre date_debut et date_fin + """ + resultat = [] + date_actuelle = self.date_debut + while date_actuelle <= self.date_fin: + resultat.append(date_actuelle) + date_actuelle += datetime.timedelta(days=1) + return resultat + + def organize_by_month(self): + """ + Organise les jours par mois + Instancie un objet Jour pour chaque jour + + met à jour self.jours + """ + organized = {} + for date in self._get_dates_between(): + # Récupérer le mois en français + month = scu.MONTH_NAMES_ABBREV[date.month - 1] + # Ajouter le jour à la liste correspondante au mois + if month not in organized: + organized[month] = [] + + jour: Jour = self.instanciate_jour(date) + + organized[month].append(jour) + + self.jours = organized + + def instanciate_jour(self, date: datetime.date) -> Jour: + """ + Instancie un objet Jour pour chaque jour + A surcharger dans les classes filles si besoin + """ + raise NotImplementedError("Méthode à implémenter dans les classes filles") + + def get_html(self): + """ + get_html Renvoie le code html du calendrier + """ + return render_template("calendrier.j2", calendrier=self.jours) diff --git a/app/templates/calendrier.j2 b/app/templates/calendrier.j2 new file mode 100644 index 00000000..eb5f0e8f --- /dev/null +++ b/app/templates/calendrier.j2 @@ -0,0 +1,42 @@ +
+ {% for mois,jours in calendrier.items() %} +
+

{{mois}}

+
+ {% for jour in jours %} +
+ {{jour.get_html() | safe}} +
+ {% endfor %} +
+
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 82990fcb..8dc9d149 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -2873,3 +2873,27 @@ def _generate_assiduite_bubble(assiduite: Assiduite) -> str: saisie=saisie, motif=motif, ) + + +from app.scodoc import sco_gen_cal + + +class JourTest(sco_gen_cal.Jour): + def get_html(self): + return f"{self.get_nom()}" + + +class CalendrierTest(sco_gen_cal.Calendrier): + def instanciate_jour(self, date: datetime.date): + return JourTest(date) + + +@bp.route("/generate_cal") +@scodoc +@permission_required(Permission.AbsJustifView) +def test(): + cal = CalendrierTest( + datetime.date(2021, 9, 1), + datetime.date(2022, 8, 31), + ) + return cal.get_html()