Skip to content

Commit df17362

Browse files
authored
add script to restructure RootPage/HomePage (#1622)
1 parent ffbaf97 commit df17362

File tree

4 files changed

+78
-25
lines changed

4 files changed

+78
-25
lines changed

books/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ def books(self):
11831183

11841184
template = 'page.html'
11851185

1186-
parent_page_types = ['pages.HomePage']
1186+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
11871187
subpage_types = ['books.Book']
11881188
max_count = 1
11891189

news/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class NewsIndex(Page):
185185
]
186186

187187
subpage_types = ['news.NewsArticle']
188-
parent_page_types = ['pages.HomePage']
188+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
189189
max_count = 1
190190

191191
def get_url_parts(self, *args, **kwargs):
@@ -621,7 +621,7 @@ def releases(self):
621621
]
622622

623623
subpage_types = ['news.PressRelease']
624-
parent_page_types = ['pages.HomePage']
624+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
625625
max_count = 1
626626

627627

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from django.core.management.base import BaseCommand
2+
from wagtail.models import Page, Site
3+
from pages.models import HomePage, RootPage
4+
5+
class Command(BaseCommand):
6+
help = (
7+
"Move children of HomePage to RootPage, elevate RootPage to site root, and delete HomePage.\n"
8+
"⚠️ DRY RUN BY DEFAULT — use --commit to make changes."
9+
)
10+
11+
def add_arguments(self, parser):
12+
parser.add_argument(
13+
'--commit',
14+
action='store_true',
15+
help="Apply the changes. Without this flag, the command runs in dry-run mode.",
16+
)
17+
18+
def handle(self, *args, **options):
19+
commit = options['commit']
20+
21+
old_home = HomePage.objects.first()
22+
new_root = RootPage.objects.first()
23+
24+
if not old_home or not new_root:
25+
self.stderr.write(self.style.ERROR("Missing HomePage or RootPage instance."))
26+
return
27+
28+
self.stdout.write(self.style.WARNING(
29+
f"{'[COMMIT MODE]' if commit else '[DRY RUN]'} Starting restructure..."
30+
))
31+
32+
# Move children of HomePage (except RootPage) under RootPage
33+
for child in old_home.get_children().exclude(id=new_root.id):
34+
self.stdout.write(f" - Would move {child.title} (ID: {child.id}) under RootPage")
35+
if commit:
36+
child.move(new_root, pos='last-child')
37+
38+
# Move RootPage to root
39+
wagtail_root = Page.get_first_root_node()
40+
self.stdout.write(f" - Would move RootPage (ID: {new_root.id}) to be child of root")
41+
if commit:
42+
new_root.move(wagtail_root, pos='last-child')
43+
44+
# Update Site root
45+
site = Site.objects.get(is_default_site=True)
46+
self.stdout.write(f" - Would set Site.root_page to RootPage (ID: {new_root.id})")
47+
if commit:
48+
site.root_page = new_root
49+
site.save()
50+
51+
if commit:
52+
self.stdout.write(self.style.SUCCESS("✅ Restructure complete. Site root updated."))
53+
else:
54+
self.stdout.write(self.style.WARNING("Dry run complete. No changes were made."))

pages/models.py

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ class RootPage(Page):
210210
# TODO: we are allowing this to be built as a child of the homepage. Not ideal.
211211
# Once the home page is released, use something to migrate homepage children to root page and remove this parent type.
212212
parent_page_types = ['wagtailcore.Page', 'pages.HomePage']
213-
subpage_types = ['pages.FlexPage'] # which might also require allowing all pages to be children.
214213

215214
def __str__(self):
216215
return self.path
@@ -345,7 +344,7 @@ def get_where_map(self):
345344
]
346345

347346
template = 'page.html'
348-
parent_page_types = ['pages.HomePage']
347+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
349348
max_count = 1
350349

351350

@@ -898,7 +897,7 @@ class Meta:
898897

899898
max_count = 1
900899
template = 'page.html'
901-
parent_page_types = ['pages.HomePage']
900+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
902901
subpage_types = ['pages.K12Subject']
903902

904903

@@ -945,7 +944,7 @@ class ContactUs(Page):
945944

946945
template = 'page.html'
947946

948-
parent_page_types = ['pages.HomePage']
947+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
949948
max_count = 1
950949

951950

@@ -1069,7 +1068,7 @@ class Supporters(Page):
10691068

10701069
template = 'page.html'
10711070

1072-
parent_page_types = ['pages.HomePage']
1071+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
10731072
max_count = 1
10741073

10751074

@@ -1195,7 +1194,7 @@ def get_section_2_image_2(self):
11951194

11961195
template = 'page.html'
11971196

1198-
parent_page_types = ['pages.HomePage']
1197+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
11991198
max_count = 1
12001199

12011200

@@ -1267,7 +1266,7 @@ class Give(Page):
12671266

12681267
template = 'page.html'
12691268

1270-
parent_page_types = ['pages.HomePage']
1269+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
12711270
max_count = 1
12721271

12731272

@@ -1307,7 +1306,7 @@ class TermsOfService(Page):
13071306

13081307
template = 'page.html'
13091308

1310-
parent_page_types = ['pages.HomePage']
1309+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
13111310
max_count = 1
13121311

13131312

@@ -1351,7 +1350,7 @@ class FAQ(Page):
13511350

13521351
template = 'page.html'
13531352

1354-
parent_page_types = ['pages.HomePage']
1353+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
13551354

13561355

13571356
class GiveForm(Page):
@@ -1387,7 +1386,7 @@ class GiveForm(Page):
13871386

13881387
template = 'page.html'
13891388

1390-
parent_page_types = ['pages.HomePage']
1389+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
13911390
max_count = 1
13921391

13931392

@@ -1427,7 +1426,7 @@ class Accessibility(Page):
14271426

14281427
template = 'page.html'
14291428

1430-
parent_page_types = ['pages.HomePage']
1429+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
14311430
max_count = 1
14321431

14331432

@@ -1467,7 +1466,7 @@ class Licensing(Page):
14671466

14681467
template = 'page.html'
14691468

1470-
parent_page_types = ['pages.HomePage']
1469+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
14711470
max_count = 1
14721471

14731472

@@ -1547,7 +1546,7 @@ class Technology(Page):
15471546
]
15481547

15491548
template = 'page.html'
1550-
parent_page_types = ['pages.HomePage']
1549+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
15511550
max_count = 1
15521551

15531552

@@ -1599,7 +1598,7 @@ class ErrataList(Page):
15991598
]
16001599

16011600
template = 'page.html'
1602-
parent_page_types = ['pages.HomePage']
1601+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
16031602
max_count = 1
16041603

16051604
def get_sitemap_urls(self, request=None):
@@ -1642,7 +1641,7 @@ class PrivacyPolicy(Page):
16421641

16431642
template = 'page.html'
16441643

1645-
parent_page_types = ['pages.HomePage']
1644+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
16461645
max_count = 1
16471646

16481647

@@ -1699,7 +1698,7 @@ class PrintOrder(Page):
16991698

17001699
template = 'page.html'
17011700

1702-
parent_page_types = ['pages.HomePage']
1701+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
17031702
max_count = 1
17041703

17051704

@@ -1840,7 +1839,7 @@ class LearningResearchPage(Page):
18401839
]
18411840

18421841
template = 'page.html'
1843-
parent_page_types = ['pages.HomePage']
1842+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
18441843
max_count = 1
18451844

18461845

@@ -1879,7 +1878,7 @@ class Careers(Page):
18791878
]
18801879

18811880
template = 'page.html'
1882-
parent_page_types = ['pages.HomePage']
1881+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
18831882
max_count = 1
18841883

18851884

@@ -2750,7 +2749,7 @@ def webinars(self):
27502749

27512750
template = 'page.html'
27522751

2753-
parent_page_types = ['pages.HomePage']
2752+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
27542753
max_count = 1
27552754

27562755

@@ -2851,7 +2850,7 @@ def get_url_parts(self, *args, **kwargs):
28512850

28522851
template = 'page.html'
28532852

2854-
parent_page_types = ['pages.HomePage']
2853+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
28552854
subpage_types = ['pages.Subject']
28562855
max_count = 1
28572856

@@ -3091,7 +3090,7 @@ class FormHeadings(Page):
30913090
]
30923091

30933092
template = 'page.html'
3094-
parent_page_types = ['pages.HomePage']
3093+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
30953094
max_count = 1
30963095

30973096

@@ -3371,7 +3370,7 @@ class AllyLogos(Page):
33713370
]
33723371

33733372
template = 'page.html'
3374-
parent_page_types = ['pages.HomePage']
3373+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
33753374

33763375

33773376
class Assignable(Page):

0 commit comments

Comments
 (0)