Merge branch 'api_logos' of https://scodoc.org/git/jmplace/ScoDoc-Lille into jmplace-api_logos

This commit is contained in:
Emmanuel Viennet 2021-12-21 23:16:47 +01:00
commit 69fc831ef3

View File

@ -38,18 +38,18 @@
# Scolarite/Notes/groups_view # Scolarite/Notes/groups_view
# Scolarite/Notes/moduleimpl_status # Scolarite/Notes/moduleimpl_status
# Scolarite/setGroups # Scolarite/setGroups
from datetime import datetime
from flask import jsonify, request, url_for, abort, g from flask import jsonify, request, g, send_file
from flask_login import current_user
from sqlalchemy.sql import func from sqlalchemy.sql import func
from app import db, log from app import db, log
from app.api import bp from app.api import bp
from app.api.auth import token_auth from app.api.auth import token_auth
from app.api.errors import bad_request, error_response from app.api.errors import error_response
from app.decorators import permission_required
from app import models from app import models
from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import FormSemestre, FormSemestreInscription, Identite
from app.scodoc.sco_logos import list_logos, find_logo
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
@ -79,3 +79,76 @@ def etudiants():
FormSemestre.date_fin >= func.now(), FormSemestre.date_fin >= func.now(),
) )
return jsonify([e.to_dict_bul(include_urls=False) for e in query]) return jsonify([e.to_dict_bul(include_urls=False) for e in query])
def format_required(default_format="json", allowed_formats=None):
"""Extract required format from a request.
* default value is json. a list of allowed formats may be provided
(['json'] considered if not provided).
* if the required format is not in allowed list, returns None.
NB: if json in not in allowed_formats, format specification is mandatory."""
format_type = request.args.get("format", default_format)
if format_type in (allowed_formats or ["json"]):
return format_type
return None
def get_dept_id(dept_name=None):
dept = models.Departement.query.filter_by(acronym=dept_name).first_or_404()
return dept.id
@bp.route("/logos", methods=["GET"])
@token_auth.login_required
def api_get_glob_logos():
if not g.current_user.has_permission(Permission.ScoSuperAdmin, None):
return error_response(401, message="accès interdit")
required_format = format_required() # json only
if required_format is None:
return error_response(400, "Illegal format")
logos = list_logos()[None]
return jsonify(list(logos.keys()))
@bp.route("/logos/<string:logoname>", methods=["GET"])
@token_auth.login_required
def api_get_glob_logo(logoname):
if not g.current_user.has_permission(Permission.ScoSuperAdmin, None):
return error_response(401, message="accès interdit")
logo = find_logo(logoname=logoname)
if logo is None:
return error_response(404, message="logo not found")
logo.select()
return send_file(
logo.filepath,
mimetype=f"image/{logo.suffix}",
last_modified=datetime.now(),
)
@bp.route("/departements/<string:departement>/logos", methods=["GET"])
@token_auth.login_required
def api_get_local_logos(departement):
dept_id = get_dept_id(departement)
if not g.current_user.has_permission(Permission.ScoChangePreferences, departement):
return error_response(401, message="accès interdit")
logos = list_logos().get(dept_id, dict())
return jsonify(list(logos.keys()))
@bp.route("/departements/<string:departement>/logos/<string:logoname>", methods=["GET"])
@token_auth.login_required
def api_get_local_logo(departement, logoname):
# format = format_required("jpg", ['png', 'jpg'])
dept_id = get_dept_id(departement)
if not g.current_user.has_permission(Permission.ScoChangePreferences, departement):
return error_response(401, message="accès interdit")
logo = find_logo(logoname=logoname, dept_id=dept_id)
if logo is None:
return error_response(404, message="logo not found")
logo.select()
return send_file(
logo.filepath,
mimetype=f"image/{logo.suffix}",
last_modified=datetime.now(),
)