manager: recreate full hierarchy when moving page to a new parent (#36127)

This commit is contained in:
Frédéric Péters 2019-09-14 18:02:47 +02:00
parent b8eb8ee54a
commit 8832ba028c
2 changed files with 42 additions and 2 deletions

View File

@ -460,9 +460,18 @@ def cell_order(request, page_pk):
def page_order(request):
new_order = [int(x) for x in request.GET['new-order'].split(',')]
moved_page = Page.objects.get(id=request.GET['moved-page-id'])
current_parent_id = moved_page.parent_id
if request.GET['moved-page-new-parent']:
moved_page.parent_id = request.GET['moved-page-new-parent']
# recreate full hierarchy to avoid cycles
current_hierarchy = Page.objects.get(id=request.GET['moved-page-new-parent']).get_parents_and_self()
new_hierarchy = [x for x in current_hierarchy if not x.id == moved_page.id] + [moved_page]
for i, page in enumerate(new_hierarchy):
old_parent_id = page.parent_id
if i == 0:
page.parent_id = None
else:
page.parent_id = new_hierarchy[i-1].id
if old_parent_id != page.parent_id:
page.save()
else:
moved_page.parent_id = None
moved_page.save()

View File

@ -277,6 +277,37 @@ def test_page_reorder(app, admin_user):
'new-order': ','.join([str(x) for x in [page1.id, page2.id, page4.id, page3.id]])})
assert Page.objects.get(id=page4.id).slug.startswith('three-')
# move a parent page as a child of its own child
for page in (page1, page2, page3, page4):
page.parent = None
page.save()
page2.parent = page1
page2.save()
page3.parent = page2
page3.save()
resp = app.get('/manage/pages/order', params={
'moved-page-id': page1.id,
'moved-page-new-parent': page3.id,
'new-order': ','.join([str(x) for x in [page2.id, page3.id, page1.id, page4.id]])})
assert Page.objects.get(id=page2.id).parent_id is None
for page in (page1, page2, page3, page4):
page.parent = None
page.save()
page2.parent = page1
page2.save()
page3.parent = page2
page3.save()
page4.parent = page3
page4.save()
resp = app.get('/manage/pages/order', params={
'moved-page-id': page2.id,
'moved-page-new-parent': page4.id,
'new-order': ','.join([str(x) for x in [page1.id, page3.id, page4.id, page2.id]])})
assert Page.objects.get(id=page1.id).parent_id is None
assert Page.objects.get(id=page3.id).parent_id == page1.id
def test_export_page(app, admin_user):
Page.objects.all().delete()
page = Page(title='One', slug='one', template_name='standard')