Commit 45edb9d2 authored by Claude Paroz's avatar Claude Paroz
Browse files

Fixed #22057 -- Ensured reverse_lazy can be used in settings

And without causing a circular import. Thanks Akis Kesoglou for
the report.
parent faf6a911
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -5,16 +5,12 @@ import copy

from django.db.models.fields import IntegerField, FloatField
from django.db.models.lookups import RegisterLookupMixin
from django.utils.functional import cached_property


__all__ = ['Aggregate', 'Avg', 'Count', 'Max', 'Min', 'StdDev', 'Sum', 'Variance']


# Fake fields used to identify aggregate types in data-conversion operations.
ordinal_aggregate_field = IntegerField()
computed_aggregate_field = FloatField()


class Aggregate(RegisterLookupMixin):
    """
    Default SQL Aggregate.
@@ -61,14 +57,23 @@ class Aggregate(RegisterLookupMixin):

        while tmp and isinstance(tmp, Aggregate):
            if getattr(tmp, 'is_ordinal', False):
                tmp = ordinal_aggregate_field
                tmp = self._ordinal_aggregate_field
            elif getattr(tmp, 'is_computed', False):
                tmp = computed_aggregate_field
                tmp = self._computed_aggregate_field
            else:
                tmp = tmp.source

        self.field = tmp

    # Two fake fields used to identify aggregate types in data-conversion operations.
    @cached_property
    def _ordinal_aggregate_field(self):
        return IntegerField()

    @cached_property
    def _computed_aggregate_field(self):
        return FloatField()

    def relabeled_clone(self, change_map):
        clone = copy.copy(self)
        if isinstance(self.col, (list, tuple)):
+3 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ custom_templates_dir = os.path.join(os.path.dirname(__file__), 'custom_templates


class AdminScriptTestCase(unittest.TestCase):
    def write_settings(self, filename, apps=None, is_dir=False, sdict=None):
    def write_settings(self, filename, apps=None, is_dir=False, sdict=None, extra=None):
        if is_dir:
            settings_dir = os.path.join(test_dir, filename)
            os.mkdir(settings_dir)
@@ -51,6 +51,8 @@ class AdminScriptTestCase(unittest.TestCase):
        with open(settings_file_path, 'w') as settings_file:
            settings_file.write('# -*- coding: utf-8 -*\n')
            settings_file.write('# Settings file automatically generated by admin_scripts test case\n')
            if extra:
                settings_file.write("%s\n" % extra)
            exports = [
                'DATABASES',
                'ROOT_URLCONF',
+20 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ from django.shortcuts import redirect
from django.test import TestCase, override_settings
from django.utils import six

from admin_scripts.tests import AdminScriptTestCase

from . import urlconf_outer, middleware, views
from .views import empty_view

@@ -301,6 +303,24 @@ class ReverseLazyTest(TestCase):
        self.assertEqual(response.status_code, 200)


class ReverseLazySettingsTest(AdminScriptTestCase):
    """
    Test that reverse_lazy can be used in settings without causing a circular
    import error.
    """
    def setUp(self):
        self.write_settings('settings.py', extra="""
from django.core.urlresolvers import reverse_lazy
LOGIN_URL = reverse_lazy('login')""")

    def tearDown(self):
        self.remove_settings('settings.py')

    def test_lazy_in_settings(self):
        out, err = self.run_manage(['test'])
        self.assertOutput(err, "Ran 0 tests")


class ReverseShortcutTests(TestCase):
    urls = 'urlpatterns_reverse.urls'