from django.contrib.sitemaps.views import index as sitemap_index_view from django.contrib.sitemaps.views import sitemap as sitemap_section_view from django.http import HttpResponse from wagtail.models import Locale, Page from ocyan.plugin.wagtail_oscar_integration.constants import CACHE_DURATION from ocyan.plugin.wagtail_oscar_integration.sitemap import ( CategorySitemap, ProductSitemap, ShopSitemap, ) from ocyan.plugin.wagtail_oscar_integration.sitemap import ( WagtailSitemap as BaseWagtailSitemap, ) class WagtailSitemap(BaseWagtailSitemap): def items(self): page_ids = [] for locale in Locale.objects.all(): translated_root_page = ( self.get_wagtail_site().root_page.get_translation_or_none(locale) ) if translated_root_page is None: continue locale_page_ids = ( translated_root_page.get_descendants(inclusive=True) .live() .public() .order_by() .values_list("pk", flat=True) ) page_ids.extend(locale_page_ids) if not page_ids: return [] return ( Page.objects.filter(pk__in=page_ids) .live() .public() .defer_streamfields() .order_by("path") .specific() ) def gather_sitemaps(): return { "pages": WagtailSitemap, "shop": ShopSitemap, "products": ProductSitemap, "categories": CategorySitemap, } def sitemap_index(request): return sitemap_index_view( request, sitemaps=gather_sitemaps(), sitemap_url_name="sitemaps", ) def sitemap_section(request, section=None): return sitemap_section_view( request, sitemaps=gather_sitemaps(), section=section, ) def robots_txt(request): sitemap_url = request.build_absolute_uri("/sitemap.xml") content = "\n".join( [ "User-agent: *", "Allow: /", f"Sitemap: {sitemap_url}", "", ] ) return HttpResponse(content, content_type="text/plain; charset=utf-8")