diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index fbee95c12a..b914183870 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -3,6 +3,7 @@ import uuid from collections import OrderedDict from datetime import datetime, time, timedelta from operator import attrgetter +from urllib.parse import urljoin import pytz from django.conf import settings @@ -26,6 +27,7 @@ from pretix.base.validators import EventSlugBanlistValidator from pretix.helpers.database import GroupConcat from pretix.helpers.daterange import daterange from pretix.helpers.json import safe_string +from pretix.helpers.thumb import get_thumbnail from ..settings import settings_hierarkey from .organizer import Organizer, Team @@ -145,10 +147,13 @@ class EventMixin: "@context": "http://schema.org", "@type": "Event", "location": { "@type": "Place", - "address": str(self.location) + "address": str(self.location), }, - "name": str(self.name) + "name": str(self.name), } + img = getattr(self, 'event', self).social_image + if img: + eventdict['image'] = img if self.settings.show_times: eventdict["startDate"] = self.date_from.isoformat() @@ -358,6 +363,20 @@ class Event(EventMixin, LoggedModel): def __str__(self): return str(self.name) + @property + def social_image(self): + from pretix.multidomain.urlreverse import build_absolute_uri + + img = None + logo_file = self.settings.get('logo_image', as_type=str, default='')[7:] + og_file = self.settings.get('og_image', as_type=str, default='')[7:] + if og_file: + img = get_thumbnail(og_file, '1200').thumb.url + elif logo_file: + img = get_thumbnail(logo_file, '5000x120').thumb.url + if img: + return urljoin(build_absolute_uri(self, 'presale:event.index'), img) + @property def free_seats(self): from .orders import CartPosition, Order, OrderPosition diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index f646a7331c..2cb5533c2b 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -656,6 +656,10 @@ Your {event} team""")) 'default': None, 'type': File }, + 'og_image': { + 'default': None, + 'type': File + }, 'invoice_logo_image': { 'default': None, 'type': File diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 4460bc31dc..5fd6122846 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -488,6 +488,15 @@ class EventSettingsForm(SettingsForm): help_text=_('If you provide a logo image, we will by default not show your events name and date ' 'in the page header. We will show your logo with a maximal height of 120 pixels.') ) + og_image = ExtFileField( + label=_('Social media image'), + ext_whitelist=(".png", ".jpg", ".gif", ".jpeg"), + required=False, + help_text=_('This picture will be used as a preview if you post links to your ticket shop on social media. ' + 'Facebook advises to use a picture size of 1200 x 630 pixels, however some platforms like ' + 'WhatsApp and Reddit only show a square preview, so we recommend to make sure it still looks good ' + 'only the center square is shown. If you do not fill this, we will use the logo given above.') + ) frontpage_text = I18nFormField( label=_("Frontpage text"), required=False, diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 8b17f4db4c..fd276569ae 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -96,6 +96,7 @@