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 %}
+
+
+{% 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')