Browse Source

Fix event structured data not appearing on event pages (#557)

Add custom block to `base.html` to allow for custom seo data not
included by default in wagtail seo.
Cleans up logic in event page seo generation to fix errors.

Co-authored-by: @vorletzter
Jeremy Childers 2 years ago
parent
commit
a952886eb5

+ 17 - 4
coderedcms/models/page_models.py

@@ -7,7 +7,7 @@ import logging
 import os
 import warnings
 from datetime import date, datetime
-from typing import Dict, List, Optional, TYPE_CHECKING, Union
+from typing import Dict, List, Optional, TYPE_CHECKING, Union, Tuple
 
 # This is a requirement for icalendar, even if django doesn't require it
 import pytz
@@ -798,7 +798,9 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
         return self.query_occurrences(num_of_instances_to_return=10)
 
     @property
-    def most_recent_occurrence(self):
+    def most_recent_occurrence(
+        self,
+    ) -> Tuple[datetime, datetime, BaseOccurrence]:
         """
         Gets the next upcoming, or last occurrence if the event has no more occurrences.
         """
@@ -828,6 +830,11 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
     @property
     def seo_struct_event_dict(self) -> dict:
         next_occ = self.most_recent_occurrence
+        if not next_occ:
+            return {}
+        # The method returns a tuple of the start, end, and object. We only care about
+        # the object, so take it out of the tuple.
+        next_occ = next_occ[2]
         sd_dict = {
             "@context": "https://schema.org/",
             "@type": "Event",
@@ -837,12 +844,18 @@ class CoderedEventPage(CoderedWebPage, BaseEvent):
             "endDate": next_occ.end,
             "mainEntityOfPage": {
                 "@type": "WebPage",
-                "@id": self.get_full_url,
+                "@id": self.get_full_url(),
             },
         }
 
         if self.seo_image:
-            sd_dict.update({"image": get_struct_data_images(self.seo_image)})
+            sd_dict.update(
+                {
+                    "image": get_struct_data_images(
+                        self.get_site(), self.seo_image
+                    )
+                }
+            )
 
         if self.address:
             sd_dict.update(

+ 15 - 0
coderedcms/models/tests/test_page_models.py

@@ -1,3 +1,4 @@
+from datetime import datetime, timedelta
 from django.test import Client
 from wagtail.test.utils import WagtailPageTests
 
@@ -20,6 +21,7 @@ from coderedcms.tests.testapp.models import (
     ArticlePage,
     EventIndexPage,
     EventPage,
+    EventOccurrence,
     FormPage,
     IndexTestPage,
     LocationIndexPage,
@@ -200,6 +202,19 @@ class EventIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
 class EventPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
     model = EventPage
 
+    def setUp(self):
+        super().setUp()
+        self.occurrence = EventOccurrence(
+            start=datetime.now(),
+            end=datetime.now() + timedelta(days=1),
+            event=self.basic_page,
+        )
+        self.occurrence.save()
+
+    def tearDown(self) -> None:
+        super().tearDown()
+        self.occurrence.delete()
+
 
 class LocationIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
     model = LocationIndexPage

+ 4 - 1
coderedcms/templates/coderedcms/pages/base.html

@@ -165,7 +165,10 @@
 
   {% block custom_scripts %}{% endblock %}
 
-  {% include "wagtailseo/struct_data.html" %}
+  {% block struct_seo %}
+    {% include "wagtailseo/struct_data.html" %}
+    {% block struct_seo_extra %}{% endblock %}
+  {% endblock %}
 
   {% block body_tracking_scripts %}
   {% if settings.coderedcms.AnalyticsSettings.gtm_id %}