コード例 #1
0
ファイル: api.py プロジェクト: jnuyens/resolver
def delete_document(id):
    doc = Document.query.filter(Document.id == id).first()
    if not doc:
        return ErrorRestApi().response(status=404,
                                       errors=['Document not found.'])
    if isinstance(doc, Representation):
        if doc.reference:
            count = Representation.query. \
                filter(Document.entity_id == doc.entity_id).count()
            if count > 1:
                return ErrorRestApi().response(
                    status=409,
                    errors=['Can not delete reference representation.'])
            db.session.delete(doc)
            db.session.flush()
        i = 1
        reps = Representation.query. \
            filter(Document.entity_id == doc.entity_id). \
            order_by(Representation.order.asc()).all()
        for rep in reps:
            rep.order = i
            i += 1
    else:
        db.session.delete(doc)
    log(doc.entity_id, "Removed the document '%s' %s" % (doc, doc.entity))
    db.session.commit()
    return "", 204
コード例 #2
0
ファイル: api.py プロジェクト: jnuyens/resolver
def create_entity():
    form = EntityForm(csrf_enabled=False)
    if form.validate_on_submit():
        try:
            ent = Entity(type=form.type.data,
                         title=form.title.data,
                         id=form.id.data)
        except EntityPIDExistsException:
            return ErrorRestApi().response(status=409,
                                           errors=['Duplicate ID for entity.'])
        except EntityCollisionException as e:
            return ErrorRestApi().response(
                status=409,
                errors=[{
                    'title':
                    'ID Collision',
                    'detail':
                    'The provided ID \'{0}\' collides with the existing ID \'{1}\''
                    .format(form.id.data, e.original_id)
                }])
        db.session.add(ent)
        db.session.flush()
        db.session.add(Data(ent.id, 'html'))
        db.session.add(Representation(ent.id, 1, reference=True))
        db.session.commit()
        log(ent.id, "Created entity `%s'" % ent)
        return RestApi().response(
            status=201, data={'data': EntityViewApi().output(entity=ent)})
    errors = [{
        'title': 'Malformed parameter',
        'detail': 'Field %s: %s' % (field, ' '.join(error))
    } for field, error in form.errors.iteritems()]
    return ErrorRestApi().response(status=400, errors=errors)
コード例 #3
0
ファイル: api.py プロジェクト: jnuyens/resolver
def update_document(id):
    try:
        data = json.loads(request.data)
        validate(data, document_schema)

        doc = Document.query.filter(Document.id == id).first()
        if not doc:
            return ErrorRestApi().response(status=404,
                                           errors=['Document not found.'])

        doc.enabled = data["enabled"]
        doc.url = data.get('url', '')
        doc.notes = data.get('notes', '')

        if data['type'] == 'data':
            return update_data(data, doc)
        else:
            return update_representation(data, doc)
    except ValueError as e:
        errors = [{
            'title':
            'Malformed request',
            'detail':
            'Expected correctly formatted JSON data: {0}'.format(e)
        }]
        return ErrorRestApi().response(status=400, errors=errors)
    except ValidationError as e:
        errors = [{
            'title':
            'Malformed request',
            'detail':
            'JSON data does not conform to schema: {0}'.format(e)
        }]
        return ErrorRestApi().response(status=400, errors=errors)
コード例 #4
0
ファイル: api.py プロジェクト: jnuyens/resolver
def depr_login():
    if g.user is not None and g.user.is_authenticated:
        return "", 204
    form = SigninForm(csrf_enabled=False)
    if form.validate_on_submit():
        user = User.query.filter(User.username == form.username.data).first()
        if not user:
            return ErrorRestApi().response(status=403,
                                           errors=['Username not found.'])
        login_user(user)
        return "", 204
    return ErrorRestApi().response(
        status=401, errors=['You need to provide a username and password.'])
コード例 #5
0
ファイル: api.py プロジェクト: jnuyens/resolver
def update_representation(data, doc):
    ref = Representation.query.filter(
        Document.entity_id == doc.entity_id,
        Representation.reference == True).first()
    if data["reference"]:
        if ref:
            ref.reference = False
        doc.reference = True
    elif not ref:
        db.session.rollback()
        errors = [{
            'title':
            'Reference error',
            'detail':
            'At least one reference representation is required.'
        }]
        return ErrorRestApi().response(status=400, errors=errors)

    if 'order' in data and doc.order != data['order']:
        old_order = doc.order
        new_order = data['order']
        if new_order <= 0:
            db.session.rollback()
            errors = [{
                'title': 'Order error',
                'detail': 'Order must be larger than or equal to 1.'
            }]
            return ErrorRestApi().response(status=400, errors=errors)

        max_order = Representation.query.filter(
            Document.entity_id == doc.entity_id).count()
        if new_order > max_order:
            db.session.rollback()
            errors = [{'title': 'Order error', 'detail': 'Order too high.'}]
            return ErrorRestApi().response(status=400, errors=errors)

        docs = Representation.query.filter(Document.entity_id == doc.entity_id,
                                           Representation.order <= max(new_order, old_order),
                                           Representation.order >= min(new_order, old_order)) \
            .order_by(Representation.order.asc()).all()
        op = operator.add if new_order < old_order else operator.sub

        for d in docs:
            d.order = op(d.order, 1)

        doc.order = new_order

    db.session.commit()
    return RestApi().response(status=200, data={'data': doc.to_dict()})
コード例 #6
0
ファイル: api.py プロジェクト: jnuyens/resolver
def get_entity_by_original_id(original_id):
    out_data = EntityViewApi().get_original(original_id)
    if out_data:
        return RestApi().response(data={'data': out_data})
    else:
        return ErrorRestApi().response(status=404,
                                       errors=['Entity not found.'])
コード例 #7
0
ファイル: api.py プロジェクト: jnuyens/resolver
def delete_entity(id):
    ent = Entity.query.filter(Entity.id == id).first()
    if ent:
        db.session.delete(ent)
        db.session.commit()
        log(id, "Removed the entity `%s'" % ent)
        return "", 204
    else:
        return ErrorRestApi().response(status=404,
                                       errors=['Entity not found.'])
コード例 #8
0
ファイル: api.py プロジェクト: jnuyens/resolver
def update_data(data, doc):
    docs = Data.query.filter(Document.entity_id == doc.entity_id,
                             Data.format == data['format']).all()
    if len(docs) != 0:
        db.session.rollback()
        return ErrorRestApi().response(
            status=400,
            errors=[
                'Duplicate data format \'{0}\' for entity \'{1}\'.'.format(
                    data['format'], doc.entity_id)
            ])

    doc.format = data["format"]
    db.session.commit()

    return RestApi().response(status=200, data={'data': doc.to_dict()})
コード例 #9
0
ファイル: api.py プロジェクト: jnuyens/resolver
def api_job_status(job_id):
    csv_wrapper = CSVRedisWrapper()
    try:
        csv_wrapper.get_job(job_id)
    except RedisJobMissing:
        errors = [{
            'title': 'Job Not Found',
            'detail': 'Could not find the job with id {0}'.format(job_id)
        }]
        return ErrorRestApi().response(status=404, errors=errors)

    status = {'job': job_id, 'status': 'Running'}
    status_code = 202
    if csv_wrapper.failed():
        status['status'] = 'Failed'
        status_code = 400
    elif csv_wrapper.finished():
        status['status'] = 'Finished'
        status_code = 200
    return RestApi().response(status=status_code, data=status)
コード例 #10
0
ファイル: api.py プロジェクト: jnuyens/resolver
def get_document(id):
    doc = Document.query.filter(Document.id == id).first()
    if not doc:
        return ErrorRestApi().response(status=404,
                                       errors=['Document not found.'])
    return RestApi().response(status=201, data={'data': doc.to_dict()})
コード例 #11
0
ファイル: api.py プロジェクト: jnuyens/resolver
def create_document():
    try:
        data = json.loads(request.data)
        validate(data, document_schema)

        ent = Entity.query.filter(Entity.id == data['entity']).first()
        if not ent:
            return ErrorRestApi().response(status=400,
                                           errors=['Entity not found.'])

        if data['type'] == 'data':
            docs = Data.query.filter(Document.entity_id == ent.id,
                                     Data.format == data['format']).all()
            if len(docs) != 0:
                return ErrorRestApi().response(
                    status=400,
                    errors=[
                        'Duplicate data format \'{0}\' for entity.'.format(
                            data['format'])
                    ])
            doc = Data(ent.id, data['format'], data.get('url', ''),
                       data['enabled'], data.get('notes', ''))
        else:
            ref = Representation.query.filter(
                Document.entity_id == ent.id,
                Representation.reference == True).first()
            if data['reference']:
                if ref:
                    ref.reference = False
            elif not ref:
                errors = [{
                    'title':
                    'Reference error',
                    'detail':
                    'At least one reference representation is required.'
                }]
                return ErrorRestApi().response(status=400, errors=errors)

            highest = Representation.query. \
                filter(Document.entity_id == ent.id). \
                order_by(Representation.order.desc()).first()
            if highest:
                order = highest.order + 1
            else:
                order = 1

            doc = Representation(ent.id,
                                 order,
                                 url=data.get('url', ''),
                                 label=data.get('label', ''),
                                 enabled=data['enabled'],
                                 notes=data.get('form', ''),
                                 reference=data['reference'])

        db.session.add(doc)
        db.session.commit()
        log(doc.entity_id, "Added %s document `%s'" % (data['type'], doc))

        return RestApi().response(status=201, data={'data': doc.to_dict()})
    except ValueError as e:
        errors = [{
            'title':
            'Malformed request',
            'detail':
            'Expected correctly formatted JSON data: {0}'.format(e)
        }]
        return ErrorRestApi().response(status=400, errors=errors)
    except ValidationError as e:
        errors = [{
            'title':
            'Malformed request',
            'detail':
            'JSON data does not conform to schema: {0}'.format(e)
        }]
        return ErrorRestApi().response(status=400, errors=errors)
コード例 #12
0
ファイル: api.py プロジェクト: jnuyens/resolver
def update_entity(id):
    # With form-data, you also get the boundary after the first ';'
    content_type = request.headers['Content-Type'].split(';')
    if content_type[0] == 'application/x-www-form-urlencoded' \
            or content_type[0] == 'multipart/form-data':
        form = EntityForm(csrf_enabled=False)
        data = {
            'id': form.id.data,
            'title': form.title.data,
            'type': form.type.data
        }
    else:
        try:
            data = json.loads(request.data)
            validate(data, entity_schema)
        except ValueError as e:
            errors = [{
                'title':
                'Malformed request',
                'detail':
                'Expected correctly formatted JSON data: {0}'.format(e)
            }]
            return ErrorRestApi().response(status=400, errors=errors)
        except ValidationError as e:
            errors = [{
                'title':
                'Malformed request',
                'detail':
                'JSON data does not conform to schema: {0}'.format(e)
            }]
            return ErrorRestApi().response(status=400, errors=errors)

    ent = Entity.query.filter(Entity.id == id).first()
    if not ent:
        return ErrorRestApi().response(status=404,
                                       errors=['Entity not found.'])

    ent_str = str(ent)

    try:
        ent.id = data["id"]
        ent.title = data.get("title", "")
        ent.type = data["type"]
    except EntityPIDExistsException:
        db.session.rollback()
        return ErrorRestApi().response(
            status=409,
            errors=['Duplicate ID \'{0}\' for entity.'.format(data['id'])])
    except EntityCollisionException as e:
        db.session.rollback()
        errors = [{
            'title':
            'ID collision',
            'detail':
            'The provided ID \'{0}\' collides with the existing ID \'{0}\'.'.
            format(data['id'], e.original_id)
        }]
        return ErrorRestApi().response(status=409, errors=errors)

    db.session.commit()
    log(ent.id, "Changed entity from `%s' to `%s'" % (ent_str, ent))

    return RestApi().response(
        data={'data': EntityViewApi().output(entity=ent)})