diff --git a/combo/data/models.py b/combo/data/models.py index eba1e8e1..0e8b0c2b 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -464,12 +464,12 @@ class Page(models.Model): def is_new(self): return self.creation_timestamp > timezone.now() - datetime.timedelta(days=7) - def duplicate(self): + def duplicate(self, title=None): # clone current page new_page = copy.deepcopy(self) new_page.pk = None # set title - new_page.title = _('Copy of %s') % self.title + new_page.title = title or _('Copy of %s') % self.title # reset slug new_page.slug = None # reset snapshot diff --git a/combo/manager/forms.py b/combo/manager/forms.py index ce89e319..d98ba08e 100644 --- a/combo/manager/forms.py +++ b/combo/manager/forms.py @@ -30,6 +30,10 @@ def get_groups_as_choices(): return [(x.id, x.name) for x in Group.objects.all().order_by('name')] +class PageDuplicateForm(forms.Form): + title = forms.CharField(label=_('New title'), max_length=150, required=False) + + class PageEditTitleForm(forms.ModelForm): class Meta: model = Page diff --git a/combo/manager/templates/combo/page_duplicate.html b/combo/manager/templates/combo/page_duplicate.html new file mode 100644 index 00000000..5193ea33 --- /dev/null +++ b/combo/manager/templates/combo/page_duplicate.html @@ -0,0 +1,18 @@ +{% extends "combo/manager_base.html" %} +{% load i18n %} + +{% block appbar %} +

{% trans "Duplicate Page" %}

+{% endblock %} + +{% block content %} + +
+ {% csrf_token %} + {{ form.as_p }} +
+ + {% trans 'Cancel' %} +
+
+{% endblock %} diff --git a/combo/manager/templates/combo/page_view.html b/combo/manager/templates/combo/page_view.html index 515d8a4d..f12c9b78 100644 --- a/combo/manager/templates/combo/page_view.html +++ b/combo/manager/templates/combo/page_view.html @@ -12,7 +12,7 @@
  • {% trans 'History' %}
  • {% trans 'Export' %}
  • {% trans 'Add a child page' %}
  • -
  • {% trans 'Duplicate' %}
  • +
  • {% trans 'Duplicate' %}
  • {% trans 'Delete' %}
  • diff --git a/combo/manager/views.py b/combo/manager/views.py index 68d9ffe4..1b1517a3 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -43,7 +43,7 @@ from combo import plugins from .forms import (PageEditTitleForm, PageVisibilityForm, SiteImportForm, PageEditRedirectionForm, PageSelectTemplateForm, PageEditSlugForm, PageEditPictureForm, PageEditIncludeInNavigationForm, - PageEditDescriptionForm, CellVisibilityForm) + PageEditDescriptionForm, CellVisibilityForm, PageDuplicateForm) class HomepageView(ListView): @@ -383,17 +383,26 @@ class PageExportView(DetailView): page_export = PageExportView.as_view() -class PageDuplicateView(RedirectView): - permanent = False +class PageDuplicateView(FormView): + form_class = PageDuplicateForm + template_name = 'combo/page_duplicate.html' - def get_redirect_url(self, pk): - page = Page.objects.get(pk=pk) - new_page = page.duplicate() + def get_success_url(self): + return reverse('combo-manager-page-view', kwargs={'pk': self.new_page.pk}) + + def form_valid(self, form): + page = Page.objects.get(pk=self.kwargs['pk']) + self.new_page = page.duplicate(title=form.cleaned_data['title']) if not page.exclude_from_navigation: messages.info(self.request, _('Page %s has been duplicated, it has been marked as excluded from navigation.') % page.title) else: messages.info(self.request, _('Page %s has been duplicated.') % page.title) - return reverse('combo-manager-page-view', kwargs={'pk': new_page.pk}) + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(PageDuplicateView, self).get_context_data(**kwargs) + context['page'] = Page.objects.get(id=self.kwargs['pk']) + return context page_duplicate = PageDuplicateView.as_view() diff --git a/tests/test_manager.py b/tests/test_manager.py index bdecb31c..52f87edd 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -697,6 +697,7 @@ def test_duplicate_page(app, admin_user): app = login(app) resp = app.get('/manage/pages/%s/' % page.pk) resp = resp.click('Duplicate') + resp = resp.form.submit() new_page = Page.objects.latest('pk') assert resp.status_int == 302 assert resp.location.endswith('/manage/pages/%s/' % new_page.pk) @@ -708,6 +709,7 @@ def test_duplicate_page(app, admin_user): page.save() resp = app.get('/manage/pages/%s/' % page.pk) resp = resp.click('Duplicate') + resp = resp.form.submit() new_page = Page.objects.latest('pk') assert resp.status_int == 302 assert resp.location.endswith('/manage/pages/%s/' % new_page.pk) @@ -716,6 +718,17 @@ def test_duplicate_page(app, admin_user): assert new_page.exclude_from_navigation is True + resp = app.get('/manage/pages/%s/' % page.pk) + resp = resp.click('Duplicate') + resp.form['title'] = 'Two' + resp = resp.form.submit() + new_page = Page.objects.latest('pk') + assert resp.status_int == 302 + assert resp.location.endswith('/manage/pages/%s/' % new_page.pk) + assert new_page.title == 'Two' + assert new_page.slug == 'two' + + def test_add_edit_cell(app, admin_user): Page.objects.all().delete() page = Page(title='One', slug='one', template_name='standard')