Esempio n. 1
0
    def dispatch(self, request, *args, **kwargs):
        try:
            method = request.method.lower()

            if method in self.http_method_names and hasattr(self, method):
                handler = getattr(
                    self, 'dispatch_%s' % method, self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            self.is_authenticated(request)
            self.is_authorized(request)
            self.throttle_check(request)

            self.request = request
            self.args = args
            self.kwargs = kwargs

            try:
                response = handler(request, *args, **kwargs)
            except ValidationError, e:
                # Catch ValidationError here for non-resources can throw them.
                self.raise_validation_error(request, e.form_errors)

        except ImmediateHttpResponse, e:
            if e.response is not None:
                response = e.response
            else:
                desired_format = self.determine_format(request)

                response_kwargs = e.response_kwargs
                response_kwargs['content_type'] = response_kwargs.get(
                    'content_type', build_content_type(desired_format))

                response = e.response_cls(**response_kwargs)
Esempio n. 2
0
    def dispatch(self, request, *args, **kwargs):
        try:
            method = request.method.lower()

            if method in self.http_method_names and hasattr(self, method):
                handler = getattr(
                    self, 'dispatch_%s' % method, self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            self.is_authenticated(request)
            self.is_authorized(request)
            self.throttle_check(request)

            self.request = request
            self.args = args
            self.kwargs = kwargs

            try:
                response = self.dispatch_any(request, handler, *args, **kwargs)
            except ValidationError, e:
                # Catch ValidationError here for non-resources can throw them.
                self.raise_validation_error(request, e.form_errors)

        except ImmediateHttpResponse, e:
            if e.response is not None:
                response = e.response
            else:
                desired_format = self.determine_format(request)

                response_kwargs = e.response_kwargs
                response_kwargs['content_type'] = response_kwargs.get(
                    'content_type', build_content_type(desired_format))

                response = e.response_cls(**response_kwargs)
Esempio n. 3
0
    def raise_http_error(self, request, error,
                         response_cls=cake_http.HttpBadRequest):
        if request:
            desired_format = self.determine_format(request)
        else:
            desired_format = self._meta.default_format

        response = response_cls(
            content_type=build_content_type(desired_format),
            content=self.serialize(request, error, desired_format))

        raise ImmediateHttpResponse(response=response)
Esempio n. 4
0
    def raise_http_error(self, request, error,
                         response_cls=cake_http.HttpBadRequest):
        if request:
            desired_format = self.determine_format(request)
        else:
            desired_format = self._meta.default_format

        response = response_cls(
            content_type=build_content_type(desired_format),
            content=self.serialize(request, error, desired_format))

        raise ImmediateHttpResponse(response=response)
Esempio n. 5
0
    def create_http_response(self, request, resource_response,
                             created=False, force_include_entity=None,
                             default_response_cls=None,
                             **default_response_kwargs):
        if resource_response is None:
            return

        include_entity = self._get_include_entity(
            resource_response, force_include_entity)

        entity_cls = resource_response.get_entity_cls(
            self._meta.get_detail_entity_cls())

        if resource_response.obj is None:
            if created or include_entity:
                raise ResourceEntityError(
                    "'ResourceResponse.obj' must not be None if 'created'" \
                    " or 'include_entity' is True")
            entity = None
        else:
            if entity_cls is None:
                raise ResourceEntityError(
                    "Must specify 'entity_cls' or 'detail_entity_cls' if" \
                    " 'created' or 'include_entity' is True")

            entity = entity_cls(resource_response.obj)

        if created:
            http_response_cls = cake_http.HttpCreated
            http_response_kwargs = {'location': entity.get_resource_uri()}
        else:
            http_response_cls, http_response_kwargs = \
                self.get_http_response_details(
                    resource_response, entity, include_entity,
                    default_response_cls, default_response_kwargs)

        desired_format = self.determine_format(request)

        content = '' if entity is None or include_entity is False else \
            self.serialize(request, entity.full_process(), desired_format)

        http_response = http_response_cls(
            content=content, content_type=build_content_type(desired_format),
            **http_response_kwargs)

        self._process_http_response(request, http_response, entity)

        return http_response
Esempio n. 6
0
    def create_http_response(self, request, resource_response,
                             created=False, force_include_entity=None,
                             default_response_cls=None,
                             **default_response_kwargs):
        if resource_response is None:
            return

        include_entity = self._get_include_entity(
            resource_response, force_include_entity)

        entity_cls = resource_response.get_entity_cls(
            self._meta.get_detail_entity_cls())

        if resource_response.obj is None:
            if created or include_entity:
                raise ResourceEntityError(
                    "'ResourceResponse.obj' must not be None if 'created'" \
                    " or 'include_entity' is True")
            entity = None
        else:
            if entity_cls is None:
                raise ResourceEntityError(
                    "Must specify 'entity_cls' or 'detail_entity_cls' if" \
                    " 'created' or 'include_entity' is True")

            entity = entity_cls(resource_response.obj)

        if created:
            http_response_cls = cake_http.HttpCreated
            http_response_kwargs = {'location': entity.get_resource_uri()}
        else:
            http_response_cls, http_response_kwargs = \
                self.get_http_response_details(
                    resource_response, entity, include_entity,
                    default_response_cls, default_response_kwargs)

        desired_format = self.determine_format(request)

        content = '' if entity is None or include_entity is False else \
            self.serialize(request, entity.full_process(), desired_format)

        http_response = http_response_cls(
            content=content, content_type=build_content_type(desired_format),
            **http_response_kwargs)

        self._process_http_response(request, http_response, entity)

        return http_response
Esempio n. 7
0
    def handle_exception(self, request, exception):
        desired_format = self.determine_format(request)
        content_type = build_content_type(desired_format)

        if isinstance(exception, NOT_FOUND_EXCEPTIONS):
            response = cake_http.HttpNotFound(content_type=content_type)
        elif isinstance(exception, UnsupportedSerializationFormat):
            response = cake_http.HttpNotAcceptable(content_type=content_type)
        elif isinstance(exception, UnsupportedDeserializationFormat):
            response = cake_http.HttpUnsupportedMediaType(
                content_type=content_type)
        elif isinstance(exception, MultipleObjectsReturned):
            response = cake_http.HttpMultipleChoices(content_type=content_type)
        elif isinstance(exception, BadRequest):
            response = cake_http.HttpBadRequest(exception.message)
        else:
            if settings.DEBUG:
                data = {
                    'error_message': unicode(exception),
                    'traceback': '\n'.join(
                        traceback.format_exception(*(sys.exc_info())))}
            else:
                data = {
                    'error_message': getattr(
                        settings, 'DELICIOUS_CAKE_CANNED_ERROR',
                        'Sorry, this request could not be processed.  ' \
                        'Please try again later.')}

            response = cake_http.HttpApplicationError(
                content=self.serialize(request, data, desired_format),
                content_type=content_type, status=500)

        if settings.DEBUG or response.status_code == 500:
            log.error('Server Error: %s' % request.path,
                exc_info=sys.exc_info(), extra={'request': request})

            # SEND ERROR NOTIFICATIONS HERE!

        return response
Esempio n. 8
0
    def handle_exception(self, request, exception):
        desired_format = self.determine_format(request)
        content_type = build_content_type(desired_format)

        if isinstance(exception, NOT_FOUND_EXCEPTIONS):
            response = cake_http.HttpNotFound(content_type=content_type)
        elif isinstance(exception, UnsupportedSerializationFormat):
            response = cake_http.HttpNotAcceptable(content_type=content_type)
        elif isinstance(exception, UnsupportedDeserializationFormat):
            response = cake_http.HttpUnsupportedMediaType(
                content_type=content_type)
        elif isinstance(exception, MultipleObjectsReturned):
            response = cake_http.HttpMultipleChoices(content_type=content_type)
        elif isinstance(exception, BadRequest):
            response = cake_http.HttpBadRequest(exception.message)
        else:
            if settings.DEBUG:
                data = {
                    'error_message': unicode(exception),
                    'traceback': '\n'.join(
                        traceback.format_exception(*(sys.exc_info())))}
            else:
                data = {
                    'error_message': getattr(
                        settings, 'DELICIOUS_CAKE_CANNED_ERROR',
                        'Sorry, this request could not be processed.  ' \
                        'Please try again later.')}

            response = cake_http.HttpApplicationError(
                content=self.serialize(request, data, desired_format),
                content_type=content_type, status=500)

        if settings.DEBUG or response.status_code == 500:
            log.error('Server Error: %s' % request.path,
                exc_info=sys.exc_info(), extra={'request': request})

            # SEND ERROR NOTIFICATIONS HERE!

        return response
Esempio n. 9
0
    def create_http_list_response(self, request, resource_response,
                                  paginated=False, force_include_entity=None,
                                  default_response_cls=None,
                                  **default_response_kwargs):
        if resource_response is None:
            return

        include_entity = self._get_include_entity(
            resource_response, force_include_entity)

        entity_cls = resource_response.get_entity_cls(
            self._meta.get_detail_entity_cls())

        if entity_cls is None and include_entity:
            raise ResourceEntityError(
                "Must specify 'entity_cls', 'list_entity_cls', or " \
                "'detail_entity_cls' if 'include_entity' is True")

        obj = resource_response.obj

        if obj is None:
            entities = []
        elif not isinstance(obj, collections.Iterable):
            entities = [obj]
        else:
            entities = obj

        if paginated:
            paginator = self._meta.paginator_cls(
                request.GET, entities, resource_uri=self.get_resource_uri(),
                limit=self._meta.limit, max_limit=self._meta.max_limit,
                collection_name=self._meta.collection_name)

            page = paginator.page()
            entities = page[self._meta.collection_name]
        else:
            page = {}
            page[self._meta.collection_name] = entities

        http_response_cls, http_response_kwargs = \
            self.get_http_response_details(
                resource_response, entities, include_entity,
                default_response_cls, default_response_kwargs)

        desired_format = self.determine_format(request)

        if include_entity:
            entities = [entity_cls(obj).full_process() for obj in entities]
            page[self._meta.collection_name] = entities
            content = self.serialize(request, page, desired_format)
        else:
            content = ''
            entities = None

        http_response = http_response_cls(
            content=content, content_type=build_content_type(desired_format),
            **http_response_kwargs)

        self._process_http_response(request, http_response, entities)

        return http_response
Esempio n. 10
0
    def create_http_list_response(self, request, resource_response,
                                  paginated=False, force_include_entity=None,
                                  default_response_cls=None,
                                  **default_response_kwargs):
        if resource_response is None:
            return

        include_entity = self._get_include_entity(
            resource_response, force_include_entity)

        entity_cls = resource_response.get_entity_cls(
            self._meta.get_detail_entity_cls())

        if entity_cls is None and include_entity:
            raise ResourceEntityError(
                "Must specify 'entity_cls', 'list_entity_cls', or " \
                "'detail_entity_cls' if 'include_entity' is True")

        obj = resource_response.obj

        if obj is None:
            entities = []
        elif not isinstance(obj, collections.Iterable):
            entities = [obj]
        else:
            entities = obj

        if paginated:
            paginator = self._meta.paginator_cls(
                request.GET, entities, resource_uri=self.get_resource_uri(),
                limit=self._meta.limit, max_limit=self._meta.max_limit,
                collection_name=self._meta.collection_name)

            page = paginator.page()
            entities = page[self._meta.collection_name]
        else:
            page = {}
            page[self._meta.collection_name] = entities

        http_response_cls, http_response_kwargs = \
            self.get_http_response_details(
                resource_response, entities, include_entity,
                default_response_cls, default_response_kwargs)

        desired_format = self.determine_format(request)

        if include_entity:
            entities = [entity_cls(obj).full_process() for obj in entities]
            page[self._meta.collection_name] = entities
            content = self.serialize(request, page, desired_format)
        else:
            content = ''
            entities = None

        http_response = http_response_cls(
            content=content, content_type=build_content_type(desired_format),
            **http_response_kwargs)

        self._process_http_response(request, http_response, entities)

        return http_response