Last active
June 26, 2024 03:14
-
-
Save veuncent/9dab311125401c1886eb7c6998f5f387 to your computer and use it in GitHub Desktop.
Set wagtail (home)pages programmatically during Django Migrations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import unicode_literals | |
from django.db import migrations, models | |
from wagtail.wagtailcore.models import Page, Site | |
def forwards_func(apps, schema_editor): | |
HomePage = apps.get_model('website', 'HomePage') | |
NewsIndexPage = apps.get_model('website', 'NewsIndexPage') | |
NewsPage = apps.get_model('website', 'NewsPage') | |
NewsTagIndexPage = apps.get_model('website', 'NewsTagIndexPage') | |
try: | |
default_home = Page.objects.filter(title="Welcome to your new Wagtail site!")[0] | |
default_home.slug = "home-old" | |
default_home.save_revision().publish() | |
default_home.save() | |
except: | |
pass | |
home_page = HomePage( | |
title="Home", | |
slug="home", | |
) | |
news_index_page = NewsIndexPage( | |
title="News", | |
slug="news" | |
) | |
news_page = NewsPage( | |
title="This is a News Page", | |
date="2017-08-15", | |
slug="news-article-1" | |
) | |
tag_index_page = NewsTagIndexPage( | |
title="Tags", | |
slug="tags" | |
) | |
# Set Home Page as child of root | |
root = Page.objects.get(id=1).specific | |
root.add_child(instance=home_page) | |
# Save and publish Home Page | |
revision = home_page.save_revision() | |
revision.publish() | |
home_page.save() | |
# Set Home Page as root page for Site | |
site = Site.objects.get(id=1) | |
site.root_page = home_page | |
site.save() | |
# Add News Index as child of Home Page | |
home_page.add_child(instance=news_index_page) | |
news_index_page.save_revision().publish() | |
news_index_page.save() | |
# Add News Page as child of News Index | |
news_index_page.add_child(instance=news_page) | |
news_page.save_revision().publish() | |
news_page.save() | |
# Add Tag Index as child of Home Page | |
home_page.add_child(instance=tag_index_page) | |
tag_index_page.save_revision().publish() | |
tag_index_page.save() | |
try: | |
default_home = Page.objects.filter(title="Welcome to your new Wagtail site!")[0] | |
default_home.delete() | |
except: | |
pass | |
def reverse_func(apps, schema_editor): | |
current_home_page = Page.objects.get(slug="home") | |
current_home_page.slug = "home-old" | |
current_home_page.save_revision().publish() | |
current_home_page.save() | |
default_home_page = Page( | |
title="Welcome to your new Wagtail site!", | |
slug="home" | |
) | |
# Free up the /home slug, but do not delete the old Home Page | |
current_home_page = Page.objects.get(slug="home") | |
current_home_page.slug = "home-old" | |
current_home_page.save_revision().publish() | |
current_home_page.save() | |
default_home_page = Page( | |
title="Welcome to your new Wagtail site!", | |
slug="home" | |
) | |
# Set default Home Page as child of root | |
root = Page.objects.get(id=1).specific | |
root.add_child(instance=default_home_page) | |
# Save default Home Page | |
revision = default_home_page.save_revision() | |
revision.publish() | |
default_home_page.save() | |
# Set default Home Page as root page for Site | |
site = Site.objects.get(id=1) | |
site.root_page = default_home_page | |
site.save() | |
# Delete current Home Page (and everything beneath it!) | |
current_home_page.delete() | |
class Migration(migrations.Migration): | |
dependencies = [ | |
('website', '0007_some_other_migration'), | |
] | |
operations = [ | |
migrations.RunPython(forwards_func, reverse_func), | |
] |
Apparently, during tests with setting root_page
for a site object, there is an Internal server error if you make a call to site.save()
. If the root_page you are trying to add has StreamField
data, it fails with the [honestly useless] internal server error page.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can also be created as a management command instead