def validate_json_data(request):
    try:
        json = request.json_body
    except ValueError as e:
        request.errors.add('body', 'data', str(e))
        request.errors.status = 422
        raise error_handler(request.errors)
    if not isinstance(json, dict) or 'data' not in json or not isinstance(
            json.get('data'), dict):
        request.errors.add('body', 'data', "Data not available")
        request.errors.status = 422
        raise error_handler(request.errors)
    request.validated['json_data'] = json['data']
    return json['data']
Пример #2
0
def extract_inspection(request):
    key = "inspection_id"
    uid = request.matchdict.get(key)
    if uid:
        db = request.registry.db
        doc = db.get(uid)
        if doc is not None and doc.get('doc_type') == 'inspection':
            request.errors.add('url', key, 'Archived')
            request.errors.status = 410
            raise error_handler(request.errors)
        elif doc is None or doc.get('doc_type') != 'Inspection':
            request.errors.add('url', key, 'Not Found')
            request.errors.status = 404
            raise error_handler(request.errors)

        return request.inspection_from_data(doc)
Пример #3
0
def extract_request(request):
    key = "request_id"
    uid = request.matchdict.get(key)
    if uid:
        db = request.registry.db
        doc = db.get(uid)
        if doc is not None and doc.get("doc_type") == "request":
            request.errors.add("url", key, "Archived")
            request.errors.status = 410
            raise error_handler(request.errors)
        elif doc is None or doc.get("doc_type") != "Request":
            request.errors.add("url", key, "Not Found")
            request.errors.status = 404
            raise error_handler(request.errors)

        return request.request_from_data(doc)
Пример #4
0
def validate_data(request, model, partial=False, data=None):
    if data is None:
        data = validate_json_data(request)
    try:
        if partial and isinstance(request.context, model):
            initial_data = request.context.serialize()
            m = model(initial_data)
            new_patch = apply_data_patch(initial_data, data)
            if new_patch:
                m.import_data(new_patch, partial=True, strict=True)
            m.__parent__ = request.context.__parent__
            m.validate()
            role = request.context.get_role()
            method = m.to_patch
        else:
            m = model(data)
            m.__parent__ = request.context
            m.validate()
            method = m.serialize
            role = 'create'
    except (ModelValidationError, ModelConversionError), e:
        for i in e.message:
            request.errors.add('body', i, e.message[i])
        request.errors.status = 422
        raise error_handler(request.errors)
Пример #5
0
def validate_json_data(request):
    try:
        json = request.json_body
    except ValueError, e:
        request.errors.add('body', 'data', e.message)
        request.errors.status = 422
        raise error_handler(request.errors)
def validate_data(request, model, partial=False, data=None):
    if data is None:
        data = validate_json_data(request)
    try:
        if partial and isinstance(request.context, model):
            initial_data = request.context.serialize()
            m = model(initial_data)
            new_patch = apply_data_patch(initial_data, data)
            if new_patch:
                m.import_data(new_patch, partial=True, strict=True)
            m.__parent__ = request.context.__parent__
            m.validate()
            role = request.context.get_role()
            method = m.to_patch
        else:
            m = model(data)
            m.__parent__ = request.context
            m.validate()
            method = m.serialize
            role = 'create'
    except (ModelValidationError, ModelConversionError) as e:
        for i in e.messages:
            request.errors.add('body', i, e.messages[i])
        request.errors.status = 422
        raise error_handler(request.errors)
    except ValueError as e:
        request.errors.add('body', 'data', e.args[0])
        request.errors.status = 422
        raise error_handler(request.errors)
    else:
        if hasattr(type(m), '_options') and role not in type(m)._options.roles:
            request.errors.add('url', 'role', 'Forbidden')
            request.errors.status = 403
            raise error_handler(request.errors)
        else:
            data = method(role)
            request.validated['data'] = data
            if not partial:
                m = model(data)
                m.__parent__ = request.context
                if model._options.namespace:
                    request.validated[model._options.namespace.lower()] = m
                else:
                    request.validated[model.__name__.lower()] = m
    return data
def extract_monitoring_adapter(request, monitoring_id):
    db = request.registry.db
    doc = db.get(monitoring_id)
    if doc is None or doc.get('doc_type') != 'Monitoring':
        request.errors.add('url', 'monitoring_id', 'Not Found')
        request.errors.status = 404
        raise error_handler(request.errors)

    return request.monitoring_from_data(doc)
def _validate_elimination_report_status(request):
    monitoring = request.validated['monitoring']
    if monitoring.status != ADDRESSED_STATUS:
        request.errors.status = 422
        request.errors.add(
            'body', 'eliminationReport',
            'Can\'t update in current {} monitoring status.'.format(
                monitoring.status))
        raise error_handler(request.errors)
Пример #9
0
def validate_file_upload(request):
    update_logging_context(request, {'document_id': '__new__'})
    if request.registry.docservice_url and request.content_type == "application/json":
        return validate_document_data(request)
    if 'file' not in request.POST or not hasattr(request.POST['file'],
                                                 'filename'):
        request.errors.add('body', 'file', 'Not Found')
        request.errors.status = 404
        raise error_handler(request.errors)
    else:
        request.validated['file'] = request.POST['file']
def validate_appeal_data(request):
    """
    Validate appeal report data POST
    """
    monitoring = request.validated['monitoring']
    if monitoring.appeal is not None:
        raise_operation_error(request, "Can't post another appeal.")

    if monitoring.conclusion is None or monitoring.conclusion.datePublished is None:
        request.errors.status = 422
        request.errors.add('body', 'appeal',
                           'Can\'t post before conclusion is published.')
        raise error_handler(request.errors)

    return validate_data(request, Appeal)
def validate_monitoring_data(request):
    """
    Validate monitoring data POST
    """
    update_logging_context(request, {'MONITOR_ID': '__new__'})
    data = validate_data(request, Monitoring)

    monitoring = request.validated['monitoring']
    if monitoring.status != DRAFT_STATUS:
        request.errors.add(
            'body', 'status',
            "Can't create a monitoring in '{}' status.".format(
                monitoring.status))
        request.errors.status = 422
        raise error_handler(request.errors)
    return data
def _validate_patch_monitoring_fields(request):
    """
    Check sent data that is not allowed in current status
    acceptable fields are set in Monitor.Options.roles: edit_draft, edit_active, etc
    """
    provided = set(request.validated['json_data'].keys())
    allowed = set(request.validated['data'].keys())
    difference = provided - allowed
    if difference:
        for i in difference:
            request.errors.add(
                'body', i,
                'This field cannot be updated in the {} status.'.format(
                    request.validated['monitoring']['status']))
        request.errors.status = 422
        raise error_handler(request.errors)
def _validate_patch_monitoring_status(request):
    """
    Check that monitoring status change is allowed
    """
    status = request.validated['json_data'].get('status')
    if status is not None and status != request.context.status:
        function_name = '_validate_patch_monitoring_status_{}_to_{}'.format(
            request.context.status, status)
        try:
            func = globals()[function_name]
        except KeyError:
            request.errors.add(
                'body', 'status',
                'Status update from "{}" to "{}" is not allowed.'.format(
                    request.context.status, status))
            request.errors.status = 422
            raise error_handler(request.errors)
        else:
            return func(request)
Пример #14
0
def get_item(parent, key, request):
    request.validated['{}_id'.format(key)] = request.matchdict['{}_id'.format(
        key)]
    plural = '{}ies'.format(key[0:-1]) if key[-1] == 'y' else '{}s'.format(key)
    items = [
        i for i in getattr(parent, plural, [])
        if i.id == request.matchdict['{}_id'.format(key)]
    ]
    if not items:
        from openprocurement.audit.api.utils import error_handler
        request.errors.add('url', '{}_id'.format(key), 'Not Found')
        request.errors.status = 404
        raise error_handler(request.errors)
    else:
        if key == 'document':
            request.validated[plural] = items
        item = items[-1]
        request.validated[key] = item
        request.validated['id'] = request.matchdict['{}_id'.format(key)]
        item.__parent__ = parent
        return item
def _validate_patch_monitoring_status_to_stopped_or_cancelled(request):
    if not request.validated.get('data', {}).get('cancellation'):
        request.errors.status = 422
        request.errors.add('body', 'cancellation', 'This field is required.')
        raise error_handler(request.errors)
def _validate_patch_monitoring_status_active_to_addressed_or_declined(request):
    if not request.validated.get('data', {}).get('conclusion'):
        request.errors.status = 422
        request.errors.add('body', 'conclusion', 'This field is required.')
        raise error_handler(request.errors)
def _validate_patch_monitoring_status_draft_to_active(request):
    if not request.validated.get('data', {}).get('decision'):
        request.errors.status = 422
        request.errors.add('body', 'decision', 'This field is required.')
        raise error_handler(request.errors)
Пример #18
0
    "DELETE": "delete"
}


def validate_json_data(request):
    try:
        json = request.json_body
    except ValueError, e:
        request.errors.add('body', 'data', e.message)
        request.errors.status = 422
        raise error_handler(request.errors)
    if not isinstance(json, dict) or 'data' not in json or not isinstance(
            json.get('data'), dict):
        request.errors.add('body', 'data', "Data not available")
        request.errors.status = 422
        raise error_handler(request.errors)
    request.validated['json_data'] = json['data']
    return json['data']


def validate_data(request, model, partial=False, data=None):
    if data is None:
        data = validate_json_data(request)
    try:
        if partial and isinstance(request.context, model):
            initial_data = request.context.serialize()
            m = model(initial_data)
            new_patch = apply_data_patch(initial_data, data)
            if new_patch:
                m.import_data(new_patch, partial=True, strict=True)
            m.__parent__ = request.context.__parent__