manager: duplicate cell and target a page (#60916)
This commit is contained in:
parent
7a53141025
commit
9b94f12c2c
|
@ -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()
|
||||
|
||||
|
|
|
@ -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'))
|
||||
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue