diff --git a/app/api/assiduites.py b/app/api/assiduites.py index 2a2dd5e2..4116a2cc 100644 --- a/app/api/assiduites.py +++ b/app/api/assiduites.py @@ -532,7 +532,7 @@ def assiduite_create(etudid: int = None, nip=None, ine=None): # On créé l'assiduité # 200 + obj si réussi # 404 + message d'erreur si non réussi - code, obj = create_one_assiduite(data, etud) + code, obj = _create_one(data, etud) if code == 404: errors.append({"indice": i, "message": obj}) else: @@ -590,7 +590,7 @@ def assiduites_create(): # route sans département set_sco_dept(etud.departement.acronym) - code, obj = create_one_assiduite(data, etud) + code, obj = _create_one(data, etud) if code == 404: errors.append({"indice": i, "message": obj}) else: @@ -600,14 +600,14 @@ def assiduites_create(): return {"errors": errors, "success": success} -def create_one_assiduite( +def _create_one( data: dict, etud: Identite, ) -> tuple[int, object]: """ - create_one_assiduite: création d'une assiduité à partir d'un dict + Création d'une assiduité à partir d'un dict - Cette fonction vérifie les données du dict (qui vient du JSON API ou d'ailleurs) + Cette fonction vérifie les données du dict (qui vient du JSON API) Puis crée l'assiduité si la représentation est valide. @@ -761,7 +761,7 @@ def assiduite_delete(): # Pour chaque assiduite_id on essaye de supprimer l'assiduité for i, assiduite_id in enumerate(assiduites_list): - # De la même façon que "create_one_assiduite" + # De la même façon que "_create_one" # Ici le code est soit 200 si réussi ou 404 si raté # Le message est le message d'erreur si erreur code, msg = _delete_one(assiduite_id) diff --git a/app/forms/assiduite/ajout_assiduite_etud.py b/app/forms/assiduite/ajout_assiduite_etud.py index 70a8b494..d4e31ddb 100644 --- a/app/forms/assiduite/ajout_assiduite_etud.py +++ b/app/forms/assiduite/ajout_assiduite_etud.py @@ -101,5 +101,14 @@ class AjoutAssiduiteEtudForm(FlaskForm): "maxlength": 500, }, ) + entry_date = StringField( + "Date de dépot ou saisie", + validators=[validators.Length(max=10)], + render_kw={ + "class": "datepicker", + "size": 10, + "id": "entry_date", + }, + ) submit = SubmitField("Enregistrer") cancel = SubmitField("Annuler", render_kw={"formnovalidate": True}) diff --git a/app/models/assiduites.py b/app/models/assiduites.py index 0330d6bb..3d4cfb15 100644 --- a/app/models/assiduites.py +++ b/app/models/assiduites.py @@ -135,7 +135,10 @@ class Assiduite(db.Model): external_data: dict = None, notify_mail=False, ) -> "Assiduite": - """Créer une nouvelle assiduité pour l'étudiant""" + """Créer une nouvelle assiduité pour l'étudiant. + Les datetime doivent être en timzone serveur. + Raises ScoValueError en cas de conflit ou erreur. + """ if date_debut.tzinfo is None: log( f"Warning: create_assiduite: date_debut without timezone ({date_debut})" diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index 8c87edf0..67b55404 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -75,9 +75,10 @@ MAX_TEXT_LEN = 64 * 1024 STATIC_DIR = ( os.environ.get("SCRIPT_NAME", "") + "/ScoDoc/static/links/" + sco_version.SCOVERSION ) -# La time zone du serveur: + # Attention: suppose que la timezone utilisée par postgresql soit la même ! TIME_ZONE = timezone("/".join(os.path.realpath("/etc/localtime").split("/")[-2:])) +"La timezone du serveur" # ----- CIVILITE ETUDIANTS CIVILITES = {"M": "M.", "F": "Mme", "X": ""} @@ -252,7 +253,9 @@ def is_iso_formated(date: str, convert=False) -> bool or datetime.datetime or No def localize_datetime(date: datetime.datetime or str) -> datetime.datetime: - """Ajoute un timecode UTC à la date donnée.""" + """Ajoute un timecode UTC à la date donnée. + XXX semble faire autre chose... TODO fix this comment + """ if isinstance(date, str): date = is_iso_formated(date, convert=True) diff --git a/app/templates/assiduites/pages/ajout_assiduite_etud.j2 b/app/templates/assiduites/pages/ajout_assiduite_etud.j2 index ed91b421..dbffe8f8 100644 --- a/app/templates/assiduites/pages/ajout_assiduite_etud.j2 +++ b/app/templates/assiduites/pages/ajout_assiduite_etud.j2 @@ -41,6 +41,13 @@ div.radio-assi_etat input[type="radio"]:checked + label { /* Style for checked state */ font-weight: bold; } + +div.submit { + margin-top: 12px; +} +div.submit > input { + margin-right: 16px; +}