2018-10-30 16:26:25 +00:00
|
|
|
from flask import Blueprint, jsonify, request
|
|
|
|
|
from sqlalchemy.exc import IntegrityError
|
2018-11-07 13:38:09 +00:00
|
|
|
from sqlalchemy.orm.exc import NoResultFound
|
2018-10-30 16:26:25 +00:00
|
|
|
|
|
|
|
|
from app.dao.template_folder_dao import (
|
|
|
|
|
dao_create_template_folder,
|
|
|
|
|
dao_get_template_folder_by_id,
|
|
|
|
|
dao_update_template_folder,
|
|
|
|
|
dao_delete_template_folder
|
|
|
|
|
)
|
|
|
|
|
from app.dao.services_dao import dao_fetch_service_by_id
|
2018-11-07 13:38:09 +00:00
|
|
|
from app.errors import InvalidRequest, register_errors
|
2018-10-30 16:26:25 +00:00
|
|
|
from app.models import TemplateFolder
|
|
|
|
|
from app.template_folder.template_folder_schema import (
|
|
|
|
|
post_create_template_folder_schema,
|
|
|
|
|
post_rename_template_folder_schema
|
|
|
|
|
)
|
|
|
|
|
from app.schema_validation import validate
|
|
|
|
|
|
|
|
|
|
template_folder_blueprint = Blueprint(
|
|
|
|
|
'template_folder',
|
|
|
|
|
__name__,
|
|
|
|
|
url_prefix='/service/<uuid:service_id>/template-folder'
|
|
|
|
|
)
|
|
|
|
|
register_errors(template_folder_blueprint)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@template_folder_blueprint.errorhandler(IntegrityError)
|
|
|
|
|
def handle_integrity_error(exc):
|
|
|
|
|
if 'template_folder_parent_id_fkey' in str(exc):
|
|
|
|
|
return jsonify(result='error', message='parent_id not found'), 400
|
|
|
|
|
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@template_folder_blueprint.route('', methods=['GET'])
|
|
|
|
|
def get_template_folders_for_service(service_id):
|
|
|
|
|
service = dao_fetch_service_by_id(service_id)
|
|
|
|
|
|
|
|
|
|
template_folders = [o.serialize() for o in service.all_template_folders]
|
|
|
|
|
return jsonify(template_folders=template_folders)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@template_folder_blueprint.route('', methods=['POST'])
|
|
|
|
|
def create_template_folder(service_id):
|
|
|
|
|
data = request.get_json()
|
|
|
|
|
|
|
|
|
|
validate(data, post_create_template_folder_schema)
|
|
|
|
|
|
2018-11-07 13:38:09 +00:00
|
|
|
if data.get('parent_id') is not None:
|
|
|
|
|
try:
|
|
|
|
|
parent_folder = dao_get_template_folder_by_id(data['parent_id'])
|
|
|
|
|
except NoResultFound:
|
|
|
|
|
raise InvalidRequest("parent_id not found", status_code=400)
|
|
|
|
|
|
|
|
|
|
if parent_folder.service_id != service_id:
|
|
|
|
|
raise InvalidRequest("parent_id belongs to a different service", status_code=400)
|
|
|
|
|
|
2018-10-30 16:26:25 +00:00
|
|
|
template_folder = TemplateFolder(
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
name=data['name'].strip(),
|
|
|
|
|
parent_id=data['parent_id']
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
dao_create_template_folder(template_folder)
|
|
|
|
|
|
|
|
|
|
return jsonify(data=template_folder.serialize()), 201
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@template_folder_blueprint.route('/<uuid:template_folder_id>/rename', methods=['POST'])
|
|
|
|
|
def rename_template_folder(service_id, template_folder_id):
|
|
|
|
|
data = request.get_json()
|
|
|
|
|
|
|
|
|
|
validate(data, post_rename_template_folder_schema)
|
|
|
|
|
|
|
|
|
|
template_folder = dao_get_template_folder_by_id(template_folder_id)
|
|
|
|
|
template_folder.name = data['name']
|
|
|
|
|
|
|
|
|
|
dao_update_template_folder(template_folder)
|
|
|
|
|
|
|
|
|
|
return jsonify(data=template_folder.serialize()), 200
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@template_folder_blueprint.route('/<uuid:template_folder_id>', methods=['DELETE'])
|
|
|
|
|
def delete_template_folder(service_id, template_folder_id):
|
|
|
|
|
template_folder = dao_get_template_folder_by_id(template_folder_id)
|
|
|
|
|
|
|
|
|
|
# don't allow deleting if there's anything in the folder (even if it's just more empty subfolders)
|
|
|
|
|
if template_folder.subfolders or template_folder.templates:
|
|
|
|
|
return jsonify(result='error', message='Folder is not empty'), 400
|
|
|
|
|
|
|
|
|
|
dao_delete_template_folder(template_folder)
|
|
|
|
|
|
|
|
|
|
return '', 204
|