1
Fork 0
recovering-deleted-wagtail-.../slides.md
2024-04-18 17:05:39 +01:00

2.3 KiB

title class highlighter transition mdc themeConfig
Recovering deleted Wagtail pages and Django models text-center shiki slide-left true
primary
#fd5765

Recovering [deleted]{style="color: #fd5765"} Wagtail pages and Django models

Jake Howard

  • Senior Systems Engineer @ Torchbox
  • Security Team & Performance Working Group @ Wagtail
  • theorangeone.net
  • @RealOrangeOne
  • @RealOrangeOne
  • @jake@theorangeone.net

layout: cover background: https://cdn.jsdelivr.net/gh/wagtail/wagtail@main/.github/wagtail-screenshot-with-browser.png

Setting the scene


layout: cover

Site history report


layout: cover

Restoring from backups


layout: cover

Partial restores from backups


layout: center

1. Spin up a database backup


layout: center

2. Locate the page models

from wagtail.models import Page

sysadmin_page = Page.objects.get(id=91)

child_pages = sysadmin_page.get_descendants()

layout: center

3. Locate what was deleted

from django.contrib.admin.utils import NestedObjects

collector = NestedObjects()
collector.collect(list(child_pages) + [sysadmin_page])

layout: center

4. Serialize

from django.core import serializers

class NoM2MSerializer(Serializer):
    def handle_m2m_field(self, obj, field):
        pass

def get_model_instances():
    for qs in collector.data.values():
        yield from qs

with open("deleted-models.json", "w") as f:
    NoM2MSerializer().serialize(
        get_model_instances(),
        stream=f
    )

layout: center

4a. Deserialize


layout: center

5. Test test test


layout: center

6. Showtime!


layout: end

Conclusion