Import synchro Apo: fix #116

This commit is contained in:
Emmanuel Viennet 2022-08-26 08:22:07 +02:00
parent 7bc5a5ffd1
commit 5d527edb71
5 changed files with 43 additions and 24 deletions

View File

@ -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 ntrials: try several time the same request, useful for some bad web services
use_cache: use (redis) cache 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: if anneeapogee is None:
anneeapogee = str(time.localtime()[0]) anneeapogee = str(time.localtime()[0])
if use_cache: if use_cache:

View File

@ -87,7 +87,7 @@ 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
""" """
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 = 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)
# Write access ? # Write access ?
@ -182,35 +182,35 @@ def formsemestre_synchro_etuds(
if not dialog_confirmed: if not dialog_confirmed:
# Confirmation # Confirmation
if a_importer: if a_importer:
H.append("<h3>Etudiants à importer et inscrire :</h3><ol>") H.append("<h3>Étudiants à importer et inscrire :</h3><ol>")
for key in a_importer: for key in a_importer:
H.append("<li>%(fullname)s</li>" % etudsapo_ident[key]) nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}"""
H.append(f"<li>{nom}</li>")
H.append("</ol>") H.append("</ol>")
if a_inscrire: if a_inscrire:
H.append("<h3>Etudiants à inscrire :</h3><ol>") H.append("<h3>Étudiants à inscrire :</h3><ol>")
for key in a_inscrire: for key in a_inscrire:
H.append("<li>%(fullname)s</li>" % etudsapo_ident[key]) nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}"""
H.append(f"<li>{nom}</li>")
H.append("</ol>") H.append("</ol>")
a_inscrire_en_double = inscrits_ailleurs.intersection(a_inscrire) a_inscrire_en_double = inscrits_ailleurs.intersection(a_inscrire)
if a_inscrire_en_double: if a_inscrire_en_double:
H.append("<h3>dont étudiants déjà inscrits:</h3><ol>") H.append("<h3>dont étudiants déjà inscrits:</h3><ol>")
for key in a_inscrire_en_double: for key in a_inscrire_en_double:
H.append( nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}"""
'<li class="inscrailleurs">%(fullname)s</li>' H.append(f'<li class="inscrailleurs">{nom}</li>')
% etudsapo_ident[key]
)
H.append("</ol>") H.append("</ol>")
if a_desinscrire: if a_desinscrire:
H.append("<h3>Etudiants à désinscrire :</h3><ol>") H.append("<h3>Étudiants à désinscrire :</h3><ol>")
for key in a_desinscrire: for key in a_desinscrire:
etud = sco_etud.get_etud_info(filled=True, code_nip=key)[0] etud = sco_etud.get_etud_info(filled=True, code_nip=key)[0]
H.append('<li class="desinscription">%(nomprenom)s</li>' % etud) H.append('<li class="desinscription">%(nomprenom)s</li>' % etud)
H.append("</ol>") H.append("</ol>")
if a_desinscrire_without_key: if a_desinscrire_without_key:
H.append("<h3>Etudiants à désinscrire (sans code):</h3><ol>") H.append("<h3>Étudiants à désinscrire (sans code):</h3><ol>")
for etudid in a_desinscrire_without_key: for etudid in a_desinscrire_without_key:
etud = inscrits_without_key_all[etudid] etud = inscrits_without_key_all[etudid]
sco_etud.format_etud_ident(etud) 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 # here we try to remove all created students
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
for etudid in created_etudids: 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( cursor.execute(
"delete from notes_moduleimpl_inscription where etudid=%(etudid)s", "delete from notes_moduleimpl_inscription where etudid=%(etudid)s",
{"etudid": etudid}, {"etudid": etudid},
@ -702,7 +702,7 @@ def do_import_etuds_from_portal(sem, a_importer, etudsapo_ident):
ScolarNews.add( ScolarNews.add(
typ=ScolarNews.NEWS_INSCR, 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"], obj=sem["formsemestre_id"],
max_frequency=10 * 60, # 10' max_frequency=10 * 60, # 10'
) )
@ -716,6 +716,7 @@ def do_import_etud_admission(
""" """
annee_courante = time.localtime()[0] annee_courante = time.localtime()[0]
serie_bac, spe_bac = get_bac(etud) serie_bac, spe_bac = get_bac(etud)
# Les champs n'ont pas les mêmes noms dans Apogee et dans ScoDoc:
args = { args = {
"etudid": etudid, "etudid": etudid,
"annee": get_opt_str(etud, "inscription") or annee_courante, "annee": get_opt_str(etud, "inscription") or annee_courante,
@ -723,23 +724,26 @@ def do_import_etud_admission(
"specialite": spe_bac, "specialite": spe_bac,
"annee_bac": get_opt_str(etud, "anneebac"), "annee_bac": get_opt_str(etud, "anneebac"),
"codelycee": get_opt_str(etud, "lycee"), "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"), "boursier": get_opt_str(etud, "bourse"),
} }
# log("do_import_etud_admission: etud=%s" % pprint.pformat(etud)) # log("do_import_etud_admission: etud=%s" % pprint.pformat(etud))
al = sco_etud.admission_list(cnx, args={"etudid": etudid}) adm_list = sco_etud.admission_list(cnx, args={"etudid": etudid})
if not al: if not adm_list:
sco_etud.admission_create(cnx, args) # -> adm_id sco_etud.admission_create(cnx, args) # -> adm_id
else: else:
# existing data: merge # existing data: merge
e = al[0] adm_info = adm_list[0]
if get_opt_str(etud, "inscription"): if get_opt_str(etud, "inscription"):
e["annee"] = args["annee"] adm_info["annee"] = args["annee"]
keys = list(args.keys()) keys = list(args.keys())
for k in keys: for k in keys:
if not args[k]: if not args[k]:
del args[k] del args[k]
e.update(args) adm_info.update(args)
sco_etud.admission_edit(cnx, e) sco_etud.admission_edit(cnx, adm_info)
# Traite cas particulier de la date de naissance pour anciens # Traite cas particulier de la date de naissance pour anciens
# etudiants IUTV # etudiants IUTV
if import_naissance and "naissance" in etud: if import_naissance and "naissance" in etud:

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.3.27" SCOVERSION = "9.3.28"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"

View File

@ -18,6 +18,9 @@
<bac>S Scientifique</bac> <bac>S Scientifique</bac>
<anneebac>2019</anneebac> <anneebac>2019</anneebac>
<lycee>07981234T</lycee> <lycee>07981234T</lycee>
<nom_lycee>nom du lycée</nom_lycee>
<ville_lycee>ville lycée</ville_lycee>
<codepostal_lycee>code postal lycée</codepostal_lycee>
<mention>AB</mention> <mention>AB</mention>
<bourse>N</bourse> <bourse>N</bourse>
<paiementinscription>true</paiementinscription> <paiementinscription>true</paiementinscription>
@ -34,5 +37,4 @@
<cod_dip>{diplome}</cod_dip> <cod_dip>{diplome}</cod_dip>
<cod_etp>{etape}</cod_etp> <cod_etp>{etape}</cod_etp>
<tem_rgl_sit_mil>O</tem_rgl_sit_mil> <tem_rgl_sit_mil>O</tem_rgl_sit_mil>
<fullname>{prenom} {nom}</fullname>
</etudiant> </etudiant>

View File

@ -2,6 +2,14 @@
"""Simple fake HTTP serveur """Simple fake HTTP serveur
emulating "Apogee" Web service 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 pathlib import Path
from urllib.parse import parse_qs from urllib.parse import parse_qs
@ -32,6 +40,8 @@ ETUD_HEAD = """<?xml version="1.0" encoding="UTF-8"?>
ETUD_TAIL = """</etudiants> ETUD_TAIL = """</etudiants>
""" """
CODES_ETAPES = ("V1RT", "V2RT", "V2RT2", "")
def make_random_etud(nip, etape=None, annee=None, template=ETUD_TEMPLATE_FULL): def make_random_etud(nip, etape=None, annee=None, template=ETUD_TEMPLATE_FULL):
"""return XML for a student""" """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")) gender = random.choice(("M", "F"))
nom, prenom = nomprenom(gender) nom, prenom = nomprenom(gender)
if not etape: if not etape:
etape = random.choice(("V1RT", "V2RT", "V2RT2", "")) etape = random.choice(CODES_ETAPES)
if not annee: if not annee:
annee = time.strftime("%Y") # current year annee = time.strftime("%Y") # current year
diplome = "VDRT" 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", "")), ville_naissance=random.choice(("Paris", "Berlin", "Londres", "")),
code_dep_naissance=random.choice(("75", "99", "89")), code_dep_naissance=random.choice(("75", "99", "89")),
libelle_dep_naissance="nom département", libelle_dep_naissance="nom département",
# nomlycee=
) )
return data return data
@ -155,6 +164,10 @@ def signal_handler(sig, frame):
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
if __name__ == "__main__": 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 # Start the server
print(f"Server listening on port {PORT}...") print(f"Server listening on port {PORT}...")
my_server = socketserver.TCPServer(("", PORT), MyHttpRequestHandler) my_server = socketserver.TCPServer(("", PORT), MyHttpRequestHandler)