from flask import Blueprint, request, jsonify
from .. import db
from ..models import Session, User, Experiment
from .validations import get_session_metadata_errors
from ..functions import submit_session
from ..protections import user_required, admin_required, content_json
bp = Blueprint('session_api', __name__, url_prefix="/api")
[docs]
@bp.route('/session', methods=['GET'])
@user_required
def get_all_sessions():
sessions = Session.query.all()
return jsonify(sessions=[s.to_dict() for s in sessions]), 200
[docs]
@bp.route('/session/<id_>', methods=['GET'])
@user_required
def get_session(id_):
session = Session.by_id(id_)
if not session:
return jsonify(message="Session not found."), 404
return jsonify(session=session.to_dict()), 200
[docs]
@bp.route('/session', methods=['POST'])
@admin_required
@content_json(["name", "begin", "end", "experiment"])
def create_session():
data = request.get_json()
metadata = {
"name": data["name"],
"begin": data["begin"],
"end": data["end"],
}
experiment = Experiment.by_id(data["experiment"])
users = list(map(User.by_id, data.get("users", [])))
errors = dict(get_session_metadata_errors(**metadata))
if not experiment:
errors["experiment"] = "Invalid experiment id"
if not all(users):
errors["users"] = "One or more invalid user ids"
if not errors:
session = submit_session(**metadata, experiment=experiment, users=users)
return jsonify(message="Session '{}' created.".format(session.name),
session=session.to_dict()), 201
else:
return jsonify(message="Session creation failed.", errors=errors), 400
[docs]
@bp.route('/session/<id_>', methods=['DELETE'])
@admin_required
def delete_session(id_):
session = Session.by_id(id_)
if not session:
return jsonify(message="Session not found."), 404
db.session.delete(session)
db.session.commit()
return jsonify(message="Session '{}' has been deleted.".format(session.name)), 200
[docs]
@bp.route('/session/<id_>', methods=['PATCH'])
@admin_required
@content_json([])
def modify_session(id_):
session = Session.by_id(id_)
if not session:
return jsonify(message="Session not found."), 404
data = request.get_json()
metadata = {
"name": data.get("name", session.name),
"begin": data.get("begin", session.begin),
"end": data.get("end", session.end),
}
experiment = Experiment.by_id(data["experiment"]) if "experiment" in data else session.experiment
users = list(map(User.by_id, data["users"])) if "users" in data else session.users
errors = dict(get_session_metadata_errors(**metadata))
if not experiment:
errors["experiment"] = "Invalid experiment id"
if not all(users):
errors["users"] = "One or more invalid user ids"
if not errors:
submit_session(**metadata, users=users, experiment=experiment, replace=session)
return jsonify(message="Session '{}' modified.".format(session.name)), 200
else:
return jsonify(message="Session modification failed.", errors=errors), 400