forked from ScoDoc/ScoDoc
refactor sem_in_annee_scolaire_WIP
This commit is contained in:
parent
ce541d1870
commit
d3e0ff019c
@ -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):
|
||||
|
61
tests/unit/test_periode.py
Normal file
61
tests/unit/test_periode.py
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user