66from multiprocessing import cpu_count
77from pathlib import Path
88from types import SimpleNamespace
9- from typing import Dict
9+ from typing import Dict , List
1010
1111from django .conf import settings
12+ from django .contrib .sitemaps .views import sitemap
1213from django .core import management
1314from django .core .management .base import BaseCommand
1415
2223 get_output_static_directory ,
2324)
2425from coltrane .manifest import Manifest , ManifestItem
26+ from coltrane .renderer import StaticRequest
2527from coltrane .retriever import get_content_paths
28+ from coltrane .urls import sitemaps
2629from coltrane .utils import threadpool
2730
2831
@@ -65,6 +68,15 @@ def add_arguments(self, parser):
6568 def _load_manifest (self ) -> Manifest :
6669 return Manifest (manifest_file = get_output_json ())
6770
71+ def _generate_sitemap (self ) -> None :
72+ assert self .output_directory
73+
74+ sitemap_response = sitemap (
75+ request = StaticRequest (path = "/" , META = {}), sitemaps = sitemaps
76+ )
77+ sitemap_xml = sitemap_response .render ().content .decode ()
78+ (self .output_directory / "sitemap.xml" ).write_text (sitemap_xml )
79+
6880 @threadpool
6981 def _call_collectstatic (self ) -> str :
7082 stdout = StringIO ()
@@ -163,12 +175,13 @@ def _set_output_directory(self, options: Dict) -> None:
163175 pass
164176
165177 def handle (self , * args , ** options ):
166- self .is_force = False
167- self .manifest = None
178+ self .is_force : bool = False
179+ self .manifest : Manifest = None
168180 self .output_result_counts .create_count = 0
169181 self .output_result_counts .update_count = 0
170182 self .output_result_counts .skip_count = 0
171- self .errors = []
183+ self .output_directory : Path = None
184+ self .errors : List [str ] = []
172185
173186 start_time = time .time ()
174187
@@ -180,10 +193,10 @@ def handle(self, *args, **options):
180193
181194 collectstatic_future = self ._call_collectstatic ()
182195
183- output_directory = get_output_directory ()
196+ self . output_directory = get_output_directory ()
184197 self ._success ("Use output directory of " , ending = "" )
185- self .stdout .write (self .style .WARNING (str (output_directory )))
186- output_directory .mkdir (exist_ok = True )
198+ self .stdout .write (self .style .WARNING (str (self . output_directory )))
199+ self . output_directory .mkdir (exist_ok = True )
187200
188201 spinner .start ("Load manifest" )
189202 self .manifest = self ._load_manifest ()
@@ -250,6 +263,10 @@ def handle(self, *args, **options):
250263 spinner .succeed (result_msg )
251264
252265 if self .manifest .is_dirty :
266+ spinner .start ("Update sitemap.xml" )
267+ self ._generate_sitemap ()
268+ spinner .succeed ()
269+
253270 spinner .start ("Update manifest" )
254271 self .manifest .write_data ()
255272 spinner .succeed ()
0 commit comments