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