manager: choose new page title when duplicating (#44166)
This commit is contained in:
parent
7c1f5ef82a
commit
236fa3557a
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue