diff --git a/.travis.yml b/.travis.yml index 52528e2..15e53fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,17 +2,20 @@ language: python python: - "3.6" env: - - WAGTAIL="wagtail>=1.13,<1.14" DB=sqlite + - WAGTAIL="wagtail>=2.0,<2.1" DB=sqlite matrix: include: # Latest Wagtail version - - env: WAGTAIL="wagtail>=1.13,<1.14" DB=sqlite - - env: WAGTAIL="wagtail>=1.13,<1.14" DB=postgres - - env: WAGTAIL="wagtail>=1.13,<1.14" DB=mysql + - env: WAGTAIL="wagtail>=2.0,<2.1" DB=sqlite + - env: WAGTAIL="wagtail>=2.0,<2.1" DB=postgres + - env: WAGTAIL="wagtail>=2.0,<2.1" DB=mysql - python: "3.5" - python: "3.4" - - python: "2.7" # Past Wagtail versions + - python: "3.6" + env: WAGTAIL="wagtail>=1.13,<1.14" + - python: "2.7" # Wagtail 1.13 was the latest tested against 2.7 + env: WAGTAIL="wagtail>=1.13,<1.14" - python: "3.6" env: WAGTAIL="wagtail>=1.12,<1.13" - python: "3.6" diff --git a/runtests.py b/runtests.py index 185985d..ccd96a2 100755 --- a/runtests.py +++ b/runtests.py @@ -5,6 +5,10 @@ import sys import django from django.conf import settings from django.core.management import call_command +try: + from wagtail import VERSION +except ImportError: + VERSION = 1, 6, 3 # assume it's 1.6.3, the latest version without VERSION def runtests(): @@ -31,14 +35,9 @@ def runtests(): }) # Configure test environment - settings.configure( - DATABASES=DATABASES, - INSTALLED_APPS=( - 'django.contrib.contenttypes', - 'django.contrib.auth', - 'taggit', - 'rest_framework', - + import wagtail + if VERSION[0] < 2: + WAGTAIL_MODULES = [ 'wagtail.wagtailcore', 'wagtail.wagtailadmin', 'wagtail.wagtaildocs', @@ -52,13 +51,41 @@ def runtests(): 'wagtail.wagtailsites', 'wagtail.contrib.settings', 'wagtail.contrib.wagtailapi', + ] + WAGTAIL_CORE = 'wagtail.wagtailcore' + else: + WAGTAIL_MODULES = [ + 'wagtail.core', + 'wagtail.admin', + 'wagtail.documents', + 'wagtail.snippets', + 'wagtail.users', + 'wagtail.images', + 'wagtail.embeds', + 'wagtail.search', + 'wagtail.contrib.redirects', + 'wagtail.contrib.forms', + 'wagtail.sites', + 'wagtail.contrib.settings', + 'wagtail.api' + ] + WAGTAIL_CORE = 'wagtail.core' + + settings.configure( + DATABASES=DATABASES, + INSTALLED_APPS=[ + 'django.contrib.contenttypes', + 'django.contrib.auth', + 'taggit', + 'rest_framework'] + + WAGTAIL_MODULES + [ 'wagtail_modeltranslation.makemigrations', 'wagtail_modeltranslation', - ), + ], # remove wagtailcore from serialization as translation columns have not been created at this point # (which causes OperationalError: no such column) - TEST_NON_SERIALIZED_APPS=['wagtail.wagtailcore'], + TEST_NON_SERIALIZED_APPS=[WAGTAIL_CORE], ROOT_URLCONF=None, # tests override urlconf, but it still needs to be defined LANGUAGES=( ('en', 'English'), diff --git a/setup.py b/setup.py index 04496b3..28c8377 100755 --- a/setup.py +++ b/setup.py @@ -27,7 +27,8 @@ setup( 'wagtail_modeltranslation.makemigrations.management.commands'], package_data={'wagtail_modeltranslation': ['static/wagtail_modeltranslation/css/*.css', 'static/wagtail_modeltranslation/js/*.js']}, - install_requires=['wagtail(>=1.4)', 'django-modeltranslation(>=0.12.2)'], + install_requires=[ + 'wagtail(>=1.4,<2)', 'django-modeltranslation(>=0.12.2)'], download_url='https://github.com/infoportugal/wagtail-modeltranslation/archive/v0.8.tar.gz', classifiers=[ 'Programming Language :: Python', diff --git a/wagtail_modeltranslation/management/commands/set_translation_url_paths.py b/wagtail_modeltranslation/management/commands/set_translation_url_paths.py index 21720a9..869e67d 100644 --- a/wagtail_modeltranslation/management/commands/set_translation_url_paths.py +++ b/wagtail_modeltranslation/management/commands/set_translation_url_paths.py @@ -3,8 +3,11 @@ from django.core.management.base import BaseCommand from modeltranslation import settings as mt_settings from modeltranslation.utils import build_localized_fieldname -from wagtail.wagtailcore.models import Page from wagtail_modeltranslation.contextlib import use_language +try: + from wagtail.core.models import Page +except ImportError: + from wagtail.wagtailcore.models import Page class Command(BaseCommand): diff --git a/wagtail_modeltranslation/management/commands/sync_page_translation_fields.py b/wagtail_modeltranslation/management/commands/sync_page_translation_fields.py index ec75d1e..bfa3b6f 100644 --- a/wagtail_modeltranslation/management/commands/sync_page_translation_fields.py +++ b/wagtail_modeltranslation/management/commands/sync_page_translation_fields.py @@ -1,6 +1,9 @@ from modeltranslation.management.commands.sync_translation_fields import Command as SyncTranslationsFieldsCommand from modeltranslation.translator import translator -from wagtail.wagtailcore.models import Page +try: + from wagtail.core.models import Page +except ImportError: + from wagtail.wagtailcore.models import Page old_get_registered_models = translator.get_registered_models diff --git a/wagtail_modeltranslation/patch_wagtailadmin.py b/wagtail_modeltranslation/patch_wagtailadmin.py index 3219a74..f45647c 100644 --- a/wagtail_modeltranslation/patch_wagtailadmin.py +++ b/wagtail_modeltranslation/patch_wagtailadmin.py @@ -15,19 +15,30 @@ from modeltranslation.translator import translator, NotRegistered from modeltranslation.utils import build_localized_fieldname, get_language from wagtail.contrib.settings.models import BaseSetting from wagtail.contrib.settings.views import get_setting_edit_handler -from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin -from wagtail.wagtailadmin.edit_handlers import FieldPanel, \ - MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel, RichTextFieldPanel -from wagtail.wagtailcore.models import Page -from wagtail.wagtailcore.fields import StreamField, StreamValue -from wagtail.wagtailcore.url_routing import RouteResult -from wagtail.wagtailimages.edit_handlers import ImageChooserPanel -from wagtail.wagtailsearch.index import SearchField -from wagtail.wagtailsnippets.models import get_snippet_models -from wagtail.wagtailsnippets.views.snippets import SNIPPET_EDIT_HANDLERS - from wagtail_modeltranslation.settings import CUSTOM_SIMPLE_PANELS, CUSTOM_COMPOSED_PANELS from wagtail_modeltranslation.utils import compare_class_tree_depth +try: + from wagtail.contrib.routable_page.models import RoutablePageMixin + from wagtail.admin.edit_handlers import FieldPanel, \ + MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel, RichTextFieldPanel + from wagtail.core.models import Page + from wagtail.core.fields import StreamField, StreamValue + from wagtail.core.url_routing import RouteResult + from wagtail.images.edit_handlers import ImageChooserPanel + from wagtail.search.index import SearchField + from wagtail.snippets.models import get_snippet_models + from wagtail.snippets.views.snippets import SNIPPET_EDIT_HANDLERS +except ImportError: + from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin + from wagtail.wagtailadmin.edit_handlers import FieldPanel, \ + MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel, RichTextFieldPanel + from wagtail.wagtailcore.models import Page + from wagtail.wagtailcore.fields import StreamField, StreamValue + from wagtail.wagtailcore.url_routing import RouteResult + from wagtail.wagtailimages.edit_handlers import ImageChooserPanel + from wagtail.wagtailsearch.index import SearchField + from wagtail.wagtailsnippets.models import get_snippet_models + from wagtail.wagtailsnippets.views.snippets import SNIPPET_EDIT_HANDLERS logger = logging.getLogger('wagtail.core') diff --git a/wagtail_modeltranslation/templatetags/wagtail_modeltranslation.py b/wagtail_modeltranslation/templatetags/wagtail_modeltranslation.py index d35ce65..d66a75c 100644 --- a/wagtail_modeltranslation/templatetags/wagtail_modeltranslation.py +++ b/wagtail_modeltranslation/templatetags/wagtail_modeltranslation.py @@ -3,13 +3,21 @@ import re from django import template -from django.core.urlresolvers import resolve from django.utils.translation import activate, get_language +try: + from django.core.urlresolvers import resolve +except ImportError: + from django.urls import resolve + from six import iteritems -from wagtail.wagtailcore.models import Page -from wagtail.wagtailcore.templatetags.wagtailcore_tags import pageurl +try: + from wagtail.core.models import Page + from wagtail.core.templatetags.wagtailcore_tags import pageurl +except ImportError: + from wagtail.wagtailcore.models import Page + from wagtail.wagtailcore.templatetags.wagtailcore_tags import pageurl from modeltranslation import settings as mt_settings from modeltranslation.settings import DEFAULT_LANGUAGE diff --git a/wagtail_modeltranslation/tests/models.py b/wagtail_modeltranslation/tests/models.py index eec8519..95885d3 100755 --- a/wagtail_modeltranslation/tests/models.py +++ b/wagtail_modeltranslation/tests/models.py @@ -2,14 +2,25 @@ from django.db import models from django.http import HttpResponse from modelcluster.fields import ParentalKey -from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route -from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel -from wagtail.wagtailcore import blocks -from wagtail.wagtailcore.fields import StreamField -from wagtail.wagtailcore.models import Page as WagtailPage -from wagtail.wagtailimages.edit_handlers import ImageChooserPanel -from wagtail.wagtailsearch import index -from wagtail.wagtailsnippets.models import register_snippet +try: + from wagtail.contrib.routable_page.models import RoutablePageMixin, route + from wagtail.admin.edit_handlers import FieldPanel, MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel + from wagtail.core import blocks + from wagtail.core.fields import StreamField + from wagtail.core.models import Page as WagtailPage + from wagtail.images.edit_handlers import ImageChooserPanel + from wagtail.search import index + from wagtail.snippets.models import register_snippet +except ImportError: + from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route + from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, FieldRowPanel, InlinePanel, \ + StreamFieldPanel + from wagtail.wagtailcore import blocks + from wagtail.wagtailcore.fields import StreamField + from wagtail.wagtailcore.models import Page as WagtailPage + from wagtail.wagtailimages.edit_handlers import ImageChooserPanel + from wagtail.wagtailsearch import index + from wagtail.wagtailsnippets.models import register_snippet # Wagtail Models diff --git a/wagtail_modeltranslation/tests/tests.py b/wagtail_modeltranslation/tests/tests.py index 55a5f44..cf6d54c 100755 --- a/wagtail_modeltranslation/tests/tests.py +++ b/wagtail_modeltranslation/tests/tests.py @@ -59,12 +59,16 @@ class WagtailModeltranslationTransactionTestBase(TransactionTestCase): # reload the translation module to register the Page model # and also edit_handlers so any patches made to Page are reapplied - from wagtail_modeltranslation import translation as wag_translation - from wagtail.wagtailadmin import edit_handlers import sys del cls.cache.all_models['wagtailcore'] sys.modules.pop('wagtail_modeltranslation.translation.pagetr', None) - sys.modules.pop('wagtail.wagtailcore.models', None) + from wagtail_modeltranslation import translation as wag_translation + try: + from wagtail.admin import edit_handlers + sys.modules.pop('wagtail.core.models', None) + except ImportError: + from wagtail.wagtailadmin import edit_handlers + sys.modules.pop('wagtail.wagtailcore.models', None) imp.reload(wag_translation) imp.reload(edit_handlers) # so Page can be repatched by edit_handlers wagtailcore_args = [] @@ -136,7 +140,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): super(WagtailModeltranslationTest, cls).setUpClass() # Delete the default wagtail pages from db - from wagtail.wagtailcore.models import Page + try: + from wagtail.core.models import Page + except ImportError: + from wagtail.wagtailcore.models import Page Page.objects.delete() def test_page_fields(self): @@ -170,7 +177,11 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertEquals(len(panels), 2) # Validate if the created panels are instances of FieldPanel - from wagtail.wagtailadmin.edit_handlers import FieldPanel + try: + from wagtail.admin.edit_handlers import FieldPanel + except ImportError: + from wagtail.wagtailadmin.edit_handlers import FieldPanel + self.assertIsInstance(panels[0], FieldPanel) self.assertIsInstance(panels[1], FieldPanel) @@ -182,7 +193,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): # Check if there is one panel per language self.assertEquals(len(panels), 2) - from wagtail.wagtailimages.edit_handlers import ImageChooserPanel + try: + from wagtail.images.edit_handlers import ImageChooserPanel + except ImportError: + from wagtail.wagtailimages.edit_handlers import ImageChooserPanel self.assertIsInstance(panels[0], ImageChooserPanel) self.assertIsInstance(panels[1], ImageChooserPanel) @@ -194,7 +208,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): # Check if the fieldrowpanel still exists self.assertEqual(len(panels), 1) - from wagtail.wagtailadmin.edit_handlers import FieldRowPanel + try: + from wagtail.admin.edit_handlers import FieldRowPanel + except ImportError: + from wagtail.wagtailadmin.edit_handlers import FieldRowPanel self.assertIsInstance(panels[0], FieldRowPanel) # Check if the children were correctly patched using the fieldpanel test @@ -206,7 +223,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): # Check if there is one panel per language self.assertEquals(len(panels), 2) - from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel + try: + from wagtail.admin.edit_handlers import StreamFieldPanel + except ImportError: + from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel self.assertIsInstance(panels[0], StreamFieldPanel) self.assertIsInstance(panels[1], StreamFieldPanel) @@ -219,7 +239,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertEquals(len(child_block), 1) - from wagtail.wagtailcore.blocks import CharBlock + try: + from wagtail.core.blocks import CharBlock + except ImportError: + from wagtail.wagtailcore.blocks import CharBlock self.assertEquals(child_block[0][0], 'text') self.assertIsInstance(child_block[0][1], CharBlock) @@ -239,7 +262,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): # children panels self.assertEquals(len(panels), 3) - from wagtail.wagtailadmin.edit_handlers import MultiFieldPanel + try: + from wagtail.admin.edit_handlers import MultiFieldPanel + except ImportError: + from wagtail.wagtailadmin.edit_handlers import MultiFieldPanel self.assertIsInstance(panels[0], MultiFieldPanel) self.assertIsInstance(panels[1], MultiFieldPanel) self.assertIsInstance(panels[2], MultiFieldPanel) @@ -294,7 +320,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): page_edit_handler = models.InlinePanelPage.get_edit_handler() - form = page_edit_handler.get_form_class(models.InlinePanelPage) + if VERSION[0] < 2: + form = page_edit_handler.get_form_class(models.InlinePanelPage) + else: + form = page_edit_handler.get_form_class() page_base_fields = ['slug_de', 'slug_en', 'seo_title_de', 'seo_title_en', 'search_description_de', 'search_description_en', u'show_in_menus', u'go_live_at', u'expire_at'] @@ -324,10 +353,16 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): In this test we use the InlinePanelSnippet model because it has all the possible "patchable" fields so if the created form has all fields the the form was correctly patched """ - from wagtail.wagtailsnippets.views.snippets import get_snippet_edit_handler + try: + from wagtail.snippets.views.snippets import get_snippet_edit_handler + except ImportError: + from wagtail.wagtailsnippets.views.snippets import get_snippet_edit_handler snippet_edit_handler = get_snippet_edit_handler(models.InlinePanelSnippet) - form = snippet_edit_handler.get_form_class(models.InlinePanelSnippet) + if VERSION[0] < 2: + form = snippet_edit_handler.get_form_class(models.InlinePanelSnippet) + else: + form = snippet_edit_handler.get_form_class() inline_model_fields = ['field_name_de', 'field_name_en', 'image_chooser_de', 'image_chooser_en', 'fieldrow_name_de', 'fieldrow_name_en', 'name_de', 'name_en', 'image_de', 'image_en', @@ -343,7 +378,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertItemsEqual(inline_model_fields, related_formset_form.base_fields.keys()) def test_duplicate_slug(self): - from wagtail.wagtailcore.models import Site + try: + from wagtail.core.models import Site + except ImportError: + from wagtail.wagtailcore.models import Site # Create a test Site with a root page root = models.TestRootPage(title='title', depth=1, path='0001', slug_en='slug_en', slug_de='slug_de') root.save() @@ -406,7 +444,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertEqual(slugurl_trans(context, 'child-slugurl-en', 'en'), '/en/child-slugurl-en/') def test_relative_url(self): - from wagtail.wagtailcore.models import Site + try: + from wagtail.core.models import Site + except ImportError: + from wagtail.wagtailcore.models import Site # Create a test Site with a root page root = models.TestRootPage(title='title slugurl', depth=1, path='0004', slug_en='title_slugurl_en', slug_de='title_slugurl_de') @@ -481,7 +522,10 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): Assert translation URL Paths are correctly set in page and descendants for a slug change and page move operations """ - from wagtail.wagtailcore.models import Site + try: + from wagtail.core.models import Site + except ImportError: + from wagtail.wagtailcore.models import Site # Create a test Site with a root page root = models.TestRootPage.objects.create(title='url paths', depth=1, path='0006', slug='url-path-slug') diff --git a/wagtail_modeltranslation/tests/urls.py b/wagtail_modeltranslation/tests/urls.py index 17d50aa..377a735 100755 --- a/wagtail_modeltranslation/tests/urls.py +++ b/wagtail_modeltranslation/tests/urls.py @@ -2,7 +2,10 @@ from django.conf.urls import include, url from django.conf.urls.i18n import i18n_patterns from django.views.i18n import set_language -from wagtail.wagtailcore import urls as wagtail_urls +try: + from wagtail.core import urls as wagtail_urls +except ImportError: + from wagtail.wagtailcore import urls as wagtail_urls urlpatterns = [ url(r'^set_language/$', set_language, {}, diff --git a/wagtail_modeltranslation/tests/util.py b/wagtail_modeltranslation/tests/util.py index 98d7f85..39884d8 100644 --- a/wagtail_modeltranslation/tests/util.py +++ b/wagtail_modeltranslation/tests/util.py @@ -33,7 +33,10 @@ class PageFactory(object): if not nodes: return None - from wagtail.wagtailcore.models import Site + try: + from wagtail.core.models import Site + except ImportError: + from wagtail.wagtailcore.models import Site root_node = self.create_instance(nodes) site = Site.objects.create(root_page=root_node) return site diff --git a/wagtail_modeltranslation/translation.py b/wagtail_modeltranslation/translation.py index 34375b1..8b9538a 100644 --- a/wagtail_modeltranslation/translation.py +++ b/wagtail_modeltranslation/translation.py @@ -2,8 +2,10 @@ from modeltranslation.decorators import register from modeltranslation.translator import TranslationOptions -from wagtail.wagtailcore.models import Page - +try: + from wagtail.core.models import Page +except ImportError: + from wagtail.wagtailcore.models import Page @register(Page) class PageTR(TranslationOptions): diff --git a/wagtail_modeltranslation/wagtail_hooks.py b/wagtail_modeltranslation/wagtail_hooks.py index 49b8c82..fa62dac 100644 --- a/wagtail_modeltranslation/wagtail_hooks.py +++ b/wagtail_modeltranslation/wagtail_hooks.py @@ -9,9 +9,14 @@ from django.http import QueryDict from django.utils.html import format_html, format_html_join, escape from django.views.decorators.csrf import csrf_exempt from six import iteritems -from wagtail.wagtailcore import hooks -from wagtail.wagtailcore.models import Page -from wagtail.wagtailcore.rich_text import PageLinkHandler +try: + from wagtail.core import hooks + from wagtail.core.models import Page + from wagtail.core.rich_text.pages import PageLinkHandler +except ImportError: + from wagtail.wagtailcore import hooks + from wagtail.wagtailcore.models import Page + from wagtail.wagtailcore.rich_text import PageLinkHandler @hooks.register('insert_editor_js')