1
0
forked from ScoDoc/ScoDoc

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/moduleimpl_status
# Scolarite/setGroups
from datetime import datetime
from flask import jsonify, request, url_for, abort, g
from flask_login import current_user
from flask import jsonify, request, g, send_file
from sqlalchemy.sql import func
from app import db, log
from app.api import bp
from app.api.auth import token_auth
from app.api.errors import bad_request, error_response
from app.decorators import permission_required
from app.api.errors import error_response
from app import models
from app.models import FormSemestre, FormSemestreInscription, Identite
from app.scodoc.sco_logos import list_logos, find_logo
from app.scodoc.sco_permissions import Permission
@ -79,3 +79,76 @@ def etudiants():
FormSemestre.date_fin >= func.now(),
)
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(),
)