diff --git a/docs/DevConventions.md b/docs/DevConventions.md index e12f2030..1fa9b3f0 100644 --- a/docs/DevConventions.md +++ b/docs/DevConventions.md @@ -16,20 +16,22 @@ Pour les nouveaux codes, respecter les principes suivants: conduit à dupliquer du code (qui existe en général dans le serveur) et augmente les coûts de maintenance. -## Formatage du code +## Conventions de codage + +### Formatage du code - l'usage de **[black](https://black.readthedocs.io/en/stable/)** est obligatoire - l'usage de pylint et mypy est fortement recommandé - Pour le code JS, indentation avec 2 espaces (sous VS Code, utiliser *Prettier*). -## Conventions standard Python +### Conventions standard Python On se tient à la PEP8, c'est à dire en résumé: `UneClasse`, `une_fonction`, `_une_fonction_privee`, `une_variable`, `UNE_CONSTANTE_GLOBALE`. Les noms de fichiers sont en minuscules sans accents ni espaces, `comme_ceci.py`. -## Annotations de type +### Annotations de type (typehints) On annote les paramètres et résultats des fonctions. @@ -40,9 +42,9 @@ def _upload_justificatif_files( ... ``` -## Vues et templates +## Pages et templates -Les vues utilisent un template *Jinja*, fichier avec extension j2. +Les vues utilisent un template *Jinja2*, fichier avec extension j2. On s'astreint, sauf cas particulier, à un nommage identique de la route, la vue et du template. @@ -53,10 +55,69 @@ def un_exemple(...): return render_template(".../un_exemple.j2") ``` +Le template aura typiquement avec la structure suivante: + +```jinja +{% extends "sco_page.j2" %} + +{% block app_content %} +

Titre

+{% endblock app_content %} +``` + +Pour les pages dans un semestre (avec barre menu etc.), on utilisera `

` au +lieu de `

`. + +### Templates habituels + +Les templates suivants sont les plus utilisés pour les pages: + +- `base.j2` pages hors département (accueil, configuration, ...) + +- `sco_page.j2` page standard dans un formsemestre: avec sidebar et barre de + menu du semestre. + +- `sco_dept_page.j2` page dans un département (avec sidebar) mais sans formsemestre (pas de + barre de menu) + +### Constantes définies dans les templates ScoDoc + +Le `context_processor` `inject_sco_utils()` ajoute des objets pour accès à tous +les templates ScoDoc: + +- `scu` : le module `sco_utils.py` (diverses fonctions utilitaires et variables + de config.) +- `sco` : des données sur le contexte, notamment les préférences, le + formsemestre et l'étudiant courants (resp. `sco.formsemestre` et `sco.etud`) + +### Appel d'un template page + +Pour mémoire, l'appel d'un template dans une vue se fait ainsi: + +```py +render_template( "votre_template.j2", + title="Changer de référentiel de compétences", + autre_variable=... + ) +``` + + +### Classes css + +`scodoc.css` (et à partir de 9.7, `scodoc97.css`) définissent quelques classes à usage général: + +- `div.scobox`: boite (bords arrondis, fond uni) regroupant des éléments. + + - `div.scobox-title` le titre de la boite + - `div.scobox-buttons` boutons en bas de boite. + +- `p.help`, `div.help`: explications, aide. +- ... + ## Accès à la base de donnée Sauf exception (requêtes exotiques, problèmes de performance) à discuter, les -accès à la base se font à travers l'ORM *SQLAlchemy*. Mes modèles sont définis +accès à la base se font à travers l'ORM *SQLAlchemy*. Les modèles sont définis dans `app/models`, sauf les comptes utilisateurs qui sont dans `/app/auth/models.py`.