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
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:

View File

@ -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("<h3>Etudiants à importer et inscrire :</h3><ol>")
H.append("<h3>Étudiants à importer et inscrire :</h3><ol>")
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>")
if a_inscrire:
H.append("<h3>Etudiants à inscrire :</h3><ol>")
H.append("<h3>Étudiants à inscrire :</h3><ol>")
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>")
a_inscrire_en_double = inscrits_ailleurs.intersection(a_inscrire)
if a_inscrire_en_double:
H.append("<h3>dont étudiants déjà inscrits:</h3><ol>")
for key in a_inscrire_en_double:
H.append(
'<li class="inscrailleurs">%(fullname)s</li>'
% etudsapo_ident[key]
)
nom = f"""{etudsapo_ident[key]['nom']} {etudsapo_ident[key].get("prenom", "")}"""
H.append(f'<li class="inscrailleurs">{nom}</li>')
H.append("</ol>")
if a_desinscrire:
H.append("<h3>Etudiants à désinscrire :</h3><ol>")
H.append("<h3>Étudiants à désinscrire :</h3><ol>")
for key in a_desinscrire:
etud = sco_etud.get_etud_info(filled=True, code_nip=key)[0]
H.append('<li class="desinscription">%(nomprenom)s</li>' % etud)
H.append("</ol>")
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:
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:

View File

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

View File

@ -18,6 +18,9 @@
<bac>S Scientifique</bac>
<anneebac>2019</anneebac>
<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>
<bourse>N</bourse>
<paiementinscription>true</paiementinscription>
@ -34,5 +37,4 @@
<cod_dip>{diplome}</cod_dip>
<cod_etp>{etape}</cod_etp>
<tem_rgl_sit_mil>O</tem_rgl_sit_mil>
<fullname>{prenom} {nom}</fullname>
</etudiant>

View File

@ -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 = """<?xml version="1.0" encoding="UTF-8"?>
ETUD_TAIL = """</etudiants>
"""
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)