From 10005dfe02c640771cd47f47436bcfd9b8c9223b Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Mon, 22 Aug 2022 21:32:38 +0100 Subject: [PATCH] Add all pages feed This one is much simpler than the pages one, as there could be a lot of pages --- website/common/tests/test_views.py | 8 ++++++++ website/common/views.py | 33 ++++++++++++++++++++++++++++++ website/legacy/tests.py | 7 +++++++ website/legacy/urls.py | 5 ++++- website/legacy/views.py | 5 +++++ website/urls.py | 3 ++- 6 files changed, 59 insertions(+), 2 deletions(-) diff --git a/website/common/tests/test_views.py b/website/common/tests/test_views.py index dcd6125..be3ab9c 100644 --- a/website/common/tests/test_views.py +++ b/website/common/tests/test_views.py @@ -37,3 +37,11 @@ class RobotsViewTestCase(SimpleTestCase): self.assertEqual(response.status_code, 200) self.assertContains(response, "Disallow: /") self.assertFalse(response.context["SEO_INDEX"]) + + +class AllPagesFeedTestCase(TestCase): + url = reverse("feed") + + def test_accessible(self) -> None: + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) diff --git a/website/common/views.py b/website/common/views.py index 6a7c242..957e32b 100644 --- a/website/common/views.py +++ b/website/common/views.py @@ -1,12 +1,19 @@ +from datetime import datetime from typing import Any +from django.contrib.syndication.views import Feed +from django.http.request import HttpRequest from django.http.response import HttpResponse from django.urls import reverse from django.views.defaults import ERROR_404_TEMPLATE_NAME from django.views.generic import TemplateView +from wagtail.models import Page +from wagtail.query import PageQuerySet from website.home.models import HomePage +from .models import BasePage + class Error404View(TemplateView): template_name = ERROR_404_TEMPLATE_NAME @@ -33,3 +40,29 @@ class RobotsView(TemplateView): context = super().get_context_data(**kwargs) context["sitemap"] = self.request.build_absolute_uri(reverse("sitemap")) return context + + +class AllPagesFeed(Feed): + link = "/feed/" + title = "All pages feed" + + def __call__( + self, request: HttpRequest, *args: list, **kwargs: dict + ) -> HttpResponse: + self.request = request + return super().__call__(request, *args, **kwargs) + + def items(self) -> PageQuerySet: + return Page.objects.live().exclude(depth__lte=2) + + def item_title(self, item: BasePage) -> str: + return item.title + + def item_link(self, item: BasePage) -> str: + return item.get_full_url(request=self.request) + + def item_pubdate(self, item: BasePage) -> datetime: + return item.first_published_at + + def item_updateddate(self, item: BasePage) -> datetime: + return item.last_published_at diff --git a/website/legacy/tests.py b/website/legacy/tests.py index 28a4132..fab474a 100644 --- a/website/legacy/tests.py +++ b/website/legacy/tests.py @@ -1,4 +1,5 @@ from django.test import TestCase +from django.urls import reverse from website.blog.factories import BlogPostListPageFactory from website.home.models import HomePage @@ -15,3 +16,9 @@ class PostsFeedViewTestCase(TestCase): self.assertRedirects( response, self.page.url + self.page.reverse_subpage("feed") ) + + +class AllPagesFeedViewTestCase(TestCase): + def test_redirects(self) -> None: + response = self.client.get("/index.xml") + self.assertRedirects(response, reverse("feed")) diff --git a/website/legacy/urls.py b/website/legacy/urls.py index 5efb185..6fa4786 100644 --- a/website/legacy/urls.py +++ b/website/legacy/urls.py @@ -4,4 +4,7 @@ from . import views app_name = "legacy" -urlpatterns = [path("posts/index.xml", views.PostsFeedView.as_view())] +urlpatterns = [ + path("posts/index.xml", views.PostsFeedView.as_view()), + path("index.xml", views.AllPagesFeedView.as_view()), +] diff --git a/website/legacy/views.py b/website/legacy/views.py index aac3c5d..273018a 100644 --- a/website/legacy/views.py +++ b/website/legacy/views.py @@ -11,3 +11,8 @@ class PostsFeedView(RedirectView): def get_redirect_url(self) -> str: post_list = get_object_or_404(BlogPostListPage.objects.live()) return post_list.url + post_list.reverse_subpage("feed") + + +@method_decorator(cache_page(60 * 60), name="dispatch") +class AllPagesFeedView(RedirectView): + pattern_name = "feed" diff --git a/website/urls.py b/website/urls.py index adc218b..60dea9b 100644 --- a/website/urls.py +++ b/website/urls.py @@ -7,7 +7,7 @@ from wagtail.contrib.sitemaps.views import sitemap from wagtail.documents import urls as wagtaildocs_urls from wagtail.images.views.serve import ServeView -from website.common.views import RobotsView, page_not_found +from website.common.views import AllPagesFeed, RobotsView, page_not_found urlpatterns = [ path("admin/", include(wagtailadmin_urls)), @@ -25,6 +25,7 @@ urlpatterns = [ path("sitemap.xml", cache_page(60 * 60)(sitemap), name="sitemap"), path("robots.txt", cache_page(60 * 60)(RobotsView.as_view()), name="robotstxt"), path("404/", page_not_found, name="404"), + path("feed/", AllPagesFeed(), name="feed"), path("", include("website.legacy.urls")), ]