aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework
diff options
context:
space:
mode:
Diffstat (limited to 'djangorestframework')
-rw-r--r--djangorestframework/__init__.py2
-rw-r--r--djangorestframework/mixins.py6
-rw-r--r--djangorestframework/renderers.py6
-rw-r--r--djangorestframework/resources.py6
-rw-r--r--djangorestframework/response.py3
-rw-r--r--djangorestframework/serializer.py2
-rw-r--r--djangorestframework/templates/djangorestframework/api.html3
-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.py3
-rw-r--r--djangorestframework/tests/reverse.py4
-rw-r--r--djangorestframework/utils/__init__.py21
-rw-r--r--djangorestframework/utils/staticviews.py4
-rw-r--r--djangorestframework/views.py11
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 %}&rsaquo;{% 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