This commit is contained in:
Jean-Marie Place 2022-11-10 16:09:24 +01:00
parent d3e0ff019c
commit 21933000ce
4 changed files with 53 additions and 60 deletions

View File

@ -586,7 +586,16 @@ class ApoEtud(dict):
(sem["semestre_id"] == apo_data.cur_semestre_id)
and (apo_data.etape in sem["etapes"])
and (
sco_formsemestre.sem_in_annee_scolaire(sem, apo_data.annee_scolaire)
# sco_formsemestre.sem_in_annee_scolaire(sem, apo_data.annee_scolaire) # TODO à remplacer par ?
sco_formsemestre.sem_in_semestre_scolaire(
sem,
apo_data.annee_scolaire,
0,
# jour_pivot_annee,
# mois_pivot_annee,
# jour_pivot_periode,
# mois_pivot_periode
)
)
)
]

View File

@ -422,7 +422,7 @@ def sem_set_responsable_name(sem):
)
def get_session(
def get_periode(
debut: datetime,
jour_pivot_annee=1,
mois_pivot_annee=8,
@ -432,7 +432,7 @@ def 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 anciennement automne)
ou 0 (deuxième période de l'année scolaire - anciennement printemps)
ou 2 (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.
@ -442,9 +442,9 @@ def get_session(
Cas à considérer pour le calcul de la période
pa < pp -----------------|-------------------|---------------->
(A-1, P:0) pa (A, P:1) pp (A, P:0)
(A-1, P:2) pa (A, P:1) pp (A, P:2)
pp < pa -----------------|-------------------|---------------->
(A-1, P:1) pp (A-1, P:0) pa (A, P:1)
(A-1, P:1) pp (A-1, P:2) pa (A, P:1)
"""
pa = 100 * mois_pivot_annee + jour_pivot_annee
pp = 100 * mois_pivot_periode + jour_pivot_periode
@ -455,33 +455,17 @@ def get_session(
annee = debut.year
if pa < pp:
if ps < pa or ps > pp:
periode = 0
periode = 2
else:
periode = 1
else:
if ps < pp or ps > pa:
periode = 1
else:
periode = 0
periode = 2
return annee, periode
def debut_in_semestre_scolaire(
date_debut: datetime.date, year: int = False, saison: int = 0
) -> bool:
"""Vrai si date_debut est dans l'année scolaire ou le semestre
indiquée par year et periode
(par défaut, l'année scolaire en cours).
periode:
1 = sept,
0 = janvier
None = année complète
"""
if not year:
year = scu.AnneeScolaire()
# XXX WIP à voir selon ce que fait réellement sem_in_semestre_scolaire
def sem_in_semestre_scolaire(
sem,
year=False,
@ -493,43 +477,42 @@ def sem_in_semestre_scolaire(
):
"""n'utilise que la date de debut,
si annee non specifiée, année scolaire courante
Patch Jmp: ajout du parametre optionnel saison (1 ou 0)
si saison non spécifiée: année complète
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.
la période garde les même convention que semset["sem_id"];
* 1 : premère période
* 2 : deuxième période
* 0 ou periode non précisée: annualisé (donc inclut toutes les périodes)
)
"""
if not year:
year = scu.AnneeScolaire()
# calcule l'année universitaire et la periode
sem_annee, sem_periode = get_session(
sem["date_debut"],
sem_annee, sem_periode = get_periode(
datetime.datetime.fromisoformat(sem["date_debut_iso"]),
jour_pivot_annee,
mois_pivot_annee,
jour_pivot_periode,
mois_pivot_periode,
)
if periode is None:
if periode == 0 or None:
return sem_annee == year
else:
return sem_annee == year and sem_periode == periode
def sem_in_annee_scolaire(sem, year=False):
"""Test si sem appartient à l'année scolaire year (int).
N'utilise que la date de début, pivot au 1er août.
Si année non specifiée, année scolaire courante
"""
if not year:
year = scu.AnneeScolaire()
return (
(sem["annee_debut"] == str(year))
and (sem["mois_debut_ord"] > scu.MONTH_FIN_ANNEE_SCOLAIRE)
) or (
(sem["annee_debut"] == str(year + 1))
and (sem["mois_debut_ord"] <= scu.MONTH_FIN_ANNEE_SCOLAIRE)
)
# def sem_in_annee_scolaire(sem, year=False):
# """Test si sem appartient à l'année scolaire year (int).
# N'utilise que la date de début, pivot au 1er août.
# Si année non specifiée, année scolaire courante
# """
# if not year:
# year = scu.AnneeScolaire()
# return (
# (sem["annee_debut"] == str(year))
# and (sem["mois_debut_ord"] > scu.MONTH_FIN_ANNEE_SCOLAIRE)
# ) or (
# (sem["annee_debut"] == str(year + 1))
# and (sem["mois_debut_ord"] <= scu.MONTH_FIN_ANNEE_SCOLAIRE)
# )
def sem_est_courant(sem): # -> FormSemestre.est_courant

View File

@ -233,7 +233,8 @@ class SemSet(dict):
if sco_formsemestre.sem_in_semestre_scolaire(
sem,
year=self["annee_scolaire"],
saison=self["sem_id"],
# Indiquer ici les valeur des dates pivots année et période
periode=self["sem_id"],
)
]
return sems

View File

@ -7,7 +7,7 @@ Utiliser comme:
"""
import datetime
from app.scodoc.sco_formsemestre import get_session
from app.scodoc.sco_formsemestre import get_periode
""" 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
@ -34,28 +34,28 @@ Début FormSemestre pivot_année pivot_periode Résultat
def test_general():
# A with default
assert (2021, 0) == get_session(datetime.datetime(2022, 1, 1))
assert (2021, 2) == get_periode(datetime.datetime(2022, 1, 1))
# A
assert (2021, 0) == get_session(datetime.datetime(2022, 1, 1), 1, 8, 1, 12)
assert (2021, 2) == get_periode(datetime.datetime(2022, 1, 1), 1, 8, 1, 12)
# automne nord
assert (2022, 1) == get_session(datetime.datetime(2022, 9, 1))
assert (2022, 1) == get_periode(datetime.datetime(2022, 9, 1))
# noel nord
assert (2022, 0) == get_session(datetime.datetime(2022, 12, 15))
assert (2022, 2) == get_periode(datetime.datetime(2022, 12, 15))
# été nord
assert (2021, 0) == get_session(datetime.datetime(2022, 7, 30))
assert (2021, 2) == get_periode(datetime.datetime(2022, 7, 30))
# printemps sud
assert (2022, 1) == get_session(datetime.datetime(2022, 1, 1), 1, 1, 1, 8)
assert (2022, 1) == get_periode(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)
assert (2022, 2) == get_periode(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)
assert (2022, 2) == get_periode(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)
assert (2022, 1) == get_periode(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)
assert (2021, 2) == get_periode(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)
assert (2023, 1) == get_periode(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)
assert (2023, 2) == get_periode(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)
assert (2024, 1) == get_periode(datetime.datetime(2024, 9, 20), 1, 8, 1, 2)