Example #1
0
    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
Example #3
0
        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)
Example #4
0
        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)
Example #5
0
    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
Example #6
0
        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
Example #7
0
 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
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
 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
Example #11
0
 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)
Example #12
0
 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)
Example #13
0
 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)
Example #14
0
        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
Example #15
0
 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
Example #16
0
    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
Example #17
0
 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
Example #18
0
 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
Example #19
0
File: api.py Project: linjoey/ltc
 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
Example #20
0
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
Example #21
0
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
Example #22
0
 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)
Example #23
0
 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
Example #24
0
 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
Example #25
0
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
Example #26
0
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
Example #27
0
 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
Example #28
0
 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
Example #29
0
        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
Example #30
0
        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
Example #31
0
 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
Example #32
0
 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
Example #33
0
        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
Example #34
0
        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)
Example #35
0
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])
Example #36
0
        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
Example #37
0
 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)
Example #38
0
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])
Example #39
0
        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