forked from CGM_Public/pretix_original
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 %}"
|
||||
{% 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 %}
|
||||
|
||||
@@ -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" %}
|
||||
|
||||
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
|
||||
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={
|
||||
|
||||
Reference in New Issue
Block a user