manager: duplicate cell (#51075)
gitea-wip/combo/pipeline/head Build started... Details
gitea/combo/pipeline/head Build started... Details

This commit is contained in:
Lauréline Guérin 2021-02-26 10:13:23 +01:00
parent 051afa00d8
commit cb8019bee7
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
5 changed files with 51 additions and 4 deletions

View File

@ -1148,7 +1148,7 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)):
def import_subobjects(self, cell_json):
pass
def duplicate(self, page_target=None, placeholder=None):
def duplicate(self, page_target=None, placeholder=None, reset_slug=False, set_order=False):
# clone current cell
new_cell = copy.deepcopy(self)
new_cell.pk = None
@ -1156,6 +1156,12 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)):
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:
new_cell.slug = ''
# set order if requested
if set_order:
new_cell.order = self.order + 1
# store new cell
new_cell.save()

View File

@ -18,6 +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 class="close-button" href="#">{% trans 'Close' %}</a>
{% if form %}
<button class="save submit-button">{% trans 'Save' %}</button>

View File

@ -84,6 +84,11 @@ urlpatterns = [
views.page_delete_cell,
name='combo-manager-page-delete-cell',
),
url(
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/duplicate$',
views.page_duplicate_cell,
name='combo-manager-page-duplicate-cell',
),
url(
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/options$',
views.page_cell_options,

View File

@ -626,6 +626,23 @@ class PageDeleteCellView(DeleteView):
page_delete_cell = PageDeleteCellView.as_view()
class PageDuplicateCellView(RedirectView):
permanent = False
def get_redirect_url(self, page_pk, cell_reference):
try:
cell = CellBase.get_cell(cell_reference, page_id=page_pk)
except ObjectDoesNotExist:
raise Http404()
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)
return reverse('combo-manager-page-view', kwargs={'pk': page_pk}) + '#cell-' + cell.get_reference()
page_duplicate_cell = PageDuplicateCellView.as_view()
class PageCellVisibilityView(PageEditCellView):
template_name = 'combo/cell_visibility.html'

View File

@ -1070,7 +1070,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.click(href='/%s/duplicate' % page.pk)
resp = resp.form.submit()
new_page = Page.objects.latest('pk')
assert resp.status_int == 302
@ -1085,7 +1085,7 @@ def test_duplicate_page(app, admin_user):
page.exclude_from_navigation = True
page.save()
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click('Duplicate')
resp = resp.click(href='/%s/duplicate' % page.pk)
resp = resp.form.submit()
new_page = Page.objects.latest('pk')
assert resp.status_int == 302
@ -1095,7 +1095,7 @@ 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 = resp.click(href='/%s/duplicate' % page.pk)
resp.form['title'] = 'Two'
resp = resp.form.submit()
new_page = Page.objects.latest('pk')
@ -1211,6 +1211,24 @@ def test_delete_cell(app, admin_user):
assert TextCell.objects.count() == 0
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')
app = login(app)
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='/data_textcell-%s/duplicate' % cell.pk).follow()
assert 'Cell %s has been duplicated.' % cell in resp.text
assert TextCell.objects.count() == 2
new_cell = TextCell.objects.latest('pk')
assert new_cell.slug == ''
assert new_cell.order == 1
assert new_cell.page == page
assert new_cell.placeholder == 'content'
assert PageSnapshot.objects.all().count() == 1
def test_edit_cell_visibility(app, admin_user):
Page.objects.all().delete()
page = Page(title='One', slug='one', template_name='standard')