Source code for server.views_api.usergroup
from flask import Blueprint, request, jsonify
from .. import db
from ..models import User, Usergroup
from .validations import pretty_name_is_valid
from ..functions import submit_usergroup
from ..protections import user_required, admin_required, content_json
import json
bp = Blueprint('usergroup_api', __name__, url_prefix="/api")
[docs]
@bp.route('/usergroup', methods=['GET'])
@admin_required
def get_all_usergroups():
records = Usergroup.query.all()
return jsonify(usergroups=[r.to_dict() for r in records]), 200
[docs]
@bp.route('/usergroup/<id_>', methods=['GET'])
@user_required
def get_usergroup(id_):
record = Usergroup.by_id(id_)
if not record:
return jsonify(message="Usergroup not found."), 404
return jsonify(usergroup=record.to_dict()), 200
[docs]
@bp.route('/usergroup', methods=['POST'])
@admin_required
@content_json(["name"])
def create_usergroup():
data = request.get_json()
metadata = {
"name": data["name"],
"description": data.get("description", ""),
"style_json": data.get("style_json", "{}"),
}
users = list(map(User.by_id, data.get("users", [])))
errors = dict()
if not pretty_name_is_valid(metadata["name"]):
errors["name"] = "Invalid characters or too long"
if Usergroup.by_name(metadata["name"]):
errors["name"] = "Usergroup name conflict"
if not all(users):
errors["users"] = "One or more invalid user ids"
try:
json.loads(metadata["style_json"])
except (TypeError, json.JSONDecodeError):
errors["style_json"] = "Not a valid serialized JSON"
if not errors:
record = submit_usergroup(**metadata, users=users)
return jsonify(message="Usergroup '{}' created.".format(record.name),
usergroup=record.to_dict()), 201
else:
return jsonify(message="Usergroup creation failed.", errors=errors), 400
[docs]
@bp.route('/usergroup/<id_>', methods=['DELETE'])
@admin_required
def delete_usergroup(id_):
record = Usergroup.by_id(id_)
if not record:
return jsonify(message="Usergroup not found."), 404
db.session.delete(record)
db.session.commit()
return jsonify(message="Usergroup '{}' has been deleted.".format(record.name)), 200
[docs]
@bp.route('/usergroup/<id_>', methods=['PATCH'])
@admin_required
@content_json([])
def modify_usergroup(id_):
record = Usergroup.by_id(id_)
if not record:
return jsonify(message="Usergroup not found."), 404
data = request.get_json()
metadata = {
"name": data.get("name", record.name),
"description": data.get("description", record.description),
"style_json": data.get("style_json", record.style_json),
}
users = list(map(User.by_id, data["users"])) if "users" in data else record.users
errors = dict()
if not pretty_name_is_valid(metadata["name"]):
errors["name"] = "Invalid characters or too long"
if metadata["name"] != record.name and Usergroup.by_name(metadata["name"]):
errors["name"] = "Usergroup name conflict"
if not all(users):
errors["users"] = "One or more invalid user ids"
try:
json.loads(metadata["style_json"])
except (TypeError, json.JSONDecodeError):
errors["style_json"] = "Not a valid serialized JSON"
if not errors:
record = submit_usergroup(**metadata, users=users, replace=record)
return jsonify(message="Usergroup '{}' modified.".format(record.name)), 200
else:
return jsonify(message="Usergroup modification failed.", errors=errors), 400