diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 30fab561e..baac4f2d2 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -22,6 +22,7 @@ from pretix.base.models.base import LoggedModel from pretix.base.reldate import RelativeDateWrapper from pretix.base.validators import EventSlugBlacklistValidator from pretix.helpers.daterange import daterange +from pretix.helpers.json import safe_string from ..settings import settings_hierarkey from .organizer import Organizer @@ -103,6 +104,30 @@ class EventMixin: return False return True + @property + def event_microdata(self): + import json + + eventdict = { + "@context": "http://schema.org", + "@type": "Event", "location": { + "@type": "Place", + "address": str(self.location) + }, + "name": str(self.name) + } + + if self.settings.show_times: + eventdict["startDate"] = self.date_from.isoformat() + if self.settings.show_date_to and self.date_to is not None: + eventdict["endDate"] = self.date_to.isoformat() + else: + eventdict["startDate"] = self.date_from.date().isoformat() + if self.settings.show_date_to and self.date_to is not None: + eventdict["endDate"] = self.date_to.date().isoformat() + + return safe_string(json.dumps(eventdict)) + @settings_hierarkey.add(parent_field='organizer', cache_namespace='event') class Event(EventMixin, LoggedModel): @@ -365,26 +390,6 @@ class Event(EventMixin, LoggedModel): providers[pp.identifier] = pp return providers - @property - def event_microdata(self): - import json - - eventdict = {"@context": "http://schema.org", "@type": "Event"} - eventdict["location"] = {"@type": "Place", - "address": str(self.location)} - if self.settings.show_times: - eventdict["startDate"] = self.date_from.isoformat() - if self.settings.show_date_to and self.date_to is not None: - eventdict["endDate"] = self.date_to.isoformat() - else: - eventdict["startDate"] = self.date_from.date().isoformat() - if self.settings.show_date_to and self.date_to is not None: - eventdict["endDate"] = self.date_to.date().isoformat() - - eventdict["name"] = str(self.name) - - return json.dumps(eventdict) - def get_invoice_renderers(self) -> dict: """ Returns a dictionary of initialized invoice renderers mapped by their identifiers. diff --git a/src/pretix/helpers/json.py b/src/pretix/helpers/json.py index c0344f192..44e7bf180 100644 --- a/src/pretix/helpers/json.py +++ b/src/pretix/helpers/json.py @@ -9,3 +9,7 @@ class CustomJSONEncoder(I18nJSONEncoder): return obj.to_string() else: return super().default(obj) + + +def safe_string(original): + return original.replace("<", "\\u003C").replace(">", "\\u003E") diff --git a/src/pretix/presale/templates/pretixpresale/base.html b/src/pretix/presale/templates/pretixpresale/base.html index 094bec1f9..669ee7aed 100644 --- a/src/pretix/presale/templates/pretixpresale/base.html +++ b/src/pretix/presale/templates/pretixpresale/base.html @@ -30,13 +30,6 @@ {% endcompress %} - {% if event %} - {% autoescape off %} - - {% endautoescape %} - {% endif %} {{ html_head|safe }} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 869a4c914..d0f1e7882 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -8,6 +8,12 @@ {% block title %}{% trans "Presale" %}{% endblock %} {% block content %} + + {% autoescape off %} + + {% endautoescape %} {% if show_cart %}