def create_reana_workflow():
    """Create a reana workflow by json."""
    _args = request.get_json()
    # try fetch the deposit with the provided PID
    try:
        resolver = Resolver(pid_type='depid',
                            object_type='rec',
                            getter=lambda x: x)

        deposit, rec_uuid = resolver.resolve(_args.get('pid'))
    except PIDDoesNotExistError:
        abort(
            404, "You tried to create a workflow and connect"
            " it with a non-existing record")

    # if record exist check if the user has 'deposit-update' rights

    with UpdateDepositPermission(deposit).require(403):
        token = get_reana_token(rec_uuid)

        name = _args.get('workflow_name')
        workflow_name = generate_slug(2)
        workflow_json = _args.get('workflow_json')

        try:
            resp = create_workflow(workflow_json, workflow_name, token)
        except ValidationError as e:
            return jsonify({'message': e.message}), 400
        except Exception:
            return jsonify({
                'message':
                'An exception has occured while creating '
                'the workflow in REANA.'
            }), 400

        # create a workflow dict, which can be used to populate
        # the db, but also used in the serializer
        _workflow = {
            'service': 'reana',
            'user_id': current_user.id,
            'name': name,
            'workflow_name': workflow_name,
            'name_run': resp['workflow_name'],
            'workflow_id': resp['workflow_id'],
            'rec_uuid': str(rec_uuid),
            'depid': _args.get('pid'),
            'status': 'created',
            'workflow_json': workflow_json,
        }

        # TOFIX: check for integrity errors
        workflow = ReanaWorkflow(**_workflow)

        db.session.add(workflow)
        db.session.commit()

        workflow_serialized = ReanaWorkflowSchema().dump(_workflow).data

        return jsonify(workflow_serialized)
Ejemplo n.º 2
0
 def can_user_update(self, obj):
     deposit = CAPDeposit.get_record(obj['pid'].object_uuid)
     return UpdateDepositPermission(deposit).can()
Ejemplo n.º 3
0
 def can_user_update(self, obj):
     return UpdateDepositPermission(obj['deposit']).can()
    'cap.modules.deposit.search:DepositSearch',
    # 'search_factory_imp': 'cap.modules.deposit.query.search_factory',
    'item_route':
    '/deposits/<{0}:pid_value>'.format(_PID),
    'file_list_route':
    '/deposits/<{0}:pid_value>/files'.format(_PID),
    'file_item_route':
    '/deposits/<{0}:pid_value>/files/<path:key>'.format(_PID),
    'create_permission_factory_imp':
    check_oauth2_scope(lambda record: CreateDepositPermission(record).can(),
                       write_scope.id),
    'read_permission_factory_imp':
    check_oauth2_scope(lambda record: ReadDepositPermission(record).can(),
                       write_scope.id),
    'update_permission_factory_imp':
    check_oauth2_scope(lambda record: UpdateDepositPermission(record).can(),
                       write_scope.id),
    # TODO update delete permission when 'discard'/'delete' is ready
    'delete_permission_factory_imp':
    check_oauth2_scope(lambda record: DeleteDepositPermission(record).can(),
                       write_scope.id),
    'links_factory_imp':
    'cap.modules.deposit.links:links_factory',
})
# DEPOSIT_UI_INDEX_TEMPLATE = "cap_deposit/index.html"
# TODO Resolve when '/deposit/new/' is removed
DEPOSIT_RECORDS_UI_ENDPOINTS = copy.deepcopy(
    deposit_config.DEPOSIT_RECORDS_UI_ENDPOINTS)

DEPOSIT_RECORDS_UI_ENDPOINTS['depid'].update({
    'template':
Ejemplo n.º 5
0
    def _get_user_rights_to_record(self, deposit, result):
        result['can_edit'] = UpdateDepositPermission(deposit).can()
        result['can_admin'] = AdminDepositPermission(deposit).can()

        return result