def update_solution():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    check_json(request)
    solution_id = get_json(request).get('id')
    url = get_json(request).get('url')
    is_default = bool_helper(get_json(request).get('is_default'))

    is_owner = DccaAssSolutionImage.is_solution_owner(solution_id)
    if not is_owner:
        return jsonify({
            'status':
            'fail',
            'message':
            'Solution not exist or you are not permit to access'
        })

    image = url.split('/')[-1]
    if not image:
        return jsonify({'status': 'fail', 'message': 'Bad URL format'})

    solution = DccaAssSolutionImage.query_by_id(solution_id)
    solution.image = image
    solution.link = url
    if is_default:
        if not DccaModel.check_model_owner(solution.model_id):
            return jsonify({
                'status':
                "fail",
                'message':
                "Not the model owner, can't set default solution"
            })

        if solution.is_public != DccaModel.check_model_permission(
                solution.model_id):
            return jsonify({
                'status':
                "fail",
                'message':
                "Solution and model have different permission, can't set default solution"
            })
        solution.model.default_solution_id = solution_id
    else:
        solution.model.default_solution_id = None

    try:
        session.commit()
    except Exception as e:
        err_msg = "Fail to update solution. {}".format(str(e))
        raise DCCAException(err_msg)

    return jsonify({
        'id': solution_id,
        'status': 'success',
        'message': 'Update the solution successfully'
    })
def create_audit_request():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    check_json(request)
    solution_id = get_json(request).get('solution_id')
    comments = get_json(request).get('description')
    permission = get_json(request).get('permission')

    if not DccaAssSolutionImage.is_solution_owner(solution_id):
        return jsonify({
            'status':
            "fail",
            'message':
            "Solution not exist or you are not permit to access."
        })

    solution = DccaAssSolutionImage.get(solution_id)
    if not DccaModel.check_model_permission(
            solution.model_id) and not solution.is_public:
        return jsonify({
            'status': "fail",
            'message': "Model is private, Fail ro create request."
        })

    if DccaModel.check_model_permission(
            solution.model_id) and solution.is_public:
        if DccaModel.is_bind_solution(solution_id):
            return jsonify({
                'status':
                "fail",
                'message':
                "Solution is default solution of public model, Fail to create request."
            })

    to_public = check_permission(permission)
    req = DccaSolutionAudit(uid, comments, solution_id, to_public)

    try:
        session.add(req)
        session.commit()
    except Exception as e:
        err_msg = "Fail to create request. {}".format(str(e))
        raise DCCAException(err_msg)

    return jsonify({
        "status": "success",
        "message": "Request has been created, please wait for approval",
        "id": req.id
    })
def query_one_solution(solution_id):
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    solution = as_dict(DccaAssSolutionImage.get(solution_id), SolutionSchema)

    if solution['owner_id'] == int(uid):
        solution['is_owner'] = True
    else:
        solution['is_owner'] = False
    del solution['owner_id']

    if solution['model']['owner_id'] == int(uid):
        solution['model']['is_owner'] = True
    else:
        solution['model']['is_owner'] = False
    del solution['model']['owner_id']

    if solution['id'] == solution['model']['default_solution_id']:
        solution['is_default'] = True
    else:
        solution['is_default'] = False
    del solution['model']['default_solution_id']

    return jsonify(solution)
def delete_solution():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    check_json(request)
    solution_id = get_json(request).get('id')

    if not DccaAssSolutionImage.is_solution_owner(solution_id):
        return jsonify({
            'status':
            "fail",
            'message':
            "Solution not exist or you are not permit to access."
        })

    if DccaAssSolutionImage.check_solution_permission(solution_id):
        return jsonify({
            'status':
            "fail",
            'message':
            "Can't delete public solution, change it to private solution then delete it"
        })

    if DccaModel.is_bind_solution(solution_id):
        return jsonify({
            'status':
            "fail",
            'message':
            "Fail to delete model's default solution. Edit solution to remove the default setting."
        })

    solution = DccaAssSolutionImage.query_by_id(solution_id)
    try:
        solution.remove(BUCKET)
        session.commit()
    except Exception as e:
        err_msg = "Fail to delete solution. {}".format(str(e))
        raise DCCAException(err_msg)

    return jsonify({
        'status': 'success',
        'message': 'Delete solution successfully'
    })
def query_image_version():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    versions = DccaAssSolutionImage.query_solution_image_versions()

    return jsonify(versions)
def query_solution_name():
    """
    Get all the owner's solutions
    """
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    solution_names = DccaAssSolutionImage.query_solution_names()

    return jsonify(solution_names)
def query_solutions():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    limit = request.args.get('limit') or 20
    offset = request.args.get('offset') or 0
    solution_name = request.args.get('solution')
    model_id = request.args.get('model_id')
    image = request.args.get('image')
    version = request.args.get('version')
    my_solution = bool_helper(request.args.get('my_solution'))

    results = OrderedDict()
    results['offset'] = offset
    results['limit'] = limit
    results['results'] = []

    total, solutions = DccaAssSolutionImage.query_solutions(
        solution_name, model_id, image, version, my_solution, limit, offset)
    results['total'] = total
    if solutions:
        solutions = as_dict(solutions, SolutionSchema, many=True)
        for solution in solutions:
            if solution['owner_id'] == int(uid):
                solution['is_owner'] = True
            else:
                solution['is_owner'] = False
            del solution['owner_id']

            if solution['model']['owner_id'] == int(uid):
                solution['model']['is_owner'] = True
            else:
                solution['model']['is_owner'] = False
            del solution['model']['owner_id']

            if solution['model']['default_solution_id'] == solution['id']:
                solution['is_default'] = True
            else:
                solution['is_default'] = False
            del solution['model']['default_solution_id']

            results['results'].append(solution)

    return jsonify(results)
def check_solution_name():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    check_json(request)
    solution_name = get_json(request).get('solution')
    model_id = get_json(request).get('model_id')

    ctx.current_user = DccaUser.get_by_id(uid)

    is_exist = DccaAssSolutionImage.check_solution_name(
        solution_name, model_id)
    if not is_exist:
        return jsonify({
            'status': 'success',
            'message': 'solution name not exist'
        })
    else:
        return jsonify({
            'status': 'fail',
            'message': 'solution name already exists'
        })
def create_solution_view():
    uid, err = get_oemid(request=request)
    if err is not None:
        return jsonify(UNAUTH_RESULT)

    ctx.current_user = DccaUser.get_by_id(uid)

    check_json(request)
    solution_name = get_json(request).get('solution')
    model_id = get_json(request).get('model_id')
    version = get_json(request).get('version')
    image = get_json(request).get('image')
    url = get_json(request).get('url')
    is_signed = bool_helper(get_json(request).get('is_signed'))
    is_default = bool_helper(get_json(request).get('is_default'))
    have_installer = bool_helper(get_json(request).get('have_installer'))

    exceed_flag, max_limit_size = DccaAssSolutionImage.check_solution_limit()
    if exceed_flag:
        return jsonify({
            'status':
            'fail',
            'message':
            'Up to max limit({}) you can create.'.format(max_limit_size)
        })

    if url:
        in_s3 = False
        image = url.split('/')[-1]
        if not image:
            return jsonify({'status': 'fail', 'message': 'Bad URL format'})
    else:
        in_s3 = True
        s3_url = STORAGE_PREFIX + BUCKET
        url = '/'.join([
            s3_url, ctx.current_user.username, solution_name,
            str(model_id),
            image.split('.')[0], version, image
        ])

    if is_default:
        if not DccaModel.check_model_owner(model_id):
            return jsonify({
                'status': 'fail',
                'message': 'Not the model owner, cannot set default'
            })

        if DccaModel.check_model_permission(model_id):
            return jsonify({
                'status':
                "fail",
                'message':
                "Can't set private solution as default solution of public model"
            })

    solution = DccaAssSolutionImage(solution_name, model_id, image, version,
                                    url, uid, in_s3, is_signed, have_installer)
    try:
        session.add(solution)
        session.commit()
    except Exception as e:
        err_msg = "Fail to create solution. {}".format(str(e))
        raise DCCAException(err_msg)

    solution_id = solution.id
    if is_default:
        solution.model.default_solution_id = solution_id
        try:
            session.commit()
        except Exception as e:
            err_msg = "Fail to set default solution. {}".format(str(e))
            raise DCCAException(err_msg)

    return jsonify({
        'id': solution_id,
        'status': 'success',
        'message': 'Success to create solution'
    })