diff options
| author | Tom Christie | 2012-02-21 20:12:14 +0000 |
|---|---|---|
| committer | Tom Christie | 2012-02-21 20:12:14 +0000 |
| commit | af9e4f69d732cc643d6ec7ae13d4a19ac0332d44 (patch) | |
| tree | 9d3fb9a8aebc520716e7f83075ef83e8102b5952 /djangorestframework | |
| parent | 21fcd3a90631e96e3fa210dd526abab9571ad6e1 (diff) | |
| download | django-rest-framework-af9e4f69d732cc643d6ec7ae13d4a19ac0332d44.tar.bz2 | |
Merging master into develop
Diffstat (limited to 'djangorestframework')
| -rw-r--r-- | djangorestframework/__init__.py | 2 | ||||
| -rw-r--r-- | djangorestframework/mixins.py | 6 | ||||
| -rw-r--r-- | djangorestframework/renderers.py | 6 | ||||
| -rw-r--r-- | djangorestframework/resources.py | 6 | ||||
| -rw-r--r-- | djangorestframework/response.py | 3 | ||||
| -rw-r--r-- | djangorestframework/serializer.py | 2 | ||||
| -rw-r--r-- | djangorestframework/templates/djangorestframework/api.html | 3 | ||||
| -rw-r--r-- | djangorestframework/templates/djangorestframework/api.txt (renamed from djangorestframework/templates/renderer.txt) | 0 | ||||
| -rw-r--r-- | djangorestframework/templates/djangorestframework/base.html (renamed from djangorestframework/templates/renderer.html) | 19 | ||||
| -rw-r--r-- | djangorestframework/templates/djangorestframework/login.html (renamed from djangorestframework/templates/api_login.html) | 0 | ||||
| -rw-r--r-- | djangorestframework/templatetags/add_query_param.py | 3 | ||||
| -rw-r--r-- | djangorestframework/tests/reverse.py | 4 | ||||
| -rw-r--r-- | djangorestframework/utils/__init__.py | 21 | ||||
| -rw-r--r-- | djangorestframework/utils/staticviews.py | 4 | ||||
| -rw-r--r-- | djangorestframework/views.py | 11 |
15 files changed, 58 insertions, 32 deletions
diff --git a/djangorestframework/__init__.py b/djangorestframework/__init__.py index 0aaa2915..efe7f566 100644 --- a/djangorestframework/__init__.py +++ b/djangorestframework/__init__.py @@ -1,3 +1,3 @@ -__version__ = '0.3.3-dev' +__version__ = '0.3.3' VERSION = __version__ # synonym diff --git a/djangorestframework/mixins.py b/djangorestframework/mixins.py index aae0f76f..51c859cd 100644 --- a/djangorestframework/mixins.py +++ b/djangorestframework/mixins.py @@ -497,12 +497,12 @@ class PaginatorMixin(object): """ Constructs a url used for getting the next/previous urls """ - url = URLObject.parse(self.request.get_full_path()) - url = url.set_query_param('page', page_number) + url = URLObject(self.request.get_full_path()) + url = url.set_query_param('page', str(page_number)) limit = self.get_limit() if limit != self.limit: - url = url.add_query_param('limit', limit) + url = url.set_query_param('limit', str(limit)) return url diff --git a/djangorestframework/renderers.py b/djangorestframework/renderers.py index 2cc9cc88..d24bcfce 100644 --- a/djangorestframework/renderers.py +++ b/djangorestframework/renderers.py @@ -379,7 +379,7 @@ class DocumentingHTMLRenderer(DocumentingTemplateRenderer): media_type = 'text/html' format = 'html' - template = 'renderer.html' + template = 'djangorestframework/api.html' class DocumentingXHTMLRenderer(DocumentingTemplateRenderer): @@ -391,7 +391,7 @@ class DocumentingXHTMLRenderer(DocumentingTemplateRenderer): media_type = 'application/xhtml+xml' format = 'xhtml' - template = 'renderer.html' + template = 'djangorestframework/api.html' class DocumentingPlainTextRenderer(DocumentingTemplateRenderer): @@ -403,7 +403,7 @@ class DocumentingPlainTextRenderer(DocumentingTemplateRenderer): media_type = 'text/plain' format = 'txt' - template = 'renderer.txt' + template = 'djangorestframework/api.txt' DEFAULT_RENDERERS = ( diff --git a/djangorestframework/resources.py b/djangorestframework/resources.py index 15b3579d..eadc11d0 100644 --- a/djangorestframework/resources.py +++ b/djangorestframework/resources.py @@ -1,10 +1,10 @@ from django import forms -from django.core.urlresolvers import reverse, get_urlconf, get_resolver, NoReverseMatch +from django.core.urlresolvers import get_urlconf, get_resolver, NoReverseMatch from django.db import models from djangorestframework.response import ImmediateResponse from djangorestframework.serializer import Serializer, _SkipField -from djangorestframework.utils import as_tuple +from djangorestframework.utils import as_tuple, reverse class BaseResource(Serializer): @@ -354,7 +354,7 @@ class ModelResource(FormResource): instance_attrs[param] = attr try: - return reverse(self.view_callable[0], kwargs=instance_attrs) + return reverse(self.view_callable[0], self.view.request, kwargs=instance_attrs) except NoReverseMatch: pass raise _SkipField diff --git a/djangorestframework/response.py b/djangorestframework/response.py index 714cd5b8..1c260ecb 100644 --- a/djangorestframework/response.py +++ b/djangorestframework/response.py @@ -40,7 +40,7 @@ class Response(SimpleTemplateResponse): _ACCEPT_QUERY_PARAM = '_accept' # Allow override of Accept header in URL query params _IGNORE_IE_ACCEPT_HEADER = True - def __init__(self, content=None, status=None, request=None, renderers=None): + def __init__(self, content=None, status=None, request=None, renderers=None, headers=None): # First argument taken by `SimpleTemplateResponse.__init__` is template_name, # which we don't need super(Response, self).__init__(None, status=status) @@ -50,6 +50,7 @@ class Response(SimpleTemplateResponse): self.raw_content = content self.has_content_body = content is not None self.request = request + self.headers = headers and headers[:] or [] if renderers is not None: self.renderers = renderers diff --git a/djangorestframework/serializer.py b/djangorestframework/serializer.py index 71c0d93a..b0c02675 100644 --- a/djangorestframework/serializer.py +++ b/djangorestframework/serializer.py @@ -146,7 +146,7 @@ class Serializer(object): # then the second element of the tuple is the fields to # set on the related serializer if isinstance(info, (list, tuple)): - class OnTheFlySerializer(Serializer): + class OnTheFlySerializer(self.__class__): fields = info return OnTheFlySerializer diff --git a/djangorestframework/templates/djangorestframework/api.html b/djangorestframework/templates/djangorestframework/api.html new file mode 100644 index 00000000..fd9bcc98 --- /dev/null +++ b/djangorestframework/templates/djangorestframework/api.html @@ -0,0 +1,3 @@ +{% extends "djangorestframework/base.html" %} + +{# Override this template in your own templates directory to customize #}
\ No newline at end of file diff --git a/djangorestframework/templates/renderer.txt b/djangorestframework/templates/djangorestframework/api.txt index b584952c..b584952c 100644 --- a/djangorestframework/templates/renderer.txt +++ b/djangorestframework/templates/djangorestframework/api.txt diff --git a/djangorestframework/templates/renderer.html b/djangorestframework/templates/djangorestframework/base.html index 18e60110..fa913c33 100644 --- a/djangorestframework/templates/renderer.html +++ b/djangorestframework/templates/djangorestframework/base.html @@ -7,26 +7,34 @@ <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link rel="stylesheet" type="text/css" href='{% get_static_prefix %}djangorestframework/css/style.css'/> - <title>Django REST framework - {{ name }}</title> + {% block extrastyle %}{% endblock %} + <title>{% block title %}Django REST framework - {{ name }}{% endblock %}</title> + {% block extrahead %}{% endblock %} + {% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %} </head> - <body> + <body class="{% block bodyclass %}{% endblock %}"> <div id="container"> <div id="header"> <div id="branding"> - <h1 id="site-name"><a href='http://django-rest-framework.org'>Django REST framework</a> <span class="version"> v {{ version }}</span></h1> + <h1 id="site-name">{% block branding %}<a href='http://django-rest-framework.org'>Django REST framework</a> <span class="version"> v {{ version }}</span>{% endblock %}</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 %} + {% block userlinks %}{% endblock %} </div> + {% block nav-global %}{% endblock %} </div> <div class="breadcrumbs"> + {% block breadcrumbs %} {% for breadcrumb_name, breadcrumb_url in breadcrumblist %} <a href="{{ breadcrumb_url }}">{{ breadcrumb_name }}</a> {% if not forloop.last %}›{% endif %} {% endfor %} + {% endblock %} </div> + <!-- Content --> <div id="content" class="{% block coltype %}colM{% endblock %}"> {% if 'OPTIONS' in allowed_methods %} @@ -123,7 +131,12 @@ {% endif %} </div> + <!-- END content-main --> + </div> + <!-- END Content --> + + {% block footer %}<div id="footer"></div>{% endblock %} </div> </body> </html> diff --git a/djangorestframework/templates/api_login.html b/djangorestframework/templates/djangorestframework/login.html index 07929f0c..07929f0c 100644 --- a/djangorestframework/templates/api_login.html +++ b/djangorestframework/templates/djangorestframework/login.html diff --git a/djangorestframework/templatetags/add_query_param.py b/djangorestframework/templatetags/add_query_param.py index 11709730..4cf0133b 100644 --- a/djangorestframework/templatetags/add_query_param.py +++ b/djangorestframework/templatetags/add_query_param.py @@ -4,8 +4,7 @@ register = Library() def add_query_param(url, param): - (key, sep, val) = param.partition('=') - return unicode(URLObject.parse(url) & (key, val)) + return unicode(URLObject(url).with_query(param)) register.filter('add_query_param', add_query_param) diff --git a/djangorestframework/tests/reverse.py b/djangorestframework/tests/reverse.py index c49caca0..05c21faa 100644 --- a/djangorestframework/tests/reverse.py +++ b/djangorestframework/tests/reverse.py @@ -1,8 +1,8 @@ from django.conf.urls.defaults import patterns, url -from django.core.urlresolvers import reverse from django.test import TestCase from django.utils import simplejson as json +from djangorestframework.utils import reverse from djangorestframework.views import View from djangorestframework.response import Response @@ -12,7 +12,7 @@ class MockView(View): permissions = () def get(self, request): - return Response(reverse('another')) + return Response(reverse('another', request)) urlpatterns = patterns('', url(r'^$', MockView.as_view()), diff --git a/djangorestframework/utils/__init__.py b/djangorestframework/utils/__init__.py index fbe55474..afef4f19 100644 --- a/djangorestframework/utils/__init__.py +++ b/djangorestframework/utils/__init__.py @@ -1,6 +1,7 @@ +import django from django.utils.encoding import smart_unicode from django.utils.xmlutils import SimplerXMLGenerator -from django.core.urlresolvers import resolve +from django.core.urlresolvers import resolve, reverse as django_reverse from django.conf import settings from djangorestframework.compat import StringIO @@ -180,3 +181,21 @@ class XMLRenderer(): def dict2xml(input): return XMLRenderer().dict2xml(input) + + +def reverse(viewname, request, *args, **kwargs): + """ + Do the same as :py:func:`django.core.urlresolvers.reverse` but using + *request* to build a fully qualified URL. + """ + return request.build_absolute_uri(django_reverse(viewname, *args, **kwargs)) + +if django.VERSION >= (1, 4): + from django.core.urlresolvers import reverse_lazy as django_reverse_lazy + + def reverse_lazy(viewname, request, *args, **kwargs): + """ + Do the same as :py:func:`django.core.urlresolvers.reverse_lazy` but using + *request* to build a fully qualified URL. + """ + return request.build_absolute_uri(django_reverse_lazy(viewname, *args, **kwargs)) diff --git a/djangorestframework/utils/staticviews.py b/djangorestframework/utils/staticviews.py index 9bae0ee7..7cbc0b9b 100644 --- a/djangorestframework/utils/staticviews.py +++ b/djangorestframework/utils/staticviews.py @@ -12,7 +12,7 @@ import base64 # be making settings changes in order to accomodate django-rest-framework @csrf_protect @never_cache -def api_login(request, template_name='api_login.html', +def api_login(request, template_name='djangorestframework/login.html', redirect_field_name=REDIRECT_FIELD_NAME, authentication_form=AuthenticationForm): """Displays the login form and handles the login action.""" @@ -57,5 +57,5 @@ def api_login(request, template_name='api_login.html', }, context_instance=RequestContext(request)) -def api_logout(request, next_page=None, template_name='api_login.html', redirect_field_name=REDIRECT_FIELD_NAME): +def api_logout(request, next_page=None, template_name='djangorestframework/login.html', redirect_field_name=REDIRECT_FIELD_NAME): return logout(request, next_page, template_name, redirect_field_name) diff --git a/djangorestframework/views.py b/djangorestframework/views.py index 95fa119d..6bfc4192 100644 --- a/djangorestframework/views.py +++ b/djangorestframework/views.py @@ -188,22 +188,13 @@ class View(ResourceMixin, RequestMixin, ResponseMixin, AuthMixin, DjangoView): Required if you want to do things like set `request.upload_handlers` before the authentication and dispatch handling is run. """ - # Calls to 'reverse' will not be fully qualified unless we set the - # scheme/host/port here. - self.orig_prefix = get_script_prefix() - if not (self.orig_prefix.startswith('http:') or self.orig_prefix.startswith('https:')): - prefix = '%s://%s' % (request.is_secure() and 'https' or 'http', request.get_host()) - set_script_prefix(prefix + self.orig_prefix) - return request + pass def final(self, request, response, *args, **kargs): """ Returns an `HttpResponse`. This method is a hook for any code that needs to run after everything else in the view. """ - # Restore script_prefix. - set_script_prefix(self.orig_prefix) - # Always add these headers. response['Allow'] = ', '.join(allowed_methods(self)) # sample to allow caching using Vary http header |
