mirror of
https://github.com/pretix/pretix.git
synced 2026-10-02 19:24:42 +00:00
Compare commits
30
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffebfce2b3 | ||
|
|
62ba861cd2 | ||
|
|
c880e427c5 | ||
|
|
f702d44e19 | ||
|
|
2d8910e797 | ||
|
|
43a96ed3fa | ||
|
|
5df9a3fa8c | ||
|
|
fd002e0db0 | ||
|
|
6efa9f3f55 | ||
|
|
dbc9a72c90 | ||
|
|
3e6373485a | ||
|
|
f26c7984dc | ||
|
|
34440dcbdd | ||
|
|
4be74b7955 | ||
|
|
587b13807d | ||
|
|
4aac1df4dc | ||
|
|
ba2bd9bf54 | ||
|
|
169355cd43 | ||
|
|
cf4babd400 | ||
|
|
496be053ef | ||
|
|
c54be016de | ||
|
|
245c4fc996 | ||
|
|
a69927da84 | ||
|
|
d07026c4f6 | ||
|
|
54a657c8c9 | ||
|
|
87d9f278fb | ||
|
|
c84d1706b4 | ||
|
|
29205c490d | ||
|
|
b045274d8c | ||
|
|
9729496415 |
@@ -101,7 +101,6 @@ ALL_LANGUAGES = [
|
||||
('fi', _('Finnish')),
|
||||
('gl', _('Galician')),
|
||||
('el', _('Greek')),
|
||||
('he', _('Hebrew')),
|
||||
('id', _('Indonesian')),
|
||||
('it', _('Italian')),
|
||||
('ja', _('Japanese')),
|
||||
@@ -123,7 +122,7 @@ LANGUAGES_OFFICIAL = {
|
||||
}
|
||||
LANGUAGES_RTL = {
|
||||
# When adding more right-to-left languages, also update pretix/static/pretixbase/scss/_rtl.scss
|
||||
'ar', 'he'
|
||||
'ar', 'hw'
|
||||
}
|
||||
LANGUAGES_INCUBATING = {
|
||||
'pt-br', 'gl',
|
||||
|
||||
+10
-13
@@ -35,22 +35,19 @@ def get_powered_by(request, safelink=True):
|
||||
d = gs.settings.license_check_input
|
||||
if d.get('poweredby_name'):
|
||||
if d.get('poweredby_url'):
|
||||
msg = gettext('<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>').format(
|
||||
name=d['poweredby_name'],
|
||||
a_name_attr='href="{}" target="_blank" rel="noopener"'.format(
|
||||
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
|
||||
),
|
||||
a_attr='href="{}" target="_blank" rel="noopener"'.format(
|
||||
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
||||
)
|
||||
n = '<a href="{}" target="_blank" rel="noopener">{}</a>'.format(
|
||||
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
|
||||
d['poweredby_name']
|
||||
)
|
||||
else:
|
||||
msg = gettext('<a {a_attr}>powered by {name} based on pretix</a>').format(
|
||||
name=d['poweredby_name'],
|
||||
a_attr='href="{}" target="_blank" rel="noopener"'.format(
|
||||
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
||||
)
|
||||
n = d['poweredby_name']
|
||||
|
||||
msg = gettext('powered by {name} based on <a {a_attr}>pretix</a>').format(
|
||||
name=n,
|
||||
a_attr='href="{}" target="_blank" rel="noopener"'.format(
|
||||
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
|
||||
)
|
||||
)
|
||||
else:
|
||||
msg = gettext('<a %(a_attr)s>ticketing powered by pretix</a>') % {
|
||||
'a_attr': 'href="{}" target="_blank" rel="noopener"'.format(
|
||||
|
||||
@@ -1655,7 +1655,7 @@ def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel
|
||||
|
||||
|
||||
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
|
||||
def extend_cart_reservation(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
|
||||
def extend_cart_reservation(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> dict:
|
||||
"""
|
||||
Resets the expiry time of a cart to the configured reservation time of this event.
|
||||
Limited to 11x the reservation time.
|
||||
@@ -1672,7 +1672,7 @@ def extend_cart_reservation(self, event: Event, cart_id: str=None, locale='en',
|
||||
try:
|
||||
cm = CartManager(event=event, cart_id=cart_id, sales_channel=sales_channel)
|
||||
cm.commit()
|
||||
return cm.num_extended_positions
|
||||
return {"success": cm.num_extended_positions, "expiry": cm._expiry, "max_expiry_extend": cm._max_expiry_extend}
|
||||
except LockTimeoutException:
|
||||
self.retry()
|
||||
except (MaxRetriesExceededError, LockTimeoutException):
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#
|
||||
# This file is part of pretix (Community Edition).
|
||||
#
|
||||
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||
# Copyright (C) 2020-2021 rami.io GmbH and contributors
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||
#
|
||||
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||
# this file, see <https://pretix.eu/about/en/license>.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from django import template
|
||||
from django.utils.html import format_html
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from django.utils.translation import gettext_lazy as _ # NOQA
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def dialog(html_id, label, description, *args, **kwargs):
|
||||
format_kwargs = {
|
||||
"id": html_id,
|
||||
"label": label,
|
||||
"description": description,
|
||||
"icon": format_html('<div class="modal-card-icon"><span class="fa fa-{}" aria-hidden="true"></span></div>', kwargs["icon"]) if "icon" in kwargs else "",
|
||||
"alert": mark_safe('role="alertdialog"') if kwargs.get("alert", "False") != "False" else "",
|
||||
}
|
||||
result = """
|
||||
<dialog {alert}
|
||||
id="{id}"
|
||||
aria-labelledby="{id}-label"
|
||||
aria-describedby="{id}-description">
|
||||
<form method="dialog" class="modal-card form-horizontal">
|
||||
{icon}
|
||||
<div class="modal-card-content">
|
||||
<h2 id="{id}-label">{label}</h2>
|
||||
<p id="{id}-description">{description}</p>
|
||||
"""
|
||||
return format_html(result, **format_kwargs)
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def enddialog(*args, **kwargs):
|
||||
return mark_safe("""
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
""")
|
||||
@@ -68,7 +68,7 @@ class AsyncMixin:
|
||||
def get_check_url(self, task_id, ajax):
|
||||
return self.request.path + '?async_id=%s' % task_id + ('&ajax=1' if ajax else '')
|
||||
|
||||
def _ajax_response_data(self):
|
||||
def _ajax_response_data(self, value):
|
||||
return {}
|
||||
|
||||
def _return_ajax_result(self, res, timeout=.5):
|
||||
@@ -85,7 +85,7 @@ class AsyncMixin:
|
||||
logger.warning('Ignored ResponseError in AsyncResult.get()')
|
||||
except ConnectionError:
|
||||
# Redis probably just restarted, let's just report not ready and retry next time
|
||||
data = self._ajax_response_data()
|
||||
data = self._ajax_response_data(None)
|
||||
data.update({
|
||||
'async_id': res.id,
|
||||
'ready': False
|
||||
@@ -93,7 +93,7 @@ class AsyncMixin:
|
||||
return data
|
||||
|
||||
state, info = res.state, res.info
|
||||
data = self._ajax_response_data()
|
||||
data = self._ajax_response_data(info)
|
||||
data.update({
|
||||
'async_id': res.id,
|
||||
'ready': ready,
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/clipboard.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/menu.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/sb-admin-2.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/dialogs.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/asynctask.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/main.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/quota.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/rrule.js" %}"></script>
|
||||
@@ -54,7 +56,6 @@
|
||||
<script type="text/javascript" src="{% static "leaflet/leaflet.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/ui/geo.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/details.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/asynctask.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "sortable/Sortable.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "colorpicker/bootstrap-colorpicker.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "fileupload/jquery.ui.widget.js" %}"></script>
|
||||
@@ -463,25 +464,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ajaxerr">
|
||||
</div>
|
||||
<div id="loadingmodal">
|
||||
<div class="modal-card">
|
||||
<div class="modal-card-icon">
|
||||
<i class="fa fa-cog big-rotating-icon"></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>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success">
|
||||
</div>
|
||||
</div>
|
||||
<div class="steps">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ajaxerr" class="modal-wrapper" hidden>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34519,7 +34519,7 @@ msgid "Add to cart"
|
||||
msgstr "أضف إلى سلة التسوق"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "إذا كنت قد طلبت تذكرة سابقا"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33955,7 +33955,7 @@ msgid "Add to cart"
|
||||
msgstr "Afegir a la cistella"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Si ja teniu tiquets demanats"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -8,16 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
|
||||
"PO-Revision-Date: 2025-05-16 17:00+0000\n"
|
||||
"Last-Translator: David <davemachala@gmail.com>\n"
|
||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/>"
|
||||
"\n"
|
||||
"PO-Revision-Date: 2025-02-19 17:00+0000\n"
|
||||
"Last-Translator: Petr Čermák <pcermak@live.com>\n"
|
||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/"
|
||||
">\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 5.10\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -57,7 +57,7 @@ msgstr "Čeština"
|
||||
|
||||
#: pretix/_base_settings.py:96
|
||||
msgid "Croatian"
|
||||
msgstr "Chorvatština"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/_base_settings.py:97
|
||||
msgid "Danish"
|
||||
@@ -2971,9 +2971,12 @@ msgid "Repeat password"
|
||||
msgstr "Opakovat heslo"
|
||||
|
||||
#: pretix/base/forms/questions.py:134 pretix/base/forms/questions.py:256
|
||||
#, fuzzy
|
||||
#| msgctxt "subevent"
|
||||
#| msgid "No date was specified."
|
||||
msgctxt "name_salutation"
|
||||
msgid "not specified"
|
||||
msgstr "neuvedeno"
|
||||
msgstr "Nebylo uvedeno žádné datum."
|
||||
|
||||
#: pretix/base/forms/questions.py:219
|
||||
msgid "Please do not use special characters in names."
|
||||
@@ -4224,14 +4227,20 @@ msgstr ""
|
||||
"automatická sleva poskytnuta i nadále."
|
||||
|
||||
#: pretix/base/models/discount.py:177
|
||||
#, fuzzy
|
||||
#| msgctxt "subevent"
|
||||
#| msgid "All dates starting before"
|
||||
msgctxt "subevent"
|
||||
msgid "Available for dates starting from"
|
||||
msgstr "Dostupné pro termíny začínající od"
|
||||
msgstr "Všechny termíny začínající před"
|
||||
|
||||
#: pretix/base/models/discount.py:182
|
||||
#, fuzzy
|
||||
#| msgctxt "subevent"
|
||||
#| msgid "All dates starting before"
|
||||
msgctxt "subevent"
|
||||
msgid "Available for dates starting until"
|
||||
msgstr "Dostupné pro termíny začínající do"
|
||||
msgstr "Všechny termíny začínající před"
|
||||
|
||||
#: pretix/base/models/discount.py:214
|
||||
msgid ""
|
||||
@@ -13465,7 +13474,7 @@ msgstr "Schváleno, čeká se na platbu"
|
||||
#: pretix/plugins/reports/exporters.py:380
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:7
|
||||
msgid "Approval pending"
|
||||
msgstr "Čeká na schválení"
|
||||
msgstr "Čeká se na schválení"
|
||||
|
||||
#: pretix/control/forms/filter.py:241
|
||||
#, fuzzy
|
||||
@@ -18840,7 +18849,7 @@ msgstr "Kontrola"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html:50
|
||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html:80
|
||||
msgid "No results"
|
||||
msgstr "Žádné výsledky"
|
||||
msgstr "Bez výsledků"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/mail.html:7
|
||||
#: pretix/control/templates/pretixcontrol/organizers/mail.html:11
|
||||
@@ -32266,7 +32275,7 @@ msgid "Add to cart"
|
||||
msgstr "Přidat do košíku"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Pokud jste si již vstupenku objednali"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
|
||||
"PO-Revision-Date: 2025-05-16 17:00+0000\n"
|
||||
"Last-Translator: David <davemachala@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-02-19 17:00+0000\n"
|
||||
"Last-Translator: Petr Čermák <pcermak@live.com>\n"
|
||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"cs/>\n"
|
||||
"Language: cs\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 5.10\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -237,11 +237,11 @@ msgstr "Zrušeno"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
|
||||
msgid "Confirmed"
|
||||
msgstr "Potvrzeno"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
|
||||
msgid "Approval pending"
|
||||
msgstr "Čeká na schválení"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
|
||||
msgid "Redeemed"
|
||||
@@ -440,7 +440,7 @@ msgstr "je po"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
|
||||
msgid "="
|
||||
msgstr "="
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
|
||||
msgid "Product"
|
||||
@@ -452,7 +452,7 @@ msgstr "Varianta produktu"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
|
||||
msgid "Gate"
|
||||
msgstr "Brána"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
|
||||
msgid "Current date and time"
|
||||
@@ -557,12 +557,12 @@ msgstr "Duplikát"
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
|
||||
msgctxt "entry_status"
|
||||
msgid "present"
|
||||
msgstr "přítomen"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
|
||||
msgctxt "entry_status"
|
||||
msgid "absent"
|
||||
msgstr "nepřítomen"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:171
|
||||
msgid "Check-in QR"
|
||||
@@ -692,8 +692,10 @@ msgid "Calculating default price…"
|
||||
msgstr "Výpočet standardní ceny…"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/plugins.js:69
|
||||
#, fuzzy
|
||||
#| msgid "Search results"
|
||||
msgid "No results"
|
||||
msgstr "Žádné výsledky"
|
||||
msgstr "Vyhledat výsledky"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js:42
|
||||
msgid "Others"
|
||||
@@ -762,57 +764,64 @@ msgid "Your local time:"
|
||||
msgstr "Místní čas:"
|
||||
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
||||
#, fuzzy
|
||||
#| msgid "Apple Pay"
|
||||
msgid "Google Pay"
|
||||
msgstr "Google Pay"
|
||||
msgstr "Apple Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:16
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr "Počet"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:17
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr "Snížit počet"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:18
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr "Zvýšit počet"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr "Cena"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr "Původní cena: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr "Nová cena: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:22
|
||||
#, fuzzy
|
||||
#| msgid "Selected only"
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr "Vybrat"
|
||||
msgstr "Pouze vybrané"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:23
|
||||
#, javascript-format
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "Selected only"
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr "Vybrat %s"
|
||||
msgstr "Pouze vybrané"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:24
|
||||
#, javascript-format
|
||||
#, fuzzy, javascript-format
|
||||
#| msgctxt "widget"
|
||||
#| msgid "See variations"
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr "Vybrat variantu %s"
|
||||
msgstr "Zobrazit možnosti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:25
|
||||
msgctxt "widget"
|
||||
@@ -848,7 +857,7 @@ msgstr "od %(currency)s %(price)s"
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr "Obrázek%s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:32
|
||||
msgctxt "widget"
|
||||
@@ -883,19 +892,24 @@ msgstr "K dispozici pouze s poukazem"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:41
|
||||
#, fuzzy
|
||||
#| msgid "Payment method unavailable"
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr "Zatím není k dispozici"
|
||||
msgstr "Způsob platby není k dispozici"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:39
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr "Již není k dispozici"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:40
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "currently available: %s"
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "Momentálně není k dispozici."
|
||||
msgstr "aktuálně k dispozici: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:42
|
||||
#, javascript-format
|
||||
@@ -928,9 +942,12 @@ msgid "Open ticket shop"
|
||||
msgstr "Obchod vstupenek otevřit"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:48
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr "Checkout"
|
||||
msgstr "Obnovit checkout"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:49
|
||||
msgctxt "widget"
|
||||
@@ -992,14 +1009,20 @@ msgid "Continue"
|
||||
msgstr "Pokračovat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:61
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "See variations"
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr "Zobrazit možnosti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "See variations"
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr "Skrýt možnosti"
|
||||
msgstr "Zobrazit možnosti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
@@ -1087,31 +1110,31 @@ msgstr "Ne"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:81
|
||||
msgid "Monday"
|
||||
msgstr "Pondělí"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:82
|
||||
msgid "Tuesday"
|
||||
msgstr "Úterý"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:83
|
||||
msgid "Wednesday"
|
||||
msgstr "Středa"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:84
|
||||
msgid "Thursday"
|
||||
msgstr "Čtvrtek"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:85
|
||||
msgid "Friday"
|
||||
msgstr "Pátek"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:86
|
||||
msgid "Saturday"
|
||||
msgstr "Sobota"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:87
|
||||
msgid "Sunday"
|
||||
msgstr "Neděle"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:90
|
||||
msgid "January"
|
||||
|
||||
@@ -29951,7 +29951,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32689,7 +32689,7 @@ msgid "Add to cart"
|
||||
msgstr "Læg i kurv"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Hvis du allerede har bestilt en billet"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33772,7 +33772,7 @@ msgid "Add to cart"
|
||||
msgstr "Zum Warenkorb hinzufügen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Wenn Sie bereits ein Ticket bestellt haben"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33711,7 +33711,7 @@ msgid "Add to cart"
|
||||
msgstr "Zum Warenkorb hinzufügen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Wenn du bereits ein Ticket bestellt hast"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29858,7 +29858,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -36098,7 +36098,7 @@ msgid "Add to cart"
|
||||
msgstr "Προσθήκη στο καλάθι"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Αν έχετε ήδη αγοράσει κάποιο εισιτήριο"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
|
||||
"PO-Revision-Date: 2025-05-14 02:00+0000\n"
|
||||
"PO-Revision-Date: 2025-05-07 06:00+0000\n"
|
||||
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"es/>\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 5.11.1\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -2595,7 +2595,7 @@ msgstr "Vales de compra bloqueados"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:1135 pretix/control/views/item.py:982
|
||||
msgid "Current user's carts"
|
||||
msgstr "Carrito actual del usuario"
|
||||
msgstr "Cesta actual del usuario"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:1135
|
||||
msgid "Exited orders"
|
||||
@@ -4244,13 +4244,12 @@ msgid ""
|
||||
"discounted. If you want to grant the discount on all matching products, keep "
|
||||
"this field empty."
|
||||
msgstr ""
|
||||
"Esta opción le permite crear descuentos del tipo "
|
||||
"\"compre X y obtenga Y reducido/gratis\". Por ejemplo, si establece "
|
||||
"\"Número mínimo de productos coincidentes\" en cuatro y este valor en dos, "
|
||||
"el carrito del cliente se dividirá en grupos de cuatro entradas y se "
|
||||
"descontarán las dos entradas más baratos dentro de cada grupo. Si desea "
|
||||
"otorgar el descuento en todos los productos coincidentes, mantenga este "
|
||||
"campo vacío."
|
||||
"Esta opción le permite crear descuentos del tipo \"compre X y obtenga Y "
|
||||
"reducido/gratis\". Por ejemplo, si establece \"Número mínimo de productos "
|
||||
"coincidentes\" en cuatro y este valor en dos, la cesta del cliente se "
|
||||
"dividirá en grupos de cuatro entradas y se descontarán las dos entradas más "
|
||||
"baratos dentro de cada grupo. Si desea otorgar el descuento en todos los "
|
||||
"productos coincidentes, mantenga este campo vacío."
|
||||
|
||||
#: pretix/base/models/discount.py:165
|
||||
msgid "Apply to add-on products"
|
||||
@@ -4720,7 +4719,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py:126
|
||||
msgid "Only show if the cart contains one of the following products"
|
||||
msgstr "Sólo se muestra el carrito contiene uno de los siguientes productos"
|
||||
msgstr "Sólo se muestra si la cesta contiene uno de los siguientes productos"
|
||||
|
||||
#: pretix/base/models/items.py:129
|
||||
msgid "Cross-selling condition"
|
||||
@@ -4990,7 +4989,7 @@ msgid ""
|
||||
"many times. If you keep the field empty or set it to 0, there is no special "
|
||||
"limit for this product."
|
||||
msgstr ""
|
||||
"Este producto sólo se puede comprar si se agrega al carrito por lo menos "
|
||||
"Este producto sólo se puede comprar si se agrega a la cesta por lo menos "
|
||||
"esta cantidad de veces. Si deja el campo vacío o lo fija en 0, no hay ningún "
|
||||
"límite especial para este producto."
|
||||
|
||||
@@ -6064,15 +6063,15 @@ msgstr "Posición del pedido"
|
||||
|
||||
#: pretix/base/models/orders.py:3091
|
||||
msgid "Cart ID (e.g. session key)"
|
||||
msgstr "ID de carrito (p. ej. clave de sesión)"
|
||||
msgstr "ID de cesta (p. ej. clave de sesión)"
|
||||
|
||||
#: pretix/base/models/orders.py:3128
|
||||
msgid "Cart position"
|
||||
msgstr "Posición del carrito"
|
||||
msgstr "Posición de la cesta"
|
||||
|
||||
#: pretix/base/models/orders.py:3129
|
||||
msgid "Cart positions"
|
||||
msgstr "Posiciones del carrito"
|
||||
msgstr "Posiciones de la cesta"
|
||||
|
||||
#: pretix/base/models/orders.py:3265
|
||||
msgid "Business customer"
|
||||
@@ -6637,7 +6636,7 @@ msgid ""
|
||||
"of a specific product, you can also select a quota. In this case, all "
|
||||
"products assigned to this quota can be selected."
|
||||
msgstr ""
|
||||
"Este producto añadirá al carrito del usuario si está usado el vale de "
|
||||
"Este producto añadirá a la cesta del usuario si está usado el vale de "
|
||||
"compra. En vez de un producto específico, se puede seleccionar una cuota. En "
|
||||
"este caso, todos los productos que están asignados al esta cuota se pueden "
|
||||
"seleccionar."
|
||||
@@ -7788,7 +7787,7 @@ msgstr "Usted no seleccionó ningún producto."
|
||||
|
||||
#: pretix/base/services/cart.py:105
|
||||
msgid "Unknown cart position."
|
||||
msgstr "Posición del carrito desconocida."
|
||||
msgstr "Posición de la cesta desconocida."
|
||||
|
||||
#: pretix/base/services/cart.py:106
|
||||
msgctxt "subevent"
|
||||
@@ -7822,7 +7821,7 @@ msgid ""
|
||||
"products are affected and have not been added to your cart: %s"
|
||||
msgstr ""
|
||||
"Algunos de los productos que seleccionó ya no están disponibles. Los "
|
||||
"siguientes productos están afectados y no se han agregado a su carrito: %s"
|
||||
"siguientes productos están afectados y no se han agregado a su cesta: %s"
|
||||
|
||||
#: pretix/base/services/cart.py:121
|
||||
#, python-format
|
||||
@@ -7833,7 +7832,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Algunos de los productos que seleccionó ya no están disponibles en la "
|
||||
"cantidad que seleccionó. Los siguientes productos están afectados y no se "
|
||||
"han agregado a su carrito: %s"
|
||||
"han agregado a su cesta: %s"
|
||||
|
||||
#: pretix/base/services/cart.py:126
|
||||
#, python-format
|
||||
@@ -7871,11 +7870,11 @@ msgid_plural ""
|
||||
"We removed %(product)s from your cart as you can not buy less than %(min)s "
|
||||
"items of it."
|
||||
msgstr[0] ""
|
||||
"Eliminamos %(product)s de su carrito ya que no puede comprar menos de %(min)"
|
||||
"s artículo del mismo."
|
||||
"Eliminamos %(product)s de su cesta ya que no puede comprar menos de %(min)s "
|
||||
"artículo del mismo."
|
||||
msgstr[1] ""
|
||||
"Eliminamos %(product)s de su carrito ya que no puede comprar menos de %(min)"
|
||||
"s artículos del mismo."
|
||||
"Eliminamos %(product)s de su cesta ya que no puede comprar menos de %(min)s "
|
||||
"artículos del mismo."
|
||||
|
||||
#: pretix/base/services/cart.py:144 pretix/base/services/orders.py:154
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:167
|
||||
@@ -7901,7 +7900,7 @@ msgid ""
|
||||
"positions have been removed from your cart."
|
||||
msgstr ""
|
||||
"El período de preventa de este evento aún no ha comenzado. Las posiciones "
|
||||
"afectadas han sido eliminadas de su carrito."
|
||||
"afectadas han sido eliminadas de su cesta."
|
||||
|
||||
#: pretix/base/services/cart.py:151 pretix/base/services/orders.py:182
|
||||
msgid ""
|
||||
@@ -7909,7 +7908,7 @@ msgid ""
|
||||
"affected positions have been removed from your cart."
|
||||
msgstr ""
|
||||
"El período de preventa de uno de los eventos de su cesta ha finalizado. Las "
|
||||
"posiciones afectadas han sido eliminadas de su carrito."
|
||||
"posiciones afectadas han sido eliminadas de su cesta."
|
||||
|
||||
#: pretix/base/services/cart.py:153
|
||||
msgid "The entered price is not a number."
|
||||
@@ -7951,11 +7950,11 @@ msgid_plural ""
|
||||
msgstr[0] ""
|
||||
"El vale de compra \"%(voucher)s\" solo se puede utilizar si selecciona al "
|
||||
"menos %(number)s productos coincidentes. Por lo tanto, hemos eliminado "
|
||||
"algunas posiciones de su carrito que ya no se pueden comprar así."
|
||||
"algunas posiciones de su cesta que ya no se pueden comprar así."
|
||||
msgstr[1] ""
|
||||
"Los vale de compra \"%(voucher)s\" solo se pueden utilizar si selecciona al "
|
||||
"menos %(number)s productos coincidentes. Por lo tanto, hemos eliminado "
|
||||
"algunas posiciones de su carrito que ya no se pueden comprar así."
|
||||
"algunas posiciones de su cesta que ya no se pueden comprar así."
|
||||
|
||||
#: pretix/base/services/cart.py:168
|
||||
msgid ""
|
||||
@@ -7972,7 +7971,7 @@ msgid ""
|
||||
"process. You can try to use it again in %d minutes."
|
||||
msgstr ""
|
||||
"Este vale de compra está actualmente bloqueado ya que está contenido en un "
|
||||
"carrito de la compra. Esto puede significar que otra persona está canjeando "
|
||||
"cesta de la compra. Esto puede significar que otra persona está canjeando "
|
||||
"este vale de compra ahora mismo, o que usted intentó canjearlo antes pero no "
|
||||
"completó el proceso de pago. Puede intentar utilizarlo de nuevo en %d "
|
||||
"minutos."
|
||||
@@ -7987,7 +7986,7 @@ msgid ""
|
||||
"Applying a voucher to the whole cart should not be combined with other "
|
||||
"operations."
|
||||
msgstr ""
|
||||
"La aplicación de un vale de compra a todo el carrito no debe combinarse con "
|
||||
"La aplicación de un vale de compra a todo la cesta no debe combinarse con "
|
||||
"otras operaciones."
|
||||
|
||||
#: pretix/base/services/cart.py:178
|
||||
@@ -7995,7 +7994,7 @@ msgid ""
|
||||
"You already used this voucher code. Remove the associated line from your "
|
||||
"cart if you want to use it for a different product."
|
||||
msgstr ""
|
||||
"Ya ha utilizado este vale de compra. Elimine la línea asociada de su carrito "
|
||||
"Ya ha utilizado este vale de compra. Elimine la línea asociada de su cesta "
|
||||
"si desea utilizarlo para un producto diferente."
|
||||
|
||||
#: pretix/base/services/cart.py:181
|
||||
@@ -8016,7 +8015,7 @@ msgid ""
|
||||
"for. If you want to add something new to your cart using that voucher, you "
|
||||
"can do so with the voucher redemption option on the bottom of the page."
|
||||
msgstr ""
|
||||
"No encontramos ninguna posición en su carrito para la que podamos usar este "
|
||||
"No encontramos ninguna posición en su cesta para la que podamos usar este "
|
||||
"vale de compra. Si desea agregar algo nuevo a su cesta usando ese vale de "
|
||||
"compra, puede hacerlo con la opción de canje de vale de compra en la parte "
|
||||
"inferior de la página."
|
||||
@@ -8617,8 +8616,8 @@ msgid ""
|
||||
"The price of some of the items in your cart has changed in the meantime. "
|
||||
"Please see below for details."
|
||||
msgstr ""
|
||||
"El precio de algunos de los artículos en su carrito ha cambiado en el "
|
||||
"durante este tiempo. Por favor vea abajo para más detalles."
|
||||
"El precio de algunos de los artículos en su cesta ha cambiado en el durante "
|
||||
"este tiempo. Por favor vea abajo para más detalles."
|
||||
|
||||
#: pretix/base/services/orders.py:141
|
||||
msgid "An internal error occurred, please try again."
|
||||
@@ -8634,7 +8633,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/services/orders.py:144
|
||||
msgid "Your cart is empty."
|
||||
msgstr "Su carrito está vacío."
|
||||
msgstr "Su cesta está vacía."
|
||||
|
||||
#: pretix/base/services/orders.py:146
|
||||
#, python-format
|
||||
@@ -8646,10 +8645,10 @@ msgid_plural ""
|
||||
"removed the surplus items from your cart."
|
||||
msgstr[0] ""
|
||||
"No puede seleccionar más de %(max)s artículos del producto %(product)s. "
|
||||
"Eliminamos el artículo sobrante de su carrito."
|
||||
"Eliminamos el artículo sobrante de su cesta."
|
||||
msgstr[1] ""
|
||||
"No puede seleccionar más de %(max)s artículos del producto %(product)s. "
|
||||
"Eliminamos los artículos sobrantes de su carrito."
|
||||
"Eliminamos los artículos sobrantes de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:155
|
||||
msgid "The booking period has ended."
|
||||
@@ -8660,7 +8659,7 @@ msgid ""
|
||||
"The voucher code used for one of the items in your cart is not known in our "
|
||||
"database."
|
||||
msgstr ""
|
||||
"El vale de compra utilizado para uno de los artículos de su carrito no es "
|
||||
"El vale de compra utilizado para uno de los artículos de su cesta no es "
|
||||
"conocido en nuestra base de datos."
|
||||
|
||||
#: pretix/base/services/orders.py:163
|
||||
@@ -8669,16 +8668,16 @@ msgid ""
|
||||
"used the maximum number of times allowed. We removed this item from your "
|
||||
"cart."
|
||||
msgstr ""
|
||||
"El vale de compra utilizado para uno de los artículos de su carrito ya ha "
|
||||
"sido utilizado el máximo número de veces permitido. Hemos quitado este "
|
||||
"artículo de su cesta."
|
||||
"El vale de compra utilizado para uno de los artículos de su cesta ya ha sido "
|
||||
"utilizado el máximo número de veces permitido. Hemos quitado este artículo "
|
||||
"de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:167
|
||||
msgid ""
|
||||
"The voucher code used for one of the items in your cart has already been too "
|
||||
"often. We adjusted the price of the item in your cart."
|
||||
msgstr ""
|
||||
"El vale de compra utilizado para uno de los artículos de su carrito ya se ha "
|
||||
"El vale de compra utilizado para uno de los artículos de su cesta ya se ha "
|
||||
"utilizado con demasiada frecuencia. Ajustamos el precio del artículo en su "
|
||||
"cesta."
|
||||
|
||||
@@ -8687,16 +8686,16 @@ msgid ""
|
||||
"The voucher code used for one of the items in your cart is expired. We "
|
||||
"removed this item from your cart."
|
||||
msgstr ""
|
||||
"El vale de compra utilizado para uno de los artículos de su carrito ha "
|
||||
"caducado. Hemos quitado este artículo de su carrito."
|
||||
"El vale de compra utilizado para uno de los artículos de su cesta ha "
|
||||
"caducado. Hemos quitado este artículo de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:174
|
||||
msgid ""
|
||||
"The voucher code used for one of the items in your cart is not valid for "
|
||||
"this item. We removed this item from your cart."
|
||||
msgstr ""
|
||||
"El vale de compra utilizado para uno de los artículos de su carrito no es "
|
||||
"válido para este artículo. Hemos quitado este artículo de su carrito."
|
||||
"El vale de compra utilizado para uno de los artículos de su cesta no es "
|
||||
"válido para este artículo. Hemos quitado este artículo de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:176
|
||||
msgid "You need a valid voucher code to order one of the products."
|
||||
@@ -8707,22 +8706,22 @@ msgid ""
|
||||
"The booking period for one of the events in your cart has not yet started. "
|
||||
"The affected positions have been removed from your cart."
|
||||
msgstr ""
|
||||
"El período de preventa de uno de los eventos de su carrito aún no ha "
|
||||
"comenzado. Las posiciones afectadas han sido eliminadas de su carrito."
|
||||
"El período de preventa de uno de los eventos de su cesta aún no ha "
|
||||
"comenzado. Las posiciones afectadas han sido eliminadas de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:185
|
||||
msgid ""
|
||||
"One of the seats in your order was invalid, we removed the position from "
|
||||
"your cart."
|
||||
msgstr ""
|
||||
"Uno de las butacas de su pedido no era válida, la eliminamos de su carrito."
|
||||
"Uno de las butacas de su pedido no era válida, la eliminamos de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:186
|
||||
msgid ""
|
||||
"One of the seats in your order has been taken in the meantime, we removed "
|
||||
"the position from your cart."
|
||||
msgstr ""
|
||||
"Una de las butaca de su pedido ha sido ocupada. La eliminamos de su carrito."
|
||||
"Una de las butaca de su pedido ha sido ocupada. La eliminamos de su cesta."
|
||||
|
||||
#: pretix/base/services/orders.py:202
|
||||
#, python-format
|
||||
@@ -9155,8 +9154,8 @@ msgid ""
|
||||
"Independent of your choice, the cart will show gross prices as this is the "
|
||||
"price that needs to be paid."
|
||||
msgstr ""
|
||||
"Independientemente de su elección, el carrito mostrará los precios brutos, "
|
||||
"ya que este es el precio que debe pagarse."
|
||||
"Independientemente de su elección, el cesta mostrará los precios brutos, ya "
|
||||
"que este es el precio que debe pagarse."
|
||||
|
||||
#: pretix/base/settings.py:338
|
||||
msgid "Hide prices on attendee ticket page"
|
||||
@@ -9522,15 +9521,15 @@ msgstr "Período de reserva"
|
||||
msgid ""
|
||||
"The number of minutes the items in a user's cart are reserved for this user."
|
||||
msgstr ""
|
||||
"El número de minutos que los artículos en el carrito de un usuario "
|
||||
"permanecen reservados para un usuario."
|
||||
"El número de minutos que los artículos en la cesta de un usuario permanecen "
|
||||
"reservados para un usuario."
|
||||
|
||||
#: pretix/base/settings.py:807
|
||||
msgid ""
|
||||
"Directly redirect to check-out after a product has been added to the cart."
|
||||
msgstr ""
|
||||
"Redirigir directamente a la compra después de que un producto se haya "
|
||||
"agregado a la carrito."
|
||||
"agregado a la cesta."
|
||||
|
||||
#: pretix/base/settings.py:816
|
||||
msgid "End of presale text"
|
||||
@@ -14676,8 +14675,8 @@ msgid ""
|
||||
"\"inactive\" instead."
|
||||
msgstr ""
|
||||
"La variación \"%s\" no se puede borrar porque ya ha sido pedida por un "
|
||||
"usuario o está actualmente en el carrito de un usuario. En su lugar, "
|
||||
"configure la variación como \"inactiva\"."
|
||||
"usuario o está actualmente en la cesta de un usuario. En su lugar, configure "
|
||||
"la variación como \"inactiva\"."
|
||||
|
||||
#: pretix/control/forms/item.py:994
|
||||
msgid "Use value from product"
|
||||
@@ -19855,7 +19854,7 @@ msgstr "Añadir enlace"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:345
|
||||
msgid "Cart"
|
||||
msgstr "Carrito"
|
||||
msgstr "Cesta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:353
|
||||
msgid ""
|
||||
@@ -20285,7 +20284,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Ejemplos: múltiples presentaciones del mismo espectáculo, el mismo concierto "
|
||||
"en múltiples ubicaciones, museos, bibliotecas o piscinas, eventos que deben "
|
||||
"reservarse juntos en un solo carrito."
|
||||
"reservarse juntos en una sola cesta."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_foundation.html:53
|
||||
msgid ""
|
||||
@@ -20875,7 +20874,7 @@ msgid ""
|
||||
"as add-ons in the cart for this product."
|
||||
msgstr ""
|
||||
"Con los paquetes, puede especificar productos que siempre se agregan "
|
||||
"automáticamente al carrito como complementos para este producto."
|
||||
"automáticamente a la cesta como complementos para este producto."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/item/include_bundles.html:68
|
||||
msgid "Add a new bundled product"
|
||||
@@ -21061,7 +21060,7 @@ msgstr "Condición"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/discount.html:34
|
||||
msgid "Minimum cart content"
|
||||
msgstr "Contenido mínimo del carrito"
|
||||
msgstr "Contenido mínimo de la cesta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/discount.html:43
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:53
|
||||
@@ -21157,7 +21156,7 @@ msgid ""
|
||||
"overlapping discounts, the first one in the order of the list below will "
|
||||
"apply."
|
||||
msgstr ""
|
||||
"Un sólo desuento puede aplicarse a los productos del carrito. Si tiene "
|
||||
"Un sólo desuento puede aplicarse a los productos de la cesta. Si tiene "
|
||||
"descuentos superpuestos, se aplicará el primero en el pedido de la lista "
|
||||
"siguiente."
|
||||
|
||||
@@ -25823,7 +25822,7 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:4
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:6
|
||||
msgid "Delete carts"
|
||||
msgstr "Eliminar carrito"
|
||||
msgstr "Eliminar cestas"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:9
|
||||
#, python-format
|
||||
@@ -25831,7 +25830,7 @@ msgid ""
|
||||
"Are you sure you want to delete any cart positions with voucher "
|
||||
"<strong>%(voucher)s</strong>?"
|
||||
msgstr ""
|
||||
"¿Está seguro de que desea eliminar alguna entrada del carrito con vale de "
|
||||
"¿Está seguro de que desea eliminar alguna entrada de la cesta con vale de "
|
||||
"compra <strong>%(voucher)s</strong>?"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:10
|
||||
@@ -25840,7 +25839,7 @@ msgid ""
|
||||
"a purchase. This can be really confusing. Only use this if you know that the "
|
||||
"session is no longer in use."
|
||||
msgstr ""
|
||||
"Esto eliminará silenciosamente productos del carrito de un usuario que "
|
||||
"Esto eliminará silenciosamente productos de la cesta de un usuario que "
|
||||
"actualmente realiza una compra. Esto puede resultar realmente confuso. "
|
||||
"Utilice esto únicamente si sabe que la sesión ya no está en uso."
|
||||
|
||||
@@ -25860,13 +25859,13 @@ msgid ""
|
||||
"This voucher is currently used in %(number)s cart sessions and might not be "
|
||||
"free to use until the cart sessions expire."
|
||||
msgstr ""
|
||||
"Este vale de compra se utiliza actualmente en %(number)s sesiones del "
|
||||
"carrito y es posible que no sea de uso gratuito hasta que caduque la sesión "
|
||||
"de la cesta."
|
||||
"Este vale de compra se utiliza actualmente en %(number)s sesiones de la "
|
||||
"cesta y es posible que no sea de uso gratuito hasta que caduque la sesión de "
|
||||
"la cesta."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html:28
|
||||
msgid "Remove cart positions"
|
||||
msgstr "Eliminar elemento del carrito"
|
||||
msgstr "Eliminar element de la cesta"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/detail.html:43
|
||||
msgid "Voucher link"
|
||||
@@ -32152,7 +32151,7 @@ msgid ""
|
||||
"Your cart includes a product that requires an active membership to be "
|
||||
"selected."
|
||||
msgstr ""
|
||||
"Su carrito incluye un producto que requiere una suscripción activa para ser "
|
||||
"Su cesta incluye un producto que requiere una suscripción activa para ser "
|
||||
"seleccionado."
|
||||
|
||||
#: pretix/presale/checkoutflow.py:489
|
||||
@@ -32188,8 +32187,8 @@ msgid ""
|
||||
"accordingly."
|
||||
msgstr ""
|
||||
"Debido a la dirección de factura que ingresó, necesitamos aplicar una tasa "
|
||||
"impositiva diferente a su compra y el precio de los productos en su carrito "
|
||||
"ha cambiado en consecuencia."
|
||||
"impositiva diferente a su compra y el precio de los productos en su cesta ha "
|
||||
"cambiado en consecuencia."
|
||||
|
||||
#: pretix/presale/checkoutflow.py:1029
|
||||
msgid "Please enter your invoicing address."
|
||||
@@ -32547,7 +32546,7 @@ msgid ""
|
||||
"For some of the products in your cart, you can choose additional options "
|
||||
"before you continue."
|
||||
msgstr ""
|
||||
"Para algunos de los productos en su carrito, usted puede elegir opciones "
|
||||
"Para algunos de los productos en su cesta, usted puede elegir opciones "
|
||||
"adicionales antes de continuar."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:16
|
||||
@@ -32555,7 +32554,7 @@ msgid ""
|
||||
"A product in your cart is only sold in combination with add-on products that "
|
||||
"are not available. Please contact the event organizer."
|
||||
msgstr ""
|
||||
"Un producto de su carrito sólo se vende en combinación con productos "
|
||||
"Un producto de su cesta sólo se vende en combinación con productos "
|
||||
"complementarios que no están disponibles. Póngase en contacto con el "
|
||||
"organizador del evento."
|
||||
|
||||
@@ -32603,17 +32602,17 @@ msgstr "Compra"
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:8
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:11
|
||||
msgid "Your cart"
|
||||
msgstr "Su carrito"
|
||||
msgstr "Su cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:28
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:31
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18
|
||||
msgid "Cart expired"
|
||||
msgstr "El carrito de compra ha expirado"
|
||||
msgstr "La cesta de compra ha expirado"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
|
||||
msgid "Show full cart"
|
||||
msgstr "Mostrar carrito completo"
|
||||
msgstr "Mostrar cesta completa"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:48
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:84
|
||||
@@ -32759,7 +32758,7 @@ msgid ""
|
||||
"Some of the products in your cart can only be purchased if there is an "
|
||||
"active membership on your account."
|
||||
msgstr ""
|
||||
"Algunos productos del carrito sólo pueden comprarse si existe una "
|
||||
"Algunos productos de la cesta sólo pueden comprarse si existe una "
|
||||
"suscripción activa en su cuenta."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_membership.html:37
|
||||
@@ -32892,7 +32891,7 @@ msgid ""
|
||||
"browser settings accordingly."
|
||||
msgstr ""
|
||||
"Su navegador no acepta cookies de nuestra parte. Sin embargo, necesitamos "
|
||||
"establecer una cookie para recordar quién es usted y qué hay en su carrito. "
|
||||
"establecer una cookie para recordar quién es usted y qué hay en su cesta. "
|
||||
"Por favor, cambie la configuración de su navegador en consecuencia."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:17
|
||||
@@ -33054,7 +33053,7 @@ msgstr "incluido. %(rate)s%% %(name)s"
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:252
|
||||
#, python-format
|
||||
msgid "Add %(item)s, %(var)s to cart"
|
||||
msgstr "Cantidad de %(item)s - %(var)s en el carrito"
|
||||
msgstr "Cantidad de %(item)s - %(var)s en la cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:203
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:349
|
||||
@@ -33093,7 +33092,7 @@ msgstr "Aumentar cantidad"
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:408
|
||||
#, python-format
|
||||
msgid "Add %(item)s to cart"
|
||||
msgstr "Añadir %(item)s al carrito"
|
||||
msgstr "Añadir %(item)s a la cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:379
|
||||
msgid "There are no add-ons available for this product."
|
||||
@@ -33215,12 +33214,12 @@ msgstr "Entendido, estamos removiendo eso…"
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:289
|
||||
#, python-format
|
||||
msgid "Remove %(item)s from your cart"
|
||||
msgstr "Eliminar %(item)s de su carrito"
|
||||
msgstr "Eliminar %(item)s de su cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:292
|
||||
#, python-format
|
||||
msgid "Remove one %(item)s from your cart"
|
||||
msgstr "Eliminar un %(item)s de tu carrito"
|
||||
msgstr "Eliminar un %(item)s de tu cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:294
|
||||
#, python-format
|
||||
@@ -33228,7 +33227,7 @@ msgid ""
|
||||
"Remove one %(item)s from your cart. You currently have %(count)s in your "
|
||||
"cart."
|
||||
msgstr ""
|
||||
"Elimina un %(item)s de su carrito. Actualmente tiene %(count)s en su carrito."
|
||||
"Elimina un %(item)s de su cesta. Actualmente tiene %(count)s en su cesta."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:302
|
||||
msgid "We're trying to reserve another one for you!"
|
||||
@@ -33243,13 +33242,13 @@ msgid ""
|
||||
"Once the items are in your cart, you will have %(time)s minutes to complete "
|
||||
"your purchase."
|
||||
msgstr ""
|
||||
"Una vez los elementos están en su carrito, tendrá %(time)s minutos para "
|
||||
"Una vez los elementos están en su cesta, tendrá %(time)s minutos para "
|
||||
"completar la compra."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:322
|
||||
#, python-format
|
||||
msgid "Add one more %(item)s to your cart"
|
||||
msgstr "Añadir un %(item)s más a su carrito"
|
||||
msgstr "Añadir un %(item)s más a su cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:324
|
||||
#, python-format
|
||||
@@ -33257,8 +33256,7 @@ msgid ""
|
||||
"Add one more %(item)s to your cart. You currently have %(count)s in your "
|
||||
"cart."
|
||||
msgstr ""
|
||||
"Agregar un %(item)s más a su carrito. Actualmente tiene %(count)s en su "
|
||||
"carrito."
|
||||
"Agregar un %(item)s más a su cesta. Actualmente tiene %(count)s en su cesta."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:384
|
||||
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:20
|
||||
@@ -33282,15 +33280,15 @@ msgstr "incl. %(tax_sum)s impuestos"
|
||||
#, python-format
|
||||
msgid "The items in your cart are reserved for you for %(minutes)s minutes."
|
||||
msgstr ""
|
||||
"Los artículos de su carrito están reservados durante %(minutes)ss minutos."
|
||||
"Los artículos de su cesta están reservados durante %(minutes)ss minutos."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:493
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they’re available."
|
||||
msgstr ""
|
||||
"Los elementos en su carrito de compras ya no se encuentran reservados. "
|
||||
"Puedes seguir añadiendo más productos mientras estén disponibles."
|
||||
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
|
||||
"seguir añadiendo más productos mientras estén disponibles."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:497
|
||||
msgid "Overview of your ordered products."
|
||||
@@ -33308,7 +33306,7 @@ msgstr "Proceder con la compra"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:63
|
||||
msgid "Empty cart"
|
||||
msgstr "Vaciar carrito"
|
||||
msgstr "Vaciar cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:68
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:246
|
||||
@@ -33318,7 +33316,7 @@ msgstr "Canjear vale de compra"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:71
|
||||
msgid "We're applying this voucher to your cart..."
|
||||
msgstr "Estamos aplicando este vale de compra a su carrito..."
|
||||
msgstr "Estamos aplicando este vale de compra a su cesta..."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:79
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:26
|
||||
@@ -33694,11 +33692,11 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:48
|
||||
msgid "Your cart, general information, add products to your cart"
|
||||
msgstr "Su carrito, información general, añadir productos a su carrito"
|
||||
msgstr "Su cesta, información general, añadir productos a su cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:48
|
||||
msgid "General information, add products to your cart"
|
||||
msgstr "Información general, añadir productos al carrito"
|
||||
msgstr "Información general, añadir productos a la cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:68
|
||||
msgid "Please select a date to redeem your voucher."
|
||||
@@ -33752,10 +33750,10 @@ msgstr "Registrarse"
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:232
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html:443
|
||||
msgid "Add to cart"
|
||||
msgstr "Agregar al carrito"
|
||||
msgstr "Agregar a la cesta"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Si ya ha pedido una entrada"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
@@ -34592,8 +34590,8 @@ msgid ""
|
||||
"Functional cookies (e.g. shopping cart, login, payment, language preference) "
|
||||
"and technical cookies (e.g. security purposes)"
|
||||
msgstr ""
|
||||
"Cookies funcionales (por ejemplo, carrito de compras, inicio de sesión, "
|
||||
"pago, preferencia de idioma) y cookies técnicas (por ejemplo, con fines de "
|
||||
"Cookies funcionales (por ejemplo, cesta de compras, inicio de sesión, pago, "
|
||||
"preferencia de idioma) y cookies técnicas (por ejemplo, con fines de "
|
||||
"seguridad)"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:89
|
||||
@@ -34885,26 +34883,26 @@ msgstr "Por favor, introduzca sólo números positivos."
|
||||
#: pretix/presale/views/cart.py:441
|
||||
msgid "We applied the voucher to as many products in your cart as we could."
|
||||
msgstr ""
|
||||
"Aplicamos el vale de compra a tantos productos en su carrito como pudimos."
|
||||
"Aplicamos el vale de compra a tantos productos en su cesta como pudimos."
|
||||
|
||||
#: pretix/presale/views/cart.py:460 pretix/presale/views/cart.py:468
|
||||
msgid ""
|
||||
"The gift card has been saved to your cart. Please continue your checkout."
|
||||
msgstr ""
|
||||
"La tarjeta regalo se ha guardado en su carrito. Continúe con el proceso de "
|
||||
"La tarjeta regalo se ha guardado en su cesta. Continúe con el proceso de "
|
||||
"compra."
|
||||
|
||||
#: pretix/presale/views/cart.py:504
|
||||
msgid "Your cart has been updated."
|
||||
msgstr "Su carrito ha sido actualizada."
|
||||
msgstr "Su cesta ha sido actualizada."
|
||||
|
||||
#: pretix/presale/views/cart.py:507 pretix/presale/views/cart.py:533
|
||||
msgid "Your cart is now empty."
|
||||
msgstr "Su carrito ha sido vaciada."
|
||||
msgstr "Su cesta ha sido vaciada."
|
||||
|
||||
#: pretix/presale/views/cart.py:548
|
||||
msgid "The products have been successfully added to your cart."
|
||||
msgstr "Los productos se han añadido con éxito a su carrito."
|
||||
msgstr "Los productos se han añadido con éxito a su cesta."
|
||||
|
||||
#: pretix/presale/views/cart.py:572 pretix/presale/views/event.py:540
|
||||
#: pretix/presale/views/widget.py:377
|
||||
@@ -34917,8 +34915,8 @@ msgid ""
|
||||
"The gift card has been saved to your cart. Please now select the products "
|
||||
"you want to purchase."
|
||||
msgstr ""
|
||||
"La tarjeta regalo se ha guardado en su carrito. Seleccione ahora los "
|
||||
"productos que desea comprar."
|
||||
"La tarjeta regalo se ha guardado en su cesta. Seleccione ahora los productos "
|
||||
"que desea comprar."
|
||||
|
||||
#: pretix/presale/views/cart.py:739
|
||||
msgctxt "subevent"
|
||||
@@ -34927,7 +34925,7 @@ msgstr "No pudimos encontrar la fecha especificada."
|
||||
|
||||
#: pretix/presale/views/checkout.py:55
|
||||
msgid "Your cart is empty"
|
||||
msgstr "Su carito está vacío"
|
||||
msgstr "Su cesta está vacía"
|
||||
|
||||
#: pretix/presale/views/checkout.py:59
|
||||
msgid "The booking period for this event is over or has not yet started."
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
|
||||
"PO-Revision-Date: 2025-05-14 02:00+0000\n"
|
||||
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
|
||||
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/es/>\n"
|
||||
"Language: es\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 5.11.1\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -706,12 +706,12 @@ msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they’re available."
|
||||
msgstr ""
|
||||
"Los elementos en su carrito de compras ya no se encuentran reservados. "
|
||||
"Puedes seguir añadiendo más productos mientras estén disponibles."
|
||||
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
|
||||
"seguir añadiendo más productos mientras estén disponibles."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:45
|
||||
msgid "Cart expired"
|
||||
msgstr "El carrito de compra ha expirado"
|
||||
msgstr "La cesta de compra ha expirado"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:50
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
|
||||
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32099,7 +32099,7 @@ msgid "Add to cart"
|
||||
msgstr "Saskira gehitu"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Dagoeneko sarrera bat eskatu baduzu"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -31848,7 +31848,7 @@ msgid "Add to cart"
|
||||
msgstr "Lisää ostoskoriin"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Jos tilasit jo tuotteita"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29880,7 +29880,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34033,7 +34033,7 @@ msgid "Add to cart"
|
||||
msgstr "Ajouter au panier"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Si vous avez déjà commandé un billet"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -35859,7 +35859,7 @@ msgid "Add to cart"
|
||||
msgstr "Engadir ao pedido"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Se xa pediu unha entrada"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
+11771
-8703
File diff suppressed because it is too large
Load Diff
@@ -30700,7 +30700,7 @@ msgid "Add to cart"
|
||||
msgstr "Dodaj u košaricu"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Ako ste već kupili kartu"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
|
||||
"PO-Revision-Date: 2025-05-17 18:00+0000\n"
|
||||
"PO-Revision-Date: 2025-04-14 23:00+0000\n"
|
||||
"Last-Translator: Patrick Chilton <chpatrick@gmail.com>\n"
|
||||
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"hu/>\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 5.10.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -14670,7 +14670,7 @@ msgstr "A kiválasztott \"{seat}\" ülés nem elérhető."
|
||||
#: pretix/control/logdisplay.py:406 pretix/control/views/orders.py:1573
|
||||
#: pretix/presale/views/order.py:1047
|
||||
msgid "The order has been canceled."
|
||||
msgstr "A megrendelés sztornózva lett."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py:414
|
||||
#, python-brace-format
|
||||
@@ -31023,7 +31023,7 @@ msgid "Add to cart"
|
||||
msgstr "Hozzáadás a kosárhoz"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Ha már rendeltél jegyet"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33865,7 +33865,7 @@ msgid "Add to cart"
|
||||
msgstr "Masukkan ke keranjang"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Jika kamu sudah memesan tiket"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -31883,7 +31883,7 @@ msgid "Add to cart"
|
||||
msgstr "Aggiungi al carrello"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Se hai già prenotato un biglietto"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32867,7 +32867,7 @@ msgid "Add to cart"
|
||||
msgstr "カートに追加"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "すでにチケットを注文済みの場合"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -29862,7 +29862,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32169,7 +32169,7 @@ msgid "Add to cart"
|
||||
msgstr "Pievienot grozam"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Ja jau esat pasūtījis biļeti"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34036,7 +34036,7 @@ msgid "Add to cart"
|
||||
msgstr "Legg til handlekurv"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Har du allerede bestilt billett"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33634,7 +33634,7 @@ msgid "Add to cart"
|
||||
msgstr "Voeg toe aan winkelwagen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Als u al een ticket heeft besteld"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34971,7 +34971,7 @@ msgid "Add to cart"
|
||||
msgstr "Voeg toe aan winkelwagen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Als je al een kaartje hebt besteld"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33525,7 +33525,7 @@ msgid "Add to cart"
|
||||
msgstr "Dodaj do koszyka"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Jeżeli bilet jest już zamówiony"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -30093,7 +30093,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -30334,7 +30334,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32910,7 +32910,7 @@ msgid "Add to cart"
|
||||
msgstr "Adicionar ao carrinho"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Se você já solicitou um ingresso"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34042,7 +34042,7 @@ msgid "Add to cart"
|
||||
msgstr "Adicionar ao carrinho"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Se já pediste um bilhete"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34887,7 +34887,7 @@ msgid "Add to cart"
|
||||
msgstr "Adaugă în coș"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Dacă ați comandat deja un bilet"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33106,7 +33106,7 @@ msgid "Add to cart"
|
||||
msgstr "Добавить в корзину"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Если вы уже заказали билет"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29992,7 +29992,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32809,7 +32809,7 @@ msgid "Add to cart"
|
||||
msgstr "Pridať do košíka"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Ak ste si už objednali vstupenku"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -32657,7 +32657,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -8,17 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
|
||||
"PO-Revision-Date: 2025-05-16 17:00+0000\n"
|
||||
"Last-Translator: bstramsek <stramsek.borut+pretix-translate@gmail.com>\n"
|
||||
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/sl/>\n"
|
||||
"PO-Revision-Date: 2019-08-27 08:00+0000\n"
|
||||
"Last-Translator: Bostjan Marusic <bostjan@brokenbones.si>\n"
|
||||
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
"js/sl/>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
|
||||
"n%100==4 ? 2 : 3;\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
"X-Generator: Weblate 3.5.1\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -32,7 +32,7 @@ msgstr "Komentar:"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
|
||||
msgid "PayPal"
|
||||
msgstr "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
|
||||
msgid "Venmo"
|
||||
|
||||
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33595,7 +33595,7 @@ msgid "Add to cart"
|
||||
msgstr "Lägg till i bokning"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Om du redan har bokat en biljett"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -35827,7 +35827,7 @@ msgid "Add to cart"
|
||||
msgstr "Sepete ekle"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Zaten bir bilet sipariş ettiyseniz"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -33579,7 +33579,7 @@ msgid "Add to cart"
|
||||
msgstr "Додати до кошика"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "Якщо Ви вже замовили квиток"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29897,7 +29897,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -34570,7 +34570,7 @@ msgid "Add to cart"
|
||||
msgstr "添加到购物车"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "如果您已经订了票"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -31796,7 +31796,7 @@ msgid "Add to cart"
|
||||
msgstr "加入購物車"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:253
|
||||
msgid "If you have already ordered a ticket"
|
||||
msgid "If you already ordered a ticket"
|
||||
msgstr "如果你已訂購票"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:257
|
||||
|
||||
@@ -625,22 +625,8 @@ class PaypalMethod(BasePaymentProvider):
|
||||
}
|
||||
return template.render(ctx)
|
||||
|
||||
# We are wrapping the actual _execute_payment() here, since PaymentExceptions
|
||||
# within the atomic transaction would rollback any changes to the payment-object,
|
||||
# this throwing away any logentries and payment.fail()
|
||||
@transaction.atomic
|
||||
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
|
||||
ex = None
|
||||
with transaction.atomic():
|
||||
try:
|
||||
return self._execute_payment(request, payment)
|
||||
except PaymentException as e:
|
||||
ex = e
|
||||
if ex:
|
||||
raise ex
|
||||
|
||||
return False
|
||||
|
||||
def _execute_payment(self, request: HttpRequest, payment: OrderPayment):
|
||||
payment = OrderPayment.objects.select_for_update(of=OF_SELF).get(pk=payment.pk)
|
||||
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
|
||||
logger.warning('payment is already confirmed; possible return-view/webhook race-condition')
|
||||
|
||||
@@ -66,8 +66,6 @@ class AuthenticationForm(forms.Form):
|
||||
|
||||
error_messages = {
|
||||
'incomplete': _('You need to fill out all fields.'),
|
||||
'empty_email': _('You need to enter an email address.'),
|
||||
'empty_password': _('You need to enter a password.'),
|
||||
'invalid_login': _(
|
||||
"We have not found an account with this email address and password."
|
||||
),
|
||||
@@ -114,10 +112,6 @@ class AuthenticationForm(forms.Form):
|
||||
else:
|
||||
self.confirm_login_allowed(self.customer_cache)
|
||||
else:
|
||||
if not email:
|
||||
self.add_error("email", self.error_messages['empty_email'])
|
||||
if not password:
|
||||
self.add_error("password", self.error_messages['empty_password'])
|
||||
raise forms.ValidationError(
|
||||
self.error_messages['incomplete'],
|
||||
code='incomplete'
|
||||
|
||||
@@ -94,11 +94,10 @@
|
||||
</a>
|
||||
{% else %}
|
||||
<h1>
|
||||
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" class="no-underline">{{ event.name }}
|
||||
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}">{{ event.name }}</a>
|
||||
{% if request.event.settings.show_dates_on_frontpage and not event.has_subevents %}
|
||||
<small class="text-muted">{{ event.get_date_range_display_as_html }}</small>
|
||||
<small>{{ event.get_date_range_display_as_html }}</small>
|
||||
{% endif %}
|
||||
</a>
|
||||
</h1>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@@ -11,31 +11,31 @@
|
||||
<h2>{% trans "Review order" %}</h2>
|
||||
{% include "pretixpresale/event/fragment_checkoutflow.html" %}
|
||||
<p>{% trans "Please review the details below and confirm your order." %}</p>
|
||||
<div class="panel panel-primary cart">
|
||||
<div class="panel-heading panel-heading-flex">
|
||||
<h3 class="panel-title">
|
||||
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
|
||||
{% trans "Your cart" %}
|
||||
<a href="{% eventurl request.event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" class="h6">
|
||||
<span class="fa fa-edit" aria-hidden="true"></span>{% trans "Add or remove tickets" %}
|
||||
</a>
|
||||
</h3>
|
||||
<span class="panel-heading-flex-gap"></span>
|
||||
<strong class="helper-display-block" 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" }}
|
||||
{% else %}
|
||||
{% trans "Cart expired" %}
|
||||
{% endif %}
|
||||
</strong>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %}
|
||||
</div>
|
||||
</div>
|
||||
<form method="post" data-asynctask
|
||||
data-asynctask-headline="{% trans "Please hang tight, we're finalizing your order!" %}">
|
||||
{% csrf_token %}
|
||||
<div class="panel panel-primary cart">
|
||||
<div class="panel-heading panel-heading-flex">
|
||||
<h3 class="panel-title">
|
||||
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
|
||||
{% trans "Your cart" %}
|
||||
<a href="{% eventurl request.event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" class="h6">
|
||||
<span class="fa fa-edit" aria-hidden="true"></span>{% trans "Add or remove tickets" %}
|
||||
</a>
|
||||
</h3>
|
||||
<span class="panel-heading-flex-gap"></span>
|
||||
<strong class="helper-display-block" 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" }}
|
||||
{% else %}
|
||||
{% trans "Cart expired" %}
|
||||
{% endif %}
|
||||
</strong>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %}
|
||||
</div>
|
||||
</div>
|
||||
{% if payments %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
|
||||
@@ -492,10 +492,10 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{% if not cart.is_ordered %}
|
||||
<form class="text-muted"
|
||||
method="post" data-asynctask action="{% eventurl request.event "presale:event.cart.extend" cart_namespace=cart_namespace %}">
|
||||
<form class="text-muted" id="cart-extend-form" data-asynctask data-asynctask-no-redirect
|
||||
method="post" action="{% eventurl request.event "presale:event.cart.extend" cart_namespace=cart_namespace %}">
|
||||
{% csrf_token %}
|
||||
<span id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
|
||||
<span id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}" data-max-expiry-extend="{{ cart.max_expiry_extend|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.
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
{% load icon %}
|
||||
{% load eventurl %}
|
||||
|
||||
<div class="event-list full-width-list alternating-rows">
|
||||
<dl class="full-width-list alternating-rows">
|
||||
{% for subev in subevent_list.subevent_list %}
|
||||
<article class="row" aria-labelledby="subevent-{{ subev.pk }}-label" aria-describedby="subevent-{{ subev.pk }}-desc">
|
||||
<h3 class="col-md-4 col-xs-12">
|
||||
<a id="subevent-{{ subev.pk }}-label" 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">
|
||||
<dt class="col-md-4 col-xs-12">
|
||||
<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 %}">
|
||||
{{ subev.name }}
|
||||
</a>
|
||||
</h3>
|
||||
<p class="col-md-3 col-xs-12" id="subevent-{{ subev.pk }}-desc">
|
||||
</dt>
|
||||
<dd class="col-md-3 col-xs-12">
|
||||
{{ subev.get_date_range_display_as_html }}
|
||||
{% if event.settings.show_times %}
|
||||
<br>
|
||||
@@ -20,13 +20,13 @@
|
||||
<time datetime="{{ subev.date_from.isoformat }}">{{ subev.date_from|date:"TIME_FORMAT" }}</time>
|
||||
</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p class="col-md-3 col-xs-6">
|
||||
</dd>
|
||||
<dd class="col-md-3 col-xs-6">
|
||||
<small>
|
||||
{% include "pretixpresale/fragment_event_list_status.html" with event=subev %}
|
||||
</small>
|
||||
</p>
|
||||
<p class="col-md-2 col-xs-6 text-right flip">
|
||||
</dd>
|
||||
<dd class="col-md-2 col-xs-6 text-right flip">
|
||||
<a class="btn btn-primary btn-block" 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 %}">
|
||||
{% if subev.presale_is_running and subev.best_availability_state == 100 %}
|
||||
{% icon "ticket" %} {% trans "Tickets" %}
|
||||
@@ -34,7 +34,7 @@
|
||||
{% icon "info" %} {% trans "More info" %}
|
||||
{% endif %}
|
||||
</a>
|
||||
</p>
|
||||
</article>
|
||||
</dd>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</dl>
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
{% load thumb %}
|
||||
{% load eventsignal %}
|
||||
{% load rich_text %}
|
||||
{% load icon %}
|
||||
{% load dialog %}
|
||||
|
||||
{% block title %}
|
||||
{% if "year" in request.GET %}
|
||||
@@ -242,13 +240,6 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
{% if ev.presale_is_running and display_add_to_cart %}
|
||||
{% trans "You didn’t select any ticket." as label_nothing_to_add %}
|
||||
{% trans "Please tick a checkbox or enter a quantity for one of the ticket types to add to the cart." as description_nothing_to_add %}
|
||||
{% dialog "dialog-nothing-to-add" label_nothing_to_add description_nothing_to_add icon="exclamation-circle" %}
|
||||
<p class="modal-card-confirm"><button class="btn btn-primary">{% trans "OK" %}</button></p>
|
||||
{% enddialog %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</main>
|
||||
@@ -261,7 +252,7 @@
|
||||
{% if not cart_namespace %}
|
||||
{% eventsignal event "pretix.presale.signals.front_page_bottom" subevent=subevent request=request %}
|
||||
<aside class="front-page" aria-labelledby="if-you-already-ordered-a-ticket">
|
||||
<h3 id="if-you-already-ordered-a-ticket">{% trans "If you have already ordered a ticket" %}</h3>
|
||||
<h3 id="if-you-already-ordered-a-ticket">{% trans "If you already ordered a ticket" %}</h3>
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-xs-12">
|
||||
<p>
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
<script type="text/javascript" src="{% static "slider/bootstrap-slider.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "cropper/cropper.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/details.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixbase/js/dialogs.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixcontrol/js/jquery.qrcode.min.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixpresale/js/widget/floatformat.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "pretixpresale/js/ui/questions.js" %}"></script>
|
||||
|
||||
@@ -9,13 +9,14 @@
|
||||
title="{% trans "View customer account" %}" data-toggle="tooltip">
|
||||
<span class="fa fa-user" aria-hidden="true"></span>
|
||||
{{ request.customer.name|default:request.customer.email }}</a>
|
||||
<a href="{% if request.event_domain %}{% abseventurl request.event "presale:organizer.customer.logout" %}{% else %}{% abseventurl request.organizer "presale:organizer.customer.logout" %}{% endif %}?next={{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}">
|
||||
<a href="{% if request.event_domain %}{% abseventurl request.event "presale:organizer.customer.logout" %}{% else %}{% abseventurl request.organizer "presale:organizer.customer.logout" %}{% endif %}?next={{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}"
|
||||
aria-label="{% trans "Log out" %}" data-toggle="tooltip" data-placement="left"
|
||||
title="{% trans "Log out" %}">
|
||||
<span class="fa fa-sign-out" aria-hidden="true"></span>
|
||||
{% trans "Log out" %}
|
||||
<span class="sr-only">{% trans "Log out" %}</span>
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.login" %}{% if request.resolver_match.url_name != "organizer.customer.login" %}?next={% if request.event_domain %}{{ request.scheme }}://{{ request.get_host }}{% endif %}{{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}{% if request.event_domain %}&request_cross_domain_customer_auth=true{% endif %}">
|
||||
<span class="fa fa-sign-in" aria-hidden="true"></span>
|
||||
{% trans "Log in" %}</a>
|
||||
|
||||
{% endif %}
|
||||
|
||||
@@ -2,18 +2,17 @@
|
||||
{% load rich_text %}
|
||||
{% load safelink %}
|
||||
{% load escapejson %}
|
||||
{% load icon %}
|
||||
{% load dialog %}
|
||||
<div id="ajaxerr">
|
||||
<div id="ajaxerr" class="modal-wrapper" hidden>
|
||||
</div>
|
||||
<div id="popupmodal" hidden aria-live="polite">
|
||||
<div id="popupmodal" class="modal-wrapper" hidden aria-live="polite" role="dialog"
|
||||
aria-labelledby="popupmodal-title">
|
||||
<div class="modal-card">
|
||||
<div class="modal-card-icon">
|
||||
<i class="fa fa-window-restore big-icon" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="modal-card-content">
|
||||
<div>
|
||||
<h3>
|
||||
<h3 id="popupmodal-title">
|
||||
{% trans "We've started the requested process in a new window." %}
|
||||
</h3>
|
||||
<p class="text">
|
||||
@@ -32,94 +31,96 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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 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>
|
||||
{% if request.organizer and request.organizer.settings.cookie_consent %}
|
||||
<script type="text/plain" id="cookie-consent-storage-key">cookie-consent-{{ request.organizer.slug }}</script>
|
||||
{% if cookie_consent_from_widget %}
|
||||
{{ cookie_consent_from_widget|json_script:"cookie-consent-from-widget" }}
|
||||
{% endif %}
|
||||
{% if cookie_providers %}
|
||||
{% with request.event|default:request.organizer as sh %}
|
||||
{% dialog "cookie-consent-modal" sh.settings.cookie_consent_dialog_title sh.settings.cookie_consent_dialog_text|rich_text icon="shield" %}
|
||||
{% if sh.settings.cookie_consent_dialog_text_secondary %}
|
||||
<div class="text-muted">
|
||||
{{ sh.settings.cookie_consent_dialog_text_secondary|rich_text }}
|
||||
</div>
|
||||
{% endif %}
|
||||
<details id="cookie-consent-details">
|
||||
<summary>
|
||||
<span class="fa fa-fw chevron"></span>
|
||||
{% trans "Adjust settings in detail" %}
|
||||
</summary>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" disabled checked="" aira-describedby="cookie-consent-checkbox-required-description">
|
||||
{% trans "Required cookies" %}
|
||||
</label>
|
||||
</div>
|
||||
<div class="help-block" id="cookie-consent-checkbox-required-description">
|
||||
<p>{% trans "Functional cookies (e.g. shopping cart, login, payment, language preference) and technical cookies (e.g. security purposes)" %}</p>
|
||||
</div>
|
||||
{% for cp in cookie_providers %}
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="{{ cp.identifier }}" aira-describedby="cookie-consent-checkbox-{{ cp.identifier }}-description">
|
||||
{{ cp.provider_name }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="help-block" id="cookie-consent-checkbox-{{ cp.identifier }}-description">
|
||||
<p>
|
||||
{% for c in cp.usage_classes %}
|
||||
{% if forloop.counter0 > 0 %}· {% endif %}
|
||||
{% if c.value == 1 %}
|
||||
{% trans "Functionality" context "cookie_usage" %}
|
||||
{% elif c.value == 2 %}
|
||||
{% trans "Analytics" context "cookie_usage" %}
|
||||
{% elif c.value == 3 %}
|
||||
{% trans "Marketing" context "cookie_usage" %}
|
||||
{% elif c.value == 4 %}
|
||||
{% trans "Social features" context "cookie_usage" %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if cp.privacy_url %}
|
||||
·
|
||||
<a href="{% safelink cp.privacy_url %}" target="_blank">
|
||||
{% trans "Privacy policy" %}
|
||||
</a>
|
||||
<div id="cookie-consent-modal" class="modal-wrapper" hidden aria-live="polite" role="dialog"
|
||||
aria-labelledby="cookie-consent-modal-label">
|
||||
<div class="modal-card">
|
||||
<div class="modal-card-content">
|
||||
<h3 id="cookie-consent-modal-label"></h3>
|
||||
<div id="cookie-consent-modal-description">
|
||||
{% with request.event|default:request.organizer as sh %}
|
||||
<h3>{{ sh.settings.cookie_consent_dialog_title }}</h3>
|
||||
{{ sh.settings.cookie_consent_dialog_text|rich_text }}
|
||||
{% if sh.settings.cookie_consent_dialog_text_secondary %}
|
||||
<div class="text-muted">
|
||||
{{ sh.settings.cookie_consent_dialog_text_secondary|rich_text }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</details>
|
||||
<p class="modal-card-confirm modal-card-confirm-spread">
|
||||
<button class="btn btn-lg btn-default" id="cookie-consent-button-no" value="no" autofocus="true"
|
||||
data-summary-text="{{ sh.settings.cookie_consent_dialog_button_no }}"
|
||||
data-detail-text="{% trans "Save selection" %}">
|
||||
{{ sh.settings.cookie_consent_dialog_button_no }}
|
||||
</button>
|
||||
<button class="btn btn-lg btn-primary" id="cookie-consent-button-yes" value="yes">
|
||||
{{ sh.settings.cookie_consent_dialog_button_yes }}
|
||||
</button>
|
||||
</p>
|
||||
{% if sh.settings.privacy_url %}
|
||||
<p class="text-center">
|
||||
<small><a href="{% safelink sh.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></small>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% enddialog %}
|
||||
{% endwith %}
|
||||
<details id="cookie-consent-details">
|
||||
<summary>
|
||||
<span class="fa fa-fw chevron"></span>
|
||||
{% trans "Adjust settings in detail" %}
|
||||
</summary>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" disabled checked="">
|
||||
{% trans "Required cookies" %}<br>
|
||||
<span class="text-muted">
|
||||
{% trans "Functional cookies (e.g. shopping cart, login, payment, language preference) and technical cookies (e.g. security purposes)" %}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
{% for cp in cookie_providers %}
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="{{ cp.identifier }}">
|
||||
{{ cp.provider_name }}<br>
|
||||
<span class="text-muted">
|
||||
{% for c in cp.usage_classes %}
|
||||
{% if forloop.counter0 > 0 %}· {% endif %}
|
||||
{% if c.value == 1 %}
|
||||
{% trans "Functionality" context "cookie_usage" %}
|
||||
{% elif c.value == 2 %}
|
||||
{% trans "Analytics" context "cookie_usage" %}
|
||||
{% elif c.value == 3 %}
|
||||
{% trans "Marketing" context "cookie_usage" %}
|
||||
{% elif c.value == 4 %}
|
||||
{% trans "Social features" context "cookie_usage" %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if cp.privacy_url %}
|
||||
·
|
||||
<a href="{% safelink cp.privacy_url %}" target="_blank">
|
||||
{% trans "Privacy policy" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</details>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<p>
|
||||
<button type="button" class="btn btn-lg btn-block btn-primary" id="cookie-consent-button-no"
|
||||
data-summary-text="{{ sh.settings.cookie_consent_dialog_button_no }}"
|
||||
data-detail-text="{% trans "Save selection" %}">
|
||||
{{ sh.settings.cookie_consent_dialog_button_no }}
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<p>
|
||||
<button type="button" class="btn btn-lg btn-block btn-primary" id="cookie-consent-button-yes">
|
||||
{{ sh.settings.cookie_consent_dialog_button_yes }}
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% if sh.settings.privacy_url %}
|
||||
<p class="text-center">
|
||||
<a href="{% safelink sh.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
class="organizer-logo" />
|
||||
</a>
|
||||
{% else %}
|
||||
<h1><a href="{% eventurl organizer "presale:organizer.index" %}" class="no-underline">{{ organizer.name }}</a></h1>
|
||||
<h1><a href="{% eventurl organizer "presale:organizer.index" %}">{{ organizer.name }}</a></h1>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if organizer.settings.locales|length > 1 or request.organizer.settings.customer_accounts %}
|
||||
|
||||
@@ -14,91 +14,94 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if memberships %}
|
||||
<div class="event-list full-width-list alternating-rows">
|
||||
<ul class="full-width-list alternating-rows">
|
||||
{% for m in memberships %}
|
||||
<article class="row">
|
||||
<div class="col-xs-5">
|
||||
<h4>
|
||||
{% if m.canceled %}<del>{% endif %}
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
|
||||
{{ m.membership_type.name }}
|
||||
</a>
|
||||
{% if m.canceled %}</del>{% endif %}
|
||||
{% if m.membership_type.transferable %}
|
||||
<span class="text-muted" data-toggle="tooltip" title="{% trans "Membership is transferable" %}">
|
||||
{% icon "users" %}
|
||||
</span>
|
||||
<li class="row">
|
||||
<dl>
|
||||
<div class="col-xs-5">
|
||||
<dt>
|
||||
{% if m.canceled %}<del>{% endif %}
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
|
||||
{{ m.membership_type.name }}
|
||||
</a>
|
||||
{% if m.canceled %}</del>{% endif %}
|
||||
{% if m.membership_type.transferable %}
|
||||
<span class="text-muted" data-toggle="tooltip" title="{% trans "Membership is transferable" %}">
|
||||
{% icon "users" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</dt>
|
||||
{% if m.attendee_name %}
|
||||
<dd class="text-muted">
|
||||
{% icon "id-badge" %}
|
||||
<span class="sr-only">{% trans "Attendee name" %}:</span>
|
||||
{{ m.attendee_name }}
|
||||
</dd>
|
||||
{% endif %}
|
||||
</h4>
|
||||
{% if m.attendee_name %}
|
||||
<p class="text-muted">
|
||||
{% icon "id-badge" %}
|
||||
<span class="sr-only">{% trans "Attendee name" %}:</span>
|
||||
{{ m.attendee_name }}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p class="text-muted">
|
||||
<small>
|
||||
{% if m.canceled %}
|
||||
{% textbubble "danger" icon="times" %}
|
||||
{% trans "Canceled" %}
|
||||
<dd class="text-muted">
|
||||
<small>
|
||||
{% if m.canceled %}
|
||||
{% textbubble "danger" icon="times" %}
|
||||
{% trans "Canceled" %}
|
||||
{% endtextbubble %}
|
||||
{% elif m.expired %}
|
||||
{% icon "minus-square-o" %}
|
||||
{% trans "Expired since" %}
|
||||
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
{% elif m.not_yet_valid %}
|
||||
{% icon "clock-o" %}
|
||||
{% trans "Valid from" %}
|
||||
<time datetime="{{ m.date_start|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
{% else %}
|
||||
{% icon "check" %}
|
||||
{% trans "Valid until" %}
|
||||
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
{% endif %}
|
||||
</small>
|
||||
</dd>
|
||||
{% if m.testmode %}
|
||||
<dd>
|
||||
<small>
|
||||
{% textbubble "warning" %}
|
||||
{% trans "TEST MODE" %}
|
||||
{% endtextbubble %}
|
||||
{% elif m.expired %}
|
||||
{% icon "minus-square-o" %}
|
||||
{% trans "Expired since" %}
|
||||
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
{% elif m.not_yet_valid %}
|
||||
{% icon "clock-o" %}
|
||||
{% trans "Valid from" %}
|
||||
<time datetime="{{ m.date_start|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
{% else %}
|
||||
{% icon "check" %}
|
||||
{% trans "Valid until" %}
|
||||
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
|
||||
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
|
||||
</time>
|
||||
</small>
|
||||
</dd>
|
||||
{% endif %}
|
||||
</small>
|
||||
</p>
|
||||
{% if m.testmode %}
|
||||
<p>
|
||||
<small>
|
||||
{% textbubble "warning" %}
|
||||
{% trans "TEST MODE" %}
|
||||
{% endtextbubble %}
|
||||
</small>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<p>
|
||||
<div class="quotabox full-width">
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success progress-bar-{{ m.percentage_used }}">
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<dd>
|
||||
<div class="quotabox full-width">
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success progress-bar-{{ m.percentage_used }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="numbers">
|
||||
{{ m.usages }} /
|
||||
{{ m.membership_type.max_usages|default_if_none:"∞" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="numbers">
|
||||
{{ m.usages }} /
|
||||
{{ m.membership_type.max_usages|default_if_none:"∞" }}
|
||||
</div>
|
||||
</div>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<p class="text-right">
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
|
||||
{% icon "list-ul" %}
|
||||
{% trans "Details" %}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
<dt class="sr-only">{% trans "Actions" %}</dt>
|
||||
<dd class="text-right">
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
|
||||
{% icon "list-ul" %}
|
||||
{% trans "Details" %}
|
||||
</a>
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-center">{% trans "You don’t have any memberships in your account yet." %}</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -15,60 +15,65 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if orders %}
|
||||
<div class="event-list full-width-list alternating-rows">
|
||||
<ul class="full-width-list alternating-rows">
|
||||
{% for o in orders %}
|
||||
<article class="row">
|
||||
<div class="col-md-4 col-sm-5 col-xs-8">
|
||||
<h4><strong>
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}" target="_blank">
|
||||
{% icon "shopping-cart" %}
|
||||
{{ o.code }}</a>
|
||||
</strong>
|
||||
{% if o.customer_id != customer.pk %}
|
||||
<span class="text-muted" data-toggle="tooltip"
|
||||
title="{% trans "Matched to the account based on the email address." %}">
|
||||
{% icon "compress" %}
|
||||
</span>
|
||||
<li class="row">
|
||||
<dl>
|
||||
<div class="col-md-4 col-sm-5 col-xs-8">
|
||||
<dt class="sr-only">{% trans "Order" %}</dt>
|
||||
<dd><strong>
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}" target="_blank">
|
||||
{% icon "shopping-cart" %}
|
||||
{{ o.code }}</a>
|
||||
</strong>
|
||||
{% if o.customer_id != customer.pk %}
|
||||
<span class="text-muted" data-toggle="tooltip"
|
||||
title="{% trans "Matched to the account based on the email address." %}">
|
||||
{% icon "compress" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
<small>{% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}</small>
|
||||
</dd>
|
||||
<dd><time datetime="{{ o.datetime|date:"Y-m-d H:i" }}" class="text-muted small">{{ o.datetime|date:"SHORT_DATETIME_FORMAT" }}</time></dd>
|
||||
{% if o.testmode %}
|
||||
<dd>
|
||||
<small>
|
||||
{% textbubble "warning" %}
|
||||
{% trans "TEST MODE" %}
|
||||
{% endtextbubble %}
|
||||
</small>
|
||||
</dd>
|
||||
{% endif %}
|
||||
<small>{% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}</small>
|
||||
</h4>
|
||||
<p><time datetime="{{ o.datetime|date:"Y-m-d H:i" }}" class="text-muted small">{{ o.datetime|date:"SHORT_DATETIME_FORMAT" }}</time></p>
|
||||
{% if o.testmode %}
|
||||
<p>
|
||||
<small>
|
||||
{% textbubble "warning" %}
|
||||
{% trans "TEST MODE" %}
|
||||
{% endtextbubble %}
|
||||
</small>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
|
||||
<p>
|
||||
{{ o.total|money:o.event.currency }}
|
||||
<br><span class="text-muted"><small>{% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}</small>
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-3 col-xs-8">
|
||||
<p>
|
||||
{{ o.event }}
|
||||
{% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
|
||||
<br><small class="text-muted">{{ o.event.get_date_range_display }}</small>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-sm-2 col-xs-4">
|
||||
<p class="text-right">
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}"
|
||||
target="_blank">
|
||||
{% icon "list-ul" %}
|
||||
{% trans "Details" %}
|
||||
</a></p>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
|
||||
<dt class="sr-only">{% trans "Order total" %}</dt>
|
||||
<dd>{{ o.total|money:o.event.currency }}</dd>
|
||||
<dt class="sr-only">{% trans "Positions" %}</dt>
|
||||
<dd class="text-muted"><small>{% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}</small>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-3 col-xs-8">
|
||||
<dt class="sr-only">{% trans "Event" %}</dt>
|
||||
<dd>
|
||||
{{ o.event }}
|
||||
{% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
|
||||
<br><small class="text-muted">{{ o.event.get_date_range_display }}</small>
|
||||
{% endif %}
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-sm-2 col-xs-4">
|
||||
<dt class="sr-only">{% trans "Actions" %}</dt>
|
||||
<dd class="text-right">
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}"
|
||||
target="_blank">
|
||||
{% icon "list-ul" %}
|
||||
{% trans "Details" %}
|
||||
</a></dd>
|
||||
</div>
|
||||
</dl>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-center">{% trans "You don’t have any orders in your account yet." %}</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -46,11 +46,11 @@
|
||||
{% endif %}
|
||||
{% if events %}
|
||||
<div class="panel-body">
|
||||
<div class="event-list full-width-list alternating-rows">
|
||||
<dl class="full-width-list alternating-rows">
|
||||
{% for e in events %}{% eventurl e "presale:event.index" as url %}
|
||||
<article class="row" aria-labelledby="event-{{ e.pk }}-label" aria-describedby="event-{{ e.pk }}-desc">
|
||||
<h3 class="col-md-4 col-xs-12"><a href="{{ url }}" id="event-{{ e.pk }}-label" class="no-underline">{{ e.name }}</a></h3>
|
||||
<p class="col-md-3 col-xs-12" id="event-{{ e.pk }}-desc">
|
||||
<div class="row">
|
||||
<dt class="col-md-4 col-xs-12"><a href="{{ url }}">{{ e.name }}</a></dt>
|
||||
<dd class="col-md-3 col-xs-12">
|
||||
{% if e.settings.show_dates_on_frontpage %}
|
||||
{% if e.has_subevents %}
|
||||
{% icon "calendar" %} {% trans "Multiple dates" context "subevent" %}
|
||||
@@ -78,13 +78,13 @@
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</p>
|
||||
<p class="col-md-3 col-xs-6">
|
||||
</dd>
|
||||
<dd class="col-md-3 col-xs-6">
|
||||
<small>
|
||||
{% include "pretixpresale/fragment_event_list_status.html" with event=e %}
|
||||
</small>
|
||||
</p>
|
||||
<p class="col-md-2 col-xs-6 text-right flip">
|
||||
</dd>
|
||||
<dd class="col-md-2 col-xs-6 text-right flip">
|
||||
<a class="btn btn-primary btn-block" href="{{ url }}{% if e.has_subevents and e.match_by_subevents %}{{ filterquery }}{% endif %}">
|
||||
{% if e.has_subevents %}{% icon "ticket" %} {% trans "Tickets" %}
|
||||
{% elif e.presale_is_running and e.best_availability_state == 100 %}
|
||||
@@ -93,10 +93,10 @@
|
||||
{% icon "info" %} {% trans "More info" %}
|
||||
{% endif %}
|
||||
</a>
|
||||
</p>
|
||||
</article>
|
||||
</dd>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<hr>
|
||||
{% endif %}
|
||||
|
||||
@@ -229,11 +229,13 @@ class CartMixin:
|
||||
|
||||
try:
|
||||
first_expiry = min(p.expires for p in positions) if positions else now()
|
||||
max_expiry_extend = min((p.max_extend for p in positions if p.max_extend), default=None)
|
||||
total_seconds_left = max(first_expiry - now(), timedelta()).total_seconds()
|
||||
minutes_left = int(total_seconds_left // 60)
|
||||
seconds_left = int(total_seconds_left % 60)
|
||||
except AttributeError:
|
||||
first_expiry = None
|
||||
max_expiry_extend = None
|
||||
minutes_left = None
|
||||
seconds_left = None
|
||||
|
||||
@@ -250,6 +252,7 @@ class CartMixin:
|
||||
'minutes_left': minutes_left,
|
||||
'seconds_left': seconds_left,
|
||||
'first_expiry': first_expiry,
|
||||
'max_expiry_extend': max_expiry_extend,
|
||||
'is_ordered': bool(order),
|
||||
'itemcount': sum(c.count for c in positions if not c.addon_to),
|
||||
'current_selected_payments': [p for p in self.current_selected_payments(total) if p.get('multi_use_supported')]
|
||||
|
||||
@@ -542,8 +542,14 @@ class CartExtendReservation(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
task = extend_cart_reservation
|
||||
known_errortypes = ['CartError']
|
||||
|
||||
def _ajax_response_data(self, value):
|
||||
if isinstance(value, dict):
|
||||
return value
|
||||
else:
|
||||
return {}
|
||||
|
||||
def get_success_message(self, value):
|
||||
if value > 0:
|
||||
if value['success'] > 0:
|
||||
return _('Your cart timeout was extended.')
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
@@ -561,7 +567,7 @@ class CartAdd(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
def get_success_message(self, value):
|
||||
return _('The products have been successfully added to your cart.')
|
||||
|
||||
def _ajax_response_data(self):
|
||||
def _ajax_response_data(self, value):
|
||||
cart_id = get_or_create_cart_id(self.request)
|
||||
return {
|
||||
'cart_id': cart_id,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 587 B |
@@ -5,74 +5,94 @@ var async_task_check_url = null;
|
||||
var async_task_old_url = null;
|
||||
var async_task_is_download = false;
|
||||
var async_task_is_long = false;
|
||||
var async_task_dont_redirect = false;
|
||||
|
||||
function async_task_check() {
|
||||
var async_task_status_messages = {
|
||||
long_task_started: gettext(
|
||||
'Your request is currently being processed. Depending on the size of your event, this might take up to ' +
|
||||
'a few minutes.'
|
||||
),
|
||||
long_task_pending: gettext(
|
||||
'Your request has been queued on the server and will soon be ' +
|
||||
'processed.'
|
||||
),
|
||||
short_task: gettext(
|
||||
'Your request arrived on the server but we still wait for it to be ' +
|
||||
'processed. If this takes longer than two minutes, please contact us or go ' +
|
||||
'back in your browser and try again.'
|
||||
)
|
||||
};
|
||||
|
||||
function async_task_schedule_check(context, timeout) {
|
||||
"use strict";
|
||||
$.ajax(
|
||||
{
|
||||
'type': 'GET',
|
||||
'url': async_task_check_url,
|
||||
'success': async_task_check_callback,
|
||||
'error': async_task_check_error,
|
||||
'context': this,
|
||||
'dataType': 'json'
|
||||
async_task_timeout = window.setTimeout(function() {
|
||||
$.ajax(
|
||||
{
|
||||
'type': 'GET',
|
||||
'url': async_task_check_url,
|
||||
'success': async_task_check_callback,
|
||||
'error': async_task_check_error,
|
||||
'context': context,
|
||||
'dataType': 'json'
|
||||
}
|
||||
);
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
function async_task_on_success(data) {
|
||||
"use strict";
|
||||
if ((async_task_is_download && data.success) || async_task_dont_redirect) {
|
||||
waitingDialog.hide();
|
||||
if (location.href.indexOf("async_id") !== -1) {
|
||||
history.replaceState({}, "pretix", async_task_old_url);
|
||||
}
|
||||
);
|
||||
}
|
||||
if (!async_task_dont_redirect)
|
||||
location.href = data.redirect;
|
||||
$(this).trigger('pretix:async-task-success', data);
|
||||
}
|
||||
|
||||
function async_task_check_callback(data, textStatus, jqXHR) {
|
||||
"use strict";
|
||||
if (data.ready && data.redirect) {
|
||||
if (async_task_is_download && data.success) {
|
||||
waitingDialog.hide();
|
||||
if (location.href.indexOf("async_id") !== -1) {
|
||||
history.replaceState({}, "pretix", async_task_old_url);
|
||||
}
|
||||
}
|
||||
location.href = data.redirect;
|
||||
async_task_on_success.call(this, data);
|
||||
return;
|
||||
} else if (typeof data.percentage === "number") {
|
||||
$("#loadingmodal .progress").show();
|
||||
$("#loadingmodal .progress .progress-bar").css("width", data.percentage + "%");
|
||||
if (typeof data.steps === "object" && Array.isArray(data.steps)) {
|
||||
var $steps = $("#loadingmodal .steps");
|
||||
$steps.html("").show()
|
||||
for (var step of data.steps) {
|
||||
$steps.append(
|
||||
$("<span>").addClass("fa fa-fw")
|
||||
.toggleClass("fa-check text-success", step.done)
|
||||
.toggleClass("fa-cog fa-spin text-muted", !step.done)
|
||||
).append(
|
||||
$("<span>").text(step.label)
|
||||
).append(
|
||||
$("<br>")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
async_task_timeout = window.setTimeout(async_task_check, 250);
|
||||
|
||||
if (typeof data.percentage === "number") {
|
||||
waitingDialog.setProgress(data.percentage);
|
||||
}
|
||||
if (typeof data.steps === "object" && Array.isArray(data.steps)) {
|
||||
waitingDialog.setSteps(data.steps);
|
||||
}
|
||||
async_task_schedule_check(this, 250);
|
||||
|
||||
async_task_update_status(data);
|
||||
}
|
||||
|
||||
function async_task_update_status(data) {
|
||||
if (async_task_is_long) {
|
||||
if (data.started) {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request is currently being processed. Depending on the size of your event, this might take up to ' +
|
||||
'a few minutes.'
|
||||
));
|
||||
waitingDialog.setStatus(async_task_status_messages.long_task_started);
|
||||
} else {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request has been queued on the server and will soon be ' +
|
||||
'processed.'
|
||||
));
|
||||
waitingDialog.setStatus(async_task_status_messages.long_task_pending);
|
||||
}
|
||||
} else {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request arrived on the server but we still wait for it to be ' +
|
||||
'processed. If this takes longer than two minutes, please contact us or go ' +
|
||||
'back in your browser and try again.'
|
||||
));
|
||||
waitingDialog.setStatus(async_task_status_messages.short_task);
|
||||
}
|
||||
}
|
||||
|
||||
function async_task_replace_page(target, new_html) {
|
||||
"use strict";
|
||||
waitingDialog.hide();
|
||||
$(target).html(new_html);
|
||||
setup_basics($(target));
|
||||
form_handlers($(target));
|
||||
setup_collapsible_details($(target));
|
||||
window.setTimeout(function () { $(window).scrollTop(0) }, 200)
|
||||
$(document).trigger("pretix:bind-forms");
|
||||
}
|
||||
|
||||
function async_task_check_error(jqXHR, textStatus, errorThrown) {
|
||||
"use strict";
|
||||
var respdom = $(jqXHR.responseText);
|
||||
@@ -80,16 +100,10 @@ function async_task_check_error(jqXHR, textStatus, errorThrown) {
|
||||
if (respdom.filter('form') && (respdom.filter('.has-error') || respdom.filter('.alert-danger'))) {
|
||||
// This is a failed form validation, let's just use it
|
||||
$("body").data('ajaxing', false);
|
||||
waitingDialog.hide();
|
||||
$("body").html(jqXHR.responseText.substring(
|
||||
async_task_replace_page("body", jqXHR.responseText.substring(
|
||||
jqXHR.responseText.indexOf("<body"),
|
||||
jqXHR.responseText.indexOf("</body")
|
||||
));
|
||||
setup_basics($("body"));
|
||||
form_handlers($("body"));
|
||||
setup_collapsible_details($("body"));
|
||||
window.setTimeout(function () { $(window).scrollTop(0) }, 200)
|
||||
$(document).trigger("pretix:bind-forms");
|
||||
} else if (c.length > 0) {
|
||||
// This is some kind of 500/404/403 page, show it in an overlay
|
||||
$("body").data('ajaxing', false);
|
||||
@@ -105,9 +119,9 @@ function async_task_check_error(jqXHR, textStatus, errorThrown) {
|
||||
alert(gettext('An error of type {code} occurred.').replace(/\{code\}/, jqXHR.status));
|
||||
} else {
|
||||
// 500 can be an application error or overload in some cases :(
|
||||
$("#loadingmodal p.status").text(gettext('We currently cannot reach the server, but we keep trying.' +
|
||||
' Last error code: {code}').replace(/\{code\}/, jqXHR.status));
|
||||
async_task_timeout = window.setTimeout(async_task_check, 5000);
|
||||
waitingDialog.setStatus(gettext('We currently cannot reach the server, but we keep trying.' +
|
||||
' Last error code: {code}').replace(/\{code\}/, jqXHR.status));
|
||||
async_task_schedule_check(this, 5000);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -116,38 +130,15 @@ function async_task_callback(data, jqXHR, status) {
|
||||
"use strict";
|
||||
$("body").data('ajaxing', false);
|
||||
if (data.redirect) {
|
||||
if (async_task_is_download && data.success) {
|
||||
waitingDialog.hide();
|
||||
if (location.href.indexOf("async_id") !== -1) {
|
||||
history.replaceState({}, "pretix", async_task_old_url);
|
||||
}
|
||||
}
|
||||
location.href = data.redirect;
|
||||
async_task_on_success.call(this, data);
|
||||
return;
|
||||
}
|
||||
async_task_id = data.async_id;
|
||||
async_task_check_url = data.check_url;
|
||||
async_task_timeout = window.setTimeout(async_task_check, 100);
|
||||
async_task_schedule_check(this, 100);
|
||||
|
||||
async_task_update_status(data);
|
||||
|
||||
if (async_task_is_long) {
|
||||
if (data.started) {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request is currently being processed. Depending on the size of your event, this might take up to ' +
|
||||
'a few minutes.'
|
||||
));
|
||||
} else {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request has been queued on the server and will soon be ' +
|
||||
'processed.'
|
||||
));
|
||||
}
|
||||
} else {
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'Your request arrived on the server but we still wait for it to be ' +
|
||||
'processed. If this takes longer than two minutes, please contact us or go ' +
|
||||
'back in your browser and try again.'
|
||||
));
|
||||
}
|
||||
if (location.href.indexOf("async_id") === -1) {
|
||||
history.pushState({}, "Waiting", async_task_check_url.replace(/ajax=1/, ''));
|
||||
}
|
||||
@@ -156,48 +147,34 @@ function async_task_callback(data, jqXHR, status) {
|
||||
function async_task_error(jqXHR, textStatus, errorThrown) {
|
||||
"use strict";
|
||||
$("body").data('ajaxing', false);
|
||||
waitingDialog.hide();
|
||||
if (textStatus === "timeout") {
|
||||
alert(gettext("The request took too long. Please try again."));
|
||||
waitingDialog.hide();
|
||||
} else if (jqXHR.responseText.indexOf('<html') > 0) {
|
||||
var respdom = $(jqXHR.responseText);
|
||||
var c = respdom.filter('.container');
|
||||
if (respdom.filter('form') && (respdom.filter('.has-error') || respdom.filter('.alert-danger'))) {
|
||||
// This is a failed form validation, let's just use it
|
||||
waitingDialog.hide();
|
||||
|
||||
if (respdom.filter('#page-wrapper') && $('#page-wrapper').length) {
|
||||
$("#page-wrapper").html(respdom.find("#page-wrapper").html());
|
||||
setup_basics($("#page-wrapper"));
|
||||
form_handlers($("#page-wrapper"));
|
||||
setup_collapsible_details($("#page-wrapper"));
|
||||
$(document).trigger("pretix:bind-forms");
|
||||
window.setTimeout(function () { $(window).scrollTop(0) }, 200)
|
||||
async_task_replace_page("#page-wrapper", respdom.find("#page-wrapper").html());
|
||||
} else {
|
||||
$("body").html(jqXHR.responseText.substring(
|
||||
async_task_replace_page("body", jqXHR.responseText.substring(
|
||||
jqXHR.responseText.indexOf("<body"),
|
||||
jqXHR.responseText.indexOf("</body")
|
||||
));
|
||||
setup_basics($("body"));
|
||||
form_handlers($("body"));
|
||||
setup_collapsible_details($("body"));
|
||||
$(document).trigger("pretix:bind-forms");
|
||||
window.setTimeout(function () { $(window).scrollTop(0) }, 200)
|
||||
}
|
||||
|
||||
} else if (c.length > 0) {
|
||||
waitingDialog.hide();
|
||||
// This is some kind of 500/404/403 page, show it in an overlay
|
||||
ajaxErrDialog.show(c.first().html());
|
||||
} else {
|
||||
waitingDialog.hide();
|
||||
alert(gettext('An error of type {code} occurred.').replace(/\{code\}/, jqXHR.status));
|
||||
}
|
||||
} else {
|
||||
if (jqXHR.status >= 400 && jqXHR.status < 500) {
|
||||
waitingDialog.hide();
|
||||
alert(gettext('An error of type {code} occurred.').replace(/\{code\}/, jqXHR.status));
|
||||
} else {
|
||||
waitingDialog.hide();
|
||||
alert(gettext('We currently cannot reach the server. Please try again. ' +
|
||||
'Error code: {code}').replace(/\{code\}/, jqXHR.status));
|
||||
}
|
||||
@@ -221,24 +198,19 @@ $(function () {
|
||||
}
|
||||
async_task_id = null;
|
||||
async_task_is_download = $(this).is("[data-asynctask-download]");
|
||||
async_task_dont_redirect = $(this).is("[data-asynctask-no-redirect]");
|
||||
async_task_is_long = $(this).is("[data-asynctask-long]");
|
||||
async_task_old_url = location.href;
|
||||
$("body").data('ajaxing', true);
|
||||
if ($(this).is("[data-asynctask-headline]")) {
|
||||
waitingDialog.show($(this).attr("data-asynctask-headline"));
|
||||
} else {
|
||||
waitingDialog.show(gettext('We are processing your request …'));
|
||||
}
|
||||
if ($(this).is("[data-asynctask-text]")) {
|
||||
$("#loadingmodal p.text").text($(this).attr("data-asynctask-text")).show();
|
||||
} else {
|
||||
$("#loadingmodal p.text").hide();
|
||||
}
|
||||
$("#loadingmodal p.status").text(gettext(
|
||||
'We are currently sending your request to the server. If this takes longer ' +
|
||||
'than one minute, please check your internet connection and then reload ' +
|
||||
'this page and try again.'
|
||||
));
|
||||
waitingDialog.show(
|
||||
$(this).attr("data-asynctask-headline") || gettext('We are processing your request …'),
|
||||
$(this).attr("data-asynctask-text") || '',
|
||||
gettext(
|
||||
'We are currently sending your request to the server. If this takes longer ' +
|
||||
'than one minute, please check your internet connection and then reload ' +
|
||||
'this page and try again.'
|
||||
)
|
||||
);
|
||||
|
||||
var action = this.action;
|
||||
var formData = new FormData(this);
|
||||
@@ -275,34 +247,72 @@ $(function () {
|
||||
}, 10);
|
||||
}
|
||||
}, false);
|
||||
|
||||
$("#ajaxerr").on("click", ".ajaxerr-close", ajaxErrDialog.hide);
|
||||
});
|
||||
|
||||
var waitingDialog = {
|
||||
show: function (message) {
|
||||
"use strict";
|
||||
$("#loadingmodal h3").html(message);
|
||||
$("#loadingmodal .progress").hide();
|
||||
$("#loadingmodal .steps").hide();
|
||||
$("body").addClass("loading");
|
||||
$("#loadingmodal").removeAttr("hidden");
|
||||
},
|
||||
hide: function () {
|
||||
"use strict";
|
||||
$("body").removeClass("loading");
|
||||
$("#loadingmodal").attr("hidden", true);
|
||||
function AsyncStatusDialog(options) {
|
||||
ModalDialog.call(this, Object.assign({
|
||||
content: [
|
||||
this.statusEl = EL('p', {}),
|
||||
this.progressEl = EL('div', {class: 'progress'}, EL('div', {class:'progress-bar progress-bar-success', hidden: ''})),
|
||||
this.stepsEl = EL('div', {class: 'steps', hidden: ''}, ''),
|
||||
]
|
||||
}, options));
|
||||
}
|
||||
AsyncStatusDialog.prototype = Object.create(ModalDialog.prototype);
|
||||
AsyncStatusDialog.prototype.show = function (title, text, status) {
|
||||
ModalDialog.prototype.show.call(this);
|
||||
this.setTitle(title);
|
||||
this.setDescription(text);
|
||||
this.setStatus(status || gettext('If this takes longer than a few minutes, please contact us.'));
|
||||
this.setProgress(null);
|
||||
this.setSteps(null);
|
||||
}
|
||||
AsyncStatusDialog.prototype.setStatus = function (text) {
|
||||
this.statusEl.innerText = text;
|
||||
}
|
||||
AsyncStatusDialog.prototype.setProgress = function (percent) {
|
||||
$(this.progressEl).toggle(typeof percent === 'number').find('.progress-bar').css('width', percent + '%');
|
||||
}
|
||||
AsyncStatusDialog.prototype.setSteps = function (steps) {
|
||||
var $steps = $(this.stepsEl);
|
||||
if (typeof steps === "object" && Array.isArray(steps)) {
|
||||
$steps.html("").show();
|
||||
for (var step of steps) {
|
||||
$steps.append(
|
||||
$("<span>").addClass("fa fa-fw")
|
||||
.toggleClass("fa-check text-success", step.done)
|
||||
.toggleClass("fa-cog fa-spin text-muted", !step.done)
|
||||
).append(
|
||||
$("<span>").text(step.label)
|
||||
).append(
|
||||
$("<br>")
|
||||
)
|
||||
}
|
||||
} else {
|
||||
$steps.html("").hide();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var waitingDialog;
|
||||
$(function() {
|
||||
waitingDialog = new AsyncStatusDialog({
|
||||
icon: 'cog', rotatingIcon: true,
|
||||
});
|
||||
});
|
||||
|
||||
var ajaxErrDialog = {
|
||||
show: function (c) {
|
||||
"use strict";
|
||||
$("#ajaxerr").html(c);
|
||||
$("#ajaxerr").html(c).show();
|
||||
$("#ajaxerr .links").html("<a class='btn btn-default ajaxerr-close'>"
|
||||
+ gettext("Close message") + "</a>");
|
||||
$("body").addClass("ajaxerr");
|
||||
+ gettext("Close message") + "</a>");
|
||||
ModalDialog.updateBodyClass();
|
||||
},
|
||||
hide: function () {
|
||||
"use strict";
|
||||
$("body").removeClass("ajaxerr");
|
||||
$("#ajaxerr").hide();
|
||||
ModalDialog.updateBodyClass();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/*global $,gettext,ngettext */
|
||||
function EL(tagName, attrs) {
|
||||
var el = document.createElement(tagName);
|
||||
if (attrs) for(var key in attrs)
|
||||
if (key === 'style' && typeof attrs[key] === 'object') Object.assign(el.style, attrs[key]);
|
||||
else if (key === 'innerHTML') el.innerHTML = attrs[key];
|
||||
else if (key === 'appendTo' && (attrs.appendTo instanceof HTMLElement || attrs.appendTo instanceof ShadowRoot)) attrs.appendTo.append(el);
|
||||
else if (key === 'prependTo' && (attrs.prependTo instanceof HTMLElement || attrs.prependTo instanceof ShadowRoot)) attrs.prependTo.prepend(el);
|
||||
else if (key === 'insertBefore' && attrs.insertBefore instanceof HTMLElement) attrs.insertBefore.before(el);
|
||||
else if (key === 'insertAfter' && attrs.insertAfter instanceof HTMLElement) attrs.insertAfter.after(el);
|
||||
else if (key.startsWith("on")) el.addEventListener(key.substring(2), attrs[key], false);
|
||||
else if (key.startsWith(":")) el[key.substring(1)] = attrs[key];
|
||||
else if (key === 'checked' && 'checked' in el) el.checked = attrs.checked;
|
||||
else if (key === 'selected' && 'selected' in el) el.selected = attrs.selected;
|
||||
else if (key === 'multiple' && 'multiple' in el) el.multiple = attrs.multiple;
|
||||
else el.setAttribute(key, attrs[key]);
|
||||
|
||||
if (arguments[2] instanceof Array)
|
||||
var args = arguments[2], i = 0;
|
||||
else
|
||||
var args = arguments, i = 2;
|
||||
for(;i<args.length;i++){
|
||||
if (args[i] instanceof HTMLElement) el.appendChild(args[i]);
|
||||
else if (args[i]) el.appendChild(document.createTextNode(""+args[i]));
|
||||
}
|
||||
return el;
|
||||
}
|
||||
|
||||
function ModalDialog(options) {
|
||||
this.id = 'modal-dlg-' + (++ModalDialog._next_dialog_id);
|
||||
this.options = options;
|
||||
this.dialogEl = EL('dialog', {class: 'modal-card', id: this.id,
|
||||
'aria-live': 'polite', 'aria-labelledby': this.id + '-title', 'aria-describedby': this.id + '-desc',
|
||||
appendTo: document.body, onclose: this._onClose.bind(this)},
|
||||
(options.icon)
|
||||
? EL('div', {class: 'modal-card-icon'},
|
||||
EL('i', {'aria-hidden': 'true', class: 'fa fa-' + options.icon + ' ' + (options.rotatingIcon ? 'big-rotating-icon' : 'big-icon')}))
|
||||
: undefined,
|
||||
EL('div', {class: 'modal-card-content'},
|
||||
this.titleEl = EL('h3', {id: this.id + '-title'}, options.title || ''),
|
||||
this.descEl = EL('p', {id: this.id + '-desc'}, options.description || ''),
|
||||
this.contentEl = EL('div', {}, options.content || '')));
|
||||
}
|
||||
|
||||
ModalDialog._next_dialog_id = 1;
|
||||
ModalDialog.updateBodyClass = function() {
|
||||
if ($("dialog[open], .modal-wrapper:not([hidden])").length)
|
||||
$(document.body).addClass('has-modal-dialog');
|
||||
else
|
||||
$(document.body).removeClass('has-modal-dialog');
|
||||
}
|
||||
|
||||
ModalDialog.prototype.show = function() {
|
||||
this.dialogEl.showModal();
|
||||
ModalDialog.updateBodyClass();
|
||||
}
|
||||
ModalDialog.prototype.hide = function() {
|
||||
this.dialogEl.close();
|
||||
}
|
||||
ModalDialog.prototype.isOpen = function() {
|
||||
return this.dialogEl.open;
|
||||
}
|
||||
ModalDialog.prototype._onClose = function() {
|
||||
if (this.options.removeOnClose) this.dialogEl.remove();
|
||||
ModalDialog.updateBodyClass();
|
||||
}
|
||||
ModalDialog.prototype.setTitle = function(text) {
|
||||
this.titleEl.innerText = text;
|
||||
}
|
||||
ModalDialog.prototype.setDescription = function(text) {
|
||||
this.descEl.innerText = text;
|
||||
this.descEl.style.display = text ? '' : 'none';
|
||||
}
|
||||
ModalDialog.prototype.setContent = function(text) {
|
||||
this.contentEl.innerText = text;
|
||||
}
|
||||
@@ -49,7 +49,7 @@ html.rtl {
|
||||
}
|
||||
|
||||
input[lang=ar], textarea[lang=ar], div[lang=ar], pre[lang=ar],
|
||||
input[lang=he], textarea[lang=he], div[lang=he], pre[lang=he] {
|
||||
input[lang=hw], textarea[lang=hw], div[lang=hw], pre[lang=hw] {
|
||||
/* Keep list of languages in sync with pretix._base_settings.LANGUAGES_RTL */
|
||||
direction: rtl;
|
||||
}
|
||||
}
|
||||
@@ -262,95 +262,3 @@ svg.svg-icon {
|
||||
@include table-row-variant('info', var(--pretix-brand-info-success-lighten-30), var(--pretix-brand-info-success-lighten-25));
|
||||
@include table-row-variant('warning', var(--pretix-brand-warning-lighten-40), var(--pretix-brand-warning-lighten-35));
|
||||
@include table-row-variant('danger', var(--pretix-brand-danger-lighten-30), var(--pretix-brand-danger-lighten-25));
|
||||
|
||||
|
||||
|
||||
|
||||
dialog {
|
||||
border: none;
|
||||
width: 80%;
|
||||
max-width: 43em;
|
||||
padding: 0;
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
|
||||
.modal-card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-content: stretch;
|
||||
}
|
||||
.modal-card-icon {
|
||||
background: $brand-primary;
|
||||
font-size: 2em;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 3px;
|
||||
}
|
||||
.modal-card-content {
|
||||
padding: 1.5em;
|
||||
}
|
||||
.modal-card-content>*:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.modal-card-content>*:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.modal-card-confirm {
|
||||
margin-top: 2em;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 1em;
|
||||
align-items: center;
|
||||
}
|
||||
.modal-card-confirm-spread {
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
dialog::backdrop {
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
}
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 1;
|
||||
}
|
||||
@starting-style {
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: $screen-sm-min) {
|
||||
dialog {
|
||||
.modal-card:has(.modal-card-icon) {
|
||||
flex-direction: row;
|
||||
}
|
||||
.modal-card-content {
|
||||
padding: 2em;
|
||||
}
|
||||
.modal-card-icon {
|
||||
font-size: 4em;
|
||||
padding: 6px 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.shake-once {
|
||||
animation: shake .2s;
|
||||
transform: translate3d(0, 0, 0);
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
0% { transform: skewX(0deg); }
|
||||
20% { transform: skewX(-5deg); }
|
||||
40% { transform: skewX(5deg); }
|
||||
60% { transform: skewX(-5deg); }
|
||||
80% { transform: skewX(5deg); }
|
||||
100% { transform: skewX(0deg); }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
body.has-modal-dialog .container, body.has-modal-dialog #wrapper {
|
||||
-webkit-filter: blur(2px);
|
||||
-moz-filter: blur(2px);
|
||||
-ms-filter: blur(2px);
|
||||
-o-filter: blur(2px);
|
||||
filter: blur(2px);
|
||||
}
|
||||
|
||||
.big-rotating-icon {
|
||||
-webkit-animation: fa-spin 8s infinite linear;
|
||||
animation: fa-spin 8s infinite linear;
|
||||
font-size: 120px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
dialog.modal-card::backdrop {
|
||||
background: rgba(255, 255, 255, .7);
|
||||
}
|
||||
.modal-wrapper {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(255, 255, 255, .7);
|
||||
z-index: 900000;
|
||||
padding: 10px;
|
||||
}
|
||||
.modal-card {
|
||||
margin: 50px auto 0;
|
||||
width: 90%;
|
||||
max-width: 600px;
|
||||
max-height: calc(100vh - 100px);
|
||||
overflow-y: auto;
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
padding: 20px;
|
||||
min-height: 160px;
|
||||
border: 0;
|
||||
|
||||
.modal-card-icon {
|
||||
float: left;
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
.big-icon {
|
||||
margin-top: 10px;
|
||||
font-size: 100px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
}
|
||||
.modal-card-content {
|
||||
margin-left: 160px;
|
||||
text-align: left;
|
||||
h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#cookie-consent-modal {
|
||||
background: rgba(255, 255, 255, .5);
|
||||
.modal-card-content {
|
||||
margin-left: 0;
|
||||
}
|
||||
details {
|
||||
& > summary {
|
||||
list-style: none;
|
||||
}
|
||||
& > summary::-webkit-details-marker,
|
||||
& > summary::marker {
|
||||
display: none;
|
||||
}
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.modal-card {
|
||||
margin: 25px auto 0;
|
||||
max-height: calc(100vh - 50px - 20px);
|
||||
.modal-card-icon {
|
||||
float: none;
|
||||
width: 100%;
|
||||
}
|
||||
.modal-card-content {
|
||||
text-align: center;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ajaxerr {
|
||||
background: rgba(236, 236, 236, .9);
|
||||
|
||||
.big-icon {
|
||||
margin-top: 50px;
|
||||
font-size: 200px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
}
|
||||
@@ -51,32 +51,6 @@ function formatPrice(price, currency, locale) {
|
||||
}
|
||||
}
|
||||
|
||||
var waitingDialog = {
|
||||
show: function (message) {
|
||||
"use strict";
|
||||
$("#loadingmodal").find("h1").html(message);
|
||||
$("body").addClass("loading");
|
||||
},
|
||||
hide: function () {
|
||||
"use strict";
|
||||
$("body").removeClass("loading");
|
||||
}
|
||||
};
|
||||
|
||||
var ajaxErrDialog = {
|
||||
show: function (c) {
|
||||
"use strict";
|
||||
$("#ajaxerr").html(c);
|
||||
$("#ajaxerr .links").html("<a class='btn btn-default ajaxerr-close'>"
|
||||
+ gettext("Close message") + "</a>");
|
||||
$("body").addClass("ajaxerr");
|
||||
},
|
||||
hide: function () {
|
||||
"use strict";
|
||||
$("body").removeClass("ajaxerr");
|
||||
}
|
||||
};
|
||||
|
||||
var apiGET = function (url, callback) {
|
||||
$.getJSON(url, function (data) {
|
||||
callback(data);
|
||||
@@ -277,8 +251,7 @@ var form_handlers = function (el) {
|
||||
fill_field.on("dp.show", show);
|
||||
});
|
||||
|
||||
function luminance(r, g, b) {
|
||||
// Algorithm defined as https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
|
||||
function luminanace(r, g, b) {
|
||||
var a = [r, g, b].map(function (v) {
|
||||
v /= 255;
|
||||
return v <= 0.03928
|
||||
@@ -288,9 +261,8 @@ var form_handlers = function (el) {
|
||||
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
|
||||
}
|
||||
function contrast(rgb1, rgb2) {
|
||||
// Algorithm defined at https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
|
||||
var l1 = luminance(rgb1[0], rgb1[1], rgb1[2]) + 0.05,
|
||||
l2 = luminance(rgb2[0], rgb2[1], rgb2[2]) + 0.05,
|
||||
var l1 = luminanace(rgb1[0], rgb1[1], rgb1[2]) + 0.05,
|
||||
l2 = luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05,
|
||||
ratio = l1/l2
|
||||
if (l2 > l1) {ratio = 1/ratio}
|
||||
return ratio.toFixed(1)
|
||||
@@ -329,15 +301,15 @@ var form_handlers = function (el) {
|
||||
var icon, text, cls;
|
||||
if (c > 7) {
|
||||
icon = "fa-check-circle";
|
||||
text = gettext('Your color has great contrast and will provide excellent accessibility.');
|
||||
text = gettext('Your color has great contrast and is very easy to read!');
|
||||
cls = "text-success";
|
||||
} else if (c > 4.5) {
|
||||
} else if (c > 2.5) {
|
||||
icon = "fa-info-circle";
|
||||
text = gettext('Your color has decent contrast and is sufficient for minimum accessibility requirements.');
|
||||
text = gettext('Your color has decent contrast and is probably good-enough to read!');
|
||||
cls = "";
|
||||
} else {
|
||||
icon = "fa-warning";
|
||||
text = gettext('Your color has insufficient contrast to white. Accessibility of your site will be impacted.');
|
||||
text = gettext('Your color has bad contrast for text on white background, please choose a darker shade.');
|
||||
cls = "text-danger";
|
||||
}
|
||||
if ($icon.length === 0) {
|
||||
|
||||
@@ -160,7 +160,7 @@ pre[lang=ht], input[lang=ht], textarea[lang=ht], div[lang=ht] { background-image
|
||||
pre[lang=hu], input[lang=hu], textarea[lang=hu], div[lang=hu] { background-image: url(static('pretixbase/img/flags/hu.png')); }
|
||||
pre[lang=id], input[lang=id], textarea[lang=id], div[lang=id] { background-image: url(static('pretixbase/img/flags/id.png')); }
|
||||
pre[lang=ie], input[lang=ie], textarea[lang=ie], div[lang=ie] { background-image: url(static('pretixbase/img/flags/ie.png')); }
|
||||
pre[lang=he], input[lang=he], textarea[lang=he], div[lang=he] { background-image: url(static('pretixbase/img/flags/il.png')); }
|
||||
pre[lang=il], input[lang=il], textarea[lang=il], div[lang=il] { background-image: url(static('pretixbase/img/flags/il.png')); }
|
||||
pre[lang=in], input[lang=in], textarea[lang=in], div[lang=in] { background-image: url(static('pretixbase/img/flags/in.png')); }
|
||||
pre[lang=io], input[lang=io], textarea[lang=io], div[lang=io] { background-image: url(static('pretixbase/img/flags/io.png')); }
|
||||
pre[lang=iq], input[lang=iq], textarea[lang=iq], div[lang=iq] { background-image: url(static('pretixbase/img/flags/iq.png')); }
|
||||
@@ -306,4 +306,3 @@ pre[lang=za], input[lang=za], textarea[lang=za], div[lang=za] { background-image
|
||||
pre[lang=zm], input[lang=zm], textarea[lang=zm], div[lang=zm] { background-image: url(static('pretixbase/img/flags/zm.png')); }
|
||||
pre[lang=zw], input[lang=zw], textarea[lang=zw], div[lang=zw] { background-image: url(static('pretixbase/img/flags/zw.png')); }
|
||||
pre[lang=en], input[lang=en], textarea[lang=en], div[lang=en] { background-image: url(static('pretixbase/img/flags/gb.png')); }
|
||||
pre[lang=eu], input[lang=eu], textarea[lang=eu], div[lang=eu] { background-image: url(static('pretixbase/img/flags/basque.png')); }
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
@import "../../select2/select2.scss";
|
||||
@import "../../select2/select2_bootstrap.scss";
|
||||
@import "../../colorpicker/bootstrap-colorpicker.scss";
|
||||
@import "../../pretixbase/scss/dialogs.scss";
|
||||
|
||||
/* See https://github.com/pretix/pretix/pull/761 */
|
||||
.bootstrap-datetimepicker-widget table td span {
|
||||
@@ -234,99 +235,6 @@ p.bigger {
|
||||
}
|
||||
}
|
||||
|
||||
body.loading #wrapper {
|
||||
-webkit-filter: blur(2px);
|
||||
-moz-filter: blur(2px);
|
||||
-ms-filter: blur(2px);
|
||||
-o-filter: blur(2px);
|
||||
filter: blur(2px);
|
||||
}
|
||||
|
||||
#loadingmodal, #ajaxerr {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(255, 255, 255, .7);
|
||||
opacity: 0;
|
||||
z-index: 900000;
|
||||
visibility: hidden;
|
||||
padding: 10px;
|
||||
|
||||
.big-icon {
|
||||
margin-top: 50px;
|
||||
font-size: 200px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
|
||||
.modal-card {
|
||||
margin: 50px auto 0;
|
||||
top: 50px;
|
||||
width: 90%;
|
||||
max-width: 600px;
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
padding: 20px;
|
||||
min-height: 160px;
|
||||
|
||||
.modal-card-icon {
|
||||
float: left;
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
|
||||
.big-rotating-icon {
|
||||
font-size: 120px;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
.modal-card-content {
|
||||
margin-left: 160px;
|
||||
text-align: left;
|
||||
h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@media (max-width: 700px) {
|
||||
#loadingmodal, #ajaxerr {
|
||||
.modal-card {
|
||||
.modal-card-icon {
|
||||
float: none;
|
||||
width: 100%;
|
||||
}
|
||||
.modal-card-content {
|
||||
text-align: center;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ajaxerr {
|
||||
background: rgba(236, 236, 236, .9);
|
||||
}
|
||||
|
||||
.loading #loadingmodal, .ajaxerr #ajaxerr {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transition: opacity .5s ease-in-out;
|
||||
-moz-transition: opacity .5s ease-in-out;
|
||||
-webkit-transition: opacity .5s ease-in-out;
|
||||
}
|
||||
|
||||
.big-rotating-icon {
|
||||
margin-top: 50px;
|
||||
-webkit-animation: fa-spin 8s infinite linear;
|
||||
animation: fa-spin 8s infinite linear;
|
||||
font-size: 200px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
|
||||
.user-admin-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
|
||||
@@ -20,6 +20,27 @@ var cart = {
|
||||
cart._time_offset = server_time - client_time;
|
||||
},
|
||||
|
||||
show_expiry_notification: function () {
|
||||
if (cart._notify_dialog) return;
|
||||
|
||||
const btn_clicked = function() {
|
||||
cart._notify_dialog.hide();
|
||||
cart._notify_dialog = null;
|
||||
$("#cart-extend-form").submit();
|
||||
};
|
||||
cart._notify_dialog = new ModalDialog({
|
||||
icon: 'clock-o',
|
||||
title: gettext("Please let us know if you're still there"),
|
||||
description: undefined,
|
||||
content: EL('p', {},
|
||||
EL('button', {class: 'btn btn-primary btn-lg', onclick: btn_clicked, autofocus: ''}, gettext('Continue'))
|
||||
),
|
||||
removeOnClose: true,
|
||||
});
|
||||
cart._notify_dialog.show();
|
||||
cart._expiry_notified = true;
|
||||
},
|
||||
|
||||
draw_deadline: function () {
|
||||
function pad(n, width, z) {
|
||||
z = z || '0';
|
||||
@@ -33,8 +54,9 @@ var cart = {
|
||||
return;
|
||||
}
|
||||
var now = cart._get_now();
|
||||
var diff_minutes = Math.floor(cart._deadline.diff(now) / 1000 / 60);
|
||||
var diff_seconds = Math.floor(cart._deadline.diff(now) / 1000 % 60);
|
||||
var diff_total_seconds = cart._deadline.diff(now) / 1000;
|
||||
var diff_minutes = Math.floor(diff_total_seconds / 60);
|
||||
var diff_seconds = Math.floor(diff_total_seconds % 60);
|
||||
|
||||
if (diff_minutes < 2 || diff_minutes == 5) $("#cart-deadline").get(0).setAttribute("aria-live", "polite");
|
||||
else $("#cart-deadline").get(0).removeAttribute("aria-live");
|
||||
@@ -45,6 +67,7 @@ var cart = {
|
||||
gettext("Cart expired")
|
||||
);
|
||||
window.clearInterval(cart._deadline_interval);
|
||||
cart._deadline_interval = null;
|
||||
} else {
|
||||
$("#cart-deadline").text(ngettext(
|
||||
"The items in your cart are reserved for you for one minute.",
|
||||
@@ -55,14 +78,33 @@ var cart = {
|
||||
pad(diff_minutes.toString(), 2) + ':' + pad(diff_seconds.toString(), 2)
|
||||
);
|
||||
}
|
||||
$("#cart-extend-button").toggle(diff_minutes < 3);
|
||||
var already_expired = diff_total_seconds <= 0;
|
||||
var can_extend_cart = diff_minutes < 3 && (already_expired || cart._deadline < cart._max_extend);
|
||||
$("#cart-extend-button").toggle(can_extend_cart);
|
||||
if (can_extend_cart && diff_total_seconds < 45) {
|
||||
if (!cart._expiry_notified) cart.show_expiry_notification();
|
||||
if (cart._notify_dialog) cart._notify_dialog.setDescription(already_expired
|
||||
? gettext("Your cart has expired. If you want to continue, please click here:")
|
||||
: gettext("Your cart is about to expire. If you want to continue, please click here:"));
|
||||
}
|
||||
},
|
||||
|
||||
init: function () {
|
||||
"use strict";
|
||||
cart._deadline = moment($("#cart-deadline").attr("data-expires"));
|
||||
cart._deadline_interval = window.setInterval(cart.draw_deadline, 500);
|
||||
cart._calc_offset();
|
||||
cart.set_deadline(
|
||||
$("#cart-deadline").attr("data-expires"),
|
||||
$("#cart-deadline").attr("data-max-expiry-extend")
|
||||
);
|
||||
},
|
||||
|
||||
set_deadline: function (expiry, max_extend) {
|
||||
"use strict";
|
||||
cart._expiry_notified = false;
|
||||
cart._deadline = moment(expiry);
|
||||
cart._max_extend = moment(max_extend);
|
||||
if (!cart._deadline_interval)
|
||||
cart._deadline_interval = window.setInterval(cart.draw_deadline, 500);
|
||||
cart.draw_deadline();
|
||||
}
|
||||
};
|
||||
@@ -74,6 +116,13 @@ $(function () {
|
||||
cart.init();
|
||||
}
|
||||
|
||||
$("#cart-extend-form").on("pretix:async-task-success", function(e, data) {
|
||||
if (data.success)
|
||||
cart.set_deadline(data.expiry, data.max_expiry_extend);
|
||||
else
|
||||
alert(data.message);
|
||||
});
|
||||
|
||||
$(".toggle-container").each(function() {
|
||||
var summary = $(".toggle-summary", this);
|
||||
var content = $("> :not(.toggle-summary)", this);
|
||||
|
||||
@@ -6,7 +6,7 @@ $(function () {
|
||||
var storage_key = $("#cookie-consent-storage-key").text();
|
||||
var widget_consent = $("#cookie-consent-from-widget").text();
|
||||
var consent_checkboxes = $("#cookie-consent-details input[type=checkbox][name]");
|
||||
var consent_modal = document.getElementById("cookie-consent-modal");
|
||||
var consent_modal = $("#cookie-consent-modal");
|
||||
|
||||
function update_consent(consent, sessionOnly) {
|
||||
if (storage_key && window.sessionStorage && sessionOnly) {
|
||||
@@ -108,32 +108,25 @@ $(function () {
|
||||
|
||||
_set_button_text();
|
||||
if (show_dialog) {
|
||||
consent_modal.showModal();
|
||||
consent_modal.addEventListener("cancel", function() {
|
||||
// Dialog was initially shown, interpret Escape as „do not consent to new providers“
|
||||
var consent = {};
|
||||
consent_checkboxes.each(function () {
|
||||
consent[this.name] = storage_val[this.name] || false;
|
||||
});
|
||||
update_consent(consent, false);
|
||||
}, {once : true});
|
||||
// We use .css() instead of .show() because of some weird issue that only occurs in Firefox
|
||||
// and only within the widget.
|
||||
consent_modal.css("display", "block");
|
||||
}
|
||||
|
||||
consent_modal.addEventListener("close", function () {
|
||||
if (!consent_modal.returnValue) {// ESC, do not save
|
||||
return;
|
||||
}
|
||||
$("#cookie-consent-button-yes, #cookie-consent-button-no").on("click", function () {
|
||||
consent_modal.hide();
|
||||
var consent = {};
|
||||
var consent_all = consent_modal.returnValue == "yes";
|
||||
var consent_all = this.id == "cookie-consent-button-yes";
|
||||
consent_checkboxes.each(function () {
|
||||
consent[this.name] = this.checked = consent_all || this.checked;
|
||||
});
|
||||
if (consent_all) _set_button_text();
|
||||
// Always save explicit consent to permanent storage
|
||||
update_consent(consent, false);
|
||||
});
|
||||
consent_checkboxes.on("change", _set_button_text);
|
||||
$("#cookie-consent-reopen").on("click", function (e) {
|
||||
consent_modal.showModal()
|
||||
consent_modal.show()
|
||||
e.preventDefault()
|
||||
return true
|
||||
})
|
||||
|
||||
@@ -307,6 +307,8 @@ function setup_basics(el) {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
el.find('[data-toggle="tooltip"]').tooltip();
|
||||
|
||||
// AddOns
|
||||
el.find('.addon-variation-description').hide();
|
||||
el.find('.toggle-variation-description').click(function () {
|
||||
@@ -390,13 +392,6 @@ $(function () {
|
||||
sessionStorage.removeItem('scrollpos');
|
||||
}
|
||||
|
||||
$("dialog").on("mousedown", function (e) {
|
||||
if (e.target == this) {
|
||||
// dialog has no padding, so this triggers only onclick on backdrop
|
||||
this.close();
|
||||
}
|
||||
});
|
||||
|
||||
$(".accordion-radio").click(function() {
|
||||
var $input = $("input", this);
|
||||
if (!$input.prop("checked")) $input.prop('checked', true).trigger("change");
|
||||
@@ -414,8 +409,6 @@ $(function () {
|
||||
$("#voucher-toggle").slideUp();
|
||||
});
|
||||
|
||||
$("#ajaxerr").on("click", ".ajaxerr-close", ajaxErrDialog.hide);
|
||||
|
||||
// Handlers for "Copy answers from above" buttons
|
||||
$(".js-copy-answers").click(function (e) {
|
||||
e.preventDefault();
|
||||
@@ -485,21 +478,33 @@ $(function () {
|
||||
sessionStorage.setItem('scrollpos', window.scrollY);
|
||||
});
|
||||
}
|
||||
$("form:has(#btn-add-to-cart)").on("submit", function(e) {
|
||||
if (
|
||||
(this.classList.contains("has-seating") && this.querySelector("pretix-seating-checkout-button button")) ||
|
||||
this.querySelector("input[type=checkbox]:checked") ||
|
||||
[...this.querySelectorAll(".input-item-count[type=text]")].some(input => input.value && input.value !== "0") // TODO: seating hat noch einen seating-dummy-item-count, das ist Mist!
|
||||
) {
|
||||
// okay, let the submit-event bubble to async-task
|
||||
return;
|
||||
var update_cart_form = function () {
|
||||
var is_enabled = $(".product-row input[type=checkbox]:checked, .variations input[type=checkbox]:checked, .product-row input[type=radio]:checked, .variations input[type=radio]:checked").length;
|
||||
if (!is_enabled) {
|
||||
$(".input-item-count").each(function () {
|
||||
if ($(this).val() && $(this).val() !== "0") {
|
||||
is_enabled = true;
|
||||
}
|
||||
});
|
||||
$(".input-seat-selection option").each(function() {
|
||||
if ($(this).val() && $(this).val() !== "" && $(this).prop('selected')) {
|
||||
is_enabled = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
document.querySelector("#dialog-nothing-to-add").showModal();
|
||||
});
|
||||
if (!is_enabled && (!$(".has-seating").length || $("#seating-dummy-item-count").length)) {
|
||||
$("#btn-add-to-cart").prop("disabled", !is_enabled).popover({
|
||||
'content': function () { return gettext("Please enter a quantity for one of the ticket types.") },
|
||||
'placement': 'top',
|
||||
'trigger': 'hover focus'
|
||||
});
|
||||
} else {
|
||||
$("#btn-add-to-cart").prop("disabled", false).popover("destroy")
|
||||
}
|
||||
};
|
||||
update_cart_form();
|
||||
$(".product-row input[type=checkbox], .variations input[type=checkbox], .product-row input[type=radio], .variations input[type=radio], .input-item-count, .input-seat-selection")
|
||||
.on("change mouseup keyup", update_cart_form);
|
||||
|
||||
$(".table-calendar td.has-events").click(function () {
|
||||
var $grid = $(this).closest("[role='grid']");
|
||||
|
||||
@@ -4,8 +4,6 @@ $(function () {
|
||||
var popup_window = null
|
||||
var popup_check_interval = null
|
||||
|
||||
$("#popupmodal").removeAttr("hidden");
|
||||
|
||||
$("a[data-open-in-popup-window]").on("click", function (e) {
|
||||
e.preventDefault()
|
||||
|
||||
@@ -22,11 +20,13 @@ $(function () {
|
||||
"presale-popup",
|
||||
"scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=no,menubar=no,width=940,height=620,left=50,top=50"
|
||||
)
|
||||
$("body").addClass("has-popup")
|
||||
$("body").addClass("has-popup has-modal-dialog")
|
||||
$("#popupmodal").removeAttr("hidden");
|
||||
|
||||
popup_check_interval = window.setInterval(function () {
|
||||
if (popup_window.closed) {
|
||||
$("body").removeClass("has-popup")
|
||||
$("body").removeClass("has-popup has-modal-dialog")
|
||||
$("#popupmodal").attr("hidden", true);
|
||||
window.clearInterval(popup_check_interval)
|
||||
}
|
||||
}, 250)
|
||||
|
||||
@@ -471,7 +471,7 @@ Vue.component('variation', {
|
||||
// Variation description
|
||||
+ '<div class="pretix-widget-item-info-col">'
|
||||
+ '<div class="pretix-widget-item-title-and-description">'
|
||||
+ '<strong :id="variation_label_id" class="pretix-widget-item-title" role="heading" v-bind:aria-level="headingLevel">{{ variation.value }}</strong>'
|
||||
+ '<strong :id="variation_label_id" class="pretix-widget-item-title">{{ variation.value }}</strong>'
|
||||
+ '<div :id="variation_desc_id" class="pretix-widget-item-description" v-if="variation.description" v-html="variation.description"></div>'
|
||||
+ '<p class="pretix-widget-item-meta" '
|
||||
+ ' v-if="!variation.has_variations && variation.avail[1] !== null && variation.avail[0] === 100">'
|
||||
@@ -500,7 +500,6 @@ Vue.component('variation', {
|
||||
props: {
|
||||
variation: Object,
|
||||
item: Object,
|
||||
category: Object,
|
||||
},
|
||||
computed: {
|
||||
orig_price: function () {
|
||||
@@ -524,9 +523,6 @@ Vue.component('variation', {
|
||||
aria_labelledby: function () {
|
||||
return [this.variation_label_id, this.variation_price_id].join(" ");
|
||||
},
|
||||
headingLevel: function () {
|
||||
return this.category.name ? '5' : '4';
|
||||
},
|
||||
}
|
||||
});
|
||||
Vue.component('item', {
|
||||
@@ -537,12 +533,12 @@ Vue.component('item', {
|
||||
+ '<div class="pretix-widget-item-info-col">'
|
||||
+ '<a :href="item.picture_fullsize" v-if="item.picture" class="pretix-widget-item-picture-link" @click.prevent.stop="lightbox"><img :src="item.picture" class="pretix-widget-item-picture" :alt="picture_alt_text"></a>'
|
||||
+ '<div class="pretix-widget-item-title-and-description">'
|
||||
+ '<a v-if="item.has_variations && show_toggle" :id="item_label_id" role="heading" v-bind:aria-level="headingLevel" class="pretix-widget-item-title" :href="\'#\' + item.id + \'-variants\'"'
|
||||
+ '<a v-if="item.has_variations && show_toggle" :id="item_label_id" class="pretix-widget-item-title" :href="\'#\' + item.id + \'-variants\'"'
|
||||
+ ' @click.prevent.stop="expand"'
|
||||
+ '>'
|
||||
+ '{{ item.name }}'
|
||||
+ '</a>'
|
||||
+ '<strong v-else class="pretix-widget-item-title" :id="item_label_id" role="heading" v-bind:aria-level="headingLevel">{{ item.name }}</strong>'
|
||||
+ '<strong v-else class="pretix-widget-item-title" :id="item_label_id">{{ item.name }}</strong>'
|
||||
+ '<div class="pretix-widget-item-description" :id="item_desc_id" v-if="item.description" v-html="item.description"></div>'
|
||||
+ '<p class="pretix-widget-item-meta" v-if="item.order_min && item.order_min > 1">'
|
||||
+ '<small>{{ min_order_str }}</small>'
|
||||
@@ -576,14 +572,13 @@ Vue.component('item', {
|
||||
|
||||
// Variations
|
||||
+ '<div :class="varClasses" v-if="item.has_variations" :id="item.id + \'-variants\'" ref="variations">'
|
||||
+ '<variation v-for="variation in item.variations" :variation="variation" :item="item" :category="category" :key="variation.id">'
|
||||
+ '<variation v-for="variation in item.variations" :variation="variation" :item="item" :key="variation.id">'
|
||||
+ '</variation>'
|
||||
+ '</div>'
|
||||
|
||||
+ '</div>'),
|
||||
props: {
|
||||
item: Object,
|
||||
category: Object,
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
@@ -641,9 +636,6 @@ Vue.component('item', {
|
||||
picture_alt_text: function () {
|
||||
return django.interpolate(strings["image_of"], [this.item.name]);
|
||||
},
|
||||
headingLevel: function () {
|
||||
return this.category.name ? '4' : '3';
|
||||
},
|
||||
item_label_id: function () {
|
||||
return this.$root.html_id + '-item-label-' + this.item.id;
|
||||
},
|
||||
@@ -695,7 +687,7 @@ Vue.component('category', {
|
||||
+ '<div class="pretix-widget-category-description" v-if="category.description" v-html="category.description">'
|
||||
+ '</div>'
|
||||
+ '<div class="pretix-widget-category-items">'
|
||||
+ '<item v-for="item in category.items" :category="category" :item="item" :key="item.id"></item>'
|
||||
+ '<item v-for="item in category.items" :item="item" :key="item.id"></item>'
|
||||
+ '</div>'
|
||||
+ '</div>'),
|
||||
props: {
|
||||
@@ -1010,7 +1002,7 @@ Vue.component('pretix-widget-event-form', {
|
||||
|
||||
// Event name
|
||||
+ '<div class="pretix-widget-event-header" v-if="display_event_info">'
|
||||
+ '<strong role="heading" aria-level="2">{{ $root.name }}</strong>'
|
||||
+ '<strong>{{ $root.name }}</strong>'
|
||||
+ '</div>'
|
||||
|
||||
// Date range
|
||||
@@ -1408,7 +1400,7 @@ Vue.component('pretix-widget-event-week-cell', {
|
||||
});
|
||||
|
||||
Vue.component('pretix-widget-event-calendar-cell', {
|
||||
template: ('<td :class="classObject" :role="role" :tabindex="tabindex" v-bind:aria-label="date">'
|
||||
template: ('<td :class="classObject" @click.prevent.stop="selectDay">'
|
||||
+ '<div class="pretix-widget-event-calendar-day" v-if="day" v-bind:aria-label="date">'
|
||||
+ '{{ daynum }}'
|
||||
+ '</div>'
|
||||
@@ -1420,12 +1412,10 @@ Vue.component('pretix-widget-event-calendar-cell', {
|
||||
day: Object,
|
||||
},
|
||||
methods: {
|
||||
selectDay: function (e) {
|
||||
selectDay: function () {
|
||||
if (!this.day || !this.day.events.length || !this.$parent.$parent.$parent.mobile) {
|
||||
return;
|
||||
}
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
if (this.day.events.length === 1) {
|
||||
var ev = this.day.events[0];
|
||||
this.$root.parent_stack.push(this.$root.target_url);
|
||||
@@ -1438,40 +1428,9 @@ Vue.component('pretix-widget-event-calendar-cell', {
|
||||
this.$root.events = this.day.events;
|
||||
this.$root.view = "events";
|
||||
}
|
||||
},
|
||||
onKeyDown: function (e) {
|
||||
var keyDown = e.key !== undefined ? e.key : e.keyCode;
|
||||
if ( (keyDown === 'Enter' || keyDown === 13) || (['Spacebar', ' '].indexOf(keyDown) >= 0 || keyDown === 32)) {
|
||||
// (prevent default so the page doesn't scroll when pressing space)
|
||||
e.preventDefault();
|
||||
this.selectDay(e);
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted: function () {
|
||||
if (this.role == 'button') {
|
||||
this.$el.addEventListener("click", this.selectDay);
|
||||
this.$el.addEventListener("keydown", this.onKeyDown);
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
role: function (newValue) {
|
||||
if (newValue == 'button') {
|
||||
this.$el.addEventListener("click", this.selectDay);
|
||||
this.$el.addEventListener("keydown", this.onKeyDown);
|
||||
} else {
|
||||
this.$el.removeEventListener("click", this.selectDay);
|
||||
this.$el.removeEventListener("keydown", this.onKeyDown);
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
role: function () {
|
||||
return (!this.day || !this.day.events.length || !this.$parent.$parent.$parent.mobile) ? 'cell' : 'button';
|
||||
},
|
||||
tabindex: function () {
|
||||
return this.role == 'button' ? '0' : '-1';
|
||||
},
|
||||
daynum: function () {
|
||||
if (!this.day) {
|
||||
return;
|
||||
|
||||
@@ -53,15 +53,6 @@ a.btn, button.btn {
|
||||
}
|
||||
}
|
||||
}
|
||||
.checkbox + .help-block {
|
||||
padding-left: 20px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
padding-top: $padding-base-vertical;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ $headings-small-color: $text-muted;
|
||||
@import "_calendar.scss";
|
||||
@import "_checkout.scss";
|
||||
@import "../../pretixbase/scss/webfont.scss";
|
||||
@import "../../pretixbase/scss/dialogs.scss";
|
||||
|
||||
html {
|
||||
font-size: 1em;
|
||||
@@ -76,7 +77,6 @@ html {
|
||||
clip: auto;
|
||||
}
|
||||
#skip-to-main {
|
||||
z-index: 9999;
|
||||
/* padding is needed to make focus-outline visible */
|
||||
padding: 8px;
|
||||
background-color: inherit;
|
||||
@@ -109,22 +109,7 @@ pre {
|
||||
font-size: $font-size-base;
|
||||
}
|
||||
|
||||
/* make all links in textflow underlined */
|
||||
h1, h2, h3, h4, h5, h6, p, li {
|
||||
a:not(.btn) {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
a.no-underline:link, nav li a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
a.no-underline:hover, nav li a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.help-block a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
|
||||
/* See https://github.com/pretix/pretix/pull/761 */
|
||||
@@ -157,7 +142,6 @@ button:focus, a:focus, .btn:focus, summary:focus, div:focus,
|
||||
button:active:focus, a:active:focus, .btn:active:focus, summary:active:focus, div:active:focus,
|
||||
button.active:focus, a.active:focus, .btn.active:focus,
|
||||
input:focus, .form-control:focus, .btn-checkbox:has(input:focus),
|
||||
input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus,
|
||||
.input-item-count-group:has(input:focus), .input-group-price:has(input:focus) {
|
||||
outline: 2px solid $link-hover-color;
|
||||
outline-offset: 2px;
|
||||
@@ -277,120 +261,6 @@ a:hover .panel-primary > .panel-heading {
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
body.loading .container {
|
||||
-webkit-filter: blur(2px);
|
||||
-moz-filter: blur(2px);
|
||||
-ms-filter: blur(2px);
|
||||
-o-filter: blur(2px);
|
||||
filter: blur(2px);
|
||||
}
|
||||
|
||||
.big-rotating-icon {
|
||||
-webkit-animation: fa-spin 8s infinite linear;
|
||||
animation: fa-spin 8s infinite linear;
|
||||
font-size: 120px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
#loadingmodal, #ajaxerr, #popupmodal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(255, 255, 255, .7);
|
||||
opacity: 0;
|
||||
z-index: 900000;
|
||||
visibility: hidden;
|
||||
padding: 10px;
|
||||
|
||||
.big-icon {
|
||||
margin-top: 50px;
|
||||
font-size: 200px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
&#popupmodal .big-icon {
|
||||
margin-top: 10px;
|
||||
font-size: 100px;
|
||||
color: $brand-primary;
|
||||
}
|
||||
|
||||
.modal-card {
|
||||
margin: 50px auto 0;
|
||||
width: 90%;
|
||||
max-width: 600px;
|
||||
max-height: calc(100vh - 100px);
|
||||
overflow-y: auto;
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
padding: 20px;
|
||||
min-height: 160px;
|
||||
|
||||
.modal-card-icon {
|
||||
float: left;
|
||||
width: 150px;
|
||||
text-align: center;
|
||||
}
|
||||
.modal-card-content {
|
||||
margin-left: 160px;
|
||||
text-align: left;
|
||||
h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&#cookie-consent-modal {
|
||||
background: rgba(255, 255, 255, .5);
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
display: none;
|
||||
.modal-card-content {
|
||||
margin-left: 0;
|
||||
}
|
||||
details {
|
||||
& > summary {
|
||||
list-style: none;
|
||||
}
|
||||
& > summary::-webkit-details-marker,
|
||||
& > summary::marker {
|
||||
display: none;
|
||||
}
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media (max-width: 700px) {
|
||||
#loadingmodal, #ajaxerr, #popupmodal {
|
||||
.modal-card {
|
||||
margin: 25px auto 0;
|
||||
max-height: calc(100vh - 50px - 20px);
|
||||
.modal-card-icon {
|
||||
float: none;
|
||||
width: 100%;
|
||||
}
|
||||
.modal-card-content {
|
||||
text-align: center;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ajaxerr {
|
||||
background: rgba(236, 236, 236, .9);
|
||||
}
|
||||
|
||||
.loading #loadingmodal, .ajaxerr #ajaxerr, .has-popup #popupmodal {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transition: opacity .5s ease-in-out;
|
||||
-moz-transition: opacity .5s ease-in-out;
|
||||
-webkit-transition: opacity .5s ease-in-out;
|
||||
}
|
||||
|
||||
.typo-alert span[data-typosuggest] {
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
@@ -610,18 +480,22 @@ h2 .label {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.event-list.full-width-list {
|
||||
h3, h4, p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
.event-list {
|
||||
margin-bottom: 15px;
|
||||
border-top: 1px solid $table-border-color;
|
||||
|
||||
.row {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
border-bottom: 1px solid $table-border-color;
|
||||
border-left: 1px solid $table-border-color;
|
||||
border-right: 1px solid $table-border-color;
|
||||
}
|
||||
h3, h4 {
|
||||
font-size: 1em;
|
||||
line-height: 1.25rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
h4 small {
|
||||
font-size: 85%;
|
||||
.row > div {
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1258,23 +1258,15 @@ class CartTest(CartTestMixin, TestCase):
|
||||
'item_%d' % (self.ticket.id,): '1'
|
||||
}, follow=True)
|
||||
cp.refresh_from_db()
|
||||
with scopes_disabled():
|
||||
positions = list(CartPosition.objects.filter(cart_id=cp.cart_id))
|
||||
self.assertEqual(len(positions), 2)
|
||||
for pos in positions:
|
||||
self.assertEqual(pos.expires, start_time + timedelta(minutes=20) + self.cart_reservation_time)
|
||||
self.assertEqual(pos.max_extend, max_extend)
|
||||
self.assertEqual(cp.expires, start_time + timedelta(minutes=20) + self.cart_reservation_time)
|
||||
self.assertEqual(cp.max_extend, max_extend)
|
||||
with freezegun.freeze_time(start_time + timedelta(minutes=45)):
|
||||
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'item_%d' % (self.ticket.id,): '1'
|
||||
}, follow=True)
|
||||
cp.refresh_from_db()
|
||||
with scopes_disabled():
|
||||
positions = list(CartPosition.objects.filter(cart_id=cp.cart_id))
|
||||
self.assertEqual(len(positions), 3)
|
||||
for pos in positions:
|
||||
self.assertEqual(pos.expires, max_extend)
|
||||
self.assertEqual(pos.max_extend, max_extend)
|
||||
self.assertEqual(cp.expires, max_extend)
|
||||
self.assertEqual(cp.max_extend, max_extend)
|
||||
with freezegun.freeze_time(start_time + timedelta(days=1)):
|
||||
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'item_%d' % (self.ticket.id,): '1'
|
||||
@@ -1373,61 +1365,6 @@ class CartTest(CartTestMixin, TestCase):
|
||||
with scopes_disabled():
|
||||
self.assertFalse(CartPosition.objects.filter(id=cp1.id).exists())
|
||||
|
||||
def test_expired_renew_fails_partially_and_add_succeeds(self):
|
||||
start_time = datetime.datetime(2024, 1, 1, 10, 00, 00, tzinfo=datetime.timezone.utc)
|
||||
expires = start_time + self.cart_reservation_time
|
||||
max_extend = start_time + 11 * self.cart_reservation_time
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
with scopes_disabled():
|
||||
cp1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=expires, max_extend=max_extend
|
||||
)
|
||||
cp2 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.shirt, variation=self.shirt_blue,
|
||||
price=23, expires=expires, max_extend=max_extend
|
||||
)
|
||||
with freezegun.freeze_time(max_extend + timedelta(hours=1)):
|
||||
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'variation_%d_%d' % (self.shirt.id, self.shirt_red.id): '1',
|
||||
}, follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertIn('no longer available', doc.select('.alert-danger')[0].text)
|
||||
with scopes_disabled():
|
||||
self.assertFalse(CartPosition.objects.filter(id=cp1.id).exists())
|
||||
cp2.refresh_from_db()
|
||||
self.assertEqual(cp2.expires, now() + self.cart_reservation_time)
|
||||
self.assertEqual(cp2.max_extend, now() + 11 * self.cart_reservation_time)
|
||||
cp3 = CartPosition.objects.get(variation_id=self.shirt_red.id)
|
||||
self.assertEqual(cp3.expires, now() + self.cart_reservation_time)
|
||||
self.assertEqual(cp3.max_extend, now() + 11 * self.cart_reservation_time)
|
||||
|
||||
def test_expired_cart_extend_fails_partially(self):
|
||||
start_time = datetime.datetime(2024, 1, 1, 10, 00, 00, tzinfo=datetime.timezone.utc)
|
||||
max_extend = start_time + 11 * self.cart_reservation_time
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
with scopes_disabled():
|
||||
cp1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=max_extend, max_extend=max_extend
|
||||
)
|
||||
cp2 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.shirt, variation=self.shirt_blue,
|
||||
price=23, expires=max_extend, max_extend=max_extend
|
||||
)
|
||||
with freezegun.freeze_time(max_extend + timedelta(hours=1)):
|
||||
response = self.client.post('/%s/%s/cart/extend' % (self.orga.slug, self.event.slug), {
|
||||
}, follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertIn('no longer available', doc.select('.alert-danger')[0].text)
|
||||
with scopes_disabled():
|
||||
self.assertFalse(CartPosition.objects.filter(id=cp1.id).exists())
|
||||
cp2.refresh_from_db()
|
||||
self.assertEqual(cp2.expires, now() + self.cart_reservation_time)
|
||||
self.assertEqual(cp2.max_extend, now() + 11 * self.cart_reservation_time)
|
||||
|
||||
def test_subevent_renew_expired_successfully(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
|
||||
Reference in New Issue
Block a user