From 5d527edb7176a01ec89837f7d107c75b7f69022e Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 26 Aug 2022 08:22:07 +0200 Subject: [PATCH] Import synchro Apo: fix #116 --- app/scodoc/sco_portal_apogee.py | 2 +- app/scodoc/sco_synchro_etuds.py | 42 ++++++++++++++++-------------- sco_version.py | 2 +- tools/fakeportal/etud_template.xml | 4 ++- tools/fakeportal/fakeportal.py | 17 ++++++++++-- 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/app/scodoc/sco_portal_apogee.py b/app/scodoc/sco_portal_apogee.py index 8c77b91cf..435ec4e80 100644 --- a/app/scodoc/sco_portal_apogee.py +++ b/app/scodoc/sco_portal_apogee.py @@ -153,7 +153,7 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=4, use_cache=True): ntrials: try several time the same request, useful for some bad web services use_cache: use (redis) cache """ - log("get_inscrits_etape: code=%s anneeapogee=%s" % (code_etape, anneeapogee)) + log(f"get_inscrits_etape: code={code_etape} anneeapogee={anneeapogee}") if anneeapogee is None: anneeapogee = str(time.localtime()[0]) if use_cache: diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py index 9a13a8f5c..9b71bcc59 100644 --- a/app/scodoc/sco_synchro_etuds.py +++ b/app/scodoc/sco_synchro_etuds.py @@ -87,7 +87,7 @@ def formsemestre_synchro_etuds( etuds: apres sélection par l'utilisateur, la liste des étudiants selectionnés que l'on va importer/inscrire """ - log("formsemestre_synchro_etuds: formsemestre_id=%s" % formsemestre_id) + 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) # Write access ? @@ -182,35 +182,35 @@ def formsemestre_synchro_etuds( if not dialog_confirmed: # Confirmation if a_importer: - H.append("

Etudiants à importer et inscrire :

    ") + H.append("

    Étudiants à importer et inscrire :

      ") for key in a_importer: - H.append("
    1. %(fullname)s
    2. " % etudsapo_ident[key]) + nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}""" + H.append(f"
    3. {nom}
    4. ") H.append("
    ") if a_inscrire: - H.append("

    Etudiants à inscrire :

      ") + H.append("

      Étudiants à inscrire :

        ") for key in a_inscrire: - H.append("
      1. %(fullname)s
      2. " % etudsapo_ident[key]) + nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}""" + H.append(f"
      3. {nom}
      4. ") H.append("
      ") a_inscrire_en_double = inscrits_ailleurs.intersection(a_inscrire) if a_inscrire_en_double: H.append("

      dont étudiants déjà inscrits:

        ") for key in a_inscrire_en_double: - H.append( - '
      1. %(fullname)s
      2. ' - % etudsapo_ident[key] - ) + nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}""" + H.append(f'
      3. {nom}
      4. ') H.append("
      ") if a_desinscrire: - H.append("

      Etudiants à désinscrire :

        ") + H.append("

        Étudiants à désinscrire :

          ") for key in a_desinscrire: etud = sco_etud.get_etud_info(filled=True, code_nip=key)[0] H.append('
        1. %(nomprenom)s
        2. ' % etud) H.append("
        ") if a_desinscrire_without_key: - H.append("

        Etudiants à désinscrire (sans code):

          ") + H.append("

          Étudiants à désinscrire (sans code):

            ") for etudid in a_desinscrire_without_key: etud = inscrits_without_key_all[etudid] sco_etud.format_etud_ident(etud) @@ -669,7 +669,7 @@ def do_import_etuds_from_portal(sem, a_importer, etudsapo_ident): # here we try to remove all created students cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) for etudid in created_etudids: - log("do_import_etuds_from_portal: deleting etudid=%s" % etudid) + log(f"do_import_etuds_from_portal: deleting etudid={etudid}") cursor.execute( "delete from notes_moduleimpl_inscription where etudid=%(etudid)s", {"etudid": etudid}, @@ -702,7 +702,7 @@ def do_import_etuds_from_portal(sem, a_importer, etudsapo_ident): ScolarNews.add( typ=ScolarNews.NEWS_INSCR, - text="Import Apogée de %d étudiants en " % len(created_etudids), + text=f"Import Apogée de {len(created_etudids)} étudiants en ", obj=sem["formsemestre_id"], max_frequency=10 * 60, # 10' ) @@ -716,6 +716,7 @@ def do_import_etud_admission( """ annee_courante = time.localtime()[0] serie_bac, spe_bac = get_bac(etud) + # Les champs n'ont pas les mêmes noms dans Apogee et dans ScoDoc: args = { "etudid": etudid, "annee": get_opt_str(etud, "inscription") or annee_courante, @@ -723,23 +724,26 @@ def do_import_etud_admission( "specialite": spe_bac, "annee_bac": get_opt_str(etud, "anneebac"), "codelycee": get_opt_str(etud, "lycee"), + "nomlycee": get_opt_str(etud, "nom_lycee"), + "villelycee": get_opt_str(etud, "ville_lycee"), + "codepostallycee": get_opt_str(etud, "codepostal_lycee"), "boursier": get_opt_str(etud, "bourse"), } # log("do_import_etud_admission: etud=%s" % pprint.pformat(etud)) - al = sco_etud.admission_list(cnx, args={"etudid": etudid}) - if not al: + adm_list = sco_etud.admission_list(cnx, args={"etudid": etudid}) + if not adm_list: sco_etud.admission_create(cnx, args) # -> adm_id else: # existing data: merge - e = al[0] + adm_info = adm_list[0] if get_opt_str(etud, "inscription"): - e["annee"] = args["annee"] + adm_info["annee"] = args["annee"] keys = list(args.keys()) for k in keys: if not args[k]: del args[k] - e.update(args) - sco_etud.admission_edit(cnx, e) + adm_info.update(args) + sco_etud.admission_edit(cnx, adm_info) # Traite cas particulier de la date de naissance pour anciens # etudiants IUTV if import_naissance and "naissance" in etud: diff --git a/sco_version.py b/sco_version.py index 43de22c01..fd6f02b18 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.3.27" +SCOVERSION = "9.3.28" SCONAME = "ScoDoc" diff --git a/tools/fakeportal/etud_template.xml b/tools/fakeportal/etud_template.xml index 6b2f20510..c6243be77 100644 --- a/tools/fakeportal/etud_template.xml +++ b/tools/fakeportal/etud_template.xml @@ -18,6 +18,9 @@ S Scientifique 2019 07981234T + nom du lycée + ville lycée + code postal lycée AB N true @@ -34,5 +37,4 @@ {diplome} {etape} O - {prenom} {nom} diff --git a/tools/fakeportal/fakeportal.py b/tools/fakeportal/fakeportal.py index 0f306cc86..7efff4d3d 100755 --- a/tools/fakeportal/fakeportal.py +++ b/tools/fakeportal/fakeportal.py @@ -2,6 +2,14 @@ """Simple fake HTTP serveur emulating "Apogee" Web service + +Usage: + /opt/scodoc/tools/fakeportal/fakeportal.py + +et régler "URL du portail" sur la page de *Paramétrage* du département testé, +typiquement: http://localhost:8678 +et "Version de l'API" à 2 + """ from pathlib import Path from urllib.parse import parse_qs @@ -32,6 +40,8 @@ ETUD_HEAD = """ ETUD_TAIL = """ """ +CODES_ETAPES = ("V1RT", "V2RT", "V2RT2", "") + def make_random_etud(nip, etape=None, annee=None, template=ETUD_TEMPLATE_FULL): """return XML for a student""" @@ -39,7 +49,7 @@ def make_random_etud(nip, etape=None, annee=None, template=ETUD_TEMPLATE_FULL): gender = random.choice(("M", "F")) nom, prenom = nomprenom(gender) if not etape: - etape = random.choice(("V1RT", "V2RT", "V2RT2", "")) + etape = random.choice(CODES_ETAPES) if not annee: annee = time.strftime("%Y") # current year diplome = "VDRT" @@ -54,7 +64,6 @@ def make_random_etud(nip, etape=None, annee=None, template=ETUD_TEMPLATE_FULL): ville_naissance=random.choice(("Paris", "Berlin", "Londres", "")), code_dep_naissance=random.choice(("75", "99", "89")), libelle_dep_naissance="nom département", - # nomlycee= ) return data @@ -155,6 +164,10 @@ def signal_handler(sig, frame): signal.signal(signal.SIGINT, signal_handler) if __name__ == "__main__": + # Help message + print(f"Les étapes (codes Apogée) sont: {CODES_ETAPES}") + print(f"Définir l'URL du portail comme: http://localhost:{PORT}") + print("""et "Version de l'API" à 2""") # Start the server print(f"Server listening on port {PORT}...") my_server = socketserver.TCPServer(("", PORT), MyHttpRequestHandler)