Skip to content

Commit 2ac5ecd

Browse files
committed
TWE-665: Restore tags on BlogPage and BlogIndexPage
This is a partial revert of both 59b373d and 2d7b425
1 parent 21f545f commit 2ac5ecd

File tree

7 files changed

+244
-14
lines changed

7 files changed

+244
-14
lines changed

tbx/blog/models.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
from itertools import chain
12
import math
23
import string
34

45
from django import forms
56
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
67
from django.db import models
8+
from django.db.models import Case, Q, When
79
from django.dispatch import receiver
810
from django.utils.functional import cached_property
11+
from django.utils.http import urlencode
912

1013
from modelcluster.fields import ParentalKey, ParentalManyToManyField
1114
from wagtail.admin.panels import (
@@ -75,11 +78,25 @@ def blog_posts(self):
7578
def get_context(self, request, *args, **kwargs):
7679
context = super().get_context(request, *args, **kwargs)
7780

81+
# Get blog_posts
82+
blog_posts = self.blog_posts
83+
84+
# Filter by related_service slug
85+
slug_filter = request.GET.get("filter")
86+
extra_url_params = {}
87+
88+
if slug_filter and slug_filter in self.taxonomy_slugs:
89+
blog_posts = blog_posts.filter(
90+
Q(related_sectors__slug=slug_filter)
91+
| Q(related_services__slug=slug_filter)
92+
)
93+
extra_url_params["filter"] = slug_filter
94+
7895
# use page to filter
7996
page = request.GET.get("page", 1)
8097

8198
# Pagination
82-
paginator = Paginator(self.blog_posts, 10) # Show 10 blog_posts per page
99+
paginator = Paginator(blog_posts, 10) # Show 10 blog_posts per page
83100

84101
try:
85102
blog_posts = paginator.page(page)
@@ -88,8 +105,20 @@ def get_context(self, request, *args, **kwargs):
88105
except EmptyPage:
89106
blog_posts = paginator.page(paginator.num_pages)
90107

108+
# Only show Sectors and Services that have been used
109+
related_sectors = Sector.objects.filter(
110+
pk__in=models.Subquery(self.blog_posts.values("related_sectors"))
111+
)
112+
113+
related_services = Service.objects.filter(
114+
pk__in=models.Subquery(self.blog_posts.values("related_services"))
115+
)
116+
tags = chain(related_services, related_sectors)
117+
91118
context.update(
92119
blog_posts=blog_posts,
120+
tags=tags,
121+
extra_url_params=urlencode(extra_url_params),
93122
)
94123
return context
95124

@@ -133,6 +162,18 @@ def set_body_word_count(self):
133162
).split()
134163
self.body_word_count = len(body_words)
135164

165+
@cached_property
166+
def sectors(self):
167+
return self.related_sectors.all()
168+
169+
@cached_property
170+
def services(self):
171+
return self.related_services.all()
172+
173+
@property
174+
def tags(self):
175+
return chain(self.services, self.sectors)
176+
136177
def get_related_blog_posts(self):
137178
# Assumption that blog posts for the same division
138179
# will be under the same blog index page.
@@ -142,7 +183,7 @@ def get_related_blog_posts(self):
142183
if related := self.related_posts.values_list("page"):
143184
# If some blog posts have been manually selected we show those first
144185
base_queryset |= BlogPage.objects.filter(pk__in=related)
145-
manual_first = models.Case(models.When(pk__in=related, then=1), default=2)
186+
manual_first = Case(When(pk__in=related, then=1), default=2)
146187
order_by.insert(0, manual_first)
147188

148189
prefetch_author_images = models.Prefetch(

tbx/blog/tests/test_models.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,3 @@ def test_related_blog_posts_padded_if_not_enough(self):
133133
],
134134
transform=attrgetter("title"),
135135
)
136-
137-
def test_tags_not_rendered(self):
138-
page = BlogPageFactory(
139-
parent=self.blog_index,
140-
related_services=[ServiceFactory(name="SHOULD_NOT_BE_RENDERED")],
141-
related_sectors=[SectorFactory(name="SHOULD_NOT_BE_RENDERED")],
142-
)
143-
response = self.client.get(page.url)
144-
self.assertNotContains(response, "SHOULD_NOT_BE_RENDERED")

tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.html

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
'author-title' : '{{ page.first_author.role }}',
99
'author-name' : '{{ page.first_author.name }}',
1010
'published' : '{{ page.date|date:"Ymd" }}',
11+
'tags' : [{% for tag in page.tags %}'{{tag.name}}'{% if not forloop.last %}, {% endif %}{% endfor %}],
1112
'read-time' : '{{ page.read_time }}',
1213
'id': '{{ page.id }}',
1314
'page-h1' : '{{ page.title }}',
@@ -33,6 +34,13 @@
3334
<h1 class="heading heading--one">{{ page.title }}</h1>
3435

3536
{% pageurl page.blog_index as blog_index_url %}
37+
38+
<div class="tags tags--with-title">
39+
<span class="sr-only">Related post categories</span>
40+
{% for tag in page.tags %}
41+
{% include "patterns/atoms/tag/tag.html" with tag_slug=tag.slug tag_name=tag.name tag_link_base=blog_index_url %}
42+
{% endfor %}
43+
</div>
3644
</div>
3745

3846
<div class="blog-meta">
@@ -47,7 +55,7 @@ <h2 class="motif-heading section-title--related-posts section-title--large-gap"
4755
<ul class="grid__related-posts streamfield__related-posts">
4856
{% for post in page.related_blog_posts %}
4957
{% pageurl post as post_url %}
50-
{% include "patterns/molecules/listing/listing--avatar.html" with title=post.title name=post.first_author.name job_title=post.first_author.role link=post_url date=post.date reading_time=post.read_time hide_tags=True avatar=post.first_author.image tag_link_base=blog_index_url %}
58+
{% include "patterns/molecules/listing/listing--avatar.html" with title=post.title name=post.first_author.name job_title=post.first_author.role link=post_url date=post.date reading_time=post.read_time tags=post.tags hide_tags=True avatar=post.first_author.image tag_link_base=blog_index_url %}
5159
{% endfor %}
5260

5361
<li class="mx-auto lg:mx-0 mt-spacerSmall">

tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ context:
1414
date: 07 Aug 2024
1515
get_verbose_name: Blog page
1616
read_time: 5
17+
tags:
18+
- name: Digital products
19+
slug: digital-products
20+
- name: Wagtail
21+
slug: wagtail
22+
- name: Digital Marketing
23+
slug: digital-marketing
1724
related_blog_posts:
1825
- link: '/'
1926
title: Reimagining our Agile training and ways of working
@@ -22,20 +29,38 @@ context:
2229
role: Product Director
2330
date: 05 Sep 23
2431
read_time: 4
32+
tags_screenreader_text: 'Filter blog posts by category'
33+
tags:
34+
- name: Innovation
35+
slug: innovation
36+
- name: Culture
37+
slug: culture
2538
- link: '/'
2639
title: The future of AI in healthcare
2740
first_author:
2841
name: Emily Johnson
2942
role: Data Scientist
3043
date: 05 Sep 23
3144
read_time: 6
45+
tags_screenreader_text: 'Filter blog posts by category'
46+
tags:
47+
- name: Artificial Intelligence
48+
slug: ai
49+
- name: Healthcare
50+
slug: healthcare
3251
- link: '/'
3352
title: The impact of machine learning in finance
3453
first_author:
3554
name: Sarah Thompson
3655
role: Financial Analyst
3756
date: 05 Sep 23
3857
read_time: 8
58+
tags_screenreader_text: 'Filter blog posts by category'
59+
tags:
60+
- name: Machine Learning
61+
slug: machine-learning
62+
- name: Finance
63+
slug: finance
3964

4065
tags:
4166
include_block:

tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010

1111
{% block content %}
1212
<div class="grid grid--spacer-large">
13-
{% include "patterns/molecules/title-filters/title-filters.html" with item=page hide_tags=True %}
13+
{% include "patterns/molecules/title-filters/title-filters.html" with item=page tags=tags hide_tags=True %}
1414

1515
<ul class="page-listing page-listing--blog">
1616
{% for post in blog_posts %}
1717
{% pageurl post as link %}
18-
{% include "patterns/molecules/listing/listing--avatar.html" with link=link avatar=post.first_author.image title=post.title name=post.first_author.name job_title=post.first_author.role date=post.date reading_time=post.read_time hide_tags=True tag_link_base=blog_index_url base_class="page-listing__item" %}
18+
{% include "patterns/molecules/listing/listing--avatar.html" with link=link avatar=post.first_author.image title=post.title name=post.first_author.name job_title=post.first_author.role date=post.date reading_time=post.read_time tags=post.tags hide_tags=True tag_link_base=blog_index_url base_class="page-listing__item" %}
1919
{% endfor %}
2020
</ul>
2121

tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,41 +23,71 @@ context:
2323
first_author:
2424
name: Paul Vetch
2525
role: Strategy Director
26+
tags:
27+
- name: Digital products
28+
slug: digital-products
29+
- name: Wagtail
30+
slug: wagtail
2631

2732
- title: Wagtail for Public Sector
2833
date: 20 Oct 2023
2934
read_time: '5'
3035
first_author:
3136
name: Paul Vetch
3237
role: Strategy Director
38+
tags:
39+
- name: Social Media
40+
slug: social-media
41+
- name: Culture
42+
slug: culture
3343

3444
- title: Explore the potential of AI in content management
3545
date: 20 Oct 2023
3646
read_time: '5'
3747
first_author:
3848
name: Paul Vetch
3949
role: Strategy Director
50+
tags:
51+
- name: Social Media
52+
slug: social-media
53+
- name: Culture
54+
slug: culture
4055

4156
- title: Wagtail for Public Sector
4257
date: 20 Oct 2023
4358
read_time: '5'
4459
first_author:
4560
name: Will Heinemann
4661
role: New Business Director
62+
tags:
63+
- name: Digital products
64+
slug: digital-products
65+
- name: Wagtail
66+
slug: wagtail
4767

4868
- title: Explore the potential of AI in content management
4969
date: 20 Oct 2023
5070
read_time: '5'
5171
first_author:
5272
name: Will Heinemann
5373
role: New Business Director
74+
tags:
75+
- name: Digital products
76+
slug: digital-products
77+
- name: Wagtail
78+
slug: wagtail
5479

5580
- title: Wagtail for Public Sector
5681
date: 20 Oct 2023
5782
read_time: '5'
5883
first_author:
5984
name: Will Heinemann
6085
role: New Business Director
86+
tags:
87+
- name: Digital products
88+
slug: digital-products
89+
- name: Wagtail
90+
slug: wagtail
6191

6292
tags:
6393
srcset_image:

0 commit comments

Comments
 (0)