diff --git a/MANIFEST.in b/MANIFEST.in index 8777ece..e0a0722 100755 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,5 +3,6 @@ recursive-include docs *.rst conf.py Makefile make.bat recursive-include wagtail_modeltranslation/static * recursive-include wagtail_modeltranslation/management * recursive-include wagtail_modeltranslation/templatetags * +recursive-include wagtail_modeltranslation/templates * global-exclude *.pyc global-exclude *.DS_Store diff --git a/PKG-INFO b/PKG-INFO index efd0dac..2065cc3 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: wagtail-modeltranslation -Version: 0.10.1 +Version: 0.10.5 Summary: Translates Wagtail CMS models using a registration approach. Home-page: https://github.com/infoportugal/wagtail-modeltranslation Author: InfoPortugal S.A. diff --git a/setup.cfg b/setup.cfg index 5683838..b45caaa 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.10.2 +current_version = 0.10.5 commit = True tag = True diff --git a/setup.py b/setup.py index e0f6910..6493772 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,8 @@ setup( 'wagtail_modeltranslation.migrate.management', 'wagtail_modeltranslation.migrate.management.commands'], package_data={'wagtail_modeltranslation': ['static/wagtail_modeltranslation/css/*.css', - 'static/wagtail_modeltranslation/js/*.js']}, + 'static/wagtail_modeltranslation/js/*.js', + 'templates/*.html']}, install_requires=['wagtail>=1.12', 'django-modeltranslation>=0.13'], classifiers=[ 'Programming Language :: Python', diff --git a/wagtail_modeltranslation/__init__.py b/wagtail_modeltranslation/__init__.py index 41202b0..cd017cc 100644 --- a/wagtail_modeltranslation/__init__.py +++ b/wagtail_modeltranslation/__init__.py @@ -1,3 +1,3 @@ # coding: utf-8 -__version__ = '0.10.2' +__version__ = '0.10.5' default_app_config = 'wagtail_modeltranslation.apps.ModeltranslationConfig' diff --git a/wagtail_modeltranslation/patch_wagtailadmin_forms.py b/wagtail_modeltranslation/patch_wagtailadmin_forms.py new file mode 100644 index 0000000..f42711c --- /dev/null +++ b/wagtail_modeltranslation/patch_wagtailadmin_forms.py @@ -0,0 +1,107 @@ +# coding: utf-8 + +from django import forms +from django.conf import settings +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext as _ +from django.utils.translation import ungettext + +try: + from wagtail.core.models import Page + from wagtail.admin import widgets + from wagtail.admin.forms.pages import CopyForm +except ImportError: + from wagtail.wagtailcore.models import Page + from wagtail.wagtailadmin import widgets + from wagtail.wagtailadmin.forms import CopyForm + + +class PatchedCopyForm(CopyForm): + def __init__(self, *args, **kwargs): + # CopyPage must be passed a 'page' kwarg indicating the page to be copied + self.page = kwargs.pop('page') + self.user = kwargs.pop('user', None) + can_publish = kwargs.pop('can_publish') + super(CopyForm, self).__init__(*args, **kwargs) + + #self.fields['new_title'] = forms.CharField(initial=self.page.title, label=_("New title")) + for code, name in settings.LANGUAGES: + locale_title = "new_title_{}".format(code) + locale_label = "{} [{}]".format(_("New title"), code) + self.fields[locale_title] = forms.CharField(initial=self.page.title, label=locale_label) + + #self.fields['new_slug'] = forms.SlugField(initial=self.page.slug, label=_("New slug")) + for code, name in settings.LANGUAGES: + locale_title = "new_slug_{}".format(code) + locale_label = "{} [{}]".format(_("New slug"), code) + self.fields[locale_title] = forms.SlugField(initial=self.page.slug, label=locale_label) + + self.fields['new_parent_page'] = forms.ModelChoiceField( + initial=self.page.get_parent(), + queryset=Page.objects.all(), + widget=widgets.AdminPageChooser(can_choose_root=True, user_perms='copy_to'), + label=_("New parent page"), + help_text=_("This copy will be a child of this given parent page.") + ) + pages_to_copy = self.page.get_descendants(inclusive=True) + subpage_count = pages_to_copy.count() - 1 + if subpage_count > 0: + self.fields['copy_subpages'] = forms.BooleanField( + required=False, initial=True, label=_("Copy subpages"), + help_text=ungettext( + "This will copy %(count)s subpage.", + "This will copy %(count)s subpages.", + subpage_count) % {'count': subpage_count}) + + if can_publish: + pages_to_publish_count = pages_to_copy.live().count() + if pages_to_publish_count > 0: + # In the specific case that there are no subpages, customise the field label and help text + if subpage_count == 0: + label = _("Publish copied page") + help_text = _("This page is live. Would you like to publish its copy as well?") + else: + label = _("Publish copies") + help_text = ungettext( + "%(count)s of the pages being copied is live. Would you like to publish its copy?", + "%(count)s of the pages being copied are live. Would you like to publish their copies?", + pages_to_publish_count) % {'count': pages_to_publish_count} + + self.fields['publish_copies'] = forms.BooleanField( + required=False, initial=True, label=label, help_text=help_text + ) + + def clean(self): + cleaned_data = super(CopyForm, self).clean() + + # Make sure the slug isn't already in use + # slug = cleaned_data.get('new_slug') + + # New parent page given in form or parent of source, if parent_page is empty + parent_page = cleaned_data.get('new_parent_page') or self.page.get_parent() + + # check if user is allowed to create a page at given location. + if not parent_page.permissions_for_user(self.user).can_add_subpage(): + raise ValidationError({ + 'new_parent_page': _("You do not have permission to copy to page \"%(page_title)s\"") % {'page_title': parent_page.get_admin_display_title()} + }) + + # Count the pages with the same slug within the context of our copy's parent page + for code, name in settings.LANGUAGES: + locale_slug = "new_slug_{}".format(code) + slug = cleaned_data.get(locale_slug) + + param = 'slug_' + code + query = {param: slug} + if slug and parent_page.get_children().filter(**query).count(): + raise ValidationError({ + locale_slug: _("This slug is already in use within the context of its parent page \"%s\"" % parent_page) + }) + + # Don't allow recursive copies into self + if cleaned_data.get('copy_subpages') and (self.page == parent_page or parent_page.is_descendant_of(self.page)): + raise ValidationError({ + 'new_parent_page': _("You cannot copy a page into itself when copying subpages") + }) + + return cleaned_data diff --git a/wagtail_modeltranslation/templates/modeltranslation_copy.html b/wagtail_modeltranslation/templates/modeltranslation_copy.html new file mode 100644 index 0000000..b63e610 --- /dev/null +++ b/wagtail_modeltranslation/templates/modeltranslation_copy.html @@ -0,0 +1,31 @@ +{% extends "wagtailadmin/base.html" %} +{% load i18n %} +{% block titletag %}{% blocktrans with title=page.get_admin_display_title %}Copy {{ title }}{% endblocktrans %}{% endblock %} +{% block content %} + {% trans "Copy" as copy_str %} + {% include "wagtailadmin/shared/header.html" with title=copy_str subtitle=page.get_admin_display_title icon="doc-empty-inverse" %} + +