From 1de888b5cda0bb2bede75555d77eaabb6c5b8052 Mon Sep 17 00:00:00 2001 From: Lorenz Padberg Date: Mon, 17 Jul 2023 10:41:12 +0200 Subject: [PATCH] Add Idea for the wagtail fix --- .../wagtailadmin/pages/listing/_list.html | 1 + server/core/wagtail_patch.py | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 server/core/wagtail_patch.py diff --git a/server/core/templates/wagtailadmin/pages/listing/_list.html b/server/core/templates/wagtailadmin/pages/listing/_list.html index 49ad3173..69d831d0 100644 --- a/server/core/templates/wagtailadmin/pages/listing/_list.html +++ b/server/core/templates/wagtailadmin/pages/listing/_list.html @@ -64,6 +64,7 @@ {% elif show_bulk_actions %} {% include "wagtailadmin/bulk_actions/listing_checkbox_cell.html" with obj_type="page" obj=page aria_labelledby_prefix="page_" aria_labelledby=page.pk|unlocalize aria_labelledby_suffix="_title" %} {% endif %} + {% block page_title %} diff --git a/server/core/wagtail_patch.py b/server/core/wagtail_patch.py new file mode 100644 index 00000000..a0b8e29e --- /dev/null +++ b/server/core/wagtail_patch.py @@ -0,0 +1,56 @@ +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse +from django.shortcuts import get_object_or_404 +from wagtail.models import Page + + + +def set_page_position(request, page_to_move_id): + page_to_move = get_object_or_404(Page, id=page_to_move_id) + parent_page = page_to_move.get_parent() + if not parent_page.permissions_for_user(request.user).can_reorder_children(): + raise PermissionDenied + if request.method == "POST": + # Get position parameter + visible_target_position = request.GET.get("position", None) + # Get position within all children, the frontend does not count the unpublished pages + if visible_target_position is not None: + visible_target_position = int(visible_target_position) + position = list(parent_page.get_children()).index( + get_visible_children(parent_page)[visible_target_position]) + print(f"Visible target position: {visible_target_position} -> {position}") + # Find page that's already in this position + position_page = None + if position is not None: + # position = int(position) + 1 + try: + position_page = parent_page.get_children()[int(position)] + except IndexError: + pass # No page in this position + # Move page + # any invalid moves *should* be caught by the permission check above, + # so don't bother to catch InvalidMoveToDescendant + if position_page: + # If the page has been moved to the right, insert it to the + # right. If left, then left. + old_position = list(parent_page.get_children()).index(page_to_move) + if int(position) < old_position: + page_to_move.move(position_page, pos="left", user=request.user) + elif int(position) > old_position: + page_to_move.move(position_page, pos="right", user=request.user) + print(f"Moved {old_position} to {position}") + else: + # Move page to end + page_to_move.move(parent_page, pos="last-child", user=request.user) + return HttpResponse("") + + +def get_visible_children(parent_page): + visible_children = parent_page.get_children().exclude(has_unpublished_changes=True) + print_children(visible_children) + return visible_children + + +def print_children(children, level=0): + for ii, sibling in enumerate(children): + print(ii, sibling.has_unpublished_changes, sibling)