A11y improvements (#2081)

Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
This commit is contained in:
Richard Schreiber
2021-10-17 16:56:16 +02:00
committed by GitHub
parent cc13ca1c3f
commit 3dcfa57b70
61 changed files with 1505 additions and 990 deletions

View File

@@ -103,7 +103,11 @@ class CheckoutFieldRenderer(FieldRenderer):
if self.field_help:
help_text_and_errors.append(self.field_help)
for idx, text in enumerate(help_text_and_errors):
html += '<div class="help-block" id="help-for-{id}-{idx}">{text}</div>'.format(id=self.field.id_for_label, text=text, idx=idx)
if text.lower().startswith("<p>") or text.lower().startswith("<p "):
html_tag = "div"
else:
html_tag = "p"
html += '<{tag} class="help-block" id="help-for-{id}-{idx}">{text}</{tag}>'.format(id=self.field.id_for_label, text=text, idx=idx, tag=html_tag)
return html
def add_help_attrs(self, widget=None):

View File

@@ -57,17 +57,17 @@
{% block footer %}
{% endblock %}
<nav aria-label="{% trans "Footer Navigation" %}">
{% block footernav %}
{% endblock %}
{% if footer_text %}
{{ footer_text }}
&middot;
{% endif %}
{% for f in footer %}
<a href="{% safelink f.url %}" target="_blank" rel="noopener">{{ f.label }}</a>
&middot;
{% endfor %}
{% include "pretixpresale/base_footer.html" %} {# removing or hiding this might be in violation of pretix' license #}
<ul>
{% block footernav %}
{% endblock %}
{% if footer_text %}
<li>{{ footer_text }}</li>
{% endif %}
{% for f in footer %}
<li><a href="{% safelink f.url %}" target="_blank" rel="noopener">{{ f.label }}</a></li>
{% endfor %}
{% include "pretixpresale/base_footer.html" %} {# removing or hiding this might be in violation of pretix' license #}
</ul>
</nav>
</footer>
</div>

View File

@@ -1 +1 @@
{{ poweredby }} {# removing or hiding this might be in violation of pretix' license #}
<li>{{ poweredby }}</li> {# removing or hiding this might be in violation of pretix' license #}

View File

@@ -39,10 +39,14 @@
<div class="pull-right header-part flip hidden-print">
{% if event.settings.locales|length > 1 %}
<nav class="locales" aria-label="{% trans "select language" %}">
<ul>
{% for l in languages %}
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}{% if request.META.QUERY_STRING %}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow" lang="{{ l.code }}" hreflang="{{ l.code }}">
{{ l.name_local }}</a>
<li><a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}{% if request.META.QUERY_STRING %}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow" lang="{{ l.code }}" hreflang="{{ l.code }}"
aria-label="{% language l.code %}{% blocktrans trimmed with language=l.name_local %}
Website in {{ language }}
{% endblocktrans %}{% endlanguage %}">{{ l.name_local }}</a></li>
{% endfor %}
</ul>
</nav>
{% endif %}
{% include "pretixpresale/fragment_login_status.html" %}
@@ -66,19 +70,19 @@
<div class="{% if not event_logo or not event_logo_image_large %}pull-left flip{% endif %}">
{% if event_logo and event_logo_image_large %}
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}"
title="{{ event.name }}">
<img src="{{ event_logo|thumb:'1170x5000' }}" alt="{{ event.name }}" class="event-logo" />
aria-label="{% trans 'Homepage' %}" title="{% trans 'Homepage' %}">
<img src="{{ event_logo|thumb:'1170x5000' }}" alt="" class="event-logo" />
</a>
{% elif event_logo %}
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}"
title="{{ event.name }}">
<img src="{{ event_logo|thumb:'5000x120' }}" alt="{{ event.name }}" class="event-logo" />
aria-label="{% trans 'Homepage' %}" title="{% trans 'Homepage' %}">
<img src="{{ event_logo|thumb:'5000x120' }}" alt="" class="event-logo" />
</a>
{% else %}
<h1>
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}">{{ event.name }}</a>
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" aria-label="{% trans 'Homepage' %}">{{ event.name }}</a>
{% if request.event.settings.show_dates_on_frontpage and not event.has_subevents %}
<small>{{ event.get_date_range_display }}</small>
<small>{{ event.get_date_range_display_as_html }}</small>
{% endif %}
</h1>
{% endif %}
@@ -88,10 +92,14 @@
<div class="{% if not event_logo or not event_logo_image_large %}pull-right flip{% endif %} loginbox hidden-print">
{% if event.settings.locales|length > 1 %}
<nav class="locales" aria-label="{% trans "select language" %}">
<ul>
{% for l in languages %}
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}{% if request.META.QUERY_STRING %}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow">
{{ l.name_local }}</a>
<li><a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}{% if request.META.QUERY_STRING %}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow" lang="{{ l.code }}" hreflang="{{ l.code }}"
aria-label="{% language l.code %}{% blocktrans trimmed with language=l.name_local %}
Website in {{ language }}
{% endblocktrans %}{% endlanguage %}">{{ l.name_local }}</a></li>
{% endfor %}
</ul>
</nav>
{% endif %}
{% include "pretixpresale/fragment_login_status.html" %}
@@ -103,22 +111,27 @@
{% if request.event.testmode %}
{% if request.sales_channel.testmode_supported %}
<div class="alert alert-warning">
<strong>
<p><strong><span class="sr-only">{% trans "Warning" context "alert-messages" %}:</span>
{% trans "This ticket shop is currently in test mode. Please do not perform any real purchases as your order might be deleted without notice." %}
</strong>
</strong></p>
</div>
{% else %}
<div class="alert alert-danger">
<strong>
<p><strong><span class="sr-only">{% trans "Warning" context "alert-messages" %}:</span>
{% trans "Orders made through this sales channel cannot be deleted - even if the ticket shop is in test mode!" %}
</strong>
</strong></p>
</div>
{% endif %}
{% endif %}
{% if messages %}
{% for message in messages %}
<div class="alert {{ message.tags }}">
<div class="alert {{ message.tags }}"{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %} id="error-message"{% endif %}>
<p>
{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}<span class="sr-only">{% trans "Error" context "alert-messages" %}:</span>{% endif %}
{% if message.level == DEFAULT_MESSAGE_LEVELS.WARNING %}<span class="sr-only">{% trans "Warning" context "alert-messages" %}:</span>{% endif %}
{% if message.level == DEFAULT_MESSAGE_LEVELS.INFO %}<span class="sr-only">{% trans "Information" context "alert-messages" %}:</span>{% endif %}
{{ message }}
</p>
</div>
{% endfor %}
{% endif %}
@@ -139,25 +152,24 @@
{% if request.event.testmode %}
{% if request.sales_channel.testmode_supported %}
<div class="alert alert-testmode alert-warning">
<strong>
<p><strong><span class="sr-only">{% trans "Warning" context "alert-messages" %}:</span>
{% trans "This ticket shop is currently in test mode. Please do not perform any real purchases as your order might be deleted without notice." %}
</strong>
</strong></p>
</div>
{% else %}
<div class="alert alert-testmode alert-danger">
<strong>
<p><strong><span class="sr-only">{% trans "Warning" context "alert-messages" %}:</span>
{% trans "Orders made through this sales channel cannot be deleted - even if the ticket shop is in test mode!" %}
</strong>
</strong></p>
</div>
{% endif %}
{% endif %}
{% endblock %}
{% block footernav %}
{% if request.event.settings.contact_mail %}
<a href="mailto:{{ request.event.settings.contact_mail }}">{% trans "Contact event organizer" %}</a> &middot;
<li><a href="mailto:{{ request.event.settings.contact_mail }}">{% trans "Contact event organizer" %}</a></li>
{% endif %}
{% if request.event.settings.imprint_url %}
<a href="{% safelink request.event.settings.imprint_url %}" target="_blank" rel="noopener">{% trans "Imprint" %}</a>
&middot;
<li><a href="{% safelink request.event.settings.imprint_url %}" target="_blank" rel="noopener">{% trans "Imprint" %}</a></li>
{% endif %}
{% endblock %}

View File

@@ -16,19 +16,20 @@
{% for form in forms %}
<details class="panel panel-default" open>
<summary class="panel-heading">
<h4 class="panel-title">
<h3 class="panel-title">
<span class="sr-only">{% trans "Add-ons:" %}</span>
<strong>{{ form.item.name }}{% if form.variation %}
{{ form.variation }}
{% endif %}</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</h4>
</h3>
</summary>
<div id="cp{{ form.cartpos.pk }}">
<div class="panel-body">
{% if form.cartpos.subevent %}
<p>
<span class="fa fa-calendar" aria-hidden="true"></span>
{{ form.cartpos.subevent.name }} &middot; {{ form.cartpos.subevent.get_date_range_display }}
{{ form.cartpos.subevent.name }} &middot; {{ form.cartpos.subevent.get_date_range_display_as_html }}
{% if form.cartpos.event.settings.show_times %}
<span class="fa fa-clock-o" aria-hidden="true"></span>
{{ form.cartpos.subevent.date_from|date:"TIME_FORMAT" }}
@@ -41,29 +42,35 @@
{% if c.category.description %}
{{ c.category.description|rich_text }}
{% endif %}
<p>
{% if c.min_count == c.max_count %}
<p>
{% blocktrans trimmed count min_count=c.min_count %}
You need to choose exactly one option from this category.
{% plural %}
You need to choose {{ min_count }} options from this category.
{% endblocktrans %}
</p>
{% elif c.min_count == 0 and c.max_count >= c.items|length and not c.multi_allowed %}
{% elif c.min_count == 0 %}
{% blocktrans trimmed with max_count=c.max_count %}
<p>
{% blocktrans trimmed count max_count=c.max_count %}
You can choose {{ max_count }} option from this category.
{% plural %}
You can choose up to {{ max_count }} options from this category.
{% endblocktrans %}
</p>
{% else %}
<p>
{% blocktrans trimmed with min_count=c.min_count max_count=c.max_count %}
You can choose between {{ min_count }} and {{ max_count }} options from
this category.
{% endblocktrans %}
</p>
{% endif %}
</p>
{% for item in c.items %}
{% if item.has_variations %}
<details class="item-with-variations" {% if event.settings.show_variations_expanded or item.expand %}open{% endif %}>
<summary class="row-fluid product-row headline">
<article aria-labelledby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-description"{% endif %} class="item-with-variations{% if event.settings.show_variations_expanded %} details-open{% endif %}" id="item-{{ item.pk }}">
<div class="row-fluid product-row headline">
<div class="col-md-8 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
@@ -75,13 +82,9 @@
</a>
{% endif %}
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h4>
<a href="#" data-toggle="variations">
{{ item.name }}
</a>
</h4>
<h4 id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-legend">{{ item.name }}</h4>
{% if item.description %}
<div class="product-description">
<div id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-description" class="product-description">
{{ item.description|localize|rich_text }}
</div>
{% endif %}
@@ -97,38 +100,45 @@
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<p>
{% if c.price_included %}
<span class="sr-only">{% trans "free" context "price" %}</span>
{% elif item.free_price %}
{% blocktrans trimmed with price=item.min_price|money:event.currency %}
from {{ price }}
{% endblocktrans %}
{% elif item.min_price != item.max_price %}
{{ item.min_price|money:event.currency }} {{ item.max_price|money:event.currency }}
<span class="sr-only">
{% blocktrans trimmed with from_price=item.min_price|money:event.currency to_price=item.max_price|money:event.currency %}
from {{ from_price }} to {{ to_price }}
{% endblocktrans %}
</span>
<span aria-hidden="true">{{ item.min_price|money:event.currency }} {{ item.max_price|money:event.currency }}</span>
{% elif not item.min_price and not item.max_price %}
{% else %}
{{ item.min_price|money:event.currency }}
{% endif %}
</p>
</div>
<div class="col-md-2 col-xs-6 availability-box">
{% if not event.settings.show_variations_expanded %}
<a href="#" data-toggle="variations" class="js-only">
{% trans "Show variants" %}
</a>
<button type="button" data-toggle="variations" class="btn btn-link js-only"
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{item}}{% endblocktrans %}">
{% trans "Show variants" %}
</button>
{% endif %}
</div>
<div class="clearfix"></div>
</summary>
</div>
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
{% for var in item.available_variations %}
<div class="row-fluid product-row variation">
<article aria-labelledby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row-fluid product-row variation">
<div class="col-md-8 col-xs-12">
<h5>
<label for="cp_{{ form.cartpos.pk }}_variation_{{ item.pk }}_{{ var.pk }}">
{{ var }}
</label>
</h5>
<h5 id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
{% if var.description %}
<div class="variation-description">
<div id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
{{ var.description|localize|rich_text }}
</div>
{% endif %}
@@ -139,12 +149,14 @@
<div class="col-md-2 col-xs-6 price">
{% if not c.price_included %}
{% if var.original_price %}
<del><span class="sr-only">{% trans "Orignal price:" %}</span>
{% if event.settings.display_net_prices %}
<del>{{ var.original_price.net|money:event.currency }}</del>
{{ var.original_price.net|money:event.currency }}
{% else %}
<del>{{ var.original_price.gross|money:event.currency }}</del>
{{ var.original_price.gross|money:event.currency }}
{% endif %}
<ins>
</del>
<ins><span class="sr-only">{% trans "New price:" %}</span>
{% endif %}
{% if item.free_price %}
<div class="input-group input-group-price">
@@ -182,6 +194,8 @@
incl. {{ rate }}% {{ name }}
{% endblocktrans %}</small>
{% endif %}
{% else %}
<span class="sr-only">{% trans "free" context "price" %}</span>
{% endif %}
</div>
{% if var.cached_availability.0 == 100 or var.initial %}
@@ -193,27 +207,27 @@
id="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_{{ var.id }}"
name="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_{{ var.id }}"
data-exclusive-prefix="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_"
title="{% blocktrans with item=item.name var=var.name %}Amount of {{ item }} {{ var }} to order{% endblocktrans %}">
aria-label="{% blocktrans with item=item.name var=var %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}">
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if var.initial %}value="{{ var.initial }}"{% endif %}
max="{{ c.max_count }}"
pattern="\d*"
id="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_{{ var.id }}"
name="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_{{ var.id }}">
name="cp_{{ form.cartpos.pk }}_variation_{{ item.id }}_{{ var.id }}"
aria-label="{% blocktrans with item=item.name var=var %}Quantity of {{ item }}, {{ var }} to order{% endblocktrans %}">
{% endif %}
</div>
{% else %}
{% include "pretixpresale/event/fragment_availability.html" with price=var.display_price.gross avail=var.cached_availability.0 event=event item=item var=var %}
{% endif %}
<div class="clearfix"></div>
</div>
</article>
{% endfor %}
</div>
</details>
</article>
{% else %}
<div class="row-fluid product-row simple">
<article aria-labelledby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-description"{% endif %} class="row-fluid product-row simple">
<div class="col-md-8 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
@@ -225,11 +239,9 @@
</a>
{% endif %}
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h4>
<label for="cp_{{ form.cartpos.pk }}_item_{{ item.id }}">{{ item.name }}</label>
</h4>
<h4 id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-legend">{{ item.name }}</h4>
{% if item.description %}
<div class="product-description">
<div id="cp-{{ form.cartpos.pk }}-item-{{ item.pk }}-description" class="product-description">
{{ item.description|localize|rich_text }}
</div>
{% endif %}
@@ -248,14 +260,17 @@
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<p>
{% if not c.price_included %}
{% if item.original_price %}
<del><span class="sr-only">{% trans "Orignal price:" %}</span>
{% if event.settings.display_net_prices %}
<del>{{ item.original_price.net|money:event.currency }}</del>
{{ item.original_price.net|money:event.currency }}
{% else %}
<del>{{ item.original_price.gross|money:event.currency }}</del>
{{ item.original_price.gross|money:event.currency }}
{% endif %}
<ins>
</del>
<ins><span class="sr-only">{% trans "New price:" %}</span>
{% endif %}
{% if item.free_price %}
<div class="input-group input-group-price">
@@ -291,7 +306,10 @@
incl. {{ rate }}% {{ name }}
{% endblocktrans %}</small>
{% endif %}
{% else %}
<span class="sr-only">{% trans "free" context "price" %}</span>
{% endif %}
</p>
</div>
{% if item.cached_availability.0 == 100 or item.initial %}
<div class="col-md-2 col-xs-6 availability-box available">
@@ -300,23 +318,25 @@
<input type="checkbox" value="1"
{% if item.initial %}checked="checked"{% endif %}
name="cp_{{ form.cartpos.pk }}_item_{{ item.id }}"
id="cp_{{ form.cartpos.pk }}_item_{{ item.id }}">
id="cp_{{ form.cartpos.pk }}_item_{{ item.id }}"
aria-label="{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}"
{% if item.description %} aria-describedby="cp-{{ form.cartpos.pk }}-item-{{ item.id }}-description"{% endif %}>
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
pattern="\d*"
max="{{ c.max_count }}"
{% if item.initial %}value="{{ item.initial }}"{% endif %}
name="cp_{{ form.cartpos.pk }}_item_{{ item.id }}"
id="cp_{{ form.cartpos.pk }}_item_{{ item.id }}"
title="{% blocktrans with item=item.name %}Amount of {{ item }} to order{% endblocktrans %}">
aria-label="{% blocktrans with item=item.name %}Quantity of {{ item }} to order{% endblocktrans %}"
{% if item.description %} aria-describedby="cp-{{ form.cartpos.pk }}-item-{{ item.id }}-description"{% endif %}>
{% endif %}
</div>
{% else %}
{% include "pretixpresale/event/fragment_availability.html" with price=item.display_price.gross avail=item.cached_availability.0 event=event item=item var=0 %}
{% endif %}
<div class="clearfix"></div>
</div>
</article>
{% endif %}
{% endfor %}
</fieldset>

View File

@@ -15,12 +15,12 @@
<aside aria-label="{% trans "Your cart" %}">
<details class="panel panel-default cart" {% if "open_cart" in request.GET %}open{% endif %}>
<summary class="panel-heading">
<h3 class="panel-title">
<h2 class="panel-title">
<span>
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
<strong>{% trans "Your cart" %}</strong>
</span>
<span>
<span aria-hidden="true">
<strong id="cart-deadline-short" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{{ cart.minutes_left|stringformat:"02d" }}:{{ cart.seconds_left|stringformat:"02d" }}
@@ -30,20 +30,11 @@
</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</span>
</h3>
</h2>
</summary>
<div>
<div class="panel-body">
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event %}
<em id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you." %}
{% endif %}
</em>
</div>
</div>
</details>

View File

@@ -36,20 +36,6 @@
</div>
<div class="panel-body">
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %}
<div class="cart-row row">
<div class="col-md-6 col-xs-12">
<em id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you." %}
{% endif %}
</em>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
{% if payment_provider %}
@@ -173,17 +159,17 @@
</div>
</div>
{% if confirm_messages %}
<div class="panel panel-primary panel-confirm">
<div class="panel panel-primary panel-confirm" role="group" aria-labelledby="confirm_heading">
<div class="panel-heading">
<h3 class="panel-title">
<h3 class="panel-title" id="confirm_heading">
{% trans "Confirmations" %}
</h3>
</div>
<div class="panel-body">
{% for key, desc in confirm_messages.items %}
<div class="checkbox">
<label>
<input type="checkbox" class="checkbox" value="yes" name="confirm_{{ key }}" required>
<label for="input_confirm_{{ key }}">
<input type="checkbox" class="checkbox" value="yes" name="confirm_{{ key }}" id="input_confirm_{{ key }}" required>
{{ desc|safe }}
</label>
</div>

View File

@@ -9,19 +9,18 @@
{% csrf_token %}
<div class="panel-group" id="customer">
<div class="panel panel-default">
<label class="accordion-radio">
<div class="accordion-radio">
<div class="panel-heading">
<h4 class="panel-title">
<p class="panel-title">
<input type="radio" name="customer_mode" value="login"
data-parent="#customer"
{% if selected == "login" or not signup_allowed %}checked="checked"{% endif %}
id="input_customer_login"
data-toggle="radiocollapse" data-target="#customer_login"/>
<strong>
{% trans "Log in with a customer account" %}
</strong>
</h4>
<label for="input_customer_login"><strong>{% trans "Log in with a customer account" %}</strong></label>
</p>
</div>
</label>
</div>
<div id="customer_login"
class="panel-collapse collapsed {% if selected == "login" or not signup_allowed %}in{% endif %}">
<div class="panel-body form-horizontal">
@@ -67,19 +66,18 @@
</div>
{% if signup_allowed %}
<div class="panel panel-default">
<label class="accordion-radio">
<div class="accordion-radio">
<div class="panel-heading">
<h4 class="panel-title">
<p class="panel-title">
<input type="radio" name="customer_mode" value="register"
data-parent="#customer"
{% if selected == "register" %}checked="checked"{% endif %}
id="input_customer_register"
data-toggle="radiocollapse" data-target="#customer_register"/>
<strong>
{% trans "Create a new customer account" %}
</strong>
</h4>
<label for="input_customer_register"><strong>{% trans "Create a new customer account" %}</strong></label>
</p>
</div>
</label>
</div>
<div id="customer_register"
class="panel-collapse collapsed {% if selected == "register" %}in{% endif %}">
<div class="panel-body form-horizontal">
@@ -97,19 +95,19 @@
{% endif %}
{% if guest_allowed %}
<div class="panel panel-default">
<label class="accordion-radio">
<div class="accordion-radio">
<div class="panel-heading">
<h4 class="panel-title">
<p class="panel-title">
<input type="radio" name="customer_mode" value="guest"
data-parent="#customer"
{% if selected == "guest" %}checked="checked"{% endif %}
id="input_customer_guest"
aria-describedby="customer_guest"
data-toggle="radiocollapse" data-target="#customer_guest"/>
<strong>
{% trans "Continue as a guest" %}
</strong>
</h4>
<label for="input_customer_guest"><strong>{% trans "Continue as a guest" %}</strong></label>
</p>
</div>
</label>
</div>
<div id="customer_guest"
class="panel-collapse collapsed {% if selected == "guest" %}in{% endif %}">
<div class="panel-body form-horizontal">

View File

@@ -53,7 +53,7 @@
</label>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
{{ form.position.subevent.name }} &middot; {{ form.position.subevent.get_date_range_display }}
{{ form.position.subevent.name }} &middot; {{ form.position.subevent.get_date_range_display_as_html }}
{% if form.position.event.settings.show_times %}
<span data-time="{{ form.position.subevent.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}">
<span class="fa fa-clock-o" aria-hidden="true"></span>

View File

@@ -13,9 +13,9 @@
<div class="panel-group" id="payment_accordion">
{% for p in providers %}
<div class="panel panel-default" data-total="{{ p.total|floatformat:2 }}">
<label class="accordion-radio">
<div class="accordion-radio">
<div class="panel-heading">
<h4 class="panel-title">
<p class="panel-title">
{% if show_fees %}
<strong class="pull-right flip">{% if p.fee < 0 %}-{% else %}+{% endif %} {{ p.fee|money:event.currency|cut:"-" }}</strong>
{% endif %}
@@ -23,33 +23,39 @@
title="{{ p.provider.public_name }}"
data-parent="#payment_accordion"
{% if selected == p.provider.identifier %}checked="checked"{% endif %}
id="input_payment_{{ p.provider.identifier }}"
aria-describedby="payment_{{ p.provider.identifier }}"
data-toggle="radiocollapse" data-target="#payment_{{ p.provider.identifier }}"/>
<strong>{{ p.provider.public_name }}</strong>
</h4>
<label for="input_payment_{{ p.provider.identifier }}"><strong>{{ p.provider.public_name }}</strong></label>
</p>
</div>
</label>
</div>
<div id="payment_{{ p.provider.identifier }}"
class="panel-collapse collapsed {% if selected == p.provider.identifier %}in{% endif %}">
<div class="panel-body form-horizontal">
{% if request.event.testmode %}
{% if p.provider.test_mode_message %}
<div class="alert alert-info">
{{ p.provider.test_mode_message }}
<p>{{ p.provider.test_mode_message }}</p>
</div>
{% if not request.sales_channel.testmode_supported %}
<div class="alert alert-danger">
<p>
{% trans "This sales channel does not provide support for test mode." %}
<strong>
{% trans "If you continue, you might pay an actual order with non-existing money!" %}
</strong>
</p>
</div>
{% endif %}
{% else %}
<div class="alert alert-warning">
<p>
{% trans "This payment provider does not provide support for test mode." %}
<strong>
{% trans "If you continue, actual money might be transferred." %}
</strong>
</p>
</div>
{% endif %}
{% endif %}

View File

@@ -19,10 +19,10 @@
<div class="panel-group" id="questions_group">
<details class="panel panel-default" open>
<summary class="panel-heading">
<h4 class="panel-title">
<h3 class="panel-title">
<strong>{% trans "Contact information" %}</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</h4>
</h3>
</summary>
<div id="contact">
<div class="panel-body">
@@ -36,13 +36,13 @@
{% if invoice_address_asked %}
<details class="panel panel-default" {% if event.settings.invoice_address_required or event.settings.invoice_name_required %}open{% endif %}>
<summary class="panel-heading">
<h4 class="panel-title">
<h3 class="panel-title">
<strong>{% trans "Invoice information" %}{% if not event.settings.invoice_address_required and not event.settings.invoice_name_required %}
{% trans "(optional)" %}
{% endif %}</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</h4>
</h3>
</summary>
{% if addresses_data %}
{{ addresses_data|json_script:"addresses_json" }}
@@ -77,7 +77,7 @@
{% for pos, forms in formgroups %}
<details class="panel panel-default" open>
<summary class="panel-heading">
<h4 class="panel-title">
<h3 class="panel-title">
<strong>{{ pos.item.name }}
{% if pos.variation %}
{{ pos.variation }}
@@ -93,7 +93,7 @@
{% else %}
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
{% endif %}
</h4>
</h3>
</summary>
<div>
<div class="panel-body questions-form">
@@ -135,7 +135,7 @@
</label>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
{{ pos.subevent.name }} &middot; {{ pos.subevent.get_date_range_display }}
{{ pos.subevent.name }} &middot; {{ pos.subevent.get_date_range_display_as_html }}
{% if pos.event.settings.show_times %}
<span data-time="{{ pos.subevent.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}">
<span class="fa fa-clock-o" aria-hidden="true"></span>

View File

@@ -4,348 +4,397 @@
{% load rich_text %}
{% load money %}
{% blocktrans asvar s_taxes %}taxes{% endblocktrans %}
{% for line in cart.positions %}
<div class="row cart-row {% if download %}has-downloads{% endif %}{% if editable %}editable{% endif %}">
<div class="product">
{% if line.addon_to %}
<span class="addon-signifier">+</span>
<div role="table" aria-label="{% trans "Your cart" %}" aria-describedby="{% if cart.is_ordered %}cart-description{% else%}cart-deadline{% endif %}" aria-rowcount="{{ cart.positions|length|add:2 }}">
<div class="sr-only" role="rowgroup">
<div class="sr-only" role="row">
<span role="columnheader" aria-sort="none">{% trans "Product" %}</span>
{% if download %}
<span role="columnheader" aria-sort="none">{% trans "Ticket download" %}</span>
{% else %}
<span role="columnheader" aria-sort="none">{% trans "Price per item" %}</span>
{% endif %}
<strong>{{ line.item.name }}</strong>
{% if line.variation %}
{{ line.variation }}
{% endif %}
{% if line.seat %}
<div class="cart-icon-details">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="14" viewBox="0 0 4.7624999 3.7041668" class="svg-icon">
<path
d="m 1.9592032,1.8522629e-4 c -0.21468,0 -0.38861,0.17394000371 -0.38861,0.38861000371 0,0.21466 0.17393,0.38861 0.38861,0.38861 0.21468,0 0.3886001,-0.17395 0.3886001,-0.38861 0,-0.21467 -0.1739201,-0.38861000371 -0.3886001,-0.38861000371 z m 0.1049,0.84543000371 c -0.20823,-0.0326 -0.44367,0.12499 -0.39998,0.40462997 l 0.20361,1.01854 c 0.0306,0.15316 0.15301,0.28732 0.3483,0.28732 h 0.8376701 v 0.92708 c 0,0.29313 0.41187,0.29447 0.41187,0.005 v -1.19115 c 0,-0.14168 -0.0995,-0.29507 -0.29094,-0.29507 l -0.65578,-10e-4 -0.1757,-0.87644 C 2.3042533,0.95300523 2.1890432,0.86500523 2.0641032,0.84547523 Z m -0.58549,0.44906997 c -0.0946,-0.0134 -0.20202,0.0625 -0.17829,0.19172 l 0.18759,0.91054 c 0.0763,0.33956 0.36802,0.55914 0.66042,0.55914 h 0.6015201 c 0.21356,0 0.21448,-0.32143 -0.003,-0.32143 H 2.1954632 c -0.19911,0 -0.36364,-0.11898 -0.41341,-0.34107 l -0.17777,-0.87126 c -0.0165,-0.0794 -0.0688,-0.11963 -0.12557,-0.12764 z"/>
</svg>
{{ line.seat }}
</div>
{% endif %}
{% if line.voucher %}
<div class="cart-icon-details">
<span class="fa fa-tags fa-fw" aria-hidden="true"></span> {% trans "Voucher code used:" %} {{ line.voucher.code }}
</div>
{% endif %}
{% if line.subevent %}
<div class="cart-icon-details">
<span class="fa fa-calendar fa-fw" aria-hidden="true"></span> {{ line.subevent.name }}
<br>
<span class="text-muted">
{{ line.subevent.get_date_range_display }}
{% if event.settings.show_times %}
&middot; <span data-time="{{ line.subevent.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}" data-time-short>
{{ line.subevent.get_time_range_display }}
</span>
{% endif %}
</span>
</div>
{% if line.subevent.location %}
{% if not line.addon_to or line.addon_to.subevent_id != line.subevent_id %}
<div class="cart-icon-details collapse-lines" data-expand-text="{% trans "Show full location" %}">
<span class="content text-muted" id="full-location-{{ line.pk }}">{{ line.subevent.location|linebreaksbr }}</span>
<span role="columnheader" aria-sort="none">{% trans "Price total" %}</span>
</div>
</div>
<div role="rowgroup">
{% for line in cart.positions %}
<div role="row" class="row cart-row {% if download %}has-downloads{% endif %}{% if editable %}editable{% endif %}">
<div role="cell" class="product">
<p>
{% if line.addon_to %}
<span class="addon-signifier">+</span>
{% endif %}
<strong>{{ line.item.name }}</strong>
{% if line.variation %}
{{ line.variation }}
{% endif %}
</p>
{% if line.seat or line.voucher or line.subevent or line.used_membership%}
<dl class="dl-inline">
{% endif %}
{% if line.seat %}
<div class="cart-icon-details">
<dt class="sr-only">{% trans "Seat:" %}</dt>
<dd>
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="14" viewBox="0 0 4.7624999 3.7041668" class="svg-icon">
<path
d="m 1.9592032,1.8522629e-4 c -0.21468,0 -0.38861,0.17394000371 -0.38861,0.38861000371 0,0.21466 0.17393,0.38861 0.38861,0.38861 0.21468,0 0.3886001,-0.17395 0.3886001,-0.38861 0,-0.21467 -0.1739201,-0.38861000371 -0.3886001,-0.38861000371 z m 0.1049,0.84543000371 c -0.20823,-0.0326 -0.44367,0.12499 -0.39998,0.40462997 l 0.20361,1.01854 c 0.0306,0.15316 0.15301,0.28732 0.3483,0.28732 h 0.8376701 v 0.92708 c 0,0.29313 0.41187,0.29447 0.41187,0.005 v -1.19115 c 0,-0.14168 -0.0995,-0.29507 -0.29094,-0.29507 l -0.65578,-10e-4 -0.1757,-0.87644 C 2.3042533,0.95300523 2.1890432,0.86500523 2.0641032,0.84547523 Z m -0.58549,0.44906997 c -0.0946,-0.0134 -0.20202,0.0625 -0.17829,0.19172 l 0.18759,0.91054 c 0.0763,0.33956 0.36802,0.55914 0.66042,0.55914 h 0.6015201 c 0.21356,0 0.21448,-0.32143 -0.003,-0.32143 H 2.1954632 c -0.19911,0 -0.36364,-0.11898 -0.41341,-0.34107 l -0.17777,-0.87126 c -0.0165,-0.0794 -0.0688,-0.11963 -0.12557,-0.12764 z"/>
</svg>
{{ line.seat }}
</dd>
</div>
{% endif %}
{% if line.voucher %}
<div class="cart-icon-details">
<dt><span class="fa fa-tags fa-fw" aria-hidden="true"></span> {% trans "Voucher code used:" %}</dt>
<dd>{{ line.voucher.code }}</dd>
</div>
{% endif %}
{% endif %}
{% if line.used_membership %}
<div class="cart-icon-details">
<span class="fa fa-id-card fa-fw" aria-hidden="true"></span> {{ line.used_membership }}
</div>
{% endif %}
{% if line.issued_gift_cards %}
<dl>
{% for gc in line.issued_gift_cards.all %}
<dt>{% trans "Gift card code" %}</dt>
<dd>{{ gc.secret }}</dd>
{% endfor %}
</dl>
{% endif %}
{% if line.has_questions %}
<dl>
{% if line.item.admission and event.settings.attendee_names_asked %}
<dt class="sr-only">
{% trans "Attendee name" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee name" %}">
{% if line.attendee_name %}{{ line.attendee_name }}{% else %}<em>{% trans "No attendee name provided" %}</em>{% endif %}
</span>
</dd>
{% endif %}
{% if line.item.admission and event.settings.attendee_emails_asked and line.attendee_email %}
<dt class="sr-only">
{% trans "Attendee email" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee email" %}">
{{ line.attendee_email }}
</span>
</dd>
{% endif %}
{% if line.item.admission and event.settings.attendee_addresses_asked %}
<br>
{% endif %}
{% if line.item.admission and event.settings.attendee_company_asked and line.company %}
<dt class="sr-only">
{% trans "Attendee company" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee company" %}">
{{ line.company }}
</span>
</dd>
{% endif %}
{% if line.item.admission and event.settings.attendee_addresses_asked %}
{% if line.street or line.zipcode or line.city %}
<dt class="sr-only">
{% trans "Attendee address" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee address" %}">
{{ line.street|default_if_none:""|linebreaksbr }}<br>
{{ line.zipcode|default_if_none:"" }} {{ line.city|default_if_none:"" }}<br>
{{ line.country.name|default_if_none:"" }}
{% if line.state %}<br>{{ line.state }}{% endif %}
</span>
</dd>
{% endif %}
{% endif %}
{% for q in line.questions %}
<dt>{{ q.question }}</dt>
{% if line.subevent %}
<div class="cart-icon-details">
<dt class="sr-only">{% trans "Date:" context "subevent" %}</dt>
<dd>
{% if q.answer %}
{% if q.answer.file %}
<span class="fa fa-file" aria-hidden="true"></span>
<a href="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}">
{{ q.answer.file_name }}
</a>
{% if q.answer.is_image %}
<br>
<a href="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}" data-lightbox="order"
class="answer-thumb">
<img src="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}">
</a>
{% endif %}
{% elif q.type == "M" %}
{{ q.answer|rich_text_snippet }}
{% else %}
{{ q.answer|linebreaksbr }}
{% endif %}
{% else %}
<em>{% trans "not answered" %}</em>
<span class="fa fa-calendar fa-fw" aria-hidden="true"></span> {{ line.subevent.name }}
<br>
<span class="text-muted" aria-hidden="true">
{{ line.subevent.get_date_range_display }}
{% if event.settings.show_times %}
&middot; <span data-time="{{ line.subevent.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}" data-time-short>
{{ line.subevent.get_time_range_display }}
</span>
{% endif %}
</span>
<span class="sr-only">
<time datetime="{% if event.settings.show_times %}{{ line.subevent.date_from.isoformat }}{% else %}{{ line.subevent.date_from|date:"Y-m-d" }}{% endif %}">{{ line.subevent.get_date_from_display }}</time>
{% if event.settings.show_date_to and line.subevent.date_to %}
<time datetime="{% if event.settings.show_times %}{{ line.subevent.date_to.isoformat }}{% else %}{{ line.subevent.date_to|date:"Y-m-d" }}{% endif %}">{{ line.subevent.get_date_to_display }}</time>
{% endif %}
</span>
</dd>
{% endfor %}
{% for q in line.additional_answers %}
<dt>{{ q.question }}</dt>
<dd>{% if q.answer %}{{ q.answer|linebreaksbr }}{% else %}<em>{% trans "not answered" %}</em>{% endif %}</dd>
{% endfor %}
</dl>
{% endif %}
</div>
</div>
{% if line.subevent.location %}
{% if not line.addon_to or line.addon_to.subevent_id != line.subevent_id %}
<div class="cart-icon-details">
<dt class="sr-only">{% trans "Location:" %}</dt>
<dd>
<div class="collapse-lines" data-expand-text="{% trans "Show full location" %}" aria-hidden="true">
<span class="content text-muted" id="full-location-{{ line.pk }}">{{ line.subevent.location|linebreaksbr }}</span>
</div>
<div class="sr-only">{{ line.subevent.location|linebreaksbr }}</div>
</dd>
</div>
{% endif %}
{% endif %}
{% endif %}
{% if line.used_membership %}
<div class="cart-icon-details">
<dt class="sr-only">{% trans "Membership:" %}</dt>
<dd>
<span class="fa fa-id-card fa-fw" aria-hidden="true"></span> {{ line.used_membership }}
</dd>
</div>
{% endif %}
{% if line.seat or line.voucher or line.subevent or line.used_membership%}
</dl>
{% endif %}
{% if download %}
<div class="download-desktop">
{% if line.generate_ticket %}
{% for b in download_buttons %}
<form action="{% if position_page and line.addon_to %}{% eventurl event "presale:event.order.position.download" secret=line.addon_to.web_secret order=order.code output=b.identifier pid=line.pk position=line.addon_to.positionid %}{% elif position_page %}{% eventurl event "presale:event.order.position.download" secret=line.web_secret order=order.code output=b.identifier pid=line.pk position=line.positionid %}{% else %}{% eventurl event "presale:event.order.download" secret=order.secret order=order.code output=b.identifier position=line.pk %}{% endif %}"
method="post" data-asynctask data-asynctask-download class="download-btn-form{% if b.javascript_required %} requirejs{% endif %}">
{% if line.issued_gift_cards.exists %}
<dl class="dl-indented">
{% for gc in line.issued_gift_cards.all %}
<dt>{% trans "Gift card code" %}</dt>
<dd>{{ gc.secret }}</dd>
{% endfor %}
</dl>
{% endif %}
{% if line.has_questions %}
<dl class="dl-indented">
{% if line.item.admission %}
{% if event.settings.attendee_names_asked %}
<dt class="sr-only">
{% trans "Attendee name" %}
</dt>
<dd class="toplevel{% if event.settings.attendee_addresses_asked and not event.settings.attendee_emails_asked %} blank-after{% endif %}">
<span data-toggle="tooltip" title="{% trans "Attendee name" %}">
{% if line.attendee_name %}{{ line.attendee_name }}{% else %}<em>{% trans "No attendee name provided" %}</em>{% endif %}
</span>
</dd>
{% endif %}
{% if event.settings.attendee_emails_asked and line.attendee_email %}
<dt class="sr-only">
{% trans "Attendee email" %}
</dt>
<dd class="toplevel{% if event.settings.attendee_addresses_asked %} blank-after{% endif %}">
<span data-toggle="tooltip" title="{% trans "Attendee email" %}">
{{ line.attendee_email }}
</span>
</dd>
{% endif %}
{% if event.settings.attendee_company_asked and line.company %}
<dt class="sr-only">
{% trans "Attendee company" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee company" %}">
{{ line.company }}
</span>
</dd>
{% endif %}
{% if event.settings.attendee_addresses_asked %}
{% if line.street or line.zipcode or line.city %}
<dt class="sr-only">
{% trans "Attendee address" %}
</dt>
<dd class="toplevel">
<span data-toggle="tooltip" title="{% trans "Attendee address" %}">
{{ line.street|default_if_none:""|linebreaksbr }}<br>
{{ line.zipcode|default_if_none:"" }} {{ line.city|default_if_none:"" }}<br>
{{ line.country.name|default_if_none:"" }}
{% if line.state %}<br>{{ line.state }}{% endif %}
</span>
</dd>
{% endif %}
{% endif %}
{% endif %}
{% for q in line.questions %}
<dt>{{ q.question }}</dt>
<dd>
{% if q.answer %}
{% if q.answer.file %}
<span class="fa fa-file" aria-hidden="true"></span>
<a href="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}">
{{ q.answer.file_name }}
</a>
{% if q.answer.is_image %}
<br>
<a href="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}" data-lightbox="order"
class="answer-thumb">
<img src="{{ q.answer.frontend_file_url }}?token={% answer_token request q.answer %}" alt="{% trans "The image you previously uploaded" %}">
</a>
{% endif %}
{% elif q.type == "M" %}
{{ q.answer|rich_text_snippet }}
{% else %}
{{ q.answer|linebreaksbr }}
{% endif %}
{% else %}
<em>{% trans "not answered" %}</em>
{% endif %}
</dd>
{% endfor %}
{% for q in line.additional_answers %}
<dt>{{ q.question }}</dt>
<dd>{% if q.answer %}{{ q.answer|linebreaksbr }}{% else %}<em>{% trans "not answered" %}</em>{% endif %}</dd>
{% endfor %}
</dl>
{% endif %}
</div>
{% if download %}
<div role="cell" class="download-desktop">
{% if line.generate_ticket %}
{% for b in download_buttons %}
<form action="{% if position_page and line.addon_to %}{% eventurl event "presale:event.order.position.download" secret=line.addon_to.web_secret order=order.code output=b.identifier pid=line.pk position=line.addon_to.positionid %}{% elif position_page %}{% eventurl event "presale:event.order.position.download" secret=line.web_secret order=order.code output=b.identifier pid=line.pk position=line.positionid %}{% else %}{% eventurl event "presale:event.order.download" secret=order.secret order=order.code output=b.identifier position=line.pk %}{% endif %}"
method="post" data-asynctask data-asynctask-download class="download-btn-form{% if b.javascript_required %} requirejs{% endif %}">
{% csrf_token %}
<button type="submit"
class="btn btn-sm {% if b.identifier == "pdf" %}btn-primary{% else %}btn-default{% endif %}">
<span class="fa {{ b.icon }}" aria-hidden="true"></span> {{ b.text }}
</button>
</form>
{% endfor %}
{% endif %}
</div>
{% elif line.addon_to %}
<div role="cell" class="count">&nbsp;</div>
<div role="cell" class="singleprice price">
{% if event.settings.display_net_prices %}
{{ line.net_price|money:event.currency }}
{% else %}
{{ line.price|money:event.currency }}
{% endif %}
</div>
{% else %}
<div role="cell" class="count">
{% if editable %}
<form action="{% eventurl event "presale:event.cart.remove" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "Okay, we're removing that" %}"
method="post" data-asynctask>
{% csrf_token %}
<button type="submit"
class="btn btn-sm {% if b.identifier == "pdf" %}btn-primary{% else %}btn-default{% endif %}">
<span class="fa {{ b.icon }}" aria-hidden="true"></span> {{ b.text }}
<input type="hidden" name="id" value="{{ line.id }}" />
{% if line.seat or line.count == 1 %}
<button class="btn btn-mini btn-link" title="{% blocktrans with item=line.item %}Remove {{item}} from your cart{% endblocktrans %}">
<i class="fa fa-trash" aria-hidden="true"></i>
<span class="sr-only">{% blocktrans with item=line.item %}Remove {{item}} from your cart{% endblocktrans %}</span>
</button>
{% else %}
<button class="btn btn-mini btn-link" title="{% blocktrans with item=line.item %}Remove one {{item}} from your cart{% endblocktrans %}">
<i class="fa fa-minus" aria-hidden="true"></i>
<span class="sr-only">{% blocktrans with item=line.item count=line.count %}Remove one {{item}} from your cart. You currently have {{count }} in your cart.{% endblocktrans %}</span>
</button>
{% endif %}
</form>
{% endif %}
{{ line.count }}
{% if editable %}
<form action="{% eventurl event "presale:event.cart.add" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "We're trying to reserve another one for you!" %}"
data-asynctask-text="{% blocktrans with time=event.settings.reservation_time %}Once the items are in your cart, you will have {{ time }} minutes to complete your purchase.{% endblocktrans %}"
method="post" data-asynctask>
<input type="hidden" name="subevent" value="{{ line.subevent_id|default_if_none:"" }}" />
{% csrf_token %}
{% if line.variation %}
<input type="hidden" name="variation_{{ line.item.id }}_{{ line.variation.id }}"
value="1" />
<input type="hidden" name="price_{{ line.item.id }}_{{ line.variation.id }}"
value="{% if event.settings.display_net_prices %}{{ line.bundle_sum_net }}{% else %}{{ line.bundle_sum }}{% endif %}" />
{% else %}
<input type="hidden" name="item_{{ line.item.id }}"
value="1" />
<input type="hidden" name="price_{{ line.item.id }}"
value="{% if event.settings.display_net_prices %}{{ line.bundle_sum_net }}{% else %}{{ line.bundle_sum }}{% endif %}" />
{% endif %}
<button class="btn btn-mini btn-link {% if line.seat %}btn-invisible{% endif %}" title="{% blocktrans with item=line.item %}Add one more {{item}} to your cart{% endblocktrans %}" {% if line.seat %}disabled{% endif %}>
<i class="fa fa-plus" aria-hidden="true"></i>
<span class="sr-only">{% blocktrans with item=line.item count=line.count %}Add one more {{item}} to your cart. You currently have {{ count }} in your cart.{% endblocktrans %}</span>
</button>
</form>
{% endfor %}
{% endif %}
</div>
{% elif line.addon_to %}
<div class="count">&nbsp;</div>
<div class="singleprice price">
<span class="sr-only">{% trans "price per item" %}</span>
{% if event.settings.display_net_prices %}
{{ line.net_price|money:event.currency }}
{% else %}
{{ line.price|money:event.currency }}
{% endif %}
</div>
{% else %}
<div class="count">
{% if editable %}
<form action="{% eventurl event "presale:event.cart.remove" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "Okay, we're removing that" %}"
method="post" data-asynctask>
{% csrf_token %}
<input type="hidden" name="id" value="{{ line.id }}" />
<button class="btn btn-mini btn-link" title="{% trans "Remove one" %}" aria-label="{% trans "Remove one" %}">
{% if line.seat %}
<i class="fa fa-trash" aria-hidden="true"></i>
{% else %}
<i class="fa fa-minus" aria-hidden="true"></i>
{% endif %}
</button>
</form>
{% endif %}
<span class="sr-only">{% trans "quantity" %}</span>
{{ line.count }}
{% if editable %}
<form action="{% eventurl event "presale:event.cart.add" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "We're trying to reserve another one for you!" %}"
data-asynctask-text="{% blocktrans with time=event.settings.reservation_time %}Once the items are in your cart, you will have {{ time }} minutes to complete your purchase.{% endblocktrans %}"
method="post" data-asynctask>
<input type="hidden" name="subevent" value="{{ line.subevent_id|default_if_none:"" }}" />
{% csrf_token %}
{% if line.variation %}
<input type="hidden" name="variation_{{ line.item.id }}_{{ line.variation.id }}"
value="1" />
<input type="hidden" name="price_{{ line.item.id }}_{{ line.variation.id }}"
value="{% if event.settings.display_net_prices %}{{ line.bundle_sum_net }}{% else %}{{ line.bundle_sum }}{% endif %}" />
{% else %}
<input type="hidden" name="item_{{ line.item.id }}"
value="1" />
<input type="hidden" name="price_{{ line.item.id }}"
value="{% if event.settings.display_net_prices %}{{ line.bundle_sum_net }}{% else %}{{ line.bundle_sum }}{% endif %}" />
{% endif %}
<button class="btn btn-mini btn-link {% if line.seat %}btn-invisible{% endif %}" title="{% trans "Add one more" %}" aria-label="{% trans "Add one more" %}" {% if line.seat %}disabled{% endif %}>
<i class="fa fa-plus" aria-hidden="true"></i>
</button>
</form>
{% endif %}
</div>
<div class="singleprice price">
<span class="sr-only">{% trans "price per item" %}</span>
{% if event.settings.display_net_prices %}
{{ line.net_price|money:event.currency }}
{% else %}
{{ line.price|money:event.currency }}
{% endif %}
</div>
{% endif %}
<div class="totalprice price">
<span class="sr-only">{% trans "price" %}</span>
{% if event.settings.display_net_prices %}
<strong>{{ line.net_total|money:event.currency }}</strong>
{% if line.tax_rate and line.total %}
<br />
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% else %}
<strong>{{ line.total|money:event.currency }}</strong>
{% if line.tax_rate and line.total %}
<br />
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% endif %}
</div>
<div class="clearfix"></div>
</div>
{% endfor %}
{% for fee in cart.fees %}
<div class="row cart-row">
<div class="col-md-4 col-xs-6">
<strong>{{ fee.get_fee_type_display }}</strong>
</div>
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
{% if event.settings.display_net_prices %}
<strong>{{ fee.net_value|money:event.currency }}</strong>
{% if fee.tax_rate %}
<br />
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% else %}
<strong>{{ fee.value|money:event.currency }}</strong>
{% if fee.tax_rate %}
<br />
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% endif %}
</div>
<div class="clearfix"></div>
</div>
{% endfor %}
{% if event.settings.display_net_prices and cart.tax_total %}
<div class="row cart-row total">
<div class="col-md-4 col-xs-6">
<strong>{% trans "Net total" %}</strong>
</div>
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
{{ cart.net_total|money:event.currency }}
</div>
<div class="clearfix"></div>
</div>
<div class="row cart-row">
<div class="col-md-4 col-xs-6">
<strong>{% trans "Taxes" %}</strong>
</div>
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
{{ cart.tax_total|money:event.currency }}
</div>
<div class="clearfix"></div>
</div>
{% endif %}
<div class="row cart-row total">
<div class="product">
<strong>{% trans "Total" %}</strong><br>
<span class="text-muted">
{% blocktrans trimmed count num=cart.itemcount %}
One product
{% plural %}
{{ num }} products
{% endblocktrans %}
</span>
</div>
<div class="count hidden-xs hidden-sm">
</div>
<div class="col-md-3 col-xs-6 col-md-offset-3 price">
<strong>{{ cart.total|money:event.currency }}</strong>
{% if not event.settings.display_net_prices and cart.tax_total and not editable %}
<small class="text-muted">
{% blocktrans trimmed with tax_sum=cart.tax_total|money:event.currency %}
incl. {{ tax_sum }} taxes
{% endblocktrans %}
</small>
{% endif %}
{% if editable and vouchers_exist and not cart.all_with_voucher %}
<br>
<a class="js-only apply-voucher-toggle" href="#">
<span class="fa fa-tag" aria-hidden="true"></span> {% trans "Redeem a voucher" %}
</a>
<form action="{% eventurl event "presale:event.cart.voucher" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "We're applying this voucher to your cart..." %}"
method="post" data-asynctask class="apply-voucher">
{% csrf_token %}
<label for="voucher_code" class="sr-only">{% trans "Voucher code" %}</label>
<div class="input-group">
<input type="text" class="form-control" name="voucher" id="voucher_code" placeholder="{% trans "Voucher code" %}" aria-label="{% trans "Voucher code" %}">
<span class="input-group-btn">
<button class="btn btn-primary" type="submit">
<span class="fa fa-check" aria-hidden="true"></span><span class="sr-only"> {% trans "Redeem voucher" %}</span>
</button>
</span>
</div>
</form>
{% endif %}
<div role="cell" class="singleprice price">
{% if event.settings.display_net_prices %}
{{ line.net_price|money:event.currency }}
{% else %}
{{ line.price|money:event.currency }}
{% endif %}
</div>
{% endif %}
<div role="cell" class="totalprice price">
{% if event.settings.display_net_prices %}
<strong>{{ line.net_total|money:event.currency }}</strong>
{% if line.tax_rate and line.total %}
<br />
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% else %}
<strong>{{ line.total|money:event.currency }}</strong>
{% if line.tax_rate and line.total %}
<br />
<small>
{% blocktrans trimmed with rate=line.tax_rate|floatformat:-2 taxname=line.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% endif %}
</div>
<div class="clearfix"></div>
</div>
{% endfor %}
{% for fee in cart.fees %}
<div class="row cart-row">
<div class="col-md-4 col-xs-6">
<strong>{{ fee.get_fee_type_display }}</strong>
</div>
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
{% if event.settings.display_net_prices %}
<strong>{{ fee.net_value|money:event.currency }}</strong>
{% if fee.tax_rate %}
<br />
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
<strong>plus</strong> {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% else %}
<strong>{{ fee.value|money:event.currency }}</strong>
{% if fee.tax_rate %}
<br />
<small>
{% blocktrans trimmed with rate=fee.tax_rate|floatformat:-2 taxname=fee.tax_rule.name|default:s_taxes %}
incl. {{ rate }}% {{ taxname }}
{% endblocktrans %}
</small>
{% endif %}
{% endif %}
</div>
<div class="clearfix"></div>
</div>
{% endfor %}
</div>
<div role="rowgroup">
{% if event.settings.display_net_prices and cart.tax_total %}
<div role="row" class="row cart-row">
<div role="cell" class="product">
<strong>{% trans "Net total" %}</strong>
</div>
<div role="cell" class="count hidden-xs hidden-sm"></div>
<div role="cell" class="singleprice price"></div>
<div role="cell" class="totalprice price">
{{ cart.net_total|money:event.currency }}
</div>
<div class="clearfix"></div>
</div>
<div role="row" class="row cart-row">
<div role="cell" class="product">
<strong>{% trans "Taxes" %}</strong>
</div>
<div role="cell" class="count hidden-xs hidden-sm"></div>
<div role="cell" class="singleprice price"></div>
<div role="cell" class="totalprice price">
{{ cart.tax_total|money:event.currency }}
</div>
<div class="clearfix"></div>
</div>
{% endif %}
<div role="row" class="row cart-row total">
<div role="cell" class="product">
<strong>{% trans "Total" %}</strong><br>
<span class="text-muted">
{% blocktrans trimmed count num=cart.itemcount %}
One product
{% plural %}
{{ num }} products
{% endblocktrans %}
</span>
</div>
<div role="cell" class="count hidden-xs hidden-sm"></div>
<div role="cell" class="singleprice price"></div>
<div role="cell" class="totalprice price">
<strong>{{ cart.total|money:event.currency }}</strong>
{% if not event.settings.display_net_prices and cart.tax_total and not editable %}
<small class="text-muted">
{% blocktrans trimmed with tax_sum=cart.tax_total|money:event.currency %}
incl. {{ tax_sum }} taxes
{% endblocktrans %}
</small>
{% endif %}
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
{% if not cart.is_ordered %}
<p class="text-muted" id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you. You can still complete your order as long as theyre available." %}
{% endif %}
</p>
{% else %}
<p class="sr-only" id="cart-description">{% trans "Overview of your ordered products." %}</p>
{% endif %}
</div>
<div class="clearfix"></div>
</div>

View File

@@ -5,61 +5,65 @@
{% load money %}
<details class="panel {% if open %}panel-primary{% else %}panel-default{% endif %} cart" {% if open %}open{% endif %}>
<summary class="panel-heading">
<h3 class="panel-title">
<span>
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
<strong>{% trans "Your cart" %}</strong>
</span>
<h2 class="panel-title">
<span>
<strong id="cart-deadline-short" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}" aria-hidden="true">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{{ cart.minutes_left|stringformat:"02d" }}:{{ cart.seconds_left|stringformat:"02d" }}
{% else %}
{% trans "Cart expired" %}
{% endif %}
</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</span>
</h3>
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
<strong>{% trans "Your cart" %}</strong>
</span>
<span aria-hidden="true">
<strong id="cart-deadline-short" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}" aria-hidden="true">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{{ cart.minutes_left|stringformat:"02d" }}:{{ cart.seconds_left|stringformat:"02d" }}
{% else %}
{% trans "Cart expired" %}
{% endif %}
</strong>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</span>
</h2>
</summary>
<div>
<div class="panel-body">
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=True %}
<em id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you." %}
{% endif %}
</em>
<div class="row checkout-button-row">
<div class="col-md-4 col-sm-6 col-xs-12 hidden-xs">
<form method="post" data-asynctask action="{% eventurl request.event "presale:event.cart.clear" cart_namespace=cart_namespace %}">
{% csrf_token %}
<button class="btn btn-block btn-default btn-lg" type="submit">
<i class="fa fa-close" aria-hidden="true"></i> {% trans "Empty cart" %}</button>
</form>
</div>
<div class="col-md-4 col-sm-6 col-md-offset-4 col-xs-12">
<a class="btn btn-block btn-primary btn-lg"
href="{% eventurl request.event "presale:event.checkout.start" cart_namespace=cart_namespace %}">
<div class="checkout-button-row">
<form class="checkout-button-primary" method="get" action="{% eventurl request.event "presale:event.checkout.start" cart_namespace=cart_namespace %}">
<p><button class="btn btn-primary btn-lg" type="submit"{% if has_addon_choices or cart.total == 0 %} aria-label="{% trans "Continue with order process" %}"{% endif %}>
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
{% if has_addon_choices or cart.total == 0 %}
<i class="fa fa-shopping-cart" aria-hidden="true"></i> {% trans "Continue" %}
{% trans "Continue" %}
{% else %}
<i class="fa fa-shopping-cart" aria-hidden="true"></i> {% trans "Proceed with checkout" %}
{% trans "Proceed with checkout" %}
{% endif %}
</a>
</div>
<div class="visible-xs-block col-xs-12">
</button></p>
</form>
<div class="checkout-button-secondary">
<form method="post" data-asynctask action="{% eventurl request.event "presale:event.cart.clear" cart_namespace=cart_namespace %}">
{% csrf_token %}
<button class="btn btn-block btn-default btn-lg" type="submit">
<i class="fa fa-close" aria-hidden="true"></i> {% trans "Empty cart" %}</button>
<p><button class="btn btn-default" type="submit">
<i class="fa fa-close" aria-hidden="true"></i> {% trans "Empty cart" %}</button></p>
</form>
{% if vouchers_exist and not cart.all_with_voucher %}
<div class="toggle-container">
<p class="toggle-summary"><button class="js-only toggle toggle-remove btn btn-default" aria-expanded="false">
<span class="fa fa-tag" aria-hidden="true"></span> {% trans "Redeem a voucher" %}
</button></p>
<form action="{% eventurl event "presale:event.cart.voucher" cart_namespace=cart_namespace|default_if_none:"" %}"
data-asynctask-headline="{% trans "We're applying this voucher to your cart..." %}"
method="post" data-asynctask>
{% csrf_token %}
<label for="voucher_code" class="sr-only">{% trans "Voucher code" %}</label>
<div class="input-group">
<input type="text" class="form-control" name="voucher" id="voucher_code" placeholder="{% trans "Voucher code" %}" aria-label="{% trans "Voucher code" %}">
<span class="input-group-btn">
<button class="btn btn-primary" type="submit">
<span class="fa fa-check" aria-hidden="true"></span><span class="sr-only"> {% trans "Redeem voucher" %}</span>
</button>
</span>
</div>
</form>
</div>
{% endif %}
</div>
<div class="clearfix"></div>
</div>
</div>
</div>

View File

@@ -1,32 +1,30 @@
{% load i18n %}
<div class="checkout-flow">
<nav aria-label="{% trans "Checkout steps" context "checkoutflow" %}">
<ol class="checkout-flow">
{% for step in checkout_flow %}
<a {% if step.c_is_before %}href="{{ step.c_resolved_url }}"{% endif %} class="checkout-step {% if step.c_is_before %}step-done{% elif request.resolver_match.kwargs.step == step.identifier %}step-current{% endif %}">
<div class="checkout-step-bar-left"></div>
<div class="checkout-step-bar-right"></div>
<li class="checkout-step {% if step.c_is_before %}step-done{% elif request.resolver_match.kwargs.step == step.identifier %}step-current{% endif %}">
{% if step.c_is_before %}<a href="{{ step.c_resolved_url }}">{% endif %}
<div class="checkout-step-icon">
<span class="fa {% if step.c_is_before %}fa-check{% elif step.icon %}fa-{{ step.icon }}{% else %}fa-pencil{% endif %}" aria-hidden="true"></span>
</div>
<div class="checkout-step-label">
<span class="sr-only">
{% if step.c_is_before %}
{% trans "Completed:" %}
<span class="sr-only">{% trans "Completed:" %}</span>
{% elif request.resolver_match.kwargs.step == step.identifier %}
{% trans "Current:" %}
<span class="sr-only">{% trans "Current:" %}</span>
{% endif %}
</span>
{{ step.label }}
</div>
</a>
{% if step.c_is_before %}</a>{% endif %}
</li>
{% endfor %}
<a class="checkout-step">
<div class="checkout-step-bar-left"></div>
<div class="checkout-step-bar-right"></div>
<li class="checkout-step">
<div class="checkout-step-icon">
<span class="fa fa-ticket" aria-hidden="true"></span>
</div>
<div class="checkout-step-label">
{% trans "Order confirmed" context "checkoutflow" %}
</div>
</a>
</div>
</li>
</ol>
</nav>

View File

@@ -36,34 +36,30 @@
</div>
</div>
{% elif can_download and download_buttons and order.count_positions %}
<div class="alert alert-info info-download">
<div class="info-download">
<h3 class="sr-only">{% trans "Ticket download" %}</h3>
{% if cart.positions|length > 1 and can_download_multi %} {# never True on ticket page #}
{% blocktrans trimmed %}
<div>
{% for b in download_buttons %}
{% if b.multi %}
<form action="{% eventurl event "presale:event.order.download.combined" secret=order.secret order=order.code output=b.identifier %}"
method="post" data-asynctask data-asynctask-download class="download-btn-form">
{% csrf_token %}
<button type="submit"
class="btn btn-lg {% if b.identifier == "pdf" %}btn-primary{% else %}btn-default{% endif %}">
<span class="fa {{ b.icon }}" aria-hidden="true"></span> {{ b.multi_text }}
</button>
</form>
{% endif %}
{% endfor %}
</div>
<p class="help-block">
{% blocktrans trimmed %}
Please have your ticket ready when entering the event.
{% endblocktrans %}
<p class="info-download">
{% trans "Download all tickets at once:" %}
{% for b in download_buttons %}
{% if b.multi %}
<form action="{% eventurl event "presale:event.order.download.combined" secret=order.secret order=order.code output=b.identifier %}"
method="post" data-asynctask data-asynctask-download class="download-btn-form">
{% csrf_token %}
<button type="submit"
class="btn btn-lg {% if b.identifier == "pdf" %}btn-primary{% else %}btn-default{% endif %}">
<span class="fa {{ b.icon }}" aria-hidden="true"></span> {{ b.multi_text }}
</button>
</form>
{% endif %}
{% endfor %}
{% endblocktrans %}
</p>
{% elif tickets_with_download|length == 1 %}
{% blocktrans trimmed %}
Please have your ticket ready when entering the event.
{% endblocktrans %}
{% blocktrans trimmed %}
Download your ticket here:
{% endblocktrans %}
<p class="info-download">
<div>
{% for b in download_buttons %}
<form action="{% if position_page and tickets_with_download.0.addon_to %}{% eventurl event "presale:event.order.position.download" secret=tickets_with_download.0.addon_to.web_secret order=order.code output=b.identifier pid=tickets_with_download.0.pk position=tickets_with_download.0.addon_to.positionid %}{% elif position_page %}{% eventurl event "presale:event.order.position.download" secret=tickets_with_download.0.web_secret order=order.code output=b.identifier pid=tickets_with_download.0.pk position=tickets_with_download.0.positionid %}{% else %}{% eventurl event "presale:event.order.download" secret=order.secret order=order.code output=b.identifier position=tickets_with_download.0.pk %}{% endif %}"
method="post" data-asynctask data-asynctask-download
@@ -75,14 +71,21 @@
</button>
</form>
{% endfor %}
</div>
<p class="help-block">
{% blocktrans trimmed %}
Please have your ticket ready when entering the event.
{% endblocktrans %}
</p>
{% else %}
<p class="text-muted">
{% blocktrans trimmed %}
Please have your ticket ready when entering the event.
{% endblocktrans %}
{% endblocktrans %}<br>
{% blocktrans trimmed %}
Download your tickets using the buttons below.
{% endblocktrans %}
</p>
{% endif %}
</div>
{% elif not download_buttons and ticket_download_date %}

View File

@@ -2,24 +2,27 @@
{% load bootstrap3 %}
{% if order.status == "n" %}
{% if order.require_approval %}
<span class="label label-warning {{ class }}">{% trans "Approval pending" %}</span>
{% trans "Approval pending" %}
{% elif order.total == 0 %}
<span class="label label-warning {{ class }}">{% trans "Confirmation pending" context "order state" %}</span>
{% trans "Confirmation pending" context "order state" %}
{% elif event.settings.payment_pending_hidden %}
{# intentionally left blank #}
{% else %}
<span class="label label-warning {{ class }}">{% trans "Payment pending" %}</span>
{% trans "Payment pending" %}
{% endif %}
{% if not event.settings.payment_pending_hidden %}
<i class="status-dot fa fa-circle text-warning" aria-hidden="true"></i>
{% endif %}
{% elif order.status == "p" %}
{% if order.count_positions == 0 %}
<span class="label label-info {{ class }}">{% trans "Canceled (paid fee)" %}</span>
{% trans "Canceled (paid fee)" %} <i class="status-dot fa fa-info-circle text-info" aria-hidden="true"></i>
{% elif order.total == 0 %}
<span class="label label-success {{ class }}">{% trans "Confirmed" context "order state" %}</span>
{% trans "Confirmed" context "order state" %} <i class="status-dot fa fa-check-circle text-success" aria-hidden="true"></i>
{% else %}
<span class="label label-success {{ class }}">{% trans "Paid" %}</span>
{% trans "Paid" %} <i class="status-dot fa fa-check-circle text-success" aria-hidden="true"></i>
{% endif %}
{% elif order.status == "e" %}
<span class="label label-danger {{ class }}">{% trans "Expired" %}</span>
{% trans "Expired" %} <i class="status-dot fa fa-minus-circle text-danger" aria-hidden="true"></i>
{% elif order.status == "c" %}
<span class="label label-danger {{ class }}">{% trans "Canceled" %}</span>
{% trans "Canceled" %} <i class="status-dot fa fa-times-circle text-danger" aria-hidden="true"></i>
{% endif %}

View File

@@ -6,21 +6,17 @@
{% load eventsignal %}
{% load rich_text %}
{% for tup in items_by_category %}
<section aria-labelledby="category-{% if tup.0 %}{{ tup.0.id }}{% else %}none{% endif %}"{% if tup.0.description %} aria-describedby="category-info-{{ tup.0.id }}"{% endif %}>
<section {% if tup.0 %}aria-labelledby="category-{{ tup.0.id }}"{% else %}aria-label="{% trans "Uncategorized items" %}"{% endif %}{% if tup.0.description %} aria-describedby="category-info-{{ tup.0.id }}"{% endif %}>
{% if tup.0 %}
<h3 id="category-{{ tup.0.id }}">{{ tup.0.name }}</h3>
{% if tup.0.description %}
<div id="category-info-{{ tup.0.id }}">{{ tup.0.description|localize|rich_text }}</div>
{% endif %}
{% else %}
<h3 id="category-none" class="sr-only">{% trans "Uncategorized products" %}</h3>
{% endif %}
{% for item in tup.1 %}
{% if item.has_variations %}
<article class="item-with-variations">
<details {% if event.settings.show_variations_expanded %}open{% endif %}
id="item-{{ item.id }}">
<summary class="row product-row headline">
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="item-with-variations{% if event.settings.show_variations_expanded %} details-open{% endif %}" id="item-{{ item.pk }}">
<div class="row product-row headline">
<div class="col-md-8 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
@@ -33,13 +29,9 @@
</a>
{% endif %}
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h4>
<a data-toggle="variations">
{{ item.name }}
</a>
</h4>
<h4 id="item-{{ item.pk }}-legend">{{ item.name }}</h4>
{% if item.description %}
<div class="product-description">
<div id="item-{{ item.pk }}-description" class="product-description">
{{ item.description|localize|rich_text }}
</div>
{% endif %}
@@ -60,9 +52,14 @@
from {{ price }}
{% endblocktrans %}
{% elif item.min_price != item.max_price %}
{{ item.min_price|money:event.currency }} {{ item.max_price|money:event.currency }}
<span class="sr-only">
{% blocktrans trimmed with from_price=item.min_price|money:event.currency to_price=item.max_price|money:event.currency %}
from {{ from_price }} to {{ to_price }}
{% endblocktrans %}
</span>
<span aria-hidden="true">{{ item.min_price|money:event.currency }} {{ item.max_price|money:event.currency }}</span>
{% elif not item.min_price and not item.max_price %}
{% trans "FREE" context "price" %}
<span class="text-uppercase">{% trans "free" context "price" %}</span>
{% else %}
{{ item.min_price|money:event.currency }}
{% endif %}
@@ -88,24 +85,23 @@
{% endif %}
<br>
{% endif %}
<a data-toggle="variations" class="js-only">
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{ item }}{% endblocktrans %}">
{% trans "Show variants" %}
</a>
</button>
{% endif %}
</div>
<div class="clearfix"></div>
</summary>
</div>
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
{% for var in item.available_variations %}
<article class="row product-row variation">
<article aria-labelledby="item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="item-{{ item.pk }}-{{ var.pk }}">
<div class="col-md-8 col-xs-12">
<h5>
<label for="variation_{{ item.pk }}_{{ var.pk }}">
{{ var }}
</label>
</h5>
<h5 id="item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
{% if var.description %}
<div class="variation-description">
<div id="item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
{{ var.description|localize|rich_text }}
</div>
{% endif %}
@@ -115,12 +111,21 @@
</div>
<div class="col-md-2 col-xs-6 price">
{% if var.original_price %}
<p>
<del><span class="sr-only">{% trans "Orignal price:" %}</span>
{% if event.settings.display_net_prices %}
<del>{{ var.original_price.net|money:event.currency }}</del>
{{ var.original_price.net|money:event.currency }}
{% else %}
<del>{{ var.original_price.gross|money:event.currency }}</del>
{{ var.original_price.gross|money:event.currency }}
{% endif %}
<ins>
</del>
{% if item.free_price %}
</p>
{% else %}
<ins><span class="sr-only">{% trans "New price:" %}</span>
{% endif %}
{% elif not item.free_price %}
<p>
{% endif %}
{% if item.free_price %}
<label class="sr-only" for="price-variation-{{ item.pk }}-{{ var.pk }}">{% blocktrans trimmed with item=var.value %}Modify price for {{ item }}{% endblocktrans %}</label>
@@ -137,9 +142,10 @@
value="{% if event.settings.display_net_prices %}{{ var.display_price.net|money_numberfield:event.currency }}{% else %}{{ var.display_price.gross|money_numberfield:event.currency }}{% endif %}"
>
</div>
<p>
{% elif not var.display_price.gross %}
{% trans "FREE" context "price" %}
{% elif event.settings.display_net_prices %}
{% elif event.settings.display_net_prices %}
{{ var.display_price.net|money:event.currency }}
{% else %}
{{ var.display_price.gross|money:event.currency }}
@@ -162,12 +168,11 @@
incl. {{ rate }}% {{ name }}
{% endblocktrans %}</small>
{% endif %}
</p>
</div>
{% if item.require_voucher %}
<div class="col-md-2 col-xs-6 availability-box unavailable">
<small>
<a href="#voucher">{% trans "Enter a voucher code below to buy this ticket." %}</a>
</small>
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this ticket." %}</a></small></p>
</div>
{% elif var.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available">
@@ -177,15 +182,15 @@
{% if not ev.presale_is_running %}disabled{% endif %}
id="variation_{{ item.id }}_{{ var.id }}"
name="variation_{{ item.id }}_{{ var.id }}"
title="{% blocktrans with item=item.name var=var.name %}Amount of {{ item }} {{ var }} to order{% endblocktrans %}">
title="{% blocktrans with item=item.name var=var.name %}Do you want to order {{ item }}, {{ var }}?{% endblocktrans %}">
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if not ev.presale_is_running %}disabled{% endif %}
max="{{ var.order_max }}"
pattern="\d*"
id="variation_{{ item.id }}_{{ var.id }}"
name="variation_{{ item.id }}_{{ var.id }}">
name="variation_{{ item.id }}_{{ var.id }}"
aria-label="{% blocktrans with item=item.name var=var.name %}Quantity of {{ item }}, {{ var }} to order{% endblocktrans %}">
{% endif %}
</div>
{% else %}
@@ -195,10 +200,9 @@
</article>
{% endfor %}
</div>
</details>
</article>
{% else %}
<article class="row product-row simple" id="item-{{ item.id }}">
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="row product-row simple" id="item-{{ item.pk }}">
<div class="col-md-8 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
@@ -211,11 +215,9 @@
</a>
{% endif %}
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h4>
<label for="item_{{ item.pk }}">{{ item.name }}</label>
</h4>
<h4 id="item-{{ item.pk }}-legend">{{ item.name }}</h4>
{% if item.description %}
<div class="product-description">
<div id="item-{{ item.pk }}-description" class="product-description">
{{ item.description|localize|rich_text }}
</div>
{% endif %}
@@ -235,17 +237,26 @@
</div>
<div class="col-md-2 col-xs-6 price">
{% if item.original_price %}
<p>
<del><span class="sr-only">{% trans "Orignal price:" %}</span>
{% if event.settings.display_net_prices %}
<del>{{ item.original_price.net|money:event.currency }}</del>
{{ item.original_price.net|money:event.currency }}
{% else %}
<del>{{ item.original_price.gross|money:event.currency }}</del>
{{ item.original_price.gross|money:event.currency }}
{% endif %}
<ins>
</del>
{% if item.free_price %}
</p>
{% else %}
<ins><span class="sr-only">{% trans "New price:" %}</span>
{% endif %}
{% elif not item.free_price %}
<p>
{% endif %}
{% if item.free_price %}
<div class="input-group input-group-price">
<label class="sr-only" for="price-item-{{ item.pk }}">{% blocktrans trimmed with item=item.name %}Modify price for {{ item }}{% endblocktrans %}</label>
<span class="input-group-addon">{{ event.currency }}</span>
<label class="sr-only" for="price-item-{{ item.pk }}">{% blocktrans trimmed with item=item.name currency=event.currency %}Set price in {{ currency }} for {{ item }}{% endblocktrans %}</label>
<span class="input-group-addon" aria-hidden="true">{{ event.currency }}</span>
<input type="number" class="form-control input-item-price" placeholder="0"
id="price-item-{{ item.pk }}"
{% if not ev.presale_is_running %}disabled{% endif %}
@@ -255,9 +266,10 @@
value="{% if event.settings.display_net_prices %}{{ item.display_price.net|money_numberfield:event.currency }}{% else %}{{ item.display_price.gross|money_numberfield:event.currency }}{% endif %}"
step="any">
</div>
<p>
{% elif not item.display_price.gross %}
{% trans "FREE" context "price" %}
{% elif event.settings.display_net_prices %}
{% elif event.settings.display_net_prices %}
{{ item.display_price.net|money:event.currency }}
{% else %}
{{ item.display_price.gross|money:event.currency }}
@@ -280,12 +292,11 @@
incl. {{ rate }}% {{ name }}
{% endblocktrans %}</small>
{% endif %}
</p>
</div>
{% if item.require_voucher %}
<div class="col-md-2 col-xs-6 availability-box unavailable">
<small>
{% trans "Enter a voucher code below to buy this ticket." %}
</small>
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this ticket." %}</a></small></p>
</div>
{% elif item.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available">
@@ -293,16 +304,19 @@
<label class="item-checkbox-label">
<input type="checkbox" value="1" {% if itemnum == 1 %}checked{% endif %}
{% if not ev.presale_is_running %}disabled{% endif %}
name="item_{{ item.id }}" id="item_{{ item.id }}">
name="item_{{ item.id }}" id="item_{{ item.id }}"
aria-label="{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}"
{% if item.description %} aria-describedby="item-{{ item.id }}-description"{% endif %}>
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if not ev.presale_is_running %}disabled{% endif %}
pattern="\d*" {% if itemnum == 1 %}value="1"{% endif %}
{% if itemnum == 1 %}value="1"{% endif %}
max="{{ item.order_max }}"
name="item_{{ item.id }}"
id="item_{{ item.id }}"
title="{% blocktrans with item=item.name %}Amount of {{ item }} to order{% endblocktrans %}">
aria-label="{% blocktrans with item=item.name %}Quantity of {{ item }} to order{% endblocktrans %}"
{% if item.description %} aria-describedby="item-{{ item.id }}-description"{% endif %}>
{% endif %}
</div>
{% else %}

View File

@@ -1,41 +1,46 @@
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "month" and f != "year" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div class="row">
<div class="col-sm-4 hidden-xs text-left flip">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="col-sm-4 hidden-xs text-left flip">
<a href="?{% url_replace request "year" subevent_list.before.year "month" subevent_list.before.month %}"
class="btn btn-default">
class="btn btn-default" aria-label="{% blocktrans with month=subevent_list.before|date:"F Y" %}Show previous month, {{ month }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{{ subevent_list.before|date:"F Y" }}
</a>
</div>
<div class="col-sm-4 col-xs-12 text-center">
<select name="month" class="form-control">
{% for m in subevent_list.months %}
<option value="{{ m|date:"m" }}" {% if m.month == subevent_list.date.month %}selected{% endif %}>{{ m|date:"F" }}</option>
</li>
<li class="col-sm-4 col-xs-12 text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "month" and f != "year" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
</select>
<select name="year" class="form-control">
{% for y in subevent_list.years %}
<option value="{{ y }}" {% if y == subevent_list.date.year %}selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</div>
<div class="col-sm-4 hidden-xs text-right flip">
<a href="?{% url_replace request "year" subevent_list.after.year "month" subevent_list.after.month %}" class="btn btn-default">
<div role="group" aria-label="{% trans "Select month and year to show" %}">
<select name="month" class="form-control" aria-label="{% trans "Month" %}">
{% for m in subevent_list.months %}
<option value="{{ m|date:"m" }}" {% if m.month == subevent_list.date.month %}selected{% endif %}>{{ m|date:"F" }}</option>
{% endfor %}
</select>
<select name="year" class="form-control" aria-label="{% trans "Year" %}">
{% for y in subevent_list.years %}
<option value="{{ y }}" {% if y == subevent_list.date.year %}selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</form>
</li>
<li class="col-sm-4 hidden-xs text-right flip">
<a href="?{% url_replace request "year" subevent_list.after.year "month" subevent_list.after.month %}"
class="btn btn-default" aria-label="{% blocktrans with month=subevent_list.after|date:"F Y" %}Show next month, {{ month }}{% endblocktrans %}">
{{ subevent_list.after|date:"F Y" }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
</div>
</div>
</form>
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_calendar.html" with show_avail=event.settings.event_list_availability weeks=subevent_list.weeks show_names=subevent_list.show_names %}

View File

@@ -1,46 +1,50 @@
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "week" and f != "year" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div class="row">
<div class="col-sm-4 hidden-xs text-left flip">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="col-sm-4 hidden-xs text-left flip">
<a href="?{% url_replace request "year" subevent_list.before.isocalendar.0 "week" subevent_list.before.isocalendar.1 %}"
class="btn btn-default">
class="btn btn-default" aria-label="{% blocktrans with week=subevent_list.before|date:subevent_list.week_format %}Show previous week, {{ week }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{{ before|date:subevent_list.week_format }}
{{ subevent_list.before|date:subevent_list.week_format }}
</a>
</div>
<div class="col-sm-4 col-xs-12 text-center">
<select name="week" class="form-control select-calendar-week-short">
{% for w in subevent_list.weeks %}
<option value="{{ w.0.isocalendar.1 }}" {% if w.0.isocalendar.1 == subevent_list.date.isocalendar.1 %}selected{% endif %}>{% trans "W" %} {{ w.0.isocalendar.1 }} ({{ w.0|date:"SHORT_DATE_FORMAT" }} {{ w.1|date:"SHORT_DATE_FORMAT" }})</option>
{% endfor %}
</select>
<select name="year" class="form-control">
{% for y in subevent_list.years %}
<option value="{{ y }}" {% if y == subevent_list.date.isocalendar.0 %}selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</div>
<div class="col-sm-4 hidden-xs text-right flip">
</li>
<li class="col-sm-4 col-xs-12 text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "week" and f != "year" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div role="group" aria-label="{% trans "Select week and year to show" %}">
<select name="week" class="form-control select-calendar-week-short" aria-label="{% trans "Week" %}">
{% for w in subevent_list.weeks %}
<option value="{{ w.0.isocalendar.1 }}" {% if w.0.isocalendar.1 == subevent_list.date.isocalendar.1 %}selected{% endif %}>{% trans "W" %} {{ w.0.isocalendar.1 }} ({{ w.0|date:"SHORT_DATE_FORMAT" }} {{ w.1|date:"SHORT_DATE_FORMAT" }})</option>
{% endfor %}
</select>
<select name="year" class="form-control" aria-label="{% trans "Year" %}">
{% for y in subevent_list.years %}
<option value="{{ y }}" {% if y == subevent_list.date.isocalendar.0 %}selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</form>
</li>
<li class="col-sm-4 hidden-xs text-right flip">
<a href="?{% url_replace request "year" subevent_list.after.isocalendar.0 "week" subevent_list.after.isocalendar.1 %}"
class="btn btn-default">
class="btn btn-default" aria-label="{% blocktrans with week=subevent_list.after|date:subevent_list.week_format %}Show next week, {{ week }}{% endblocktrans %}">
{{ subevent_list.after|date:subevent_list.week_format }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
</div>
</div>
</form>
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_week_calendar.html" with show_avail=event.settings.event_list_availability days=subevent_list.days show_names=subevent_list.show_names %}
<div class="col-sm-4 visible-xs text-center">
<div class="col-sm-4 visible-xs text-center" aria-hidden="true">
<a href="?{% url_replace request "year" subevent_list.before.isocalendar.0 "week" subevent_list.before.isocalendar.1 %}"
class="btn btn-default">
<span class="fa fa-arrow-left" aria-hidden="true"></span>

View File

@@ -1,19 +1,20 @@
{% load i18n %}
{% load eventurl %}
<ul class="list-unstyled">
{% for subev in subevent_list.subevent_list %}
<a href="{% if request.GET.voucher %}{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}?voucher={{ request.GET.voucher|urlencode }}&subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}"
class="subevent-row">
<li class="subevent-row">
<a href="{% if request.GET.voucher %}{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}?voucher={{ request.GET.voucher|urlencode }}&subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}">
<div class="row">
<div class="col-md-6">
<strong>{{ subev.name }}</strong>
</div>
<div class="col-md-4">
<span class="fa fa-calendar" aria-hidden="true"></span>
{{ subev.get_date_range_display }}
{{ subev.get_date_range_display_as_html }}
{% if event.settings.show_times %}
<span data-time="{{ subev.date_from.isoformat }}" data-timezone="{{ event.timezone }}" data-time-short>
<span class="fa fa-clock-o" aria-hidden="true"></span>
{{ subev.date_from|date:"TIME_FORMAT" }}
<time datetime="{{ subev.date_from.isoformat }}">{{ subev.date_from|date:"TIME_FORMAT" }}</time>
</span>
{% endif %}
</div>
@@ -47,5 +48,7 @@
{% endif %}
</div>
</div>
</a>
</a>
</li>
{% endfor %}
</ul>

View File

@@ -8,6 +8,22 @@
{% load eventsignal %}
{% load rich_text %}
{% block title %}
{% if "year" in request.GET %}
{% if list_type == "calendar" %}
{% blocktrans with datetime=date|date:"F Y" %}
Calendar for {{ datetime }}
{% endblocktrans %} ::
{% elif list_type == "week" %}
{% blocktrans with datetime=date|date:week_format %}
Calendar for {{ datetime }}
{% endblocktrans %} ::
{% endif %}
{% elif subevent %}
{{ subevent.get_date_range_display }} ::
{% endif %}
{% endblock %}
{% block custom_header %}
{{ block.super }}
<meta property="og:title" content="{{ ev.name }}" />
@@ -45,22 +61,24 @@
{% if request.GET.voucher %}
<div class="alert alert-info">
{% trans "Please select a date to redeem your voucher." %}
<p>{% trans "Please select a date to redeem your voucher." %}</p>
</div>
{% endif %}
{% endif %}
{% if subevent and "year" not in request.GET %}
<p>
{% if show_cart %}
<a class="subevent-toggle btn btn-primary btn-block btn-lg" href="#subevent-list">
<button class="subevent-toggle btn btn-primary btn-block btn-lg" aria-expanded="false">
<span class="fa fa-reply" aria-hidden="true"></span>
{% trans "Add tickets for a different date" %}
</a>
</button>
{% else %}
<a class="subevent-toggle btn btn-default btn-block" href="#subevent-list">
<button class="subevent-toggle btn btn-default btn-block" aria-expanded="false">
{% trans "View other date" %}
</a>
</button>
{% endif %}
</p>
{% else %}
<h3>{% trans "Choose date to book a ticket" %}</h3>
{% endif %}
@@ -99,7 +117,7 @@
<h2 class="content-header">
{{ event.name }}
{% if request.event.settings.show_dates_on_frontpage %}
<small>{{ event.get_date_range_display }}</small>
<small>{{ event.get_date_range_display_as_html }}</small>
{% endif %}
</h2>
{% endif %}
@@ -122,11 +140,15 @@
{% endblocktrans %}
{% endif %}
{% elif event.settings.presale_start_show_date %}
<span data-time="{{ ev.effective_presale_start.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with date=ev.effective_presale_start|date:"SHORT_DATE_FORMAT" time=ev.effective_presale_start|time:"TIME_FORMAT" %}
The presale for this event will start on {{ date }} at {{ time }}.
{% endblocktrans %}
</span>
{% with date=ev.effective_presale_start|date:"SHORT_DATE_FORMAT" date_normalized=ev.effective_presale_start|date:"Y-m-d" %}
{% with time=ev.effective_presale_start|time:"TIME_FORMAT" time_24h=ev.effective_presale_start|time:"H:i" %}
<span data-time="{{ ev.effective_presale_start.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with date="<time datetime='"|add:date_normalized|add:"'>"|add:date|add:"</time>"|safe time="<time datetime='"|add:time_24h|add:"'>"|add:time|add:"</time>"|safe %}
The presale for this event will start on {{ date }} at {{ time }}.
{% endblocktrans %}
</span>
{% endwith %}
{% endwith %}
{% else %}
{% blocktrans trimmed %}
The presale for this event has not yet started.
@@ -138,46 +160,54 @@
<div>
{% if ev.location %}
<div class="info-row">
<span class="fa fa-map-marker fa-fw" aria-hidden="true"></span>
<p><span class="sr-only">{% trans "Location" %}:</span>
<span class="fa fa-map-marker fa-fw" aria-hidden="true" title="{% trans "Where does the event happen?" %}"></span>
<p><span class="sr-only">{% trans "Where does the event happen?" %}</span>
{{ ev.location|linebreaksbr }}
</p>
</div>
{% endif %}
{% if ev.settings.show_dates_on_frontpage %}
<div class="info-row">
<span class="fa fa-clock-o fa-fw" aria-hidden="true"></span>
<p>
{{ ev.get_date_range_display }}
<span class="fa fa-clock-o fa-fw" aria-hidden="true" title="{% trans "When does the event happen?" %}"></span>
<p><span class="sr-only">{% trans "When does the event happen?" %}</span>
{{ ev.get_date_range_display_as_html }}
{% if event.settings.show_times %}
<br>
<span data-time="{{ ev.date_from.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with time=ev.date_from|date:"TIME_FORMAT" %}
{% with time_human=ev.date_from|date:"TIME_FORMAT" time_24=ev.date_from|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
Begin: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% if event.settings.show_date_to and ev.date_to %}
<br>
<span data-time="{{ ev.date_to.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with time=ev.date_to|date:"TIME_FORMAT" %}
{% with time_human=ev.date_to|date:"TIME_FORMAT" time_24=ev.date_to|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
End: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% endif %}
{% endif %}
{% if ev.date_admission %}
<br>
{% if ev.date_admission|date:"SHORT_DATE_FORMAT" == ev.date_from|date:"SHORT_DATE_FORMAT" %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with time=ev.date_admission|date:"TIME_FORMAT" %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% with time_human=ev.date_admission|date:"TIME_FORMAT" time_24=ev.date_admission|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
Admission: {{ time }}
{% endblocktrans %}
{% endwith %}
</span>
{% else %}
<span data-time="{{ ev.date_admission.isoformat }}" data-timezone="{{ request.event.timezone }}">
{% blocktrans trimmed with datetime=ev.date_admission|date:"SHORT_DATETIME_FORMAT" %}
{% with datetime_human=ev.date_admission|date:"SHORT_DATETIME_FORMAT" datetime_iso=ev.date_admission|time:"Y-m-d H:i" %}
{% blocktrans trimmed with datetime='<time datetime="'|add:datetime_iso|add:'">'|add:datetime_human|add:"</time>"|safe %}
Admission: {{ datetime }}
{% endblocktrans %}
{% endwith %}
</span>
{% endif %}
{% endif %}
@@ -239,7 +269,7 @@
{% include "pretixpresale/event/fragment_product_list.html" %}
{% if ev.presale_is_running and display_add_to_cart %}
<section class="front-page">
<div class="front-page">
<div class="row">
<div class="col-md-4 col-md-offset-8 col-xs-12">
<button class="btn btn-block btn-primary btn-lg" type="submit" id="btn-add-to-cart">
@@ -256,7 +286,7 @@
</div>
<div class="clearfix"></div>
</div>
</section>
</div>
{% endif %}
</form>
{% endif %}
@@ -273,11 +303,14 @@
<form method="get" action="{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}">
<div class="row row-voucher">
<div class="col-md-8 col-sm-6 col-xs-12">
<label for="voucher" class="sr-only">{% trans "Voucher code" %}</label>
<div class="input-group">
<label for="voucher" class="sr-only">{% trans "Voucher code" %}
{% if "voucher_invalid" in request.GET %}<strong>{% trans "has error" context "form" %},</strong>{% endif %}
<i>{% trans "required" context "form" %}</i></label>
<div class="input-group{% if "voucher_invalid" in request.GET %} has-error{% endif %}">
<span class="input-group-addon"><i class="fa fa-ticket fa-fw" aria-hidden="true"></i></span>
<input type="text" class="form-control" name="voucher" id="voucher"
placeholder="{% trans "Voucher code" %}">
<input type="text" class="form-control{% if "voucher_invalid" in request.GET %} has-error{% endif %}" name="voucher" id="voucher"
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
placeholder="{% trans "Voucher code" %}" required="required">
</div>
</div>
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />

View File

@@ -26,9 +26,9 @@
<div class="thank-you">
<span class="fa fa-check-circle" aria-hidden="true"></span>
<h2>{% trans "Thank you!" %}</h2>
<h2 class="h1">{% trans "Thank you!" %}</h2>
{% if order.status != 'p' %}
<p>
<p class="lead">
{% trans "Your order has been placed successfully. See below for details." %}<br>
{% if order.require_approval and order.total == 0 %}
<strong>
@@ -45,9 +45,9 @@
{% endif %}
</p>
{% elif order.total == 0 %}
<p>{% trans "Your order has been processed successfully! See below for details." %}</p>
<p class="lead">{% trans "Your order has been processed successfully! See below for details." %}</p>
{% else %}
<p>{% trans "We successfully received your payment. See below for details." %}</p>
<p class="lead">{% trans "We successfully received your payment. See below for details." %}</p>
{% endif %}
{% if request.event.settings.checkout_success_text %}
{{ request.event.settings.checkout_success_text|rich_text }}
@@ -60,13 +60,10 @@
also sent you an email containing the link to the address you specified.
{% endblocktrans %}<br>
<code>{{ url }}</code></p>
<div class="clearfix"></div>
</div>
{% endif %}
<h2>
{% blocktrans trimmed with code=order.code %}
Your order: {{ code }}
{% endblocktrans %}
<h2 class="h1">{% trans "Order" %} {{ order.code }}
{% if order.testmode %}
<span class="label label-warning">{% trans "TEST MODE" %}</span>
{% endif %}
@@ -75,9 +72,11 @@
{% trans "View in backend" %}
</a>
{% endif %}
{% include "pretixpresale/event/fragment_order_status.html" with order=order event=request.event class="pull-right flip" %}
<div class="clearfix"></div>
</h2>
<dl class="lead order-details">
<dt class="sr-only">Status</dt>
<dd class="text-muted">{% include "pretixpresale/event/fragment_order_status.html" with order=order event=request.event %}</dd>
</dl>
{% if order.status == "n" and not order.require_approval %}
<div class="panel panel-primary">
<div class="panel-heading">
@@ -86,12 +85,18 @@
</h3>
</div>
<div class="panel-body">
<p>
<strong>{% blocktrans trimmed with total=pending_sum|money:request.event.currency %}
A payment of {{ total }} is still pending for this order.
{% endblocktrans %}</strong>
<strong>{% blocktrans trimmed with date=order|format_expires %}
Please complete your payment before {{ date }}
{% endblocktrans %}</strong>
<strong>
{% with date_human=order|format_expires|safe date_iso=order.expires|date:"c" %}
{% blocktrans trimmed with date='<time datetime="'|add:date_iso|add:'">'|add:date_human|add:"</time>"|safe %}
Please complete your payment before {{ date }}
{% endblocktrans %}
{% endwith %}
</strong>
</p>
{% if last_payment %}
{{ last_payment_info }}
{% if can_pay %}
@@ -356,11 +361,13 @@
If you want to make changes to the products you bought, you can click on the button to change your order.
{% endblocktrans %}
</p>
<p>
<a href="{% eventurl event 'presale:event.order.change' secret=order.secret order=order.code %}"
class="btn btn-default">
<span class="fa fa-edit" aria-hidden="true"></span>
{% trans "Change order" %}
</a>
</p>
</li>
{% endif %}
{% if user_cancel_allowed %}
@@ -424,11 +431,13 @@
{% trans "This will invalidate all tickets in this order." %}
</p>
{% endif %}
<p>
<a href="{% eventurl event 'presale:event.order.cancel' secret=order.secret order=order.code %}"
class="btn btn-danger">
<span class="fa fa-remove" aria-hidden="true"></span>
{% trans "Cancel order" %}
</a>
</p>
{% else %}
<p>
{% blocktrans trimmed %}
@@ -436,11 +445,13 @@
{% endblocktrans %}
{% trans "This will invalidate all tickets in this order." %}
</p>
<p>
<a href="{% eventurl event 'presale:event.order.cancel' secret=order.secret order=order.code %}"
class="btn btn-danger">
<span class="fa fa-remove" aria-hidden="true"></span>
{% trans "Cancel order" %}
</a>
</p>
{% endif %}
</li>
{% endif %}

View File

@@ -30,7 +30,7 @@
</label>
<div class="col-md-9 form-control-text">
<ul class="addon-list">
{{ pos.subevent.name }} &middot; {{ pos.subevent.get_date_range_display }}
{{ pos.subevent.name }} &middot; {{ pos.subevent.get_date_range_display_as_html }}
{% if pos.event.settings.show_times %}
<span class="fa fa-clock-o" aria-hidden="true"></span>
{{ pos.subevent.date_from|date:"TIME_FORMAT" }}

View File

@@ -6,7 +6,7 @@
{% load eventurl %}
{% block title %}{% trans "Registration details" %}{% endblock %}
{% block content %}
<h2>
<h2 class="h1">
{% blocktrans trimmed %}
Your registration
{% endblocktrans %}
@@ -18,9 +18,11 @@
{% trans "View in backend" %}
</a>
{% endif %}
{% include "pretixpresale/event/fragment_order_status.html" with order=order event=request.event class="pull-right flip" %}
<div class="clearfix"></div>
</h2>
<dl class="lead order-details">
<dt class="sr-only">Status</dt>
<dd class="text-muted">{% include "pretixpresale/event/fragment_order_status.html" with order=order event=request.event %}</dd>
</dl>
{% eventsignal event "pretix.presale.signals.position_info_top" order=order position=position request=request %}
{% include "pretixpresale/event/fragment_downloads.html" with position_page=True %}
<div class="panel panel-primary cart">

View File

@@ -26,29 +26,37 @@
<div class="info-row">
<span class="fa fa-clock-o fa-fw" aria-hidden="true"></span>
<p>
{{ ev.get_date_range_display }}
{{ ev.get_date_range_display_as_html }}
{% if event.settings.show_times %}
<br>
{% blocktrans trimmed with time=ev.date_from|date:"TIME_FORMAT" %}
Begin: {{ time }}
{% endblocktrans %}
{% with time_human=ev.date_from|date:"TIME_FORMAT" time_24=ev.date_from|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
Begin: {{ time }}
{% endblocktrans %}
{% endwith %}
{% if event.settings.show_date_to and ev.date_to %}
<br>
{% blocktrans trimmed with time=ev.date_to|date:"TIME_FORMAT" %}
End: {{ time }}
{% endblocktrans %}
{% with time_human=ev.date_to|date:"TIME_FORMAT" time_24=ev.date_to|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
End: {{ time }}
{% endblocktrans %}
{% endwith %}
{% endif %}
{% endif %}
{% if ev.date_admission %}
<br>
{% if ev.date_admission|date:"SHORT_DATE_FORMAT" == ev.date_from|date:"SHORT_DATE_FORMAT" %}
{% blocktrans trimmed with time=ev.date_admission|date:"TIME_FORMAT" %}
Admission: {{ time }}
{% endblocktrans %}
{% with time_human=ev.date_admission|date:"TIME_FORMAT" time_24=ev.date_admission|time:"H:i" %}
{% blocktrans trimmed with time='<time datetime="'|add:time_24|add:'">'|add:time_human|add:"</time>"|safe %}
Admission: {{ time }}
{% endblocktrans %}
{% endwith %}
{% else %}
{% blocktrans trimmed with datetime=ev.date_admission|date:"SHORT_DATETIME_FORMAT" %}
Admission: {{ datetime }}
{% endblocktrans %}
{% with datetime_human=ev.date_admission|date:"SHORT_DATETIME_FORMAT" datetime_iso=ev.date_admission|time:"Y-m-d H:i" %}
{% blocktrans trimmed with datetime='<time datetime="'|add:datetime_iso|add:'">'|add:datetime_human|add:"</time>"|safe %}
Admission: {{ datetime }}
{% endblocktrans %}
{% endwith %}
{% endif %}
{% endif %}
<br>
@@ -215,7 +223,6 @@
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
pattern="\d*"
max="{{ item.order_max }}"
id="variation_{{ item.id }}_{{ var.id }}"
name="variation_{{ item.id }}_{{ var.id }}"
@@ -324,7 +331,6 @@
</label>
{% else %}
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
pattern="\d*"
max="{{ item.order_max }}"
id="item_{{ item.id }}"
name="item_{{ item.id }}"

View File

@@ -3,14 +3,21 @@
{% block title %}{% trans "Waiting list" %}{% endblock %}
{% block content %}
<h2>{% trans "Add me to the waiting list" %}</h2>
<form action="" method="post">
<form action="{{ request.get_full_path }}" method="post">
{% csrf_token %}
<div class="form-horizontal">
<div class="form-group">
<label class="col-md-3 control-label" for="input_product">{% trans "Product" %}</label>
<div class="col-md-9">
<input id="input_product" class="form-control" readonly="readonly"
value="{{ item.name }}{% if variation %} {{ variation.value }}{% endif %}">
</div>
</div>
{% if subevent %}
<div class="form-group">
<label class="col-md-3 control-label" for="id_email">{% trans "Event" %}</label>
<label class="col-md-3 control-label" for="input_subevent">{% trans "Event" %}</label>
<div class="col-md-9">
<input class="form-control" readonly="readonly"
<input id="input_subevent" class="form-control" readonly="readonly"
value="{{ subevent.name }} {{ subevent.get_date_range_display }}">
</div>
</div>
@@ -18,14 +25,16 @@
{% bootstrap_form form layout="checkout" %}
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<div class="help-block">
<p class="help-block">
{% blocktrans trimmed with hours=event.settings.waiting_list_hours %}
If tickets become available again, we will inform the first persons on the waiting list. If we notify you, you'll have {{ hours }} hours time to buy a ticket until we assign it to the next person on the list.
{% endblocktrans %}
</div>
<button type="submit" class="btn btn-primary">
{% trans "Add me to the list" %}
</button>
</p>
<p>
<button type="submit" class="btn btn-primary">
{% trans "Add me to the list" %}
</button>
</p>
</div>
</div>
</div>

View File

@@ -1,15 +1,16 @@
{% load i18n %}
<div class="table-responsive">
<table class="table table-calendar">
<caption class="sr-only">{% trans "Calendar" %}</caption>
<thead>
<tr>
<th>{{ weeks.1.0.date|date:"D" }}</th>
<th>{{ weeks.1.1.date|date:"D" }}</th>
<th>{{ weeks.1.2.date|date:"D" }}</th>
<th>{{ weeks.1.3.date|date:"D" }}</th>
<th>{{ weeks.1.4.date|date:"D" }}</th>
<th>{{ weeks.1.5.date|date:"D" }}</th>
<th>{{ weeks.1.6.date|date:"D" }}</th>
<th><span aria-hidden="true">{{ weeks.1.0.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.0.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.1.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.1.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.2.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.2.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.3.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.3.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.4.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.4.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.5.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.5.date|date:"l" }}</span></th>
<th><span aria-hidden="true">{{ weeks.1.6.date|date:"D" }}</span><span class="sr-only">{{ weeks.1.6.date|date:"l" }}</span></th>
</tr>
</thead>
<tbody>
@@ -19,10 +20,10 @@
{% if day %}
<td class="day {% if day.events %}has-events{% else %}no-events{% endif %}"
data-date="{{ day.date|date:"SHORT_DATE_FORMAT" }}">
<h3>{{ day.day }}</h3>
<div class="events">
<p><time datetime="{{ day.date|date:"Y-m-d" }}">{{ day.day }}</time></p>
<ul class="events">
{% for event in day.events %}
<a class="event {% if event.continued %}continued{% else %} {% spaceless %}
<li><a class="event {% if event.continued %}continued{% else %} {% spaceless %}
{% if event.event.presale_is_running and show_avail %}
{% if event.event.best_availability_state == 100 %}
available
@@ -56,9 +57,9 @@
{% if not show_names|default_if_none:True %}
<strong>
{% endif %}
{{ event.time|date:"TIME_FORMAT" }}
<time datetime="{{ event.time|date:"H:i" }}">{{ event.time|date:"TIME_FORMAT" }}</time>
{% if event.event.settings.show_date_to and event.time_end %}
{{ event.time_end|date:"TIME_FORMAT" }}
<span aria-hidden="true"></span><span class="sr-only">{% trans "until" context "timerange" %}</span> <time datetime="{{ event.time_end|date:"H:i" }}">{{ event.time_end|date:"TIME_FORMAT" }}</time>
{% endif %}
{% if not show_names|default_if_none:True %}
</strong>
@@ -89,17 +90,19 @@
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Sale over" %}
{% elif event.event.settings.presale_start_show_date and event.event.presale_start %}
<span class="fa fa-ticket" aria-hidden="true"></span>
{% blocktrans with start_date=event.event.presale_start|date:"SHORT_DATE_FORMAT" %}
{% with date_human=event.event.presale_start|date:"SHORT_DATE_FORMAT" date_iso=event.event.presale_start|date:"c" %}
{% blocktrans with start_date="<time datetime='"|add:date_iso|add:"'>"|add:date_human|add:"</time>"|safe %}
from {{ start_date }}
{% endblocktrans %}
{% endwith %}
{% else %}
<span class="fa fa-ticket" aria-hidden="true"></span> {% trans "Soon" %}
{% endif %}
</span>
{% endif %}
</a>
</a></li>
{% endfor %}
</div>
</ul>
</td>
{% else %}
<td class="no-day"></td>

View File

@@ -1,15 +1,17 @@
{% load i18n %}
<div id="ajaxerr">
</div>
<div id="loadingmodal">
<div id="loadingmodal" hidden aria-live="polite">
<div class="modal-card">
<div class="modal-card-icon">
<i class="fa fa-cog big-rotating-icon" aria-hidden="true"></i>
</div>
<div class="modal-card-content">
<h3></h3>
<p class="text"></p>
<p class="status">{% trans "If this takes longer than a few minutes, please contact us." %}</p>
<h3 id="loadingmodal-label"></h3>
<div id="loadingmodal-description">
<p class="text"></p>
<p class="status">{% trans "If this takes longer than a few minutes, please contact us." %}</p>
</div>
</div>
</div>
</div>

View File

@@ -4,11 +4,11 @@
<details class="weekday {% if day.events %}has-events{% else %}no-events{% endif %} {% if day.today %}today{% endif %}"
data-date="{{ day.date|date:"SHORT_DATE_FORMAT" }}" open>
<summary>
<h3><span class="fa fa-fw" aria-hidden="true"></span> {{ day.day_formatted }}</h3>
<h3><span class="fa fa-fw" aria-hidden="true"></span> <time datetime="{{ day.date|date:"Y-m-d" }}">{{ day.day_formatted }}</time></h3>
</summary>
<div class="events">
<ul class="events">
{% for event in day.events %}
<a class="event {% if event.continued %}continued{% else %} {% spaceless %}
<li><a class="event {% if event.continued %}continued{% else %} {% spaceless %}
{% if event.event.presale_is_running and show_avail %}
{% if event.event.best_availability_state == 100 %}
available
@@ -42,9 +42,9 @@
{% if not show_names|default_if_none:True %}
<strong>
{% endif %}
{{ event.time|date:"TIME_FORMAT" }}
<time datetime="{{ event.time|date:"H:i" }}">{{ event.time|date:"TIME_FORMAT" }}</time>
{% if event.time_end %}
{{ event.time_end|date:"TIME_FORMAT" }}
<span aria-hidden="true"></span><span class="sr-only">{% trans "until" context "timerange" %}</span> <time datetime="{{ event.time_end|date:"H:i" }}">{{ event.time_end|date:"TIME_FORMAT" }}</time>
{% endif %}
{% if not show_names|default_if_none:True %}
</strong>
@@ -83,9 +83,9 @@
{% endif %}
</span>
{% endif %}
</a>
</a></li>
{% endfor %}
</div>
</ul>
</details>
{% endfor %}
</div>

View File

@@ -22,8 +22,11 @@
{% if organizer.settings.locales|length > 1 %}
<nav class="locales" aria-label="{% trans "select language" %}">
{% for l in languages %}
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}%3F{{ request.META.QUERY_STRING|urlencode }}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow">
{{ l.name_local }}</a>
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}%3F{{ request.META.QUERY_STRING|urlencode }}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow"
lang="{{ l.code }}" hreflang="{{ l.code }}"
aria-label="{% language l.code %}{% blocktrans trimmed with language=l.name_local %}
Website in {{ language }}
{% endblocktrans %}{% endlanguage %}">{{ l.name_local }}</a>
{% endfor %}
</nav>
{% endif %}
@@ -56,8 +59,11 @@
{% if organizer.settings.locales|length > 1 %}
<nav class="locales" aria-label="{% trans "select language" %}">
{% for l in languages %}
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}%3F{{ request.META.QUERY_STRING|urlencode }}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow">
{{ l.name_local }}</a>
<a href="{% url "presale:locale.set" %}?locale={{ l.code }}&next={{ request.path }}%3F{{ request.META.QUERY_STRING|urlencode }}" class="{% if l.code == request.LANGUAGE_CODE %}active{% endif %}" rel="nofollow"
lang="{{ l.code }}" hreflang="{{ l.code }}"
aria-label="{% language l.code %}{% blocktrans trimmed with language=l.name_local %}
Website in {{ language }}
{% endblocktrans %}{% endlanguage %}">{{ l.name_local }}</a>
{% endfor %}
</nav>
{% endif %}
@@ -79,10 +85,9 @@
{% endblock %}
{% block footernav %}
{% if not request.event and request.organizer.settings.contact_mail %}
<a href="mailto:{{ request.organizer.settings.contact_mail }}">{% trans "Contact event organizer" %}</a> &middot;
<li><a href="mailto:{{ request.organizer.settings.contact_mail }}">{% trans "Contact event organizer" %}</a></li>
{% endif %}
{% if not request.event and request.organizer.settings.imprint_url %}
<a href="{% safelink request.organizer.settings.imprint_url %}" target="_blank" rel="noopener">{% trans "Imprint" %}</a>
&middot;
<li><a href="{% safelink request.organizer.settings.imprint_url %}" target="_blank" rel="noopener">{% trans "Imprint" %}</a></li>
{% endif %}
{% endblock %}

View File

@@ -42,13 +42,13 @@
{% trans "iCal" %}
</a>
</div>
<div class="col-sm-4 col-xs-12 text-center">
<select name="month" class="form-control">
<div class="col-sm-4 col-xs-12 text-center" role="group" aria-label="{% trans "Select month and year to show" %}">
<select name="month" class="form-control" aria-label="{% trans "Month" %}">
{% for m in months %}
<option value="{{ m|date:"m" }}" {% if m == date %}selected{% endif %}>{{ m|date:"F" }}</option>
{% endfor %}
</select>
<select name="year" class="form-control">
<select name="year" class="form-control" aria-label="{% trans "Year" %}">
{% for y in years %}
<option value="{{ y }}" {% if y == date.year %}selected{% endif %}>{{ y }}</option>
{% endfor %}

View File

@@ -37,6 +37,7 @@
</h3>
</div>
<table class="panel-body table table-hover">
<caption class="sr-only">{% trans "Usages" %}</caption>
<thead>
<tr>
<th>{% trans "Order code" %}</th>
@@ -74,10 +75,7 @@
</td>
<td class="text-right flip">
{% if op.canceled %}
<span class="label label-danger">
<span class="fa fa-times"></span>
{% trans "Canceled" %}
</span>
{% trans "Canceled" %} <i class="{{ class }} fa fa-times-circle text-danger" aria-hidden="true"></i>
{% else %}
{% include "pretixcontrol/orders/fragment_order_status.html" with order=op.order %}
{% endif %}

View File

@@ -111,6 +111,7 @@
</div>
<div role="tabpanel" class="tab-pane" id="memberships">
<table class="panel-body table table-hover">
<caption class="sr-only">{% trans "Memberships" %}</caption>
<thead>
<tr>
<th>{% trans "Membership type" %}</th>

View File

@@ -81,7 +81,7 @@
<div class="col-md-3 col-xs-12">
{% if e.settings.show_dates_on_frontpage %}
{{ e.daterange|default:e.get_date_range_display }}
{{ e.daterange|default:e.get_date_range_display_as_html }}
{% if e.settings.show_times and not e.has_subevents %}
{% timezone e.tzname %}
<br><small class="text-muted" data-time="{{ e.date_from.isoformat }}" data-timezone="{{ e.tzname }}">

View File

@@ -245,6 +245,7 @@ class CartMixin:
'minutes_left': minutes_left,
'seconds_left': seconds_left,
'first_expiry': first_expiry,
'is_ordered': bool(order),
'itemcount': sum(c.count for c in positions if not c.addon_to)
}

View File

@@ -630,7 +630,7 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
if err:
messages.error(request, _(err))
return redirect(self.get_index_url())
return redirect(self.get_index_url() + "?voucher_invalid")
return super().dispatch(request, *args, **kwargs)