Source code for server.views_api.experiment
from flask import Blueprint, request, jsonify
from .. import db
from ..models import Experiment, Device
from .validations import pretty_name_is_valid
from ..functions import submit_experiment
from ..protections import user_required, admin_required, content_json
bp = Blueprint('experiment_api', __name__, url_prefix="/api")
[docs]
@bp.route('/experiment', methods=['GET'])
@user_required
def get_all_experiments():
expers = Experiment.query.all()
return jsonify(experiments=[s.to_dict() for s in expers]), 200
[docs]
@bp.route('/experiment/<id_>', methods=['GET'])
@user_required
def get_experiment(id_):
exper = Experiment.by_id(id_)
if not exper:
return jsonify(message="Experiment not found."), 404
return jsonify(experiment=exper.to_dict()), 200
[docs]
@bp.route('/experiment', methods=['POST'])
@admin_required
@content_json(["name", "devices"])
def create_experiment():
data = request.get_json()
metadata = {
"name": data["name"],
}
devices = list(map(Device.by_id, data.get("devices", [])))
errors = dict()
if not pretty_name_is_valid(metadata["name"]):
errors["name"] = "Invalid format"
if Experiment.by_name(metadata["name"]):
errors["name"] = "Experiment name conflict."
if not all(devices):
errors["devices"] = "One or more invalid device ids"
if not errors:
exper = submit_experiment(**metadata, devices=devices)
return jsonify(message="Experiment '{}' created.".format(exper.name),
experiment=exper.to_dict()), 201
else:
return jsonify(message="Experiment creation failed.", errors=errors), 400
[docs]
@bp.route('/experiment/<id_>', methods=['DELETE'])
@admin_required
def delete_experiment(id_):
exper = Experiment.by_id(id_)
if not exper:
return jsonify(message="Experiment not found."), 404
for s in exper.sessions: # Delete all sessions for this experiment
db.session.delete(s)
db.session.delete(exper)
db.session.commit()
return jsonify(message="Experiment '{}' has been deleted.".format(exper.name)), 200
[docs]
@bp.route('/experiment/<id_>', methods=['PATCH'])
@admin_required
@content_json([])
def modify_experiment(id_):
exper = Experiment.by_id(id_)
if not exper:
return jsonify(message="Experiment not found."), 404
data = request.get_json()
metadata = {
"name": data.get("name", exper.name),
}
devices = list(map(Device.by_id, data["devices"])) if "devices" in data else exper.devices
errors = dict()
if not pretty_name_is_valid(metadata["name"]):
errors["name"] = "Invalid characters or too long"
if metadata["name"] != exper.name and Experiment.by_name(metadata["name"]):
errors["name"] = "Experiment name conflict"
if not all(devices):
errors["devices"] = "One or more invalid device ids"
if not errors:
exper = submit_experiment(**metadata, devices=devices, replace=exper)
return jsonify(message="Experiment '{}' modified.".format(exper.name)), 200
else:
return jsonify(message="Experiment modification failed.", errors=errors), 400