From a04e53d6e6761d71893a932ccf26aa1432ae113f Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 6 Oct 2023 15:33:33 +0200 Subject: [PATCH] =?UTF-8?q?Synchro=20Apog=C3=A9e:=20information=20paiement?= =?UTF-8?q?.=20A=20tester=20avant=20de=20fermer=20#781.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/scodoc/sco_etape_bilan.py | 11 ++--- app/scodoc/sco_portal_apogee.py | 16 +++---- app/scodoc/sco_synchro_etuds.py | 81 ++++++++++++++++++--------------- 3 files changed, 57 insertions(+), 51 deletions(-) diff --git a/app/scodoc/sco_etape_bilan.py b/app/scodoc/sco_etape_bilan.py index 07c57b05..f3b0b954 100644 --- a/app/scodoc/sco_etape_bilan.py +++ b/app/scodoc/sco_etape_bilan.py @@ -301,7 +301,6 @@ class EtapeBilan: :return: None """ self.semestres[sem["formsemestre_id"]] = sem - # if anneeapogee == None: # année d'inscription par défaut annee_apogee = str( annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]) ) @@ -313,7 +312,7 @@ class EtapeBilan: """ Prise en compte d'une étape apogée :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 """ if etape_str != "": @@ -405,9 +404,9 @@ class EtapeBilan: self.etu_semestre[formsemestre_id].add(key_etu) 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() - 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) self.etu_etapes[key_etape].add(key_etu) @@ -771,8 +770,8 @@ class EtapeBilan: return "\n".join(H) -def etape_to_key(anneeapogee, etapestr): - return anneeapogee, etapestr +def etape_to_key(annee_apogee, etape_str): + return annee_apogee, etape_str def key_to_values(key_etape): diff --git a/app/scodoc/sco_portal_apogee.py b/app/scodoc/sco_portal_apogee.py index 1ec3386e..8b0205dd 100644 --- a/app/scodoc/sco_portal_apogee.py +++ b/app/scodoc/sco_portal_apogee.py @@ -147,17 +147,17 @@ get_maquette_url = _PI.get_maquette_url 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 Result = list of dicts ntrials: try several time the same request, useful for some bad web services use_cache: use (redis) cache """ - log(f"get_inscrits_etape: code={code_etape} anneeapogee={anneeapogee}") - if anneeapogee is None: - anneeapogee = str(time.localtime()[0]) + log(f"get_inscrits_etape: code={code_etape} annee_apogee={annee_apogee}") + if annee_apogee is None: + annee_apogee = str(time.localtime()[0]) if use_cache: - obj = ApoInscritsEtapeCache.get((code_etape, anneeapogee)) + obj = ApoInscritsEtapeCache.get((code_etape, annee_apogee)) if obj: log("get_inscrits_etape: using cached data") return obj @@ -171,7 +171,7 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True): req = ( etud_url + "?" - + urllib.parse.urlencode((("etape", code_etape), ("annee", anneeapogee))) + + urllib.parse.urlencode((("etape", code_etape), ("annee", annee_apogee))) ) else: 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: def check_inscription(e): if "inscription" in e: - if e["inscription"] == anneeapogee: + if e["inscription"] == annee_apogee: return True else: 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)] if use_cache and etuds: - ApoInscritsEtapeCache.set((code_etape, anneeapogee), etuds) + ApoInscritsEtapeCache.set((code_etape, annee_apogee), etuds) return etuds diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py index 16d1620d..02af0f71 100644 --- a/app/scodoc/sco_synchro_etuds.py +++ b/app/scodoc/sco_synchro_etuds.py @@ -59,15 +59,20 @@ EKEY_NAME = "code NIP" # view: def formsemestre_synchro_etuds( formsemestre_id, - etuds=[], # liste des codes NIP des etudiants a inscrire (ou deja inscrits) - inscrits_without_key=[], # codes etudid des etudiants sans code NIP a laisser inscrits - anneeapogee=None, + etuds: list = None, + inscrits_without_key: list = None, + annee_apogee=None, submitted=False, dialog_confirmed=False, 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. + + 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 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) @@ -88,6 +93,8 @@ def formsemestre_synchro_etuds( etuds: apres sélection par l'utilisateur, la liste des étudiants selectionnés 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}") sem = sco_formsemestre.get_formsemestre(formsemestre_id) sem["etape_apo_str"] = sco_formsemestre.formsemestre_etape_apo_str(sem) @@ -113,14 +120,14 @@ def formsemestre_synchro_etuds( "notes.formsemestre_synchro_etuds", scodoc_dept=g.scodoc_dept, 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 - anneeapogee = scu.annee_scolaire_debut( + if annee_apogee is None: # année d'inscription par défaut + annee_apogee = scu.annee_scolaire_debut( sem["annee_debut"], sem["mois_debut_ord"] ) - anneeapogee = str(anneeapogee) + annee_apogee = str(annee_apogee) if isinstance(etuds, str): etuds = etuds.split(",") # vient du form de confirmation @@ -140,13 +147,13 @@ def formsemestre_synchro_etuds( inscrits_set, inscrits_without_key_all, etudsapo_ident, - ) = list_synch(sem, anneeapogee=anneeapogee) + ) = list_synch(sem, annee_apogee=annee_apogee) if export_cat_xls: filename = export_cat_xls xls = build_page( sem, etuds_by_cat, - anneeapogee, + annee_apogee, export_cat_xls=export_cat_xls, base_url=base_url, read_only=read_only, @@ -163,7 +170,7 @@ def formsemestre_synchro_etuds( H += build_page( sem, etuds_by_cat, - anneeapogee, + annee_apogee, base_url=base_url, read_only=read_only, ) @@ -237,7 +244,7 @@ def formsemestre_synchro_etuds( [str(x) for x in inscrits_without_key] ), "submitted": 1, - "anneeapogee": anneeapogee, + "annee_apogee": annee_apogee, }, ) ) @@ -284,7 +291,7 @@ def formsemestre_synchro_etuds( def build_page( sem, etuds_by_cat, - anneeapogee, + annee_apogee, export_cat_xls=None, base_url="", read_only=False, @@ -294,21 +301,23 @@ def build_page( etuds_by_cat, export_cat_xls=export_cat_xls, base_url=base_url ) year = time.localtime()[0] - if anneeapogee and abs(year - int(anneeapogee)) < 50: + if annee_apogee and abs(year - int(annee_apogee)) < 50: 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: years = list(range(year - 1, year + 1)) - anneeapogee = "" + annee_apogee = "" options = [] for y in years: - if str(y) == anneeapogee: + if str(y) == annee_apogee: sel = "selected" else: sel = "" options.append('' % (str(y), sel, str(y))) - if anneeapogee: + if annee_apogee: sel = "" else: sel = "selected" @@ -328,8 +337,8 @@ def build_page( """ % sem, """ - Année Apogée: """ % (sem["formsemestre_id"]), "\n".join(options), """ @@ -359,7 +368,7 @@ def build_page( 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) # 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 else: 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"] etudsapo_set = set() etudsapo_ident = {} + etuds_payes = set() # étudiants ayant payé (avec balise true) for etape in etapes: if 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: if e[EKEY_APO] not in etudsapo_ident: etudsapo_ident[e[EKEY_APO]] = e - datefinalisationinscription_by_NIP[e[EKEY_APO]] = e[ + date_finalisation_inscr_by_nip[e[EKEY_APO]] = e[ "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: etuds_ok = etudsapo_set.intersection(inscrits_set) etuds_aposco, a_importer, key2etudid = list_all(etudsapo_set) etuds_noninscrits = etuds_aposco - inscrits_set etuds_nonapogee = inscrits_set - etudsapo_set - # Etudiants ayant payé (avec balise 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() @@ -420,7 +425,7 @@ def list_synch(sem, anneeapogee=None): etud["inscrit"] = is_inscrit # checkbox state etud[ "datefinalisationinscription" - ] = datefinalisationinscription_by_NIP.get(key, None) + ] = date_finalisation_inscr_by_nip.get(key, None) if key in etudsapo_ident: etud["etape"] = etudsapo_ident[key].get("etape", "") else: @@ -827,12 +832,14 @@ def formsemestre_import_etud_admission( # Essaie de recuperer les etudiants des étapes, car # la requete get_inscrits_etape est en général beaucoup plus # rapide que les requetes individuelles get_etud_apogee - anneeapogee = str( + annee_apogee = str( scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"]) ) apo_etuds = {} # nip : etud apo 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}) for i in ins: