0001-manager-recreate-full-hierarchy-when-moving-page-to-.patch
combo/manager/views.py | ||
---|---|---|
460 | 460 |
def page_order(request): |
461 | 461 |
new_order = [int(x) for x in request.GET['new-order'].split(',')] |
462 | 462 |
moved_page = Page.objects.get(id=request.GET['moved-page-id']) |
463 |
current_parent_id = moved_page.parent_id |
|
464 | 463 |
if request.GET['moved-page-new-parent']: |
465 |
moved_page.parent_id = request.GET['moved-page-new-parent'] |
|
464 |
# recreate full hierarchy to avoid cycles |
|
465 |
current_hierarchy = Page.objects.get(id=request.GET['moved-page-new-parent']).get_parents_and_self() |
|
466 |
new_hierarchy = [x for x in current_hierarchy if not x.id == moved_page.id] + [moved_page] |
|
467 |
for i, page in enumerate(new_hierarchy): |
|
468 |
old_parent_id = page.parent_id |
|
469 |
if i == 0: |
|
470 |
page.parent_id = None |
|
471 |
else: |
|
472 |
page.parent_id = new_hierarchy[i-1].id |
|
473 |
if old_parent_id != page.parent_id: |
|
474 |
page.save() |
|
466 | 475 |
else: |
467 | 476 |
moved_page.parent_id = None |
468 | 477 |
moved_page.save() |
tests/test_manager.py | ||
---|---|---|
277 | 277 |
'new-order': ','.join([str(x) for x in [page1.id, page2.id, page4.id, page3.id]])}) |
278 | 278 |
assert Page.objects.get(id=page4.id).slug.startswith('three-') |
279 | 279 | |
280 |
# move a parent page as a child of its own child |
|
281 |
for page in (page1, page2, page3, page4): |
|
282 |
page.parent = None |
|
283 |
page.save() |
|
284 |
page2.parent = page1 |
|
285 |
page2.save() |
|
286 |
page3.parent = page2 |
|
287 |
page3.save() |
|
288 |
resp = app.get('/manage/pages/order', params={ |
|
289 |
'moved-page-id': page1.id, |
|
290 |
'moved-page-new-parent': page3.id, |
|
291 |
'new-order': ','.join([str(x) for x in [page2.id, page3.id, page1.id, page4.id]])}) |
|
292 |
assert Page.objects.get(id=page2.id).parent_id is None |
|
293 | ||
294 |
for page in (page1, page2, page3, page4): |
|
295 |
page.parent = None |
|
296 |
page.save() |
|
297 |
page2.parent = page1 |
|
298 |
page2.save() |
|
299 |
page3.parent = page2 |
|
300 |
page3.save() |
|
301 |
page4.parent = page3 |
|
302 |
page4.save() |
|
303 |
resp = app.get('/manage/pages/order', params={ |
|
304 |
'moved-page-id': page2.id, |
|
305 |
'moved-page-new-parent': page4.id, |
|
306 |
'new-order': ','.join([str(x) for x in [page1.id, page3.id, page4.id, page2.id]])}) |
|
307 |
assert Page.objects.get(id=page1.id).parent_id is None |
|
308 |
assert Page.objects.get(id=page3.id).parent_id == page1.id |
|
309 | ||
310 | ||
280 | 311 |
def test_export_page(app, admin_user): |
281 | 312 |
Page.objects.all().delete() |
282 | 313 |
page = Page(title='One', slug='one', template_name='standard') |
283 |
- |