Anonymous avatar Anonymous committed 174ad80 Merge

Comments (0)

Files changed (8)

djangorestframework/compat.py

 # django.views.generic.View (Django >= 1.3)
 try:
     from django.views.generic import View
+    if not hasattr(View, 'head'):
+        # First implementation of Django class-based views did not include head method 
+        # in base View class - https://code.djangoproject.com/ticket/15668
+        class ViewPlusHead(View):
+            def head(self, request, *args, **kwargs):
+                return self.get(request, *args, **kwargs)
+        View = ViewPlusHead
+        
 except ImportError:
     from django import http
     from django.utils.functional import update_wrapper
             #)
             return http.HttpResponseNotAllowed(allowed_methods)
 
+        def head(self, request, *args, **kwargs):
+            return self.get(request, *args, **kwargs)
 
 try:
     import markdown
         return md.convert(text)
 
 except ImportError:
-    apply_markdown = None
+    apply_markdown = None

djangorestframework/renderers.py

 from djangorestframework.utils.breadcrumbs import get_breadcrumbs
 from djangorestframework.utils.description import get_name, get_description
 from djangorestframework.utils.mediatypes import get_media_type_params, add_media_type_param, media_type_matches
+from djangorestframework import VERSION
 
 from decimal import Decimal
 import re
             'response': self.view.response,
             'description': description,
             'name': name,
+            'version': VERSION,
             'markeddown': markeddown,
             'breadcrumblist': breadcrumb_list,
             'available_media_types': self.view._rendered_media_types,

djangorestframework/resources.py

 from django.utils.encoding import smart_unicode
 
 from djangorestframework.response import ErrorResponse
-from djangorestframework.serializer import Serializer
+from djangorestframework.serializer import Serializer, _SkipField
 from djangorestframework.utils import as_tuple
 
 import decimal
         """
 
         if not hasattr(self, 'view_callable'):
-            raise NoReverseMatch        
+            raise _SkipField        
 
         # dis does teh magicks...
         urlconf = get_urlconf()
                     return reverse(self.view_callable[0], kwargs=instance_attrs)
                 except NoReverseMatch:
                     pass
-        raise NoReverseMatch
+        raise _SkipField
 
 
     @property

djangorestframework/response.py

     An HttpResponse that may include content that hasn't yet been serialized.
     """
 
-    def __init__(self, status=200, content=None, headers={}):
+    def __init__(self, status=200, content=None, headers=None):
         self.status = status
         self.media_type = None
         self.has_content_body = content is not None
         self.raw_content = content      # content prior to filtering
         self.cleaned_content = content  # content after filtering
-        self.headers = headers
+        self.headers = headers or {}
  
     @property
     def status_text(self):

djangorestframework/templates/renderer.html

   
 	<div id="header">
 		<div id="branding">
-		  <h1 id="site-name"><a href='http://django-rest-framework.org'>Django REST framework</a></h1>
+		  <h1 id="site-name"><a href='http://django-rest-framework.org'>Django REST framework</a> <small>{{ version }}</small></h1>
 		</div>
 		<div id="user-tools">
 		  {% if user.is_active %}Welcome, {{ user }}.{% if logout_url %} <a href='{{ logout_url }}'>Log out</a>{% endif %}{% else %}Anonymous {% if login_url %}<a href='{{ login_url }}'>Log in</a>{% endif %}{% endif %}

djangorestframework/tests/content.py

 from djangorestframework.mixins import RequestMixin
 from djangorestframework.parsers import FormParser, MultiPartParser, PlainTextParser
 
-
 class TestContentParsing(TestCase):
     def setUp(self):
         self.req = RequestFactory()
         view.request = self.req.get('/')
         self.assertEqual(view.DATA, None)
 
+    def ensure_determines_no_content_HEAD(self, view):
+        """Ensure view.DATA returns None for HEAD request."""
+        view.request = self.req.head('/')
+        self.assertEqual(view.DATA, None)
+
     def ensure_determines_form_content_POST(self, view):
         """Ensure view.DATA returns content for POST request with form content."""
         form_data = {'qwerty': 'uiop'}
         """Ensure view.DATA returns None for GET request with no content."""
         self.ensure_determines_no_content_GET(RequestMixin())
 
+    def test_standard_behaviour_determines_no_content_HEAD(self):
+        """Ensure view.DATA returns None for HEAD request."""
+        self.ensure_determines_no_content_HEAD(RequestMixin())
+
     def test_standard_behaviour_determines_form_content_POST(self):
         """Ensure view.DATA returns content for POST request with form content."""
         self.ensure_determines_form_content_POST(RequestMixin())

djangorestframework/tests/methods.py

         view = RequestMixin()
         view.request = self.req.post('/', {view._METHOD_PARAM: 'DELETE'})
         self.assertEqual(view.method, 'DELETE')
+
+    def test_HEAD_is_a_valid_method(self):
+        """HEAD requests identified"""
+        view = RequestMixin()
+        view.request = self.req.head('/')
+        self.assertEqual(view.method, 'HEAD')

djangorestframework/tests/renderers.py

         self.assertEquals(resp.content, RENDERER_A_SERIALIZER(DUMMYCONTENT))
         self.assertEquals(resp.status_code, DUMMYSTATUS)
 
+    def test_head_method_serializes_no_content(self):
+        """No response must be included in HEAD requests."""
+        resp = self.client.head('/')
+        self.assertEquals(resp.status_code, DUMMYSTATUS)
+        self.assertEquals(resp['Content-Type'], RendererA.media_type)
+        self.assertEquals(resp.content, '')
+
     def test_default_renderer_serializes_content_on_accept_any(self):
         """If the Accept header is set to */* the default renderer should serialize the response."""
         resp = self.client.get('/', HTTP_ACCEPT='*/*')
         resp = self.client.get('/', HTTP_ACCEPT='foo/bar')
         self.assertEquals(resp.status_code, 406)
 
-
-
 _flat_repr = '{"foo": ["bar", "baz"]}'
 
 _indented_repr = """{
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.