Add feeds to blog list pages

This commit is contained in:
Jake Howard 2022-07-25 21:58:06 +01:00
parent 9288f97381
commit f8d5cc5ba5
Signed by: jake
GPG key ID: 57AFB45680EDD477
3 changed files with 61 additions and 2 deletions

View file

@ -3,17 +3,19 @@ from typing import Any
from django.db import models from django.db import models
from django.db.models.functions import TruncMonth from django.db.models.functions import TruncMonth
from django.http.request import HttpRequest from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils import timezone from django.utils import timezone
from django.utils.functional import cached_property from django.utils.functional import cached_property
from modelcluster.fields import ParentalManyToManyField from modelcluster.fields import ParentalManyToManyField
from wagtail.admin.panels import FieldPanel from wagtail.admin.panels import FieldPanel
from wagtail.contrib.routable_page.models import RoutablePageMixin, route
from wagtail.query import PageQuerySet from wagtail.query import PageQuerySet
from website.common.models import BaseContentMixin, BasePage from website.common.models import BaseContentMixin, BasePage
from website.common.utils import TocEntry from website.common.utils import TocEntry
class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc] class BlogListPage(BaseContentMixin, RoutablePageMixin, BasePage): # type: ignore[misc]
max_count = 1 max_count = 1
subpage_types = [ subpage_types = [
"blog.BlogPostPage", "blog.BlogPostPage",
@ -59,6 +61,14 @@ class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
) )
return context return context
@route(r"^feed/$")
def feed(self, request: HttpRequest) -> HttpResponse:
from .views import BlogPostPageFeed
return BlogPostPageFeed(
self.get_blog_posts().order_by("-date"), self.get_url(), self.title
)(request)
class BlogPostPage(BaseContentMixin, BasePage): # type: ignore[misc] class BlogPostPage(BaseContentMixin, BasePage): # type: ignore[misc]
subpage_types: list[Any] = [] subpage_types: list[Any] = []
@ -94,7 +104,7 @@ class BlogPostTagListPage(BaseContentMixin, BasePage): # type: ignore[misc]
return context return context
class BlogPostTagPage(BaseContentMixin, BasePage): # type: ignore[misc] class BlogPostTagPage(BaseContentMixin, RoutablePageMixin, BasePage): # type: ignore[misc]
subpage_types: list[Any] = [] subpage_types: list[Any] = []
parent_page_types = [BlogPostTagListPage] parent_page_types = [BlogPostTagListPage]
@ -117,6 +127,14 @@ class BlogPostTagPage(BaseContentMixin, BasePage): # type: ignore[misc]
context["pages"] = self.get_blog_posts() context["pages"] = self.get_blog_posts()
return context return context
@route(r"^feed/$")
def feed(self, request: HttpRequest) -> HttpResponse:
from .views import BlogPostPageFeed
return BlogPostPageFeed(
self.get_blog_posts().order_by("-date"), self.get_url(), self.title
)(request)
class BlogCollectionListPage(BaseContentMixin, BasePage): # type: ignore[misc] class BlogCollectionListPage(BaseContentMixin, BasePage): # type: ignore[misc]
subpage_types: list[Any] = [] subpage_types: list[Any] = []

40
website/blog/views.py Normal file
View file

@ -0,0 +1,40 @@
from datetime import datetime, time
from django.contrib.syndication.views import Feed
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from wagtail.query import PageQuerySet
from .models import BlogPostPage
class BlogPostPageFeed(Feed):
def __init__(self, posts: PageQuerySet, link: str, title: str):
self.posts = posts
self.link = link
self.title = title
super().__init__()
def __call__(
self, request: HttpRequest, *args: list, **kwargs: dict
) -> HttpResponse:
self.request = request
return super().__call__(request, *args, **kwargs)
def items(self) -> PageQuerySet:
return self.posts
def item_title(self, item: BlogPostPage) -> str:
return item.title
def item_link(self, item: BlogPostPage) -> str:
return item.get_full_url(request=self.request)
def item_description(self, item: BlogPostPage) -> str:
return item.summary
def item_pubdate(self, item: BlogPostPage) -> datetime:
return datetime.combine(item.date, time())
def item_updateddate(self, item: BlogPostPage) -> datetime:
return item.last_published_at

View file

@ -35,6 +35,7 @@ INSTALLED_APPS = [
"wagtail.contrib.forms", "wagtail.contrib.forms",
"wagtail.contrib.redirects", "wagtail.contrib.redirects",
"wagtail.contrib.modeladmin", "wagtail.contrib.modeladmin",
"wagtail.contrib.routable_page",
"wagtail.embeds", "wagtail.embeds",
"wagtail.sites", "wagtail.sites",
"wagtail.users", "wagtail.users",