aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/compat.py
diff options
context:
space:
mode:
authorTom Christie2012-08-24 16:06:23 +0100
committerTom Christie2012-08-24 16:06:23 +0100
commit7557777c668e6b8eaa85b07971b94115a33c9358 (patch)
tree6bd152248eb1e535b86fbc4396fe16fa644a0d2f /djangorestframework/compat.py
parent2d2e2f95b0268c3282edfca5c047bdc831133016 (diff)
parentdb7d15d5d136a9b4dcf759f9d588006244bd4e91 (diff)
downloaddjango-rest-framework-7557777c668e6b8eaa85b07971b94115a33c9358.tar.bz2
Merge branch 'master' of https://github.com/tomchristie/django-rest-framework
Diffstat (limited to 'djangorestframework/compat.py')
-rw-r--r--djangorestframework/compat.py45
1 files changed, 38 insertions, 7 deletions
diff --git a/djangorestframework/compat.py b/djangorestframework/compat.py
index 83d26f1f..0772e17b 100644
--- a/djangorestframework/compat.py
+++ b/djangorestframework/compat.py
@@ -65,15 +65,45 @@ except ImportError:
environ.update(request)
return WSGIRequest(environ)
-# django.views.generic.View (Django >= 1.3)
+# django.views.generic.View (1.3 <= Django < 1.4)
try:
from django.views.generic import View
- if not hasattr(View, 'head'):
+
+ if django.VERSION < (1, 4):
+ from django.utils.decorators import classonlymethod
+ from django.utils.functional import update_wrapper
+
# 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)
+ @classonlymethod
+ def as_view(cls, **initkwargs):
+ """
+ Main entry point for a request-response process.
+ """
+ # sanitize keyword arguments
+ for key in initkwargs:
+ if key in cls.http_method_names:
+ raise TypeError(u"You tried to pass in the %s method name as a "
+ u"keyword argument to %s(). Don't do that."
+ % (key, cls.__name__))
+ if not hasattr(cls, key):
+ raise TypeError(u"%s() received an invalid keyword %r" % (
+ cls.__name__, key))
+
+ def view(request, *args, **kwargs):
+ self = cls(**initkwargs)
+ if hasattr(self, 'get') and not hasattr(self, 'head'):
+ self.head = self.get
+ return self.dispatch(request, *args, **kwargs)
+
+ # take name and docstring from class
+ update_wrapper(view, cls, updated=())
+
+ # and possible attributes set by decorators
+ # like csrf_exempt from dispatch
+ update_wrapper(view, cls.dispatch, assigned=())
+ return view
View = ViewPlusHead
except ImportError:
@@ -121,6 +151,8 @@ except ImportError:
def view(request, *args, **kwargs):
self = cls(**initkwargs)
+ if hasattr(self, 'get') and not hasattr(self, 'head'):
+ self.head = self.get
return self.dispatch(request, *args, **kwargs)
# take name and docstring from class
@@ -154,9 +186,6 @@ except ImportError:
#)
return http.HttpResponseNotAllowed(allowed_methods)
- def head(self, request, *args, **kwargs):
- return self.get(request, *args, **kwargs)
-
# PUT, DELETE do not require CSRF until 1.4. They should. Make it better.
if django.VERSION >= (1, 4):
from django.middleware.csrf import CsrfViewMiddleware
@@ -370,6 +399,8 @@ else:
# Markdown is optional
try:
import markdown
+ if markdown.version_info < (2, 0):
+ raise ImportError('Markdown < 2.0 is not supported.')
class CustomSetextHeaderProcessor(markdown.blockprocessors.BlockProcessor):
"""