Skip to content

Commit d477ee8

Browse files
committed
add script to restructure RootPage/HomePage
1 parent 8963590 commit d477ee8

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
@@ -209,7 +209,6 @@ class RootPage(Page):
209209
# TODO: we are allowing this to be built as a child of the homepage. Not ideal.
210210
# Once the home page is released, use something to migrate homepage children to root page and remove this parent type.
211211
parent_page_types = ['wagtailcore.Page', 'pages.HomePage']
212-
subpage_types = ['pages.FlexPage'] # which might also require allowing all pages to be children.
213212

214213
def __str__(self):
215214
return self.path
@@ -344,7 +343,7 @@ def get_where_map(self):
344343
]
345344

346345
template = 'page.html'
347-
parent_page_types = ['pages.HomePage']
346+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
348347
max_count = 1
349348

350349

@@ -897,7 +896,7 @@ class Meta:
897896

898897
max_count = 1
899898
template = 'page.html'
900-
parent_page_types = ['pages.HomePage']
899+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
901900
subpage_types = ['pages.K12Subject']
902901

903902

@@ -944,7 +943,7 @@ class ContactUs(Page):
944943

945944
template = 'page.html'
946945

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

950949

@@ -1068,7 +1067,7 @@ class Supporters(Page):
10681067

10691068
template = 'page.html'
10701069

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

10741073

@@ -1194,7 +1193,7 @@ def get_section_2_image_2(self):
11941193

11951194
template = 'page.html'
11961195

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

12001199

@@ -1266,7 +1265,7 @@ class Give(Page):
12661265

12671266
template = 'page.html'
12681267

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

12721271

@@ -1306,7 +1305,7 @@ class TermsOfService(Page):
13061305

13071306
template = 'page.html'
13081307

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

13121311

@@ -1350,7 +1349,7 @@ class FAQ(Page):
13501349

13511350
template = 'page.html'
13521351

1353-
parent_page_types = ['pages.HomePage']
1352+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
13541353

13551354

13561355
class GiveForm(Page):
@@ -1386,7 +1385,7 @@ class GiveForm(Page):
13861385

13871386
template = 'page.html'
13881387

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

13921391

@@ -1426,7 +1425,7 @@ class Accessibility(Page):
14261425

14271426
template = 'page.html'
14281427

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

14321431

@@ -1466,7 +1465,7 @@ class Licensing(Page):
14661465

14671466
template = 'page.html'
14681467

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

14721471

@@ -1546,7 +1545,7 @@ class Technology(Page):
15461545
]
15471546

15481547
template = 'page.html'
1549-
parent_page_types = ['pages.HomePage']
1548+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
15501549
max_count = 1
15511550

15521551

@@ -1598,7 +1597,7 @@ class ErrataList(Page):
15981597
]
15991598

16001599
template = 'page.html'
1601-
parent_page_types = ['pages.HomePage']
1600+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
16021601
max_count = 1
16031602

16041603
def get_sitemap_urls(self, request=None):
@@ -1641,7 +1640,7 @@ class PrivacyPolicy(Page):
16411640

16421641
template = 'page.html'
16431642

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

16471646

@@ -1698,7 +1697,7 @@ class PrintOrder(Page):
16981697

16991698
template = 'page.html'
17001699

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

17041703

@@ -1839,7 +1838,7 @@ class LearningResearchPage(Page):
18391838
]
18401839

18411840
template = 'page.html'
1842-
parent_page_types = ['pages.HomePage']
1841+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
18431842
max_count = 1
18441843

18451844

@@ -1878,7 +1877,7 @@ class Careers(Page):
18781877
]
18791878

18801879
template = 'page.html'
1881-
parent_page_types = ['pages.HomePage']
1880+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
18821881
max_count = 1
18831882

18841883

@@ -2749,7 +2748,7 @@ def webinars(self):
27492748

27502749
template = 'page.html'
27512750

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

27552754

@@ -2850,7 +2849,7 @@ def get_url_parts(self, *args, **kwargs):
28502849

28512850
template = 'page.html'
28522851

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

@@ -3090,7 +3089,7 @@ class FormHeadings(Page):
30903089
]
30913090

30923091
template = 'page.html'
3093-
parent_page_types = ['pages.HomePage']
3092+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
30943093
max_count = 1
30953094

30963095

@@ -3370,7 +3369,7 @@ class AllyLogos(Page):
33703369
]
33713370

33723371
template = 'page.html'
3373-
parent_page_types = ['pages.HomePage']
3372+
parent_page_types = ['pages.HomePage', 'pages.RootPage']
33743373

33753374

33763375
class Assignable(Page):

0 commit comments

Comments
 (0)