From f79df47b787f1bab55f9bb611d65ed0cbd2eefde Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 15 Nov 2019 09:55:50 +0100 Subject: [PATCH] Add specific social media image --- src/pretix/base/models/event.py | 23 +++++++++++++++++-- src/pretix/base/settings.py | 4 ++++ src/pretix/control/forms/event.py | 9 ++++++++ .../pretixcontrol/event/settings.html | 1 + src/pretix/presale/context.py | 7 ++++++ .../templates/pretixpresale/event/base.html | 4 ++++ .../templates/pretixpresale/event/index.html | 4 ---- 7 files changed, 46 insertions(+), 6 deletions(-) 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 @@
{% trans "Shop design" %} {% bootstrap_field sform.logo_image layout="control" %} + {% bootstrap_field sform.og_image layout="control" %} {% url "control:organizer.edit" organizer=request.organizer.slug as org_url %} {% propagated request.event org_url "primary_color" "primary_font" "theme_color_success" "theme_color_danger" %} {% bootstrap_field sform.primary_color layout="control" %} diff --git a/src/pretix/presale/context.py b/src/pretix/presale/context.py index 2c16fc7828..3564507ff3 100644 --- a/src/pretix/presale/context.py +++ b/src/pretix/presale/context.py @@ -59,7 +59,14 @@ def contextprocessor(request): if request.event.settings.presale_css_file: ctx['css_file'] = default_storage.url(request.event.settings.presale_css_file) + ctx['event_logo'] = request.event.settings.get('logo_image', as_type=str, default='')[7:] + ctx['social_image'] = request.event.cache.get_or_set( + 'social_image_url', + request.event.social_image, + 60 + ) + ctx['event'] = request.event ctx['languages'] = [get_language_info(code) for code in request.event.settings.locales] diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index 336a5e285f..305e528f7b 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -11,6 +11,10 @@ {% if event.settings.meta_noindex %} {% endif %} + + {% if social_image %} + + {% endif %} {{ block.super }} {% endblock %} {% block above %} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 3001e70c97..63680b8c21 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -12,10 +12,6 @@ {{ block.super }} - {% if event_logo %} - - {% endif %} - {% if subevent %} {% else %}