"""
**setup_site_pages** is a custom manage command to install
a default set of pages and menus for the Wagtail CMS. It is designed not to
touch other content.
Example usage::
python manage.py setup_site_pages
"""
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site
from django.core.management.base import BaseCommand
from wagtail.models import Page
from wagtail.models import Site as WagtailSite
from ppa.editorial.models import EditorialIndexPage
from ppa.pages.models import CollectionPage, ContentPage, ContributorPage, HomePage
[docs]
class Command(BaseCommand):
"""Setup initial wagtail site and pages needed for PPA navigation"""
help = __doc__
#: normal verbosity level
v_normal = 1
verbosity = v_normal
content_pages = {
"history": "History of the Archive",
"prosody": "What is Prosody",
"search": "How to Search",
"cite": "How to Cite",
"contributors": "Contributors and Board Members",
"contact": "Contact Us",
}
[docs]
def handle(self, *args, **kwargs):
# wagtail creates the root page for us
Page.objects.get(slug="root")
# NOTE: logic for creating pages based on wagtail core migration
# 0002 initial data, which creates initial site and welcome page
# delete default home wagtail home page
Page.objects.filter(slug="home", title__contains="Welcome").delete()
# Create PPA homepage
home = HomePage.objects.filter(slug="home").first()
if not home:
home = HomePage.objects.create(
title="Princeton Prosody Archive",
slug="home",
depth=2,
numchild=0,
show_in_menus=True,
path="00010001",
content_type=ContentType.objects.get_for_model(HomePage),
)
home.show_in_menus = True
home.path = "00010001"
home.url_path = "/home/"
home.save()
# create editorial index page
editorial = EditorialIndexPage.objects.first()
if not editorial:
editorial = EditorialIndexPage.objects.create(
title="Editorial",
slug="editorial",
depth=home.depth + 1,
show_in_menus=False,
path=home.path + "0001",
content_type=ContentType.objects.get_for_model(EditorialIndexPage),
)
## create collections page
collections = CollectionPage.objects.first()
if not collections:
collections = CollectionPage.objects.create(
title="About the Collections",
slug="collections",
depth=home.depth + 1,
show_in_menus=False,
path=home.path + "0002",
content_type=ContentType.objects.get_for_model(CollectionPage),
)
# create content page stubs if they are not already present
index = 3
for slug, title in self.content_pages.items():
cpage = Page.objects.filter(slug=slug).first()
if not cpage:
# use special contributor page for contributors
if slug == "contributors":
page_type = ContributorPage
else:
page_type = ContentPage
ContentPage.objects.create(
title=title,
slug=slug,
depth=home.depth + 1,
path="{}{:04d}".format(home.path, index),
show_in_menus=True,
content_type=ContentType.objects.get_for_model(page_type),
)
index += 1
# create wagtail site from django site and associate new homepage
# self.create_wagtail_site(home)
self.create_wagtail_site(home.page_ptr)
# associate default page previews for home page if not set
if not any([home.page_preview_1, home.page_preview_2]):
home.page_preview_1 = ContentPage.objects.get(slug="prosody")
home.page_preview_2 = ContentPage.objects.get(slug="history")
home.save()
# let treebeard fix the hierarchy
Page.fix_tree()
[docs]
def create_wagtail_site(self, root_page):
"""Create a wagtail site object from the current default
Django site."""
current_site = Site.objects.get(pk=settings.SITE_ID)
# split domain into name and port
if ":" in current_site.domain:
domain, port = current_site.domain.split(":")
else:
domain = current_site.domain
port = 80
# create wagtail site with same config and associate home page
wagtail_site, created = WagtailSite.objects.get_or_create(
hostname=domain,
port=port,
site_name=current_site.name,
root_page=root_page,
is_default_site=True,
)
return wagtail_site