0001-manager-duplicate-cell-51075.patch
combo/data/models.py | ||
---|---|---|
1099 | 1099 |
def import_subobjects(self, cell_json): |
1100 | 1100 |
pass |
1101 | 1101 | |
1102 |
def duplicate(self, page_target=None, placeholder=None): |
|
1102 |
def duplicate(self, page_target=None, placeholder=None, reset_slug=False, set_order=False):
|
|
1103 | 1103 |
# clone current cell |
1104 | 1104 |
new_cell = copy.deepcopy(self) |
1105 | 1105 |
new_cell.pk = None |
... | ... | |
1107 | 1107 |
new_cell.page = page_target or self.page |
1108 | 1108 |
# set placeholder |
1109 | 1109 |
new_cell.placeholder = placeholder or new_cell.placeholder |
1110 |
# reset slug if requested |
|
1111 |
if reset_slug: |
|
1112 |
new_cell.slug = '' |
|
1113 |
# set order if requested |
|
1114 |
if set_order: |
|
1115 |
new_cell.order = self.order + 1 |
|
1110 | 1116 |
# store new cell |
1111 | 1117 |
new_cell.save() |
1112 | 1118 |
combo/manager/templates/combo/manager_edit_cell_block.html | ||
---|---|---|
18 | 18 |
<a rel="popup" href="{% url 'combo-manager-page-visibility-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Visibility' %}</a> | |
19 | 19 |
<a rel="popup" href="{% url 'combo-manager-page-options-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Options' %}</a> | |
20 | 20 |
{% 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 %} |
21 |
<a href="{% url 'combo-manager-page-duplicate-cell' page_pk=page.id cell_reference=cell.get_reference %}">{% trans 'Duplicate' %}</a> | |
|
21 | 22 |
<a class="close-button" href="#">{% trans 'Close' %}</a> |
22 | 23 |
{% if form %} |
23 | 24 |
<button class="save submit-button">{% trans 'Save' %}</button> |
combo/manager/urls.py | ||
---|---|---|
84 | 84 |
views.page_delete_cell, |
85 | 85 |
name='combo-manager-page-delete-cell', |
86 | 86 |
), |
87 |
url( |
|
88 |
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/duplicate$', |
|
89 |
views.page_duplicate_cell, |
|
90 |
name='combo-manager-page-duplicate-cell', |
|
91 |
), |
|
87 | 92 |
url( |
88 | 93 |
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/options$', |
89 | 94 |
views.page_cell_options, |
combo/manager/views.py | ||
---|---|---|
623 | 623 |
page_delete_cell = PageDeleteCellView.as_view() |
624 | 624 | |
625 | 625 | |
626 |
class PageDuplicateCellView(RedirectView): |
|
627 |
permanent = False |
|
628 | ||
629 |
def get_redirect_url(self, page_pk, cell_reference): |
|
630 |
try: |
|
631 |
cell = CellBase.get_cell(cell_reference, page_id=page_pk) |
|
632 |
except ObjectDoesNotExist: |
|
633 |
raise Http404() |
|
634 |
cell.duplicate(reset_slug=True, set_order=True) |
|
635 |
PageSnapshot.take(cell.page, request=self.request, comment=_('duplicated cell "%s"') % cell) |
|
636 |
messages.info(self.request, _('Cell %s has been duplicated.') % cell) |
|
637 |
return reverse('combo-manager-page-view', kwargs={'pk': page_pk}) + '#cell-' + cell.get_reference() |
|
638 | ||
639 | ||
640 |
page_duplicate_cell = PageDuplicateCellView.as_view() |
|
641 | ||
642 | ||
626 | 643 |
class PageCellVisibilityView(PageEditCellView): |
627 | 644 |
template_name = 'combo/cell_visibility.html' |
628 | 645 |
tests/test_manager.py | ||
---|---|---|
1061 | 1061 | |
1062 | 1062 |
app = login(app) |
1063 | 1063 |
resp = app.get('/manage/pages/%s/' % page.pk) |
1064 |
resp = resp.click('Duplicate')
|
|
1064 |
resp = resp.click(href='/%s/duplicate' % page.pk)
|
|
1065 | 1065 |
resp = resp.form.submit() |
1066 | 1066 |
new_page = Page.objects.latest('pk') |
1067 | 1067 |
assert resp.status_int == 302 |
... | ... | |
1076 | 1076 |
page.exclude_from_navigation = True |
1077 | 1077 |
page.save() |
1078 | 1078 |
resp = app.get('/manage/pages/%s/' % page.pk) |
1079 |
resp = resp.click('Duplicate')
|
|
1079 |
resp = resp.click(href='/%s/duplicate' % page.pk)
|
|
1080 | 1080 |
resp = resp.form.submit() |
1081 | 1081 |
new_page = Page.objects.latest('pk') |
1082 | 1082 |
assert resp.status_int == 302 |
... | ... | |
1086 | 1086 |
assert new_page.exclude_from_navigation is True |
1087 | 1087 | |
1088 | 1088 |
resp = app.get('/manage/pages/%s/' % page.pk) |
1089 |
resp = resp.click('Duplicate')
|
|
1089 |
resp = resp.click(href='/%s/duplicate' % page.pk)
|
|
1090 | 1090 |
resp.form['title'] = 'Two' |
1091 | 1091 |
resp = resp.form.submit() |
1092 | 1092 |
new_page = Page.objects.latest('pk') |
... | ... | |
1202 | 1202 |
assert TextCell.objects.count() == 0 |
1203 | 1203 | |
1204 | 1204 | |
1205 |
def test_duplicate_cell(app, admin_user): |
|
1206 |
page = Page.objects.create( |
|
1207 |
title='One', slug='one', template_name='standard', exclude_from_navigation=False |
|
1208 |
) |
|
1209 |
cell = TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0, slug='foobar') |
|
1210 |
app = login(app) |
|
1211 |
resp = app.get('/manage/pages/%s/' % page.pk) |
|
1212 |
resp = resp.click(href='/data_textcell-%s/duplicate' % cell.pk).follow() |
|
1213 |
assert 'Cell %s has been duplicated.' % cell in resp.text |
|
1214 |
assert TextCell.objects.count() == 2 |
|
1215 |
new_cell = TextCell.objects.latest('pk') |
|
1216 |
assert new_cell.slug == '' |
|
1217 |
assert new_cell.order == 1 |
|
1218 |
assert new_cell.page == page |
|
1219 |
assert new_cell.placeholder == 'content' |
|
1220 |
assert PageSnapshot.objects.all().count() == 1 |
|
1221 | ||
1222 | ||
1205 | 1223 |
def test_edit_cell_visibility(app, admin_user): |
1206 | 1224 |
Page.objects.all().delete() |
1207 | 1225 |
page = Page(title='One', slug='one', template_name='standard') |
1208 |
- |