diff --git a/wagtail/tests/utils.py b/wagtail/tests/utils.py index f4cd561ab..1abfb0116 100644 --- a/wagtail/tests/utils.py +++ b/wagtail/tests/utils.py @@ -25,9 +25,9 @@ class WagtailTestUtils(object): with warnings.catch_warnings(record=True) as warning_list: # catch all warnings yield - # rethrow all warnings that were not DeprecationWarnings + # rethrow all warnings that were not DeprecationWarnings or PendingDeprecationWarnings for w in warning_list: - if not issubclass(w.category, DeprecationWarning): + if not issubclass(w.category, (DeprecationWarning, PendingDeprecationWarning)): warnings.showwarning(message=w.message, category=w.category, filename=w.filename, lineno=w.lineno, file=w.file, line=w.line) # borrowed from https://github.com/django/django/commit/9f427617e4559012e1c2fd8fce46cbe225d8515d diff --git a/wagtail/wagtailadmin/menu.py b/wagtail/wagtailadmin/menu.py index df8bf7637..5fa4ff7cf 100644 --- a/wagtail/wagtailadmin/menu.py +++ b/wagtail/wagtailadmin/menu.py @@ -2,13 +2,8 @@ from __future__ import unicode_literals from six import text_type, with_metaclass -try: - # renamed util -> utils in Django 1.7; try the new name first - from django.forms.utils import flatatt -except ImportError: - from django.forms.util import flatatt - from django.forms import MediaDefiningClass, Media +from django.forms.utils import flatatt from django.utils.text import slugify from django.utils.html import format_html from django.utils.safestring import mark_safe diff --git a/wagtail/wagtailcore/query.py b/wagtail/wagtailcore/query.py index cc86d52b7..8911fe8be 100644 --- a/wagtail/wagtailcore/query.py +++ b/wagtail/wagtailcore/query.py @@ -1,5 +1,7 @@ -from django.db.models import Q, get_models +from django.db.models import Q from django.contrib.contenttypes.models import ContentType +from django.apps import apps + from treebeard.mp_tree import MP_NodeQuerySet from wagtail.wagtailsearch.backends import get_search_backend @@ -154,7 +156,7 @@ class PageQuerySet(MP_NodeQuerySet): def type_q(self, klass): content_types = ContentType.objects.get_for_models(*[ - model for model in get_models() + model for model in apps.get_models() if issubclass(model, klass) ]).values() diff --git a/wagtail/wagtailcore/tests/tests.py b/wagtail/wagtailcore/tests/tests.py index 7cc1509cd..c53494648 100644 --- a/wagtail/wagtailcore/tests/tests.py +++ b/wagtail/wagtailcore/tests/tests.py @@ -1,7 +1,10 @@ +import unittest + from django.test import TestCase from django.core.cache import cache from wagtail.wagtailcore.models import Page, Site +from wagtail.wagtailcore.utils import resolve_model_string from wagtail.tests.models import SimplePage @@ -142,3 +145,42 @@ class TestSiteRootPathsCache(TestCase): # Check url self.assertEqual(homepage.url, '/') + + +class TestResolveModelString(TestCase): + def test_resolve_from_string(self): + model = resolve_model_string('wagtailcore.Page') + + self.assertEqual(model, Page) + + def test_resolve_from_string_with_default_app(self): + model = resolve_model_string('Page', default_app='wagtailcore') + + self.assertEqual(model, Page) + + def test_resolve_from_string_with_different_default_app(self): + model = resolve_model_string('wagtailcore.Page', default_app='wagtailadmin') + + self.assertEqual(model, Page) + + def test_resolve_from_class(self): + model = resolve_model_string(Page) + + self.assertEqual(model, Page) + + def test_resolve_from_string_invalid(self): + self.assertRaises(ValueError, resolve_model_string, 'wagtail.wagtailcore.Page') + + def test_resolve_from_string_with_incorrect_default_app(self): + self.assertRaises(LookupError, resolve_model_string, 'Page', default_app='wagtailadmin') + + def test_resolve_from_string_with_no_default_app(self): + self.assertRaises(ValueError, resolve_model_string, 'Page') + + @unittest.expectedFailure # Raising LookupError instead + def test_resolve_from_class_that_isnt_a_model(self): + self.assertRaises(ValueError, resolve_model_string, object) + + @unittest.expectedFailure # Raising LookupError instead + def test_resolve_from_bad_type(self): + self.assertRaises(ValueError, resolve_model_string, resolve_model_string) diff --git a/wagtail/wagtailcore/utils.py b/wagtail/wagtailcore/utils.py index 1880684bc..fbff60abb 100644 --- a/wagtail/wagtailcore/utils.py +++ b/wagtail/wagtailcore/utils.py @@ -1,7 +1,9 @@ import re -from django.db.models import Model, get_model from six import string_types +from django.db.models import Model +from django.apps import apps + def camelcase_to_underscore(str): # http://djangosnippets.org/snippets/585/ @@ -26,10 +28,7 @@ def resolve_model_string(model_string, default_app=None): "should be in the form app_label.model_name".format( model_string), model_string) - model = get_model(app_label, model_name) - if not model: - raise LookupError("Can not resolve {0!r} into a model".format(model_string), model_string) - return model + return apps.get_model(app_label, model_name) elif isinstance(model_string, type) and issubclass(model_string, Model): return model_string diff --git a/wagtail/wagtailembeds/views/chooser.py b/wagtail/wagtailembeds/views/chooser.py index 5892ed91b..da10e802e 100644 --- a/wagtail/wagtailembeds/views/chooser.py +++ b/wagtail/wagtailembeds/views/chooser.py @@ -1,4 +1,4 @@ -from django.forms.util import ErrorList +from django.forms.utils import ErrorList from django.utils.translation import ugettext as _ from wagtail.wagtailadmin.modal_workflow import render_modal_workflow diff --git a/wagtail/wagtailforms/forms.py b/wagtail/wagtailforms/forms.py index b91a378f6..2c1ba5fea 100644 --- a/wagtail/wagtailforms/forms.py +++ b/wagtail/wagtailforms/forms.py @@ -1,5 +1,6 @@ +from collections import OrderedDict + import django.forms -from django.utils.datastructures import SortedDict class BaseForm(django.forms.Form): @@ -75,7 +76,7 @@ class FormBuilder(object): @property def formfields(self): - formfields = SortedDict() + formfields = OrderedDict() for field in self.fields: options = self.get_field_options(field)