Bootstrap some skeleton slides
This commit is contained in:
parent
28d1a227f7
commit
dd714e59e4
4 changed files with 8461 additions and 0 deletions
8286
package-lock.json
generated
Normal file
8286
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
15
package.json
Normal file
15
package.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "recovering-deleted-wagtail-pages",
|
||||||
|
"type": "module",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "slidev build",
|
||||||
|
"start": "slidev",
|
||||||
|
"export": "slidev export"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@slidev/cli": "^0.48.8",
|
||||||
|
"@slidev/theme-default": "latest",
|
||||||
|
"vue": "^3.4.21"
|
||||||
|
}
|
||||||
|
}
|
10
setup/shiki.ts
Normal file
10
setup/shiki.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import { defineShikiSetup } from '@slidev/types'
|
||||||
|
|
||||||
|
export default defineShikiSetup(() => {
|
||||||
|
return {
|
||||||
|
themes: {
|
||||||
|
dark: 'github-dark',
|
||||||
|
light: 'github-light',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
150
slides.md
Normal file
150
slides.md
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
---
|
||||||
|
title: Recovering deleted Wagtail pages and Django models
|
||||||
|
class: text-center
|
||||||
|
highlighter: shiki
|
||||||
|
transition: slide-left
|
||||||
|
---
|
||||||
|
|
||||||
|
# Recovering deleted Wagtail pages and Django models
|
||||||
|
|
||||||
|
### Jake Howard
|
||||||
|
|
||||||
|
###### Senior Systems Engineer @ Torchbox
|
||||||
|
###### Security Team @ Wagtail
|
||||||
|
###### Performance Working Group @ Wagtail
|
||||||
|
|
||||||
|
---
|
||||||
|
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
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
pre.shiki {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
# 2. Locate the page models
|
||||||
|
|
||||||
|
<div class="pt-5">
|
||||||
|
|
||||||
|
```python
|
||||||
|
from wagtail.models import Page
|
||||||
|
|
||||||
|
sysadmin_page = Page.objects.get(id=91)
|
||||||
|
|
||||||
|
child_pages = sysadmin_page.get_descendants()
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: center
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
pre.shiki {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
# 3. Locate what was deleted
|
||||||
|
|
||||||
|
<div class="pt-5">
|
||||||
|
|
||||||
|
```python
|
||||||
|
from django.contrib.admin.utils import NestedObjects
|
||||||
|
|
||||||
|
collector = NestedObjects()
|
||||||
|
collector.collect(list(child_pages) + [sysadmin_page])
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: center
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
pre.shiki {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
# 4. Serialize
|
||||||
|
|
||||||
|
<div class="pt-5">
|
||||||
|
|
||||||
|
```python
|
||||||
|
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
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: center
|
||||||
|
---
|
||||||
|
|
||||||
|
# 4a. Deserialize
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: center
|
||||||
|
---
|
||||||
|
|
||||||
|
# 5. Test test test
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: center
|
||||||
|
---
|
||||||
|
|
||||||
|
# 6. Showtime!
|
||||||
|
|
||||||
|
---
|
||||||
|
layout: end
|
||||||
|
---
|
||||||
|
|
||||||
|
# Conclusion
|
Loading…
Reference in a new issue