diff --git a/tbx/blog/models.py b/tbx/blog/models.py
index ae127df5e..8c059753b 100644
--- a/tbx/blog/models.py
+++ b/tbx/blog/models.py
@@ -1,14 +1,11 @@
-from itertools import chain
import math
import string
from django import forms
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db import models
-from django.db.models import Case, Q, When
from django.dispatch import receiver
from django.utils.functional import cached_property
-from django.utils.http import urlencode
from modelcluster.fields import ParentalKey, ParentalManyToManyField
from wagtail.admin.panels import (
@@ -78,25 +75,11 @@ def blog_posts(self):
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
- # Get blog_posts
- blog_posts = self.blog_posts
-
- # Filter by related_service slug
- slug_filter = request.GET.get("filter")
- extra_url_params = {}
-
- if slug_filter and slug_filter in self.taxonomy_slugs:
- blog_posts = blog_posts.filter(
- Q(related_sectors__slug=slug_filter)
- | Q(related_services__slug=slug_filter)
- )
- extra_url_params["filter"] = slug_filter
-
# use page to filter
page = request.GET.get("page", 1)
# Pagination
- paginator = Paginator(blog_posts, 10) # Show 10 blog_posts per page
+ paginator = Paginator(self.blog_posts, 10) # Show 10 blog_posts per page
try:
blog_posts = paginator.page(page)
@@ -105,20 +88,8 @@ def get_context(self, request, *args, **kwargs):
except EmptyPage:
blog_posts = paginator.page(paginator.num_pages)
- # Only show Sectors and Services that have been used
- related_sectors = Sector.objects.filter(
- pk__in=models.Subquery(self.blog_posts.values("related_sectors"))
- )
-
- related_services = Service.objects.filter(
- pk__in=models.Subquery(self.blog_posts.values("related_services"))
- )
- tags = chain(related_services, related_sectors)
-
context.update(
blog_posts=blog_posts,
- tags=tags,
- extra_url_params=urlencode(extra_url_params),
)
return context
@@ -162,18 +133,6 @@ def set_body_word_count(self):
).split()
self.body_word_count = len(body_words)
- @cached_property
- def sectors(self):
- return self.related_sectors.all()
-
- @cached_property
- def services(self):
- return self.related_services.all()
-
- @property
- def tags(self):
- return chain(self.services, self.sectors)
-
def get_related_blog_posts(self):
# Assumption that blog posts for the same division
# will be under the same blog index page.
@@ -183,7 +142,7 @@ def get_related_blog_posts(self):
if related := self.related_posts.values_list("page"):
# If some blog posts have been manually selected we show those first
base_queryset |= BlogPage.objects.filter(pk__in=related)
- manual_first = Case(When(pk__in=related, then=1), default=2)
+ manual_first = models.Case(models.When(pk__in=related, then=1), default=2)
order_by.insert(0, manual_first)
prefetch_author_images = models.Prefetch(
@@ -261,6 +220,7 @@ def type(self):
FieldPanel("related_services", widget=forms.CheckboxSelectMultiple),
],
heading="Taxonomies",
+ help_text="For internal use only, will not be rendered on the final page.",
),
InlinePanel(
"related_posts",
diff --git a/tbx/blog/tests/test_models.py b/tbx/blog/tests/test_models.py
index c1756b602..73d9e3277 100644
--- a/tbx/blog/tests/test_models.py
+++ b/tbx/blog/tests/test_models.py
@@ -133,3 +133,12 @@ def test_related_blog_posts_padded_if_not_enough(self):
],
transform=attrgetter("title"),
)
+
+ def test_tags_not_rendered(self):
+ page = BlogPageFactory(
+ parent=self.blog_index,
+ related_services=[ServiceFactory(name="SHOULD_NOT_BE_RENDERED")],
+ related_sectors=[SectorFactory(name="SHOULD_NOT_BE_RENDERED")],
+ )
+ response = self.client.get(page.url)
+ self.assertNotContains(response, "SHOULD_NOT_BE_RENDERED")
diff --git a/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.html b/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.html
index 2dd6740ec..f8325717d 100644
--- a/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.html
+++ b/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.html
@@ -8,7 +8,6 @@
'author-title' : '{{ page.first_author.role }}',
'author-name' : '{{ page.first_author.name }}',
'published' : '{{ page.date|date:"Ymd" }}',
- 'tags' : [{% for tag in page.services %}'{{tag.name}}'{% if not forloop.last %}, {% endif %}{% endfor %}],
'read-time' : '{{ page.read_time }}',
'id': '{{ page.id }}',
'page-h1' : '{{ page.title }}',
@@ -34,14 +33,6 @@
{{ page.title }}
{% pageurl page.blog_index as blog_index_url %}
-
- {# Temporarily hide tags #}
-
@@ -56,7 +47,7 @@
{% for post in page.related_blog_posts %}
{% pageurl post as post_url %}
- {% 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 %}
+ {% 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 %}
{% endfor %}
diff --git a/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.yaml b/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.yaml
index 66418a561..92202a240 100644
--- a/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.yaml
+++ b/tbx/project_styleguide/templates/patterns/pages/blog/blog_detail.yaml
@@ -14,13 +14,6 @@ context:
date: 07 Aug 2024
get_verbose_name: Blog page
read_time: 5
- tags:
- - name: Digital products
- slug: digital-products
- - name: Wagtail
- slug: wagtail
- - name: Digital Marketing
- slug: digital-marketing
related_blog_posts:
- link: '/'
title: Reimagining our Agile training and ways of working
@@ -29,12 +22,6 @@ context:
role: Product Director
date: 05 Sep 23
read_time: 4
- tags_screenreader_text: 'Filter blog posts by category'
- tags:
- - name: Innovation
- slug: innovation
- - name: Culture
- slug: culture
- link: '/'
title: The future of AI in healthcare
first_author:
@@ -42,12 +29,6 @@ context:
role: Data Scientist
date: 05 Sep 23
read_time: 6
- tags_screenreader_text: 'Filter blog posts by category'
- tags:
- - name: Artificial Intelligence
- slug: ai
- - name: Healthcare
- slug: healthcare
- link: '/'
title: The impact of machine learning in finance
first_author:
@@ -55,12 +36,6 @@ context:
role: Financial Analyst
date: 05 Sep 23
read_time: 8
- tags_screenreader_text: 'Filter blog posts by category'
- tags:
- - name: Machine Learning
- slug: machine-learning
- - name: Finance
- slug: finance
tags:
include_block:
diff --git a/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.html b/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.html
index 0c3992e01..350afb270 100644
--- a/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.html
+++ b/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.html
@@ -10,12 +10,12 @@
{% block content %}
- {% include "patterns/molecules/title-filters/title-filters.html" with item=page tags=tags hide_tags=True %}
+ {% include "patterns/molecules/title-filters/title-filters.html" with item=page hide_tags=True %}
{% for post in blog_posts %}
{% pageurl post as link %}
- {% 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" %}
+ {% 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" %}
{% endfor %}
diff --git a/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.yaml b/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.yaml
index 944763e5b..b5f5897b6 100644
--- a/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.yaml
+++ b/tbx/project_styleguide/templates/patterns/pages/blog/blog_listing.yaml
@@ -23,11 +23,6 @@ context:
first_author:
name: Paul Vetch
role: Strategy Director
- tags:
- - name: Digital products
- slug: digital-products
- - name: Wagtail
- slug: wagtail
- title: Wagtail for Public Sector
date: 20 Oct 2023
@@ -35,11 +30,6 @@ context:
first_author:
name: Paul Vetch
role: Strategy Director
- tags:
- - name: Social Media
- slug: social-media
- - name: Culture
- slug: culture
- title: Explore the potential of AI in content management
date: 20 Oct 2023
@@ -47,11 +37,6 @@ context:
first_author:
name: Paul Vetch
role: Strategy Director
- tags:
- - name: Social Media
- slug: social-media
- - name: Culture
- slug: culture
- title: Wagtail for Public Sector
date: 20 Oct 2023
@@ -59,11 +44,6 @@ context:
first_author:
name: Will Heinemann
role: New Business Director
- tags:
- - name: Digital products
- slug: digital-products
- - name: Wagtail
- slug: wagtail
- title: Explore the potential of AI in content management
date: 20 Oct 2023
@@ -71,11 +51,6 @@ context:
first_author:
name: Will Heinemann
role: New Business Director
- tags:
- - name: Digital products
- slug: digital-products
- - name: Wagtail
- slug: wagtail
- title: Wagtail for Public Sector
date: 20 Oct 2023
@@ -83,11 +58,6 @@ context:
first_author:
name: Will Heinemann
role: New Business Director
- tags:
- - name: Digital products
- slug: digital-products
- - name: Wagtail
- slug: wagtail
tags:
srcset_image:
diff --git a/tbx/project_styleguide/templatetags/navigation_tags.py b/tbx/project_styleguide/templatetags/navigation_tags.py
index 89f1cc0de..dad639733 100644
--- a/tbx/project_styleguide/templatetags/navigation_tags.py
+++ b/tbx/project_styleguide/templatetags/navigation_tags.py
@@ -6,3 +6,4 @@
override_tag(register, name="primarynav", default_html="")
override_tag(register, name="primarynavmobile", default_html="")
override_tag(register, name="footerlinks", default_html="")
+override_tag(register, name="get_top_level_parent_page", default_html="")
diff --git a/tbx/taxonomy/tests/test_models.py b/tbx/taxonomy/tests/test_models.py
deleted file mode 100644
index 5c6752053..000000000
--- a/tbx/taxonomy/tests/test_models.py
+++ /dev/null
@@ -1,135 +0,0 @@
-from unittest import skip
-
-from wagtail.models import Site
-from wagtail.test.utils import WagtailPageTestCase
-
-from faker import Faker
-
-from tbx.blog.factories import BlogIndexPageFactory, BlogPageFactory
-from tbx.core.factories import HomePageFactory
-from tbx.taxonomy.factories import SectorFactory, ServiceFactory
-from tbx.taxonomy.models import Sector, Service
-
-
-fake = Faker(["en_GB"])
-
-
-class TestTaxonomies(WagtailPageTestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- site = Site.objects.get(is_default_site=True)
- root = site.root_page.specific
- cls.homepage = HomePageFactory(parent=root)
-
- site.root_page = cls.homepage
- site.save()
-
- # Create services
- cls.service_names = ["Service1", "Service2"]
- services = [ServiceFactory(name=name) for name in cls.service_names]
-
- # Create sectors
- cls.sector_names = ["Sector1", "Sector2"]
- sectors = [SectorFactory(name=name) for name in cls.sector_names]
-
- cls.blog_index_page = BlogIndexPageFactory(
- title="Blog Index Page",
- parent=cls.homepage,
- )
-
- cls.blog_page_both = BlogPageFactory(
- parent=cls.blog_index_page,
- related_services=[services[0]],
- related_sectors=[sectors[0]],
- )
- cls.blog_page_service = BlogPageFactory(
- parent=cls.blog_index_page, related_services=[services[1]]
- )
- cls.blog_page_sector = BlogPageFactory(
- parent=cls.blog_index_page, related_sectors=[sectors[1]]
- )
-
- def test_taxonomies_in_template(self):
- response = self.client.get(self.blog_index_page.url)
-
- self.assertEqual(response.status_code, 200)
-
- context = response.context
-
- # Check that the 'tags' variable is present in the context, and is not None
- self.assertIn("tags", context)
- self.assertIsNotNone(context.get("tags"))
-
- # Check that the 'tags' variable corresponds to
- # all services and sectors used in child BlogPages
- # (We've disabled showing the tags in the templates.
- # Pending a review on keeping/removing it.)
- # expected_tags = self.sector_names + self.service_names
- # content = response.content.decode("utf-8")
- # for tag in expected_tags:
- # self.assertIn(tag, content)
-
- def test_blog_post_taxonomies_tags(self):
- """Tests that each blog_post only features the taxonomies associated with that page"""
- services = Service.objects.all()
- sectors = Sector.objects.all()
-
- self.assertListEqual(list(self.blog_page_both.tags), [services[0], sectors[0]])
- self.assertListEqual(list(self.blog_page_service.tags), [services[1]])
- self.assertListEqual(list(self.blog_page_sector.tags), [sectors[1]])
-
- @skip("Related services in blog posts are currently disabled")
- def test_related_blog_posts_services(self):
- """
- Tests the `related_blog_posts` property on the `BlogPage` model using the Service taxonomy
- """
-
- blog_post1 = BlogPageFactory(
- related_services=[ServiceFactory(name="Lorem Ipsum")]
- )
- # there are no blog posts with related services that match those of blog_post1,
- # so there should be 0 related blog posts
- self.assertEqual(len(blog_post1.related_blog_posts), 0)
-
- blog_post2 = BlogPageFactory(
- related_services=[Service.objects.get(name="Service1")]
- )
- # There's only 1 blog post with the 'Culture' related service,
- # so there should only be 1 related blog post
- self.assertEqual(len(blog_post2.related_blog_posts), 1)
-
- blog_post3 = BlogPageFactory(
- related_services=list(Service.objects.filter(name__in=self.service_names)),
- )
- # There are 4 blog posts which share the 4 related services,
- # so there should be 3 related blog posts
- self.assertEqual(len(blog_post3.related_blog_posts), 3)
-
- @skip("Related sectors in blog posts are currently disabled")
- def test_related_blog_posts_sectors(self):
- """
- Tests the `related_blog_posts` property on the `BlogPage` model using the Sectors taxonomy
- """
-
- blog_post1 = BlogPageFactory(
- related_sectors=[SectorFactory(name="Lorem Ipsum")]
- )
- # there are no blog posts with related sectors that match those of blog_post1,
- # so there should be 0 related blog posts
- self.assertEqual(len(blog_post1.related_blog_posts), 0)
-
- blog_post2 = BlogPageFactory(
- related_sectors=[Sector.objects.get(name="Sector1")]
- )
- # There's only 1 blog post with the 'Higher Education' related sectors,
- # so there should only be 1 related blog post
- self.assertEqual(len(blog_post2.related_blog_posts), 1)
-
- blog_post3 = BlogPageFactory(
- related_sectors=list(Sector.objects.filter(name__in=self.sector_names)),
- )
- # There are 4 blog posts which share the 3 related sectors,
- # so there should be 3 related blog posts
- self.assertEqual(len(blog_post3.related_blog_posts), 3)