Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
3 changed files with 57 additions and 51 deletions
Showing only changes of commit a04e53d6e6 - Show all commits

View File

@ -301,7 +301,6 @@ class EtapeBilan:
:return: None :return: None
""" """
self.semestres[sem["formsemestre_id"]] = sem self.semestres[sem["formsemestre_id"]] = sem
# if anneeapogee == None: # année d'inscription par défaut
annee_apogee = str( annee_apogee = str(
annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]) annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"])
) )
@ -313,7 +312,7 @@ class EtapeBilan:
""" """
Prise en compte d'une étape apogée Prise en compte d'une étape apogée
:param etape_str: La clé de l'étape à prendre en compte :param etape_str: La clé de l'étape à prendre en compte
:param anneeapogee: l'année de l'étape à prendre en compte :param annee_apogee: l'année de l'étape à prendre en compte
:return: None :return: None
""" """
if etape_str != "": if etape_str != "":
@ -405,9 +404,9 @@ class EtapeBilan:
self.etu_semestre[formsemestre_id].add(key_etu) self.etu_semestre[formsemestre_id].add(key_etu)
for key_etape in self.etapes: for key_etape in self.etapes:
anneeapogee, etapestr = key_to_values(key_etape) annee_apogee, etapestr = key_to_values(key_etape)
self.etu_etapes[key_etape] = set() self.etu_etapes[key_etape] = set()
for etud in get_inscrits_etape(etapestr, anneeapogee): for etud in get_inscrits_etape(etapestr, annee_apogee):
key_etu = self.register_etud_apogee(etud, key_etape) key_etu = self.register_etud_apogee(etud, key_etape)
self.etu_etapes[key_etape].add(key_etu) self.etu_etapes[key_etape].add(key_etu)
@ -771,8 +770,8 @@ class EtapeBilan:
return "\n".join(H) return "\n".join(H)
def etape_to_key(anneeapogee, etapestr): def etape_to_key(annee_apogee, etape_str):
return anneeapogee, etapestr return annee_apogee, etape_str
def key_to_values(key_etape): def key_to_values(key_etape):

View File

@ -147,17 +147,17 @@ get_maquette_url = _PI.get_maquette_url
get_portal_api_version = _PI.get_portal_api_version get_portal_api_version = _PI.get_portal_api_version
def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True): def get_inscrits_etape(code_etape, annee_apogee=None, ntrials=4, use_cache=True):
"""Liste des inscrits à une étape Apogée """Liste des inscrits à une étape Apogée
Result = list of dicts Result = list of dicts
ntrials: try several time the same request, useful for some bad web services ntrials: try several time the same request, useful for some bad web services
use_cache: use (redis) cache use_cache: use (redis) cache
""" """
log(f"get_inscrits_etape: code={code_etape} anneeapogee={anneeapogee}") log(f"get_inscrits_etape: code={code_etape} annee_apogee={annee_apogee}")
if anneeapogee is None: if annee_apogee is None:
anneeapogee = str(time.localtime()[0]) annee_apogee = str(time.localtime()[0])
if use_cache: if use_cache:
obj = ApoInscritsEtapeCache.get((code_etape, anneeapogee)) obj = ApoInscritsEtapeCache.get((code_etape, annee_apogee))
if obj: if obj:
log("get_inscrits_etape: using cached data") log("get_inscrits_etape: using cached data")
return obj return obj
@ -171,7 +171,7 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True):
req = ( req = (
etud_url etud_url
+ "?" + "?"
+ urllib.parse.urlencode((("etape", code_etape), ("annee", anneeapogee))) + urllib.parse.urlencode((("etape", code_etape), ("annee", annee_apogee)))
) )
else: else:
req = etud_url + "?" + urllib.parse.urlencode((("etape", code_etape),)) req = etud_url + "?" + urllib.parse.urlencode((("etape", code_etape),))
@ -191,7 +191,7 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True):
# Filtre sur annee inscription Apogee: # Filtre sur annee inscription Apogee:
def check_inscription(e): def check_inscription(e):
if "inscription" in e: if "inscription" in e:
if e["inscription"] == anneeapogee: if e["inscription"] == annee_apogee:
return True return True
else: else:
return False return False
@ -204,7 +204,7 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True):
etuds = [e for e in etuds if check_inscription(e)] etuds = [e for e in etuds if check_inscription(e)]
if use_cache and etuds: if use_cache and etuds:
ApoInscritsEtapeCache.set((code_etape, anneeapogee), etuds) ApoInscritsEtapeCache.set((code_etape, annee_apogee), etuds)
return etuds return etuds

View File

@ -59,15 +59,20 @@ EKEY_NAME = "code NIP"
# view: # view:
def formsemestre_synchro_etuds( def formsemestre_synchro_etuds(
formsemestre_id, formsemestre_id,
etuds=[], # liste des codes NIP des etudiants a inscrire (ou deja inscrits) etuds: list = None,
inscrits_without_key=[], # codes etudid des etudiants sans code NIP a laisser inscrits inscrits_without_key: list = None,
anneeapogee=None, annee_apogee=None,
submitted=False, submitted=False,
dialog_confirmed=False, dialog_confirmed=False,
export_cat_xls=None, export_cat_xls=None,
read_only=False, # Affiche sans permettre modifications read_only=False,
): ):
"""Synchronise les étudiants de ce semestre avec ceux d'Apogée. """Synchronise les étudiants de ce semestre avec ceux d'Apogée.
etuds : liste des codes NIP des etudiants a inscrire (ou deja inscrits)
inscrits_without_key : etudids des etudiants sans code NIP a laisser inscrits
read_only : Affiche sans permettre modifications
On a plusieurs cas de figure: L'étudiant peut être On a plusieurs cas de figure: L'étudiant peut être
1- présent dans Apogée et inscrit dans le semestre ScoDoc (etuds_ok) 1- présent dans Apogée et inscrit dans le semestre ScoDoc (etuds_ok)
2- dans Apogée, dans ScoDoc, mais pas inscrit dans le semestre (etuds_noninscrits) 2- dans Apogée, dans ScoDoc, mais pas inscrit dans le semestre (etuds_noninscrits)
@ -88,6 +93,8 @@ def formsemestre_synchro_etuds(
etuds: apres sélection par l'utilisateur, la liste des étudiants selectionnés etuds: apres sélection par l'utilisateur, la liste des étudiants selectionnés
que l'on va importer/inscrire que l'on va importer/inscrire
""" """
etuds = etuds or []
inscrits_without_key = inscrits_without_key or []
log(f"formsemestre_synchro_etuds: formsemestre_id={formsemestre_id}") log(f"formsemestre_synchro_etuds: formsemestre_id={formsemestre_id}")
sem = sco_formsemestre.get_formsemestre(formsemestre_id) sem = sco_formsemestre.get_formsemestre(formsemestre_id)
sem["etape_apo_str"] = sco_formsemestre.formsemestre_etape_apo_str(sem) sem["etape_apo_str"] = sco_formsemestre.formsemestre_etape_apo_str(sem)
@ -113,14 +120,14 @@ def formsemestre_synchro_etuds(
"notes.formsemestre_synchro_etuds", "notes.formsemestre_synchro_etuds",
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id, formsemestre_id=formsemestre_id,
anneeapogee=anneeapogee or None, # si None, le param n'est pas dans l'URL annee_apogee=annee_apogee or None, # si None, le param n'est pas dans l'URL
) )
if anneeapogee is None: # année d'inscription par défaut if annee_apogee is None: # année d'inscription par défaut
anneeapogee = scu.annee_scolaire_debut( annee_apogee = scu.annee_scolaire_debut(
sem["annee_debut"], sem["mois_debut_ord"] sem["annee_debut"], sem["mois_debut_ord"]
) )
anneeapogee = str(anneeapogee) annee_apogee = str(annee_apogee)
if isinstance(etuds, str): if isinstance(etuds, str):
etuds = etuds.split(",") # vient du form de confirmation etuds = etuds.split(",") # vient du form de confirmation
@ -140,13 +147,13 @@ def formsemestre_synchro_etuds(
inscrits_set, inscrits_set,
inscrits_without_key_all, inscrits_without_key_all,
etudsapo_ident, etudsapo_ident,
) = list_synch(sem, anneeapogee=anneeapogee) ) = list_synch(sem, annee_apogee=annee_apogee)
if export_cat_xls: if export_cat_xls:
filename = export_cat_xls filename = export_cat_xls
xls = build_page( xls = build_page(
sem, sem,
etuds_by_cat, etuds_by_cat,
anneeapogee, annee_apogee,
export_cat_xls=export_cat_xls, export_cat_xls=export_cat_xls,
base_url=base_url, base_url=base_url,
read_only=read_only, read_only=read_only,
@ -163,7 +170,7 @@ def formsemestre_synchro_etuds(
H += build_page( H += build_page(
sem, sem,
etuds_by_cat, etuds_by_cat,
anneeapogee, annee_apogee,
base_url=base_url, base_url=base_url,
read_only=read_only, read_only=read_only,
) )
@ -237,7 +244,7 @@ def formsemestre_synchro_etuds(
[str(x) for x in inscrits_without_key] [str(x) for x in inscrits_without_key]
), ),
"submitted": 1, "submitted": 1,
"anneeapogee": anneeapogee, "annee_apogee": annee_apogee,
}, },
) )
) )
@ -284,7 +291,7 @@ def formsemestre_synchro_etuds(
def build_page( def build_page(
sem, sem,
etuds_by_cat, etuds_by_cat,
anneeapogee, annee_apogee,
export_cat_xls=None, export_cat_xls=None,
base_url="", base_url="",
read_only=False, read_only=False,
@ -294,21 +301,23 @@ def build_page(
etuds_by_cat, export_cat_xls=export_cat_xls, base_url=base_url etuds_by_cat, export_cat_xls=export_cat_xls, base_url=base_url
) )
year = time.localtime()[0] year = time.localtime()[0]
if anneeapogee and abs(year - int(anneeapogee)) < 50: if annee_apogee and abs(year - int(annee_apogee)) < 50:
years = list( years = list(
range(min(year - 1, int(anneeapogee) - 1), max(year, int(anneeapogee)) + 1) range(
min(year - 1, int(annee_apogee) - 1), max(year, int(annee_apogee)) + 1
)
) )
else: else:
years = list(range(year - 1, year + 1)) years = list(range(year - 1, year + 1))
anneeapogee = "" annee_apogee = ""
options = [] options = []
for y in years: for y in years:
if str(y) == anneeapogee: if str(y) == annee_apogee:
sel = "selected" sel = "selected"
else: else:
sel = "" sel = ""
options.append('<option value="%s" %s>%s</option>' % (str(y), sel, str(y))) options.append('<option value="%s" %s>%s</option>' % (str(y), sel, str(y)))
if anneeapogee: if annee_apogee:
sel = "" sel = ""
else: else:
sel = "selected" sel = "selected"
@ -328,8 +337,8 @@ def build_page(
""" """
% sem, % sem,
""" """
Année Apogée: <select id="anneeapogee" name="anneeapogee" Année Apogée: <select id="anne_eapogee" name="annee_apogee"
onchange="document.location='formsemestre_synchro_etuds?formsemestre_id=%s&anneeapogee='+document.getElementById('anneeapogee').value">""" onchange="document.location='formsemestre_synchro_etuds?formsemestre_id=%s&annee_apogee='+document.getElementById('annee_apogee').value">"""
% (sem["formsemestre_id"]), % (sem["formsemestre_id"]),
"\n".join(options), "\n".join(options),
""" """
@ -359,7 +368,7 @@ def build_page(
return H return H
def list_synch(sem, anneeapogee=None): def list_synch(sem, annee_apogee=None):
"""""" """"""
inscrits = sco_inscr_passage.list_inscrits(sem["formsemestre_id"], with_dems=True) inscrits = sco_inscr_passage.list_inscrits(sem["formsemestre_id"], with_dems=True)
# Tous les ensembles d'etudiants sont ici des ensembles de codes NIP (voir EKEY_SCO) # Tous les ensembles d'etudiants sont ici des ensembles de codes NIP (voir EKEY_SCO)
@ -372,39 +381,35 @@ def list_synch(sem, anneeapogee=None):
e["inscrit"] = True # checkbox state e["inscrit"] = True # checkbox state
else: else:
inscrits_set.add(e[EKEY_SCO]) inscrits_set.add(e[EKEY_SCO])
# allinscrits_set = set() # tous les inscrits scodoc avec code_nip, y compris les demissionnaires
# for e in inscrits.values():
# if e[EKEY_SCO]:
# allinscrits_set.add(e[EKEY_SCO])
datefinalisationinscription_by_NIP = {} # nip : datefinalisationinscription_str date_finalisation_inscr_by_nip = {} # nip : datefinalisationinscription_str
etapes = sem["etapes"] etapes = sem["etapes"]
etudsapo_set = set() etudsapo_set = set()
etudsapo_ident = {} etudsapo_ident = {}
etuds_payes = set() # étudiants ayant payé (avec balise <paiementinscription> true)
for etape in etapes: for etape in etapes:
if etape: if etape:
etudsapo = sco_portal_apogee.get_inscrits_etape( etudsapo = sco_portal_apogee.get_inscrits_etape(
etape, anneeapogee=anneeapogee etape, annee_apogee=annee_apogee
) )
etudsapo_set = etudsapo_set.union(set([x[EKEY_APO] for x in etudsapo])) etudsapo_set |= {x[EKEY_APO] for x in etudsapo}
for e in etudsapo: for e in etudsapo:
if e[EKEY_APO] not in etudsapo_ident: if e[EKEY_APO] not in etudsapo_ident:
etudsapo_ident[e[EKEY_APO]] = e etudsapo_ident[e[EKEY_APO]] = e
datefinalisationinscription_by_NIP[e[EKEY_APO]] = e[ date_finalisation_inscr_by_nip[e[EKEY_APO]] = e[
"datefinalisationinscription" "datefinalisationinscription"
] ]
# note: si le portail ne renseigne pas cette balise, suppose que paiement ok
etuds_payes |= {
x[EKEY_APO] for x in etudsapo if x.get("paiementinscription", True)
}
# categories: # categories:
etuds_ok = etudsapo_set.intersection(inscrits_set) etuds_ok = etudsapo_set.intersection(inscrits_set)
etuds_aposco, a_importer, key2etudid = list_all(etudsapo_set) etuds_aposco, a_importer, key2etudid = list_all(etudsapo_set)
etuds_noninscrits = etuds_aposco - inscrits_set etuds_noninscrits = etuds_aposco - inscrits_set
etuds_nonapogee = inscrits_set - etudsapo_set etuds_nonapogee = inscrits_set - etudsapo_set
# Etudiants ayant payé (avec balise <paiementinscription> true)
# note: si le portail ne renseigne pas cette balise, suppose que paiement ok
etuds_payes = set(
[x[EKEY_APO] for x in etudsapo if x.get("paiementinscription", True)]
)
# #
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
@ -420,7 +425,7 @@ def list_synch(sem, anneeapogee=None):
etud["inscrit"] = is_inscrit # checkbox state etud["inscrit"] = is_inscrit # checkbox state
etud[ etud[
"datefinalisationinscription" "datefinalisationinscription"
] = datefinalisationinscription_by_NIP.get(key, None) ] = date_finalisation_inscr_by_nip.get(key, None)
if key in etudsapo_ident: if key in etudsapo_ident:
etud["etape"] = etudsapo_ident[key].get("etape", "") etud["etape"] = etudsapo_ident[key].get("etape", "")
else: else:
@ -827,12 +832,14 @@ def formsemestre_import_etud_admission(
# Essaie de recuperer les etudiants des étapes, car # Essaie de recuperer les etudiants des étapes, car
# la requete get_inscrits_etape est en général beaucoup plus # la requete get_inscrits_etape est en général beaucoup plus
# rapide que les requetes individuelles get_etud_apogee # rapide que les requetes individuelles get_etud_apogee
anneeapogee = str( annee_apogee = str(
scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]) scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"])
) )
apo_etuds = {} # nip : etud apo apo_etuds = {} # nip : etud apo
for etape in sem["etapes"]: for etape in sem["etapes"]:
etudsapo = sco_portal_apogee.get_inscrits_etape(etape, anneeapogee=anneeapogee) etudsapo = sco_portal_apogee.get_inscrits_etape(
etape, annee_apogee=annee_apogee
)
apo_etuds.update({e["nip"]: e for e in etudsapo}) apo_etuds.update({e["nip"]: e for e in etudsapo})
for i in ins: for i in ins: