From 0bf37761fcf2bd733f304f1b90229bb8f986dbc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Gro=C3=9F?= Date: Thu, 8 Nov 2012 17:03:06 +0100 Subject: [PATCH 1/3] added support for absolute/relative url switch --- docs/api-guide/settings.md | 4 ++++ docs/topics/release-notes.md | 4 ++++ rest_framework/pagination.py | 26 ++++++++++++++++++++------ rest_framework/reverse.py | 3 ++- rest_framework/settings.py | 4 +++- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/docs/api-guide/settings.md b/docs/api-guide/settings.md index 4f87b30da..6444bffd4 100644 --- a/docs/api-guide/settings.md +++ b/docs/api-guide/settings.md @@ -150,4 +150,8 @@ Default: `'accept'` Default: `'format'` +## USE_ABSOLUTE_URLS + +Default: `'True'` + [cite]: http://www.python.org/dev/peps/pep-0020/ diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index ecb6c91a2..7e82dd471 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -4,6 +4,10 @@ > > — Eric S. Raymond, [The Cathedral and the Bazaar][cite]. +## Master + +* Add support and settings option `USE_ABSOLUTE_URLS` + ## 2.1.1 **Date**: 7th Nov 2012 diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index 131718fd7..6f7c2dc06 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -1,4 +1,6 @@ from rest_framework import serializers +from rest_framework.settings import api_settings +from rest_framework.templatetags.rest_framework import replace_query_param # TODO: Support URLconf kwarg-style paging @@ -7,30 +9,42 @@ class NextPageField(serializers.Field): """ Field that returns a link to the next page in paginated results. """ + page_field = 'page' + def to_native(self, value): if not value.has_next(): return None page = value.next_page_number() request = self.context.get('request') - relative_url = '?page=%d' % page + url = '' if request: - return request.build_absolute_uri(relative_url) - return relative_url + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + + return replace_query_param(url, self.page_field, page) class PreviousPageField(serializers.Field): """ Field that returns a link to the previous page in paginated results. """ + page_field = 'page' + def to_native(self, value): if not value.has_previous(): return None page = value.previous_page_number() request = self.context.get('request') - relative_url = '?page=%d' % page + url = '' if request: - return request.build_absolute_uri('?page=%d' % page) - return relative_url + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + + return replace_query_param(url, self.page_field, page) class PaginationSerializerOptions(serializers.SerializerOptions): diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index c9db02f06..af1109bc1 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -1,6 +1,7 @@ """ Provide reverse functions that return fully qualified URLs """ +from rest_framework.settings import api_settings from django.core.urlresolvers import reverse as django_reverse from django.utils.functional import lazy @@ -14,7 +15,7 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs = kwargs or {} kwargs['format'] = format url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) - if request: + if request and api_settings.USE_ABSOLUTE_URLS: return request.build_absolute_uri(url) return url diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 9c40a2144..900fc7acb 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -65,7 +65,9 @@ DEFAULTS = { 'URL_ACCEPT_OVERRIDE': 'accept', 'URL_FORMAT_OVERRIDE': 'format', - 'FORMAT_SUFFIX_KWARG': 'format' + 'FORMAT_SUFFIX_KWARG': 'format', + + 'USE_ABSOLUTE_URLS': True } From e7ba2e3d40a72231c9ccb0c2ee678c70a90ca483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Gro=C3=9F?= Date: Thu, 8 Nov 2012 17:03:06 +0100 Subject: [PATCH 2/3] added support for absolute/relative url switch --- docs/api-guide/settings.md | 4 ++++ docs/topics/release-notes.md | 3 ++- rest_framework/pagination.py | 17 +++++++++++++++-- rest_framework/reverse.py | 3 ++- rest_framework/settings.py | 4 +++- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/docs/api-guide/settings.md b/docs/api-guide/settings.md index 4f87b30da..6444bffd4 100644 --- a/docs/api-guide/settings.md +++ b/docs/api-guide/settings.md @@ -150,4 +150,8 @@ Default: `'accept'` Default: `'format'` +## USE_ABSOLUTE_URLS + +Default: `'True'` + [cite]: http://www.python.org/dev/peps/pep-0020/ diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md index 35e8a8b35..361244c68 100644 --- a/docs/topics/release-notes.md +++ b/docs/topics/release-notes.md @@ -7,6 +7,7 @@ ## Master * Support for `read_only_fields` on `ModelSerializer` classes. +* Add support and settings option `USE_ABSOLUTE_URLS` ## 2.1.2 @@ -165,4 +166,4 @@ [cite]: http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html [2.1.0-notes]: https://groups.google.com/d/topic/django-rest-framework/Vv2M0CMY9bg/discussion -[announcement]: rest-framework-2-announcement.md +[announcement]: rest-framework-2-announcement.md \ No newline at end of file diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index d241ade7c..6f7c2dc06 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from rest_framework.settings import api_settings from rest_framework.templatetags.rest_framework import replace_query_param # TODO: Support URLconf kwarg-style paging @@ -15,7 +16,13 @@ class NextPageField(serializers.Field): return None page = value.next_page_number() request = self.context.get('request') - url = request and request.build_absolute_uri() or '' + url = '' + if request: + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + return replace_query_param(url, self.page_field, page) @@ -30,7 +37,13 @@ class PreviousPageField(serializers.Field): return None page = value.previous_page_number() request = self.context.get('request') - url = request and request.build_absolute_uri() or '' + url = '' + if request: + if api_settings.USE_ABSOLUTE_URLS: + url = request.build_absolute_uri() + else: + url = request.get_full_path() + return replace_query_param(url, self.page_field, page) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index c9db02f06..af1109bc1 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -1,6 +1,7 @@ """ Provide reverse functions that return fully qualified URLs """ +from rest_framework.settings import api_settings from django.core.urlresolvers import reverse as django_reverse from django.utils.functional import lazy @@ -14,7 +15,7 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs = kwargs or {} kwargs['format'] = format url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) - if request: + if request and api_settings.USE_ABSOLUTE_URLS: return request.build_absolute_uri(url) return url diff --git a/rest_framework/settings.py b/rest_framework/settings.py index 906a7cf6c..481d750c3 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -66,7 +66,9 @@ DEFAULTS = { 'URL_ACCEPT_OVERRIDE': 'accept', 'URL_FORMAT_OVERRIDE': 'format', - 'FORMAT_SUFFIX_KWARG': 'format' + 'FORMAT_SUFFIX_KWARG': 'format', + + 'USE_ABSOLUTE_URLS': True } From 80163ed01ea8175317080208c5fafce706546caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Gro=C3=9F?= Date: Tue, 13 Nov 2012 17:17:33 +0100 Subject: [PATCH 3/3] updated due to toms github comment --- rest_framework/reverse.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index af1109bc1..8cf2f2c6d 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -15,7 +15,8 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs = kwargs or {} kwargs['format'] = format url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) - if request and api_settings.USE_ABSOLUTE_URLS: + if api_settings.USE_ABSOLUTE_URLS: + assert request, "request is required for building absolute url" return request.build_absolute_uri(url) return url