38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
"""Règles communes liées aux dates de réunion."""
|
|
from datetime import date as dt_date
|
|
from calendar import monthrange
|
|
|
|
JOURS_SEMAINE = {
|
|
"lundi": 0,
|
|
"mardi": 1,
|
|
"mercredi": 2,
|
|
"jeudi": 3,
|
|
"vendredi": 4,
|
|
"samedi": 5,
|
|
"dimanche": 6,
|
|
}
|
|
|
|
|
|
def jour_reunion_attendu(groupe) -> int | None:
|
|
if not getattr(groupe, "jour_reunion", None):
|
|
return None
|
|
return JOURS_SEMAINE.get(groupe.jour_reunion.lower())
|
|
|
|
|
|
def date_correspond_au_jour_reunion(groupe, date_reunion: dt_date) -> bool:
|
|
jour = jour_reunion_attendu(groupe)
|
|
return True if jour is None else date_reunion.weekday() == jour
|
|
|
|
|
|
def date_assemblee_affaires_du_mois(annee: int, mois: int, jour_cible: int, ordre: str) -> dt_date:
|
|
dates = []
|
|
for jour in range(1, monthrange(annee, mois)[1] + 1):
|
|
date = dt_date(annee, mois, jour)
|
|
if date.weekday() == jour_cible:
|
|
dates.append(date)
|
|
if not dates:
|
|
return dt_date(annee, mois, 1)
|
|
if ordre == "derniere":
|
|
return dates[-1]
|
|
index = {"premiere": 0, "deuxieme": 1, "troisieme": 2, "quatrieme": 3}.get(ordre, 0)
|
|
return dates[index] if index < len(dates) else dates[-1]
|