doc et tests unitaires des absences

This commit is contained in:
Emmanuel Viennet 2021-08-01 00:05:53 +03:00
parent 6a42846d2e
commit 37e7667eeb
8 changed files with 547 additions and 248 deletions

View File

@ -306,11 +306,14 @@ def list_abs_in_range(etudid, debut, fin, matin=None, moduleimpl_id=None, cursor
"""Liste des absences entre deux dates. """Liste des absences entre deux dates.
Args: Args:
etudid etudid:
debut string iso date ("2020-03-12") debut: string iso date ("2020-03-12")
end string iso date ("2020-03-12") end: string iso date ("2020-03-12")
matin None, True, False matin: None, True, False
moduleimpl_id moduleimpl_id: restreint le comptage aux absences dans ce module
Returns:
List of absences
""" """
if matin != None: if matin != None:
matin = _toboolean(matin) matin = _toboolean(matin)
@ -347,9 +350,15 @@ WHERE A.ETUDID = %(etudid)s
return res return res
def count_abs(etudid, debut, fin, matin=None, moduleimpl_id=None): def count_abs(etudid, debut, fin, matin=None, moduleimpl_id=None) -> int:
"""CountAbs """compte le nombre d'absences
matin= 1 ou 0.
Args:
etudid: l'étudiant considéré
debut: date, chaîne iso, eg "2021-06-15"
fin: date de fin, incluse
matin: True (compte les matinées), False (les après-midi), None (les deux)
moduleimpl_id: restreint le comptage aux absences dans ce module.
Returns: Returns:
An integer. An integer.
@ -359,8 +368,19 @@ def count_abs(etudid, debut, fin, matin=None, moduleimpl_id=None):
) )
def count_abs_just(etudid, debut, fin, matin=None, moduleimpl_id=None): def count_abs_just(etudid, debut, fin, matin=None, moduleimpl_id=None) -> int:
"Count just. abs" """compte le nombre d'absences justifiées
Args:
etudid: l'étudiant considéré
debut: date, chaîne iso, eg "2021-06-15"
fin: date de fin, incluse
matin: True (compte les matinées), False (les après-midi), None (les deux)
moduleimpl_id: restreint le comptage aux absences dans ce module.
Returns:
An integer.
"""
if matin != None: if matin != None:
matin = _toboolean(matin) matin = _toboolean(matin)
ismatin = " AND A.MATIN = %(matin)s " ismatin = " AND A.MATIN = %(matin)s "
@ -569,9 +589,20 @@ ORDER BY A.JOUR
def list_abs_justifs(etudid, datedebut, datefin=None, only_no_abs=False): def list_abs_justifs(etudid, datedebut, datefin=None, only_no_abs=False):
"""Liste des justificatifs (sans absence relevée) à partir d'une date, """Liste des justificatifs (avec ou sans absence relevée) à partir d'une date,
ou, si datefin spécifié, entre deux dates. ou, si datefin spécifié, entre deux dates.
Si only_no_abs: seulement les justificatifs correspondant aux jours sans absences relevées.
Args:
etudid:
datedebut: date de début, iso, eg "2002-03-15"
datefin: date de fin, incluse, eg "2002-03-15"
only_no_abs: si vrai, seulement les justificatifs correspondant
aux jours sans absences relevées.
Returns:
Liste de dict absences
{'etudid': 'EID214', 'jour': datetime.date(2021, 1, 15),
'matin': True, 'description': ''
}
""" """
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
@ -664,9 +695,16 @@ def _add_abslist(context, abslist, REQUEST, moduleimpl_id=None):
add_absence(context, etudid, jour, matin, 0, REQUEST, "", moduleimpl_id) add_absence(context, etudid, jour, matin, 0, REQUEST, "", moduleimpl_id)
def annule_absence(context, etudid, jour, matin, moduleimpl_id=None, REQUEST=None): def annule_absence(context, etudid, jour, matin, moduleimpl_id=None):
"""Annule une absence ds base """Annule une absence dans la base. N'efface pas l'éventuel justificatif.
Si moduleimpl_id, n'annule que pour ce module Args:
etudid:
jour: date, chaîne iso, eg "1999-12-31"
matin:
moduleimpl_id: si spécifié, n'annule que pour ce module.
Returns:
None
""" """
# unpublished # unpublished
matin = _toboolean(matin) matin = _toboolean(matin)

View File

@ -433,11 +433,11 @@ def doAnnuleAbsence(
demijournee = int(demijournee) demijournee = int(demijournee)
for jour in dates: for jour in dates:
if demijournee == 2: if demijournee == 2:
sco_abs.annule_absence(context, etudid, jour, False, REQUEST=REQUEST) sco_abs.annule_absence(context, etudid, jour, False)
sco_abs.annule_absence(context, etudid, jour, True, REQUEST=REQUEST) sco_abs.annule_absence(context, etudid, jour, True)
nbadded += 2 nbadded += 2
else: else:
sco_abs.annule_absence(context, etudid, jour, demijournee, REQUEST=REQUEST) sco_abs.annule_absence(context, etudid, jour, demijournee)
nbadded += 1 nbadded += 1
# #
H = [ H = [
@ -608,9 +608,16 @@ autre absence pour <b>%(nomprenom)s</b></a></li>
return "\n".join(H) return "\n".join(H)
def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None, REQUEST=None): def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None):
"""Supprime les absences aux dates indiquées """Supprime les absences non justifiées aux dates indiquées
mais ne supprime pas les justificatifs. Ne supprime pas les justificatifs éventuels.
Args:
etudid: l'étudiant
dates: liste de dates iso, eg [ "2000-01-15", "2000-01-16" ]
moduleimpl_id: si spécifié, n'affecte que les absences de ce module
Returns:
None
""" """
# log('AnnuleAbsencesDatesNoJust: moduleimpl_id=%s' % moduleimpl_id) # log('AnnuleAbsencesDatesNoJust: moduleimpl_id=%s' % moduleimpl_id)
if not dates: if not dates:
@ -626,7 +633,7 @@ def AnnuleAbsencesDatesNoJust(context, etudid, dates, moduleimpl_id=None, REQUES
matin = 0 matin = 0
else: else:
raise ValueError("invalid ampm !") raise ValueError("invalid ampm !")
sco_abs.annule_absence(context, etudid, jour, matin, moduleimpl_id, REQUEST) sco_abs.annule_absence(context, etudid, jour, matin, moduleimpl_id)
return return
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)

View File

@ -295,7 +295,7 @@ def doSignaleAbsenceGrSemestre(
if dates: if dates:
for etudid in etudids: for etudid in etudids:
sco_abs_views.AnnuleAbsencesDatesNoJust( sco_abs_views.AnnuleAbsencesDatesNoJust(
context, etudid, dates, moduleimpl_id, REQUEST context, etudid, dates, moduleimpl_id
) )
return "Absences effacées" return "Absences effacées"

View File

@ -45,13 +45,20 @@ mi = G.create_moduleimpl(
# --- Création d'un étudiant # --- Création d'un étudiant
etud = G.create_etud(code_nip=None) etud = G.create_etud(code_nip=None)
G.inscrit_etudiant(sem, etud) G.inscrit_etudiant(sem, etud)
etudid=etud["etudid"] etudid = etud["etudid"]
# --- Création d'une absence # --- Création d'une absence
sco_abs_views.doSignaleAbsence(context.Absences, datedebut="22/01/2021", datefin="22/01/2021", demijournee=2, etudid=etudid, REQUEST=REQUEST) sco_abs_views.doSignaleAbsence(
context.Absences,
datedebut="22/01/2021",
datefin="22/01/2021",
demijournee=2,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Annulation d'absence # --- Annulation d'absence
context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021", REQUEST=REQUEST) context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021")
""" Erreur : File "/opt/scodoc/Products/ScoDoc/ZAbsences.py", line 323, in AnnuleAbsencesDatesNoJust """ Erreur : File "/opt/scodoc/Products/ScoDoc/ZAbsences.py", line 323, in AnnuleAbsencesDatesNoJust
vars(), vars(),

View File

@ -236,7 +236,7 @@ assert len(li_range) == 5
# --- Annulation d'absence # --- Annulation d'absence
# context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021", REQUEST=REQUEST) # context.Absences.AnnuleAbsencesDatesNoJust(etudid, dates="22/01/2021")
# --- Fonction renvoyant du code HTML # --- Fonction renvoyant du code HTML

View File

@ -1,126 +1,130 @@
import random # -*- mode: python -*-
# -*- coding: utf-8 -*-
# La variable context est définie par le script de lancement
# l'affecte ainsi pour évietr les warnins pylint:
context = context # pylint: disable=undefined-variable
REQUEST = REQUEST # pylint: disable=undefined-variable
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
import sco_abs
import sco_abs_views
import sco_abs_notification
import ZAbsences
G = sco_fake_gen.ScoFake(context.Notes)
G.verbose = False
# --- Création d'étudiants
etud = G.create_etud(code_nip=None)
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences
etudid = etud["etudid"]
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
("22/01/2021", "22/01/2021", 1),
]:
sco_abs_views.doSignaleAbsence(
context.Absences,
datedebut=debut,
datefin=fin,
demijournee=demijournee,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Justification de certaines absences
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
]:
sco_abs_views.doJustifAbsence(
context.Absences,
datedebut=debut,
datefin=fin,
demijournee=demijournee,
etudid=etudid,
REQUEST=REQUEST,
)
# --- Utilisation de get_abs_count() de sco_abs
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
# --- Utilisation de CountAbs() de ZAbsences
nb_abs2 = context.Absences.CountAbs(etudid=etudid, debut="01/01/2021", fin="06/30/2021")
nb_absj2 = context.Absences.CountAbsJust(
etudid=etudid, debut="01/01/2021", fin="06/30/2021"
)
assert nbabs == nb_abs2 == 5
assert nbabsjust == nb_absj2 == 4
# --- Suppression d'absence
_ = sco_abs_views.doAnnuleAbsence(
context.Absences, "19/01/2021", "19/01/2021", 2, etudid=etudid, REQUEST=REQUEST
)
# --- Vérification
new_nbabs, _ = sco_abs.get_abs_count(etudid, sem)
new_nbabs2 = context.Absences.CountAbs(
etudid=etudid, debut="01/01/2021", fin="06/30/2021"
)
print(new_nbabs)
print(new_nbabs2)
assert new_nbabs == new_nbabs2
""" """
Commentaire : Comptage des absences
CountAbs de ZAbsence ----> OK
CountAbs de sco_abs_view ----> bug
Peut être du au fait que la fonction getAbsSemEtud ne se met pas à jour par rapport aux absences supprimés.
""" """
# test écrit par Fares Amer, mai 2021 et porté sur ScoDoc 8 en juillet 2021
import json
from tests.unit import sco_fake_gen
from app.scodoc import sco_abs
from app.scodoc import sco_abs_views
from app.scodoc import sco_groups
from app.views import absences
context = None # #context
def test_abs_counts(test_client):
"""Comptage des absences"""
G = sco_fake_gen.ScoFake(verbose=False)
# --- Création d'étudiants
etud = G.create_etud(code_nip=None)
# --- Création d'une formation
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences
etudid = etud["etudid"]
for debut, fin, demijournee in [
("01/01/2020", "31/01/2020", 2), # hors semestre
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
("22/01/2021", "22/01/2021", 1),
("30/06/2021", "30/06/2021", 2), # dernier jour
]:
sco_abs_views.doSignaleAbsence(
context,
datedebut=debut,
datefin=fin,
demijournee=demijournee,
etudid=etudid,
)
# --- Justification de certaines absences
for debut, fin, demijournee in [
("15/01/2021", "15/01/2021", 1),
("18/01/2021", "18/01/2021", 0),
("19/01/2021", "19/01/2021", 2),
]:
sco_abs_views.doJustifAbsence(
context,
datedebut=debut,
datefin=fin,
demijournee=demijournee,
etudid=etudid,
)
# --- Utilisation de get_abs_count() de sco_abs
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
# --- Utilisation de sco_abs.count_abs()
nb_abs2 = sco_abs.count_abs(etudid=etudid, debut="2021-01-01", fin="2021-06-30")
nb_absj2 = sco_abs.count_abs_just(
etudid=etudid, debut="2021-01-01", fin="2021-06-30"
)
assert nbabs == nb_abs2 == 7
assert nbabsjust == nb_absj2 == 4
# --- Nombre de justificatifs:
justifs = sco_abs.list_abs_justifs(etudid, "2021-01-01", datefin="2021-06-30")
assert len(justifs) == 4
# --- Suppression d'absence
_ = sco_abs_views.doAnnuleAbsence(
context, "19/01/2021", "19/01/2021", 2, etudid=etudid
)
# --- Vérification
justifs_2 = sco_abs.list_abs_justifs(etudid, "2021-01-01", datefin="2021-06-30")
assert len(justifs_2) == len(justifs)
new_nbabs, _ = sco_abs.get_abs_count(etudid, sem) # version cachée
new_nbabs2 = sco_abs.count_abs(etudid=etudid, debut="2021-01-01", fin="2021-06-30")
assert new_nbabs == new_nbabs2
assert new_nbabs == (nbabs - 2) # on a supprimé deux absences
# --- annulation absence sans supprimer le justificatif
sco_abs_views.AnnuleAbsencesDatesNoJust(context, etudid, ["2021-01-15"])
nbabs_3, nbjust_3 = sco_abs.get_abs_count(etudid, sem)
assert nbabs_3 == new_nbabs
justifs_3 = sco_abs.list_abs_justifs(etudid, "2021-01-01", datefin="2021-06-30")
assert len(justifs_3) == len(justifs_2)
# XXX à continuer

View File

@ -1,119 +1,360 @@
""" Parametre demijournee ne fonctionne pas lorsque demijournee = 2 # -*- mode: python -*-
# -*- coding: utf-8 -*-
"""
Créer et justifier des absences en utilisant le parametre demijournee Créer et justifier des absences en utilisant le parametre demijournee
""" """
import random # test écrit par Fares Amer, mai 2021 et porté sur ScoDoc 8 en juillet 2021
# La variable context est définie par le script de lancement import json
# l'affecte ainsi pour évietr les warnins pylint:
context = context # pylint: disable=undefined-variable
REQUEST = REQUEST # pylint: disable=undefined-variable
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
import sco_abs
import sco_abs_views
import sco_abs_notification
G = sco_fake_gen.ScoFake(context.Notes) from tests.unit import sco_fake_gen
G.verbose = False
# --- Création d'étudiants from app.scodoc import sco_abs
etud = G.create_etud(code_nip=None) from app.scodoc import sco_abs_views
from app.scodoc import sco_groups
from app.views import absences
# --- Création d'une formation context = None # #context
f = G.create_formation(acronyme="")
ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences def test_abs_demijournee(test_client):
etudid = etud["etudid"] """Opération élémentaires sur les absences, tests demi-journées
Travaille dans base TEST00 (defaut)
"""
G = sco_fake_gen.ScoFake(verbose=False)
_ = sco_abs_views.doSignaleAbsence( # --- Création d'étudiants
context.Absences, etud = G.create_etud(code_nip=None)
"15/01/2021",
"15/01/2021", # --- Création d'une formation
demijournee=2, f = G.create_formation(acronyme="")
etudid=etudid, ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
REQUEST=REQUEST, mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
) mod = G.create_module(
matiere_id=mat["matiere_id"],
code="TSM1",
coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
# --- Mise place d'un semestre
sem = G.create_formsemestre(
formation_id=f["formation_id"],
semestre_id=1,
date_debut="01/01/2021",
date_fin="30/06/2021",
)
mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Inscription des étudiants
G.inscrit_etudiant(sem, etud)
# --- Saisie absences
etudid = etud["etudid"]
_ = sco_abs_views.doSignaleAbsence(
context,
"15/01/2021",
"15/01/2021",
demijournee=2,
etudid=etudid,
)
_ = sco_abs_views.doSignaleAbsence(
context,
"18/01/2021",
"18/01/2021",
demijournee=1,
etudid=etudid,
)
_ = sco_abs_views.doSignaleAbsence(
context,
"19/01/2021",
"19/01/2021",
demijournee=0,
etudid=etudid,
)
# --- Justification de certaines absences
_ = sco_abs_views.doJustifAbsence(
context,
"18/01/2021",
"18/01/2021",
demijournee=1,
etudid=etudid,
)
_ = sco_abs_views.doJustifAbsence(
context,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
)
# NE JUSTIFIE QUE LE MATIN MALGRES LE PARAMETRE demijournee = 2
# --- Test
nbabs, nbabs_just = sco_abs.get_abs_count(etudid, sem)
assert (
nbabs == 4
) # l'étudiant a été absent le 15 journée compléte (2 abs : 1 matin, 1 apres midi) et le 18 (1 matin), et le 19 (1 apres midi).
assert nbabs_just == 2 # Justifie abs du matin + abs après midi
_ = sco_abs_views.doSignaleAbsence( def test_abs_basic(test_client):
context.Absences, """creation de 10 étudiants, formation, semestre, ue, module, absences le matin, l'apres midi, la journée compléte
"18/01/2021", et justification d'absences, supression d'absences, création d'une liste etat absences, creation d'un groupe afin
"18/01/2021", de tester la fonction EtatAbsencesGroupes
demijournee=1,
etudid=etudid,
REQUEST=REQUEST,
)
_ = sco_abs_views.doSignaleAbsence( Fonctions de l'API utilisé :
context.Absences, - doSignaleAbsence
"19/01/2021", - doAnnuleAbsence
"19/01/2021", - doJustifAbsence
demijournee=0, - get_partition_groups
etudid=etudid, - get_partitions_list
REQUEST=REQUEST, - sco_abs.get_abs_count(etudid, sem)
) - ListeAbsEtud
- partition_create
- createGroup
- set_group
- EtatAbsenceGr
- AddBilletAbsence
- listeBilletsEtud
"""
G = sco_fake_gen.ScoFake(verbose=False)
# --- Justification de certaines absences # --- Création d'étudiants
etuds = [G.create_etud(code_nip=None) for _ in range(10)]
_ = sco_abs_views.doJustifAbsence( # --- Création d'une formation
context.Absences, f = G.create_formation(acronyme="")
"18/01/2021", ue = G.create_ue(formation_id=f["formation_id"], acronyme="TST1", titre="ue test")
"18/01/2021", mat = G.create_matiere(ue_id=ue["ue_id"], titre="matière test")
demijournee=1, mod = G.create_module(
etudid=etudid, matiere_id=mat["matiere_id"],
REQUEST=REQUEST, code="TSM1",
) coefficient=1.0,
titre="module test",
ue_id=ue["ue_id"], # faiblesse de l'API
formation_id=f["formation_id"], # faiblesse de l'API
)
_ = sco_abs_views.doJustifAbsence( # --- Mise place d'un semestre
context.Absences, sem = G.create_formsemestre(
"19/01/2021", formation_id=f["formation_id"],
"19/01/2021", semestre_id=1,
demijournee=2, date_debut="01/01/2021",
etudid=etudid, date_fin="30/06/2021",
REQUEST=REQUEST, )
)
# NE JUSTIFIE QUE LE MATIN MALGRES LE PARAMETRE demijournee = 2 mi = G.create_moduleimpl(
module_id=mod["module_id"],
formsemestre_id=sem["formsemestre_id"],
responsable_id="bach",
)
# --- Test # --- Inscription des étudiants
for etud in etuds:
G.inscrit_etudiant(sem, etud)
nbabs, nbabs_just = sco_abs.get_abs_count(etudid, sem) # --- Création d'une évaluation
assert ( e = G.create_evaluation(
nbabs == 4 moduleimpl_id=mi["moduleimpl_id"],
) # l'étudiant a été absent le 15 journée compléte (2 abs : 1 matin, 1 apres midi) et le 18 (1 matin), et le 19 (1 apres midi). jour="22/01/2021",
assert nbabs_just == 2 # Justifie abs du matin + abs après midi description="evaluation test",
coefficient=1.0,
)
""" # --- Saisie absences
Commentaire : etudid = etuds[0]["etudid"]
Pb : le 2 ne peut pas être pris en tant que int car string dans la fonction _ = sco_abs_views.doSignaleAbsence(
-----> Pb reglé context,
"15/01/2021",
"15/01/2021",
demijournee=1,
etudid=etudid,
)
""" _ = sco_abs_views.doSignaleAbsence(
context,
"18/01/2021",
"18/01/2021",
demijournee=0,
etudid=etudid,
)
_ = sco_abs_views.doSignaleAbsence(
context,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
)
_ = sco_abs_views.doSignaleAbsence(
context,
"22/01/2021",
"22/01/2021",
demijournee=1,
etudid=etudid,
)
# --- Justification de certaines absences
_ = sco_abs_views.doJustifAbsence(
context,
"15/01/2021",
"15/01/2021",
demijournee=1,
etudid=etudid,
)
_ = sco_abs_views.doJustifAbsence(
context,
"18/01/2021",
"18/01/2021",
demijournee=0,
etudid=etudid,
)
_ = sco_abs_views.doJustifAbsence(
context,
"19/01/2021",
"19/01/2021",
demijournee=2,
etudid=etudid,
)
# --- Test
b = sco_abs.is_work_saturday(context)
assert b == 0 # samedi ne sont pas compris
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
assert (
nbabs == 5
) # l'étudiant a été absent le 15 (apres midi) , (16 et 17 we), 18 (matin) et 19 janvier (matin et apres midi), et 22 (matin)
assert nbabsjust == 4 # l'étudiant justifie ses abs du 15, 18 et 19
# + vérification à l'aide de ScoDoc WEB : ok!
# --- Supression d'une absence et d'une justification
_ = sco_abs_views.doAnnuleAbsence(
context, "19/01/2021", "19/01/2021", 2, etudid=etudid
)
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
print(nbabs) # lors du print cela affiche 5 or cela devrait afficher 3
# assert nbabs == 3
# + vérification à l'aide de ScoDoc WEB : il y a bien plus que 3 abs, 2 justifiés et 1 non justifié.
# --- supression d'une justification pas encore disponible à l'aide de python.
# --- Création d'une liste d'abs
liste_abs = sco_abs_views.ListeAbsEtud(
context, etudid, format="json", absjust_only=1
)
liste_abs2 = sco_abs_views.ListeAbsEtud(context, etudid, format="json")
load_liste_abs = json.loads(liste_abs)
load_liste_abs2 = json.loads(liste_abs2)
assert len(load_liste_abs2) == 1
assert len(load_liste_abs) == 2
assert load_liste_abs2[0]["ampm"] == "1"
assert load_liste_abs2[0]["datedmy"] == "22/01/2021"
assert load_liste_abs2[0]["exams"] == mod["code"]
# absjust_only -> seulement les abs justifiés
# --- Création d'un groupe
_ = sco_groups.partition_create(
context,
formsemestre_id=sem["formsemestre_id"],
partition_name="Eleve",
)
li1 = sco_groups.get_partitions_list(context, sem["formsemestre_id"])
_ = sco_groups.createGroup(context, li1[0]["partition_id"], "Groupe 1")
# --- Affectation des élèves dans des groupes
li_grp1 = sco_groups.get_partition_groups(context, li1[0])
for etud in etuds:
sco_groups.set_group(context, etud["etudid"], li_grp1[0]["group_id"])
# --- Test de EtatAbsencesGroupes
grp1_abs = absences.EtatAbsencesGr(
context,
group_ids=[li_grp1[0]["group_id"]],
debut="01/01/2021",
fin="30/06/2021",
format="json",
)
# grp1_abs est une Response car on a appelé une vue (1er appel)
load_grp1_abs = json.loads(grp1_abs.get_data().decode("utf-8"))
assert len(load_grp1_abs) == 10
tab_id = [] # tab des id present dans load_grp1_abs
for un_etud in load_grp1_abs:
tab_id.append(un_etud["etudid"])
for (
etud
) in (
etuds
): # verification si tous les etudiants sont present dans la liste du groupe d'absence
assert etud["etudid"] in tab_id
for un_etud in load_grp1_abs:
if un_etud["etudid"] == etudid:
assert un_etud["nbabs"] == "3"
assert un_etud["nbjustifs_noabs"] == "2"
assert un_etud["nbabsjust"] == "2"
assert un_etud["nbabsnonjust"] == "1"
assert un_etud["nomprenom"] == etuds[0]["nomprenom"]
# --- Création de billets
b1 = absences.AddBilletAbsence(
context,
begin="2021-01-22 00:00",
end="2021-01-22 23:59",
etudid=etudid,
description="abs du 22",
justified=False,
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
)
b2 = absences.AddBilletAbsence(
context,
begin="2021-01-15 00:00",
end="2021-01-15 23:59",
etudid=etudid,
description="abs du 15",
code_nip=etuds[0]["code_nip"],
code_ine=etuds[0]["code_ine"],
)
li_bi = absences.listeBilletsEtud(context, etudid=etudid, format="json")
assert isinstance(li_bi, str)
load_li_bi = json.loads(li_bi)
assert len(load_li_bi) == 2
assert load_li_bi[1]["description"] == "abs du 22"

View File

@ -22,7 +22,9 @@ context = None # #context
def test_notes_table(test_client): def test_notes_table(test_client):
"""Test construction et cache de NotesTable""" """Test construction et cache de NotesTable.
Attention: utilise une base (departement) existante.
"""
ndb.set_sco_dept(DEPT) ndb.set_sco_dept(DEPT)
assert g.scodoc_dept == DEPT assert g.scodoc_dept == DEPT
sems = sco_formsemestre.do_formsemestre_list(context) sems = sco_formsemestre.do_formsemestre_list(context)