From 7a97df190cb993056aa097befb3813100cfc286e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emil=20Stenstro=CC=88m?= Date: Sat, 17 Nov 2012 13:14:12 +0100 Subject: [PATCH] Fixed #19277 -- Added LocaleMiddleware.response_redirect_class Thanks ppetrid at yawd.eu for the suggestion. --- django/middleware/locale.py | 3 ++- docs/ref/middleware.txt | 6 ++++++ docs/releases/1.7.txt | 6 ++++++ tests/i18n/patterns/tests.py | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/django/middleware/locale.py b/django/middleware/locale.py index cd5d2cce71..0611b6044a 100644 --- a/django/middleware/locale.py +++ b/django/middleware/locale.py @@ -18,6 +18,7 @@ class LocaleMiddleware(object): translated to the language the user desires (if the language is available, of course). """ + response_redirect_class = HttpResponseRedirect def __init__(self): self._supported_languages = OrderedDict(settings.LANGUAGES) @@ -52,7 +53,7 @@ class LocaleMiddleware(object): language_url = "%s://%s/%s%s" % ( 'https' if request.is_secure() else 'http', request.get_host(), language, request.get_full_path()) - return HttpResponseRedirect(language_url) + return self.response_redirect_class(language_url) # Store language back into session if it is not present if hasattr(request, 'session'): diff --git a/docs/ref/middleware.txt b/docs/ref/middleware.txt index 7aac286c2d..9799db0865 100644 --- a/docs/ref/middleware.txt +++ b/docs/ref/middleware.txt @@ -151,6 +151,12 @@ Enables language selection based on data from the request. It customizes content for each user. See the :doc:`internationalization documentation `. +.. attribute:: LocaleMiddleware.response_redirect_class + +Defaults to :class:`~django.http.HttpResponseRedirect`. Subclass +``LocaleMiddleware`` and override the attribute to customize the redirects +issued by the middleware. + Message middleware ------------------ diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index 8f650a1a9e..4014007bfa 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -267,6 +267,12 @@ Forms :func:`~django.forms.formsets.formset_factory` to allow validating a minimum number of submitted forms. +Internationalization +^^^^^^^^^^^^^^^^^^^^ + +* The :attr:`django.middleware.locale.LocaleMiddleware.response_redirect_class` + attribute allows you to customize the redirects issued by the middleware. + Management Commands ^^^^^^^^^^^^^^^^^^^ diff --git a/tests/i18n/patterns/tests.py b/tests/i18n/patterns/tests.py index 85eb7db084..1a8b752e89 100644 --- a/tests/i18n/patterns/tests.py +++ b/tests/i18n/patterns/tests.py @@ -4,6 +4,8 @@ import os from django.core.exceptions import ImproperlyConfigured from django.core.urlresolvers import reverse, clear_url_caches +from django.http import HttpResponsePermanentRedirect +from django.middleware.locale import LocaleMiddleware from django.test import TestCase from django.test.utils import override_settings from django.template import Template, Context @@ -11,6 +13,10 @@ from django.utils._os import upath from django.utils import translation +class PermanentRedirectLocaleMiddleWare(LocaleMiddleware): + response_redirect_class = HttpResponsePermanentRedirect + + @override_settings( USE_I18N=True, LOCALE_PATHS=( @@ -181,6 +187,16 @@ class URLRedirectTests(URLTestCaseBase): response = self.client.get(response['location']) self.assertEqual(response.status_code, 200) + @override_settings( + MIDDLEWARE_CLASSES=( + 'i18n.patterns.tests.PermanentRedirectLocaleMiddleWare', + 'django.middleware.common.CommonMiddleware', + ), + ) + def test_custom_redirect_class(self): + response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='en') + self.assertRedirects(response, '/en/account/register/', 301) + class URLVaryAcceptLanguageTests(URLTestCaseBase): """