Item-related templates

This commit is contained in:
Raphael Michel
2018-07-08 23:55:26 +02:00
parent 7b230726b0
commit 0daded8af5
34 changed files with 1314 additions and 1021 deletions

View File

@@ -31,7 +31,7 @@
</li> </li>
<li> <li>
<a href="{% url 'control:event.settings.payment' organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url 'control:event.settings.payment' organizer=request.event.organizer.slug event=request.event.slug %}"
{% if "event.settings.payment" == url_name %}class="active"{% endif %}> {% if "event.settings.payment" in url_name %}class="active"{% endif %}>
{% trans "Payment" %} {% trans "Payment" %}
</a> </a>
</li> </li>

View File

@@ -2,81 +2,89 @@
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block content %} {% block content %}
<h1>{% trans "Delete event" %}</h1> <div class="panel panel-default">
{% if request.event.allow_delete %} <div class="panel-heading">
{% bootstrap_form_errors form layout="inline" %} <h2 class="panel-title">{% trans "Delete event" %}</h2>
<p> </div>
{% blocktrans trimmed %} <div class="panel-body">
This operation will destroy your event including all configuration, products, quotas, questions, {% if request.event.allow_delete %}
vouchers, lists, etc. {% bootstrap_form_errors form layout="inline" %}
{% endblocktrans %}
</p>
<p><strong>
{% blocktrans trimmed %}
This operation is irreversible and there is no way to bring your data back.
{% endblocktrans %}
</strong></p>
<form action="" method="post">
{% csrf_token %}
<p> <p>
{% blocktrans trimmed with slug=request.event.slug %} {% blocktrans trimmed %}
To confirm you really want this, please type out the event's short name ("{{ slug }}") here: This operation will destroy your event including all configuration, products, quotas, questions,
vouchers, lists, etc.
{% endblocktrans %} {% endblocktrans %}
</p> </p>
{% bootstrap_field form.slug layout="inline" %} <p><strong>
<p> {% blocktrans trimmed %}
{% blocktrans trimmed with slug=request.event.slug %} This operation is irreversible and there is no way to bring your data back.
Also, to make sure it's really you, please enter your user password here:
{% endblocktrans %} {% endblocktrans %}
</p> </strong></p>
{% bootstrap_field form.user_pw layout="inline" %} <form action="" method="post">
<div class="form-group submit-group">
<button type="submit" class="btn btn-danger btn-save">
{% trans "Delete" %}
</button>
</div>
</form>
{% else %}
<p>
{% trans "Your event can not be deleted as it already contains orders." %}
</p>
<p>
{% blocktrans trimmed %}
pretix does not allow deleting orders once they have been placed in order to be audit-proof and
trustable by financial authorities.
{% endblocktrans %}
</p>
{% if request.event.live %}
<p>
{% trans "You can instead take your shop offline. This will hide it from everyone except from the organizer teams you configured to have access to the event." %}
</p>
<form action="{% url "control:event.live" event=request.event.slug organizer=request.organizer.slug %}"
method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="live" value="false"> <p>
{% blocktrans trimmed with slug=request.event.slug %}
To confirm you really want this, please type out the event's short name ("{{ slug }}") here:
{% endblocktrans %}
</p>
{% bootstrap_field form.slug layout="inline" %}
<p>
{% blocktrans trimmed with slug=request.event.slug %}
Also, to make sure it's really you, please enter your user password here:
{% endblocktrans %}
</p>
{% bootstrap_field form.user_pw layout="inline" %}
<div class="form-group submit-group"> <div class="form-group submit-group">
<a href="{% url "control:event.shredder.start" event=request.event.slug organizer=request.organizer.slug %}" class="btn btn-danger btn-save"> <button type="submit" class="btn btn-danger btn-save">
<span class="fa fa-eraser"></span> {% trans "Delete" %}
{% trans "Delete personal data" %}
</a>
<button type="submit" class="btn btn-primary btn-save">
<span class="fa fa-power-off"></span>
{% trans "Go offline" %}
</button> </button>
</div> </div>
</form> </form>
{% else %} {% else %}
<p> <p>
{% trans "However, since your shop is offline, it is only visible to the organizing team according to the permissions you configured." %} {% trans "Your event can not be deleted as it already contains orders." %}
</p>
<p>
{% blocktrans trimmed %}
pretix does not allow deleting orders once they have been placed in order to be audit-proof and
trustable by financial authorities.
{% endblocktrans %}
</p>
{% if request.event.live %}
<p>
{% trans "You can instead take your shop offline. This will hide it from everyone except from the organizer teams you configured to have access to the event." %}
</p>
<form action="{% url "control:event.live" event=request.event.slug organizer=request.organizer.slug %}"
method="post">
{% csrf_token %}
<input type="hidden" name="live" value="false">
<div class="form-group submit-group">
<a href="{% url "control:event.shredder.start" event=request.event.slug organizer=request.organizer.slug %}"
class="btn btn-danger btn-save">
<span class="fa fa-eraser"></span>
{% trans "Delete personal data" %}
</a>
<button type="submit" class="btn btn-primary btn-save">
<span class="fa fa-power-off"></span>
{% trans "Go offline" %}
</button>
</div>
</form>
{% else %}
<p>
{% trans "However, since your shop is offline, it is only visible to the organizing team according to the permissions you configured." %}
<div class="form-group submit-group"> <div class="form-group submit-group">
<a href="{% url "control:event.shredder.start" event=request.event.slug organizer=request.organizer.slug %}" class="btn btn-danger btn-save"> <a href="{% url "control:event.shredder.start" event=request.event.slug organizer=request.organizer.slug %}"
class="btn btn-danger btn-save">
<span class="fa fa-eraser"></span> <span class="fa fa-eraser"></span>
{% trans "Delete personal data" %} {% trans "Delete personal data" %}
</a> </a>
</div> </div>
</p> </p>
{% endif %}
{% endif %} {% endif %}
{% endif %} </div>
</div>
{% endblock %} {% endblock %}

View File

@@ -5,16 +5,20 @@
{% load staticfiles %} {% load staticfiles %}
{% block title %}{{ request.event.name }}{% endblock %} {% block title %}{{ request.event.name }}{% endblock %}
{% block content %} {% block content %}
<h1> <div class="panel panel-default">
{{ request.event.name }} <div class="panel-body">
<small> <h1>
{% if request.event.has_subevents %} {{ request.event.name }}
{% trans "Event series" %} <small>
{% else %} {% if request.event.has_subevents %}
{{ request.event.get_date_range_display }} {% trans "Event series" %}
{% endif %} {% else %}
</small> {{ request.event.get_date_range_display }}
</h1> {% endif %}
</small>
</h1>
</div>
</div>
{% if actions|length > 0 %} {% if actions|length > 0 %}
<div class="panel panel-danger"> <div class="panel panel-danger">
<div class="panel-heading"> <div class="panel-heading">
@@ -71,7 +75,6 @@
{% endfor %} {% endfor %}
</div> </div>
<p>&nbsp;</p>
<div class="panel panel-default items"> <div class="panel panel-default items">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title"> <h3 class="panel-title">

View File

@@ -5,33 +5,38 @@
<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 class="panel panel-default">
<legend>{% trans "Invoicing" %}</legend> <div class="panel-heading">
{% bootstrap_field form.invoice_address_asked layout="control" %} <legend>{% trans "Invoicing" %}</legend>
{% bootstrap_field form.invoice_address_required layout="control" %} </div>
{% bootstrap_field form.invoice_name_required layout="control" %} <div class="panel-body">
{% bootstrap_field form.invoice_generate layout="control" %} {% bootstrap_field form.invoice_address_asked layout="control" %}
{% bootstrap_field form.invoice_email_attachment layout="control" %} {% bootstrap_field form.invoice_address_required layout="control" %}
{% bootstrap_field form.invoice_address_vatid layout="control" %} {% bootstrap_field form.invoice_name_required layout="control" %}
{% bootstrap_field form.invoice_numbers_consecutive layout="control" %} {% bootstrap_field form.invoice_generate layout="control" %}
{% bootstrap_field form.invoice_numbers_prefix layout="control" %} {% bootstrap_field form.invoice_email_attachment layout="control" %}
{% bootstrap_field form.invoice_renderer layout="control" %} {% bootstrap_field form.invoice_address_vatid layout="control" %}
{% bootstrap_field form.invoice_language layout="control" %} {% bootstrap_field form.invoice_numbers_consecutive layout="control" %}
{% bootstrap_field form.invoice_include_free layout="control" %} {% bootstrap_field form.invoice_numbers_prefix layout="control" %}
{% bootstrap_field form.invoice_attendee_name layout="control" %} {% bootstrap_field form.invoice_renderer layout="control" %}
{% bootstrap_field form.invoice_address_from layout="control" %} {% bootstrap_field form.invoice_language layout="control" %}
{% bootstrap_field form.invoice_introductory_text layout="control" %} {% bootstrap_field form.invoice_include_free layout="control" %}
{% bootstrap_field form.invoice_additional_text layout="control" %} {% bootstrap_field form.invoice_attendee_name layout="control" %}
{% bootstrap_field form.invoice_footer_text layout="control" %} {% bootstrap_field form.invoice_address_from layout="control" %}
{% bootstrap_field form.invoice_logo_image layout="control" %} {% bootstrap_field form.invoice_introductory_text layout="control" %}
{% bootstrap_field form.invoice_additional_text layout="control" %}
{% bootstrap_field form.invoice_footer_text layout="control" %}
{% bootstrap_field form.invoice_logo_image layout="control" %}
<div class="form-group submit-group">
<button type="submit" class="btn btn-default btn-lg" name="preview" value="preview"
formtarget="_blank">
{% trans "Save and show preview" %}
</button>
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</div>
</fieldset> </fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-default btn-lg" name="preview" value="preview" formtarget="_blank">
{% trans "Save and show preview" %}
</button>
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form> </form>
{% endblock %} {% endblock %}

View File

@@ -17,7 +17,7 @@
{% bootstrap_field form.mail_bcc layout="control" %} {% bootstrap_field form.mail_bcc layout="control" %}
</div> </div>
</fieldset> </fieldset>
<div class="panel-group" id="questions_group"> <div class="" id="questions_group">
{% blocktrans asvar title_placed_order %}Placed order{% endblocktrans %} {% blocktrans asvar title_placed_order %}Placed order{% endblocktrans %}
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="order_placed" title=title_placed_order items="mail_text_order_placed" %} {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="order_placed" title=title_placed_order items="mail_text_order_placed" %}

View File

@@ -58,12 +58,12 @@
{% bootstrap_field form.payment_term_expire_automatically layout="control" %} {% bootstrap_field form.payment_term_expire_automatically layout="control" %}
{% bootstrap_field form.payment_term_accept_late layout="control" %} {% bootstrap_field form.payment_term_accept_late layout="control" %}
{% bootstrap_field form.tax_rate_default layout="control" %} {% bootstrap_field form.tax_rate_default layout="control" %}
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</div> </div>
</fieldset> </fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form> </form>
{% endblock %} {% endblock %}

View File

@@ -4,30 +4,37 @@
{% block inside %} {% block inside %}
<form action="" method="post" class="form-horizontal form-plugins"> <form action="" method="post" class="form-horizontal form-plugins">
{% csrf_token %} {% csrf_token %}
<fieldset> <p>
<legend> <a href="{% url 'control:event.settings.payment' event=request.event.slug organizer=request.organizer.slug %}"
<a href="{% url 'control:event.settings.payment' event=request.event.slug organizer=request.organizer.slug %}" class="btn btn-default">
class="btn btn-default btn-sm btn-link"> <span class="fa fa-caret-left"></span>
<span class="fa fa-caret-left"></span> {% trans "Back" %}
{% trans "Back" %} </a>
</a> </p>
{% trans "Payment provider:" %} {{ provider.verbose_name }} <fieldset class="panel panel-default">
</legend> <div class="panel-heading">
{% bootstrap_form form layout='control' %} <legend>
{% if settings_content %}{{ settings_content|safe }}{% endif %} {% trans "Payment provider:" %} {{ provider.verbose_name }}
<p>&nbsp;</p> </legend>
<div class="alert alert-legal"> </div>
<strong>{% trans "Warning:" %}</strong> <div class="panel-body">
{% blocktrans trimmed %} {% bootstrap_form form layout='control' %}
Please note that EU Directive 2015/2366 bans surcharging payment fees for most common payment {% if settings_content %}{{ settings_content|safe }}{% endif %}
methods within the European Union. If in doubt, consult a lawyer or refrain from charging payment <p>&nbsp;</p>
fees. <div class="alert alert-legal">
{% endblocktrans %} <strong>{% trans "Warning:" %}</strong>
<br> {% blocktrans trimmed %}
{% blocktrans trimmed %} Please note that EU Directive 2015/2366 bans surcharging payment fees for most common payment
In simple terms, this means you need to pay any fees imposed by the payment providers and cannot methods within the European Union. If in doubt, consult a lawyer or refrain from charging
pass it on to your customers. payment
{% endblocktrans %} fees.
{% endblocktrans %}
<br>
{% blocktrans trimmed %}
In simple terms, this means you need to pay any fees imposed by the payment providers and cannot
pass it on to your customers.
{% endblocktrans %}
</div>
</div> </div>
</fieldset> </fieldset>
<div class="form-group submit-group"> <div class="form-group submit-group">

View File

@@ -3,24 +3,33 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Delete tax rule" %}{% endblock %} {% block title %}{% trans "Delete tax rule" %}{% endblock %}
{% block inside %} {% block inside %}
<legend>{% trans "Delete tax rule" %}</legend>
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} <div class="panel panel-default">
{% if possible %} <div class="panel-heading">
<p>{% blocktrans %}Are you sure you want to delete the tax rule <strong>{{ taxrule }}</strong>?{% endblocktrans %}</p> <legend>{% trans "Delete tax rule" %}</legend>
{% else %} </div>
<p>{% blocktrans %}You cannot delete a tax rule that is in use for a product or has been in use for any existing orders.{% endblocktrans %}</p> <div class="panel-body">
{% endif %} {% csrf_token %}
<div class="form-group submit-group"> {% if possible %}
<a href="{% url "control:event.settings.tax" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn <p>{% blocktrans %}Are you sure you want to delete the tax rule <strong>{{ taxrule }}</strong>
?{% endblocktrans %}</p>
{% else %}
<p>{% blocktrans %}You cannot delete a tax rule that is in use for a product or has been in use for
any existing orders.{% endblocktrans %}</p>
{% endif %}
<div class="form-group submit-group">
<a href="{% url "control:event.settings.tax" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn
btn-default btn-cancel"> btn-default btn-cancel">
{% trans "Cancel" %} {% trans "Cancel" %}
</a> </a>
{% if possible %} {% if possible %}
<button type="submit" class="btn btn-danger btn-save"> <button type="submit" class="btn btn-danger btn-save">
{% trans "Delete" %} {% trans "Delete" %}
</button> </button>
{% endif %} {% endif %}
</div>
</div>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

View File

@@ -10,19 +10,25 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block inside %} {% block inside %}
{% if rule %}
<legend>{% blocktrans with name=rule.name %}Tax rule: {{ name }}{% endblocktrans %}</legend>
{% else %}
<legend>{% trans "Tax rule" %}</legend>
{% endif %}
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} <div class="panel panel-default">
{% bootstrap_form_errors form %} <div class="panel-heading">
{% bootstrap_field form.name layout="control" %} {% if rule %}
{% bootstrap_field form.rate addon_after="%" layout="control" %} <legend>{% blocktrans with name=rule.name %}Tax rule: {{ name }}{% endblocktrans %}</legend>
{% else %}
<legend>{% trans "Tax rule" %}</legend>
{% endif %}
</div>
{% csrf_token %}
<div class="panel-body">
{% bootstrap_form_errors form %}
{% bootstrap_field form.name layout="control" %}
{% bootstrap_field form.rate addon_after="%" layout="control" %}
</div>
</div>
<details class="panel panel-default" <details class="panel panel-default"
{% if rule.eu_reverse_charge or rule.has_custom_rules or form.errors %}open{% endif %}> {% if rule.eu_reverse_charge or rule.has_custom_rules or form.errors %}open{% endif %}>
<summary class="panel-heading"> <summary class="panel-heading">
<h4 class="panel-title"> <h4 class="panel-title">
<strong>{% trans "Advanced settings" %}</strong> <strong>{% trans "Advanced settings" %}</strong>
@@ -31,7 +37,6 @@
</summary> </summary>
<div id="advanced"> <div id="advanced">
<div class="panel-body"> <div class="panel-body">
<legend>{% trans "Advanced settings" %}</legend>
<div class="alert alert-legal"> <div class="alert alert-legal">
{% blocktrans trimmed with docs="https://docs.pretix.eu/en/latest/user/events/taxes.html" %} {% blocktrans trimmed with docs="https://docs.pretix.eu/en/latest/user/events/taxes.html" %}
These settings are intended for advanced users. See the These settings are intended for advanced users. See the
@@ -47,8 +52,10 @@
<div class="alert alert-warning"> <div class="alert alert-warning">
{% blocktrans trimmed %} {% blocktrans trimmed %}
These settings are intended for professional users with very specific taxation situations. These settings are intended for professional users with very specific taxation situations.
If you create any rule here, the reverse charge settings above will be ignored. The rules will be If you create any rule here, the reverse charge settings above will be ignored. The rules
checked in order and once the first rule matches the order, it will be used and all further rules will will be
checked in order and once the first rule matches the order, it will be used and all further
rules will
be ignored. If no rule matches, tax will be charged. be ignored. If no rule matches, tax will be charged.
{% endblocktrans %} {% endblocktrans %}
{% trans "All of these rules will only apply if an invoice address is set." %} {% trans "All of these rules will only apply if an invoice address is set." %}

View File

@@ -2,50 +2,60 @@
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Tax rules" %}{% endblock %} {% block title %}{% trans "Tax rules" %}{% endblock %}
{% block inside %} {% block inside %}
<legend>{% trans "Tax rules" %}</legend> <div class="panel panel-default">
{% if taxrules|length == 0 %} <div class="panel-heading">
<div class="empty-collection"> <legend>{% trans "Tax rules" %}</legend>
<p> </div>
{% blocktrans trimmed %} {% if taxrules|length == 0 %}
You haven't created any tax rules yet. <div class="panel-body empty-collection">
{% endblocktrans %} <p>
</p> {% blocktrans trimmed %}
You haven't created any tax rules yet.
{% endblocktrans %}
</p>
<a href="{% url "control:event.settings.tax.add" organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url "control:event.settings.tax.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new tax rule" %}</a> class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new tax rule" %}</a>
</div> </div>
{% else %} {% else %}
<p> <div class="panel-body">
<a href="{% url "control:event.settings.tax.add" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new tax rule" %} <a href="{% url "control:event.settings.tax.add" organizer=request.event.organizer.slug event=request.event.slug %}"
</a> class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new tax rule" %}
</p> </a>
<div class="table-responsive"> </div>
<table class="table table-hover table-quotas"> <div class="table-responsive">
<thead> <table class="table table-hover table-quotas">
<tr> <thead>
<th>{% trans "Name" %}</th>
<th>{% trans "Rate" %}</th>
<th class="action-col-2"></th>
</tr>
</thead>
<tbody>
{% for tr in taxrules %}
<tr> <tr>
<td> <th>{% trans "Name" %}</th>
<strong><a href="{% url "control:event.settings.tax.edit" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}"> <th>{% trans "Rate" %}</th>
{{ tr.name }} <th class="action-col-2"></th>
</a></strong>
</td>
<td>{{ tr.rate }} %</td>
<td class="text-right">
<a href="{% url "control:event.settings.tax.edit" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.settings.tax.delete" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr> </tr>
{% endfor %} </thead>
</tbody> <tbody>
</table> {% for tr in taxrules %}
</div> <tr>
{% endif %} <td>
{% include "pretixcontrol/pagination.html" %} <strong><a
href="{% url "control:event.settings.tax.edit" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}">
{{ tr.name }}
</a></strong>
</td>
<td>{{ tr.rate }} %</td>
<td class="text-right">
<a href="{% url "control:event.settings.tax.edit" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}"
class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.settings.tax.delete" organizer=request.event.organizer.slug event=request.event.slug rule=tr.id %}"
class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-body">
{% include "pretixcontrol/pagination.html" %}
</div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@@ -5,47 +5,55 @@
{% load eventurl %} {% load eventurl %}
{% load eventsignal %} {% load eventsignal %}
{% block inside %} {% block inside %}
<legend>{% trans "Widget" %}</legend> <fieldset class="panel panel-default">
<p> <div class="panel-heading">
{% blocktrans trimmed %} <legend>{% trans "Widget" %}</legend>
The pretix widget is a way to embed your ticket shop into your event website. This way, your visitors can </div>
buy their ticket right away without leaving your website. <div class="panel-body">
{% endblocktrans %} <p>
</p> {% blocktrans trimmed %}
{% if valid %} The pretix widget is a way to embed your ticket shop into your event website. This way, your
<p> visitors can
{% blocktrans trimmed %} buy their ticket right away without leaving your website.
To embed the widget onto your website, simply copy the following code to the <code>&lt;head&gt;</code> {% endblocktrans %}
section of your website: </p>
{% endblocktrans %} {% if valid %}
</p> <p>
<pre>&lt;link rel="stylesheet" type="text/css" href="{% abseventurl request.event "presale:event.widget.css" %}"&gt; {% blocktrans trimmed %}
To embed the widget onto your website, simply copy the following code to the
<code>&lt;head&gt;</code>
section of your website:
{% endblocktrans %}
</p>
<pre>&lt;link rel="stylesheet" type="text/css" href="{% abseventurl request.event "presale:event.widget.css" %}"&gt;
&lt;script type="text/javascript" src="{{ urlprefix }}{% url "presale:widget.js" lang=form.cleaned_data.language %}" async&gt;&lt;/script&gt;</pre> &lt;script type="text/javascript" src="{{ urlprefix }}{% url "presale:widget.js" lang=form.cleaned_data.language %}" async&gt;&lt;/script&gt;</pre>
<p> <p>
{% blocktrans trimmed %} {% blocktrans trimmed %}
Then, copy the following code to the place of your website where you want the widget to show up: Then, copy the following code to the place of your website where you want the widget to show up:
{% endblocktrans %} {% endblocktrans %}
</p> </p>
{% if form.cleaned_data.subevent %} {% if form.cleaned_data.subevent %}
{% abseventurl request.event "presale:event.index" subevent=form.cleaned_data.subevent.pk as indexurl %} {% abseventurl request.event "presale:event.index" subevent=form.cleaned_data.subevent.pk as indexurl %}
{% else %} {% else %}
{% abseventurl request.event "presale:event.index" as indexurl %} {% abseventurl request.event "presale:event.index" as indexurl %}
{% endif %} {% endif %}
{% if form.cleaned_data.compatibility_mode %} {% if form.cleaned_data.compatibility_mode %}
<pre>&lt;div class="pretix-widget-compat" event="{% abseventurl request.event "presale:event.index" %}"{% if form.cleaned_data.subevent %} subevent="{{ form.cleaned_data.subevent.pk }}"{% endif %}{% if form.cleaned_data.voucher %} voucher="{{ form.cleaned_data.voucher }}"{% endif %}&gt;&lt;/div&gt; <pre>&lt;div class="pretix-widget-compat" event="{% abseventurl request.event "presale:event.index" %}"
{% if form.cleaned_data.subevent %} subevent="{{ form.cleaned_data.subevent.pk }}"{% endif %}
{% if form.cleaned_data.voucher %} voucher="{{ form.cleaned_data.voucher }}"{% endif %}&gt;&lt;/div&gt;
&lt;noscript&gt; &lt;noscript&gt;
&lt;div class="pretix-widget"&gt; &lt;div class="pretix-widget"&gt;
&lt;div class="pretix-widget-info-message"&gt; &lt;div class="pretix-widget-info-message"&gt;
{% blocktrans trimmed with a_attr='target="_blank" rel="noopener" href="'|add:indexurl|add:'"'|safe %} {% blocktrans trimmed with a_attr='target="_blank" rel="noopener" href="'|add:indexurl|add:'"'|safe %}
JavaScript is disabled in your browser. To access our ticket shop without JavaScript, JavaScript is disabled in your browser. To access our ticket shop without JavaScript,
please &lt;a {{ a_attr }}&gt;click here&lt;/a&gt;. please &lt;a {{ a_attr }}&gt;click here&lt;/a&gt;.
{% endblocktrans %} {% endblocktrans %}
&lt;/div&gt; &lt;/div&gt;
&lt;/div&gt; &lt;/div&gt;
&lt;/noscript&gt; &lt;/noscript&gt;
</pre> </pre>
{% else %} {% else %}
<pre>&lt;pretix-widget event="{% abseventurl request.event "presale:event.index" %}"{% if form.cleaned_data.subevent %} subevent="{{ form.cleaned_data.subevent.pk }}"{% endif %}{% if form.cleaned_data.voucher %} voucher="{{ form.cleaned_data.voucher }}"{% endif %}&gt;&lt;/pretix-widget&gt; <pre>&lt;pretix-widget event="{% abseventurl request.event "presale:event.index" %}" {% if form.cleaned_data.subevent %} subevent="{{ form.cleaned_data.subevent.pk }}"{% endif %} {% if form.cleaned_data.voucher %} voucher="{{ form.cleaned_data.voucher }}"{% endif %}&gt;&lt;/pretix-widget&gt;
&lt;noscript&gt; &lt;noscript&gt;
&lt;div class="pretix-widget"&gt; &lt;div class="pretix-widget"&gt;
&lt;div class="pretix-widget-info-message"&gt; &lt;div class="pretix-widget-info-message"&gt;
@@ -57,30 +65,32 @@
&lt;/div&gt; &lt;/div&gt;
&lt;/noscript&gt; &lt;/noscript&gt;
</pre> </pre>
{% endif %}
<p>
<a href="https://docs.pretix.eu/en/latest/user/events/widget.html" target="_blank" rel="noopener">
<span class="fa fa-question-circle"></span>
{% trans "Read our documentation for more information" %}
</a>
</p>
{% else %}
<p>
{% blocktrans trimmed %}
Using this form, you can generate a code to copy and paste to your website source.
{% endblocktrans %}
</p>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form form layout="control" %}
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Generate widget code" %}
</button>
</div>
</div>
</form>
{% endif %} {% endif %}
<p> </div>
<a href="https://docs.pretix.eu/en/latest/user/events/widget.html" target="_blank" rel="noopener"> </fieldset>
<span class="fa fa-question-circle"></span> {% eventsignal request.event "pretix.control.signals.event_settings_widget" request=request %}
{% trans "Read our documentation for more information" %}
</a>
</p>
{% else %}
<p>
{% blocktrans trimmed %}
Using this form, you can generate a code to copy and paste to your website source.
{% endblocktrans %}
</p>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form form layout="control" %}
<div class="form-group">
<div class="col-md-offset-3 col-md-9">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Generate widget code" %}
</button>
</div>
</div>
</form>
{% endif %}
{% eventsignal request.event "pretix.control.signals.event_settings_widget" request=request %}
{% endblock %} {% endblock %}

View File

@@ -3,17 +3,21 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% load formset_tags %} {% load formset_tags %}
{% block inside %} {% block inside %}
<p> <div class="panel panel-default">
{% blocktrans trimmed %} <div class="panel-body">
With add-ons, you can specify products that can be bought as an addition to this product. For example, if {% blocktrans trimmed %}
you host a conference with a base conference ticket and a number of workshops, you could define the With add-ons, you can specify products that can be bought as an addition to this product. For example,
workshops as add-ons to the conference ticket. With this configuration, the workshops cannot be bought if
on their own but only in combination with a conference ticket. You can here specify categories of products you host a conference with a base conference ticket and a number of workshops, you could define the
that can be used as add-ons to this product. You can also specify the minimum and maximum number of workshops as add-ons to the conference ticket. With this configuration, the workshops cannot be bought
add-ons of the given category that can or need to be chosen. The user can buy every add-on from the on their own but only in combination with a conference ticket. You can here specify categories of
category at most once. If an add-on product has multiple variations, only one of them can be bought. products
{% endblocktrans %} that can be used as add-ons to this product. You can also specify the minimum and maximum number of
</p> add-ons of the given category that can or need to be chosen. The user can buy every add-on from the
category at most once. If an add-on product has multiple variations, only one of them can be bought.
{% endblocktrans %}
</div>
</div>
<form class="form-horizontal branches" method="post" action=""> <form class="form-horizontal branches" method="post" action="">
{% csrf_token %} {% csrf_token %}
<div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}"> <div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}">

View File

@@ -3,34 +3,35 @@
{% block title %}{{ object.name }} :: {% trans "Product" %}{% endblock %} {% block title %}{{ object.name }} :: {% trans "Product" %}{% endblock %}
{% block content %} {% block content %}
{% if object.id %} {% if object.id %}
<h1>{% trans "Modify product:" %} {{ object.name }}</h1> <div class="panel panel-default">
<ul class="nav nav-pills"> <div class="panel-heading">
<li {% if "event.item" == url_name %}class="active"{% endif %}> <h1 class="panel-title">{% trans "Modify product:" %} {{ object.name }}</h1>
<a href="{% url 'control:event.item' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}"> </div>
{% trans "General information" %} <div class="panel-body">
</a> <ul class="nav nav-pills">
</li> <li {% if "event.item" == url_name %}class="active"{% endif %}>
{% if object.has_variations %} <a href="{% url 'control:event.item' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}">
<li {% if "event.item.variations" == url_name %}class="active"{% endif %}> {% trans "General information" %}
<a href="{% url 'control:event.item.variations' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}"> </a>
{% trans "Variations" %} </li>
</a> {% if object.has_variations %}
</li> <li {% if "event.item.variations" == url_name %}class="active"{% endif %}>
{% endif %} <a href="{% url 'control:event.item.variations' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}">
<li {% if "event.item.addons" == url_name %}class="active"{% endif %}> {% trans "Variations" %}
<a href="{% url 'control:event.item.addons' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}"> </a>
{% trans "Add-Ons" %} </li>
</a> {% endif %}
</li> <li {% if "event.item.addons" == url_name %}class="active"{% endif %}>
</ul> <a href="{% url 'control:event.item.addons' organizer=request.event.organizer.slug event=request.event.slug item=object.id %}">
{% else %} {% trans "Add-Ons" %}
<h1>{% trans "Create product" %}</h1> </a>
<p>{% blocktrans trimmed %} </li>
You will be able to adjust further settings in the next step. </ul>
{% endblocktrans %}</p> </div>
</div>
{% endif %} {% endif %}
{% if object.id and not object.quotas.exists %} {% if object.id and not object.quotas.exists %}
<div class="alert alert-warning"> <div class="alert 1alert-warning">
{% blocktrans trimmed %} {% blocktrans trimmed %}
Please note that your product will <strong>not</strong> be available for sale until you have added your Please note that your product will <strong>not</strong> be available for sale until you have added your
item to an existing or newly created quota. item to an existing or newly created quota.

View File

@@ -1,40 +1,55 @@
{% extends "pretixcontrol/item/base.html" %} {% extends "pretixcontrol/item/base.html" %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block inside %}
{% load static %} {% load static %}
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/hidequota.js" %}"></script> {% block inside %}
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/hidequota.js" %}"></script>
<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 %}
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "General information" %}</legend> <div class="panel-heading">
{% bootstrap_field form.name layout="control" %} <legend>{% trans "General information" %}</legend>
<div class="internal-name-wrapper"> </div>
{% bootstrap_field form.internal_name layout="control" %} <div class="panel-body">
<p>{% blocktrans trimmed %}
You will be able to adjust further settings in the next step.
{% endblocktrans %}</p>
{% bootstrap_field form.name layout="control" %}
<div class="internal-name-wrapper">
{% bootstrap_field form.internal_name layout="control" %}
</div>
{% bootstrap_field form.copy_from layout="control" %}
{% bootstrap_field form.has_variations layout="control" %}
{% bootstrap_field form.category layout="control" %}
{% bootstrap_field form.admission layout="control" %}
</div> </div>
{% bootstrap_field form.copy_from layout="control" %}
{% bootstrap_field form.has_variations layout="control" %}
{% bootstrap_field form.category layout="control" %}
{% bootstrap_field form.admission layout="control" %}
</fieldset> </fieldset>
{% if form.quota_option %} {% if form.quota_option %}
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Quota settings" %}</legend> <div class="panel-heading">
{% bootstrap_field form.quota_option layout="control" %} <legend>{% trans "Quota settings" %}</legend>
<div id="existing-quota-group">
{% bootstrap_field form.quota_add_existing layout="control" %}
</div> </div>
<div id="new-quota-group"> <div class="panel-body">
{% bootstrap_field form.quota_add_new_name layout="control" %} {% bootstrap_field form.quota_option layout="control" %}
{% bootstrap_field form.quota_add_new_size layout="control" %} <div id="existing-quota-group">
{% bootstrap_field form.quota_add_existing layout="control" %}
</div>
<div id="new-quota-group">
{% bootstrap_field form.quota_add_new_name layout="control" %}
{% bootstrap_field form.quota_add_new_size layout="control" %}
</div>
</div> </div>
</fieldset> </fieldset>
{% endif %} {% endif %}
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Price settings" %}</legend> <div class="panel-heading">
{% bootstrap_field form.default_price layout="control" %} <legend>{% trans "Price settings" %}</legend>
{% bootstrap_field form.tax_rule layout="control" %} </div>
<div class="panel-body">
{% bootstrap_field form.default_price layout="control" %}
{% bootstrap_field form.tax_rule layout="control" %}
</div>
</fieldset> </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">

View File

@@ -6,45 +6,70 @@
{% csrf_token %} {% csrf_token %}
<div class="row"> <div class="row">
<div class="col-xs-12 col-lg-10"> <div class="col-xs-12 col-lg-10">
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "General information" %}</legend> <div class="panel-heading">
{% bootstrap_field form.name layout="control" %} <legend>{% trans "General information" %}</legend>
<div class="internal-name-wrapper"> </div>
{% bootstrap_field form.internal_name layout="control" %} <div class="panel-body">
{% bootstrap_field form.name layout="control" %}
<div class="internal-name-wrapper">
{% bootstrap_field form.internal_name layout="control" %}
</div>
{% bootstrap_field form.active layout="control" %}
{% bootstrap_field form.category layout="control" %}
{% bootstrap_field form.admission layout="control" %}
{% bootstrap_field form.description layout="control" %}
{% bootstrap_field form.picture layout="control" %}
</div> </div>
{% bootstrap_field form.active layout="control" %}
{% bootstrap_field form.category layout="control" %}
{% bootstrap_field form.admission layout="control" %}
{% bootstrap_field form.description layout="control" %}
{% bootstrap_field form.picture layout="control" %}
</fieldset> </fieldset>
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Price settings" %}</legend> <div class="panel-heading">
{% bootstrap_field form.default_price addon_after=request.event.currency layout="control" %} <legend>{% trans "Price settings" %}</legend>
{% bootstrap_field form.tax_rule layout="control" %} </div>
{% bootstrap_field form.free_price layout="control" %} <div class="panel-body">
{% bootstrap_field form.default_price addon_after=request.event.currency layout="control" %}
{% bootstrap_field form.tax_rule layout="control" %}
{% bootstrap_field form.free_price layout="control" %}
</div>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Availability" %}</legend> <div class="panel-heading">
{% bootstrap_field form.available_from layout="control" %} <legend>{% trans "Availability" %}</legend>
{% bootstrap_field form.available_until layout="control" %} </div>
{% bootstrap_field form.max_per_order layout="control" %} <div class="panel-body">
{% bootstrap_field form.min_per_order layout="control" %} {% bootstrap_field form.available_from layout="control" %}
{% bootstrap_field form.require_voucher layout="control" %} {% bootstrap_field form.available_until layout="control" %}
{% bootstrap_field form.hide_without_voucher layout="control" %} {% bootstrap_field form.max_per_order layout="control" %}
{% bootstrap_field form.allow_cancel layout="control" %} {% bootstrap_field form.min_per_order layout="control" %}
{% bootstrap_field form.require_voucher layout="control" %}
{% bootstrap_field form.hide_without_voucher layout="control" %}
{% bootstrap_field form.allow_cancel layout="control" %}
</div>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Check-in" %}</legend> <div class="panel-heading">
{% bootstrap_field form.checkin_attention layout="control" %} <legend>{% trans "Check-in" %}</legend>
</div>
<div class="panel-body">
{% bootstrap_field form.checkin_attention layout="control" %}
</div>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Additional settings" %}</legend> <div class="panel-heading">
{% bootstrap_field form.original_price addon_after=request.event.currency layout="control" %} <legend>{% trans "Additional settings" %}</legend>
{% for f in plugin_forms %} </div>
{% bootstrap_form f layout="control" %} <div class="panel-body">
{% endfor %} {% bootstrap_field form.original_price addon_after=request.event.currency layout="control" %}
{% for f in plugin_forms %}
{% bootstrap_form f layout="control" %}
{% endfor %}
</div>
</fieldset> </fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</div> </div>
<div class="col-xs-12 col-lg-2"> <div class="col-xs-12 col-lg-2">
<div class="panel panel-default"> <div class="panel panel-default">
@@ -57,10 +82,5 @@
</div> </div>
</div> </div>
</div> </div>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form> </form>
{% endblock %} {% endblock %}

View File

@@ -2,56 +2,65 @@
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Product categories" %}{% endblock %} {% block title %}{% trans "Product categories" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Product categories" %}</h1> <div class="panel panel-default">
<p> <div class="panel-heading">
{% blocktrans trimmed %} <h1 class="panel-title">{% trans "Product categories" %}</h1>
You can use categories to group multiple products together in an organized way. </div>
{% endblocktrans %} {% if categories|length == 0 %}
</p> <div class="empty-collection panel-body">
{% if categories|length == 0 %} <p>
<div class="empty-collection"> {% blocktrans trimmed %}
<p> You haven't created any categories yet.
{% blocktrans trimmed %} {% endblocktrans %}
You haven't created any categories yet. </p>
{% endblocktrans %}
</p>
<a href="{% url "control:event.items.categories.add" organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url "control:event.items.categories.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new category" %}</a> class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new category" %}</a>
</div> </div>
{% else %} {% else %}
<p> <div class="panel-body">
<a href="{% url "control:event.items.categories.add" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new category" %} <a href="{% url "control:event.items.categories.add" organizer=request.event.organizer.slug event=request.event.slug %}"
</a> class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new category" %}
</p> </a>
<div class="table-responsive"> </div>
<table class="table table-hover"> <div class="table-responsive">
<thead> <table class="table table-hover">
<tr> <thead>
<th>{% trans "Product categories" %}</th>
<th class="action-col-2"></th>
<th class="action-col-2"></th>
</tr>
</thead>
<tbody>
{% for c in categories %}
<tr> <tr>
<td> <th>{% trans "Product categories" %}</th>
<strong><a href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}">{{ c.name }}</a></strong> <th class="action-col-2"></th>
</td> <th class="action-col-2"></th>
<td>
<a href="{% url "control:event.items.categories.up" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-up"></i></a>
<a href="{% url "control:event.items.categories.down" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-down"></i></a>
</td>
<td class="text-right">
<a href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.categories.delete" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr> </tr>
{% endfor %} </thead>
</tbody> <tbody>
</table> {% for c in categories %}
</div> <tr>
{% include "pretixcontrol/pagination.html" %} <td>
{% endif %} <strong><a
href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}">{{ c.name }}</a></strong>
</td>
<td>
<a href="{% url "control:event.items.categories.up" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}"
class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i
class="fa fa-arrow-up"></i></a>
<a href="{% url "control:event.items.categories.down" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}"
class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i
class="fa fa-arrow-down"></i></a>
</td>
<td class="text-right">
<a href="{% url "control:event.items.categories.edit" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}"
class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.categories.delete" organizer=request.event.organizer.slug event=request.event.slug category=c.id %}"
class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-footer">
{% include "pretixcontrol/pagination.html" %}
</div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@@ -3,20 +3,28 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Product category" %}{% endblock %} {% block title %}{% trans "Product category" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Product category" %}</h1> <form action="" method="post" class="form-horizontal">
<form action="" method="post" class="form-horizontal"> {% csrf_token %}
{% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
<div class="row"> <div class="row">
<div class="col-xs-12{% if category %} col-lg-10{% endif %}"> <div class="col-xs-12{% if category %} col-lg-10{% endif %}">
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "General information" %}</legend> <div class="panel-heading">
{% bootstrap_field form.name layout="control" %} <legend>{% trans "Product category" %}</legend>
<div class="internal-name-wrapper"> </div>
{% bootstrap_field form.internal_name layout="control" %} <div class="panel-body">
{% bootstrap_field form.name layout="control" %}
<div class="internal-name-wrapper">
{% bootstrap_field form.internal_name layout="control" %}
</div>
{% bootstrap_field form.description layout="control" %}
{% bootstrap_field form.is_addon layout="control" %}
</div>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div> </div>
{% bootstrap_field form.description layout="control" %}
{% bootstrap_field form.is_addon layout="control" %}
</fieldset> </fieldset>
</div> </div>
{% if category %} {% if category %}
@@ -32,10 +40,5 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="form-group submit-group"> </form>
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %} {% endblock %}

View File

@@ -3,19 +3,26 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Delete product category" %}{% endblock %} {% block title %}{% trans "Delete product category" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Delete product category" %}</h1> <div class="panel panel-default">
<form action="" method="post" class="form-horizontal"> <div class="panel-heading">
{% csrf_token %} <h1 class="panel-title">{% trans "Delete product category" %}</h1>
<p>{% blocktrans trimmed with name=category.name %} </div>
Are you sure you want to delete the category <strong>{{ name }}</strong>? <div class="panel-body">
{% endblocktrans %}</p> <form action="" method="post" class="form-horizontal">
<div class="form-group submit-group"> {% csrf_token %}
<a href="{% url "control:event.items.categories" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default btn-cancel"> <p>{% blocktrans trimmed with name=category.name %}
{% trans "Cancel" %} Are you sure you want to delete the category <strong>{{ name }}</strong>?
</a> {% endblocktrans %}</p>
<button type="submit" class="btn btn-danger btn-save"> <div class="form-group submit-group">
{% trans "Delete" %} <a href="{% url "control:event.items.categories" organizer=request.event.organizer.slug event=request.event.slug %}"
</button> class="btn btn-default btn-cancel">
</div> {% trans "Cancel" %}
</form> </a>
<button type="submit" class="btn btn-danger btn-save">
{% trans "Delete" %}
</button>
</div>
</form>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -2,94 +2,101 @@
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Products" %}{% endblock %} {% block title %}{% trans "Products" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Products" %}</h1> <div class="panel panel-default">
<p> <div class="panel-heading">
{% blocktrans trimmed %} <h1 class="panel-title">{% trans "Products" %}</h1>
Below, you find a list of all available products. You can click on a product name to inspect and change </div>
product details. You can also use the buttons on the right to change the order of products within a {% if items|length == 0 %}
give category. <div class="empty-collection panel-body">
{% endblocktrans %} <p>
</p> {% blocktrans trimmed %}
{% if items|length == 0 %} You haven't created any products yet.
<div class="empty-collection"> {% endblocktrans %}
<p> </p>
{% blocktrans trimmed %}
You haven't created any products yet.
{% endblocktrans %}
</p>
<a href="{% url "control:event.items.add" organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url "control:event.items.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new product" %}</a> class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new product" %}</a>
</div> </div>
{% else %} {% else %}
<p> <div class="panel-body">
<a href="{% url "control:event.items.add" organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url "control:event.items.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new product" %}</a> class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new product" %}</a>
</p> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-condensed table-hover"> <table class="table table-condensed table-hover">
<thead> <thead>
<tr> <tr>
<th>{% trans "Product name" %}</th> <th>{% trans "Product name" %}</th>
<th class="iconcol"></th> <th class="iconcol"></th>
<th class="iconcol"></th> <th class="iconcol"></th>
<th class="iconcol"></th> <th class="iconcol"></th>
<th class="iconcol"></th> <th class="iconcol"></th>
<th>{% trans "Category" %}</th> <th>{% trans "Category" %}</th>
<th class="action-col-2"></th> <th class="action-col-2"></th>
<th class="action-col-2"></th> <th class="action-col-2"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% regroup items by category as cat_list %} {% regroup items by category as cat_list %}
{% for c in cat_list %} {% for c in cat_list %}
{% for i in c.list %} {% for i in c.list %}
<tr> <tr>
<td><strong> <td><strong>
{% if not i.active %}<strike>{% endif %} {% if not i.active %}<strike>{% endif %}
<a href=" <a href="
{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}">{{ i }}</a> {% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}">{{ i }}</a>
{% if not i.active %}</strike>{% endif %} {% if not i.active %}</strike>{% endif %}
</strong> </strong>
</td> </td>
<td> <td>
{% if i.available_from or i.available_until %} {% if i.available_from or i.available_until %}
<span class="fa fa-clock-o fa-fw text-muted" data-toggle="tooltip" title="{% trans "Only available in a limited timeframe" %}"> <span class="fa fa-clock-o fa-fw text-muted" data-toggle="tooltip"
title="{% trans "Only available in a limited timeframe" %}">
</span> </span>
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if i.admission %} {% if i.admission %}
<span class="fa fa-user fa-fw text-muted" data-toggle="tooltip" title="{% trans "Admission ticket" %}"></span> <span class="fa fa-user fa-fw text-muted" data-toggle="tooltip"
{% endif %} title="{% trans "Admission ticket" %}"></span>
</td> {% endif %}
<td> </td>
{% if i.var_count %} <td>
<span class="fa fa-list-ul fa-fw text-muted" data-toggle="tooltip" title="{% trans "Product with variations" %}"></span> {% if i.var_count %}
{% endif %} <span class="fa fa-list-ul fa-fw text-muted" data-toggle="tooltip"
</td> title="{% trans "Product with variations" %}"></span>
<td> {% endif %}
{% if i.hide_without_voucher %} </td>
<span class="fa fa-ticket fa-fw text-muted" data-toggle="tooltip" title="{% trans "Only visible with a voucher" %}"></span> <td>
{% elif i.require_voucher %} {% if i.hide_without_voucher %}
<span class="fa fa-ticket fa-fw text-muted" data-toggle="tooltip" title="{% trans "Can only bought using a voucher" %}"></span> <span class="fa fa-ticket fa-fw text-muted" data-toggle="tooltip"
{% endif %} title="{% trans "Only visible with a voucher" %}"></span>
</td> {% elif i.require_voucher %}
<td>{% if i.category %}{{ i.category.name }}{% endif %}</td> <span class="fa fa-ticket fa-fw text-muted" data-toggle="tooltip"
<td> title="{% trans "Can only bought using a voucher" %}"></span>
<a href="{% url "control:event.items.up" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}" class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-up"></i></a> {% endif %}
<a href="{% url "control:event.items.down" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}" class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-down"></i></a> </td>
</td> <td>{% if i.category %}{{ i.category.name }}{% endif %}</td>
<td class="text-right"> <td>
<a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a> <a href="{% url "control:event.items.up" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}"
<a href="{% url "control:event.items.delete" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a> class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i
</td> class="fa fa-arrow-up"></i></a>
</tr> <a href="{% url "control:event.items.down" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}"
class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i
class="fa fa-arrow-down"></i></a>
</td>
<td class="text-right">
<a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}"
class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.delete" organizer=request.event.organizer.slug event=request.event.slug item=i.id %}"
class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr>
{% endfor %}
{% endfor %} {% endfor %}
{% endfor %} </tbody>
</tbody> </table>
</table> </div>
</div> {% endif %}
{% include "pretixcontrol/pagination.html" %} </div>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -5,84 +5,114 @@
{% load formset_tags %} {% load formset_tags %}
{% block title %}{% blocktrans with name=question.question %}Question: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktrans with name=question.question %}Question: {{ name }}{% endblocktrans %}{% endblock %}
{% block inside %} {% block inside %}
<h1> <div class="panel panel-default panel-with-btn">
{% blocktrans with name=question.question %}Question: {{ name }}{% endblocktrans %} <div class="panel-heading">
<a href="{% url "control:event.items.questions.edit" event=request.event.slug organizer=request.event.organizer.slug question=question.pk %}" <a href="{% url "control:event.items.questions.edit" event=request.event.slug organizer=request.event.organizer.slug question=question.pk %}"
class="btn btn-default"> class="btn btn-default btn-sm pull-right">
<span class="fa fa-edit"></span> <span class="fa fa-edit"></span>
{% trans "Edit question" %} {% trans "Edit question" %}
</a> </a>
</h1> <h1 class="panel-title">
<form class="form-inline helper-display-inline" action="" method="get"> {% blocktrans with name=question.question %}Question: {{ name }}{% endblocktrans %}
<p> </h1>
<select name="status" class="form-control"> </div>
<option value="" {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option> <div class="panel-body">
<option value="p" {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option> <form class="form-inline helper-display-inline" action="" method="get">
<option value="n" {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option> <p>
<option value="np" {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option> <select name="status" class="form-control">
<option value="o" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option> <option value=""
<option value="e" {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option> {% if request.GET.status == "" %}selected="selected"{% endif %}>{% trans "All orders" %}</option>
<option value="ne" {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option> <option value="p"
<option value="c" {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option> {% if request.GET.status == "p" %}selected="selected"{% endif %}>{% trans "Paid" %}</option>
<option value="r" {% if request.GET.status == "r" %}selected="selected"{% endif %}>{% trans "Refunded" %}</option> <option value="n"
</select> {% if request.GET.status == "n" %}selected="selected"{% endif %}>{% trans "Pending" %}</option>
<select name="item" class="form-control"> <option value="np"
<option value="">{% trans "All products" %}</option> {% if request.GET.status == "np" or "status" not in request.GET %}selected="selected"{% endif %}>{% trans "Pending or paid" %}</option>
{% for item in items %} <option value="o"
<option value="{{ item.id }}" {% if request.GET.status == "o" %}selected="selected"{% endif %}>{% trans "Pending (overdue)" %}</option>
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}> <option value="e"
{{ item.name }} {% if request.GET.status == "e" %}selected="selected"{% endif %}>{% trans "Expired" %}</option>
</option> <option value="ne"
{% endfor %} {% if request.GET.status == "ne" %}selected="selected"{% endif %}>{% trans "Pending or expired" %}</option>
</select> <option value="c"
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button> {% if request.GET.status == "c" %}selected="selected"{% endif %}>{% trans "Canceled" %}</option>
</p> <option value="r"
</form> {% if request.GET.status == "r" %}selected="selected"{% endif %}>{% trans "Refunded" %}</option>
</select>
<select name="item" class="form-control">
<option value="">{% trans "All products" %}</option>
{% for item in items %}
<option value="{{ item.id }}"
{% if request.GET.item|add:0 == item.id %}selected="selected"{% endif %}>
{{ item.name }}
</option>
{% endfor %}
</select>
<button class="btn btn-primary" type="submit">{% trans "Filter" %}</button>
</p>
</form>
</div>
</div>
<div class="row" id="question-stats"> <div class="row" id="question-stats">
{% if not stats %} {% if not stats %}
<div class="empty-collection col-md-10 col-xs-12"> <div class="col-md-10 col-xs-12">
<p> <div class="panel panel-default">
{% blocktrans trimmed %} <div class="panel-body empty-collection">
No matching answers found. <p>
{% endblocktrans %} {% blocktrans trimmed %}
</p> No matching answers found.
{% if not items %} {% endblocktrans %}
<p> </p>
{% trans "You need to assign the question to a product to collect answers." %} {% if not items %}
</p> <p>
{% trans "You need to assign the question to a product to collect answers." %}
</p>
<a href="{% url "control:event.items.questions.edit" event=request.event.slug organizer=request.event.organizer.slug question=question.pk %}" <a href="{% url "control:event.items.questions.edit" event=request.event.slug organizer=request.event.organizer.slug question=question.pk %}"
class="btn btn-primary btn-lg"><i class="fa fa-edit"></i> {% trans "Edit question" %}</a> class="btn btn-primary btn-lg"><i class="fa fa-edit"></i> {% trans "Edit question" %}</a>
{% endif %} {% endif %}
</div>
</div>
</div> </div>
{% else %} {% else %}
<div class="col-md-5 col-xs-12"> <div class="col-md-5 col-xs-12">
<div class="chart" id="question_chart" data-type="{{ question.type }}"> <div class="panel panel-default">
<div class="panel-body">
<div class="chart" id="question_chart" data-type="{{ question.type }}">
</div>
<script type="application/json" id="question-chart-data">{{ stats_json|escapejson }}</script>
</div>
</div> </div>
<script type="application/json" id="question-chart-data">{{ stats_json|escapejson }}</script>
</div> </div>
<div class="col-md-5 col-xs-12"> <div class="col-md-5 col-xs-12">
<table class="table table-bordered table-hover"> <div class="panel panel-default">
<thead> <table class="table table-bordered table-hover">
<tr> <thead>
<th>{% trans "Answer" %}</th>
<th>{% trans "Count" %}</th>
</tr>
</thead>
<tbody>
{% for stat in stats %}
<tr> <tr>
<td> <th>{% trans "Answer" %}</th>
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status={{ request.GET.status|default:"np" }}&item={{ request.GET.item }}&question={{ question.pk }}&answer={{ stat.alink|default:stat.answer|urlencode }}"> <th>{% trans "Count" %}</th>
{{ stat.answer }}
</a>
</td>
<td>{{ stat.count }}</td>
</tr> </tr>
{% endfor %} </thead>
</tbody> <tbody>
</table> {% for stat in stats %}
<tr>
<td>
<a href="{% url "control:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}?status=
{{ request.GET.status|default:"np" }}&item={{ request.GET.item }}&question={{ question.pk }}&answer=
{{ stat.alink|default:stat.answer|urlencode }}">
{{ stat.answer }}
</a>
</td>
<td>{{ stat.count }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div> </div>
{% endif %} {% endif %}
<div class="col-xs-12 col-lg-2"> <div class="col-xs-12 col-lg-2">

View File

@@ -3,23 +3,36 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Delete question" %}{% endblock %} {% block title %}{% trans "Delete question" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Delete question" %}</h1> <div class="panel panel-default">
<form action="" method="post" class="form-horizontal"> <div class="panel-heading">
{% csrf_token %} <h1 class="panel-title">{% trans "Delete question" %}</h1>
<p>{% blocktrans %}Are you sure you want to delete the question <strong>{{ question }}</strong>?{% endblocktrans %}</p> </div>
{% if dependent|length > 0 %} <div class="panel-body">
<p>{% blocktrans %}All answers to the question given by the buyers of the following products will be <strong>lost</strong>.{% endblocktrans %}</p> <form action="" method="post" class="form-horizontal">
{% for item in dependent %} {% csrf_token %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.pk %}">{{ item.name }}</a></li> <p>{% blocktrans %}Are you sure you want to delete the question <strong>{{ question }}</strong>
{% endfor %} ?{% endblocktrans %}</p>
{% endif %} {% if dependent|length > 0 %}
<div class="form-group submit-group"> <p>{% blocktrans %}All answers to the question given by the buyers of the following products will be
<a href="{% url "control:event.items.questions" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default btn-cancel"> <strong>lost</strong>.{% endblocktrans %}</p>
{% trans "Cancel" %} <ul>
</a> {% for item in dependent %}
<button type="submit" class="btn btn-danger btn-save"> <li>
{% trans "Delete" %} <a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.pk %}">{{ item.name }}</a>
</button> </li>
</div> {% endfor %}
</form> </ul>
{% endif %}
<div class="form-group submit-group">
<a href="{% url "control:event.items.questions" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-default btn-cancel">
{% trans "Cancel" %}
</a>
<button type="submit" class="btn btn-danger btn-save">
{% trans "Delete" %}
</button>
</div>
</form>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -10,26 +10,34 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block inside %} {% block inside %}
{% if question %}
<h1>{% blocktrans with name=question.question %}Question: {{ name }}{% endblocktrans %}</h1>
{% else %}
<h1>{% trans "Question" %}</h1>
{% endif %}
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "General information" %}</legend> <div class="panel-heading">
{% bootstrap_field form.question layout="control" %} {% if question %}
{% bootstrap_field form.help_text layout="control" %} <h1 class="panel-title">{% blocktrans with name=question.question %}Question:
{% bootstrap_field form.type layout="control" %} {{ name }}{% endblocktrans %}</h1>
{% bootstrap_field form.identifier layout="control" %} {% else %}
{% bootstrap_field form.ask_during_checkin layout="control" %} <h1 class="panel-title">{% trans "Question" %}</h1>
{% bootstrap_field form.required layout="control" %} {% endif %}
</div>
<div class="panel-body">
{% bootstrap_field form.question layout="control" %}
{% bootstrap_field form.help_text layout="control" %}
{% bootstrap_field form.type layout="control" %}
{% bootstrap_field form.identifier layout="control" %}
{% bootstrap_field form.ask_during_checkin layout="control" %}
{% bootstrap_field form.required layout="control" %}
</div>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel panel-default">
<legend>{% trans "Apply to products" %}</legend> <div class="panel-heading">
{% bootstrap_field form.items layout="control" %} <legend>{% trans "Apply to products" %}</legend>
</div>
<div class="panel-body">
{% bootstrap_field form.items layout="control" %}
</div>
</fieldset> </fieldset>
<div class="alert alert-info alert-required-boolean"> <div class="alert alert-info alert-required-boolean">
{% blocktrans trimmed %} {% blocktrans trimmed %}
@@ -37,77 +45,81 @@
accepted. If you want to allow both options, do not make this field required. accepted. If you want to allow both options, do not make this field required.
{% endblocktrans %} {% endblocktrans %}
</div> </div>
<fieldset id="answer-options"> <fieldset class="panel panel-default" id="answer-options">
<legend>{% trans "Answer options" %}</legend> <div class="panel-heading">
<noscript> <legend>{% trans "Answer options" %}</legend>
<p>{% trans "Only applicable if you choose 'Choose one/multiple from a list' above." %}</p> </div>
</noscript> <div class="panel-body">
<div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}"> <noscript>
{{ formset.management_form }} <p>{% trans "Only applicable if you choose 'Choose one/multiple from a list' above." %}</p>
{% bootstrap_formset_errors formset %} </noscript>
<div data-formset-body> <div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}">
{% for form in formset %} {{ formset.management_form }}
<div data-formset-form> {% bootstrap_formset_errors formset %}
<div class="sr-only"> <div data-formset-body>
{{ form.id }} {% for form in formset %}
{% bootstrap_field form.DELETE form_group_class="" layout="inline" %} <div data-formset-form>
{% bootstrap_field form.ORDER form_group_class="" layout="inline" %} <div class="sr-only">
</div> {{ form.id }}
<div class="row question-option-row"> {% bootstrap_field form.DELETE form_group_class="" layout="inline" %}
<div class="col-xs-10"> {% bootstrap_field form.ORDER form_group_class="" layout="inline" %}
</div>
<div class="row question-option-row">
<div class="col-xs-10">
<span class="text-muted"> <span class="text-muted">
{% blocktrans trimmed with id=form.instance.identifier %} {% blocktrans trimmed with id=form.instance.identifier %}
Answer option {{ id }} Answer option {{ id }}
{% endblocktrans %} {% endblocktrans %}
</span> </span>
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
{% bootstrap_field form.answer layout='inline' form_group_class="" %} {% bootstrap_field form.answer layout='inline' form_group_class="" %}
</div> </div>
<div class="col-xs-2 text-right"> <div class="col-xs-2 text-right">
<span>&nbsp;</span><br> <span>&nbsp;</span><br>
<button type="button" class="btn btn-default" data-formset-move-up-button> <button type="button" class="btn btn-default" data-formset-move-up-button>
<i class="fa fa-arrow-up"></i></button> <i class="fa fa-arrow-up"></i></button>
<button type="button" class="btn btn-default" data-formset-move-down-button> <button type="button" class="btn btn-default" data-formset-move-down-button>
<i class="fa fa-arrow-down"></i></button> <i class="fa fa-arrow-down"></i></button>
<button type="button" class="btn btn-danger" data-formset-delete-button> <button type="button" class="btn btn-danger" data-formset-delete-button>
<i class="fa fa-trash"></i></button> <i class="fa fa-trash"></i></button>
</div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div> <script type="form-template" data-formset-empty-form>
<script type="form-template" data-formset-empty-form> {% escapescript %}
{% escapescript %} <div data-formset-form>
<div data-formset-form> <div class="sr-only">
<div class="sr-only"> {{ formset.empty_form.id }}
{{ formset.empty_form.id }} {% bootstrap_field formset.empty_form.DELETE form_group_class="" layout="inline" %}
{% bootstrap_field formset.empty_form.DELETE form_group_class="" layout="inline" %} {% bootstrap_field formset.empty_form.ORDER form_group_class="" layout="inline" %}
{% bootstrap_field formset.empty_form.ORDER form_group_class="" layout="inline" %} </div>
</div> <div class="row question-option-row">
<div class="row question-option-row"> <div class="col-xs-10">
<div class="col-xs-10">
<span class="text-muted"> <span class="text-muted">
{% trans "New answer option" %} {% trans "New answer option" %}
</span> </span>
{% bootstrap_field formset.empty_form.answer layout='inline' form_group_class="" %} {% bootstrap_field formset.empty_form.answer layout='inline' form_group_class="" %}
</div> </div>
<div class="col-xs-2 text-right"> <div class="col-xs-2 text-right">
<span>&nbsp;</span><br> <span>&nbsp;</span><br>
<button type="button" class="btn btn-default" data-formset-move-up-button> <button type="button" class="btn btn-default" data-formset-move-up-button>
<i class="fa fa-arrow-up"></i></button> <i class="fa fa-arrow-up"></i></button>
<button type="button" class="btn btn-default" data-formset-move-down-button> <button type="button" class="btn btn-default" data-formset-move-down-button>
<i class="fa fa-arrow-down"></i></button> <i class="fa fa-arrow-down"></i></button>
<button type="button" class="btn btn-danger" data-formset-delete-button> <button type="button" class="btn btn-danger" data-formset-delete-button>
<i class="fa fa-trash"></i></button> <i class="fa fa-trash"></i></button>
</div>
</div> </div>
</div> </div>
</div> {% endescapescript %}
{% endescapescript %} </script>
</script> <p>
<p> <button type="button" class="btn btn-default" data-formset-add>
<button type="button" class="btn btn-default" data-formset-add> <i class="fa fa-plus"></i> {% trans "Add a new option" %}</button>
<i class="fa fa-plus"></i> {% trans "Add a new option" %}</button> </p>
</p> </div>
</div> </div>
</fieldset> </fieldset>
<div class="form-group submit-group"> <div class="form-group submit-group">

View File

@@ -2,74 +2,89 @@
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Questions" %}{% endblock %} {% block title %}{% trans "Questions" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Questions" %}</h1> <div class="panel panel-default">
<p> <div class="panel-heading">
{% blocktrans trimmed %} <h1 class="panel-title">{% trans "Questions" %}</h1>
Questions allow your attendees to fill in additional data about their ticket. If you provide food, one </div>
example might be to ask your users about dietary requirements. <div class="panel-body">
{% endblocktrans %} {% blocktrans trimmed %}
</p> Questions allow your attendees to fill in additional data about their ticket. If you provide food, one
{% if questions|length == 0 %} example might be to ask your users about dietary requirements.
<div class="empty-collection"> {% endblocktrans %}
<p> </div>
{% blocktrans trimmed %} {% if questions|length == 0 %}
You haven't created any questions yet. <div class="empty-collection panel-body">
{% endblocktrans %} <p>
</p> {% blocktrans trimmed %}
You haven't created any questions yet.
{% endblocktrans %}
</p>
<a href="{% url "control:event.items.questions.add" organizer=request.event.organizer.slug event=request.event.slug %}" <a href="{% url "control:event.items.questions.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new question" %}</a> class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new question" %}</a>
</div> </div>
{% else %} {% else %}
<p> <div class="panel-body">
<a href="{% url "control:event.items.questions.add" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new question" %} <a href="{% url "control:event.items.questions.add" organizer=request.event.organizer.slug event=request.event.slug %}"
</a> class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new question" %}
</p> </a>
<div class="table-responsive"> </div>
<table class="table table-hover table-quotas"> <div class="table-responsive">
<thead> <table class="table table-hover table-quotas">
<tr> <thead>
<th>{% trans "Question" %}</th>
<th>{% trans "Type" %}</th>
<th>{% trans "Products" %}</th>
<th class="action-col-2"></th>
<th class="action-col-2"></th>
</tr>
</thead>
<tbody>
{% for q in questions %}
<tr> <tr>
<td><strong><a href=" <th>{% trans "Question" %}</th>
{% url "control:event.items.questions.show" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}">{{ q.question }}</a></strong> <th>{% trans "Type" %}</th>
</td> <th>{% trans "Products" %}</th>
<td> <th class="action-col-2"></th>
{{ q.get_type_display }} <th class="action-col-2"></th>
{% if q.required %}
<span class="fa fa-exclamation-circle text-muted"
data-toggle="tooltip" title="{% trans "Required question" %}">
</span>
{% endif %}
</td>
<td>
<ul>
{% for item in q.items.all %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a></li>
{% endfor %}
</ul>
</td>
<td>
<a href="{% url "control:event.items.questions.up" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}" class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-up"></i></a>
<a href="{% url "control:event.items.questions.down" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}" class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i class="fa fa-arrow-down"></i></a>
</td>
<td class="text-right">
<a href="{% url "control:event.items.questions.edit" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.questions.delete" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr> </tr>
{% endfor %} </thead>
</tbody> <tbody>
</table> {% for q in questions %}
</div> <tr>
{% include "pretixcontrol/pagination.html" %} <td><strong><a href="
{% endif %} {% url "control:event.items.questions.show" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}">{{ q.question }}</a></strong>
</td>
<td>
{{ q.get_type_display }}
{% if q.required %}
<span class="fa fa-exclamation-circle text-muted"
data-toggle="tooltip" title="{% trans "Required question" %}">
</span>
{% endif %}
</td>
<td>
<ul>
{% for item in q.items.all %}
<li>
<a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a>
</li>
{% endfor %}
</ul>
</td>
<td>
<a href="{% url "control:event.items.questions.up" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}"
class="btn btn-default btn-sm {% if forloop.counter0 == 0 %}disabled{% endif %}"><i
class="fa fa-arrow-up"></i></a>
<a href="{% url "control:event.items.questions.down" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}"
class="btn btn-default btn-sm {% if forloop.revcounter0 == 0 %}disabled{% endif %}"><i
class="fa fa-arrow-down"></i></a>
</td>
<td class="text-right">
<a href="{% url "control:event.items.questions.edit" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}"
class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.questions.delete" organizer=request.event.organizer.slug event=request.event.slug question=q.id %}"
class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-footer">
{% include "pretixcontrol/pagination.html" %}
</div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@@ -5,16 +5,21 @@
{% load eventsignal %} {% load eventsignal %}
{% block title %}{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}{% endblock %} {% block title %}{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}{% endblock %}
{% block inside %} {% block inside %}
<h1> <div class="panel panel-default panel-with-btn">
{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %} <div class="panel-heading">
{% if 'can_change_items' in request.eventpermset %} {% if 'can_change_items' in request.eventpermset %}
<a href="{% url "control:event.items.quotas.edit" event=request.event.slug organizer=request.event.organizer.slug quota=quota.pk %}" <a href="{% url "control:event.items.quotas.edit" event=request.event.slug organizer=request.event.organizer.slug quota=quota.pk %}"
class="btn btn-default"> class="btn btn-default btn-sm pull-right">
<span class="fa fa-edit"></span> <span class="fa fa-edit"></span>
{% trans "Edit quota" %} {% trans "Edit quota" %}
</a> </a>
{% endif %} {% endif %}
</h1> <h1 class="panel-title">
{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}
<div class="clearfix"></div>
</h1>
</div>
</div>
{% if quota.subevent %} {% if quota.subevent %}
<p> <p>
<span class="fa fa-calendar"></span> {{ quota.subevent.name }} {{ quota.subevent.get_date_range_display }} <span class="fa fa-calendar"></span> {{ quota.subevent.name }} {{ quota.subevent.get_date_range_display }}
@@ -22,48 +27,60 @@
{% endif %} {% endif %}
<div class="row" id="quota-stats"> <div class="row" id="quota-stats">
<div class="col-md-5 col-xs-12"> <div class="col-md-5 col-xs-12">
<legend>{% trans "Usage overview" %}</legend> <div class="panel panel-default">
<div class="chart" id="quota_chart"> <div class="panel-heading">
<legend>{% trans "Usage overview" %}</legend>
</div>
<div class="panel-body">
<div class="chart" id="quota_chart">
</div>
<script type="application/json" id="quota-chart-data">{{ quota_chart_data|escapejson }}</script>
</div>
</div> </div>
<script type="application/json" id="quota-chart-data">{{ quota_chart_data|escapejson }}</script>
</div> </div>
<div class="col-md-5 col-xs-12"> <div class="col-md-5 col-xs-12">
<legend>{% trans "Availability calculation" %}</legend> <div class="panel panel-default">
<div class="panel-heading">
<legend>{% trans "Availability calculation" %}</legend>
</div>
<div class="panel-body">
<div class="row"> <div class="row">
<div class="col-xs-9">{% trans "Total quota" %}</div> <div class="col-xs-9">{% trans "Total quota" %}</div>
<div class="col-xs-3 text-right"> <div class="col-xs-3 text-right">
{% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ quota.size }}{% endif %} {% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ quota.size }}{% endif %}
</div>
</div>
{% for row in quota_table_rows %}
<div class="row">
<div class="col-xs-9">{{ row.label }}</div>
<div class="col-xs-3 text-right"> {{ row.value }}</div>
</div>
{% endfor %}
<div class="row">
<div class="col-xs-9"><strong>{% trans "Current availability" %}</strong></div>
<div class="col-xs-3 text-right">
{% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ avail.1 }}{% endif %}
</div>
</div>
{% if quota_overbooked > 0 %}
<div class="alert alert-warning">
{% blocktrans trimmed with num=quota_overbooked %}
This quota is currently overbooked by {{ num }} tickets.
{% endblocktrans %}
</div>
{% endif %}
{% if has_ignore_vouchers %}
<div class="alert alert-warning">
{% blocktrans trimmed %}
Your event contains vouchers that affect products covered by this quota and that
allow a user to buy products even if this quota is sold out.
{% endblocktrans %}
</div>
{% endif %}
</div> </div>
</div> </div>
{% for row in quota_table_rows %}
<div class="row">
<div class="col-xs-9">{{ row.label }}</div>
<div class="col-xs-3 text-right"> {{ row.value }}</div>
</div>
{% endfor %}
<div class="row">
<div class="col-xs-9"><strong>{% trans "Current availability" %}</strong></div>
<div class="col-xs-3 text-right">
{% if quota.size == None %}{% trans "Infinite" %}{% else %}{{ avail.1 }}{% endif %}
</div>
</div>
{% if quota_overbooked > 0 %}
<div class="alert alert-warning">
{% blocktrans trimmed with num=quota_overbooked %}
This quota is currently overbooked by {{ num }} tickets.
{% endblocktrans %}
</div>
{% endif %}
{% if has_ignore_vouchers %}
<div class="alert alert-warning">
{% blocktrans trimmed %}
Your event contains vouchers that affect products covered by this quota and that
allow a user to buy products even if this quota is sold out.
{% endblocktrans %}
</div>
{% endif %}
</div> </div>
<div class="col-md-2 col-xs-12"> <div class="col-md-2 col-xs-12">
<div class="panel panel-default"> <div class="panel panel-default">

View File

@@ -3,23 +3,36 @@
{% load bootstrap3 %} {% load bootstrap3 %}
{% block title %}{% trans "Delete quota" %}{% endblock %} {% block title %}{% trans "Delete quota" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Delete quota" %}</h1> <div class="panel panel-default">
<form action="" method="post" class="form-horizontal"> <div class="panel-heading">
{% csrf_token %} <h1 class="panel-title">{% trans "Delete quota" %}</h1>
<p>{% blocktrans %}Are you sure you want to delete the quota <strong>{{ quota }}</strong>?{% endblocktrans %}</p> </div>
{% if dependent|length > 0 %} <div class="panel-body">
<p>{% blocktrans %}The following products might be no longer available for sale:{% endblocktrans %}</p> <form action="" method="post" class="form-horizontal">
{% for item in dependent %} {% csrf_token %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.pk %}">{{ item.name }}</a></li> <p>{% blocktrans %}Are you sure you want to delete the quota <strong>{{ quota }}</strong>
{% endfor %} ?{% endblocktrans %}</p>
{% endif %} {% if dependent|length > 0 %}
<div class="form-group submit-group"> <p>{% blocktrans %}The following products might be no longer available for
<a href="{% url "control:event.items.quotas" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default btn-cancel"> sale:{% endblocktrans %}</p>
{% trans "Cancel" %} <ul>
</a> {% for item in dependent %}
<button type="submit" class="btn btn-danger btn-save"> <li>
{% trans "Delete" %} <a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.pk %}">{{ item.name }}</a>
</button> </li>
</div> {% endfor %}
</form> </ul>
{% endif %}
<div class="form-group submit-group">
<a href="{% url "control:event.items.quotas" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-default btn-cancel">
{% trans "Cancel" %}
</a>
<button type="submit" class="btn btn-danger btn-save">
{% trans "Delete" %}
</button>
</div>
</form>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -9,36 +9,37 @@
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block inside %} {% block inside %}
{% if question %} <div class="panel panel-default">
<h1>{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}</h1> <div class="panel-heading">
{% else %} {% if quota %}
<h1>{% trans "Quota" %}</h1> <h1 class="panel-title">{% blocktrans with name=quota.name %}Quota: {{ name }}{% endblocktrans %}</h1>
{% endif %} {% else %}
<form action="" method="post" class="form-horizontal"> <h1 class="panel-title">{% trans "Quota" %}</h1>
{% csrf_token %}
{% bootstrap_form_errors form %}
<fieldset>
<legend>{% trans "General information" %}</legend>
{% bootstrap_field form.name layout="control" %}
{% bootstrap_field form.size layout="control" %}
{% if form.subevent %}
{% bootstrap_field form.subevent layout="control" %}
{% endif %} {% endif %}
<legend>{% trans "Items" %}</legend>
<p>
{% blocktrans trimmed %}
Please select the products or product variations this quota should be applied to. If you apply two
quotas to the same product, it will only be available if
<strong>both</strong> quotas have capacity
left.
{% endblocktrans %}
</p>
{% bootstrap_field form.itemvars layout="control" %}
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div> </div>
</form> <form action="" method="post" class="form-horizontal panel-body">
{% csrf_token %}
{% bootstrap_form_errors form %}
<fieldset>
{% bootstrap_field form.name layout="control" %}
{% bootstrap_field form.size layout="control" %}
{% if form.subevent %}
{% bootstrap_field form.subevent layout="control" %}
{% endif %}
{% bootstrap_field form.itemvars layout="control" %}
<p class="help-block">
{% blocktrans trimmed %}
Please select the products or product variations this quota should be applied to. If you apply
two quotas to the same product, it will only be available if <strong>both</strong> quotas have capacity
left.
{% endblocktrans %}
</p>
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
</div>
{% endblock %} {% endblock %}

View File

@@ -2,82 +2,93 @@
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Quotas" %}{% endblock %} {% block title %}{% trans "Quotas" %}{% endblock %}
{% block inside %} {% block inside %}
<h1>{% trans "Quotas" %}</h1> <div class="panel panel-default">
<p> <div class="panel-heading">
{% blocktrans trimmed %} <h1 class="panel-title">{% trans "Quotas" %}</h1>
To make your products actually available, you also need quotas. Quotas define, how many instances of
your product pretix will sell. This way, you can configure whether your event can take an unlimited
number of attendees or the number of attendees is limited. You can assign a product to multiple quotas
to fulfil more complex requirements, e.g. if you want to limit the total number of tickets sold and the
number of a specific ticket type at the same time.
{% endblocktrans %}
</p>
{% if request.event.has_subevents %}
<form class="form-inline helper-display-inline" action="" method="get">
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
</form>
{% endif %}
{% if quotas|length == 0 %}
<div class="empty-collection">
<p>
{% if request.GET.subevent %}
{% trans "Your search did not match any quotas." %}
{% else %}
{% blocktrans trimmed %}
You haven't created any quotas yet.
{% endblocktrans %}
{% endif %}
</p>
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new quota" %}</a>
</div> </div>
{% else %} <div class="panel-body">
<p> {% blocktrans trimmed %}
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new quota" %} To make your products actually available, you also need quotas. Quotas define, how many instances of
</a> your product pretix will sell. This way, you can configure whether your event can take an unlimited
</p> number of attendees or the number of attendees is limited. You can assign a product to multiple quotas
<div class="table-responsive"> to fulfil more complex requirements, e.g. if you want to limit the total number of tickets sold and the
<table class="table table-hover table-quotas"> number of a specific ticket type at the same time.
<thead> {% endblocktrans %}
<tr> </div>
<th>{% trans "Quota name" %}</th> {% if request.event.has_subevents %}
<th>{% trans "Products" %}</th> <form class="form-inline helper-display-inline" action="" method="get">
{% if request.event.has_subevents %} {% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
<th>{% trans "Date" context "subevent" %}</th> </form>
{% endif %}
{% if quotas|length == 0 %}
<div class="empty-collection panel-body">
<p>
{% if request.GET.subevent %}
{% trans "Your search did not match any quotas." %}
{% else %}
{% blocktrans trimmed %}
You haven't created any quotas yet.
{% endblocktrans %}
{% endif %} {% endif %}
<th>{% trans "Total capacity" %}</th> </p>
<th>{% trans "Capacity left" %}</th>
<th class="action-col-2"></th> <a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}"
</tr> class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new quota" %}</a>
</thead> </div>
<tbody> {% else %}
{% for q in quotas %} <div class="panel-body">
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new quota" %}
</a>
</div>
<div class="table-responsive">
<table class="table table-hover table-quotas">
<thead>
<tr> <tr>
<td> <th>{% trans "Quota name" %}</th>
<strong><a href="{% url "control:event.items.quotas.show" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}">{{ q.name }}</a></strong> <th>{% trans "Products" %}</th>
</td>
<td>
<ul>
{% for item in q.items.all %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a></li>
{% endfor %}
</ul>
</td>
{% if request.event.has_subevents %} {% if request.event.has_subevents %}
<td>{{ q.subevent.name }} {{ q.subevent.get_date_range_display }}</td> <th>{% trans "Date" context "subevent" %}</th>
{% endif %} {% endif %}
<td>{% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}</td> <th>{% trans "Total capacity" %}</th>
<td>{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.availability %}</td> <th>{% trans "Capacity left" %}</th>
<td class="text-right"> <th class="action-col-2"></th>
<a href="{% url "control:event.items.quotas.edit" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.quotas.delete" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr> </tr>
{% endfor %} </thead>
</tbody> <tbody>
</table> {% for q in quotas %}
</div> <tr>
{% endif %} <td>
{% include "pretixcontrol/pagination.html" %} <strong><a href="{% url "control:event.items.quotas.show" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}">{{ q.name }}</a></strong>
</td>
<td>
<ul>
{% for item in q.items.all %}
<li>
<a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a>
</li>
{% endfor %}
</ul>
</td>
{% if request.event.has_subevents %}
<td>{{ q.subevent.name }} {{ q.subevent.get_date_range_display }}</td>
{% endif %}
<td>{% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}</td>
<td>{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.availability %}</td>
<td class="text-right">
<a href="{% url "control:event.items.quotas.edit" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}"
class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.quotas.delete" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}"
class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-footer">
{% include "pretixcontrol/pagination.html" %}
</div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@@ -1,8 +1,8 @@
{% load i18n %} {% load i18n %}
{% load urlreplace %} {% load urlreplace %}
<nav class="text-center pagination-container"> <nav class="text-center pagination-container">
<ul class="pagination"> {% if is_paginated %}
{% if is_paginated %} <ul class="pagination">
{% if page_obj.has_previous %} {% if page_obj.has_previous %}
<li> <li>
<a href="?{% url_replace request 'page' page_obj.previous_page_number %}"> <a href="?{% url_replace request 'page' page_obj.previous_page_number %}">
@@ -12,37 +12,44 @@
{% endif %} {% endif %}
<li class="page-current"><a> <li class="page-current"><a>
{% blocktrans trimmed with page=page_obj.number of=page_obj.paginator.num_pages count=page_obj.paginator.count %} {% blocktrans trimmed with page=page_obj.number of=page_obj.paginator.num_pages count=page_obj.paginator.count %}
Page {{ page }} of {{ of }} ({{ count }} elements) Page {{ page }} of {{ of }}
{% endblocktrans %} {% endblocktrans %}
</a></li> </a></li>
{% if page_obj.has_next %} {% if page_obj.has_next %}
<li> <li>
<a href="?{% url_replace request 'page' page_obj.next_page_number %}"> <a href="?{% url_replace request 'page' page_obj.next_page_number %}">
<span>&raquo;</span> <span>&raquo;</span>
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% else %} </ul>
{% if page_obj.paginator.count > 1 %}
<li class="page-current"><a>
{% blocktrans trimmed with count=page_obj.paginator.count %}
{{ count }} elements
{% endblocktrans %}
</a></li>
{% endif %}
{% endif %}
</ul>
{% if page_size %}
<div class="clearfix">
<small>
{% trans "Show per page:" %}
</small>
<a href="?{% url_replace request "page_size" "25" "page" "1" %}">
{% if page_size == 25 %}<strong>{% endif %}25{% if page_size == 25 %}</strong>{% endif %}</a> |
<a href="?{% url_replace request "page_size" "50" "page" "1" %}">
{% if page_size == 50 %}<strong>{% endif %}50{% if page_size == 50 %}</strong>{% endif %}</a> |
<a href="?{% url_replace request "page_size" "100" "page" "1" %}">
{% if page_size == 100 %}<strong>{% endif %}100{% if page_size == 100 %}</strong>{% endif %}</a>
</div>
{% endif %} {% endif %}
{% if page_obj.paginator.count > 0 %}
<ul class="pagination pagination-count">
<li class="page-current"><a>
{% blocktrans trimmed with count=page_obj.paginator.count %}
{{ count }} elements
{% endblocktrans %}
</a></li>
</ul>
<ul class="pagination pagination-select">
<li class="page-current"><a>
{% trans "Show per page:" %}
</a></li>
<li>
<a href="?{% url_replace request "page_size" "25" "page" "1" %}">
{% if page_size == 25 %}<strong>{% endif %}25{% if page_size == 25 %}</strong>{% endif %}</a>
</li>
<li>
<a href="?{% url_replace request "page_size" "50" "page" "1" %}">
{% if page_size == 50 %}<strong>{% endif %}50{% if page_size == 50 %}</strong>{% endif %}</a>
</li>
<li>
<a href="?{% url_replace request "page_size" "100" "page" "1" %}">
{% if page_size == 100 %}<strong>{% endif %}100{% if page_size == 100 %}</strong>{% endif %}</a>
</li>
</ul>
{% endif %}
<div class="clearfix">
</div>
</nav> </nav>

View File

@@ -4,48 +4,57 @@
{% load order_overview %} {% load order_overview %}
{% block title %}{% trans "Data shredder" %}{% endblock %} {% block title %}{% trans "Data shredder" %}{% endblock %}
{% block content %} {% block content %}
<h1>
{% trans "Data shredder" %}
</h1>
<form action="{% url "control:event.shredder.shred" event=request.event.slug organizer=request.organizer.slug %}" <form action="{% url "control:event.shredder.shred" event=request.event.slug organizer=request.organizer.slug %}"
method="post" class="form-horizontal" data-asynctask> method="post" class="form-horizontal" data-asynctask>
{% csrf_token %} {% csrf_token %}
<fieldset> <fieldset class="panel-default panel">
<legend>{% trans "Step 1: Download data" %}</legend> <div class="panel-heading">
<p> <legend>{% trans "Step 1: Download data" %}</legend>
{% blocktrans trimmed %} </div>
You are about to permamanently delete data from the server, even though you might be required to <div class="panel-body">
keep <p>
some of this data on file. You should therefore download the following file and store it in a safe {% blocktrans trimmed %}
place: You are about to permamanently delete data from the server, even though you might be required to
{% endblocktrans %} keep some of this data on file. You should therefore download the following file and store it in a
</p> safe place:
<p> {% endblocktrans %}
<a href="{% url "cachedfile.download" id=file.pk %}" class="btn btn-primary btn-lg"> </p>
{% trans "Download data" %} <p>
</a> <a href="{% url "cachedfile.download" id=file.pk %}" class="btn btn-primary btn-lg">
</p> {% trans "Download data" %}
</a>
</p>
</div>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel-default panel">
<legend>{% trans "Step 2: Confirm download" %}</legend> <div class="panel-heading">
<p> <legend>{% trans "Step 2: Confirm download" %}</legend>
{% blocktrans trimmed %} </div>
In the downloaded file, there is a text file named "CONFIRM_CODE.txt" with a six-character code. <div class="panel-body">
Please enter this code here to confirm that you successfully downloaded the file. <p>
{% endblocktrans %} {% blocktrans trimmed %}
</p> In the downloaded file, there is a text file named "CONFIRM_CODE.txt" with a six-character code.
<input type="text" class="form-control" name="confirm_code" required placeholder="{% trans "Confirmation code" %}"> Please enter this code here to confirm that you successfully downloaded the file.
<br> {% endblocktrans %}
</p>
<input type="text" class="form-control" name="confirm_code" required
placeholder="{% trans "Confirmation code" %}">
<br>
</fieldset> </fieldset>
<fieldset> <fieldset class="panel-default panel">
<legend>{% trans "Step 3: Confirm deletion" %}</legend> <div class="panel-heading">
<p> <legend>{% trans "Step 3: Confirm deletion" %}</legend>
{% blocktrans trimmed with event=request.event.name %} </div>
Please re-check that you are fully certain that you want to delete the selected categories of data from the event <strong>{{ event }}</strong>. <div class="panel-body">
In this case, please enter your user password here: <p>
{% endblocktrans %} {% blocktrans trimmed with event=request.event.name %}
</p> Please re-check that you are fully certain that you want to delete the selected categories of
<input type="password" class="form-control" name="password" required placeholder="{% trans "Your password" %}"> data from the event <strong>{{ event }}</strong>.
In this case, please enter your user password here:
{% endblocktrans %}
</p>
<input type="password" class="form-control" name="password" required
placeholder="{% trans "Your password" %}">
</fieldset> </fieldset>
<input type="hidden" name="file" value="{{ file.pk }}"> <input type="hidden" name="file" value="{{ file.pk }}">
<div class="form-group submit-group"> <div class="form-group submit-group">

View File

@@ -4,37 +4,44 @@
{% load order_overview %} {% load order_overview %}
{% block title %}{% trans "Data shredder" %}{% endblock %} {% block title %}{% trans "Data shredder" %}{% endblock %}
{% block content %} {% block content %}
<h1> <div class="panel panel-default">
{% trans "Data shredder" %} <div class="panel-heading">
</h1> <h1 class="panel-title">
<p> {% trans "Data shredder" %}
{% blocktrans trimmed %} </h1>
This feature allows you to remove personal data from this event. You will first select what kind of data </div>
you want to shred, then you are able to download the affected data and after you confirmed the download, <div class="panel-body">
the data will be removed from the server's database. The data might still exist in backups for a limited
period of time. <p>
{% endblocktrans %} {% blocktrans trimmed %}
<strong> This feature allows you to remove personal data from this event. You will first select what kind of
{% blocktrans trimmed %} data you want to shred, then you are able to download the affected data and after you confirmed the
Using this will not remove the orders for your event, it just scrubs them of data that can be linked download, the data will be removed from the server's database. The data might still exist in backups for a
to individual persons. limited period of time.
{% endblocktrans %} {% endblocktrans %}
</strong> <strong>
</p> {% blocktrans trimmed %}
<div class="alert alert-legal"> Using this will not remove the orders for your event, it just scrubs them of data that can be
<strong> linked to individual persons.
{% blocktrans trimmed %} {% endblocktrans %}
It is within your own responsibility to check if you are allowed to delete the affected data in your </strong>
legislation, e.g. for reasons of taxation. In many countries, you need to keep some data in the live </p>
system in case of an audit. <div class="alert alert-legal">
{% endblocktrans %} <strong>
</strong> {% blocktrans trimmed %}
{% blocktrans trimmed %} It is within your own responsibility to check if you are allowed to delete the affected data in
For most categories of data, you will be able to partially download the data to store it offline. Some your legislation, e.g. for reasons of taxation. In many countries, you need to keep some data in the
kinds of data (such as some payment information) as well as historical log data cannot be downloaded at live system in case of an audit.
the moment. {% endblocktrans %}
{% endblocktrans %} </strong>
<div class="clear"></div> {% blocktrans trimmed %}
For most categories of data, you will be able to partially download the data to store it offline.
Some kinds of data (such as some payment information) as well as historical log data cannot be downloaded
at the moment.
{% endblocktrans %}
<div class="clear"></div>
</div>
</div>
</div> </div>
{% if constraints %} {% if constraints %}
<div class="alert alert-danger"> <div class="alert alert-danger">
@@ -42,10 +49,9 @@
</div> </div>
{% else %} {% else %}
<form action="{% url "control:event.shredder.export" event=request.event.slug organizer=request.organizer.slug %}" <form action="{% url "control:event.shredder.export" event=request.event.slug organizer=request.organizer.slug %}"
method="post" class="form-horizontal" data-asynctask> method="post" class="form-horizontal" data-asynctask>
<legend>{% trans "Data selection" %}</legend>
{% csrf_token %} {% csrf_token %}
<div class="panel-group" id="payment_accordion"> <div class="" id="payment_accordion">
{% for ident, shredder in shredders.items %} {% for ident, shredder in shredders.items %}
<div class="panel panel-default"> <div class="panel panel-default">
<label class="accordion-radio"> <label class="accordion-radio">

View File

@@ -111,6 +111,9 @@
.panel { .panel {
box-shadow:0 2px 5px 0 rgba(78,50,92,.1),0 1px 1px 0 rgba(0,0,0,.07); box-shadow:0 2px 5px 0 rgba(78,50,92,.1),0 1px 1px 0 rgba(0,0,0,.07);
} }
.panel-default {
border: none;
}
.panel-default > .panel-heading, .panel-default > .panel-footer { .panel-default > .panel-heading, .panel-default > .panel-footer {
background: white; background: white;
} }
@@ -127,6 +130,15 @@
.panel > .table-responsive table th:last-child { .panel > .table-responsive table th:last-child {
padding-right: $panel-body-padding; padding-right: $panel-body-padding;
} }
.panel > table td,
.panel > table th,
.panel > .table-responsive table td,
.panel > .table-responsive table th {
vertical-align: middle;
}
.panel-with-btn .panel-title {
line-height: 30px;
}
.panel-danger > .panel-heading, .panel-success > .panel-heading, .panel-default > .panel-heading, .panel-info > .panel-heading, .panel-warning > .panel-heading { .panel-danger > .panel-heading, .panel-success > .panel-heading, .panel-default > .panel-heading, .panel-info > .panel-heading, .panel-warning > .panel-heading {
color: #000000; color: #000000;

View File

@@ -2,8 +2,10 @@
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
align-items: flex-start; align-items: flex-start;
margin-left: -5px; margin-left: -10px;
margin-right: -5px; margin-right: -10px;
margin-bottom: 10px;
margin-top: -10px;
} }
.dashboard .widget-container { .dashboard .widget-container {
@@ -11,10 +13,10 @@
align-self: stretch; align-self: stretch;
padding: 15px 5px; padding: 15px 5px;
min-height: 160px; min-height: 160px;
margin: 5px; margin: 10px;
background: white; background: white;
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07); box-shadow:0 2px 5px 0 rgba(78,50,92,.1),0 1px 1px 0 rgba(0,0,0,.07);
border-radius: $panel-border-radius; border-radius: $panel-border-radius;
} }

View File

@@ -71,6 +71,11 @@ div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], d
@include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large); @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
} }
} }
.panel-body .submit-group {
box-shadow: none;
padding: 0;
}
.panel .form-group:last-child { .panel .form-group:last-child {
margin-bottom: 0; margin-bottom: 0;

View File

@@ -105,9 +105,7 @@ h1 .btn-sm {
.btn-toolbar { .btn-toolbar {
margin-bottom: 20px; margin-bottom: 20px;
} }
.container-fluid > .alert:first-child {
margin-top: 20px;
}
.flipped-scroll-wrapper { .flipped-scroll-wrapper {
overflow-y: auto; overflow-y: auto;
@@ -171,7 +169,7 @@ p.bigger {
} }
} }
.empty-collection { .empty-collection {
margin: 20px 0; padding: 40px 0;
text-align: center; text-align: center;
p { p {
@@ -566,6 +564,23 @@ ul.pagination {
.pagination-container { .pagination-container {
margin-bottom: 20px; margin-bottom: 20px;
} }
.panel {
ul.pagination {
margin: 0;
float: right;
}
ul.pagination-count {
float: left;
}
ul.pagination-select {
margin: auto;
float: none;
}
.pagination-container {
padding: 0;
margin: 0;
}
}
.table-payment-providers > tbody > tr > td { .table-payment-providers > tbody > tr > td {
vertical-align: middle; vertical-align: middle;