forked from ScoDoc/DocScoDoc
Ajout doc dev sélection groupes
This commit is contained in:
parent
75eacf1e73
commit
a698c80f7b
@ -1,7 +1,7 @@
|
|||||||
# Conventions de codage pour ScoDoc
|
# Conventions de codage pour ScoDoc
|
||||||
|
|
||||||
Le projet étant très ancien, le code est passé par différentes conventions et
|
Le projet étant très ancien, le code est passé par différentes conventions et
|
||||||
frameworks. Le style de python et celui du *frontend* web ont considérablement
|
frameworks. Le style de python et celui du _frontend_ web ont considérablement
|
||||||
évolués ces dernières décennies.
|
évolués ces dernières décennies.
|
||||||
|
|
||||||
Pour les nouveaux codes, respecter les principes suivants:
|
Pour les nouveaux codes, respecter les principes suivants:
|
||||||
@ -22,7 +22,7 @@ Pour les nouveaux codes, respecter les principes suivants:
|
|||||||
|
|
||||||
- l'usage de **[black](https://black.readthedocs.io/en/stable/)** est obligatoire
|
- l'usage de **[black](https://black.readthedocs.io/en/stable/)** est obligatoire
|
||||||
- l'usage de pylint et mypy est fortement recommandé
|
- l'usage de pylint et mypy est fortement recommandé
|
||||||
- Pour le code JS, indentation avec 2 espaces (sous VS Code, utiliser *Prettier*).
|
- Pour le code JS, indentation avec 2 espaces (sous VS Code, utiliser _Prettier_).
|
||||||
|
|
||||||
### Conventions standard Python
|
### Conventions standard Python
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ def _upload_justificatif_files(
|
|||||||
|
|
||||||
## Pages et templates
|
## Pages et templates
|
||||||
|
|
||||||
Les vues utilisent un template *Jinja2*, 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.
|
On s'astreint, sauf cas particulier, à un nommage identique de la route, la vue et du template.
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ Les templates suivants sont les plus utilisés pour les pages:
|
|||||||
|
|
||||||
- `sco_page.j2` page standard dans un formsemestre: avec sidebar et barre de
|
- `sco_page.j2` page standard dans un formsemestre: avec sidebar et barre de
|
||||||
menu du semestre. Le contenu de la variable `content` est placé comme HTML
|
menu du semestre. Le contenu de la variable `content` est placé comme HTML
|
||||||
brut (*safe*) dans la partie contenu. Passer `sco=ScoData(formsemestre=formsemestre)`
|
brut (_safe_) dans la partie contenu. Passer `sco=ScoData(formsemestre=formsemestre)`
|
||||||
en argument au template.
|
en argument au template.
|
||||||
|
|
||||||
- `sco_page_dept.j2` page dans un département (avec sidebar) mais sans formsemestre (pas de
|
- `sco_page_dept.j2` page dans un département (avec sidebar) mais sans formsemestre (pas de
|
||||||
@ -120,6 +120,7 @@ html_sco_header.sco_footer()
|
|||||||
```
|
```
|
||||||
|
|
||||||
La migration la plus simple consiste à utilise `sco_page.j2`:
|
La migration la plus simple consiste à utilise `sco_page.j2`:
|
||||||
|
|
||||||
```py
|
```py
|
||||||
render_template(
|
render_template(
|
||||||
"sco_page.j2",
|
"sco_page.j2",
|
||||||
@ -163,7 +164,6 @@ Mais si on souhaite générer le contenu dans un template, cela prendra la forme
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Classes css
|
### Classes css
|
||||||
|
|
||||||
`scodoc.css` (et à partir de 9.7, `scodoc97.css`) définissent quelques classes à usage général:
|
`scodoc.css` (et à partir de 9.7, `scodoc97.css`) définissent quelques classes à usage général:
|
||||||
@ -179,12 +179,12 @@ Mais si on souhaite générer le contenu dans un template, cela prendra la forme
|
|||||||
## Accès à la base de donnée
|
## Accès à la base de donnée
|
||||||
|
|
||||||
Sauf exception (requêtes exotiques, problèmes de performance) à discuter, les
|
Sauf exception (requêtes exotiques, problèmes de performance) à discuter, les
|
||||||
accès à la base se font à travers l'ORM *SQLAlchemy*. Les 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
|
dans `app/models`, sauf les comptes utilisateurs qui sont dans
|
||||||
`/app/auth/models.py`.
|
`/app/auth/models.py`.
|
||||||
|
|
||||||
Au moment de la définition de nouveaux modèles, éviter si possible les champs
|
Au moment de la définition de nouveaux modèles, éviter si possible les champs
|
||||||
*nullables*, penser à créer là où ce sera utile des index.
|
_nullables_, penser à créer là où ce sera utile des index.
|
||||||
|
|
||||||
## Tableaux
|
## Tableaux
|
||||||
|
|
||||||
@ -192,19 +192,76 @@ ScoDoc génère beaucoup de tableaux, sauf exception destinés à l'affichage We
|
|||||||
|
|
||||||
On utilise la super-classe `Table` de `app/tables/table_builder.py`.
|
On utilise la super-classe `Table` de `app/tables/table_builder.py`.
|
||||||
|
|
||||||
Le rendu HTML utilise *DataTables*.
|
Le rendu HTML utilise _DataTables_.
|
||||||
|
|
||||||
## Dates et heures
|
## Dates et heures
|
||||||
|
|
||||||
ScoDoc, contrairement à de nombreuses applications, est centré sur les
|
ScoDoc, contrairement à de nombreuses applications, est centré sur les
|
||||||
*étudiants* et les enseignements, qui sont censés opérer dans le fuseau horaire
|
_étudiants_ et les enseignements, qui sont censés opérer dans le fuseau horaire
|
||||||
du serveur. Cela signifie que, quelle que soit l'emplacement de l'utilisateur,
|
du serveur. Cela signifie que, quelle que soit l'emplacement de l'utilisateur,
|
||||||
les heures affichées et saisies par ScoDoc seront données dans le fuseau horaire
|
les heures affichées et saisies par ScoDoc seront données dans le fuseau horaire
|
||||||
du serveur.
|
du serveur.
|
||||||
|
|
||||||
L'API publie et reçoit des heures au format ISO avec fuseau horaire (*timezone*) et n'est pas
|
L'API publie et reçoit des heures au format ISO avec fuseau horaire (_timezone_) et n'est pas
|
||||||
concernée par cette remarque.
|
concernée par cette remarque.
|
||||||
|
|
||||||
|
## Sélection de groupes
|
||||||
|
|
||||||
|
De nombreuses pages ont besoin d'offrir un moyen de sélectionner un ou plusieurs
|
||||||
|
groupes d'étudiants, comme dans cet exemple:
|
||||||
|
|
||||||
|
![menu multiselect des groupes](screens/multiselect_groups.png)
|
||||||
|
|
||||||
|
La vue doit récupérer la liste des groupes sélectionnés ainsi:
|
||||||
|
|
||||||
|
```py
|
||||||
|
group_ids = request.args.getlist("group_ids")
|
||||||
|
```
|
||||||
|
|
||||||
|
ou s'il s'agit un `POST`:
|
||||||
|
|
||||||
|
```py
|
||||||
|
group_ids = request.form.getlist("group_ids")
|
||||||
|
```
|
||||||
|
|
||||||
|
On converti ensuite les arguments en entiers:
|
||||||
|
|
||||||
|
```py
|
||||||
|
try:
|
||||||
|
group_ids = [int(gid) for gid in group_ids]
|
||||||
|
except ValueError as exc:
|
||||||
|
raise ScoValueError("group_ids invalide") from exc
|
||||||
|
```
|
||||||
|
|
||||||
|
et on peut utiliser le code ancien `sco_groups_view`:
|
||||||
|
|
||||||
|
```py
|
||||||
|
groups_infos = sco_groups_view.DisplayedGroupsInfos(
|
||||||
|
group_ids,
|
||||||
|
formsemestre_id=formsemestre.id,
|
||||||
|
select_all_when_unspecified=True,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
`groups_infos` est un objet qui permet de récupérer les informations et de générer le menu.
|
||||||
|
|
||||||
|
Par exemple:
|
||||||
|
|
||||||
|
```py
|
||||||
|
Choix des groupes :
|
||||||
|
{sco_groups_view.menu_groups_choice(groups_infos, submit_on_change=True)
|
||||||
|
if groups_infos else ''}
|
||||||
|
```
|
||||||
|
|
||||||
|
La fonction `form_groups_choice` génère un formulaire complet.
|
||||||
|
|
||||||
|
Autres attributs/méthodes utiles de `groups_infos`:
|
||||||
|
|
||||||
|
- `get_etudids():list[int]` : les ids des étudiants des groupes sélectionnés;
|
||||||
|
- `groups_titles:str` : titres des groupes;
|
||||||
|
- `groups_filename:str`: un (morceau de) nom de fichier pour ces groupes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!!! note "Voir aussi"
|
!!! note "Voir aussi"
|
||||||
|
|
||||||
|
BIN
docs/screens/multiselect_groups.png
Normal file
BIN
docs/screens/multiselect_groups.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
Loading…
Reference in New Issue
Block a user