From 694c21a254b38542a3ff1e5898e621e76d22dfd4 Mon Sep 17 00:00:00 2001 From: Ilona Date: Wed, 8 Jan 2025 16:45:07 +0100 Subject: [PATCH] Utilise nouvelle API. Presentation index. Logo. --- app/__init__.py | 3 +- app/static/logo.png | Bin 0 -> 44426 bytes app/templates/base.j2 | 25 +++++++++- app/templates/formsemestre_description.j2 | 7 --- app/templates/index.j2 | 56 ++++++++++++++++++++-- app/views/views.py | 14 ++++-- autosco.py | 11 ++++- scodoc/api.py | 18 +++++-- 8 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 app/static/logo.png diff --git a/app/__init__.py b/app/__init__.py index f8ccff6..ddb4f6a 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -4,7 +4,6 @@ import time from flask import current_app, g, render_template, request from flask import Flask -from scodoc.api import APIError, ScoDocAuthError from config import DevConfig @@ -48,6 +47,8 @@ def handle_sco_auth_error(exc): def create_app(config_class=DevConfig): + from scodoc.api import APIError, ScoDocAuthError + app = Flask(__name__, static_url_path="/AutoSco/static", static_folder="static") app.config.from_object(config_class) app.wsgi_app = ReverseProxied(app.wsgi_app) diff --git a/app/static/logo.png b/app/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fb69d3738135fad2c7e1081476c6c76cd6e93c GIT binary patch literal 44426 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 D9mB-v literal 0 HcmV?d00001 diff --git a/app/templates/base.j2 b/app/templates/base.j2 index 9c70348..297619e 100644 --- a/app/templates/base.j2 +++ b/app/templates/base.j2 @@ -13,9 +13,27 @@ {%- endblock styles %} @@ -23,6 +41,11 @@ {% block body -%} + {%- block app_header %} +
+ Espace Langues - USPN +
+ {%- endblock app_header %} {% block navbar %} {%- endblock navbar %} {% block content -%} diff --git a/app/templates/formsemestre_description.j2 b/app/templates/formsemestre_description.j2 index 2a42f18..a2b7ae3 100644 --- a/app/templates/formsemestre_description.j2 +++ b/app/templates/formsemestre_description.j2 @@ -5,13 +5,6 @@ {{super()}} +{% endblock %} + {% block content %} -

AutoSco - Accueil

- +
Cours ouverts
{% for sem in sems %} -
- {{sem.date_debut}} : + {{sem.titre}} + cours du {{sem.date_debut}} au {{sem.date_fin}} + + {% if sem.descr.date_fin_inscriptions is not none %} + fermeture des inscriptions le {{sem.descr.date_fin_inscriptions|format_date}} + {% endif %} + + {% if sem.autosco.inscription_autorisee %} +
+ {% if sem.autosco.nb_dispo is not none %} + {{ sem.autosco.nb_dispo }} places disponibles : + {% endif %} + + s'inscrire + +
+ {% endif %} +
{% endfor %}
diff --git a/app/views/views.py b/app/views/views.py index d6fa342..eab0dc4 100644 --- a/app/views/views.py +++ b/app/views/views.py @@ -11,17 +11,18 @@ from scodoc import api @bp.route("/") def index(): annee_scolaire = scu.annee_scolaire() - sems = api.get(f"/formsemestres/query?annee_scolaire={annee_scolaire}") - # nb: l'utilisaton de l'API départementale permet de n'avoir + sems = api.get(f"/formsemestres/with_description/query?annee_scolaire={annee_scolaire}") + # nb: l'utilisation de l'API départementale permet de n'avoir # que les semestres du département configuré. + # Ne retient que les semestres ayant une description et étant visibles + sems = [ s for s in sems if s["autosco"] and s["autosco"]["visible"] ] return render_template("index.j2", sems=sems) @bp.route("/formdescription/") def formsemestre_description(formsemestre_id:int): """Page description d'un formsemestre (=d'un cours)""" - sem = api.get(f"/formsemestre/{formsemestre_id}") - sem["descr"] = api.get(f"/formsemestre/{formsemestre_id}/description") + sem = api.get(f"/formsemestre/{formsemestre_id}/with_description") return render_template("formsemestre_description.j2", sem=sem) @bp.route("/formsemestre//description/photo_ens") @@ -38,3 +39,8 @@ def formsemestre_get_photo_ens(formsemestre_id: int): r = make_response(response.content) r.headers["Content-Type"] = content_type return r + +@bp.route("/formsemestre//inscription") +def formsemestre_inscription(formsemestre_id: int): + """Formulaire d'auto-inscription étudiant""" + return "Formulaire d'auto-inscription étudiant" # TODO \ No newline at end of file diff --git a/autosco.py b/autosco.py index 9339241..ec1a6e9 100755 --- a/autosco.py +++ b/autosco.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """Application Flask: AutoSco""" -import os +import datetime from pprint import pprint as pp import click @@ -44,6 +44,15 @@ def make_shell_context(): "pp": pp, } + +@app.template_filter() +def format_date(value:str|datetime.datetime): + """Format a date dd/mm/yyyy""" + if isinstance(value, str): + value = datetime.datetime.fromisoformat(value) + return value.strftime("%d/%m/%Y") + + # Start using: # flask run -p 5001 --host 0.0.0.0 --debug diff --git a/scodoc/api.py b/scodoc/api.py index 1e16f2b..0629a83 100644 --- a/scodoc/api.py +++ b/scodoc/api.py @@ -3,7 +3,10 @@ import os import requests + from flask import current_app + +from app import log import config @@ -22,12 +25,17 @@ class ScoDocAuthError(APIError): def get_auth_headers(user: str, password: str, conf: config.Config) -> dict: "Demande de jeton, dict à utiliser dans les en-têtes de requêtes http" - ans = requests.post( - conf["API_URL"] + "/tokens", - auth=(user, password), - timeout=conf["API_TIMEOUT"], - ) + try: + ans = requests.post( + conf["API_URL"] + "/tokens", + auth=(user, password), + timeout=conf["API_TIMEOUT"], + ) + except requests.exceptions.ConnectionError as exc: + log(f"get_auth_headers: error: user={user}, url='{conf['API_URL']}/tokens'") + raise ScoDocAuthError(f"Impossible de se connecter à ScoDoc: problème de configuration?", exc) if ans.status_code != 200: + log(f"get_auth_headers: error: user={user}, answer status={ans.status_code}") raise ScoDocAuthError(f"Echec demande jeton par {user}", status_code=ans.status_code) token = ans.json()["token"] return {"Authorization": f"Bearer {token}"}