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