mirror of
https://github.com/pretix/pretix.git
synced 2026-05-09 15:54:03 +00:00
UI for settings propagation
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
<a href="{% url 'control:event.index' organizer=request.event.organizer.slug event=request.event.slug %}"
|
<a href="{% url 'control:event.index' organizer=request.event.organizer.slug event=request.event.slug %}"
|
||||||
{% if url_name == "event.index" %}class="active"{% endif %}>
|
{% if url_name == "event.index" %}class="active"{% endif %}>
|
||||||
<i class="fa fa-dashboard fa-fw"></i>
|
<i class="fa fa-dashboard fa-fw"></i>
|
||||||
{% trans "Dashboard" %}
|
{% trans "Event dashboard" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% if 'can_change_event_settings' in request.eventpermset %}
|
{% if 'can_change_event_settings' in request.eventpermset %}
|
||||||
|
|||||||
@@ -1,18 +1,25 @@
|
|||||||
{% extends "pretixcontrol/event/settings_base.html" %}
|
{% extends "pretixcontrol/event/settings_base.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
|
{% load hierarkey_form %}
|
||||||
{% block inside %}
|
{% block inside %}
|
||||||
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
|
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% bootstrap_form_errors form %}
|
{% bootstrap_form_errors form %}
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>{% trans "Display settings" %}</legend>
|
<legend>{% trans "Event page" %}</legend>
|
||||||
{% bootstrap_field form.primary_color layout="horizontal" %}
|
|
||||||
{% bootstrap_field form.primary_font layout="horizontal" %}
|
|
||||||
{% bootstrap_field form.logo_image layout="horizontal" %}
|
{% bootstrap_field form.logo_image layout="horizontal" %}
|
||||||
{% bootstrap_field form.frontpage_text layout="horizontal" %}
|
{% bootstrap_field form.frontpage_text layout="horizontal" %}
|
||||||
{% bootstrap_field form.show_variations_expanded layout="horizontal" %}
|
{% bootstrap_field form.show_variations_expanded layout="horizontal" %}
|
||||||
</fieldset>
|
</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">
|
<div class="form-group submit-group">
|
||||||
<button type="submit" class="btn btn-primary btn-save">
|
<button type="submit" class="btn btn-primary btn-save">
|
||||||
{% trans "Save" %}
|
{% trans "Save" %}
|
||||||
|
|||||||
68
src/pretix/control/templatetags/hierarkey_form.py
Normal file
68
src/pretix/control/templatetags/hierarkey_form.py
Normal 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)
|
||||||
@@ -328,11 +328,23 @@ class EventSettingsFormView(EventPermissionRequiredMixin, FormView):
|
|||||||
kwargs['obj'] = self.request.event
|
kwargs['obj'] = self.request.event
|
||||||
return kwargs
|
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
|
@transaction.atomic
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
form = self.get_form()
|
form = self.get_form()
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
|
self._save_decoupled(form)
|
||||||
if form.has_changed():
|
if form.has_changed():
|
||||||
self.request.event.log_action(
|
self.request.event.log_action(
|
||||||
'pretix.event.settings', user=self.request.user, data={
|
'pretix.event.settings', user=self.request.user, data={
|
||||||
@@ -394,6 +406,7 @@ class DisplaySettings(EventSettingsViewMixin, EventSettingsFormView):
|
|||||||
form = self.get_form()
|
form = self.get_form()
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
|
self._save_decoupled(form)
|
||||||
if form.has_changed():
|
if form.has_changed():
|
||||||
self.request.event.log_action(
|
self.request.event.log_action(
|
||||||
'pretix.event.settings', user=self.request.user, data={
|
'pretix.event.settings', user=self.request.user, data={
|
||||||
|
|||||||
@@ -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;
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -212,4 +212,31 @@ pre.mail-preview {
|
|||||||
border-top-left-radius: 0;
|
border-top-left-radius: 0;
|
||||||
border-left: 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user