From 2ed90eac49b99d66ee4f2d59af8553274a4d095f Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Fri, 8 Feb 2013 16:32:09 +0100 Subject: [PATCH] Fixed #19779 -- Checked contrib.sites presence in RedirectFallbackMiddleware Thanks Aymeric Augustin for the report and directions for the patch. --- django/contrib/redirects/middleware.py | 11 ++++++++++- django/contrib/redirects/tests.py | 9 +++++++++ docs/ref/contrib/redirects.txt | 9 +++++---- docs/ref/contrib/sites.txt | 1 + docs/releases/1.5.txt | 6 ++++++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py index f5d35946bc..03c9d97c0d 100644 --- a/django/contrib/redirects/middleware.py +++ b/django/contrib/redirects/middleware.py @@ -1,11 +1,20 @@ from __future__ import unicode_literals +from django.conf import settings from django.contrib.redirects.models import Redirect from django.contrib.sites.models import get_current_site +from django.core.exceptions import ImproperlyConfigured from django import http -from django.conf import settings + class RedirectFallbackMiddleware(object): + def __init__(self): + if 'django.contrib.sites' not in settings.INSTALLED_APPS: + raise ImproperlyConfigured( + "You cannot use RedirectFallbackMiddleware when " + "django.contrib.sites is not installed." + ) + def process_response(self, request, response): if response.status_code != 404: return response # No need to check for a redirect for non-404 responses. diff --git a/django/contrib/redirects/tests.py b/django/contrib/redirects/tests.py index 4ea8523199..bdcdf4a9e1 100644 --- a/django/contrib/redirects/tests.py +++ b/django/contrib/redirects/tests.py @@ -1,9 +1,11 @@ from django.conf import settings from django.contrib.sites.models import Site +from django.core.exceptions import ImproperlyConfigured from django.test import TestCase from django.test.utils import override_settings from django.utils import six +from .middleware import RedirectFallbackMiddleware from .models import Redirect @@ -52,3 +54,10 @@ class RedirectTests(TestCase): site=self.site, old_path='/initial', new_path='') response = self.client.get('/initial') self.assertEqual(response.status_code, 410) + + @override_settings( + INSTALLED_APPS=[app for app in settings.INSTALLED_APPS + if app != 'django.contrib.sites']) + def test_sites_not_installed(self): + with self.assertRaises(ImproperlyConfigured): + RedirectFallbackMiddleware() diff --git a/docs/ref/contrib/redirects.txt b/docs/ref/contrib/redirects.txt index e34ba405f4..0c0cb2a3c2 100644 --- a/docs/ref/contrib/redirects.txt +++ b/docs/ref/contrib/redirects.txt @@ -13,11 +13,12 @@ Installation To install the redirects app, follow these steps: -1. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` - setting. -2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'`` +1. Ensure that the ``django.contrib.sites`` framework + :ref:`is installed `. +2. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` setting. +3. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'`` to your :setting:`MIDDLEWARE_CLASSES` setting. -3. Run the command :djadmin:`manage.py syncdb `. +4. Run the command :djadmin:`manage.py syncdb `. How it works ============ diff --git a/docs/ref/contrib/sites.txt b/docs/ref/contrib/sites.txt index 7eaab5dacf..139a9b377f 100644 --- a/docs/ref/contrib/sites.txt +++ b/docs/ref/contrib/sites.txt @@ -246,6 +246,7 @@ To do this, you can use the sites framework. A simple example:: >>> 'http://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url()) 'http://example.com/mymodel/objects/3/' +.. _enabling-the-sites-framework: Enabling the sites framework ============================ diff --git a/docs/releases/1.5.txt b/docs/releases/1.5.txt index a5ce08aed6..33dcb0e794 100644 --- a/docs/releases/1.5.txt +++ b/docs/releases/1.5.txt @@ -653,6 +653,12 @@ Miscellaneous Attempting to load it with ``{% load adminmedia %}`` will fail. If your templates still contain that line you must remove it. +* Because of an implementation oversight, it was possible to use + :doc:`django.contrib.redirects ` without enabling + :doc:`django.contrib.sites `. This isn't allowed any + longer. If you're using ``django.contrib.redirects``, make sure + :setting:``INSTALLED_APPS`` contains ``django.contrib.sites``. + Features deprecated in 1.5 ==========================