Beispiel #1
0
    def top_level(self, request, api_name=None):
        """This is the same method in the Api model with the execption
        of the serializer used. This uses the SafeSerializer.
        """
        serializer = SafeSerializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry):
            available_resources[name] = {
                'list_endpoint': self._build_reverse_url("api_dispatch_list", kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
                'schema': self._build_reverse_url("api_get_schema", kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
            }

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #2
0
    def top_level(self, request, api_name=None):
        """
        A view that returns a serialized list of all resources registers
        to the ``Api``. Useful for discovery.
        """
        serializer = Serializer()

        if api_name is None:
            api_name = self.api_name

        available_resources = dict((name, {
            'list_endpoint': self._build_reverse_url("api_dispatch_list", kwargs={
                'api_name': api_name,
                'resource_name': name,
            }),
            'schema': self._build_reverse_url("api_get_schema", kwargs={
                'api_name': api_name,
                'resource_name': name,
            }),
        }) for name in self._registry.iterkeys())

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #3
0
def top_level(request):
    available_resources = {}

    apitop = reverse('ietf.api.top_level')

    for name in sorted([ name for name, api in _api_list if len(api._registry) > 0 ]):
        available_resources[name] = {
            'list_endpoint': '%s/%s/' % (apitop, name),
        }

    serializer = Serializer()
    desired_format = determine_format(request, serializer)

    options = {}

    if 'text/javascript' in desired_format:
        callback = request.GET.get('callback', 'callback')

        if not is_valid_jsonp_callback_value(callback):
            raise BadRequest('JSONP callback name is invalid.')

        options['callback'] = callback

    serialized = serializer.serialize(available_resources, desired_format, options)
    return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #4
0
    def top_level(self, request, api_name=None):
        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry.keys()):
            available_resources[name] = {
                'list_endpoint': self._build_reverse_url('api_dispatch_list', kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
                'schema': self._build_reverse_url('api_get_schema', kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
            }

            if request.GET.get('include_schemas', False) is not False:
                available_resources[name]['schema_detailed'] = self._registry[name].build_schema()

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')
            
            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #5
0
    def top_level(self, request, api_name=None):
        """
        A view that returns a serialized list of all resources registers
        to the ``Api``. Useful for discovery.
        """
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry.keys()):
            available_resources[name] = {
                "list_endpoint": self._build_reverse_url(
                    "api_dispatch_list", kwargs={"api_name": api_name, "resource_name": name}
                ),
                "schema": self._build_reverse_url(
                    "api_get_schema", kwargs={"api_name": api_name, "resource_name": name}
                ),
            }

        desired_format = determine_format(request, self.serializer)

        options = {}

        if "text/javascript" in desired_format:
            callback = request.GET.get("callback", "callback")

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest("JSONP callback name is invalid.")

            options["callback"] = callback

        serialized = self.serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #6
0
def error_response(request, error_code=None, message=None, status_code=403, serializer_class=HTMLSerializer, **kwargs):
    context = {}
    if error_code:
        context['error_code'] = error_code

        if not message:
            message = ERRORS[error_code].format(**kwargs)
    if message:
        context['error_message'] = message

    context.update(kwargs)

    serializer = serializer_class()

    desired_format = determine_format(request, serializer)
    options = {}

    if 'text/javascript' in desired_format:
        callback = request.GET.get('callback', 'callback')

        if not is_valid_jsonp_callback_value(callback):
            raise BadRequest('JSONP callback name is invalid.')

        options['callback'] = callback

    serialized = serializer.serialize(context, desired_format, options)
    return HttpResponse(content=serialized, content_type=build_content_type(desired_format), status=status_code)
Beispiel #7
0
    def create_response(self,
                        request,
                        data,
                        response_class=HttpResponse,
                        *args,
                        **kwargs):
        if isinstance(data, HttpResponse):
            return data
        if hasattr(self, '_meta'):
            serializer = self._meta.serializer
        else:
            serializer = self.serializer
        desired_format = determine_format(request, serializer)

        options = {}
        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = "{}"
        if data:
            serialized = serializer.serialize(data, desired_format, options)
        return response_class(content=serialized,
                              content_type=build_content_type(desired_format))
Beispiel #8
0
def top_level(request):
    available_resources = {}

    apitop = reverse('ietf.api.top_level')

    for name in sorted([ name for name, api in _api_list if len(api._registry) > 0 ]):
        available_resources[name] = {
            'list_endpoint': '%s/%s/' % (apitop, name),
        }

    serializer = Serializer()
    desired_format = determine_format(request, serializer)

    options = {}

    if 'text/javascript' in desired_format:
        callback = request.GET.get('callback', 'callback')

        if not is_valid_jsonp_callback_value(callback):
            raise BadRequest('JSONP callback name is invalid.')

        options['callback'] = callback

    serialized = serializer.serialize(available_resources, desired_format, options)
    return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #9
0
 def top_level(self, request, api_name=None):
     """This is the same method in the Api model with the execption
     of the serializer used. This uses the SafeSerializer.
     """
     serializer = SafeSerializer()
     available_resources = {}
     
     if api_name is None:
         api_name = self.api_name
     
     for name in sorted(self._registry.keys()):
         available_resources[name] = {
             'list_endpoint': self._build_reverse_url("api_dispatch_list", kwargs={
                 'api_name': api_name,
                 'resource_name': name,
             }),
             'schema': self._build_reverse_url("api_get_schema", kwargs={
                 'api_name': api_name,
                 'resource_name': name,
             }),
         }
     
     desired_format = determine_format(request, serializer)
     options = {}
     
     if 'text/javascript' in desired_format:
         callback = request.GET.get('callback', 'callback')
     
         if not is_valid_jsonp_callback_value(callback):
             raise BadRequest('JSONP callback name is invalid.')
     
         options['callback'] = callback
     
     serialized = serializer.serialize(available_resources, desired_format, options)
     return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #10
0
    def serialize(self, request, data, format, options=None):
        options = options or {}

        if 'text/javascript' in format:
            # get JSONP callback name. default to "callback"
            callback = request.GET.get('callback', 'callback')
            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')
            options['callback'] = callback

        return self.serializer.serialize(data, format, options)
Beispiel #11
0
    def top_level(self, request, api_name=None):
        serializer = PrettyJSONSerializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        def render_resource(name, resource):
            dct = {
                'apidoc': self._build_reverse_url("api_get_doc", kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
                'relativePath': resource.get_relative_uri(),
                'schema': self._build_reverse_url("api_get_schema", kwargs={
                    'api_name': api_name,
                    'resource_name': name,
                }),
                'views': {}
            }

            for _, viewmeta in resource.viewregistry.get_all():
                view_name = viewmeta.name
                dct['views'][view_name] = viewmeta.get_template_uri(resource)

            if resource.children:
                dct['children'] = {}
                for child in resource.children:
                    n = child._meta.resource_name
                    dct['children'][n] = render_resource(n, child)

            return dct

        for name, resource in self._registry.items():
            if not resource.parent:
                available_resources[name] = render_resource(name, resource)

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #12
0
    def top_level(self, request, api_name=None):
        """
        A view that returns a serialized list of all resources registers
        to the ``Api``. Useful for discovery.
        """
        fullschema = request.GET.get('fullschema', False)
        fullschema = string_to_python(fullschema)

        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name, resource in self._registry.items():
            if not fullschema:
                schema = self._build_reverse_url("api_get_schema",
                                                 kwargs={
                                                     'api_name': api_name,
                                                     'resource_name': name,
                                                 })
            else:
                schema = resource.build_schema()

            available_resources[name] = {
                'list_endpoint':
                self._build_reverse_url("api_dispatch_list",
                                        kwargs={
                                            'api_name': api_name,
                                            'resource_name': name,
                                        }),
                'schema':
                schema,
            }

        desired_format = determine_format(request, self.serializer)

        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = self.serializer.serialize(available_resources,
                                               desired_format, options)
        return HttpResponse(content=serialized,
                            content_type=build_content_type(desired_format))
Beispiel #13
0
    def create_response(self, data, request, *args, **kwargs):
        desired_format = determine_format(request, self.serializer)

        options = {}
        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = self.serializer.serialize(data, desired_format, options)
        return HttpResponse(content=serialized,
                            content_type=build_content_type(desired_format))
Beispiel #14
0
 def serialize(self, request, data, format, options=None):
     """
     Given a request, data and a desired format, produces a serialized
     version suitable for transfer over the wire.
     
     Mostly a hook, this uses the ``Serializer`` from ``Resource._meta``.
     """
     options = options or {}
     
     if 'text/javascript' in format:
         # get JSONP callback name. default to "callback"
         callback = request.GET.get('callback', 'callback')
         
         if not is_valid_jsonp_callback_value(callback):
             raise BadRequest('JSONP callback name is invalid.')
         
         options['callback'] = callback
     
     return self._meta.serializer.serialize(data, format, options)
Beispiel #15
0
    def top_level(self, request, api_name=None):
        """
        A view that returns a serialized list of all resources registers
        to the ``Api``. Useful for discovery.
        """
        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        kwargs = {}
        if not self._accept_header_routing:
            kwargs['api_name'] = api_name

        for name in sorted(self._registry.keys()):
            kwargs['resource_name'] = name
            available_resources[name] = {
                'list_endpoint':
                self._build_reverse_url("api_dispatch_list", kwargs=kwargs),
                'schema':
                self._build_reverse_url("api_get_schema", kwargs=kwargs),
            }

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format,
                                          options)
        content_type = self._build_content_type(desired_format)
        return HttpResponse(content=serialized, content_type=content_type)
Beispiel #16
0
    def top_level(self, request, api_name=None, **kwargs):
        """
        A view that returns a serialized list of all resources registers
        to the ``Api``. Useful for discovery.
        """
        # TODO: Limit visibility of API to valid site IDs only.
        # TODO: Potentially, we could only give pieces of the API out based on site ID.

        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry.keys()):
            kw_bru = {
                'api_name': api_name,
                'resource_name': name,
                }
            kw_bru.update(self._registry[name].api_additional_parameters())
            kw_bru.update(kwargs)
            available_resources[name] = {
                'list_endpoint': self._build_reverse_url("api_dispatch_list", kwargs=kw_bru),
                'schema': self._build_reverse_url("api_get_schema", kwargs=kw_bru),
                }

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #17
0
    def top_level(self, request, api_name=None):
        """
        Overriding top_level method to serialize only resources
        that user has rights to use.
        """
        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for resource_name in sorted(self._registry.keys()):
            available_resources[resource_name] = {
                'list_endpoint': self._build_reverse_url("api_dispatch_list", kwargs={
                    'api_name': api_name,
                    'resource_name': resource_name,
                }),
                'schema': self._build_reverse_url("api_get_schema", kwargs={
                    'api_name': api_name,
                    'resource_name': resource_name,
                }),
            }

        if not available_resources:
            return HttpResponseForbidden()

        desired_format = determine_format(request, serializer)
        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = serializer.serialize(available_resources, desired_format, options)
        return HttpResponse(content=serialized, content_type=build_content_type(desired_format))
Beispiel #18
0
    def top_level(self, request, api_name=None):
        """
        this is a copy/past of the method Api.top_level
        the original method locally use a Serializer object which didn't
        implement the `to_html` method
        this function does exactly the same except it can server html content
        """

        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry.keys()):
            kwargs = {
                'api_name': api_name,
                'resource_name': name,
            }
            available_resources[name] = {
                'list_endpoint':
                self._build_reverse_url("api_dispatch_list", kwargs=kwargs),
                'schema':
                self._build_reverse_url("api_get_schema", kwargs=kwargs),
            }

        desired_format = determine_format(request, serializer)
        options = {}
        if 'text/html' in desired_format:
            serialized = textwrap.dedent("""
            <!DOCTYPE html>
            <html>
              <head>
                <style>
                  body {
                    font-family: Monaco,"DejaVu Sans Mono",
                                 "Courier New",monospace;
                  }
                  div {
                    margin: 5px;
                    padding: 5px;
                    border: 1px solid #444;
                    border-radius: 5px;
                    background-color: #eee;
                  }
                  h1 {
                    font-size: 1.4rem;
                  }
                  .command:before {
                    font-size: 1.4rem;
                  }
                </style>
              </head>
              <title>Api route</title>
              <body>
                <div>
                  <h1 class="command">Available route</h1>
                  <pre>%s</pre>
                </div>
              </body>
            </html>
            """) % json.dumps(available_resources, indent=4, sort_keys=True)
        else:
            if 'text/javascript' in desired_format:
                callback = request.GET.get('callback', 'callback')
                if not is_valid_jsonp_callback_value(callback):
                    raise BadRequest('JSONP callback name is invalid.')
                options['callback'] = callback
            serialized = serializer.serialize(available_resources,
                                              desired_format, options)
        return HttpResponse(content=serialized,
                            content_type=build_content_type(desired_format))
    def batch(self, request, api_name=None):
        """
        Make batch requests to the api.
        """
        # assert False, request
        if not request.method.lower() == 'post':
            raise Http404
        if api_name is None:
            api_name = self.api_name


        desired_format = determine_format(request, self.serializer)

        try:
            batch_requests = self.serializer.deserialize(
                request.body, desired_format)[:BATCH_API_MAX_REQUESTS]
        except ValueError:
            raise BadRequest('Bad data.')
        if not isinstance(batch_requests, list):
            raise BadRequest('Bad structure.')
        responses = []
        if not request.session.exists(request.session.session_key):
            request.session.create()
        # assert False, request.session.session_key
        self.client.cookies[settings.SESSION_COOKIE_NAME] = \
            request.session.session_key
        for req in batch_requests:
            path = req.get('path')
            params = {}
            params.update(req.get('params', {}))
            response_obj = {
                'path': urllib.quote(path),
                'params': params,
            }
            valid_path = re.search(self.prefix, path)
            if valid_path:
                try:
                    setattr(self, '_client', Client(**request.META))
                    response = self.client.get(req['path'], params)
                    # assert False, dir(response)
                    response_obj['status'] = response.status_code
                    response_obj['body'] = response.content
                    response_obj['headers'] = response._headers
                    response_obj['cookies'] = response.cookies
                except:
                    exc_type, exc_value, exc_traceback = sys.exc_info()
                    response_obj['error'] = {
                        'exc_type': exc_type,
                        'exc_value': exc_value
                    }
                    if settings.DEBUG:
                        response_obj['exc_traceback'] = traceback.format_exc(
                            exc_traceback)
            else:
                # response_obj['status'] = 404
                response_obj['error'] = 'Unknown resource uri.',
            responses.append(response_obj)


        options = {}

        if 'text/javascript' in desired_format:
            callback = request.GET.get('callback', 'callback')

            if not is_valid_jsonp_callback_value(callback):
                raise BadRequest('JSONP callback name is invalid.')

            options['callback'] = callback

        serialized = self.serializer.serialize(
            responses, desired_format, options)
        return HttpResponse(
            content=serialized, content_type=build_content_type(
                desired_format))
Beispiel #20
0
    def top_level(self, request, api_name=None):
        """
        this is a copy/past of the method Api.top_level
        the original method locally use a Serializer object which didn't
        implement the `to_html` method
        this function does exactly the same except it can server html content
        """

        serializer = Serializer()
        available_resources = {}

        if api_name is None:
            api_name = self.api_name

        for name in sorted(self._registry.keys()):
            kwargs = {
                'api_name': api_name,
                'resource_name': name,
            }
            available_resources[name] = {
                'list_endpoint': self._build_reverse_url("api_dispatch_list",
                                                         kwargs=kwargs),
                'schema': self._build_reverse_url("api_get_schema",
                                                  kwargs=kwargs),
            }

        desired_format = determine_format(request, serializer)
        options = {}
        if 'text/html' in desired_format:
            serialized = textwrap.dedent("""
            <!DOCTYPE html>
            <html>
              <head>
                <style>
                  body {
                    font-family: Monaco,"DejaVu Sans Mono",
                                 "Courier New",monospace;
                  }
                  div {
                    margin: 5px;
                    padding: 5px;
                    border: 1px solid #444;
                    border-radius: 5px;
                    background-color: #eee;
                  }
                  h1 {
                    font-size: 1.4rem;
                  }
                  .command:before {
                    font-size: 1.4rem;
                  }
                </style>
              </head>
              <title>Api route</title>
              <body>
                <div>
                  <h1 class="command">Available route</h1>
                  <pre>%s</pre>
                </div>
              </body>
            </html>
            """) % json.dumps(available_resources, indent=4, sort_keys=True)
        else:
            if 'text/javascript' in desired_format:
                callback = request.GET.get('callback', 'callback')
                if not is_valid_jsonp_callback_value(callback):
                    raise BadRequest('JSONP callback name is invalid.')
                options['callback'] = callback
            serialized = serializer.serialize(available_resources,
                                              desired_format, options)
        return HttpResponse(content=serialized,
                            content_type=build_content_type(desired_format))