Skip to content

Commit a952886

Browse files
authored
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
1 parent c8bac74 commit a952886

3 files changed

Lines changed: 36 additions & 5 deletions

File tree

coderedcms/models/page_models.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import os
88
import warnings
99
from datetime import date, datetime
10-
from typing import Dict, List, Optional, TYPE_CHECKING, Union
10+
from typing import Dict, List, Optional, TYPE_CHECKING, Union, Tuple
1111

1212
# This is a requirement for icalendar, even if django doesn't require it
1313
import pytz
@@ -798,7 +798,9 @@ def upcoming_occurrences(self):
798798
return self.query_occurrences(num_of_instances_to_return=10)
799799

800800
@property
801-
def most_recent_occurrence(self):
801+
def most_recent_occurrence(
802+
self,
803+
) -> Tuple[datetime, datetime, BaseOccurrence]:
802804
"""
803805
Gets the next upcoming, or last occurrence if the event has no more occurrences.
804806
"""
@@ -828,6 +830,11 @@ def most_recent_occurrence(self):
828830
@property
829831
def seo_struct_event_dict(self) -> dict:
830832
next_occ = self.most_recent_occurrence
833+
if not next_occ:
834+
return {}
835+
# The method returns a tuple of the start, end, and object. We only care about
836+
# the object, so take it out of the tuple.
837+
next_occ = next_occ[2]
831838
sd_dict = {
832839
"@context": "https://schema.org/",
833840
"@type": "Event",
@@ -837,12 +844,18 @@ def seo_struct_event_dict(self) -> dict:
837844
"endDate": next_occ.end,
838845
"mainEntityOfPage": {
839846
"@type": "WebPage",
840-
"@id": self.get_full_url,
847+
"@id": self.get_full_url(),
841848
},
842849
}
843850

844851
if self.seo_image:
845-
sd_dict.update({"image": get_struct_data_images(self.seo_image)})
852+
sd_dict.update(
853+
{
854+
"image": get_struct_data_images(
855+
self.get_site(), self.seo_image
856+
)
857+
}
858+
)
846859

847860
if self.address:
848861
sd_dict.update(

coderedcms/models/tests/test_page_models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime, timedelta
12
from django.test import Client
23
from wagtail.test.utils import WagtailPageTests
34

@@ -20,6 +21,7 @@
2021
ArticlePage,
2122
EventIndexPage,
2223
EventPage,
24+
EventOccurrence,
2325
FormPage,
2426
IndexTestPage,
2527
LocationIndexPage,
@@ -200,6 +202,19 @@ class EventIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
200202
class EventPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
201203
model = EventPage
202204

205+
def setUp(self):
206+
super().setUp()
207+
self.occurrence = EventOccurrence(
208+
start=datetime.now(),
209+
end=datetime.now() + timedelta(days=1),
210+
event=self.basic_page,
211+
)
212+
self.occurrence.save()
213+
214+
def tearDown(self) -> None:
215+
super().tearDown()
216+
self.occurrence.delete()
217+
203218

204219
class LocationIndexPageTestCase(ConcreteBasicPageTestCase, WagtailPageTests):
205220
model = LocationIndexPage

coderedcms/templates/coderedcms/pages/base.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,10 @@
165165

166166
{% block custom_scripts %}{% endblock %}
167167

168-
{% include "wagtailseo/struct_data.html" %}
168+
{% block struct_seo %}
169+
{% include "wagtailseo/struct_data.html" %}
170+
{% block struct_seo_extra %}{% endblock %}
171+
{% endblock %}
169172

170173
{% block body_tracking_scripts %}
171174
{% if settings.coderedcms.AnalyticsSettings.gtm_id %}

0 commit comments

Comments
 (0)