Commits

Anonymous committed fde50de

adding ability to return content to be formatted by an emitter and a custom status code. This time were extending the existing rc_factory functionality in piston.utils

  • Participants
  • Parent commits c0de361

Comments (0)

Files changed (2)

piston/resource.py

                 isinstance(result, list) or isinstance(result, QuerySet)):
             fields = handler.list_fields
 
+        status_code = 200
+
+        # If we're looking at a response object which contains non-string
+        # content, then assume we should use the emitter to format that 
+        # content
+        if isinstance(result, HttpResponse) and not result._is_string:
+            status_code = result.status_code
+            # Note: We can't use result.content here because that method attempts
+            # to convert the content into a string which we don't want. 
+            # when _is_string is True _container is the raw data
+            result = result._container
+            
         srl = emitter(result, typemapper, handler, fields, anonymous)
 
         try:
             else: stream = srl.render(request)
 
             if not isinstance(stream, HttpResponse):
-                resp = HttpResponse(stream, mimetype=ct)
+                resp = HttpResponse(stream, mimetype=ct, status=status_code)
             else:
                 resp = stream
 
         except TypeError:
             raise AttributeError(attr)
 
-        return HttpResponse(r, content_type='text/plain', status=c)
+        class HttpResponseWrapper(HttpResponse):
+            """
+            Wrap HttpResponse and make sure that the internal _is_string 
+            flag is updated when the _set_content method (via the content 
+            property) is called
+            """
+            def _set_content(self, content):
+                """
+                Set the _container and _is_string properties based on the 
+                type of the value parameter. This logic is in the construtor
+                for HttpResponse, but doesn't get repeated when setting 
+                HttpResponse.content although this bug report (feature request)
+                suggests that it should: http://code.djangoproject.com/ticket/9403 
+                """
+                if not isinstance(content, basestring) and hasattr(content, '__iter__'):
+                    self._container = content
+                    self._is_string = False
+                else:
+                    self._container = [content]
+                    self._is_string = True
+
+            content = property(HttpResponse._get_content, _set_content)            
+
+        return HttpResponseWrapper(r, content_type='text/plain', status=c)
     
 rc = rc_factory()