Projet

Général

Profil

0001-manager-recreate-full-hierarchy-when-moving-page-to-.patch

Frédéric Péters, 14 septembre 2019 18:03

Télécharger (3,17 ko)

Voir les différences:

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

 combo/manager/views.py | 13 +++++++++++--
 tests/test_manager.py  | 31 +++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 2 deletions(-)
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
-