0001-manager-fix-page-ordering-with-missing-page-from-arg.patch
combo/manager/views.py | ||
---|---|---|
22 | 22 | |
23 | 23 |
from django.conf import settings |
24 | 24 |
from django.contrib import messages |
25 |
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied |
|
25 |
from django.core.exceptions import ObjectDoesNotExist |
|
26 |
from django.db import transaction |
|
26 | 27 |
from django.http import Http404, HttpResponse, HttpResponseRedirect |
27 | 28 |
from django.shortcuts import get_object_or_404, redirect, render |
28 | 29 |
from django.urls import reverse, reverse_lazy |
... | ... | |
704 | 705 |
else: |
705 | 706 |
moved_page.parent_id = None |
706 | 707 |
moved_page.save() |
708 | ||
707 | 709 |
slug_conflict = False |
708 |
for page in Page.objects.filter(parent_id=moved_page.parent_id): |
|
709 |
page.order = new_order.index(page.id) + 1 |
|
710 |
page.save() |
|
711 |
if moved_page.id != page.id and moved_page.slug == page.slug: |
|
712 |
slug_conflict = True |
|
710 |
try: |
|
711 |
with transaction.atomic(): |
|
712 |
for page in Page.objects.filter(parent_id=moved_page.parent_id): |
|
713 |
page.order = new_order.index(page.id) + 1 |
|
714 |
page.save() |
|
715 |
if moved_page.id != page.id and moved_page.slug == page.slug: |
|
716 |
slug_conflict = True |
|
717 |
except ValueError: |
|
718 |
# missing child page in new_order, fail silently |
|
719 |
return redirect(reverse('combo-manager-homepage')) |
|
720 | ||
713 | 721 |
if slug_conflict: |
714 | 722 |
# slug conflict after a page got moved, reload and rename |
715 | 723 |
moved_page = Page.objects.get(id=request.GET['moved-page-id']) |
tests/test_manager.py | ||
---|---|---|
679 | 679 |
page3.save() |
680 | 680 |
page4 = Page(title='Four', slug='four', parent=page2, order=3, template_name='standard') |
681 | 681 |
page4.save() |
682 |
app = login(app) |
|
683 | ||
684 |
ordered_ids = [x.id for x in Page.get_as_reordered_flat_hierarchy(Page.objects.all())] |
|
685 |
assert ordered_ids == [page1.id, page2.id, page3.id, page4.id] |
|
682 | 686 | |
687 |
# missing page3 in order |
|
688 |
app.get( |
|
689 |
'/manage/pages/order', |
|
690 |
params={ |
|
691 |
'moved-page-id': page4.id, |
|
692 |
'moved-page-new-parent': page2.id, |
|
693 |
'new-order': ','.join([str(x) for x in [page2.id, page1.id, page4.id]]), |
|
694 |
}, |
|
695 |
) |
|
696 |
# not changed |
|
683 | 697 |
ordered_ids = [x.id for x in Page.get_as_reordered_flat_hierarchy(Page.objects.all())] |
684 |
ordered_ids = [page1.id, page2.id, page3.id, page4.id]
|
|
698 |
assert ordered_ids == [page1.id, page2.id, page3.id, page4.id]
|
|
685 | 699 | |
686 | 700 |
# move page4 before page3 |
687 |
app = login(app) |
|
688 |
resp = app.get( |
|
701 |
app.get( |
|
689 | 702 |
'/manage/pages/order', |
690 | 703 |
params={ |
691 | 704 |
'moved-page-id': page4.id, |
... | ... | |
695 | 708 |
) |
696 | 709 | |
697 | 710 |
ordered_ids = [x.id for x in Page.get_as_reordered_flat_hierarchy(Page.objects.all())] |
698 |
ordered_ids = [page1.id, page2.id, page4.id, page3.id]
|
|
711 |
assert ordered_ids == [page1.id, page2.id, page4.id, page3.id]
|
|
699 | 712 | |
700 | 713 |
# move page4 to level0 |
701 |
resp = app.get(
|
|
714 |
app.get( |
|
702 | 715 |
'/manage/pages/order', |
703 | 716 |
params={ |
704 | 717 |
'moved-page-id': page4.id, |
... | ... | |
707 | 720 |
}, |
708 | 721 |
) |
709 | 722 |
ordered_ids = [x.id for x in Page.get_as_reordered_flat_hierarchy(Page.objects.all())] |
710 |
ordered_ids = [page1.id, page4.id, page2.id, page3.id]
|
|
723 |
assert ordered_ids == [page1.id, page4.id, page2.id, page3.id]
|
|
711 | 724 | |
712 | 725 |
# change slug to check for autochange on duplicate |
713 | 726 |
page4.slug = 'three' |
714 | 727 |
page4.save() |
715 | 728 |
# move it as a sibling of page3 |
716 |
resp = app.get(
|
|
729 |
app.get( |
|
717 | 730 |
'/manage/pages/order', |
718 | 731 |
params={ |
719 | 732 |
'moved-page-id': page4.id, |
... | ... | |
731 | 744 |
page2.save() |
732 | 745 |
page3.parent = page2 |
733 | 746 |
page3.save() |
734 |
resp = app.get(
|
|
747 |
app.get( |
|
735 | 748 |
'/manage/pages/order', |
736 | 749 |
params={ |
737 | 750 |
'moved-page-id': page1.id, |
... | ... | |
750 | 763 |
page3.save() |
751 | 764 |
page4.parent = page3 |
752 | 765 |
page4.save() |
753 |
resp = app.get(
|
|
766 |
app.get( |
|
754 | 767 |
'/manage/pages/order', |
755 | 768 |
params={ |
756 | 769 |
'moved-page-id': page2.id, |
757 |
- |