Commit 0339844b authored by Bas Peschier's avatar Bas Peschier Committed by Tim Graham
Browse files

Fixed #24476 -- Added context manager/decorator for overriding script prefix.

Tests were using an undocumented keyword argument for easily overriding
script prefix while reversing. This is now changed into a test utility
which can be used as decorator or context manager.
parent 6bff3439
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -527,14 +527,13 @@ def resolve(path, urlconf=None):
    return get_resolver(urlconf).resolve(path)


def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None):
def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
    if urlconf is None:
        urlconf = get_urlconf()
    resolver = get_resolver(urlconf)
    args = args or []
    kwargs = kwargs or {}

    if prefix is None:
    prefix = get_script_prefix()

    if not isinstance(viewname, six.string_types):
+21 −0
Original line number Diff line number Diff line
@@ -12,11 +12,13 @@ from django.apps import apps
from django.conf import UserSettingsHolder, settings
from django.core import mail
from django.core.signals import request_started
from django.core.urlresolvers import get_script_prefix, set_script_prefix
from django.db import reset_queries
from django.http import request
from django.template import Template
from django.test.signals import setting_changed, template_rendered
from django.utils import six
from django.utils.decorators import ContextDecorator
from django.utils.encoding import force_str
from django.utils.translation import deactivate

@@ -595,3 +597,22 @@ def require_jinja2(test_func):
        'OPTIONS': {'keep_trailing_newline': True},
    }])(test_func)
    return test_func


class ScriptPrefix(ContextDecorator):
    def __enter__(self):
        set_script_prefix(self.prefix)

    def __exit__(self, exc_type, exc_val, traceback):
        set_script_prefix(self.old_prefix)

    def __init__(self, prefix):
        self.prefix = prefix
        self.old_prefix = get_script_prefix()


def override_script_prefix(prefix):
    """
    Decorator or context manager to temporary override the script prefix.
    """
    return ScriptPrefix(prefix)
+3 −9
Original line number Diff line number Diff line
@@ -22,15 +22,13 @@ from django.contrib.staticfiles.storage import staticfiles_storage
from django.core import mail
from django.core.checks import Error
from django.core.files import temp as tempfile
from django.core.urlresolvers import (
    NoReverseMatch, get_script_prefix, resolve, reverse, set_script_prefix,
)
from django.core.urlresolvers import NoReverseMatch, resolve, reverse
from django.forms.utils import ErrorList
from django.template.response import TemplateResponse
from django.test import (
    TestCase, modify_settings, override_settings, skipUnlessDBFeature,
)
from django.test.utils import patch_logger
from django.test.utils import override_script_prefix, patch_logger
from django.utils import formats, six, translation
from django.utils._os import upath
from django.utils.cache import get_max_age
@@ -5822,16 +5820,12 @@ class AdminKeepChangeListFiltersTests(TestCase):
            add_preserved_filters(context, url),
        )

        original_prefix = get_script_prefix()
        try:
            set_script_prefix('/prefix/')
        with override_script_prefix('/prefix/'):
            url = reverse('admin:auth_user_changelist', current_app=self.admin_site.name)
            self.assertURLEqual(
                self.get_changelist_url(),
                add_preserved_filters(context, url),
            )
        finally:
            set_script_prefix(original_prefix)


class NamespacedAdminKeepChangeListFiltersTests(AdminKeepChangeListFiltersTests):
+3 −6
Original line number Diff line number Diff line
@@ -3,8 +3,8 @@
from __future__ import unicode_literals

from django.contrib.flatpages.models import FlatPage
from django.core.urlresolvers import clear_script_prefix, set_script_prefix
from django.test import TestCase
from django.test.utils import override_script_prefix


class FlatpageModelTests(TestCase):
@@ -13,10 +13,7 @@ class FlatpageModelTests(TestCase):
        pf = FlatPage(title="Café!", url='/café/')
        self.assertEqual(pf.get_absolute_url(), '/caf%C3%A9/')

    @override_script_prefix('/beverages/')
    def test_get_absolute_url_honors_script_prefix(self):
        pf = FlatPage(title="Tea!", url='/tea/')
        set_script_prefix('/beverages/')
        try:
        self.assertEqual(pf.get_absolute_url(), '/beverages/tea/')
        finally:
            clear_script_prefix()
+6 −15
Original line number Diff line number Diff line
@@ -3,13 +3,12 @@ from __future__ import unicode_literals
import os

from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import (
    clear_url_caches, reverse, set_script_prefix, translate_url,
)
from django.core.urlresolvers import clear_url_caches, reverse, translate_url
from django.http import HttpResponsePermanentRedirect
from django.middleware.locale import LocaleMiddleware
from django.template import Context, Template
from django.test import TestCase, override_settings
from django.test.utils import override_script_prefix
from django.utils import translation
from django.utils._os import upath

@@ -314,19 +313,11 @@ class URLRedirectWithScriptAliasTests(URLTestCaseBase):
    """
    #21579 - LocaleMiddleware should respect the script prefix.
    """
    def setUp(self):
        super(URLRedirectWithScriptAliasTests, self).setUp()
        self.script_prefix = '/script_prefix'
        set_script_prefix(self.script_prefix)

    def tearDown(self):
        super(URLRedirectWithScriptAliasTests, self).tearDown()
        # reset script prefix
        set_script_prefix('')

    def test_language_prefix_with_script_prefix(self):
        response = self.client.get('/prefixed/', HTTP_ACCEPT_LANGUAGE='en', SCRIPT_NAME=self.script_prefix)
        self.assertRedirects(response, '%s/en/prefixed/' % self.script_prefix, target_status_code=404)
        prefix = '/script_prefix'
        with override_script_prefix(prefix):
            response = self.client.get('/prefixed/', HTTP_ACCEPT_LANGUAGE='en', SCRIPT_NAME=prefix)
            self.assertRedirects(response, '%s/en/prefixed/' % prefix, target_status_code=404)


class URLTagTests(URLTestCaseBase):
Loading