manager: duplicate cell and target a page (#60916)
gitea-wip/combo/pipeline/head There was a failure building this commit Details
gitea/combo/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Lauréline Guérin 2022-02-25 11:34:18 +01:00
parent 7a53141025
commit 9b94f12c2c
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
6 changed files with 126 additions and 20 deletions

View File

@ -1283,12 +1283,21 @@ class CellBase(models.Model, metaclass=CellMeta):
new_cell.page = page_target or self.page
# set placeholder
new_cell.placeholder = placeholder or new_cell.placeholder
# reset slug if requested
if reset_slug:
# reset slug if requested and if duplicate on the same page
if reset_slug and new_cell.page == self.page:
new_cell.slug = ''
# set order if requested
if set_order:
new_cell.order = self.order + 1
if new_cell.page == self.page:
order = self.order + 1
else:
page_cells = CellBase.get_cells(page_id=new_cell.page.pk)
orders = [x.order for x in page_cells]
if orders:
order = max(orders) + 1
else:
order = 1
new_cell.order = order
# store new cell
new_cell.save()

View File

@ -25,6 +25,7 @@ from django.template import Template, TemplateSyntaxError
from django.template.loader import TemplateDoesNotExist, get_template
from django.utils.translation import ugettext_lazy as _
from combo.data.forms import get_page_choices
from combo.data.models import Page, ParentContentCell, SiteSettings, compile_sub_slug
from .fields import ImageIncludingSvgField
@ -319,6 +320,20 @@ class CellVisibilityForm(forms.Form):
return self.instance
class CellDuplicateForm(forms.Form):
target_page = forms.ModelChoiceField(
label=_('Target page'),
queryset=Page.objects.all(),
)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.current_page = kwargs.pop('current_page')
super().__init__(*args, **kwargs)
self.fields['target_page'].widget = forms.Select(choices=get_page_choices())
self.fields['target_page'].initial = self.current_page
class SiteImportForm(forms.Form):
site_file = forms.FileField(label=_('Site Export File'))

View File

@ -0,0 +1,18 @@
{% extends "combo/manager_base.html" %}
{% load i18n %}
{% block appbar %}
<h2>{% trans "Duplicate Cell" %}</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=current_page.pk %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -18,7 +18,7 @@
<a rel="popup" href="{% url 'combo-manager-page-visibility-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Visibility' %}</a> |
<a rel="popup" href="{% url 'combo-manager-page-options-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Options' %}</a> |
{% if cell.can_have_assets %}<a rel="popup" data-selector="div#assets-listing" href="{% url 'combo-manager-slot-assets' cell_reference=cell.get_reference %}">{% trans 'Assets' %}</a> |{% endif %}
<a href="{% url 'combo-manager-page-duplicate-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Duplicate' %}</a> |
<a rel="popup" href="{% url 'combo-manager-page-duplicate-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Duplicate' %}</a> |
<a class="close-button" href="#">{% trans 'Close' %}</a>
{% if form %}
<button class="save submit-button">{% trans 'Save' %}</button>

View File

@ -60,6 +60,7 @@ from combo.urls_utils import staff_required
from combo.utils.misc import is_portal_agent
from .forms import (
CellDuplicateForm,
CellVisibilityForm,
PageAddForm,
PageDuplicateForm,
@ -735,21 +736,52 @@ class PageDeleteCellView(ManagedPageMixin, DeleteView):
page_delete_cell = PageDeleteCellView.as_view()
class PageDuplicateCellView(ManagedPageMixin, RedirectView):
permanent = False
class PageDuplicateCellView(ManagedPageMixin, FormView):
form_class = CellDuplicateForm
template_name = 'combo/cell_duplicate.html'
def get_redirect_url(self, page_pk, cell_reference):
def dispatch(self, request, *args, **kwargs):
try:
cell = CellBase.get_cell(cell_reference, page_id=page_pk)
except ObjectDoesNotExist:
raise Http404()
new_cell = cell.duplicate(reset_slug=True, set_order=True)
PageSnapshot.take(cell.page, request=self.request, comment=_('duplicated cell "%s"') % cell)
messages.info(self.request, _('Cell %s has been duplicated.') % cell)
self.current_cell = CellBase.get_cell(kwargs['cell_reference'], page=kwargs['page_pk'])
except LinkListCell.DoesNotExist:
raise Http404
return super().dispatch(request, *args, **kwargs)
def get_success_url(self):
return (
reverse('combo-manager-page-view', kwargs={'pk': page_pk}) + '#cell-' + new_cell.get_reference()
reverse('combo-manager-page-view', kwargs={'pk': self.new_cell.page.pk})
+ '#cell-'
+ self.new_cell.get_reference()
)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['request'] = self.request
kwargs['current_page'] = self.page
return kwargs
def form_valid(self, form):
self.new_cell = self.current_cell.duplicate(
page_target=form.cleaned_data['target_page'], reset_slug=True, set_order=True
)
if self.new_cell.page == self.page:
PageSnapshot.take(
self.new_cell.page, request=self.request, comment=_('duplicated cell "%s"') % self.new_cell
)
else:
PageSnapshot.take(
self.new_cell.page,
request=self.request,
comment=_('added cell "%s", duplicated from "%s" page') % (self.new_cell, self.page),
)
messages.info(self.request, _('Cell %s has been duplicated.') % self.current_cell)
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['current_page'] = self.page
return context
page_duplicate_cell = PageDuplicateCellView.as_view()

View File

@ -1380,23 +1380,55 @@ def test_delete_cell(app, admin_user):
def test_duplicate_cell(app, admin_user):
page = Page.objects.create(
title='One', slug='one', template_name='standard', exclude_from_navigation=False
)
cell = TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0, slug='foobar')
page = Page.objects.create(title='One', slug='one', template_name='standard')
cell = TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=1, slug='foobar')
app = login(app)
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='/data_textcell-%s/duplicate' % cell.pk)
assert resp.form['target_page'].value == str(page.pk)
resp = resp.form.submit()
assert TextCell.objects.count() == 2
new_cell = TextCell.objects.latest('pk')
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, new_cell.get_reference()))
resp = resp.follow()
assert 'Cell %s has been duplicated.' % cell in resp.text
assert new_cell.slug == ''
assert new_cell.order == 1
assert new_cell.order == 2
assert new_cell.page == page
assert new_cell.placeholder == 'content'
assert PageSnapshot.objects.all().count() == 1
assert PageSnapshot.objects.filter(page=page).count() == 1
assert PageSnapshot.objects.get(page=page).comment == 'duplicated cell "Text (Foobar)"'
other_page = Page.objects.create(title='Two', slug='two', template_name='standard')
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='/data_textcell-%s/duplicate' % cell.pk)
resp.form['target_page'] = other_page.pk
resp = resp.form.submit()
assert TextCell.objects.count() == 3
new_cell = TextCell.objects.latest('pk')
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (other_page.pk, new_cell.get_reference()))
resp = resp.follow()
assert 'Cell %s has been duplicated.' % cell in resp.text
assert new_cell.slug == 'foobar'
assert new_cell.order == 1
assert new_cell.page == other_page
assert new_cell.placeholder == 'content'
assert PageSnapshot.objects.filter(page=page).count() == 1
assert PageSnapshot.objects.filter(page=other_page).count() == 1
assert (
PageSnapshot.objects.get(page=other_page).comment
== 'added cell "Text (Foobar)", duplicated from "One" page'
)
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='/data_textcell-%s/duplicate' % cell.pk)
resp.form['target_page'] = other_page.pk
resp = resp.form.submit()
assert TextCell.objects.count() == 4
new_cell = TextCell.objects.latest('pk')
assert new_cell.order == 2
assert PageSnapshot.objects.filter(page=page).count() == 1
assert PageSnapshot.objects.filter(page=other_page).count() == 2
def test_edit_cell_visibility(app, admin_user):