forked from CGM_Public/pretix_original
* start impl of unavailability modes ui * add db migration * use new widget for more fields * improve contrast * use new widget for hide_without_voucher field * improved wording * rebase migration * undo changes to require_membership_hidden * code formatting * move unavail_reason logic around * enforce consistent state of hide_without_voucher / require_voucher * annotate unavailability info in get_grouped_items * remove MSIE6 compat * add unavailability reasons to widget * remove test output * Apply suggestions from code review text improvements Co-authored-by: Richard Schreiber <schreiber@rami.io> * add css fix for jumping items due to tooltip * dynamically retrieve unavailability reason message * widget: simplify logic conditions * add available_{from,until}_mode to api and api docs * rebase migration * rebase migration * add unavailable_*_mode to ItemVariation * add available_*_mode to API docs for items * fix wrong reference * fix test cases * add available_*_mode to item variation form * apply unavailability modes to subevents and variations (presale) * /o\ * apply unavailability modes to subevents and variations (widget) * display unavailability mode in subevent product settings * fix widget test * fix api item tests * copy available_*_mode when copying an item * Apply suggestions from code review Co-authored-by: Raphael Michel <michel@rami.io> * Add unavail mode indicator to bulk create and edit forms --------- Co-authored-by: Richard Schreiber <schreiber@rami.io> Co-authored-by: Raphael Michel <michel@rami.io>
449 lines
36 KiB
HTML
449 lines
36 KiB
HTML
{% extends "pretixpresale/event/base.html" %}
|
|
{% load i18n %}
|
|
{% load l10n %}
|
|
{% load money %}
|
|
{% load eventurl %}
|
|
{% load eventsignal %}
|
|
{% load thumb %}
|
|
{% load rich_text %}
|
|
{% block title %}{% trans "Voucher redemption" %}{% endblock %}
|
|
|
|
{% block content %}
|
|
{% if show_cart %}
|
|
{% include "pretixpresale/event/fragment_cart_box.html" with open=request.GET.show_cart %}
|
|
{% endif %}
|
|
|
|
{% if subevent %}
|
|
<h2>{% trans "Voucher redemption" %}</h2>
|
|
{% if request.GET.subevent and subevent.pk|stringformat:"i" != request.GET.subevent %}
|
|
<div class="alert alert-warning">
|
|
{% trans "This voucher is valid only for the following specific date and time." %}
|
|
</div>
|
|
{% endif %}
|
|
<h3>{{ subevent.name }}</h3>
|
|
{% include "pretixpresale/event/fragment_event_info.html" with event=request.event subevent=subevent ev=subevent show_location=True %}
|
|
{% else %}
|
|
{% if event_logo and event_logo_show_title %}
|
|
<h2 class="content-header">
|
|
{{ event.name }}
|
|
{% if request.event.settings.show_dates_on_frontpage %}
|
|
<small>{{ event.get_date_range_display_as_html }}</small>
|
|
{% endif %}
|
|
</h2>
|
|
{% include "pretixpresale/event/fragment_event_info.html" with event=request.event subevent=None ev=request.event show_location=True %}
|
|
<h3>{% trans "Voucher redemption" %}</h3>
|
|
{% else %}
|
|
<h2>{% trans "Voucher redemption" %}</h2>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
<p>
|
|
{% if options == 0 and not seating_available %}
|
|
{% if request.event.has_subevents and not voucher.subevent %}
|
|
{% blocktrans trimmed %}
|
|
For the selected date, there are currently no products available that can be bought with this voucher. Please try a different date or a different voucher.
|
|
{% endblocktrans %}
|
|
{% else %}
|
|
{% blocktrans trimmed %}
|
|
There are currently no products available that can be bought with this voucher.
|
|
{% endblocktrans %}
|
|
{% endif %}
|
|
{% else %}
|
|
{% blocktrans trimmed %}
|
|
You entered a voucher code that allows you to buy one of the following products at the specified price:
|
|
{% endblocktrans %}
|
|
{% endif %}
|
|
</p>
|
|
{% if event.presale_is_running or event.settings.show_items_outside_presale_period %}
|
|
<form method="post"
|
|
action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ cart_redirect|urlencode }}{% if "iframe" in request.GET and not new_tab %}&iframe={{ request.GET.iframe }}{% endif %}{% if "take_cart_id" in request.GET and new_tab %}&take_cart_id={{ request.GET.take_cart_id }}{% endif %}" {% if new_tab %}target="_blank"{% else %}
|
|
data-asynctask
|
|
data-asynctask-headline="{% trans "We're now trying to reserve this for you!" %}"
|
|
class="{% if voucher.seating_available %}has-seating{% endif %}"
|
|
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 %}"
|
|
{% endif %}>
|
|
{% csrf_token %}
|
|
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />
|
|
<input type="hidden" name="_voucher_code" value="{{ voucher.code }}">
|
|
|
|
{% if seating_available %}
|
|
{% if event.has_subevents %}
|
|
{% eventsignal event "pretix.presale.signals.render_seating_plan" request=request subevent=subevent voucher=voucher %}
|
|
{% else %}
|
|
{% eventsignal event "pretix.presale.signals.render_seating_plan" request=request voucher=voucher %}
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% for tup in items_by_category %}
|
|
<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 %}
|
|
{% endif %}
|
|
{% for item in tup.1 %}
|
|
{% if item.has_variations %}
|
|
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="item-with-variations" id="item-{{ item.pk }}">
|
|
<div class="row product-row headline">
|
|
<div class="col-md-8 col-sm-6 col-xs-12">
|
|
{% if item.picture %}
|
|
<a href="{{ item.picture.url }}" class="productpicture"
|
|
data-title="{{ item.name|force_escape|force_escape }}"
|
|
{# Yes, double-escape to prevent XSS in lightbox #}
|
|
data-lightbox="{{ item.id }}"
|
|
aria-label="{% blocktrans trimmed with item=item.name %}Show full-size image of {{ item }}{% endblocktrans %}">
|
|
<img src="{{ item.picture|thumb:'60x60^' }}"
|
|
alt="{{ item.name }}"/>
|
|
</a>
|
|
{% endif %}
|
|
<div class="product-description {% if item.picture %}with-picture{% endif %}">
|
|
<h4>
|
|
{{ item.name }}
|
|
</h4>
|
|
{% if item.description %}
|
|
<div class="product-description">
|
|
{{ item.description|localize|rich_text }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 col-sm-3 col-xs-6 price">
|
|
{% if item.min_price != item.max_price or item.free_price %}
|
|
{% blocktrans trimmed with minprice=item.min_price|money:event.currency %}
|
|
from {{ minprice }}
|
|
{% endblocktrans %}
|
|
{% elif not item.min_price and not item.max_price %}
|
|
{% if not item.mandatory_priced_addons or voucher.all_addons_included %}
|
|
<span class="text-uppercase">{% trans "free" context "price" %}</span>
|
|
{% endif %}
|
|
{% else %}
|
|
{{ item.min_price|money:event.currency }}
|
|
{% endif %}
|
|
</div>
|
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box">
|
|
</div>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
<div class="variations">
|
|
{% for var in item.available_variations %}
|
|
<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-sm-6 col-xs-12">
|
|
<h5 id="item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
|
|
{% if var.description %}
|
|
<div id="item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
|
|
{{ var.description|localize|rich_text }}
|
|
</div>
|
|
{% endif %}
|
|
{% if item.do_show_quota_left %}
|
|
{% include "pretixpresale/event/fragment_quota_left.html" with avail=var.cached_availability %}
|
|
{% endif %}
|
|
</div>
|
|
<div class="col-md-2 col-sm-3 col-xs-6 price">
|
|
{% if var.original_price %}
|
|
<p>
|
|
<del><span class="sr-only">{% trans "Original price:" %}</span>
|
|
{% if event.settings.display_net_prices %}
|
|
{{ var.original_price.net|money:event.currency }}
|
|
{% else %}
|
|
{{ var.original_price.gross|money:event.currency }}
|
|
{% endif %}
|
|
</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>
|
|
<div class="input-group input-group-price">
|
|
<span class="input-group-addon">{{ event.currency }}</span>
|
|
<input type="number" class="form-control input-item-price"
|
|
id="price-variation-{{ item.pk }}-{{ var.pk }}"
|
|
placeholder="0"
|
|
min="{% if event.settings.display_net_prices %}{{ var.display_price.net|stringformat:"0.2f" }}{% else %}{{ var.display_price.gross|stringformat:"0.2f" }}{% endif %}"
|
|
name="price_{{ item.id }}_{{ var.id }}"
|
|
{% if var.suggested_price.gross != var.display_price.gross %}
|
|
{% if event.settings.display_net_prices %}
|
|
title="{% blocktrans trimmed with item=var.value price=var.display_price.net|money:event.currency %}Modify price for {{ item }}, at least {{ price }}{% endblocktrans %}"
|
|
{% else %}
|
|
title="{% blocktrans trimmed with item=var.value price=var.display_price.gross|money:event.currency %}Modify price for {{ item }}, at least {{ price }}{% endblocktrans %}"
|
|
{% endif %}
|
|
{% else %}
|
|
title="{% blocktrans trimmed with item=var.value %}Modify price for {{ item }}{% endblocktrans %}"
|
|
{% endif %}
|
|
value="{% if event.settings.display_net_prices %}{{var.suggested_price.net|stringformat:"0.2f" }}{% else %}{{ var.suggested_price.gross|stringformat:"0.2f" }}{% endif %}"
|
|
step="any">
|
|
</div>
|
|
<p>
|
|
{% elif not var.display_price.gross %}
|
|
{% if not item.mandatory_priced_addons or var.original_price or voucher.all_addons_included %}
|
|
<span class="text-uppercase">{% trans "free" context "price" %}</span>
|
|
{% endif %}
|
|
{% elif event.settings.display_net_prices %}
|
|
{{ var.display_price.net|money:event.currency }}
|
|
{% else %}
|
|
{{ var.display_price.gross|money:event.currency }}
|
|
{% endif %}
|
|
{% if item.original_price or var.original_price %}
|
|
</ins>
|
|
{% endif %}
|
|
{% if item.includes_mixed_tax_rate %}
|
|
{% if event.settings.display_net_prices %}
|
|
<small>{% trans "plus taxes" %}</small>
|
|
{% else %}
|
|
<small>{% trans "incl. taxes" %}</small>
|
|
{% endif %}
|
|
{% elif var.display_price.rate and var.display_price.gross and event.settings.display_net_prices %}
|
|
<small data-toggle="tooltip" title="{% blocktrans trimmed with value=var.display_price.gross|money:event.currency %}{{ value }} incl. taxes{% endblocktrans %}" data-placement="bottom">
|
|
{% blocktrans trimmed with rate=var.display_price.rate|floatformat:-2 name=var.display_price.name %}
|
|
<strong>plus</strong> {{ rate }}% {{ name }}
|
|
{% endblocktrans %}
|
|
</small>
|
|
{% elif var.display_price.rate and var.display_price.gross %}
|
|
<small data-toggle="tooltip" title="{% blocktrans trimmed with value=var.display_price.net|money:event.currency %}{{ value }} without taxes{% endblocktrans %}" data-placement="bottom">
|
|
{% blocktrans trimmed with rate=var.display_price.rate|floatformat:-2 name=var.display_price.name %}
|
|
incl. {{ rate }}% {{ name }}
|
|
{% endblocktrans %}
|
|
</small>
|
|
{% endif %}
|
|
</p>
|
|
</div>
|
|
{% if var.cached_availability.0 == 100 and not item.current_unavailability_reason %}
|
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available radio-box">
|
|
{% if max_times > 1 %}
|
|
{% if var.order_max == 1 %}
|
|
<label class="btn btn-default btn-checkbox">
|
|
<input type="checkbox"
|
|
value="1"
|
|
id="variation_{{ item.id }}_{{ var.id }}"
|
|
name="variation_{{ item.id }}_{{ var.id }}"
|
|
{% if options == 1 %}checked{% endif %}
|
|
aria-label="{% blocktrans with item=item.name var=var %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}"
|
|
{% if var.description %} aria-describedby="item-{{ item.pk }}-{{ var.pk }}-description"{% endif %}>
|
|
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
|
|
{% trans "Select" context "checkbox" %}
|
|
</label>
|
|
{% else %}
|
|
<div class="input-item-count-group">
|
|
<button type="button" data-step="-1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
|
|
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
|
|
max="{{ var.order_max }}"
|
|
id="variation_{{ item.id }}_{{ var.id }}"
|
|
name="variation_{{ item.id }}_{{ var.id }}"
|
|
{% if options == 1 %}value="1"{% endif %}
|
|
aria-label="{% blocktrans with item=item.name var=var.name %}Quantity of {{ item }}, {{ var }} to order{% endblocktrans %}">
|
|
<button type="button" data-step="1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<label>
|
|
<input type="radio" name="_voucher_item"
|
|
{% if options == 1 %}checked="checked"{% endif %}
|
|
id="variation_{{ item.id }}_{{ var.id }}"
|
|
value="variation_{{ item.id }}_{{ var.id }}"
|
|
aria-label="{% blocktrans with item=item.name var=var %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}"
|
|
{% if var.description %} aria-describedby="item-{{ item.pk }}-{{ var.pk }}-description"{% endif %}>
|
|
</label>
|
|
{% endif %}
|
|
</div>
|
|
{% else %}
|
|
{% include "pretixpresale/event/fragment_availability.html" with price=var.display_price.gross avail=var.cached_availability.0 item=item %}
|
|
{% endif %}
|
|
<div class="clearfix"></div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</article>
|
|
{% else %}
|
|
<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-sm-6 col-xs-12">
|
|
{% if item.picture %}
|
|
<a href="{{ item.picture.url }}" class="productpicture"
|
|
data-title="{{ item.name|force_escape|force_escape }}"
|
|
{# Yes, double-escape to prevent XSS in lightbox #}
|
|
data-lightbox="{{ item.id }}"
|
|
aria-label="{% blocktrans trimmed with item=item.name %}Show full-size image of {{ item }}{% endblocktrans %}">
|
|
<img src="{{ item.picture|thumb:'60x60^' }}"
|
|
alt="{{ item.name }}"/>
|
|
</a>
|
|
{% endif %}
|
|
<div class="product-description {% if item.picture %}with-picture{% endif %}">
|
|
<h4 id="item-{{ item.pk }}-legend">{{ item.name }}</h4>
|
|
{% if item.description %}
|
|
<div id="item-{{ item.pk }}-description" class="product-description">
|
|
{{ item.description|localize|rich_text }}
|
|
</div>
|
|
{% endif %}
|
|
{% if item.do_show_quota_left %}
|
|
{% include "pretixpresale/event/fragment_quota_left.html" with avail=item.cached_availability %}
|
|
{% endif %}
|
|
{% if item.min_per_order and item.min_per_order > 1 %}
|
|
<p>
|
|
<small>
|
|
{% blocktrans trimmed with num=item.min_per_order %}
|
|
minimum amount to order: {{ num }}
|
|
{% endblocktrans %}
|
|
</small>
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 col-sm-3 col-xs-6 price">
|
|
{% if item.original_price %}
|
|
<p>
|
|
<del><span class="sr-only">{% trans "Original price:" %}</span>
|
|
{% if event.settings.display_net_prices %}
|
|
{{ item.original_price.net|money:event.currency }}
|
|
{% else %}
|
|
{{ item.original_price.gross|money:event.currency }}
|
|
{% endif %}
|
|
</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 currency=event.currency %}Set price in {{ currency }} for {{ item }}{% endblocktrans %}</label>
|
|
<span class="input-group-addon">{{ event.currency }}</span>
|
|
<input type="number" class="form-control input-item-price" placeholder="0"
|
|
min="{% if event.settings.display_net_prices %}{{ item.display_price.net|stringformat:"0.2f" }}{% else %}{{ item.display_price.gross|stringformat:"0.2f" }}{% endif %}"
|
|
name="price_{{ item.id }}"
|
|
{% if item.suggested_price.gross != item.display_price.gross %}
|
|
{% if event.settings.display_net_prices %}
|
|
title="{% blocktrans trimmed with item=item.name price=item.display_price.net|money:event.currency %}Modify price for {{ item }}, at least {{ price }}{% endblocktrans %}"
|
|
{% else %}
|
|
title="{% blocktrans trimmed with item=item.name price=item.display_price.gross|money:event.currency %}Modify price for {{ item }}, at least {{ price }}{% endblocktrans %}"
|
|
{% endif %}
|
|
{% else %}
|
|
title="{% blocktrans trimmed with item=item.name %}Modify price for {{ item }}{% endblocktrans %}"
|
|
{% endif %}
|
|
value="{% if event.settings.display_net_prices %}{{ item.suggested_price.net|stringformat:"0.2f" }}{% else %}{{ item.suggested_price.gross|stringformat:"0.2f" }}{% endif %}"
|
|
step="any">
|
|
</div>
|
|
<p>
|
|
{% elif not item.display_price.gross %}
|
|
{% if not item.mandatory_priced_addons or item.original_price or voucher.all_addons_included %}
|
|
<span class="text-uppercase">{% trans "free" context "price" %}</span>
|
|
{% endif %}
|
|
{% elif event.settings.display_net_prices %}
|
|
{{ item.display_price.net|money:event.currency }}
|
|
{% else %}
|
|
{{ item.display_price.gross|money:event.currency }}
|
|
{% endif %}
|
|
{% if item.original_price %}
|
|
</ins>
|
|
{% endif %}
|
|
{% if item.includes_mixed_tax_rate %}
|
|
{% if event.settings.display_net_prices %}
|
|
<small>{% trans "plus taxes" %}</small>
|
|
{% else %}
|
|
<small>{% trans "incl. taxes" %}</small>
|
|
{% endif %}
|
|
{% elif item.display_price.rate and item.display_price.gross and event.settings.display_net_prices %}
|
|
<small data-toggle="tooltip" title="{% blocktrans trimmed with value=item.display_price.gross|money:event.currency %}{{ value }} incl. taxes{% endblocktrans %}" data-placement="bottom">
|
|
{% blocktrans trimmed with rate=item.display_price.rate|floatformat:-2 name=item.display_price.name %}
|
|
<strong>plus</strong> {{ rate }}% {{ name }}
|
|
{% endblocktrans %}
|
|
</small>
|
|
{% elif item.display_price.rate and item.display_price.gross %}
|
|
<small data-toggle="tooltip" title="{% blocktrans trimmed with value=item.display_price.net|money:event.currency %}{{ value }} without taxes{% endblocktrans %}" data-placement="bottom">
|
|
{% blocktrans trimmed with rate=item.display_price.rate|floatformat:-2 name=item.display_price.name %}
|
|
incl. {{ rate }}% {{ name }}
|
|
{% endblocktrans %}
|
|
</small>
|
|
{% endif %}
|
|
</p>
|
|
</div>
|
|
{% if item.cached_availability.0 == 100 and not item.current_unavailability_reason %}
|
|
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available radio-box">
|
|
{% if max_times > 1 %}
|
|
{% if item.order_max == 1 %}
|
|
<label class="btn btn-default btn-checkbox">
|
|
<input type="checkbox"
|
|
value="1"
|
|
id="item_{{ item.id }}"
|
|
name="item_{{ item.id }}"
|
|
{% if options == 1 %}checked{% endif %}
|
|
aria-label="{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}"
|
|
{% if item.description %} aria-describedby="item-{{ item.id }}-description"{% endif %}>
|
|
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
|
|
{% trans "Select" context "checkbox" %}
|
|
</label>
|
|
{% else %}
|
|
<div class="input-item-count-group">
|
|
<button type="button" data-step="-1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
|
|
<input type="number" class="form-control input-item-count"
|
|
placeholder="0" min="0"
|
|
max="{{ item.order_max }}"
|
|
id="item_{{ item.id }}"
|
|
name="item_{{ item.id }}"
|
|
{% if options == 1 %}value="1"{% endif %}
|
|
aria-label="{% blocktrans with item=item.name %}Quantity of {{ item }} to order{% endblocktrans %}"
|
|
{% if item.description %} aria-describedby="item-{{ item.id }}-description"{% endif %}>
|
|
<button type="button" data-step="1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<label>
|
|
<input type="radio" name="_voucher_item"
|
|
{% if options == 1 %}checked="checked"{% endif %}
|
|
id="item_{{ item.id }}"
|
|
value="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>
|
|
{% endif %}
|
|
</div>
|
|
{% else %}
|
|
{% include "pretixpresale/event/fragment_availability.html" with price=item.display_price.gross avail=item.cached_availability.0 item=item %}
|
|
{% endif %}
|
|
<div class="clearfix"></div>
|
|
</article>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</section>
|
|
{% endfor %}
|
|
{% eventsignal event "pretix.presale.signals.voucher_redeem_info" voucher=voucher %}
|
|
{% if event.presale_is_running and options > 0 %}
|
|
<div class="row checkout-button-row">
|
|
<div class="col-md-4 col-md-offset-8 col-xs-12 text-center">
|
|
{% if voucher.min_usages_remaining > 1 %}
|
|
<p class="text-muted">
|
|
<small>
|
|
{% blocktrans trimmed with number=voucher.min_usages_remaining %}
|
|
You need to select at least {{ number }} products.
|
|
{% endblocktrans %}
|
|
</small>
|
|
</p>
|
|
{% endif %}
|
|
<button class="btn btn-block btn-primary btn-lg" id="btn-add-to-cart" type="submit">
|
|
{% if request.event.settings.redirect_to_checkout_directly %}
|
|
{% if allfree %}
|
|
<i class="fa fa-check" aria-hidden="true"></i> {% trans "Register" context "free_tickets" %}
|
|
{% else %}
|
|
<i class="fa fa-shopping-cart" aria-hidden="true"></i> {% trans "Proceed with checkout" %}
|
|
{% endif %}
|
|
{% else %}
|
|
<i class="fa fa-shopping-cart" aria-hidden="true"></i> {% trans "Add to cart" %}
|
|
{% endif %}
|
|
</button>
|
|
</div>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
{% endif %}
|
|
{% if "widget_data" in request.GET %}
|
|
<input type="hidden" value="{{ request.GET.widget_data }}" name="widget_data">
|
|
{% endif %}
|
|
</form>
|
|
{% endif %}
|
|
{% endblock %}
|