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)
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)
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"})
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'})