From 2dd660ed13d9b96cb7a53c9aab146a0179038b3f Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Fri, 19 Aug 2022 16:56:20 +0100 Subject: [PATCH] Add meta tags --- .gitignore | 1 - requirements/base.in | 1 + requirements/base.txt | 3 ++- requirements/dev.txt | 3 ++- .../blog/templates/blog/blog_list_page.html | 2 +- .../templates/blog/blog_post_tag_page.html | 2 +- website/common/models.py | 18 ++++++++++++++- website/common/templates/wagtail_base.html | 6 +++++ .../templates/wagtailmetadata/parts/tags.html | 23 +++++++++++++++++++ website/common/tests/test_pages.py | 4 ++-- website/home/models.py | 19 ++++++++++++++- website/settings.py | 1 + 12 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 website/common/templates/wagtailmetadata/parts/tags.html diff --git a/.gitignore b/.gitignore index 481ebc1..996837b 100644 --- a/.gitignore +++ b/.gitignore @@ -161,7 +161,6 @@ eggs/ .eggs/ lib/ lib64/ -parts/ sdist/ var/ wheels/ diff --git a/requirements/base.in b/requirements/base.in index 75f5778..e2ba92d 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -15,3 +15,4 @@ gunicorn psycopg2 djangorestframework django-htmx +wagtail-metadata diff --git a/requirements/base.txt b/requirements/base.txt index 50e790d..50bda00 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -48,9 +48,10 @@ sqlparse==0.4.2 # via django tablib[xls,xlsx]==3.2.1 # via wagtail telepath==0.2 # via wagtail urllib3==1.26.11 # via requests -wagtail==3.0.1 # via -r requirements/base.in, wagtail-draftail-snippet +wagtail==3.0.1 # via -r requirements/base.in, wagtail-draftail-snippet, wagtail-metadata wagtail-draftail-snippet==0.4.1 # via -r requirements/base.in wagtail-generic-chooser==0.4.1 # via -r requirements/base.in +wagtail-metadata==4.0.0 # via -r requirements/base.in webencodings==0.5.1 # via html5lib whitenoise[brotli]==6.2.0 # via -r requirements/base.in willow==1.4.1 # via wagtail diff --git a/requirements/dev.txt b/requirements/dev.txt index 6028335..5c81e41 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -77,10 +77,11 @@ types-requests==2.28.5 # via -r requirements/dev.in types-urllib3==1.26.17 # via types-requests typing-extensions==4.3.0 # via mypy urllib3==1.26.11 # via -r requirements/base.txt, requests -wagtail==3.0.1 # via -r requirements/base.txt, wagtail-draftail-snippet, wagtail-factories +wagtail==3.0.1 # via -r requirements/base.txt, wagtail-draftail-snippet, wagtail-factories, wagtail-metadata wagtail-draftail-snippet==0.4.1 # via -r requirements/base.txt wagtail-factories==3.1.0 # via -r requirements/dev.in wagtail-generic-chooser==0.4.1 # via -r requirements/base.txt +wagtail-metadata==4.0.0 # via -r requirements/base.txt webencodings==0.5.1 # via -r requirements/base.txt, html5lib wheel==0.37.1 # via pip-tools whitenoise[brotli]==6.2.0 # via -r requirements/base.txt diff --git a/website/blog/templates/blog/blog_list_page.html b/website/blog/templates/blog/blog_list_page.html index 0e4d4fc..194b7c0 100644 --- a/website/blog/templates/blog/blog_list_page.html +++ b/website/blog/templates/blog/blog_list_page.html @@ -2,7 +2,7 @@ {% load wagtailroutablepage_tags %} -{% block extra_head %} +{% block extra_css %} {% endblock %} diff --git a/website/blog/templates/blog/blog_post_tag_page.html b/website/blog/templates/blog/blog_post_tag_page.html index 3dd319d..7a35321 100644 --- a/website/blog/templates/blog/blog_post_tag_page.html +++ b/website/blog/templates/blog/blog_post_tag_page.html @@ -2,7 +2,7 @@ {% load wagtailroutablepage_tags %} -{% block extra_head %} +{% block extra_css %} {% endblock %} diff --git a/website/common/models.py b/website/common/models.py index 0d79f19..9128bed 100644 --- a/website/common/models.py +++ b/website/common/models.py @@ -12,6 +12,7 @@ from wagtail.images.views.serve import generate_image_url from wagtail.models import Page, PageQuerySet from wagtail.search import index from wagtail.snippets.models import register_snippet +from wagtailmetadata.models import MetadataMixin from website.common.utils import count_words from website.contrib.unsplash.widgets import UnsplashPhotoChooser @@ -37,7 +38,7 @@ class BasePage(Page): return self.get_ancestors().exclude(depth__lte=2) -class BaseContentPage(BasePage): +class BaseContentPage(BasePage, MetadataMixin): subtitle = models.CharField(max_length=255, blank=True) hero_image = models.ForeignKey( get_image_model_string(), null=True, blank=True, on_delete=models.SET_NULL @@ -113,6 +114,21 @@ class BaseContentPage(BasePage): return generate_image_url(self.hero_image, "width-400") return None + def get_meta_url(self) -> str: + return self.full_url + + def get_meta_image_url(self, request: HttpRequest) -> Optional[str]: + return self.hero_image_url + + def get_meta_title(self) -> str: + return self.seo_title or self.title + + def get_meta_description(self) -> str: + return self.summary + + def get_object_title(self) -> str: + return "" + class ContentPage(BaseContentPage): subpage_types: list[Any] = [] diff --git a/website/common/templates/wagtail_base.html b/website/common/templates/wagtail_base.html index e8bed08..bf7ef28 100644 --- a/website/common/templates/wagtail_base.html +++ b/website/common/templates/wagtail_base.html @@ -1,9 +1,15 @@ {% extends "base.html" %} +{% load wagtailmetadata_tags %} + {% block body_class %}{{ page.body_class }}{% endblock %} {% block title %}{% if page.seo_title %}{{ page.seo_title }}{% else %}{{ page.title }}{% endif %}{% endblock %} +{% block extra_head %} + {% meta_tags %} +{% endblock %} + {% block main_content %} {% if page.hero_image_url %} diff --git a/website/common/templates/wagtailmetadata/parts/tags.html b/website/common/templates/wagtailmetadata/parts/tags.html new file mode 100644 index 0000000..2a0aaf0 --- /dev/null +++ b/website/common/templates/wagtailmetadata/parts/tags.html @@ -0,0 +1,23 @@ +{% extends "wagtailmetadata/parts/tags.html" %} + +{% block twitter %} + {{ block.super }} + {% if object.reading_time %} + + + {% endif %} +{% endblock %} + +{% block opengraph %} + {{ block.super }} + + + {% if object.date %} + + {% endif %} +{% endblock %} + +{% block meta %} + {{ block.super }} + +{% endblock %} diff --git a/website/common/tests/test_pages.py b/website/common/tests/test_pages.py index 29382bc..87dcb19 100644 --- a/website/common/tests/test_pages.py +++ b/website/common/tests/test_pages.py @@ -35,7 +35,7 @@ class ContentPageTestCase(TestCase): self.assertEqual(response.status_code, 200) def test_queries(self) -> None: - with self.assertNumQueries(16): + with self.assertNumQueries(17): self.client.get(self.page.url) @@ -57,5 +57,5 @@ class ListingPageTestCase(TestCase): self.assertEqual(len(response.context["child_pages"]), 2) def test_queries(self) -> None: - with self.assertNumQueries(19): + with self.assertNumQueries(20): self.client.get(self.page.url) diff --git a/website/home/models.py b/website/home/models.py index 540583c..e036c85 100644 --- a/website/home/models.py +++ b/website/home/models.py @@ -2,12 +2,14 @@ from django.db import models from django.http.request import HttpRequest from wagtail.admin.panels import FieldPanel from wagtail.images import get_image_model_string +from wagtail.images.models import Image +from wagtailmetadata.models import WagtailImageMetadataMixin from website.blog.models import BlogPostPage from website.common.models import BasePage -class HomePage(BasePage): +class HomePage(BasePage, WagtailImageMetadataMixin): max_count = 1 heading = models.CharField(max_length=128, blank=True) @@ -20,6 +22,21 @@ class HomePage(BasePage): FieldPanel("image"), ] + def get_meta_url(self) -> str: + return self.full_url + + def get_meta_image(self) -> Image | None: + return self.image + + def get_meta_title(self) -> str: + return self.seo_title or self.title + + def get_meta_description(self) -> str: + return self.search_description + + def get_object_title(self) -> str: + return "" + def get_context(self, request: HttpRequest) -> dict: from website.search.models import SearchPage diff --git a/website/settings.py b/website/settings.py index 1e57a52..f2fdd06 100644 --- a/website/settings.py +++ b/website/settings.py @@ -50,6 +50,7 @@ INSTALLED_APPS = [ "wagtail.search", "wagtail.admin", "wagtail", + "wagtailmetadata", "modelcluster", "taggit", "generic_chooser",