diff --git a/sith/settings.py b/sith/settings.py index d2f152c5..e2057928 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -99,9 +99,10 @@ INSTALLED_APPS = ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", + "django.contrib.sitemaps", + "django.contrib.sites", "django.contrib.messages", "staticfiles", - "django.contrib.sites", "honeypot", "django_jinja", "ninja_extra", diff --git a/sith/sitemap.py b/sith/sitemap.py new file mode 100644 index 00000000..5b0dec55 --- /dev/null +++ b/sith/sitemap.py @@ -0,0 +1,46 @@ +from django.conf import settings +from django.contrib.sitemaps import Sitemap +from django.db.models import OuterRef, Subquery +from django.urls import reverse + +from club.models import Club +from core.models import Page, PageRev + + +class SithSitemap(Sitemap): + def items(self): + return [ + "core:index", + "eboutic:main", + "sas:main", + "forum:main", + "club:club_list", + "election:list", + ] + + def location(self, item): + return reverse(item) + + +class PagesSitemap(Sitemap): + def items(self): + return ( + Page.objects.filter(view_groups=settings.SITH_GROUP_PUBLIC_ID) + .exclude(revisions=None, _full_name__startswith="club") + .annotate( + lastmod=Subquery( + PageRev.objects.filter(page=OuterRef("pk")) + .values("date") + .order_by("-date")[:1] + ) + ) + .all() + ) + + def lastmod(self, item: Page): + return item.lastmod + + +class ClubSitemap(Sitemap): + def items(self): + return Club.objects.filter(is_active=True) diff --git a/sith/urls.py b/sith/urls.py index dd560626..561de616 100644 --- a/sith/urls.py +++ b/sith/urls.py @@ -15,20 +15,24 @@ from django.conf import settings from django.conf.urls.static import static from django.contrib import admin +from django.contrib.sitemaps.views import sitemap from django.http import Http404 from django.urls import include, path +from django.views.decorators.cache import cache_page from django.views.i18n import JavaScriptCatalog from api.urls import api +from sith.sitemap import ClubSitemap, PagesSitemap, SithSitemap js_info_dict = {"packages": ("sith",)} handler403 = "core.views.forbidden" handler404 = "core.views.not_found" handler500 = "core.views.internal_servor_error" - +sitemaps = {"sith": SithSitemap, "pages": PagesSitemap, "clubs": ClubSitemap} urlpatterns = [ path("", include(("core.urls", "core"), namespace="core")), + path("sitemap.xml", cache_page(86400)(sitemap), {"sitemaps": sitemaps}), path("api/", api.urls), path("rootplace/", include(("rootplace.urls", "rootplace"), namespace="rootplace")), path(