Exemple #1
0
def api_get_request(request_id):
    # should we return old-style results alongside new style?
    legacy = parse_bool(request.args.get("legacy", True))

    with closing(connect_db()) as db:
        actual_db = db[DB_NAME]
        sr = actual_db[COLLECTION_CASES].find_one({"_id": request_id})
        if sr and sr["requests"][0]["srs-TYPE_CODE"] in g.accepted_services:
            data = [sr_format.format_case(sr, actual_db, legacy=legacy)]

            def json_formatter(obj):
                if isinstance(obj, datetime.datetime):
                    return obj.isoformat()
                raise TypeError(repr(o) + " is not JSON serializable")

            output = json.dumps(data, default=json_formatter)
            return (output, 200, {"Content-type": "application/json"})

    return ("No such service request", 404, None)
Exemple #2
0
def api_get_request(request_id):
    # should we return old-style results alongside new style?
    legacy = parse_bool(request.args.get('legacy', True))

    with closing(connect_db()) as db:
        actual_db = db[DB_NAME]
        sr = actual_db[COLLECTION_CASES].find_one({"_id": request_id})
        if sr and sr['requests'][0]['srs-TYPE_CODE'] in g.accepted_services:
            data = [sr_format.format_case(sr, actual_db, legacy=legacy)]

            def json_formatter(obj):
                if isinstance(obj, datetime.datetime):
                    return obj.isoformat()
                raise TypeError(repr(o) + " is not JSON serializable")

            output = json.dumps(data, default=json_formatter)
            return (output, 200, {'Content-type': 'application/json'})

    return ("No such service request", 404, None)
Exemple #3
0
def api_get_requests():
    # should we return old-style results alongside new style?
    legacy = parse_bool(request.args.get("legacy", True))

    # paging
    page_size = app.config["DEFAULT_PAGE_SIZE"]
    if "page_size" in request.args and request.args["page_size"].isdigit():
        page_size = int(request.args["page_size"])
    page_size = min(app.config["MAX_PAGE_SIZE"], page_size)
    if page_size <= 0:
        page_size = app.config["DEFAULT_PAGE_SIZE"]
    page = 1
    if "page" in request.args and request.args["page"].isdigit():
        page = max(1, int(request.args["page"]))

    # date ranges
    start_requested_datetime = request.args.get("start_date", type=parse_date)
    end_requested_datetime = request.args.get("end_date", type=parse_date)
    # 'start_updated_date' and 'end_updated_date' are legacy, so try them if 'updated_*' isn't present
    start_updated_datetime = request.args.get("updated_after", request.args.get("start_updated_date"), type=parse_date)
    end_updated_datetime = request.args.get("updated_before", request.args.get("end_updated_date"), type=parse_date)
    # NOTE: no attempt to limit the dates to 90 day ranges as per spec because we are doing paging

    # listed args can come in two formats:
    # ?service_request_id=id&service_request_id=id
    # ?service_request_id=id,id
    service_request_id = flattened_arg_list("service_request_id")
    status = flattened_arg_list("status")
    service_code = flattened_arg_list("service_code")
    # limit service codes to the accepted ones
    if service_code:
        service_code = filter(lambda code: code in g.accepted_services, service_code)
    else:
        service_code = g.accepted_services

    # CUSTOM: datetime_type (one of 'requested' or 'updated')
    order_default = (
        (
            not start_requested_datetime
            and not end_requested_datetime
            and (start_updated_datetime or end_updated_datetime)
        )
        and "updated"
        or "requested"
    )
    order_by = request.args.get(
        "order_by",
        default=order_default,
        type=lambda value: value in ("requested", "updated") and value or order_default,
    )
    order_by = "%s_datetime" % order_by

    with closing(connect_db()) as db:
        actual_db = db[DB_NAME]
        query = {}
        if start_requested_datetime or end_requested_datetime:
            date_query = {}
            if start_requested_datetime:
                date_query["$gte"] = start_requested_datetime
            if end_requested_datetime:
                date_query["$lte"] = end_requested_datetime
            query["requested_datetime"] = date_query
        if start_updated_datetime or end_updated_datetime:
            date_query = {}
            if start_updated_datetime:
                date_query["$gte"] = start_updated_datetime
            if end_updated_datetime:
                date_query["$lte"] = end_updated_datetime
            query["updated_datetime"] = date_query
        if service_request_id:
            query["_id"] = {"$in": service_request_id}
        if service_code:
            query["service_code"] = {"$in": service_code}
        if status:
            query["status"] = {"$in": status}

        srs = (
            actual_db[COLLECTION_CASES]
            .find(query)
            .sort(order_by, pymongo.DESCENDING)
            .skip((page - 1) * page_size)
            .limit(page_size)
        )
        data = map(lambda sr: sr_format.format_case(sr, actual_db, legacy=legacy), srs)

        def json_formatter(obj):
            if isinstance(obj, datetime.datetime):
                return obj.isoformat()
            raise TypeError(repr(o) + " is not JSON serializable")

        output = json.dumps(data, default=json_formatter)
        return (output, 200, {"Content-type": "application/json"})
Exemple #4
0
def api_get_requests():
    # should we return old-style results alongside new style?
    legacy = parse_bool(request.args.get('legacy', True))

    # paging
    page_size = app.config['DEFAULT_PAGE_SIZE']
    if 'page_size' in request.args and request.args['page_size'].isdigit():
        page_size = int(request.args['page_size'])
    page_size = min(app.config['MAX_PAGE_SIZE'], page_size)
    if page_size <= 0:
        page_size = app.config['DEFAULT_PAGE_SIZE']
    page = 1
    if 'page' in request.args and request.args['page'].isdigit():
        page = max(1, int(request.args['page']))

    # date ranges
    start_requested_datetime = request.args.get('start_date', type=parse_date)
    end_requested_datetime = request.args.get('end_date', type=parse_date)
    # 'start_updated_date' and 'end_updated_date' are legacy, so try them if 'updated_*' isn't present
    start_updated_datetime = request.args.get(
        'updated_after',
        request.args.get('start_updated_date'),
        type=parse_date)
    end_updated_datetime = request.args.get(
        'updated_before',
        request.args.get('end_updated_date'),
        type=parse_date)
    # NOTE: no attempt to limit the dates to 90 day ranges as per spec because we are doing paging

    # listed args can come in two formats:
    # ?service_request_id=id&service_request_id=id
    # ?service_request_id=id,id
    service_request_id = flattened_arg_list('service_request_id')
    status = flattened_arg_list('status')
    service_code = flattened_arg_list('service_code')
    # limit service codes to the accepted ones
    if service_code:
        service_code = filter(lambda code: code in g.accepted_services,
                              service_code)
    else:
        service_code = g.accepted_services

    # CUSTOM: datetime_type (one of 'requested' or 'updated')
    order_default = (not start_requested_datetime
                     and not end_requested_datetime and
                     (start_updated_datetime
                      or end_updated_datetime)) and 'updated' or 'requested'
    order_by = request.args.get(
        'order_by',
        default=order_default,
        type=lambda value: value in
        ('requested', 'updated') and value or order_default)
    order_by = '%s_datetime' % order_by

    with closing(connect_db()) as db:
        actual_db = db[DB_NAME]
        query = {}
        if start_requested_datetime or end_requested_datetime:
            date_query = {}
            if start_requested_datetime:
                date_query['$gte'] = start_requested_datetime
            if end_requested_datetime:
                date_query['$lte'] = end_requested_datetime
            query['requested_datetime'] = date_query
        if start_updated_datetime or end_updated_datetime:
            date_query = {}
            if start_updated_datetime:
                date_query['$gte'] = start_updated_datetime
            if end_updated_datetime:
                date_query['$lte'] = end_updated_datetime
            query['updated_datetime'] = date_query
        if service_request_id:
            query['_id'] = {'$in': service_request_id}
        if service_code:
            query['service_code'] = {'$in': service_code}
        if status:
            query['status'] = {'$in': status}

        srs = actual_db[COLLECTION_CASES].find(query).sort(
            order_by, pymongo.DESCENDING).skip(
                (page - 1) * page_size).limit(page_size)
        data = map(
            lambda sr: sr_format.format_case(sr, actual_db, legacy=legacy),
            srs)

        def json_formatter(obj):
            if isinstance(obj, datetime.datetime):
                return obj.isoformat()
            raise TypeError(repr(o) + " is not JSON serializable")

        output = json.dumps(data, default=json_formatter)
        return (output, 200, {'Content-type': 'application/json'})