manager: choose new page title when duplicating (#44166)

This commit is contained in:
Valentin Deniaud 2020-06-18 13:54:07 +02:00 committed by Frédéric Péters
parent 7c1f5ef82a
commit 236fa3557a
6 changed files with 54 additions and 10 deletions

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,18 @@
{% extends "combo/manager_base.html" %}
{% load i18n %}
{% block appbar %}
<h2>{% trans "Duplicate Page" %}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="{% url 'combo-manager-page-view' pk=page.id %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -12,7 +12,7 @@
<li><a class="action-history" href="{% url 'combo-manager-page-history' pk=object.id %}">{% trans 'History' %}</a></li>
<li><a class="action-export" download href="{% url 'combo-manager-page-export' pk=object.id %}">{% trans 'Export' %}</a></li>
<li><a class="action-add-child" rel="popup" href="{% url 'combo-manager-page-add-child' pk=object.id %}">{% trans 'Add a child page' %}</a></li>
<li><a class="action-duplicate" href="{% url 'combo-manager-page-duplicate' pk=object.id %}">{% trans 'Duplicate' %}</a></li>
<li><a rel="popup" class="action-duplicate" href="{% url 'combo-manager-page-duplicate' pk=object.id %}">{% trans 'Duplicate' %}</a></li>
<li><a class="action-delete" rel="popup" href="{% url 'combo-manager-page-delete' pk=object.id %}">{% trans 'Delete' %}</a></li>
</ul>
</span>

View File

@ -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()

View File

@ -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')