diff --git a/src/pretix/control/templates/pretixcontrol/event/base.html b/src/pretix/control/templates/pretixcontrol/event/base.html index a1ddb4d6f..1c5de3fa2 100644 --- a/src/pretix/control/templates/pretixcontrol/event/base.html +++ b/src/pretix/control/templates/pretixcontrol/event/base.html @@ -8,7 +8,7 @@ - {% trans "Dashboard" %} + {% trans "Event dashboard" %} {% if 'can_change_event_settings' in request.eventpermset %} diff --git a/src/pretix/control/templates/pretixcontrol/event/display.html b/src/pretix/control/templates/pretixcontrol/event/display.html index f8c350b7d..ca3781d82 100644 --- a/src/pretix/control/templates/pretixcontrol/event/display.html +++ b/src/pretix/control/templates/pretixcontrol/event/display.html @@ -1,18 +1,25 @@ {% extends "pretixcontrol/event/settings_base.html" %} {% load i18n %} {% load bootstrap3 %} +{% load hierarkey_form %} {% block inside %}
{% csrf_token %} {% bootstrap_form_errors form %}
- {% trans "Display settings" %} - {% bootstrap_field form.primary_color layout="horizontal" %} - {% bootstrap_field form.primary_font layout="horizontal" %} + {% trans "Event page" %} {% bootstrap_field form.logo_image layout="horizontal" %} {% bootstrap_field form.frontpage_text layout="horizontal" %} {% bootstrap_field form.show_variations_expanded layout="horizontal" %}
+
+ {% trans "Shop design" %} + {% url "control:organizer.display" organizer=request.organizer.slug as org_url %} + {% propagated request.event org_url "primary_color" "primary_font" %} + {% bootstrap_field form.primary_color layout="horizontal" %} + {% bootstrap_field form.primary_font layout="horizontal" %} + {% endpropagated %} +
+ + {text_orga} + +
+ + """.format( + body=body, + text_inh=_("Organizer-level settings"), + fnames=','.join(self.field_names), + text_expl=_( + 'These settings are currently set on organizer level. This way, you can easily change them for ' + 'all of your events at the same time. You can either go to the organizer settings to change them ' + 'or decouple them from the organizer account to change them for this event individually.' + ), + text_unlink=_('Change only for this event'), + text_orga=_('Change for all events'), + url=url + ) + + return body + + +@register.tag +def propagated(parser, token): + try: + tag, event, url, *args = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError( + "%r tag requires at least three arguments" % token.contents.split()[0] + ) + + nodelist = parser.parse(('endpropagated',)) + parser.delete_first_token() + return PropagatedNode(nodelist, event, [f[1:-1] for f in args], url) diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 27dc264eb..02d4a35e0 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -328,11 +328,23 @@ class EventSettingsFormView(EventPermissionRequiredMixin, FormView): kwargs['obj'] = self.request.event return kwargs + def _save_decoupled(self, form): + # Save fields that are currently only set via the organizer but should be decoupled + fields = set() + for f in self.request.POST.getlist("decouple"): + fields |= set(f.split(",")) + for f in fields: + if f not in form.fields: + continue + if f not in self.request.event.settings._cache(): + self.request.event.settings.set(f, self.request.event.settings.get(f)) + @transaction.atomic def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): form.save() + self._save_decoupled(form) if form.has_changed(): self.request.event.log_action( 'pretix.event.settings', user=self.request.user, data={ @@ -394,6 +406,7 @@ class DisplaySettings(EventSettingsViewMixin, EventSettingsFormView): form = self.get_form() if form.is_valid(): form.save() + self._save_decoupled(form) if form.has_changed(): self.request.event.log_action( 'pretix.event.settings', user=self.request.user, data={ diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index 5efe24fa1..11aec0aa7 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -312,4 +312,13 @@ $(function () { } ); }); + + $(".propagated-settings-box button[data-action=unlink]").click(function(ev) { + var $box = $(this).closest(".propagated-settings-box"); + $box.find(".propagated-settings-overlay").fadeOut(); + $box.find("input[name=_settings_ignore]").attr("name", "decouple"); + $box.find(".propagated-settings-form").removeClass("blurred"); + ev.preventDefault(); + return true; + }) }); diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index 44a354a14..0210faefd 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -212,4 +212,31 @@ pre.mail-preview { border-top-left-radius: 0; border-left: 0; } +} + +.propagated-settings-box { + position: relative; + + .propagated-settings-overlay { + background: rgba(255, 255, 255, 0.7); + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-align: center; + } + + .propagated-settings-form.blurred { + -webkit-filter: blur(2px); + -moz-filter: blur(2px); + -ms-filter: blur(2px); + -o-filter: blur(2px); + filter: blur(2px); + } +} +@media (max-width: $screen-sm-max) { + .propagated-settings-box { + min-height: 250px; + } } \ No newline at end of file