Add the concept of post collections
For things which are a fixed series (eg yearly repeats)
This commit is contained in:
parent
2ae8ec7045
commit
6b96688adb
4 changed files with 2033 additions and 3 deletions
File diff suppressed because it is too large
Load diff
|
@ -15,7 +15,12 @@ from website.common.utils import TocEntry
|
|||
|
||||
class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
||||
max_count = 1
|
||||
subpage_types = ["blog.BlogPostPage", "blog.BlogPostTagListPage"]
|
||||
subpage_types = [
|
||||
"blog.BlogPostPage",
|
||||
"blog.BlogPostTagListPage",
|
||||
"blog.BlogCollectionListPage",
|
||||
"blog.BlogCollectionPage",
|
||||
]
|
||||
content_panels = BasePage.content_panels + BaseContentMixin.content_panels
|
||||
|
||||
@cached_property
|
||||
|
@ -39,7 +44,9 @@ class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
|||
return [TocEntry(post_month, post_month, 0, []) for post_month in post_months]
|
||||
|
||||
def get_blog_posts(self) -> PageQuerySet:
|
||||
return BlogPostPage.objects.child_of(self).live() # type:ignore[attr-defined]
|
||||
return BlogPostPage.objects.descendant_of( # type:ignore[attr-defined]
|
||||
self
|
||||
).live()
|
||||
|
||||
def get_context(self, request: HttpRequest) -> dict:
|
||||
context = super().get_context(request)
|
||||
|
@ -55,7 +62,7 @@ class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
|||
|
||||
class BlogPostPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
||||
subpage_types: list[Any] = []
|
||||
parent_page_types = [BlogListPage]
|
||||
parent_page_types = [BlogListPage, "blog.BlogCollectionPage"]
|
||||
|
||||
tags = ParentalManyToManyField("blog.BlogPostTagPage", blank=True)
|
||||
date = models.DateField(default=timezone.now)
|
||||
|
@ -109,3 +116,53 @@ class BlogPostTagPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
|||
context = super().get_context(request)
|
||||
context["pages"] = self.get_blog_posts()
|
||||
return context
|
||||
|
||||
|
||||
class BlogCollectionListPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
||||
subpage_types: list[Any] = []
|
||||
parent_page_types = [BlogListPage]
|
||||
max_count = 1
|
||||
|
||||
content_panels = BasePage.content_panels + BaseContentMixin.content_panels
|
||||
|
||||
@cached_property
|
||||
def table_of_contents(self) -> list[TocEntry]:
|
||||
return [
|
||||
TocEntry(page.title, page.slug, 0, []) for page in self.get_collections()
|
||||
]
|
||||
|
||||
def get_collections(self) -> PageQuerySet:
|
||||
blog_list_page = (
|
||||
BlogListPage.objects.all().live().get() # type:ignore[attr-defined]
|
||||
)
|
||||
return BlogCollectionPage.objects.child_of( # type:ignore[attr-defined]
|
||||
blog_list_page
|
||||
).live()
|
||||
|
||||
def get_context(self, request: HttpRequest) -> dict:
|
||||
context = super().get_context(request)
|
||||
context["collections"] = self.get_collections()
|
||||
return context
|
||||
|
||||
|
||||
class BlogCollectionPage(BaseContentMixin, BasePage): # type: ignore[misc]
|
||||
parent_page_types = [BlogListPage]
|
||||
subpage_types = [BlogPostPage]
|
||||
|
||||
content_panels = BasePage.content_panels + BaseContentMixin.content_panels
|
||||
|
||||
@cached_property
|
||||
def table_of_contents(self) -> list[TocEntry]:
|
||||
return [
|
||||
TocEntry(page.title, page.slug, 0, []) for page in self.get_blog_posts()
|
||||
]
|
||||
|
||||
def get_blog_posts(self) -> PageQuerySet:
|
||||
return BlogPostPage.objects.child_of( # type:ignore[attr-defined]
|
||||
self
|
||||
).order_by("-date")
|
||||
|
||||
def get_context(self, request: HttpRequest) -> dict:
|
||||
context = super().get_context(request)
|
||||
context["pages"] = self.get_blog_posts()
|
||||
return context
|
||||
|
|
19
website/blog/templates/blog/blog_collection_list_page.html
Normal file
19
website/blog/templates/blog/blog_collection_list_page.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% extends "wagtail_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% include "common/hero.html" %}
|
||||
|
||||
{% if page.body_html %}
|
||||
<section class="container content">
|
||||
{{ page.body_html|safe }}
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
<section class="container">
|
||||
{% for collection in collections %}
|
||||
{% include "common/listing-item.html" with page=collection %}
|
||||
{% endfor %}
|
||||
</section>
|
||||
|
||||
{% endblock content %}
|
19
website/blog/templates/blog/blog_collection_page.html
Normal file
19
website/blog/templates/blog/blog_collection_page.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% extends "wagtail_base.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% include "common/hero.html" %}
|
||||
|
||||
{% if page.body_html %}
|
||||
<section class="container content">
|
||||
{{ page.body_html|safe }}
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
<section class="container">
|
||||
{% for page in pages %}
|
||||
{% include "common/listing-item.html" %}
|
||||
{% endfor %}
|
||||
</section>
|
||||
|
||||
{% endblock content %}
|
Loading…
Reference in a new issue