Ajout d'une API.

This commit is contained in:
Antoine 2022-09-16 10:22:22 +02:00
parent 5330b27e5d
commit 41bd0d39ab
1 changed files with 85 additions and 22 deletions

107
app.py
View File

@ -42,16 +42,27 @@ GLOBAL_CONTEXT["DEBUG"] = False # Fait en sorte que le logiciel soit un peu plus
GLOBAL_CONTEXT["DOMAIN"] = "https://unisquat.alwaysdata.net" # Le domaine sur lequel est host l'instance
# Globales
app = Flask(__name__)
logs = [] # Stoque les différentes requêtes faite sur la route /free_rooms/, sous la forme {"timestamp":timestamp,"depts":[]}
logs = [] # Stocke les différentes requêtes faite sur la route /free_rooms/, sous la forme {"timestamp":timestamp,"depts":[]}
if os.path.isfile(LOG_FILE):
with open(LOG_FILE,"r") as f:
logs = json.loads(f.read())
# Fonctions :
def save_logs(logs):
"""
Sauvegarde les logs dans un fichier.
Parameters
----------
logs : list
Liste des logs.
Returns
-------
None.
"""
with open(LOG_FILE,"w") as f:
f.write(json.dumps(logs))
@ -70,7 +81,6 @@ def home() :
"""
return render_template("index.html", **GLOBAL_CONTEXT)
@app.route("/app")
def select_dept() :
"""
@ -94,7 +104,6 @@ def select_dept() :
url_for("static", filename="style.css")
return render_template("dept-select.html", **context, **GLOBAL_CONTEXT)
@app.route("/stats")
def stats():
"""
@ -139,41 +148,47 @@ def stats():
context = {"MAX_LOG_DAYS":MAX_LOG_DAYS,"PING_WARN":PING_WARN,"depts":sort[:MAX_LOG_DEPT],"favs":sort_favs[:MAX_LOG_FAVS],"nbping":pings}
return render_template("stats.html",**context, **GLOBAL_CONTEXT)
@app.route("/app/free-rooms", methods=["POST", "GET"])
def free_rooms() :
def free_rooms(api = False, rq = None) :
"""
Affiche les salles libres dans les départements sélectionnés
dans la page des départements.
Parameters
----------
None
api : bool
Indique si la page est accédée par l'API.
rq : requests.request
Requête.
Returns
-------
flask.render_template
"""
if not api :
rq = request
if GLOBAL_CONTEXT["DEBUG"]:
print(f"dept:\n\t{request.args.getlist('dept')}")
print(f"favs:\n\t{request.args.getlist('favs')}")
print(f"date:\n\t{request.args.get('date')}\t{request.args.get('time')}")
print(f"dept:\n\t{rq.args.getlist('dept')}")
print(f"favs:\n\t{rq.args.getlist('favs')}")
print(f"date:\n\t{rq.args.get('date')}\t{rq.args.get('time')}")
# Récupération des ID des départements depuis le formulaire :
dident_list = list(request.args.getlist("dept"))
dident_list = list(rq.args.getlist("dept"))
if len(dident_list) > MAX_DEPT :
return render_template("error.html", error="Trop de départements sélectionnés ! Vous pouvez en sélectionner "+str(MAX_DEPT)+" au maximum.")
if len(dident_list) == 0 :
return render_template("error.html", error="Il faut choisir au moins un département !")
# Récupération de l'éventuelle date personnalisée (depuis la page de sélection de date) :
date_uf = str(request.args.get("date"))
date_uf = str(rq.args.get("date"))
date_uf_sav = date_uf
if date_uf == "None" :
date_uf = [""]
else :
date_uf = date_uf.split("-")
time_uf = str(request.args.get("time"))
time_uf = str(rq.args.get("time"))
time_uf_sav = time_uf
if time_uf == "None" :
time_uf = [""]
@ -195,7 +210,7 @@ def free_rooms() :
# Récupération des IDs des salles favorites :
favs_ids = list(request.args.getlist("favs"))
favs_ids = list(rq.args.getlist("favs"))
if favs_ids == [None] :
favs_ids = []
@ -319,10 +334,28 @@ def free_rooms() :
# Sauvegarde les logs dans un fichier cache
save_logs(logs)
url_for("static", filename="style.css")
return render_template("free-rooms.html", **context, **GLOBAL_CONTEXT)
if api :
serial_context = context
for i in range(len(serial_context["free_rooms"])) :
fr_start = serial_context["free_rooms"][i].start
serial_context["free_rooms"][i].start = [fr_start.year, fr_start.month, fr_start.day, fr_start.hour, fr_start.minute, fr_start.second]
fr_end = serial_context["free_rooms"][i].end
serial_context["free_rooms"][i].end = [fr_end.year, fr_end.month, fr_end.day, fr_end.hour, fr_end.minute, fr_end.second]
serial_context["free_rooms"][i] = vars(serial_context["free_rooms"][i])
for i in range(len(serial_context["soon_rooms"])) :
fr_start = serial_context["soon_rooms"][i].start
serial_context["soon_rooms"][i].start = [fr_start.year, fr_start.month, fr_start.day, fr_start.hour, fr_start.minute, fr_start.second]
fr_end = serial_context["soon_rooms"][i].end
serial_context["soon_rooms"][i].end = [fr_end.year, fr_end.month, fr_end.day, fr_end.hour, fr_end.minute, fr_end.second]
serial_context["soon_rooms"][i] = vars(serial_context["soon_rooms"][i])
print(serial_context)
response = make_response(json.dumps(context))
response.headers["Content-Type"] = "application/json"
return response
else :
url_for("static", filename="style.css")
return render_template("free-rooms.html", **context, **GLOBAL_CONTEXT)
@app.route("/app/date-select", methods=["POST", "GET"])
def date_select() :
@ -349,14 +382,44 @@ def date_select() :
return render_template("date-select.html", **context, **GLOBAL_CONTEXT)
@app.route("/api/depts_list")
def api_depts_get() :
"""
Renvoie la liste des départements (pour l'API).
Returns
-------
None.
"""
# Récupération de la liste des départements existants :
dept_filen = "data/dept_list.txt"
dept_list = ro.get_depts(dept_filen)
serial_dlist = [vars(d) for d in dept_list]
response = make_response(json.dumps(serial_dlist))
response.headers["Content-Type"] = "application/json"
return response
@app.route("/api/free_rooms")
def api_frooms() :
"""
Redirige vers le JSON des salles (pour l'API).
Returns
-------
None.
"""
return free_rooms(True, request)
@app.route("/sitemap.xml")
def sitemap():
sitemap_xml = render_template("sitemap.xml", **GLOBAL_CONTEXT)
response= make_response(sitemap_xml)
response.headers["Content-Type"] = "application/xml"
response = make_response(sitemap_xml)
response.headers["Content-Type"] = "application/xml"
return response
@app.errorhandler(404)
def error(e):
"""