refactor sem_in_annee_scolaire_WIP

This commit is contained in:
Jean-Marie Place 2022-11-09 19:25:27 +01:00 committed by Jean-Marie PLACE
parent ce541d1870
commit d3e0ff019c
2 changed files with 127 additions and 19 deletions

View File

@ -422,6 +422,50 @@ def sem_set_responsable_name(sem):
)
def get_session(
debut: datetime,
jour_pivot_annee=1,
mois_pivot_annee=8,
jour_pivot_periode=1,
mois_pivot_periode=12,
):
"""Calcule la session associée à un formsemestre sous la forme (année, période)
année: première année de l'année scolaire
période = 1 (première période de l'année scolaire anciennement automne)
ou 0 (deuxième période de l'année scolaire - anciennement printemps)
les quatre derniers paramètres forment les dates pivots pour l'année (1er août par défaut)
et pour la période (1er décembre par défaut).
Tous les calculs se font à partir de la date de début du formsemestre.
Exemples dans tests/unit/test_periode
"""
"""Implementation
Cas à considérer pour le calcul de la période
pa < pp -----------------|-------------------|---------------->
(A-1, P:0) pa (A, P:1) pp (A, P:0)
pp < pa -----------------|-------------------|---------------->
(A-1, P:1) pp (A-1, P:0) pa (A, P:1)
"""
pa = 100 * mois_pivot_annee + jour_pivot_annee
pp = 100 * mois_pivot_periode + jour_pivot_periode
ps = 100 * debut.month + debut.day
if ps < pa:
annee = debut.year - 1
else:
annee = debut.year
if pa < pp:
if ps < pa or ps > pp:
periode = 0
else:
periode = 1
else:
if ps < pp or ps > pa:
periode = 1
else:
periode = 0
return annee, periode
def debut_in_semestre_scolaire(
date_debut: datetime.date, year: int = False, saison: int = 0
) -> bool:
@ -438,13 +482,19 @@ def debut_in_semestre_scolaire(
# XXX WIP à voir selon ce que fait réellement sem_in_semestre_scolaire
def sem_in_semestre_scolaire(sem, year=False, saison=0):
"""n'utilise que la date de debut, pivot au 1er aout
def sem_in_semestre_scolaire(
sem,
year=False,
periode=None,
jour_pivot_annee=1,
mois_pivot_annee=8,
jour_pivot_periode=1,
mois_pivot_periode=12,
):
"""n'utilise que la date de debut,
si annee non specifiée, année scolaire courante
Patch Jmp: ajout du parametre optionnel saison
1 = sept, 0 = janvier, None = année complète
Patch Jmp: ajout du parametre optionnel saison (1 ou 0)
si saison non spécifiée: année complète
pivot de saison au 1er décembre
XXX TODO: la période (ici appelée "saison" devrait être éditable
manuellement dans le formsemestre_edit afin de couvrir les cas particulier
comme un semestre S2 qui commencerait en décembre... voire novembre.
@ -452,21 +502,18 @@ def sem_in_semestre_scolaire(sem, year=False, saison=0):
"""
if not year:
year = scu.AnneeScolaire()
# est-on dans la même année universitaire ?
if sem["mois_debut_ord"] > 7: # XXX
if sem["annee_debut"] != str(year):
return False
# calcule l'année universitaire et la periode
sem_annee, sem_periode = get_session(
sem["date_debut"],
jour_pivot_annee,
mois_pivot_annee,
jour_pivot_periode,
mois_pivot_periode,
)
if periode is None:
return sem_annee == year
else:
if sem["annee_debut"] != str(year + 1):
return False
# raffinement éventuel sur le semestre
# saison is None => pas de rafinement => True
if saison == 0:
return True
elif saison == 1: # calcul en fonction de la saison
return sem["mois_debut_ord"] > 7 and sem["mois_debut_ord"] < 12
else: # saison == 0
return sem["mois_debut_ord"] <= 7 or sem["mois_debut_ord"] == 12
return sem_annee == year and sem_periode == periode
def sem_in_annee_scolaire(sem, year=False):

View File

@ -0,0 +1,61 @@
# -*- coding: utf-8 -*-
"""Test Logos
Utiliser comme:
pytest tests/unit/test_periode.py
"""
import datetime
from app.scodoc.sco_formsemestre import get_session
""" Calcule la session associée à un formsemestre sous la forme (année, période)
année: première année de l'année scolaire
période = 1 (première période de l'année scolaire) ou 2 (deuxième période de l'année scolaire)
les quatre derniers paramètres forment les dates pivots pour l'année (1er août par défaut)
et pour la période (1er décembre par défaut).
Tous les calculs se font à partir de la date de début du formsemestre.
Exemples:
Début FormSemestre pivot_année pivot_periode Résultat
01/01/2022 ( 1, 8) ( 1,12) (2021,2) # A: printemps nord
01/09/2022 ( 1, 8) ( 1,12) (2022,1) # B: automne nord
15/12/2022 ( 1, 8) ( 1,12) (2022,2)
30/07/2023 ( 1, 8) ( 1,12) (2022,2)
01/01/2022 ( 1, 1) ( 1, 8) (2022,1) # antipodes
30/07/2022 ( 1, 1) ( 1, 8) (2022,1) # antipodes
02/08/2022 ( 1, 1) ( 1, 8) (2022,2) # antipodes
30/12/2022 ( 1, 1) ( 1, 8) (2022,2) # antipodes
01/01/2022 ( 3, 1) ( 1, 8) (2021,2) # antipodes l'année scolaire démarre le 3 janvier
10/01/2024 ( 1, 8) ( 1, 2) (2023,2) # pivot période < pivot année
01/06/2024 ( 1, 8) ( 1, 2) (2023,2) # pivot période < pivot année
20/09/2024 ( 1, 8) ( 1, 2) (2024,1) # pivot période < pivot année
"""
def test_general():
# A with default
assert (2021, 0) == get_session(datetime.datetime(2022, 1, 1))
# A
assert (2021, 0) == get_session(datetime.datetime(2022, 1, 1), 1, 8, 1, 12)
# automne nord
assert (2022, 1) == get_session(datetime.datetime(2022, 9, 1))
# noel nord
assert (2022, 0) == get_session(datetime.datetime(2022, 12, 15))
# été nord
assert (2021, 0) == get_session(datetime.datetime(2022, 7, 30))
# printemps sud
assert (2022, 1) == get_session(datetime.datetime(2022, 1, 1), 1, 1, 1, 8)
# automne sud
assert (2022, 0) == get_session(datetime.datetime(2022, 8, 2), 1, 1, 1, 8)
# noel sud
assert (2022, 0) == get_session(datetime.datetime(2022, 12, 30), 1, 1, 1, 8)
# été sud
assert (2022, 1) == get_session(datetime.datetime(2022, 7, 30), 1, 1, 1, 8)
# nouvel an sud
assert (2021, 0) == get_session(datetime.datetime(2022, 1, 1), 3, 1, 1, 8)
# nouvel an pp < pa
assert (2023, 1) == get_session(datetime.datetime(2024, 1, 10), 1, 8, 1, 2)
# été pivot pp<pa
assert (2023, 0) == get_session(datetime.datetime(2024, 6, 1), 1, 8, 1, 2)
# automne pp<pa
assert (2024, 1) == get_session(datetime.datetime(2024, 9, 20), 1, 8, 1, 2)