From 43641192c20d4de19f662dd7828919b24386ae16 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 09:57:42 +0000 Subject: [PATCH 1/6] Fixed a couple of references to django.forms.util --- wagtail/wagtailadmin/menu.py | 7 +------ wagtail/wagtailembeds/views/chooser.py | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) 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/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 From cf0e17d94c834c17ac30f3e21a1258688bdd7d53 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 10:22:38 +0000 Subject: [PATCH 2/6] Added tests for resolve_model_string To make sure I don't change its behaviour in the next commit --- wagtail/wagtailcore/tests/tests.py | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) 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) From 354a5aaa8025f5f5e9f3ae628a4e5bff8aadc2f1 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 10:25:42 +0000 Subject: [PATCH 3/6] Removed reference to django.db.get_models in resolve_model_string --- wagtail/wagtailcore/utils.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 From 9cf1a81034eb372d391dcf68e8c6c1896d5365b5 Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 10:28:07 +0000 Subject: [PATCH 4/6] Fixed another reference to django.db.get_models --- wagtail/wagtailcore/query.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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() From d0b0d57ca5e5ff2940fe2364e3453b26550549ba Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 10:34:39 +0000 Subject: [PATCH 5/6] Ignore PendingDeprecationWarnings --- wagtail/tests/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 50e4cdf8b8306c64f46d5629ea7bf50b0a51145b Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Fri, 6 Feb 2015 10:39:04 +0000 Subject: [PATCH 6/6] Replaced SortedDict with OrderedDict --- wagtail/wagtailforms/forms.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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)