diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 79b2142c4..19fab9985 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1298,6 +1298,14 @@ Your {event} team""")) 'default': '#D36060', 'type': str }, + 'theme_color_background': { + 'default': '#FFFFFF', + 'type': str + }, + 'theme_round_borders': { + 'default': 'True', + 'type': bool + }, 'primary_font': { 'default': 'Open Sans', 'type': str @@ -1322,6 +1330,22 @@ Your {event} team""")) 'default': None, 'type': File }, + 'logo_image_large': { + 'default': 'False', + 'type': bool + }, + 'logo_show_title': { + 'default': 'True', + 'type': bool + }, + 'organizer_logo_image': { + 'default': None, + 'type': File + }, + 'organizer_logo_image_large': { + 'default': 'False', + 'type': bool + }, 'og_image': { 'default': None, 'type': File diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 72927bb05..523ff33da 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -355,11 +355,23 @@ class EventSettingsForm(SettingsForm): required=False, ) logo_image = ExtFileField( - label=_('Logo image'), + label=_('Header image'), ext_whitelist=(".png", ".jpg", ".gif", ".jpeg"), required=False, - 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.') + help_text=_('If you provide a logo image, we will by default not show your event name and date ' + 'in the page header. By default, we show your logo with a size of up to 1140x120 pixels. You ' + 'can increase the size with the setting below. We recommend not using small details on the picture ' + 'as it will be resized on smaller screens.') + ) + logo_image_large = forms.BooleanField( + label=_('Use header image in its full size'), + help_text=_('We recommend to upload a picture at least 1170 pixels wide.'), + required=False, + ) + logo_show_title = forms.BooleanField( + label=_('Show event title even if a header image is present'), + help_text=_('The title will only be shown on the event front page.'), + required=False, ) og_image = ExtFileField( label=_('Social media image'), @@ -399,6 +411,20 @@ class EventSettingsForm(SettingsForm): ], widget=forms.TextInput(attrs={'class': 'colorpickerfield'}) ) + theme_color_background = forms.CharField( + label=_("Page background color"), + required=False, + validators=[ + RegexValidator(regex='^#[0-9a-fA-F]{6}$', + message=_('Please enter the hexadecimal code of a color, e.g. #990000.')), + + ], + widget=forms.TextInput(attrs={'class': 'colorpickerfield no-contrast'}) + ) + theme_round_borders = forms.BooleanField( + label=_("Use round edges"), + required=False, + ) primary_font = forms.ChoiceField( label=_('Font'), choices=[ diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index ea59d5745..dca2f381a 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -250,6 +250,20 @@ class OrganizerSettingsForm(SettingsForm): ], widget=forms.TextInput(attrs={'class': 'colorpickerfield'}) ) + theme_color_background = forms.CharField( + label=_("Page background color"), + required=False, + validators=[ + RegexValidator(regex='^#[0-9a-fA-F]{6}$', + message=_('Please enter the hexadecimal code of a color, e.g. #990000.')), + + ], + widget=forms.TextInput(attrs={'class': 'colorpickerfield no-contrast'}) + ) + theme_round_borders = forms.BooleanField( + label=_("Use round edges"), + required=False, + ) organizer_homepage_text = I18nFormField( label=_('Homepage text'), required=False, @@ -257,11 +271,18 @@ class OrganizerSettingsForm(SettingsForm): help_text=_('This will be displayed on the organizer homepage.') ) organizer_logo_image = ExtFileField( - label=_('Logo image'), + label=_('Header image'), ext_whitelist=(".png", ".jpg", ".gif", ".jpeg"), required=False, help_text=_('If you provide a logo image, we will by default not show your organization name ' - 'in the page header. We will show your logo with a maximal height of 120 pixels.') + 'in the page header. By default, we show your logo with a size of up to 1140x120 pixels. You ' + 'can increase the size with the setting below. We recommend not using small details on the picture ' + 'as it will be resized on smaller screens.') + ) + organizer_logo_image_large = forms.BooleanField( + label=_('Use header image in its full size'), + help_text=_('We recommend to upload a picture at least 1170 pixels wide.'), + required=False, ) event_list_type = forms.ChoiceField( label=_('Default overview style'), diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index f94418cd8..2d03ed5db 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -98,12 +98,16 @@
{% trans "Shop design" %} {% bootstrap_field sform.logo_image layout="control" %} + {% bootstrap_field sform.logo_image_large layout="control" %} + {% bootstrap_field sform.logo_show_title 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" %} {% bootstrap_field sform.theme_color_success layout="control" %} {% bootstrap_field sform.theme_color_danger layout="control" %} + {% bootstrap_field sform.theme_color_background layout="control" %} + {% bootstrap_field sform.theme_round_borders layout="control" %} {% bootstrap_field sform.primary_font layout="control" %} {% endpropagated %}
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/edit.html b/src/pretix/control/templates/pretixcontrol/organizers/edit.html index 7a2c64a99..412a6a469 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/edit.html @@ -37,6 +37,7 @@
{% trans "Organizer page" %} {% bootstrap_field sform.organizer_logo_image layout="control" %} + {% bootstrap_field sform.organizer_logo_image_large layout="control" %} {% bootstrap_field sform.organizer_homepage_text layout="control" %} {% bootstrap_field sform.event_list_type layout="control" %} {% bootstrap_field sform.event_list_availability layout="control" %} @@ -57,6 +58,8 @@ {% bootstrap_field sform.primary_color layout="control" %} {% bootstrap_field sform.theme_color_success layout="control" %} {% bootstrap_field sform.theme_color_danger layout="control" %} + {% bootstrap_field sform.theme_color_background layout="control" %} + {% bootstrap_field sform.theme_round_borders layout="control" %} {% bootstrap_field sform.primary_font layout="control" %} {% bootstrap_field sform.favicon layout="control" %}
diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index c4d7f6478..5a84edd92 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -156,6 +156,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired }) display_properties = ( 'primary_color', 'theme_color_success', 'theme_color_danger', 'primary_font', + 'theme_color_background', 'theme_round_borders', ) if any(p in self.sform.changed_data for p in display_properties): change_css = True diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 589763d34..5667ad03a 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -278,6 +278,7 @@ class OrganizerUpdate(OrganizerPermissionRequiredMixin, UpdateView): ) display_properties = ( 'primary_color', 'theme_color_success', 'theme_color_danger', 'primary_font', + 'theme_color_background', 'theme_round_borders' ) if any(p in self.sform.changed_data for p in display_properties): change_css = True diff --git a/src/pretix/presale/management/commands/updatestyles.py b/src/pretix/presale/management/commands/updatestyles.py index 993ece380..0ca099fb2 100644 --- a/src/pretix/presale/management/commands/updatestyles.py +++ b/src/pretix/presale/management/commands/updatestyles.py @@ -1,9 +1,11 @@ import hashlib from django.conf import settings +from django.core.cache import cache from django.core.files.base import ContentFile, File from django.core.files.storage import default_storage from django.core.management.base import BaseCommand +from django.utils.timezone import now from django_scopes import scopes_disabled from pretix.base.models import Event_SettingsStore, Organizer_SettingsStore @@ -16,12 +18,27 @@ from ...style import regenerate_css, regenerate_organizer_css class Command(BaseCommand): help = "Re-generate all custom stylesheets and scripts" + def add_arguments(self, parser): + parser.add_argument('--organizer', action='store', type=str) + parser.add_argument('--event', action='store', type=str) + @scopes_disabled() def handle(self, *args, **options): - for es in Organizer_SettingsStore.objects.filter(key="presale_css_file"): + # Reset compile cache + cache.set('sass_compile_prefix', now().isoformat()) + + ostore = Organizer_SettingsStore.objects.filter(key="presale_css_file") + if options.get('organizer'): + ostore = ostore.filter(object__slug=options['organizer']) + for es in ostore: regenerate_organizer_css.apply_async(args=(es.object_id,)) - for es in Event_SettingsStore.objects.filter(key="presale_css_file").order_by('-object__date_from'): + estore = Event_SettingsStore.objects.filter(key="presale_css_file").order_by('-object__date_from') + if options.get('event'): + estore = estore.filter(object__slug=options['event']) + if options.get('organizer'): + estore = estore.filter(object__organizer__slug=options['event']) + for es in estore: regenerate_css.apply_async(args=(es.object_id,)) gs = GlobalSettingsObject() diff --git a/src/pretix/presale/style.py b/src/pretix/presale/style.py index 1e7a24af4..235a14738 100644 --- a/src/pretix/presale/style.py +++ b/src/pretix/presale/style.py @@ -12,6 +12,7 @@ from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.dispatch import Signal from django.templatetags.static import static as _static +from django.utils.timezone import now from django_scopes import scope from pretix.base.models import Event, Event_SettingsStore, Organizer @@ -49,6 +50,12 @@ def compile_scss(object, file="main.scss", fonts=True): sassrules.append('$brand-success: {};'.format(object.settings.get('theme_color_success'))) if object.settings.get('theme_color_danger'): sassrules.append('$brand-danger: {};'.format(object.settings.get('theme_color_danger'))) + if object.settings.get('theme_color_background'): + sassrules.append('$body-bg: {};'.format(object.settings.get('theme_color_background'))) + if not object.settings.get('theme_round_borders'): + sassrules.append('$border-radius-base: 0;') + sassrules.append('$border-radius-large: 0;') + sassrules.append('$border-radius-small: 0;') font = object.settings.get('primary_font') if font != 'Open Sans' and fonts: @@ -72,7 +79,8 @@ def compile_scss(object, file="main.scss", fonts=True): sasssrc = "\n".join(sassrules) srcchecksum = hashlib.sha1(sasssrc.encode('utf-8')).hexdigest() - css = cache.get('sass_compile_{}'.format(srcchecksum)) + cp = cache.get_or_set('sass_compile_prefix', now().isoformat()) + css = cache.get('sass_compile_{}_{}'.format(cp, srcchecksum)) if not css: cf = dict(django_libsass.CUSTOM_FUNCTIONS) cf['static'] = static diff --git a/src/pretix/presale/templates/pretixpresale/base.html b/src/pretix/presale/templates/pretixpresale/base.html index f3461b035..fccca059c 100644 --- a/src/pretix/presale/templates/pretixpresale/base.html +++ b/src/pretix/presale/templates/pretixpresale/base.html @@ -51,7 +51,7 @@ {{ html_page_header|safe }} {% block above %} {% endblock %} -
+
{% block page %} {% endblock %}
{% endif %} -{% endblock %} -{% block page %} -