From 29b44ad5a41947c34fd2433acfd0375d9b12ef48 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 21 Aug 2021 12:23:00 +0200 Subject: [PATCH] Fix - test unitaires OK - bug saisie notes persistant --- app/auth/models.py | 7 ++++ app/scodoc/sco_saisie_notes.py | 61 +++++++++++++++++++++--------- app/views/users.py | 2 +- tests/unit/sco_fake_gen.py | 7 +--- tests/unit/test_abs_demijournee.py | 4 +- tests/unit/test_departements.py | 10 ++--- tests/unit/test_users.py | 8 ++-- 7 files changed, 64 insertions(+), 35 deletions(-) diff --git a/app/auth/models.py b/app/auth/models.py index 17cdce3d5..314b68330 100644 --- a/app/auth/models.py +++ b/app/auth/models.py @@ -26,6 +26,8 @@ from app.scodoc.sco_roles_default import SCO_ROLES_DEFAULTS import app.scodoc.sco_utils as scu from app.scodoc import sco_etud # a deplacer dans scu +VALID_LOGIN_EXP = re.compile(r"^[a-zA-Z0-9@\\\-_\\\.]+$") + class User(UserMixin, db.Model): """ScoDoc users, handled by Flask / SQLAlchemy""" @@ -55,6 +57,9 @@ class User(UserMixin, db.Model): def __init__(self, **kwargs): self.roles = [] self.user_roles = [] + # check login: + if kwargs.get("user_name") and not VALID_LOGIN_EXP.match(kwargs["user_name"]): + raise ValueError(f"invalid user_name: {kwargs['user_name']}") super(User, self).__init__(**kwargs) # Ajoute roles: if ( @@ -167,6 +172,8 @@ class User(UserMixin, db.Model): self.user_name = data["user_name"] if "password" in data: self.set_password(data["password"]) + if not VALID_LOGIN_EXP.match(self.user_name): + raise ValueError(f"invalid user_name: {self.user_name}") # Roles: roles_string is "Ens_RT, Secr_RT, ..." if "roles_string" in data: self.user_roles = [] diff --git a/app/scodoc/sco_saisie_notes.py b/app/scodoc/sco_saisie_notes.py index 9db48ea0c..7411e7c4e 100644 --- a/app/scodoc/sco_saisie_notes.py +++ b/app/scodoc/sco_saisie_notes.py @@ -35,6 +35,7 @@ import datetime import psycopg2 import flask +from flask import g, url_for from flask_login import current_user import app.scodoc.sco_utils as scu @@ -251,7 +252,11 @@ def do_evaluation_upload_xls(REQUEST): M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] - mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod + mod["url"] = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=mod["moduleimpl_id"], + ) sco_news.add( typ=sco_news.NEWS_NOTE, object=M["moduleimpl_id"], @@ -335,7 +340,11 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False): M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] mod["moduleimpl_id"] = M["moduleimpl_id"] - mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % mod + mod["url"] = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=mod["moduleimpl_id"], + ) sco_news.add( typ=sco_news.NEWS_NOTE, object=M["moduleimpl_id"], @@ -344,15 +353,23 @@ def do_evaluation_set_missing(evaluation_id, value, dialog_confirmed=False): ) return ( html_sco_header.sco_header() - + """

%d notes changées

- - """ - % (nb_changed, evaluation_id, M["moduleimpl_id"]) + + f""" +

{nb_changed} notes changées

+ + """ + html_sco_header.sco_footer() ) @@ -930,14 +947,18 @@ def saisie_notes(evaluation_id, group_ids=[], REQUEST=None): H.append("""""") # Le formulaire de saisie des notes: - destination = "%s/Notes/moduleimpl_status?moduleimpl_id=%s" % ( - scu.ScoURL(), - E["moduleimpl_id"], + destination = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=E["moduleimpl_id"], ) + form = _form_saisie_notes( E, M, groups_infos.group_ids, destination=destination, REQUEST=REQUEST ) if form is None: + log(f"redirecting to {destination}") + stop return flask.redirect(destination) H.append(form) # @@ -1044,9 +1065,8 @@ def _form_saisie_notes(E, M, group_ids, destination="", REQUEST=None): # Decisions de jury existantes ? decisions_jury = {etudid: has_existing_decision(M, E, etudid) for etudid in etudids} - nb_decisions = sum( - decisions_jury.values() - ) # Nb de decisions de jury (pour les inscrits à l'évaluation) + # Nb de decisions de jury (pour les inscrits à l'évaluation): + nb_decisions = sum(decisions_jury.values()) etuds = _get_sorted_etuds(E, etudids, formsemestre_id) @@ -1155,6 +1175,7 @@ def _form_saisie_notes(E, M, group_ids, destination="", REQUEST=None): ) ) # + breakpoint() H = [] if nb_decisions > 0: H.append( @@ -1212,7 +1233,11 @@ def save_note(etudid=None, evaluation_id=None, value=None, comment="", REQUEST=N E = sco_evaluations.do_evaluation_list({"evaluation_id": evaluation_id})[0] M = sco_moduleimpl.do_moduleimpl_list(moduleimpl_id=E["moduleimpl_id"])[0] Mod = sco_edit_module.do_module_list(args={"module_id": M["module_id"]})[0] - Mod["url"] = "Notes/moduleimpl_status?moduleimpl_id=%(moduleimpl_id)s" % M + Mod["url"] = url_for( + "notes.moduleimpl_status", + scodoc_dept=g.scodoc_dept, + moduleimpl_id=M["moduleimpl_id"], + ) result = {"nbchanged": 0} # JSON # Check access: admin, respformation, or responsable_id if not sco_permissions_check.can_edit_notes(authuser, E["moduleimpl_id"]): diff --git a/app/views/users.py b/app/views/users.py index 42ee522b9..186619423 100644 --- a/app/views/users.py +++ b/app/views/users.py @@ -116,7 +116,7 @@ def create_user_form(REQUEST, user_name=None, edit=0): is_super_admin = True # Les rôles standards créés à l'initialisation de ScoDoc: - standard_roles = [Role.get_named_role(r) for r in (u"Ens", u"Secr", u"Admin")] + standard_roles = [Role.get_named_role(r) for r in ("Ens", "Secr", "Admin")] # Rôles pouvant etre attribués aux utilisateurs via ce dialogue: # si SuperAdmin, tous les rôles standards dans tous les départements # sinon, les départements dans lesquels l'utilisateur a le droit diff --git a/tests/unit/sco_fake_gen.py b/tests/unit/sco_fake_gen.py index 40a3386c5..ce50b5af5 100644 --- a/tests/unit/sco_fake_gen.py +++ b/tests/unit/sco_fake_gen.py @@ -34,7 +34,6 @@ from app.scodoc import sco_moduleimpl from app.scodoc import sco_saisie_notes from app.scodoc import sco_synchro_etuds from app.scodoc import sco_utils as scu -from app.scodoc.debug import REQUEST from app.scodoc.notes_log import log from app.scodoc.sco_exceptions import ScoValueError @@ -94,6 +93,7 @@ class ScoFake(object): @logging_meth def create_etud( + self, cnx=None, code_nip="", nom="", @@ -128,7 +128,7 @@ class ScoFake(object): nom = r_nom if not prenom: prenom = r_prenom - etud = sco_etud.create_etud(cnx, args=locals(), REQUEST=REQUEST) + etud = sco_etud.create_etud(cnx, args=locals()) inscription = "2020" # pylint: disable=possibly-unused-variable sco_synchro_etuds.do_import_etud_admission(cnx, etud["etudid"], locals()) return etud @@ -262,7 +262,6 @@ class ScoFake(object): etud["etudid"], etat="I", etape=etud.get("etape", None), - REQUEST=REQUEST, method="test_inscrit_etudiant", ) @@ -280,7 +279,6 @@ class ScoFake(object): publish_incomplete=None, evaluation_type=None, numero=None, - REQUEST=REQUEST, ): args = locals() del args["self"] @@ -423,5 +421,4 @@ class ScoFake(object): code_etat=code_etat, devenir=devenir, assidu=assidu, - REQUEST=REQUEST, ) diff --git a/tests/unit/test_abs_demijournee.py b/tests/unit/test_abs_demijournee.py index 21638e6c0..f0b9e7167 100644 --- a/tests/unit/test_abs_demijournee.py +++ b/tests/unit/test_abs_demijournee.py @@ -309,7 +309,7 @@ def test_abs_basic(test_client): # --- Création de billets b1 = absences.AddBilletAbsence( -s begin="2021-01-22 00:00", + begin="2021-01-22 00:00", end="2021-01-22 23:59", etudid=etudid, description="abs du 22", @@ -327,7 +327,7 @@ s begin="2021-01-22 00:00", code_ine=etuds[0]["code_ine"], ) - li_bi = absences.listeBilletsEtud( etudid=etudid, format="json") + li_bi = absences.listeBilletsEtud(etudid=etudid, format="json") assert isinstance(li_bi, str) load_li_bi = json.loads(li_bi) diff --git a/tests/unit/test_departements.py b/tests/unit/test_departements.py index 4a58bc907..83a6650b5 100644 --- a/tests/unit/test_departements.py +++ b/tests/unit/test_departements.py @@ -59,7 +59,7 @@ def test_preferences(test_client): .value ) # Compare valeurs - sco_val = prefs.get("abs_notification_mail_tmpl") + sco_val = prefs.get(None, "abs_notification_mail_tmpl") assert orm_val.strip() == sco_val.strip() # nb: I don't understand why SQLAlchemy strips the string ?! @@ -71,9 +71,9 @@ def test_preferences(test_client): app.set_sco_dept("D2") prefs2 = sco_preferences.get_base_preferences() assert len(prefs2) == len(prefs) - prefs2.set("abs_notification_mail_tmpl", "toto") - assert prefs2.get("abs_notification_mail_tmpl") == "toto" - assert prefs.get("abs_notification_mail_tmpl") != "toto" + prefs2.set(None, "abs_notification_mail_tmpl", "toto") + assert prefs2.get(None, "abs_notification_mail_tmpl") == "toto" + assert prefs.get(None, "abs_notification_mail_tmpl") != "toto" orm_val = ( ScoPreference.query.filter_by(dept_id=d.id, name="abs_notification_mail_tmpl") .first() @@ -81,7 +81,7 @@ def test_preferences(test_client): ) assert orm_val == "toto" # --- Preferences d'un semestre - # rejoure ce test pour avoir un semestre créé + # rejoue ce test pour avoir un semestre créé test_sco_basic.run_sco_basic() sem = sco_formsemestre.do_formsemestre_list()[0] formsemestre_id = sem["formsemestre_id"] diff --git a/tests/unit/test_users.py b/tests/unit/test_users.py index 9036bbedd..8c429386c 100644 --- a/tests/unit/test_users.py +++ b/tests/unit/test_users.py @@ -65,7 +65,7 @@ def test_users_roles(test_client): dept = "XX" perm = Permission.ScoAbsChange perm2 = Permission.ScoView - u = User(user_name="un enseignant") + u = User(user_name="un_enseignant") db.session.add(u) assert not u.has_permission(perm, dept) r = Role.get_named_role("Ens") @@ -73,7 +73,7 @@ def test_users_roles(test_client): r = Role(name="Ens", permissions=perm) u.add_role(r, dept) assert u.has_permission(perm, dept) - u = User(user_name="un autre") + u = User(user_name="un_autre") u.add_role(r, dept) db.session.add(u) db.session.commit() @@ -83,7 +83,7 @@ def test_users_roles(test_client): r2 = Role(name="Secr", dept=dept, permissions=perm2) u.add_roles([r, r2], dept) assert len(u.roles) == 2 - u = User(user_name="encore un") + u = User(user_name="encore_un") db.session.add(u) db.session.commit() u.set_roles([r, r2], dept) @@ -99,7 +99,7 @@ def test_users_roles(test_client): def test_user_admin(test_client): dept = "XX" perm = 0x1234 # a random perm - u = User(user_name="un admin", email=current_app.config["SCODOC_ADMIN_MAIL"]) + u = User(user_name="un_admin", email=current_app.config["SCODOC_ADMIN_MAIL"]) db.session.add(u) assert len(u.roles) == 1 assert u.has_permission(perm, dept)