import datetime from django.conf import settings from django.utils import timezone from apps.article.sitemaps import BaseCanonicalSitemap from apps.hadis.models import Hadis class HadisSitemap(BaseCanonicalSitemap): """ Sitemap class for Hadis model. Dynamically builds alternate (hreflang) URLs for all supported languages, formats lastmod to strict W3C / ISO 8601 with timezone offsets, and outputs directly to XML. """ changefreq = "weekly" priority = 0.6 def items(self): # Only include active/published hadiths return Hadis.objects.filter(status=True).select_related( 'category', 'hadis_status' ).prefetch_related( 'transmitters__transmitter', 'transmitters__narrator_layer', 'references__book_reference__author' ).order_by("-updated_at") def lastmod(self, obj): return obj.updated_at def location(self, obj): return obj.share_link def get_urls(self, page=1, site=None, protocol=None): urls = [] paginator_page = self.paginator.page(page) for item in paginator_page.object_list: alternates = [] # Dynamically build alternate URLs for all supported languages for lang_code, lang_name in settings.LANGUAGES: localized_url = f"{settings.DOVODI_DOMAIN}/{lang_code}/arguments/hadith/{item.slug}" alternates.append({ "location": localized_url, "lang_code": lang_code, }) # Safely format naive/aware lastmod datetime to strict ISO 8601 / W3C format lastmod_dt = item.updated_at if lastmod_dt: if timezone.is_naive(lastmod_dt): lastmod_dt = timezone.make_aware(lastmod_dt) lastmod_str = lastmod_dt.isoformat() else: lastmod_str = None # Construct URL metadata dictionary url_info = { "item": item, "location": item.share_link, "lastmod": lastmod_str, "changefreq": self.changefreq, "priority": str(self.priority), "alternates": alternates, } urls.append(url_info) return urls