UI for settings propagation

This commit is contained in:
Raphael Michel
2017-10-06 14:20:37 +02:00
parent bbd112280a
commit 411c537438
6 changed files with 128 additions and 4 deletions

View File

@@ -8,7 +8,7 @@
<a href="{% url 'control:event.index' organizer=request.event.organizer.slug event=request.event.slug %}"
{% if url_name == "event.index" %}class="active"{% endif %}>
<i class="fa fa-dashboard fa-fw"></i>
{% trans "Dashboard" %}
{% trans "Event dashboard" %}
</a>
</li>
{% if 'can_change_event_settings' in request.eventpermset %}

View File

@@ -1,18 +1,25 @@
{% extends "pretixcontrol/event/settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% load hierarkey_form %}
{% block inside %}
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form_errors form %}
<fieldset>
<legend>{% trans "Display settings" %}</legend>
{% bootstrap_field form.primary_color layout="horizontal" %}
{% bootstrap_field form.primary_font layout="horizontal" %}
<legend>{% trans "Event page" %}</legend>
{% bootstrap_field form.logo_image layout="horizontal" %}
{% bootstrap_field form.frontpage_text layout="horizontal" %}
{% bootstrap_field form.show_variations_expanded layout="horizontal" %}
</fieldset>
<fieldset>
<legend>{% trans "Shop design" %}</legend>
{% 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 %}
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}

View File

@@ -0,0 +1,68 @@
from django import template
from django.template import Node
from django.utils.translation import ugettext as _
register = template.Library()
class PropagatedNode(Node):
def __init__(self, nodelist, event, field_names, url):
self.nodelist = nodelist
self.event = template.Variable(event)
self.field_names = field_names
self.url = template.Variable(url)
def render(self, context):
event = self.event.resolve(context)
url = self.url.resolve(context)
body = self.nodelist.render(context)
if all([fn not in event.settings._cache() for fn in self.field_names]):
body = """
<div class="propagated-settings-box">
<input type="hidden" name="_settings_ignore" value="{fnames}">
<div class="propagated-settings-form blurred">
{body}
</div>
<div class="propagated-settings-overlay">
<h4><span class="fa fa-link"></span> {text_inh}</h4>
<p>
{text_expl}
</p>
<button class="btn btn-default" name="decouple" value="{fnames}" data-action="unlink">
<span class="fa fa-unlink"></span> {text_unlink}
</button>
<a class="btn btn-default" href="{url}" target="_blank">
<span class="fa fa-group"></span> {text_orga}
</a>
</div>
</div>
""".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)

View File

@@ -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={

View File

@@ -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;
})
});

View File

@@ -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;
}
}