From 0546f6ea0b67ed76489f21275090fd5f601f9735 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 18 Oct 2023 14:28:43 +0200 Subject: [PATCH] =?UTF-8?q?Stocke=20nom=5Fusuel=20en=20majuscules.=20Compl?= =?UTF-8?q?=C3=A8te=20tests=20unitaires=20=C3=A9tudiant.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/etudiants.py | 12 +- app/scodoc/sco_etud.py | 7 +- tests/ressources/misc/ImportEtudiants.xlsx | Bin 9870 -> 10458 bytes tests/unit/__init__.py | 5 + tests/unit/test_etudiants.py | 219 +++++++++++++++++++-- 5 files changed, 219 insertions(+), 24 deletions(-) diff --git a/app/models/etudiants.py b/app/models/etudiants.py index 95f30d184..17cd213d0 100644 --- a/app/models/etudiants.py +++ b/app/models/etudiants.py @@ -192,11 +192,10 @@ class Identite(db.Model, models.ScoDocModel): @classmethod def create_etud(cls, **args) -> "Identite": - "Crée un étudiant, avec admission et adresse vides." - etud: Identite = cls(**args) - etud.adresses.append(Adresse(typeadresse="domicile")) - etud.admission = Admission() - return etud + """Crée un étudiant, avec admission et adresse vides. + (added to session but not flushed nor commited) + """ + return cls.create_from_dict(args) @classmethod def create_from_dict(cls, data) -> "Identite": @@ -324,7 +323,8 @@ class Identite(db.Model, models.ScoDocModel): args: dict with args in application. returns: dict to store in model's db. """ - fs_uppercase = {"nom", "prenom", "prenom_etat_civil"} + # Les champs qui sont toujours stockés en majuscules: + fs_uppercase = {"nom", "nom_usuel", "prenom", "prenom_etat_civil"} fs_empty_stored_as_nulls = { "nom", "prenom", diff --git a/app/scodoc/sco_etud.py b/app/scodoc/sco_etud.py index a90b54d3b..21b585992 100644 --- a/app/scodoc/sco_etud.py +++ b/app/scodoc/sco_etud.py @@ -244,6 +244,7 @@ _identiteEditor = ndb.EditableTable( sortkey="nom", input_formators={ "nom": force_uppercase, + "nom_usuel": force_uppercase, "prenom": force_uppercase, "prenom_etat_civil": force_uppercase, "civilite": input_civilite, @@ -616,7 +617,7 @@ def log_unknown_etud(): def get_etud_info(etudid=False, code_nip=False, filled=False) -> list[dict]: - """infos sur un etudiant (API). If not found, returns empty list. + """infos sur un etudiant. If not found, returns empty list. On peut spécifier etudid ou code_nip ou bien cherche dans les arguments de la requête courante: etudid, code_nip, code_ine (dans cet ordre). @@ -850,7 +851,9 @@ def fill_etuds_info(etuds: list[dict], add_admission=True): # Admission if add_admission and "nomlycee" not in etud: admission = ( - Admission.query.filter_by(etudid=etudid).first().to_dict(no_nulls=True) + Admission.query.filter_by(id=etud["admission_id"]) + .first() + .to_dict(no_nulls=True) ) del admission["id"] # pour garder id == etudid dans etud etud.update(admission) diff --git a/tests/ressources/misc/ImportEtudiants.xlsx b/tests/ressources/misc/ImportEtudiants.xlsx index 4aed711631b82736545e294e253f87c8f2d48f6d..142cab00bed28c40b4972317eae64aed0e4e7800 100644 GIT binary patch delta 4365 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 KIOhIm_kRE+1}tI# delta 3756 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 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py index dc5a532f1..e8363bc10 100644 --- a/tests/unit/__init__.py +++ b/tests/unit/__init__.py @@ -15,3 +15,8 @@ def call_view(view_function, *args, **kwargs): ) assert func return func(*args, **kwargs) + + +def dict_include(d: dict, ref: dict) -> bool: + """Checks that all keys in ref are in d, and with the same value.""" + return all((k in d) and (d[k] == ref[k]) for k in ref) diff --git a/tests/unit/test_etudiants.py b/tests/unit/test_etudiants.py index ce96c6024..15739a187 100644 --- a/tests/unit/test_etudiants.py +++ b/tests/unit/test_etudiants.py @@ -12,12 +12,14 @@ from pathlib import Path from flask import current_app +import app from app import db from app.models import Admission, Adresse, Departement, FormSemestre, Identite from app.scodoc import sco_etud from app.scodoc import sco_import_etuds +from config import TestConfig -from tests.unit import setup +from tests.unit import setup, dict_include def test_identite(test_client): @@ -39,6 +41,13 @@ def test_identite(test_client): e = Identite.create_etud(**args) db.session.add(e) db.session.flush() + # + assert e.nom == "NOM" + assert e.nom_usuel == "NOM_USUEL" + assert e.prenom == "PRENOM" + assert e.prenom_etat_civil == "PRENOM_ETAT_CIVIL" + assert e.dept_naissance == "dept_naissance" + # admission_id = e.admission_id admission = db.session.get(Admission, admission_id) assert admission is not None @@ -140,21 +149,22 @@ def test_import_etuds_xlsx(test_client): ) formsemestre = db.session.get(FormSemestre, formsemestre_id) # Vérifie tous les champs du premier étudiant - etud = formsemestre.etuds.first() - assert etud.code_nip == "nip1" - assert etud.code_ine == "ine1" - assert etud.nom == "NOM1" - assert etud.nom_usuel == "nom_usuel1" - assert etud.prenom == "PRÉNOM1" - assert etud.civilite == "M" - assert etud.prenom_etat_civil == "PRÉNOM_CIVIL1" - assert etud.civilite_etat_civil == "M" - assert etud.date_naissance == datetime.date(2001, 5, 1) - assert etud.lieu_naissance == "Paris" - assert etud.nationalite == "Belge" - assert etud.boursier is True + e1 = formsemestre.etuds.filter_by(code_ine="ine1").first() + assert e1 + assert e1.code_nip == "nip1" + assert e1.code_ine == "ine1" + assert e1.nom == "NOM1" + assert e1.nom_usuel == "NOM_USUEL1" + assert e1.prenom == "PRÉNOM1" + assert e1.civilite == "M" + assert e1.prenom_etat_civil == "PRÉNOM_CIVIL1" + assert e1.civilite_etat_civil == "M" + assert e1.date_naissance == datetime.date(2001, 5, 1) + assert e1.lieu_naissance == "Paris" + assert e1.nationalite == "Belge" + assert e1.boursier is True # Admission - adm = etud.admission + adm = e1.admission assert adm.bac == "C" assert adm.specialite == "SPÉ" assert adm.annee_bac == 2023 @@ -170,7 +180,7 @@ def test_import_etuds_xlsx(test_client): assert adm.nomlycee == "nomlycée" assert adm.codepostallycee == "75005" # Adresse - adresse: Adresse = etud.adresses.first() + adresse: Adresse = e1.adresses.first() assert adresse.email == "etud1@etud.no" assert adresse.emailperso == "etud1@perso.no" assert adresse.domicile == "1 rue A" @@ -180,3 +190,180 @@ def test_import_etuds_xlsx(test_client): assert adresse.telephone == "102030405" assert adresse.telephonemobile == "605040302" # + # + e2 = formsemestre.etuds.filter_by(code_ine="ine2").first() + assert e2 + assert e2.civilite == "M" + assert e2.civilite_etat_civil is None + assert e2.civilite_str == "M." + assert e2.civilite_etat_civil_str == "M." + assert e2.nomprenom == "M. Prénom2 NOM2" + # + e3 = formsemestre.etuds.filter_by(code_ine="ine3").first() + assert e3 + assert e3.civilite == "F" + assert e3.civilite_etat_civil is None + assert e3.civilite_str == "Mme" + assert e3.civilite_etat_civil_str == "Mme" + assert e3.nomprenom == "Mme Prénom3 NOM3" + # + e4 = formsemestre.etuds.filter_by(code_ine="ine4").first() + assert e4 + assert e4.civilite == "X" + assert e4.civilite_etat_civil is None + assert e4.civilite_str == "" + assert e4.civilite_etat_civil_str == "" + assert e4.nomprenom == "Prénom4 NOM4" + # + e5 = formsemestre.etuds.filter_by(code_ine="ine5").first() + assert e5 + assert e5.civilite == "M" + assert e5.civilite_etat_civil == "F" + assert e5.civilite_str == "M." + assert e5.civilite_etat_civil_str == "Mme" + assert e5.nomprenom == "M. Prénom5 NOM5" + # + e6 = formsemestre.etuds.filter_by(code_ine="ine6").first() + assert e6 + assert e6.civilite == "F" + assert e6.civilite_etat_civil == "F" + assert e6.civilite_str == "Mme" + assert e6.civilite_etat_civil_str == "Mme" + assert e6.nomprenom == "Mme Prénom6 NOM6" + # + e7 = formsemestre.etuds.filter_by(code_ine="ine7").first() + assert e7 + assert e7.civilite == "X" + assert e7.civilite_etat_civil == "F" + assert e7.civilite_str == "" + assert e7.civilite_etat_civil_str == "Mme" + assert e7.nomprenom == "Prénom7 NOM7" + # + e8 = formsemestre.etuds.filter_by(code_ine="ine8").first() + assert e8 + assert e8.civilite == "X" + assert e8.civilite_etat_civil == "F" + assert e8.prenom_etat_civil == "PRÉNOM_CIVIL8" + assert e8.nomprenom == "Prénom8 NOM8" + # e9 + e9 = formsemestre.etuds.filter_by(code_ine="ine9").first() + assert e9 + assert e9.civilite == "X" + assert e9.civilite_etat_civil is None + assert e9.prenom == "PRÉNOM9" + assert e9.prenom_etat_civil == "PRÉNOM_CIVIL9" + assert e9.nomprenom == "Prénom9 NOM9" + # + e10 = formsemestre.etuds.filter_by(code_ine="ine10").first() + assert e10 + assert e10.nom_usuel == "NOM_USUEL10" + assert e10.nomprenom == "Prénom10 NOM_USUEL10" + # Vérification conversion dict + e10_dict = e10.to_dict_bul() + assert dict_include( + e10_dict, + { + "boursier": "", + "civilite_etat_civil": "F", + "civilite": "X", + "code_ine": "ine10", + "code_nip": "nip10", + "date_naissance": "", + "dept_acronym": "TEST_", + "dept_naissance": "", + "email": "", + "emailperso": "", + "etat_civil": "Mme PRÉNOM_CIVIL10 NOM10", + "etudid": 10, + "lieu_naissance": "", + "nationalite": "", + "nom": "NOM_USUEL10 (NOM10)", + "nomprenom": "Prénom10 NOM_USUEL10", + "prenom_etat_civil": "PRÉNOM_CIVIL10", + "prenom": "PRÉNOM10", + "domicile": "", + "villedomicile": "", + "telephone": "", + "fax": "", + "codepostaldomicile": "", + "paysdomicile": "", + "telephonemobile": "", + "typeadresse": "domicile", + }, + ) + # Test fonction sco_etud ScoDoc7 legacy + app.set_sco_dept(TestConfig.DEPT_TEST) + e10_dict["admission_id"] = e10.admission_id + sco_etud.fill_etuds_info([e10_dict]) + assert dict_include( + e10_dict, + { + "boursier": "", + "civilite_etat_civil": "F", + "civilite": "X", + "code_ine": "ine10", + "code_nip": "nip10", + "date_naissance": "", + "dept_acronym": "TEST_", + "dept_naissance": "", + "email": "", + "emailperso": "", + "etat_civil": "Mme Prénom_civil10 NOM_USUEL10 (NOM10)", + "lieu_naissance": "", + "nationalite": "", + "nom": "NOM_USUEL10 (NOM10)", + "nomprenom": "Prénom10 NOM_USUEL10 (NOM10)", + "prenom_etat_civil": "Prénom_civil10", + "prenom": "Prénom10", + "domicile": "", + "villedomicile": "", + "telephone": "", + "fax": "", + "description": "(infos admission)", + "id": 10, + "codepostaldomicile": "", + "paysdomicile": "", + "telephonemobile": "", + "typeadresse": "domicile", + "admission_id": 10, + "dept": "TEST_", + "bac": "", + "rang": 0, + "codepostallycee": "", + "qualite": None, + "codelycee": "", + "rapporteur": "", + "type_admission": "", + "annee_bac": 0, + "decision": "", + "boursier_prec": False, + "math": "", + "score": None, + "classement": 0, + "physique": "", + "commentaire": "", + "apb_groupe": "", + "anglais": "", + "nomlycee": "", + "apb_classement_gr": 0, + "villelycee": "", + "annee": 2023, + "specialite": "", + "francais": "", + "nom_usuel": "", + "civilite_str": "", + "civilite_etat_civil_str": "Mme", + "nom_disp": "NOM_USUEL10 (NOM10)", + "ne": "(e)", + "email_default": "", + "inscription": "ancien", + "situation": "ancien élève", + "inscriptionstr": "ancien", + "inscription_formsemestre_id": None, + "etatincursem": "?", + "ilycee": "", + "rap": "", + "telephonestr": "", + "telephonemobilestr": "", + }, + )