def dispatch_request(self, *args, **kwargs): # Taken from flask #noinspection PyUnresolvedReferences meth = getattr(self, request.method.lower(), None) if meth is None and request.method == 'HEAD': meth = getattr(self, 'get', None) assert meth is not None, 'Unimplemented method %r' % request.method for decorator in self.method_decorators: meth = decorator(meth) resp = meth(*args, **kwargs) if isinstance(resp, ResponseBase): # There may be a better way to test return resp representations = self.representations or {} #noinspection PyUnresolvedReferences for mediatype in self.mediatypes(): if mediatype in representations: data, code, headers = unpack(resp) resp = representations[mediatype](data, code, headers) resp.headers['Content-Type'] = mediatype return resp return resp
def wrapper(*args, **kwargs): response, status, h = unpack(f(*args, **kwargs)) if status == 200 and self.attribute in response: instance = i_manager.instances.get(self.resource.region) resource_args = self.resource.parsers["get"].parse_args() show_bss_stands = resource_args.get( 'bss_stands') or 'bss_stands' in resource_args.get( 'add_poi_infos') show_car_park = 'car_park' in resource_args.get( 'add_poi_infos') if show_bss_stands and instance and instance.bss_provider: _handle(response, bss_provider_manager, self.attribute, self.logger, 'Error while handling BSS realtime availability') if show_car_park and instance and instance.car_park_provider: _handle( response, car_park_provider_manager, self.attribute, self.logger, 'Error while handling car park realtime availability') return response, status, h
def wrapper(*args, **kwargs): resp = f(*args, **kwargs) if isinstance(resp, tuple): data, code, headers = unpack(resp) return self.field.format(data), code, headers return self.field.format(resp)
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if self.resource.region: collection = { "notes": { "type": "notes", "del": ["value"] }, "exceptions": { "type": "exceptions", "del": ["date", "except_type"] } } # Add notes exceptions for col in collection: if not col in data or not isinstance(data[col], list): data[col] = [] res = [] note = self.complete(data, collection[col]) [res.append(item) for item in note if not item in res] data[col].extend(res) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if isinstance(data, dict) or isinstance(data, OrderedDict): data = self.prepare_objetcs(data) kwargs = self.prepare_kwargs(kwargs, data) kwargs["templated"] = True for link in self.links: kwargs["rel"] = link data["links"].append( create_external_link("v1.{}".format(link), **kwargs)) for link, uri in self.links_uri.items(): kwargs["rel"] = link if uri is not None: kwargs["uri"] = uri data["links"].append( create_external_link("v1.{}".format(link), **kwargs)) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): resp = resource(*args, **kwargs) if isinstance(resp, ResponseBase): # There may be a better way to test return resp data, code, headers = unpack(resp) return self.make_response(data, code, headers=headers)
def wrapper(*args, **kwargs): resp = f(*args, **kwargs) if isinstance(resp, tuple): data, code, headers = unpack(resp) return marshal(data, self.fields), code, headers else: return marshal(resp, self.fields)
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects self.get_objets(data) data = self.prepare_objetcs(objects, True) kwargs = self.prepare_kwargs(kwargs, data) uri_id = None if "id" in kwargs and\ "collection" in kwargs and \ kwargs["collection"] in data: uri_id = kwargs["id"] for obj in self.data: kwargs["collection"] = resource_type_to_collection.get(obj, obj) if kwargs["collection"] in collections_to_resource_type: if not uri_id: kwargs["id"] = "{" + obj + ".id}" endpoint = "v1." + kwargs["collection"] + "." endpoint += "id" if "region" in kwargs or\ "lon" in kwargs\ else "redirect" collection = kwargs["collection"] to_pass = {k:v for k,v in kwargs.iteritems() if k != "collection"} data["links"].append(create_external_link(url=endpoint, rel=collection, _type=obj, templated=True, **to_pass)) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): resp = f(*args, **kwargs) if isinstance(resp, tuple): data, code, headers = unpack(resp) return marshal(data, self.fields, self.envelope), code, headers else: return marshal(resp, self.fields, self.envelope)
def wrapper(*args, **kwargs): include = _get_fields_to_include(self.fields) response = f(*args, **kwargs) if isinstance(response, tuple): data, code, headers = unpack(response) return marshal(data, include), code, headers else: return marshal(response, include)
def _wrapper(*args, **kwargs): data, code, headers = unpack(fn(*args, **kwargs)) etag = ResourceBase.get_etag(data) if 'If-None-Match' in request.headers and request.headers['If-None-Match'] == etag: return None, 304, headers headers['ETag'] = etag return data, code, headers
def wrapper(*args, **kwargs): response = f(*args, **kwargs) if isinstance(response, tuple): data, code, header = unpack(response) else: data = response collection = None kwargs["_external"] = True templated = True for key in data.keys(): if key in collections_to_resource_type.keys(): collection = key if key in resource_type_to_collection.keys(): collection = resource_type_to_collection[key] if collection is None: return response kwargs["uri"] = collection + '/' if "id" in kwargs.keys(): kwargs["uri"] += kwargs["id"] del kwargs["id"] templated = False else: kwargs["uri"] += '{' + collection + ".id}" if collection in ['stop_areas', 'stop_points', 'lines', 'routes', 'addresses'] and "region" in kwargs: for api in ['route_schedules', 'stop_schedules', 'arrivals', 'departures', "places_nearby"]: data['links'].append({ "href": url_for("v1." + api, **kwargs), "rel": api, "templated": templated }) if collection in ['stop_areas', 'stop_points', 'addresses']: data['links'].append({ "href": url_for("v1.journeys", **kwargs), "rel": "journeys", "templated": templated }) #for lines we add the link to the calendars if 'region' in kwargs: if collection == 'lines': data['links'].append({ "href": url_for("v1.calendars", **kwargs), "rel": "calendars", "templated": templated }) if collection in ['stop_areas', 'lines', 'networks']: data['links'].append({ "href": url_for("v1.traffic_reports", **kwargs), "rel": "disruptions", "templated": templated }) if isinstance(response, tuple): return data, code, header else: return data
def dispatch_request(self, *args, **kwargs): import os, time f = None if os.path.exists('/tmp/time.log'): try: f = open('/tmp/time.log','a') except IOError as e: pass # Taken from flask #noinspection PyUnresolvedReferences start_time = time.time() time_string = '{start_time}:::{end_time}:::{base_url}:::{args}:::{data}\n' meth = getattr(self, request.method.lower(), None) if meth is None and request.method == 'HEAD': meth = getattr(self, 'get', None) assert meth is not None, 'Unimplemented method %r' % request.method for decorator in self.method_decorators: meth = decorator(meth) resp = meth(*args, **kwargs) if isinstance(resp, ResponseBase): # There may be a better way to test end_time = time.time() time_string = time_string.format(start_time = start_time, end_time = end_time, args = str(request.args), data = request.data.replace('\n',' '), base_url = request.base_url) print time_string if f: f.write(time_string) f.flush() return resp representations = self.representations or {} #noinspection PyUnresolvedReferences mediatype = request.accept_mimetypes.best_match(representations, default=None) if mediatype in representations: data, code, headers = unpack(resp) resp = representations[mediatype](data, code, headers) resp.headers['Content-Type'] = mediatype end_time = time.time() time_string = time_string.format(start_time = start_time, end_time = end_time, args = str(request.args), data = request.data.replace('\n',' '), base_url = request.base_url) print time_string if f: f.write(time_string) f.flush() return resp end_time = time.time() time_string = time_string.format(start_time = start_time, end_time = end_time, args = str(request.args), data = request.data.replace('\n',' '), base_url = request.base_url) print time_string if f: f.write(time_string) f.flush() return resp
def wrapper(*args, **kwargs): response = func(*args, **kwargs) cors_headers = { "Access-Control-Allow-Origin": allow_origin, "Access-Control-Allow-Methods": func.__name__.upper(), "Access-Control-Allow-Headers": allow_headers, "Access-Control-Max-Age": max_age, } data, code, headers = unpack(response) headers.update(cors_headers) return data, code, headers
def wrapper(*args, **kwargs): """Implement the W3C specification at http://www.w3.org/TR/cors/#resource-processing-model""" resp = func(*args, **kwargs) if "Origin" not in request.headers: return resp else: data, code, headers = unpack(resp) cors_headers = self.get_headers(func) cors_headers.update(headers) return data, code, cors_headers
def jsonify_response(response): """ JSONifies the response with Flask-RESTful's output_json. Returns a Flask Response """ data, code, headers = unpack(response) response = output_json(data, code, headers) response.headers['Content-Type'] = 'application/json' if code == 204: del response.headers['Content-Type'] return response
def decorator(*args, **kwargs): if isinstance(request.json, list): results = [] for item in list(request.json): request._cached_json = item results.append(unpack(f(*args, **kwargs))) results, status_codes, headers = zip(*results) if 400 in status_codes: db.session.rollback() status_code = 400 else: status_code = 200 return results, status_code else: return f(*args, **kwargs)
def wrapper(*args, **kwargs): response, status, h = unpack(f(*args, **kwargs)) if status == 200 and self.attribute in response: instance = i_manager.instances.get(self.resource.region) if instance and instance.bss_provider: add_bss_availability = bss_provider_manager.handle_journeys if self.attribute == 'journeys' \ else bss_provider_manager.handle_places try: response[self.attribute] = add_bss_availability( response[self.attribute]) except: logger = logging.getLogger(__name__) logger.exception( 'Error while handling BSS realtime availability') return response, status, h
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if isinstance(data, OrderedDict): data = self.prepare_objetcs(data) kwargs = self.prepare_kwargs(kwargs, data) data["links"].append(create_external_link("v1.coverage", rel='related', templated=True, **kwargs)) if isinstance(objects, tuple): return data, code, header else: return data
def envelopify_response(response): """ Wrap the response in an envelope for JSONP calls or if envelope=true is specifically passed as an argument. Envelope-wrapped responses all return a 200 HTTP status code with the actual response code embedded in the envelope. Returns a response tuple. """ options = response_options.parse_args() if options.get('envelope') or options.get('callback'): data, code, headers = unpack(response) data = dict(status=code, data=data) if headers: data['headers'] = headers return data, 200, headers return response
def wrapper(*args, **kwargs): response = f(*args, **kwargs) if isinstance(response, tuple): data, code, header = unpack(response) if code != 200: return data, code, header else: data = response if (isinstance(data, dict) or isinstance(data, OrderedDict)) and "links" in data: for link in data['links']: link['href'] = link['href'].replace("%7B", "{")\ .replace("%7D", "}")\ .replace("%3B", ";") if isinstance(response, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if isinstance(data, dict) or isinstance(data, OrderedDict): data = self.prepare_objetcs(objects, True) kwargs = self.prepare_kwargs(kwargs, data) for collection in self.collections: data["links"].append(create_external_link("v1.{c}.collection".format(c=collection), rel=collection, templated=True, **kwargs)) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if self.resource.region and "journeys" in data: all_disruptions = {d['id']: d for d in data['disruptions']} for journey in data["journeys"]: self.update_status(journey, all_disruptions) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects self.get_objets(data) data = self.prepare_objetcs(objects, True) kwargs = self.prepare_kwargs(kwargs, data) if 'region' not in kwargs and 'lon' not in kwargs: # we don't know how to put links on this object, there is no coverage, we don't add links return objects uri_id = None if "id" in kwargs and "collection" in kwargs and kwargs[ "collection"] in data: uri_id = kwargs["id"] for obj in self.data: kwargs["collection"] = resource_type_to_collection.get( obj, obj) if kwargs["collection"] in collections_to_resource_type: if not uri_id: kwargs["id"] = "{" + obj + ".id}" endpoint = "v1." + kwargs["collection"] + ".id" collection = kwargs["collection"] to_pass = { k: v for k, v in kwargs.items() if k != "collection" } data["links"].append( create_external_link(url=endpoint, rel=collection, _type=obj, templated=True, **to_pass)) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects if isinstance(data, OrderedDict): data = self.prepare_objetcs(data) kwargs = self.prepare_kwargs(kwargs, data) url = url_for("v1.coverage", _external=True, **kwargs) data["links"].append({ "href": url, "rel": "related", "templated": True }) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects self.get_objets(data) data = self.prepare_objetcs(objects, True) kwargs = self.prepare_kwargs(kwargs, data) uri_id = None if "id" in kwargs.keys() and\ "collection" in kwargs.keys() and \ kwargs["collection"] in data.keys(): uri_id = kwargs["id"] for obj in self.data: if obj in resource_type_to_collection.keys(): kwargs["collection"] = resource_type_to_collection[obj] else: kwargs["collection"] = obj if kwargs["collection"] in collections_to_resource_type.keys(): if not uri_id: kwargs["id"] = "{" + obj + ".id}" endpoint = "v1." + kwargs["collection"] + "." endpoint += "id" if "region" in kwargs.keys() or\ "lon" in kwargs.keys()\ else "redirect" del kwargs["collection"] url = url_for(endpoint, _external=True, **kwargs) data["links"].append({ "href": url, "rel": obj, "templated": True }) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects def update_status(journey, _items): if isinstance(_items, list) or isinstance(_items, tuple): for item in _items: update_status(journey, item) elif isinstance(_items, dict) or\ isinstance(_items, OrderedDict): if 'messages' in _items.keys(): for msg in _items["messages"]: if not "status" in journey.keys(): journey["status"] = msg["level"] else: desc = type_pb2.Message.DESCRIPTOR fields = desc.fields_by_name f_status = fields['message_status'].enum_type values = f_status.values_by_name status = values[journey["status"]] level = values[msg["level"]] if status < level: journey["status"] = msg["level"] else: for v in _items.items(): update_status(journey, v) if self.resource.region and "journeys" in data: for journey in data["journeys"]: update_status(journey, journey) if isinstance(objects, tuple): return data, code, header else: return data
def wrapper(*args, **kwargs): if hasattr(request, "__skip_marshalling"): return f(*args, **kwargs) fields_to_include = _get_fields_to_include(self.response_class.resource_fields) if _is_include_parameter_in_request(): # only pushing "_include" into kwargs when the request # contained this parameter, to keep things cleaner (identical # behavior for passing "_include" which contains all fields) kwargs["_include"] = fields_to_include.keys() response = f(*args, **kwargs) if isinstance(response, responses_v2.ListResponse): wrapped_items = self.wrap_with_response_object(response.items) response.items = marshal(wrapped_items, fields_to_include) return marshal(response, responses_v2.ListResponse.resource_fields) if isinstance(response, tuple): data, code, headers = unpack(response) data = self.wrap_with_response_object(data) return marshal(data, fields_to_include), code, headers else: response = self.wrap_with_response_object(response) return marshal(response, fields_to_include)
def test_unpack(): yield check_unpack, ("hey", 200, {}), unpack("hey") yield check_unpack, (("hey", ), 200, {}), unpack(("hey", )) yield check_unpack, ("hey", 201, {}), unpack(("hey", 201)) yield check_unpack, ("hey", 201, "foo"), unpack(("hey", 201, "foo")) yield check_unpack, (["hey", 201], 200, {}), unpack(["hey", 201])
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects endpoint = None pagination = None if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects for key, value in data.iteritems(): if key == "regions": endpoint = "v1.coverage" elif key == "pagination": pagination = value elif key in collections_to_resource_type.keys(): endpoint = "v1." + key + "." endpoint += "id" if "id" in kwargs else "collection" elif key in ["journeys", "stop_schedules", "route_schedules", "departures", "arrivals", "places_nearby", "calendars"]: endpoint = "v1." + key if pagination and endpoint and "region" in kwargs: pagination = data["pagination"] if "start_page" in pagination and \ "items_on_page" in pagination and \ "items_per_page" in pagination and \ "total_result" in pagination: if "links" not in data: data["links"] = [] start_page = int(pagination["start_page"]) items_per_page = int(pagination["items_per_page"]) items_on_page = int(pagination["items_on_page"]) total_result = int(pagination["total_result"]) kwargs["_external"] = True if start_page > 0: kwargs["start_page"] = start_page - 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "previous", "templated": False }) nb_next_page = items_per_page * start_page nb_next_page += items_on_page if total_result > nb_next_page: kwargs["start_page"] = start_page + 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "next", "templated": False }) if items_per_page == 0 or total_result == 0: kwargs["start_page"] = 0 else: nb_last_page = total_result - 1 nb_last_page = nb_last_page / items_per_page kwargs["start_page"] = nb_last_page data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "last", "templated": False }) del kwargs["start_page"] data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "first", "templated": False }) if isinstance(objects, tuple): return data, code, header else: return data
def test_unpack(): yield check_unpack, ("hey", 200, {}), unpack("hey") yield check_unpack, (("hey",), 200, {}), unpack(("hey",)) yield check_unpack, ("hey", 201, {}), unpack(("hey", 201)) yield check_unpack, ("hey", 201, "foo"), unpack(("hey", 201, "foo")) yield check_unpack, (["hey", 201], 200, {}), unpack(["hey", 201])
def wrapper(*args, **kwargs): objects = f(*args, **kwargs) if objects[1] != 200: return objects if isinstance(objects, tuple): data, code, header = unpack(objects) else: data = objects pagination = data.get('pagination', None) endpoint = request.endpoint if pagination and endpoint and "region" in kwargs: if "start_page" in pagination and \ "items_on_page" in pagination and \ "items_per_page" in pagination and \ "total_result" in pagination: if "links" not in data: data["links"] = [] start_page = int(pagination["start_page"]) items_per_page = int(pagination["items_per_page"]) items_on_page = int(pagination["items_on_page"]) total_result = int(pagination["total_result"]) kwargs["_external"] = True if start_page > 0: kwargs["start_page"] = start_page - 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "previous", "templated": False }) nb_next_page = items_per_page * start_page nb_next_page += items_on_page if total_result > nb_next_page: kwargs["start_page"] = start_page + 1 data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "next", "templated": False }) if items_per_page == 0 or total_result == 0: kwargs["start_page"] = 0 else: nb_last_page = total_result - 1 nb_last_page = nb_last_page / items_per_page kwargs["start_page"] = nb_last_page data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "last", "templated": False }) del kwargs["start_page"] data["links"].append({ "href": url_for(endpoint, **kwargs), "type": "first", "templated": False }) if isinstance(objects, tuple): return data, code, header else: return data