Documentation API: correctifs + génération page complète

This commit is contained in:
Emmanuel Viennet 2024-07-25 10:42:49 +02:00
parent b3111769a1
commit 188534819b
7 changed files with 53 additions and 42 deletions

View File

@ -105,25 +105,29 @@ def evaluation_notes(evaluation_id: int):
evaluation_id : l'id de l'évaluation evaluation_id : l'id de l'évaluation
Exemple de résultat : Exemple de résultat :
```json
{ {
"11": { "11": {
"etudid": 11, "etudid": 11,
"evaluation_id": 1, "evaluation_id": 1,
"value": 15.0, "value": 15.0,
"note_max" : 20.0,
"comment": "", "comment": "",
"date": "Wed, 20 Apr 2022 06:49:05 GMT", "date": "2024-07-19T19:08:44+02:00",
"uid": 2 "uid": 2
}, },
"12": { "12": {
"etudid": 12, "etudid": 12,
"evaluation_id": 1, "evaluation_id": 1,
"value": 12.0, "value": "ABS",
"note_max" : 20.0,
"comment": "", "comment": "",
"date": "Wed, 20 Apr 2022 06:49:06 GMT", "date": "2024-07-19T19:08:44+02:00",
"uid": 2 "uid": 2
}, },
... ...
} }
```
""" """
query = Evaluation.query.filter_by(id=evaluation_id) query = Evaluation.query.filter_by(id=evaluation_id)
if g.scodoc_dept: if g.scodoc_dept:

View File

@ -411,11 +411,11 @@ def ue_set_code_apogee(ue_id: int | None = None, code_apogee: str = ""):
Ce changement peut être fait sur formation verrouillée. Ce changement peut être fait sur formation verrouillée.
Si ue_id n'est pas spécifié, utilise l'argument oid du POST. Si `ue_id` n'est pas spécifié, utilise l'argument oid du POST.
Si code_apogee n'est pas spécifié ou vide, Si `code_apogee` n'est pas spécifié ou vide,
utilise l'argument value du POST. utilise l'argument value du POST.
Le retour est une chaîne (le code enregistré), pas json. Le retour est une chaîne (le code enregistré), pas du json.
""" """
if ue_id is None: if ue_id is None:
ue_id = request.form.get("oid") ue_id = request.form.get("oid")
@ -468,9 +468,9 @@ def ue_set_code_apogee_rcue(ue_id: int, code_apogee: str = ""):
Ce changement peut être fait sur formation verrouillée. Ce changement peut être fait sur formation verrouillée.
Si code_apogee n'est pas spécifié ou vide, Si code_apogee n'est pas spécifié ou vide,
utilise l'argument value du POST (utilisé par jinplace.js) utilise l'argument value du POST (utilisé par `jinplace.js`)
Le retour est une chaîne (le code enregistré), pas json. Le retour est une chaîne (le code enregistré), pas du json.
""" """
if not code_apogee: if not code_apogee:
code_apogee = request.form.get("value", "") code_apogee = request.form.get("value", "")
@ -522,11 +522,11 @@ def formation_module_set_code_apogee(
Ce changement peut être fait sur formation verrouillée. Ce changement peut être fait sur formation verrouillée.
Si module_id n'est pas spécifié, utilise l'argument oid du POST. Si `module_id` n'est pas spécifié, utilise l'argument `oid` du POST.
Si code_apogee n'est pas spécifié ou vide, Si `code_apogee` n'est pas spécifié ou vide,
utilise l'argument value du POST (utilisé par jinplace.js) utilise l'argument value du POST (utilisé par jinplace.js)
Le retour est une chaîne (le code enregistré), pas json. Le retour est une chaîne (le code enregistré), pas du json.
""" """
if module_id is None: if module_id is None:
module_id = request.form.get("oid") module_id = request.form.get("oid")

View File

@ -199,7 +199,6 @@ def validation_rcue_record(etudid: int):
DATA DATA
---- ----
```json ```json
{ {
"code" : str, "code" : str,

View File

@ -106,8 +106,11 @@ def moduleimpl_inscriptions(moduleimpl_id: int):
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def moduleimpl_notes(moduleimpl_id: int): def moduleimpl_notes(moduleimpl_id: int):
"""Liste des notes dans ce moduleimpl """Liste des notes dans ce moduleimpl.
Exemple de résultat : Exemple de résultat :
```json
[ [
{ {
"etudid": 17776, // code de l'étudiant "etudid": 17776, // code de l'étudiant
@ -122,6 +125,7 @@ def moduleimpl_notes(moduleimpl_id: int):
}, },
... ...
] ]
```
""" """
modimpl = ModuleImpl.get_modimpl(moduleimpl_id) modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
app.set_sco_dept(modimpl.formsemestre.departement.acronym) app.set_sco_dept(modimpl.formsemestre.departement.acronym)

View File

@ -6,7 +6,6 @@
""" """
ScoDoc 9 API : accès aux formsemestres ScoDoc 9 API : accès aux formsemestres
""" """
# from flask import g, jsonify, request # from flask import g, jsonify, request
# from flask_login import login_required # from flask_login import login_required

View File

@ -1,3 +1,4 @@
{# Template pour la doc mardown d'un point d'entrée de l'API #}
#### **`{{doc.nom}}`** #### **`{{doc.nom}}`**
{% if doc.routes %} {% if doc.routes %}

View File

@ -547,7 +547,7 @@ def analyze_api_routes(app, endpoint_start: str) -> tuple:
# point d'entrée de la commande `flask gen-api-map` # point d'entrée de la commande `flask gen-api-map`
def gen_api_map(app, endpoint_start="api."): def gen_api_map(app, endpoint_start="api.") -> str:
""" """
Fonction permettant de générer une carte SVG de l'API de ScoDoc Fonction permettant de générer une carte SVG de l'API de ScoDoc
Elle récupère les routes de l'API et les transforme en un arbre de Token Elle récupère les routes de l'API et les transforme en un arbre de Token
@ -566,6 +566,7 @@ def gen_api_map(app, endpoint_start="api."):
# On génère le tableau à partir de doctable_lines # On génère le tableau à partir de doctable_lines
table = _gen_table(sorted(doctable_lines.values(), key=lambda x: x["nom"])) table = _gen_table(sorted(doctable_lines.values(), key=lambda x: x["nom"]))
_write_gen_table(table) _write_gen_table(table)
return table
def _get_bbox(element, x_offset=0, y_offset=0): def _get_bbox(element, x_offset=0, y_offset=0):
@ -905,7 +906,7 @@ def doc_route(doctable: dict) -> str:
"href": f"{jinja_obj['nom'].replace('_', '-')}.json.md", "href": f"{jinja_obj['nom'].replace('_', '-')}.json.md",
} }
return render_template("apidoc.j2", doc=jinja_obj) return render_template("doc/apidoc.j2", doc=jinja_obj)
def gen_api_doc(app, endpoint_start="api."): def gen_api_doc(app, endpoint_start="api."):
@ -922,7 +923,7 @@ def gen_api_doc(app, endpoint_start="api."):
categories[category].append(value) categories[category].append(value)
# sort categories by name # sort categories by name
categories: dict = dict(sorted(categories.items(), key=lambda x: x[0])) categories: dict = dict(sorted(categories.items(), key=lambda x: x[0].capitalize()))
category: str category: str
routes: list[dict] routes: list[dict]
@ -935,9 +936,12 @@ def gen_api_doc(app, endpoint_start="api."):
mddoc += doc_route(route) mddoc += doc_route(route)
mddoc += "\n\n" mddoc += "\n\n"
fname = "/tmp/apidoc.md" table_api = gen_api_map(app, endpoint_start=endpoint_start)
mdpage = render_template("doc/ScoDoc9API.j2", doc_api=mddoc, table_api=table_api)
fname = "/tmp/ScoDoc9API.md"
with open(fname, "w", encoding="utf-8") as f: with open(fname, "w", encoding="utf-8") as f:
f.write(mddoc) f.write(mdpage)
print( print(
"La documentation API a été générée avec succès. " "La documentation API a été générée avec succès. "
f"Vous pouvez la consulter à l'adresse suivante : {fname}" f"Vous pouvez la consulter à l'adresse suivante : {fname}"