Compare commits

...

39 Commits

Author SHA1 Message Date
Richard Schreiber
f8a562ed7c [A11y] fix waitinglist-link not being recognizable as a link 2025-05-19 11:50:19 +02:00
Richard Schreiber
d62152beaf [A11y] disable custom tooltip (#5115) 2025-05-16 14:14:21 +02:00
Martin Gross
2ce9584a6f PPv2: Wrap execute_payment to properly handle PaymentExceptions in atomic transactions 2025-05-15 16:58:30 +02:00
Richard Schreiber
f1fc4cb8a4 [A11y] logout-button make label visible (#5114)
* [A11y] logout-button make label visible

* add icon to sign in
2025-05-15 13:21:55 +02:00
Richard Schreiber
bf3ee608ba [A11y] Fix cookie-consent-form labels + help-text markup (#5113)
* [A11y] Fix cookie-consent-form labels + help-text markup

* remove method=dialog for now
2025-05-15 13:21:04 +02:00
Richard Schreiber
6b331888e9 [A11y] Fix missing errors on empty inputs on checkout-login (#5104) 2025-05-15 13:19:25 +02:00
Richard Schreiber
225b2452bd [A11y] underline inline-links (#5102) 2025-05-15 12:32:23 +02:00
Richard Schreiber
e7d024b146 [A11y] change footer poweredby-link to pretix.eu if no poweredby_url (#5111) 2025-05-15 12:30:48 +02:00
Richard Schreiber
0af94c3712 [A11y] change customer-pages dl to list of article (#5112)
* [A11y] change customer-pages dl to list of article

* fix small font-size

* change customer memberships as well
2025-05-15 12:30:21 +02:00
Raphael Michel
3007b89d9b [A11y] Adjust thresholds of color picker (#5110)
* [A11y] Adjust thresholds of color picker

* Fix typo
2025-05-15 12:24:23 +02:00
Richard Schreiber
9ee50a28a1 [A11y] Widget fix td-cells being clickable but not focusable (#5106)
* [A11y] Widget fix td-cells being clickable but not focusable

* improve keyboard nav
2025-05-15 10:27:43 +02:00
Raphael Michel
4dc5014947 Grammar fix (Z#23191895) 2025-05-15 09:46:28 +02:00
Raphael Michel
ebf2039a4d Translations: Update Korean
Currently translated at 37.9% (2230 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-05-15 09:44:51 +02:00
anonymous
f201ab8884 Translations: Update Korean
Currently translated at 37.9% (2226 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-05-15 09:44:51 +02:00
Raphael Michel
e20cb7649d Translations: Update Korean
Currently translated at 37.9% (2226 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-05-15 09:44:51 +02:00
조정화
e6cab37f12 Translations: Update Korean
Currently translated at 37.8% (2223 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-05-15 09:44:51 +02:00
조정화
0659338392 Translations: Update Korean
Currently translated at 34.1% (2002 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ko/

powered by weblate
2025-05-15 09:44:51 +02:00
Zona Vip
a0f0e0ca48 Translations: Update Spanish
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/es/

powered by weblate
2025-05-15 09:44:51 +02:00
Zona Vip
59af0bbfb8 Translations: Update Spanish
Currently translated at 100.0% (5869 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/es/

powered by weblate
2025-05-15 09:44:51 +02:00
Richard Schreiber
6766d649f5 [A11y] change event-list from dl to articles with h3 (#5085) 2025-05-14 21:51:54 +02:00
Richard Schreiber
c17a090244 [A11y] Fix color-contrast for info/error-texts in widget (#5105) 2025-05-14 15:06:38 +02:00
Richard Schreiber
d103d8782b [A11y] fix calendar nav dropdown (#5078)
* [A11y] fix calendar nav dropdown

* update organizer calender

* keep cal-nav on one line

* simplify html

* unify calendar layouts

* fix rounding issue with .input-group select+button

* add comment to explain complex css

* fix calendar dropdown due to too broad css-selector

* reduce spacing of top-nav

* fix input-group-btn double line through rounding issue
2025-05-14 10:01:16 +02:00
Luca Sorace "Stranck
4f4903b00e Metrics: Fix Content Type header (#5099)
* Metrics: Fix Content Type header

Now it follows the PrometheusText1.0.0 ContentType header specified from their code: 32d306854b/config/config.go (L516-L529)

* Update src/pretix/base/views/metrics.py

---------

Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
2025-05-13 18:42:02 +02:00
Richard Schreiber
caf291630c [A11y] add skip-link to main content (#5087)
* [A11y] add skip-link to main content

* fix contrast for skip-link

* fix overlay with back-to-organizer-link

* add fallback if no main-element

* update nav-label
2025-05-13 13:37:21 +02:00
Richard Schreiber
6d0368a1bb Fix page-header-links outline color contrast (#5096) 2025-05-13 13:36:45 +02:00
Richard Schreiber
57d33e1eb1 [A11y] fix issues with labels and tabindex in widget (#5083) 2025-05-13 13:36:11 +02:00
Raphael Michel
e6ec4cb435 Adjust headlines aside from front page (#5098) 2025-05-13 10:51:34 +02:00
Raphael Michel
6043a96575 Fix weird markup on "resend link" page (#5097) 2025-05-13 10:43:26 +02:00
Raphael Michel
5bc1fb8e81 Allow to set multiple email invoice recipients (Z#23190766) (#5090) 2025-05-13 10:31:07 +02:00
Raphael Michel
47c840b9e5 Check-in log: Correctly use name from parent product (Z#23192134) (#5091) 2025-05-13 10:10:18 +02:00
Richard Schreiber
b6007a1af4 [A11y] fix widget buy button being disabled (#5084)
* [A11y] fix widget buy button being disabled

* make dialog an alertdialog for better close-button support
2025-05-13 10:00:35 +02:00
Raphael Michel
1caa71cdbe Improve validation of Norwegian VAT IDs (#5089) 2025-05-12 17:04:58 +02:00
Richard Schreiber
1f2a0278c0 [A11y] replace b with strong for better semantics (#5086) 2025-05-12 16:43:08 +02:00
Raphael Michel
cf51c879c7 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/de_Informal/

powered by weblate
2025-05-12 16:43:02 +02:00
Raphael Michel
1030e2dc1f Translations: Update German
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/de/

powered by weblate
2025-05-12 16:43:02 +02:00
Hijiri Umemoto
8d320b24a5 Translations: Update Japanese
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ja/

powered by weblate
2025-05-12 16:43:02 +02:00
Hijiri Umemoto
8235132de8 Translations: Update Japanese
Currently translated at 100.0% (5869 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ja/

powered by weblate
2025-05-12 16:43:02 +02:00
Luca Hammer
2614f12faf Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5869 of 5869 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2025-05-12 16:43:02 +02:00
Richard Schreiber
6f92f2324f Fix JavaScript-based required label 2025-05-12 16:35:18 +02:00
100 changed files with 1405 additions and 1299 deletions

View File

@@ -35,19 +35,22 @@ def get_powered_by(request, safelink=True):
d = gs.settings.license_check_input
if d.get('poweredby_name'):
if d.get('poweredby_url'):
n = '<a href="{}" target="_blank" rel="noopener">{}</a>'.format(
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
d['poweredby_name']
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',
)
)
else:
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',
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',
)
)
)
else:
msg = gettext('<a %(a_attr)s>ticketing powered by pretix</a>') % {
'a_attr': 'href="{}" target="_blank" rel="noopener"'.format(

View File

@@ -531,7 +531,7 @@ def send_invoices_to_organizer(sender, **kwargs):
if i.event.settings.invoice_email_organizer:
with language(i.event.settings.locale):
mail(
email=i.event.settings.invoice_email_organizer,
email=[e.strip() for e in i.event.settings.invoice_email_organizer.split(",")],
subject=_('New invoice: {number}').format(number=i.number),
template=LazyI18nString.from_gettext(_(
'Hello,\n\n'

View File

@@ -62,6 +62,9 @@ class VATIDTemporaryError(VATIDError):
def _validate_vat_id_NO(vat_id, country_code):
# Inspired by vat_moss library
if not vat_id.startswith("NO"):
# prefix is not usually used in Norway, but expected by vat_moss library
vat_id = "NO" + vat_id
try:
vat_id = vat_moss.id.normalize(vat_id)
except ValueError:

View File

@@ -71,6 +71,7 @@ from pretix.base.reldate import (
RelativeDateField, RelativeDateTimeField, RelativeDateWrapper,
SerializerRelativeDateField, SerializerRelativeDateTimeField,
)
from pretix.base.validators import multimail_validate
from pretix.control.forms import (
ExtFileField, FontSelect, MultipleLanguagesWidget, SingleLanguageWidget,
)
@@ -1233,14 +1234,18 @@ DEFAULTS = {
'invoice_email_organizer': {
'default': '',
'type': str,
'form_class': forms.EmailField,
'serializer_class': serializers.EmailField,
'form_class': forms.CharField,
'serializer_class': serializers.CharField,
'form_kwargs': dict(
label=_("Email address to receive a copy of each invoice"),
help_text=_("Each newly created invoice will be sent to this email address shortly after creation. You can "
"use this for an automated import of invoices to your accounting system. The invoice will be "
"the only attachment of the email."),
)
validators=[multimail_validate],
),
'serializer_kwargs': dict(
validators=[multimail_validate],
),
},
'show_items_outside_presale_period': {
'default': 'True',

View File

@@ -80,4 +80,4 @@ def serve_metrics(request):
content = "\n".join(output) + "\n"
return HttpResponse(content)
return HttpResponse(content, content_type="text/plain;version=1.0.0;escaping=allow-utf-8")

View File

@@ -85,7 +85,7 @@
<div class="checkbox">
<label>
<input type="checkbox" name="delete" value="yes" />
<b>{% trans "Permanently delete all orders created in test mode" %}</b>
<strong>{% trans "Permanently delete all orders created in test mode" %}</strong>
</label>
</div>
<div class="text-right">

View File

@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34519,7 +34519,7 @@ msgid "Add to cart"
msgstr "أضف إلى سلة التسوق"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "إذا كنت قد طلبت تذكرة سابقا"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33955,7 +33955,7 @@ msgid "Add to cart"
msgstr "Afegir a la cistella"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Si ja teniu tiquets demanats"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32275,7 +32275,7 @@ msgid "Add to cart"
msgstr "Přidat do košíku"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Pokud jste si již vstupenku objednali"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29951,7 +29951,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32689,7 +32689,7 @@ msgid "Add to cart"
msgstr "Læg i kurv"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Hvis du allerede har bestilt en billet"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33772,7 +33772,7 @@ msgid "Add to cart"
msgstr "Zum Warenkorb hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Wenn Sie bereits ein Ticket bestellt haben"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
"PO-Revision-Date: 2025-04-28 11:32+0000\n"
"PO-Revision-Date: 2025-05-12 14:33+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
"de/>\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\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -742,7 +742,7 @@ msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:510
msgid "required"
msgstr "verpflichtend"
msgstr "erforderlich"
#: pretix/static/pretixpresale/js/ui/main.js:554
#: pretix/static/pretixpresale/js/ui/main.js:574

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
"PO-Revision-Date: 2025-05-06 16:20+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2025-05-09 22:00+0000\n"
"Last-Translator: Luca Hammer <hammer@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\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.1\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -9464,10 +9464,10 @@ msgstr ""
"die Kurzform der Veranstaltung verwendet, gefolgt von einem Bindestrich. "
"Achtung: Wenn mehrere Veranstaltungen des selben Veranstalters den selben "
"Wert in diesem Feld nutzen, teilen sie sich den Nummernkreis, d.h. jede "
"vollständige Rechnungsnummer wird pro Veranstalter nur einmal ergeben. Diese "
"Einstellung betrifft nur zukünftige Rechnungen. Du kannst die Platzhalter %Y "
"(mit Jahrhundert) oder %y (ohne Jahrhundert) verwenden um das Jahr der "
"Rechnung einzusetzen, oder %m bzw. %d für den Tag oder Monat."
"vollständige Rechnungsnummer wird pro Veranstalter nur einmal vergeben. "
"Diese Einstellung betrifft nur zukünftige Rechnungen. Du kannst die "
"Platzhalter %Y (mit Jahrhundert) oder %y (ohne Jahrhundert) verwenden um das "
"Jahr der Rechnung einzusetzen, oder %m bzw. %d für den Tag oder Monat."
#: pretix/base/settings.py:697 pretix/base/settings.py:719
#, python-brace-format
@@ -33711,7 +33711,7 @@ msgid "Add to cart"
msgstr "Zum Warenkorb hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Wenn du bereits ein Ticket bestellt hast"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
"PO-Revision-Date: 2025-04-28 12:21+0000\n"
"PO-Revision-Date: 2025-05-12 14:33+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/de_Informal/>\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\n"
"X-Generator: Weblate 5.11.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -741,7 +741,7 @@ msgstr "Bitte trage eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:510
msgid "required"
msgstr "verpflichtend"
msgstr "erforderlich"
#: pretix/static/pretixpresale/js/ui/main.js:554
#: pretix/static/pretixpresale/js/ui/main.js:574

View File

@@ -29858,7 +29858,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -36098,7 +36098,7 @@ msgid "Add to cart"
msgstr "Προσθήκη στο καλάθι"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Αν έχετε ήδη αγοράσει κάποιο εισιτήριο"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -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-07 06:00+0000\n"
"PO-Revision-Date: 2025-05-14 02: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.1\n"
"X-Generator: Weblate 5.11.4\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 "Cesta actual del usuario"
msgstr "Carrito actual del usuario"
#: pretix/base/exporters/orderlist.py:1135
msgid "Exited orders"
@@ -4244,12 +4244,13 @@ 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, 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."
"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."
#: pretix/base/models/discount.py:165
msgid "Apply to add-on products"
@@ -4719,7 +4720,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 si la cesta contiene uno de los siguientes productos"
msgstr "Sólo se muestra el carrito contiene uno de los siguientes productos"
#: pretix/base/models/items.py:129
msgid "Cross-selling condition"
@@ -4989,7 +4990,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 a la cesta por lo menos "
"Este producto sólo se puede comprar si se agrega al carrito 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."
@@ -6063,15 +6064,15 @@ msgstr "Posición del pedido"
#: pretix/base/models/orders.py:3091
msgid "Cart ID (e.g. session key)"
msgstr "ID de cesta (p. ej. clave de sesión)"
msgstr "ID de carrito (p. ej. clave de sesión)"
#: pretix/base/models/orders.py:3128
msgid "Cart position"
msgstr "Posición de la cesta"
msgstr "Posición del carrito"
#: pretix/base/models/orders.py:3129
msgid "Cart positions"
msgstr "Posiciones de la cesta"
msgstr "Posiciones del carrito"
#: pretix/base/models/orders.py:3265
msgid "Business customer"
@@ -6636,7 +6637,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á a la cesta del usuario si está usado el vale de "
"Este producto añadirá al carrito 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."
@@ -7787,7 +7788,7 @@ msgstr "Usted no seleccionó ningún producto."
#: pretix/base/services/cart.py:105
msgid "Unknown cart position."
msgstr "Posición de la cesta desconocida."
msgstr "Posición del carrito desconocida."
#: pretix/base/services/cart.py:106
msgctxt "subevent"
@@ -7821,7 +7822,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 cesta: %s"
"siguientes productos están afectados y no se han agregado a su carrito: %s"
#: pretix/base/services/cart.py:121
#, python-format
@@ -7832,7 +7833,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 cesta: %s"
"han agregado a su carrito: %s"
#: pretix/base/services/cart.py:126
#, python-format
@@ -7870,11 +7871,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 cesta ya que no puede comprar menos de %(min)s "
"artículo del mismo."
"Eliminamos %(product)s de su carrito ya que no puede comprar menos de %(min)"
"s artículo del mismo."
msgstr[1] ""
"Eliminamos %(product)s de su cesta ya que no puede comprar menos de %(min)s "
"artículos del mismo."
"Eliminamos %(product)s de su carrito 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
@@ -7900,7 +7901,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 cesta."
"afectadas han sido eliminadas de su carrito."
#: pretix/base/services/cart.py:151 pretix/base/services/orders.py:182
msgid ""
@@ -7908,7 +7909,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 cesta."
"posiciones afectadas han sido eliminadas de su carrito."
#: pretix/base/services/cart.py:153
msgid "The entered price is not a number."
@@ -7950,11 +7951,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 cesta que ya no se pueden comprar así."
"algunas posiciones de su carrito 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 cesta que ya no se pueden comprar así."
"algunas posiciones de su carrito que ya no se pueden comprar así."
#: pretix/base/services/cart.py:168
msgid ""
@@ -7971,7 +7972,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 "
"cesta de la compra. Esto puede significar que otra persona está canjeando "
"carrito 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."
@@ -7986,7 +7987,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 la cesta no debe combinarse con "
"La aplicación de un vale de compra a todo el carrito no debe combinarse con "
"otras operaciones."
#: pretix/base/services/cart.py:178
@@ -7994,7 +7995,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 cesta "
"Ya ha utilizado este vale de compra. Elimine la línea asociada de su carrito "
"si desea utilizarlo para un producto diferente."
#: pretix/base/services/cart.py:181
@@ -8015,7 +8016,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 cesta para la que podamos usar este "
"No encontramos ninguna posición en su carrito 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."
@@ -8616,8 +8617,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 cesta 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 carrito 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."
@@ -8633,7 +8634,7 @@ msgstr ""
#: pretix/base/services/orders.py:144
msgid "Your cart is empty."
msgstr "Su cesta está vacía."
msgstr "Su carrito está vacío."
#: pretix/base/services/orders.py:146
#, python-format
@@ -8645,10 +8646,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 cesta."
"Eliminamos el artículo sobrante de su carrito."
msgstr[1] ""
"No puede seleccionar más de %(max)s artículos del producto %(product)s. "
"Eliminamos los artículos sobrantes de su cesta."
"Eliminamos los artículos sobrantes de su carrito."
#: pretix/base/services/orders.py:155
msgid "The booking period has ended."
@@ -8659,7 +8660,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 cesta no es "
"El vale de compra utilizado para uno de los artículos de su carrito no es "
"conocido en nuestra base de datos."
#: pretix/base/services/orders.py:163
@@ -8668,16 +8669,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 cesta 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 carrito 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 cesta ya se ha "
"El vale de compra utilizado para uno de los artículos de su carrito ya se ha "
"utilizado con demasiada frecuencia. Ajustamos el precio del artículo en su "
"cesta."
@@ -8686,16 +8687,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 cesta ha "
"caducado. Hemos quitado este artículo de su cesta."
"El vale de compra utilizado para uno de los artículos de su carrito ha "
"caducado. Hemos quitado este artículo de su carrito."
#: 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 cesta no es "
"válido para este artículo. Hemos quitado este artículo de su cesta."
"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."
#: pretix/base/services/orders.py:176
msgid "You need a valid voucher code to order one of the products."
@@ -8706,22 +8707,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 cesta aún no ha "
"comenzado. Las posiciones afectadas han sido eliminadas de su cesta."
"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."
#: 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 cesta."
"Uno de las butacas de su pedido no era válida, la eliminamos de su carrito."
#: 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 cesta."
"Una de las butaca de su pedido ha sido ocupada. La eliminamos de su carrito."
#: pretix/base/services/orders.py:202
#, python-format
@@ -9154,8 +9155,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 cesta mostrará los precios brutos, ya "
"que este es el precio que debe pagarse."
"Independientemente de su elección, el carrito 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"
@@ -9521,15 +9522,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 la cesta de un usuario permanecen "
"reservados para un usuario."
"El número de minutos que los artículos en el carrito 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 cesta."
"agregado a la carrito."
#: pretix/base/settings.py:816
msgid "End of presale text"
@@ -14675,8 +14676,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 la cesta de un usuario. En su lugar, configure "
"la variación como \"inactiva\"."
"usuario o está actualmente en el carrito de un usuario. En su lugar, "
"configure la variación como \"inactiva\"."
#: pretix/control/forms/item.py:994
msgid "Use value from product"
@@ -19854,7 +19855,7 @@ msgstr "Añadir enlace"
#: pretix/control/templates/pretixcontrol/event/settings.html:345
msgid "Cart"
msgstr "Cesta"
msgstr "Carrito"
#: pretix/control/templates/pretixcontrol/event/settings.html:353
msgid ""
@@ -20284,7 +20285,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 una sola cesta."
"reservarse juntos en un solo carrito."
#: pretix/control/templates/pretixcontrol/events/create_foundation.html:53
msgid ""
@@ -20874,7 +20875,7 @@ msgid ""
"as add-ons in the cart for this product."
msgstr ""
"Con los paquetes, puede especificar productos que siempre se agregan "
"automáticamente a la cesta como complementos para este producto."
"automáticamente al carrito como complementos para este producto."
#: pretix/control/templates/pretixcontrol/item/include_bundles.html:68
msgid "Add a new bundled product"
@@ -21060,7 +21061,7 @@ msgstr "Condición"
#: pretix/control/templates/pretixcontrol/items/discount.html:34
msgid "Minimum cart content"
msgstr "Contenido mínimo de la cesta"
msgstr "Contenido mínimo del carrito"
#: pretix/control/templates/pretixcontrol/items/discount.html:43
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:53
@@ -21156,7 +21157,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 de la cesta. Si tiene "
"Un sólo desuento puede aplicarse a los productos del carrito. Si tiene "
"descuentos superpuestos, se aplicará el primero en el pedido de la lista "
"siguiente."
@@ -25822,7 +25823,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 cestas"
msgstr "Eliminar carrito"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:9
#, python-format
@@ -25830,7 +25831,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 de la cesta con vale de "
"¿Está seguro de que desea eliminar alguna entrada del carrito con vale de "
"compra <strong>%(voucher)s</strong>?"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:10
@@ -25839,7 +25840,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 de la cesta de un usuario que "
"Esto eliminará silenciosamente productos del carrito 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."
@@ -25859,13 +25860,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 de la "
"cesta 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 del "
"carrito 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 element de la cesta"
msgstr "Eliminar elemento del carrito"
#: pretix/control/templates/pretixcontrol/vouchers/detail.html:43
msgid "Voucher link"
@@ -32151,7 +32152,7 @@ msgid ""
"Your cart includes a product that requires an active membership to be "
"selected."
msgstr ""
"Su cesta incluye un producto que requiere una suscripción activa para ser "
"Su carrito incluye un producto que requiere una suscripción activa para ser "
"seleccionado."
#: pretix/presale/checkoutflow.py:489
@@ -32187,8 +32188,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 cesta ha "
"cambiado en consecuencia."
"impositiva diferente a su compra y el precio de los productos en su carrito "
"ha cambiado en consecuencia."
#: pretix/presale/checkoutflow.py:1029
msgid "Please enter your invoicing address."
@@ -32546,7 +32547,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 cesta, usted puede elegir opciones "
"Para algunos de los productos en su carrito, usted puede elegir opciones "
"adicionales antes de continuar."
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:16
@@ -32554,7 +32555,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 cesta sólo se vende en combinación con productos "
"Un producto de su carrito sólo se vende en combinación con productos "
"complementarios que no están disponibles. Póngase en contacto con el "
"organizador del evento."
@@ -32602,17 +32603,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 cesta"
msgstr "Su carrito"
#: 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 "La cesta de compra ha expirado"
msgstr "El carrito de compra ha expirado"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
msgid "Show full cart"
msgstr "Mostrar cesta completa"
msgstr "Mostrar carrito completo"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:48
#: pretix/presale/templates/pretixpresale/event/index.html:84
@@ -32758,7 +32759,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 de la cesta sólo pueden comprarse si existe una "
"Algunos productos del carrito sólo pueden comprarse si existe una "
"suscripción activa en su cuenta."
#: pretix/presale/templates/pretixpresale/event/checkout_membership.html:37
@@ -32891,7 +32892,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 cesta. "
"establecer una cookie para recordar quién es usted y qué hay en su carrito. "
"Por favor, cambie la configuración de su navegador en consecuencia."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:17
@@ -33053,7 +33054,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 la cesta"
msgstr "Cantidad de %(item)s - %(var)s en el carrito"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:203
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:349
@@ -33092,7 +33093,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 a la cesta"
msgstr "Añadir %(item)s al carrito"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:379
msgid "There are no add-ons available for this product."
@@ -33214,12 +33215,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 cesta"
msgstr "Eliminar %(item)s de su carrito"
#: 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 cesta"
msgstr "Eliminar un %(item)s de tu carrito"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:294
#, python-format
@@ -33227,7 +33228,7 @@ msgid ""
"Remove one %(item)s from your cart. You currently have %(count)s in your "
"cart."
msgstr ""
"Elimina un %(item)s de su cesta. Actualmente tiene %(count)s en su cesta."
"Elimina un %(item)s de su carrito. Actualmente tiene %(count)s en su carrito."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:302
msgid "We're trying to reserve another one for you!"
@@ -33242,13 +33243,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 cesta, tendrá %(time)s minutos para "
"Una vez los elementos están en su carrito, 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 cesta"
msgstr "Añadir un %(item)s más a su carrito"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:324
#, python-format
@@ -33256,7 +33257,8 @@ 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 cesta. Actualmente tiene %(count)s en su cesta."
"Agregar un %(item)s más a su carrito. Actualmente tiene %(count)s en su "
"carrito."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:384
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:20
@@ -33280,15 +33282,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 cesta están reservados durante %(minutes)ss minutos."
"Los artículos de su carrito 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 theyre available."
msgstr ""
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
"seguir añadiendo más productos mientras estén disponibles."
"Los elementos en su carrito 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."
@@ -33306,7 +33308,7 @@ msgstr "Proceder con la compra"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:63
msgid "Empty cart"
msgstr "Vaciar cesta"
msgstr "Vaciar carrito"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:68
#: pretix/presale/templates/pretixpresale/event/index.html:246
@@ -33316,7 +33318,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 cesta..."
msgstr "Estamos aplicando este vale de compra a su carrito..."
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:79
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:26
@@ -33692,11 +33694,11 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:48
msgid "Your cart, general information, add products to your cart"
msgstr "Su cesta, información general, añadir productos a su cesta"
msgstr "Su carrito, información general, añadir productos a su carrito"
#: pretix/presale/templates/pretixpresale/event/index.html:48
msgid "General information, add products to your cart"
msgstr "Información general, añadir productos a la cesta"
msgstr "Información general, añadir productos al carrito"
#: pretix/presale/templates/pretixpresale/event/index.html:68
msgid "Please select a date to redeem your voucher."
@@ -33750,10 +33752,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 a la cesta"
msgstr "Agregar al carrito"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Si ya ha pedido una entrada"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34590,8 +34592,8 @@ msgid ""
"Functional cookies (e.g. shopping cart, login, payment, language preference) "
"and technical cookies (e.g. security purposes)"
msgstr ""
"Cookies funcionales (por ejemplo, cesta de compras, inicio de sesión, pago, "
"preferencia de idioma) y cookies técnicas (por ejemplo, con fines de "
"Cookies funcionales (por ejemplo, carrito 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
@@ -34883,26 +34885,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 cesta como pudimos."
"Aplicamos el vale de compra a tantos productos en su carrito 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 cesta. Continúe con el proceso de "
"La tarjeta regalo se ha guardado en su carrito. Continúe con el proceso de "
"compra."
#: pretix/presale/views/cart.py:504
msgid "Your cart has been updated."
msgstr "Su cesta ha sido actualizada."
msgstr "Su carrito ha sido actualizada."
#: pretix/presale/views/cart.py:507 pretix/presale/views/cart.py:533
msgid "Your cart is now empty."
msgstr "Su cesta ha sido vaciada."
msgstr "Su carrito 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 cesta."
msgstr "Los productos se han añadido con éxito a su carrito."
#: pretix/presale/views/cart.py:572 pretix/presale/views/event.py:540
#: pretix/presale/views/widget.py:377
@@ -34915,8 +34917,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 cesta. Seleccione ahora los productos "
"que desea comprar."
"La tarjeta regalo se ha guardado en su carrito. Seleccione ahora los "
"productos que desea comprar."
#: pretix/presale/views/cart.py:739
msgctxt "subevent"
@@ -34925,7 +34927,7 @@ msgstr "No pudimos encontrar la fecha especificada."
#: pretix/presale/views/checkout.py:55
msgid "Your cart is empty"
msgstr "Su cesta está vacía"
msgstr "Su carito está vacío"
#: pretix/presale/views/checkout.py:59
msgid "The booking period for this event is over or has not yet started."

View File

@@ -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-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"PO-Revision-Date: 2025-05-14 02:00+0000\n"
"Last-Translator: Zona Vip <contacto@zonavip.mx>\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.1\n"
"X-Generator: Weblate 5.11.4\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 theyre available."
msgstr ""
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
"seguir añadiendo más productos mientras estén disponibles."
"Los elementos en su carrito 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 "La cesta de compra ha expirado"
msgstr "El carrito 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."

View File

@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32099,7 +32099,7 @@ msgid "Add to cart"
msgstr "Saskira gehitu"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Dagoeneko sarrera bat eskatu baduzu"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -31848,7 +31848,7 @@ msgid "Add to cart"
msgstr "Lisää ostoskoriin"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Jos tilasit jo tuotteita"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29880,7 +29880,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34033,7 +34033,7 @@ msgid "Add to cart"
msgstr "Ajouter au panier"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Si vous avez déjà commandé un billet"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -35859,7 +35859,7 @@ msgid "Add to cart"
msgstr "Engadir ao pedido"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Se xa pediu unha entrada"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29895,7 +29895,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -30700,7 +30700,7 @@ msgid "Add to cart"
msgstr "Dodaj u košaricu"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Ako ste već kupili kartu"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -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 already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Ha már rendeltél jegyet"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33865,7 +33865,7 @@ msgid "Add to cart"
msgstr "Masukkan ke keranjang"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Jika kamu sudah memesan tiket"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -31883,7 +31883,7 @@ msgid "Add to cart"
msgstr "Aggiungi al carrello"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Se hai già prenotato un biglietto"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -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-09 06:36+0000\n"
"PO-Revision-Date: 2025-05-12 13:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n"
@@ -19763,7 +19763,7 @@ msgstr "クォータごとの有料チケット"
#: pretix/control/views/dashboards.py:519 pretix/control/views/typeahead.py:89
msgctxt "subevent"
msgid "No dates"
msgstr "データなし"
msgstr "日付なし"
#: pretix/control/templates/pretixcontrol/events/index.html:141
#: pretix/control/templates/pretixcontrol/subevents/index.html:158
@@ -32867,7 +32867,7 @@ msgid "Add to cart"
msgstr "カートに追加"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "すでにチケットを注文済みの場合"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -8,7 +8,7 @@ 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-09 06:36+0000\n"
"PO-Revision-Date: 2025-05-12 13:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/ja/>\n"
@@ -233,7 +233,7 @@ msgstr "未払い"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45
msgid "Canceled"
msgstr "キャンセル"
msgstr "キャンセル済み"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Confirmed"

File diff suppressed because it is too large Load Diff

View File

@@ -29862,7 +29862,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32169,7 +32169,7 @@ msgid "Add to cart"
msgstr "Pievienot grozam"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Ja jau esat pasūtījis biļeti"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34036,7 +34036,7 @@ msgid "Add to cart"
msgstr "Legg til handlekurv"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Har du allerede bestilt billett"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33634,7 +33634,7 @@ msgid "Add to cart"
msgstr "Voeg toe aan winkelwagen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Als u al een ticket heeft besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34971,7 +34971,7 @@ msgid "Add to cart"
msgstr "Voeg toe aan winkelwagen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Als je al een kaartje hebt besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33525,7 +33525,7 @@ msgid "Add to cart"
msgstr "Dodaj do koszyka"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Jeżeli bilet jest już zamówiony"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -30093,7 +30093,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -30334,7 +30334,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32910,7 +32910,7 @@ msgid "Add to cart"
msgstr "Adicionar ao carrinho"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Se você já solicitou um ingresso"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34042,7 +34042,7 @@ msgid "Add to cart"
msgstr "Adicionar ao carrinho"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Se já pediste um bilhete"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34887,7 +34887,7 @@ msgid "Add to cart"
msgstr "Adaugă în coș"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Dacă ați comandat deja un bilet"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33106,7 +33106,7 @@ msgid "Add to cart"
msgstr "Добавить в корзину"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Если вы уже заказали билет"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29992,7 +29992,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32809,7 +32809,7 @@ msgid "Add to cart"
msgstr "Pridať do košíka"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Ak ste si už objednali vstupenku"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -32657,7 +32657,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -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 already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Om du redan har bokat en biljett"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -35827,7 +35827,7 @@ msgid "Add to cart"
msgstr "Sepete ekle"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Zaten bir bilet sipariş ettiyseniz"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -33579,7 +33579,7 @@ msgid "Add to cart"
msgstr "Додати до кошика"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "Якщо Ви вже замовили квиток"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29897,7 +29897,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -34570,7 +34570,7 @@ msgid "Add to cart"
msgstr "添加到购物车"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "如果您已经订了票"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -31796,7 +31796,7 @@ msgid "Add to cart"
msgstr "加入購物車"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you already ordered a ticket"
msgid "If you have already ordered a ticket"
msgstr "如果你已訂購票"
#: pretix/presale/templates/pretixpresale/event/index.html:257

View File

@@ -801,7 +801,13 @@ class CheckinLogList(ListExporter):
ia = ci.position.order.invoice_address
except InvoiceAddress.DoesNotExist:
ia = InvoiceAddress()
name = (
ci.position.attendee_name or
(ci.position.addon_to.attendee_name if ci.position.addon_to else '') or
ia.name
)
else:
name = ""
yield [
date_format(ci.datetime.astimezone(self.timezone), 'SHORT_DATE_FORMAT'),
date_format(ci.datetime.astimezone(self.timezone), 'TIME_FORMAT'),
@@ -811,7 +817,7 @@ class CheckinLogList(ListExporter):
ci.position.positionid if ci.position else '',
ci.raw_barcode or ci.position.secret,
str(ci.position.item) if ci.position else (str(ci.raw_item) if ci.raw_item else ''),
(ci.position.attendee_name or ia.name) if ci.position else '',
name,
str(ci.device) if ci.device else '',
_('Yes') if ci.force_sent is True else (_('No') if ci.force_sent is False else '?'),
_('Yes') if ci.forced else _('No'),

View File

@@ -625,8 +625,22 @@ class PaypalMethod(BasePaymentProvider):
}
return template.render(ctx)
@transaction.atomic
# 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()
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')

View File

@@ -66,6 +66,8 @@ 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."
),
@@ -112,6 +114,10 @@ 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'

View File

@@ -44,6 +44,9 @@
</head>
<body class="nojs" data-locale="{{ request.LANGUAGE_CODE }}" data-now="{% now "U.u" %}" data-datetimeformat="{{ js_datetime_format }}" data-timeformat="{{ js_time_format }}" data-dateformat="{{ js_date_format }}" data-datetimelocale="{{ js_locale }}" data-currency="{{ request.event.currency }}">
{{ html_page_header|safe }}
<nav id="skip-to-main" role="navigation" aria-label="{% trans "Skip link" context "skip-to-main-nav" %}" class="sr-only on-focus-visible">
<p><a href="#content">{% trans "Skip to main content" %}</a></p>
</nav>
<header>
{% if ie_deprecation_warning %}
<div class="old-browser-warning">

View File

@@ -94,10 +94,11 @@
</a>
{% else %}
<h1>
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}">{{ event.name }}</a>
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" class="no-underline">{{ event.name }}
{% if request.event.settings.show_dates_on_frontpage and not event.has_subevents %}
<small>{{ event.get_date_range_display_as_html }}</small>
<small class="text-muted">{{ event.get_date_range_display_as_html }}</small>
{% endif %}
</a>
</h1>
{% endif %}
</div>

View File

@@ -1,4 +1,5 @@
{% load i18n %}
{% load icon %}
{% load eventurl %}
{% if item.current_unavailability_reason == 'require_voucher' %}
@@ -20,14 +21,15 @@
{% elif avail <= 10 %}
<div class="col-md-2 col-sm-3 col-xs-6 availability-box gone">
{% if price or original_price %}
<strong>{% trans "SOLD OUT" %}</strong>
<strong>{% icon "ban" %} {% trans "SOLD OUT" %}</strong>
{% else %}
<strong>{% trans "FULLY BOOKED" %}</strong>
<strong>{% icon "ban" %} {% trans "FULLY BOOKED" %}</strong>
{% endif %}
</span>
{% if allow_waitinglist and item.allow_waitinglist %}
<br/>
<a href="{% eventurl event "presale:event.waitinglist" cart_namespace=cart_namespace|default_if_none:"" %}?item={{ item.pk }}{% if var %}&var={{ var.pk }}{% endif %}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}">
<span class="fa fa-plus-circle" aria-hidden="true"></span>
<a href="{% eventurl event "presale:event.waitinglist" cart_namespace=cart_namespace|default_if_none:"" %}?item={{ item.pk }}{% if var %}&var={{ var.pk }}{% endif %}{% if subevent %}&subevent={{ subevent.pk }}{% endif %}" class="btn btn-default btn-xs">
{% icon "plus-circle" %}
{% trans "Waiting list" %}
</a>
{% endif %}

View File

@@ -1,4 +1,5 @@
{% load i18n %}
{% load icon %}
{% load l10n %}
{% load eventurl %}
{% load money %}
@@ -7,7 +8,7 @@
{% load rich_text %}
{% for tup in items_by_category %}{% with category=tup.0 items=tup.1 form_prefix=tup.2 %}
{% if category %}
<section aria-labelledby="{{ form_prefix }}category-{{ category.id }}"{% if category.description %} aria-describedby="{{ form_prefix }}category-info-{{ category.id }}"{% endif %}>
<section class="item-category" aria-labelledby="{{ form_prefix }}category-{{ category.id }}"{% if category.description %} aria-describedby="{{ form_prefix }}category-info-{{ category.id }}"{% endif %}>
<h{{ headline_level|default:3 }} class="h3" id="{{ form_prefix }}category-{{ category.id }}">{{ category.name }}
{% if category.subevent_name %}
<small class="text-muted"><i class="fa fa-calendar" aria-hidden="true"></i> {{ category.subevent_name }}</small>
@@ -24,7 +25,7 @@
<div id="{{ form_prefix }}category-info-{{ category.id }}">{{ category.description|localize|rich_text }}</div>
{% endif %}
{% else %}
<section aria-labelledby="{{ form_prefix }}category-none">
<section class="item-category" aria-labelledby="{{ form_prefix }}category-none">
<h{{ headline_level|default:"3" }} id="{{ form_prefix }}category-none" class="h3 sr-only">{% trans "Uncategorized items" %}</h{{ headline_level|default:3 }}>
{% endif %}
{% for item in items %}
@@ -82,9 +83,9 @@
{% if not event.settings.show_variations_expanded %}
{% if item.best_variation_availability <= 10 %}
{% if not item.min_price %}
<strong class="gone">{% trans "FULLY BOOKED" %}</strong>
<strong class="gone">{% icon "ban" %} {% trans "FULLY BOOKED" %}</strong>
{% else %}
<strong class="gone">{% trans "SOLD OUT" %}</strong>
<strong class="gone">{% icon "ban" %} {% trans "SOLD OUT" %}</strong>
{% endif %}
{% if allow_waitinglist and item.allow_waitinglist %}
<br/>

View File

@@ -1,44 +1,55 @@
{% load i18n %}
{% load eventurl %}
{% load icon %}
{% load urlreplace %}
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="col-sm-4 col-xs-2 text-left flip">
<li class="text-left flip">
{% if subevent_list.has_before %}
<a href="?{% url_replace request "date" subevent_list.before|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with month=subevent_list.before|date:"F Y" %}Show previous month, {{ month }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{% icon "arrow-left" %}
<span class="hidden-xs">{{ subevent_list.before|date:"F Y" }}</span>
</a>
{% endif %}
</li>
<li class="col-sm-4 col-xs-8 text-center">
<li class="text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<select name="date" class="form-control" aria-label="{% trans "Select month to show" %}">
{% for y in subevent_list.years %}
<optgroup label="{{ y }}">
{% for m in subevent_list.months %}
<option value="{{ y }}-{{ m|date:"m" }}" {% if m.month == subevent_list.date.month and y == subevent_list.date.year %}selected{% endif %}>{{ m|date:"F" }} {{ y }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
<fieldset>
<legend class="sr-only">{% trans "Select a month to display" %}</legend>
<div>
<label for="calendar-input-date">{% trans "Month" %}</label>
</div>
<div class="input-group">
<select name="date" class="form-control" id="calendar-input-date">
{% for y in subevent_list.years %}
<optgroup label="{{ y }}">
{% for m in subevent_list.months %}
<option value="{{ y }}-{{ m|date:"m" }}" {% if m.month == subevent_list.date.month and y == subevent_list.date.year %}selected{% endif %}>{{ m|date:"F" }} {{ y }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<span class="input-group-btn">
<button type="submit" class="btn btn-default" aria-label="{% trans "Show month" %}">
{% icon "chevron-right" %}
</button>
</span>
</div>
</fieldset>
</form>
</li>
<li class="col-sm-4 col-xs-2 text-right flip">
<li class="text-right flip">
{% if subevent_list.has_after %}
<a href="?{% url_replace request "date" subevent_list.after|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with month=subevent_list.after|date:"F Y" %}Show next month, {{ month }}{% endblocktrans %}">
<span class="hidden-xs">{{ subevent_list.after|date:"F Y" }}</span>
<span class="fa fa-arrow-right" aria-hidden="true"></span>
{% icon "arrow-right" %}
</a>
{% endif %}
</li>

View File

@@ -1,63 +1,78 @@
{% load i18n %}
{% load eventurl %}
{% load icon %}
{% load urlreplace %}
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="col-sm-4 col-xs-2 text-left flip">
<li class="text-left flip">
{% if subevent_list.has_before %}
<a href="?{% url_replace request "date" subevent_list.before|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.before|date:subevent_list.week_format %}Show previous week, {{ week }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{% icon "arrow-left" %}
<span class="hidden-xs">{{ subevent_list.before|date:subevent_list.week_format }}</span>
</a>
{% endif %}
</li>
<li class="col-sm-4 col-xs-8 text-center">
<li class="text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl event "presale:event.index" cart_namespace=cart_namespace %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<select name="date" class="form-control" aria-label="{% trans "Select week to show" %}">
{% for weeks_per_year in subevent_list.weeks %}
<optgroup label="{{ weeks_per_year.0.0.year }}">
{% for w in weeks_per_year %}
<option value="{{ w.0.isocalendar.0 }}-W{{ w.0.isocalendar.1 }}"
{% if w.0.isocalendar.0 == subevent_list.date.isocalendar.0 and w.0.isocalendar.1 == subevent_list.date.isocalendar.1 %}selected{% endif %}>
{{ w.0|date:subevent_list.week_format }}
({{ w.0|date:subevent_list.short_month_day_format }} {{ w.1|date:subevent_list.short_month_day_format }})
</option>
{% endfor %}
</optgroup>
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
<fieldset>
<legend class="sr-only">{% trans "Select a week to display" %}</legend>
<div>
<label for="calendar-input-date">{% trans "Week" %}</label>
</div>
<div class="input-group">
<select name="date" class="form-control" aria-label="{% trans "Select week to show" %}">
{% for weeks_per_year in subevent_list.weeks %}
<optgroup label="{{ weeks_per_year.0.0.year }}">
{% for w in weeks_per_year %}
<option value="{{ w.0.isocalendar.0 }}-W{{ w.0.isocalendar.1 }}"
{% if w.0.isocalendar.0 == subevent_list.date.isocalendar.0 and w.0.isocalendar.1 == subevent_list.date.isocalendar.1 %}selected{% endif %}>
{{ w.0|date:subevent_list.week_format }}
({{ w.0|date:subevent_list.short_month_day_format }} {{ w.1|date:subevent_list.short_month_day_format }})
</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<span class="input-group-btn">
<button type="submit" class="btn btn-default" aria-label="{% trans "Show week" %}">
{% icon "chevron-right" %}
</button>
</span>
</div>
</fieldset>
</form>
</li>
<li class="col-sm-4 col-xs-2 text-right flip">
<li class="text-right flip">
{% if subevent_list.has_after %}
<a href="?{% url_replace request "date" subevent_list.after|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.after|date:subevent_list.week_format %}Show next week, {{ week }}{% endblocktrans %}">
<span class="hidden-xs">{{ subevent_list.after|date:subevent_list.week_format }}</span>
<span class="fa fa-arrow-right" aria-hidden="true"></span>
{% icon "arrow-right" %}
</a>
{% endif %}
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_week_calendar.html" with show_avail=event.settings.event_list_availability days=subevent_list.days show_names=subevent_list.show_names %}
<div class="visible-xs text-center" aria-hidden="true">
<a href="?{% url_replace request "date" subevent_list.before|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.before|date:subevent_list.week_format %}Show previous week, {{ week }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{{ subevent_list.before|date:subevent_list.week_format }}
</a>
<a href="?{% url_replace request "date" subevent_list.after|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.after|date:subevent_list.week_format %}Show next week, {{ week }}{% endblocktrans %}">
{{ subevent_list.after|date:subevent_list.week_format }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
<div class="row visible-xs">
<div class="col-xs-6 text-left flip">
<a href="?{% url_replace request "date" subevent_list.before|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.before|date:subevent_list.week_format %}Show previous week, {{ week }}{% endblocktrans %}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
<span class="hidden-xs">{{ subevent_list.before|date:subevent_list.week_format }}</span>
</a>
</div>
<div class="col-xs-6 text-right flip">
<a href="?{% url_replace request "date" subevent_list.after|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{% blocktrans with week=subevent_list.after|date:subevent_list.week_format %}Show next week, {{ week }}{% endblocktrans %}">
<span class="hidden-xs">{{ subevent_list.after|date:subevent_list.week_format }}</span>
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
</div>
</div>

View File

@@ -2,15 +2,15 @@
{% load icon %}
{% load eventurl %}
<dl class="full-width-list alternating-rows">
<div class="event-list full-width-list alternating-rows">
{% for subev in subevent_list.subevent_list %}
<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 }}&amp;subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}">
<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 }}&amp;subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}">
{{ subev.name }}
</a>
</dt>
<dd class="col-md-3 col-xs-12">
</h3>
<p class="col-md-3 col-xs-12" id="subevent-{{ subev.pk }}-desc">
{{ 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 %}
</dd>
<dd class="col-md-3 col-xs-6">
</p>
<p class="col-md-3 col-xs-6">
<small>
{% include "pretixpresale/fragment_event_list_status.html" with event=subev %}
</small>
</dd>
<dd class="col-md-2 col-xs-6 text-right flip">
</p>
<p 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 }}&amp;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>
</dd>
</div>
</p>
</article>
{% endfor %}
</dl>
</div>

View File

@@ -79,7 +79,7 @@
<div class="panel panel-default">
<div class="panel-heading">
{% endif %}
<h3 class="panel-title"><b>
<h3 class="panel-title"><strong>
{% if subevent_list_foldable %}
{% if show_cart %}
{% trans "Add tickets for a different date" %}
@@ -88,7 +88,7 @@
{% endif %}
{% else %}
{% trans "Choose date to book a ticket" %}
{% endif %}</b>
{% endif %}</strong>
</h3>
{% if subevent_list_foldable %}
</summary>
@@ -252,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 already ordered a ticket" %}</h3>
<h3 id="if-you-already-ordered-a-ticket">{% trans "If you have already ordered a ticket" %}</h3>
<div class="row">
<div class="col-md-8 col-xs-12">
<p>

View File

@@ -10,15 +10,13 @@
<h2>
{% trans "Resend order links" %}
</h2>
<div class="row">
<div class="panel-body">
<p>
{% blocktrans trimmed %}
If you lost the link to your order or orders, please enter the email address you
used for your order. We will send you an email with links to all orders you placed
using this email address.
{% endblocktrans %}
</div>
</div>
</p>
<div class="row">
<form class="form" method="post">
{% csrf_token %}

View File

@@ -7,7 +7,7 @@
<thead>
<tr>
{% for d in weeks|iter_weekdays %}
<th><span aria-hidden="true">{{ d|date_fast:"D" }}</span><span class="sr-only">{{ d|date_fast:"l" }}</span></th>
<th><span aria-hidden="true" class="text-muted">{{ d|date_fast:"D" }}</span><span class="sr-only">{{ d|date_fast:"l" }}</span></th>
{% endfor %}
</tr>
</thead>

View File

@@ -16,6 +16,7 @@
{% for f in filter_form.fields %}
{% bootstrap_field filter_form|getitem:f %}
{% endfor %}
<div class="visible-xs">&nbsp;</div>
<button type="submit" class="btn btn-primary">
<span class="fa fa-filter" aria-hidden="true"></span>
{% trans "Filter" %}

View File

@@ -9,14 +9,13 @@
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 }}"
aria-label="{% trans "Log out" %}" data-toggle="tooltip" data-placement="left"
title="{% trans "Log out" %}">
<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 }}">
<span class="fa fa-sign-out" aria-hidden="true"></span>
<span class="sr-only">{% trans "Log out" %}</span>
{% trans "Log out" %}
</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 %}

View File

@@ -55,6 +55,7 @@
<div class="modal-card-content">
<h3 id="cookie-consent-modal-label"></h3>
<div id="cookie-consent-modal-description">
<form class="form-horizontal">
{% with request.event|default:request.organizer as sh %}
<h3>{{ sh.settings.cookie_consent_dialog_title }}</h3>
{{ sh.settings.cookie_consent_dialog_text|rich_text }}
@@ -70,40 +71,42 @@
</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>
<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 }}">
{{ cp.provider_name }}<br>
<span class="text-muted">
{% for c in cp.usage_classes %}
{% if forloop.counter0 > 0 %}&middot; {% 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 %}
&middot;
<a href="{% safelink cp.privacy_url %}" target="_blank">
{% trans "Privacy policy" %}
</a>
{% endif %}
</span>
<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 %}&middot; {% 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 %}
&middot;
<a href="{% safelink cp.privacy_url %}" target="_blank">
{% trans "Privacy policy" %}
</a>
{% endif %}
</p>
</div>
{% endfor %}
</details>
<div class="row">
@@ -130,6 +133,7 @@
</p>
{% endif %}
{% endwith %}
<form>
</div>
</div>
</div>

View File

@@ -62,7 +62,7 @@
class="organizer-logo" />
</a>
{% else %}
<h1><a href="{% eventurl organizer "presale:organizer.index" %}">{{ organizer.name }}</a></h1>
<h1><a href="{% eventurl organizer "presale:organizer.index" %}" class="no-underline">{{ organizer.name }}</a></h1>
{% endif %}
</div>
{% if organizer.settings.locales|length > 1 or request.organizer.settings.customer_accounts %}

View File

@@ -1,61 +1,91 @@
{% extends "pretixpresale/organizers/base.html" %}
{% load i18n %}
{% load icon %}
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div>
<div class="blank-after">
{{ organizer_homepage_text | rich_text }}
</div>
{% endif %}
<h3>{{ date|date:"F Y" }}</h3>
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div class="row">
<div class="col-md-5 col-sm-6 col-xs-12 text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="calendar" %}
</div>
<div class="col-md-2 col-sm-4 col-xs-8 text-center" role="group" aria-label="{% trans "Select month to show" %}">
<select name="date" class="form-control" aria-label="{% trans "Month" %}">
{% for y in years %}
<optgroup label="{{ y }}">
{% for m in months %}
<option value="{{ y }}-{{ m|date:"m" }}" {% if m.month == date.month and y == date.year %}selected{% endif %}>{{ m|date:"F" }} {{ y }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</div>
<div class="col-md-5 col-sm-2 col-xs-4 text-right flip">
{% if has_before %}
<a href="?{% url_replace request "date" before|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:"F Y" }}">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
<span class="hidden-sm hidden-xs">{{ before|date:"F Y" }}</span>
</a>
{% endif %}
{% if has_after %}
<a href="?{% url_replace request "date" after|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:"F Y" }}">
<span class="fa fa-arrow-right" aria-hidden="true"></span>
<span class="hidden-sm hidden-xs">{{ after|date:"F Y" }}</span>
</a>
{% endif %}
</div>
<div class="blank-after text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="calendar" %}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<strong>
{% blocktrans trimmed with month=date|date:"F Y" %}
Events in {{ month }}
{% endblocktrans %}
</strong>
</h2>
</div>
</form>
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
{% include "pretixpresale/fragment_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
{% if filter_form.fields %}
<div class="panel-subhead">
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
{% endif %}
<div class="panel-body">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
{% if has_before %}
<a href="?{% url_replace request "date" before|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:"F Y" }}">
{% icon "arrow-left" %}
<span class="hidden-xs">{{ before|date:"F Y" }}</span>
</a>
{% endif %}
</li>
<li class="text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<fieldset>
<legend class="sr-only">{% trans "Select a month to display" %}</legend>
<div>
<label for="calendar-input-date">{% trans "Month" %}</label>
</div>
<div class="input-group">
<select name="date" class="form-control" id="calendar-input-date">
{% for y in years %}
<optgroup label="{{ y }}">
{% for m in months %}
<option value="{{ y }}-{{ m|date:"m" }}" {% if m.month == date.month and y == date.year %}selected{% endif %}>{{ m|date:"F" }} {{ y }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<span class="input-group-btn">
<button type="submit" class="btn btn-default" aria-label="{% trans "Show month" %}">
{% icon "chevron-right" %}
</button>
</span>
</div>
</fieldset>
</form>
</li>
<li class="text-right flip">
{% if has_after %}
<a href="?{% url_replace request "date" after|date:"Y-m" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:"F Y" }}">
<span class="hidden-xs">{{ after|date:"F Y" }}</span>
{% icon "arrow-right" %}
</a>
{% endif %}
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
</div>
</div>
{% if multiple_timezones %}
<div class="alert alert-info">
{% blocktrans trimmed %}

View File

@@ -1,68 +1,102 @@
{% extends "pretixpresale/organizers/base.html" %}
{% load i18n %}
{% load icon %}
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div>
<div class="blank-after">
{{ organizer_homepage_text | rich_text }}
</div>
{% endif %}
<h3>{{ date|date:"DATE_FORMAT" }}</h3>
<form class="form-inline" method="get" id="monthselform"
action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div class="row">
<div class="col-md-5 col-sm-6 col-xs-12 text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="day" %}
<div class="blank-after text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="day" %}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<strong>
{% blocktrans trimmed with day=date|date:"DATE_FORMAT" %}
Events on {{ day }}
{% endblocktrans %}
</strong>
</h2>
</div>
{% if filter_form.fields %}
<div class="panel-subhead">
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
<div class="col-md-2 col-sm-4 col-xs-8 text-center">
<input class="datepickerfield form-control" value="{{ date|date:"SHORT_DATE_FORMAT" }}" name="date">
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</div>
<div class="col-md-5 col-sm-2 col-xs-4 text-right flip">
{% endif %}
<div class="panel-body">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
{% if has_before %}
<a href="?{% url_replace request "date" before.date.isoformat %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:"SHORT_DATE_FORMAT" }}">
{% icon "arrow-left" %}
<span class="hidden-xs">{{ before|date:"SHORT_DATE_FORMAT" }}</span>
</a>
{% endif %}
</li>
<li class="text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<fieldset>
<legend class="sr-only">{% trans "Select a date to display" %}</legend>
<div>
<label for="calendar-input-date">{% trans "Date" %}</label>
</div>
<div class="input-group">
<input class="datepickerfield form-control" id="calendar-input-date" value="{{ date|date:"SHORT_DATE_FORMAT" }}" name="date">
<span class="input-group-btn">
<button type="submit" class="btn btn-default" aria-label="{% trans "Show date" %}">
{% icon "chevron-right" %}
</button>
</span>
</div>
</fieldset>
</form>
</li>
<li class="text-right flip">
{% if has_after %}
<a href="?{% url_replace request "date" after.date.isoformat %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:"SHORT_DATE_FORMAT" }}">
<span class="hidden-xs">{{ after|date:"SHORT_DATE_FORMAT" }}</span>
{% icon "arrow-right" %}
</a>
{% endif %}
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_day_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
<div class="row visible-xs">
{% if has_before %}
<div class="col-xs-6 text-left flip">
<a href="?{% url_replace request "date" before.date.isoformat %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:"SHORT_DATE_FORMAT" }}">
class="btn btn-default">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
<span class="hidden-sm hidden-xs">{{ before|date:"SHORT_DATE_FORMAT" }}</span>
<span class="hidden-xs">{{ before|date:"SHORT_DATE_FORMAT" }}</span>
</a>
</div>
{% endif %}
{% if has_after %}
<div class="col-xs-6 text-right flip{% if not has_before %} col-xs-offset-6{% endif %}">
<a href="?{% url_replace request "date" after.date.isoformat %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:"SHORT_DATE_FORMAT" }}">
<span class="hidden-sm hidden-xs">{{ after|date:"SHORT_DATE_FORMAT" }}</span>
class="btn btn-default">
<span class="hidden-xs">{{ after|date:"SHORT_DATE_FORMAT" }}</span>
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
</div>
{% endif %}
</div>
</div>
</form>
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
{% include "pretixpresale/fragment_day_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
<div class="col-sm-4 visible-xs text-center">
{% if has_before %}
<a href="?{% url_replace request "date" before.date.isoformat %}"
class="btn btn-default">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{{ before|date:"SHORT_DATE_FORMAT" }}
</a>
{% endif %}
{% if has_after %}
<a href="?{% url_replace request "date" after.date.isoformat %}"
class="btn btn-default">
{{ after|date:"SHORT_DATE_FORMAT" }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
{% endif %}
</div>
{% if multiple_timezones %}

View File

@@ -1,82 +1,117 @@
{% extends "pretixpresale/organizers/base.html" %}
{% load i18n %}
{% load icon %}
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div>
<div class="blank-after">
{{ organizer_homepage_text | rich_text }}
</div>
{% endif %}
<h3>{{ date|date:"F Y" }}</h3>
<form class="form-inline" method="get" id="monthselform"
action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<div class="row">
<div class="col-md-4 col-sm-6 col-xs-12 text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="week" %}
<div class="blank-after text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="week" %}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<strong>
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date|date:short_month_day_format %}
Events in {{ week }} ({{ week_day_from }} {{ week_day_to }})
{% endblocktrans %}
</strong>
</h2>
</div>
{% if filter_form.fields %}
<div class="panel-subhead">
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
</div>
<div class="col-md-4 col-sm-4 col-xs-8 text-center">
<select name="date" class="form-control" aria-label="{% trans "Select week to show" %}">
{% for weeks_per_year in weeks %}
<optgroup label="{{ weeks_per_year.0.0.year }}">
{% for w in weeks_per_year %}
<option value="{{ w.0.isocalendar.0 }}-W{{ w.0.isocalendar.1 }}"
{% if w.0.isocalendar.0 == date.isocalendar.0 and w.0.isocalendar.1 == date.isocalendar.1 %}selected{% endif %}>
{{ w.0|date:week_format }}
({{ w.0|date:short_month_day_format }} {{ w.1|date:short_month_day_format }})
</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<button type="submit" class="js-hidden btn btn-default">
{% trans "Go" %}
</button>
</div>
<div class="col-md-4 col-sm-2 col-xs-4 text-right flip">
{% endif %}
<div class="panel-body">
<nav aria-label="{% trans "calendar navigation" %}">
<ul class="row calendar-nav">
<li class="text-left flip">
{% if has_before %}
<a href="?{% url_replace request "date" before|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:week_format }}">
{% icon "arrow-left" %}
<span class="hidden-xs">{{ before|date:week_format }}</span>
</a>
{% endif %}
</li>
<li class="text-center">
<form class="form-inline" method="get" id="monthselform" action="{% eventurl request.organizer "presale:organizer.index" %}">
{% for f, v in request.GET.items %}
{% if f != "date" %}
<input type="hidden" name="{{ f }}" value="{{ v }}">
{% endif %}
{% endfor %}
<fieldset>
<legend class="sr-only">{% trans "Select a week to display" %}</legend>
<div>
<label for="calendar-input-date">{% trans "Week" %}</label>
</div>
<div class="input-group">
<select name="date" class="form-control" id="calendar-input-date">
{% for weeks_per_year in weeks %}
<optgroup label="{{ weeks_per_year.0.0.year }}">
{% for w in weeks_per_year %}
<option value="{{ w.0.isocalendar.0 }}-W{{ w.0.isocalendar.1 }}"
{% if w.0.isocalendar.0 == date.isocalendar.0 and w.0.isocalendar.1 == date.isocalendar.1 %}selected{% endif %}>
{{ w.0|date:week_format }}
({{ w.0|date:short_month_day_format }} {{ w.1|date:short_month_day_format }})
</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<span class="input-group-btn">
<button type="submit" class="btn btn-default" aria-label="{% trans "Show week" %}">
{% icon "chevron-right" %}
</button>
</span>
</div>
</fieldset>
</form>
</li>
<li class="text-right flip">
{% if has_after %}
<a href="?{% url_replace request "date" after|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:week_format }}">
<span class="hidden-xs">{{ after|date:week_format }}</span>
{% icon "arrow-right" %}
</a>
{% endif %}
</li>
</ul>
</nav>
{% include "pretixpresale/fragment_week_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
<div class="row visible-sm visible-xs">
{% if has_before %}
<div class="col-xs-6 text-left flip">
<a href="?{% url_replace request "date" before|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ before|date:week_format }}">
class="btn btn-default">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
<span class="hidden-sm hidden-xs">{{ before|date:week_format }}</span>
{{ before|date:week_format }}
</a>
</div>
{% endif %}
{% if has_after %}
<div class="col-xs-6 text-right flip">
<a href="?{% url_replace request "date" after|date:"o-\WW" %}"
class="btn btn-default" data-save-scrollpos aria-label="{{ after|date:week_format }}">
<span class="hidden-sm hidden-xs">{{ after|date:week_format }}</span>
class="btn btn-default">
{{ after|date:week_format }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
</div>
{% endif %}
</div>
</div>
</form>
{% include "pretixpresale/fragment_event_list_filter.html" with request=request %}
{% include "pretixpresale/fragment_week_calendar.html" with show_avail=request.organizer.settings.event_list_availability %}
<div class="col-sm-12 visible-sm visible-xs text-center">
{% if has_before %}
<a href="?{% url_replace request "date" before|date:"o-\WW" %}"
class="btn btn-default">
<span class="fa fa-arrow-left" aria-hidden="true"></span>
{{ before|date:week_format }}
</a>
{% endif %}
{% if has_after %}
<a href="?{% url_replace request "date" after|date:"o-\WW" %}"
class="btn btn-default">
{{ after|date:week_format }}
<span class="fa fa-arrow-right" aria-hidden="true"></span>
</a>
{% endif %}
</div>
{% if multiple_timezones %}
<div class="alert alert-info">
{% blocktrans trimmed %}

View File

@@ -7,7 +7,7 @@
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% icon "address-card-o" %} <b>{% trans "Delete address" %}</b>
{% icon "address-card-o" %} <strong>{% trans "Delete address" %}</strong>
</h3>
</div>
<div class="panel-body account-addresses">

View File

@@ -8,7 +8,7 @@
<div class="panel-heading">
<h3 class="panel-title">
{% icon "address-card-o" %}
<b>{% trans "Addresses" %}</b> ({{ page_obj.paginator.count }})
<strong>{% trans "Addresses" %}</strong> ({{ page_obj.paginator.count }})
</h3>
</div>
<div class="panel-body">

View File

@@ -13,7 +13,7 @@
{% else %}
{% icon "id-badge" %}
{% endif %}
<b>{% trans "Your membership" %}</b>
<strong>{% trans "Your membership" %}</strong>
{% if membership.testmode %}
<span class="h6">
{% textbubble "warning" %}

View File

@@ -9,99 +9,96 @@
<div class="panel-heading">
<h3 class="panel-title">
{% icon "id-badge" %}
<b>{% trans "Memberships" %}</b> ({{ page_obj.paginator.count }})
<strong>{% trans "Memberships" %}</strong> ({{ page_obj.paginator.count }})
</h3>
</div>
<div class="panel-body">
{% if memberships %}
<ul class="full-width-list alternating-rows">
<div class="event-list full-width-list alternating-rows">
{% for m in memberships %}
<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>
<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>
{% endif %}
<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" %}
</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" %}
{% endtextbubble %}
</small>
</dd>
{% 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 %}
</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:"∞" }}
</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>
</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>
<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>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-center">{% trans "You dont have any memberships in your account yet." %}</p>
{% endif %}

View File

@@ -10,70 +10,65 @@
<div class="panel-heading">
<h3 class="panel-title">
{% icon "shopping-cart" %}
<b>{% trans "Orders" %}</b> ({{ page_obj.paginator.count }})
<strong>{% trans "Orders" %}</strong> ({{ page_obj.paginator.count }})
</h3>
</div>
<div class="panel-body">
{% if orders %}
<ul class="full-width-list alternating-rows">
<div class="event-list full-width-list alternating-rows">
{% for o in orders %}
<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>
<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>
{% endif %}
</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>
<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>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-center">{% trans "You dont have any orders in your account yet." %}</p>
{% endif %}

View File

@@ -7,7 +7,7 @@
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% icon "user" %} <b>{% trans "Delete profile" %}</b>
{% icon "user" %} <strong>{% trans "Delete profile" %}</strong>
</h3>
</div>
<div class="panel-body">

View File

@@ -8,7 +8,7 @@
<div class="panel-heading">
<h3 class="panel-title">
{% icon "users" %}
<b>{% trans "Attendee profiles" %}</b> ({{ page_obj.paginator.count }})
<strong>{% trans "Attendee profiles" %}</strong> ({{ page_obj.paginator.count }})
</h3>
</div>
<div class="panel-body">

View File

@@ -19,28 +19,24 @@
<meta property="og:url" content="{% abseventurl organizer "presale:organizer.index" %}"/>
{% endblock %}
{% block content %}
<div>
{% if organizer_homepage_text %}
{% if organizer_homepage_text %}
<div class="blank-after">
{{ organizer_homepage_text | rich_text }}
{% endif %}
</div>
<div id="monthselform">
<div class="row">
<div class="col-md-12">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="list" %}
</div>
</div>
{% endif %}
<div class="blank-after text-left flip">
{% include "pretixpresale/fragment_calendar_nav.html" with date=date request=request style="list" %}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<b>
<strong>
{% if "old" in request.GET %}
{% trans "Past events" %}
{% else %}
{% trans "Upcoming events" %}
{% endif %}
</b>
</strong>
</h2>
</div>
{% if filter_form.fields %}
@@ -50,11 +46,11 @@
{% endif %}
{% if events %}
<div class="panel-body">
<dl class="full-width-list alternating-rows">
<div class="event-list full-width-list alternating-rows">
{% for e in events %}{% eventurl e "presale:event.index" as url %}
<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">
<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">{{ e.name }}</a></h3>
<p class="col-md-3 col-xs-12" id="event-{{ e.pk }}-desc">
{% if e.settings.show_dates_on_frontpage %}
{% if e.has_subevents %}
{% icon "calendar" %} {% trans "Multiple dates" context "subevent" %}
@@ -82,13 +78,13 @@
{% else %}
&nbsp;
{% endif %}
</dd>
<dd class="col-md-3 col-xs-6">
</p>
<p class="col-md-3 col-xs-6">
<small>
{% include "pretixpresale/fragment_event_list_status.html" with event=e %}
</small>
</dd>
<dd class="col-md-2 col-xs-6 text-right flip">
</p>
<p 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 %}
@@ -97,10 +93,10 @@
{% icon "info" %} {% trans "More info" %}
{% endif %}
</a>
</dd>
</div>
</p>
</article>
{% endfor %}
</dl>
</div>
</div>
<hr>
{% endif %}

View File

@@ -51,6 +51,13 @@ $(function () {
const required = 'required' in options && options.required && isRequired && visible;
dependent.closest(".form-group").toggle(visible).toggleClass('required', required);
dependent.prop("required", required);
const label = dependent.closest(".form-group").find("label");
const labelRequired = label.find(".label-required");
if (!required) {
labelRequired.remove();
} else if (!labelRequired.length) {
label.append('<i class="label-required">' + gettext('required') + '</i>')
}
}
for (var k in dependents) dependents[k].prop("disabled", false);
}).always(function() {
@@ -64,6 +71,7 @@ $(function () {
dependent.closest(".form-group").toggle(visible).toggleClass('required', required);
dependent.prop("required", required);
dependent.closest(".form-group").find("label .label-required").remove();
}
});
};

View File

@@ -277,7 +277,8 @@ var form_handlers = function (el) {
fill_field.on("dp.show", show);
});
function luminanace(r, g, b) {
function luminance(r, g, b) {
// Algorithm defined as https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
var a = [r, g, b].map(function (v) {
v /= 255;
return v <= 0.03928
@@ -287,8 +288,9 @@ var form_handlers = function (el) {
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
}
function contrast(rgb1, rgb2) {
var l1 = luminanace(rgb1[0], rgb1[1], rgb1[2]) + 0.05,
l2 = luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05,
// 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,
ratio = l1/l2
if (l2 > l1) {ratio = 1/ratio}
return ratio.toFixed(1)
@@ -327,15 +329,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 is very easy to read!');
text = gettext('Your color has great contrast and will provide excellent accessibility.');
cls = "text-success";
} else if (c > 2.5) {
} else if (c > 4.5) {
icon = "fa-info-circle";
text = gettext('Your color has decent contrast and is probably good-enough to read!');
text = gettext('Your color has decent contrast and is sufficient for minimum accessibility requirements.');
cls = "";
} else {
icon = "fa-warning";
text = gettext('Your color has bad contrast for text on white background, please choose a darker shade.');
text = gettext('Your color has insufficient contrast to white. Accessibility of your site will be impacted.');
cls = "text-danger";
}
if ($icon.length === 0) {

View File

@@ -263,6 +263,10 @@ function setup_basics(el) {
el.find(".js-only").removeClass("js-only");
el.find(".js-hidden").hide();
// make sure to always have a #content for skip-link to work
if (!document.querySelector("#content")) {
(document.querySelector('main') || document.querySelector('.page-header + *')).id = "content"
}
el.find("div.collapsed").removeClass("collapsed").addClass("collapse");
el.find(".has-error, .alert-danger").each(function () {
@@ -303,8 +307,6 @@ 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 () {
@@ -472,17 +474,10 @@ $(function () {
$("[data-save-scrollpos]").on("click submit", function () {
sessionStorage.setItem('scrollpos', window.scrollY);
});
$("#monthselform").on("submit", function () {
sessionStorage.setItem('scrollpos', window.scrollY);
});
}
$("#monthselform select").change(function () {
if (sessionStorage) sessionStorage.setItem('scrollpos', window.scrollY);
this.form.submit();
});
$("#monthselform input").on("dp.change", function () {
if ($(this).data("DateTimePicker")) { // prevent submit after dp init
if (sessionStorage) sessionStorage.setItem('scrollpos', window.scrollY);
this.form.submit();
}
});
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) {
@@ -551,7 +546,7 @@ $(function () {
}
dependent.closest('.form-group').toggleClass('required', enabled);
if (enabled) {
dependentLabel.append('<i class="sr-only label-required">, ' + gettext('required') + '</i>');
dependentLabel.append('<i class="label-required">' + gettext('required') + '</i>');
}
else {
dependentLabel.find(".label-required").remove();

View File

@@ -208,7 +208,7 @@ Vue.component('availbox', {
template: ('<div class="pretix-widget-availability-box">'
+ '<div class="pretix-widget-availability-unavailable"'
+ ' v-if="item.current_unavailability_reason === \'require_voucher\'">'
+ '<small><a @click.prevent.stop="focus_voucher_field" role="button">{{unavailability_reason_message}}</a></small>'
+ '<small><a @click.prevent.stop="focus_voucher_field" role="button" tabindex="0">{{unavailability_reason_message}}</a></small>'
+ '</div>'
+ '<div class="pretix-widget-availability-unavailable"'
+ ' v-else-if="unavailability_reason_message">'
@@ -239,12 +239,12 @@ Vue.component('availbox', {
+ '>'
+ '</label>'
+ '<div :class="count_group_classes" v-else role="group" v-bind:aria-label="item.name">'
+ '<button v-if="!$root.use_native_spinners" type="button" @click.prevent.stop="on_step" data-step="-1" v-bind:data-controls="\'input_\' + input_name" class="pretix-widget-btn-default pretix-widget-item-count-dec" aria-label="' + strings.quantity_dec + '"><span>-</span></button>'
+ '<button v-if="!$root.use_native_spinners" type="button" @click.prevent.stop="on_step" data-step="-1" v-bind:data-controls="\'input_\' + input_name" class="pretix-widget-btn-default pretix-widget-item-count-dec" v-bind:aria-label="dec_label"><span>-</span></button>'
+ '<input type="number" inputmode="numeric" pattern="\d*" class="pretix-widget-item-count-multiple" placeholder="0" min="0"'
+ ' v-model="amount_selected" :max="order_max" :name="input_name" :id="\'input_\' + input_name"'
+ ' aria-label="' + strings.quantity + '" ref="quantity"'
+ ' v-bind:aria-labelledby="aria_labelledby" ref="quantity"'
+ ' >'
+ '<button v-if="!$root.use_native_spinners" type="button" @click.prevent.stop="on_step" data-step="1" v-bind:data-controls="\'input_\' + input_name" class="pretix-widget-btn-default pretix-widget-item-count-inc" aria-label="' + strings.quantity_inc + '"><span>+</span></button>'
+ '<button v-if="!$root.use_native_spinners" type="button" @click.prevent.stop="on_step" data-step="1" v-bind:data-controls="\'input_\' + input_name" class="pretix-widget-btn-default pretix-widget-item-count-inc" v-bind:aria-label="inc_label"><span>+</span></button>'
+ '</div>'
+ '</div>'
+ '</div>'),
@@ -262,6 +262,15 @@ Vue.component('availbox', {
this.$root.$emit('amounts_changed')
},
computed: {
aria_labelledby: function () {
return this.$root.html_id + '-item-label-' + this.item.id;
},
dec_label: function () {
return '- ' + (this.item.has_variations ? this.variation.value : this.item.name) + ': ' + strings.quantity_dec;
},
inc_label: function () {
return '+ ' + (this.item.has_variations ? this.variation.value : this.item.name) + ': ' + strings.quantity_inc;
},
count_group_classes: function () {
return {
'pretix-widget-item-count-group': !this.$root.use_native_spinners
@@ -350,12 +359,12 @@ Vue.component('pricebox', {
+ '<del class="pretix-widget-pricebox-original-price" v-bind:aria-label="original_price_aria_label" v-html="original_line"></del> '
+ '<ins class="pretix-widget-pricebox-new-price" v-bind:aria-label="new_price_aria_label" v-html="priceline"></ins></span>'
+ '<div v-if="free_price">'
+ '<span class="pretix-widget-pricebox-currency">{{ $root.currency }}</span> '
+ '<span class="pretix-widget-pricebox-currency" :id="price_box_id">{{ $root.currency }}</span> '
+ '<input type="number" class="pretix-widget-pricebox-price-input" placeholder="0" '
+ ' :min="display_price_nonlocalized" :value="suggested_price_nonlocalized" :name="field_name"'
+ ' step="any" v-bind:aria-label="free_price_label">'
+ ' step="any" v-bind:aria-labelledby="aria_labelledby" v-bind:aria-describedby="price_desc_id">'
+ '</div>'
+ '<small class="pretix-widget-pricebox-tax" v-if="price.rate != \'0.00\' && price.gross != \'0.00\'">'
+ '<small class="pretix-widget-pricebox-tax" :id="price_desc_id" v-if="price.rate != \'0.00\' && price.gross != \'0.00\'">'
+ '{{ taxline }}'
+ '</small>'
+ '</div>'),
@@ -366,6 +375,7 @@ Vue.component('pricebox', {
suggested_price: Object,
original_price: String,
mandatory_priced_addons: Boolean,
item_id: Number,
},
methods: {
stripHTML: function (s) {
@@ -375,6 +385,18 @@ Vue.component('pricebox', {
},
},
computed: {
aria_labelledby: function () {
return [
this.$root.html_id + '-item-label-' + this.item_id,
this.price_box_id
].join(" ");
},
price_box_id: function () {
return this.$root.html_id + '-item-pricebox-' + this.item_id;
},
price_desc_id: function () {
return this.$root.html_id + '-item-pricedesc-' + this.item_id;
},
display_price: function () {
if (this.$root.display_net_prices) {
return floatformat(parseFloat(this.price.net), 2);
@@ -419,9 +441,6 @@ Vue.component('pricebox', {
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + this.display_price;
}
},
free_price_label () {
return [strings.price, this.$root.currency].join(", ")
},
taxline: function () {
if (this.$root.display_net_prices) {
if (this.price.includes_mixed_tax_rate) {
@@ -465,7 +484,7 @@ Vue.component('variation', {
+ '<div :id="variation_price_id" class="pretix-widget-item-price-col">'
+ '<pricebox :price="variation.price" :free_price="item.free_price" :original_price="orig_price" '
+ ' :mandatory_priced_addons="item.mandatory_priced_addons" :suggested_price="variation.suggested_price"'
+ ' :field_name="\'price_\' + item.id + \'_\' + variation.id" v-if="$root.showPrices">'
+ ' :field_name="\'price_\' + item.id + \'_\' + variation.id" v-if="$root.showPrices" :item_id="item.id">'
+ '</pricebox>'
+ '<span v-if="!$root.showPrices">&nbsp;</span>'
+ '</div>'
@@ -515,7 +534,7 @@ Vue.component('item', {
+ '<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" class="pretix-widget-item-title" :href="\'#\' + item.id + \'-variants\'"'
+ ' @click.prevent.stop="expand" tabindex="-1"'
+ ' @click.prevent.stop="expand"'
+ '>'
+ '{{ item.name }}'
+ '</a>'
@@ -848,10 +867,10 @@ var shared_iframe_fragment = (
);
var shared_alert_fragment = (
'<div :class="alertClasses" role="dialog" aria-modal="true" aria-live="polite">'
'<div :class="alertClasses" role="alertdialog" v-bind:aria-labelledby="$root.parent.html_id + \'-error-message\'">'
+ '<transition name="bounce" @after-enter="focusButton">'
+ '<div class="pretix-widget-alert-box" v-if="$root.error_message">'
+ '<p>{{ $root.error_message }}</p>'
+ '<p :id="$root.parent.html_id + \'-error-message\'">{{ $root.error_message }}</p>'
+ '<p><button v-if="$root.error_url_after" @click.prevent.stop="errorContinue">' + strings.continue + '</button>'
+ '<button v-else @click.prevent.stop="errorClose">' + strings.close + '</button></p>'
+ '</div>'
@@ -996,7 +1015,7 @@ Vue.component('pretix-widget-event-form', {
// Form start
+ '<div class="pretix-widget-event-description" v-if="display_event_info && $root.frontpage_text" v-html="$root.frontpage_text"></div>'
+ '<form method="post" :action="$root.formAction" ref="form" :target="$root.formTarget">'
+ '<form method="post" :action="$root.formAction" ref="form" :target="$root.formTarget" @submit="$parent.buy">'
+ '<input type="hidden" name="_voucher_code" :value="$root.voucher_code" v-if="$root.voucher_code">'
+ '<input type="hidden" name="subevent" :value="$root.subevent" />'
+ '<input type="hidden" name="widget_data" :value="$root.widget_data_json" />'
@@ -1040,7 +1059,7 @@ Vue.component('pretix-widget-event-form', {
// Buy button
+ '<div class="pretix-widget-action" v-if="$root.display_add_to_cart">'
+ '<button @click="$parent.buy" type="submit" :disabled="buy_disabled">{{ this.buy_label }}</button>'
+ '<button type="submit">{{ this.buy_label }}</button>'
+ '</div>'
+ '</form>'
@@ -1049,10 +1068,10 @@ Vue.component('pretix-widget-event-form', {
+ '<form method="get" :action="$root.voucherFormTarget" target="_blank" '
+ ' v-if="$root.vouchers_exist && !$root.disable_vouchers && !$root.voucher_code">'
+ '<div class="pretix-widget-voucher">'
+ '<h3 class="pretix-widget-voucher-headline">'+ strings['redeem_voucher'] +'</h3>'
+ '<h3 class="pretix-widget-voucher-headline" :id="aria_labelledby">'+ strings['redeem_voucher'] +'</h3>'
+ '<div v-if="$root.voucher_explanation_text" class="pretix-widget-voucher-text" v-html="$root.voucher_explanation_text"></div>'
+ '<div class="pretix-widget-voucher-input-wrap">'
+ '<input class="pretix-widget-voucher-input" ref="voucherinput" type="text" v-model="$parent.voucher" name="voucher" placeholder="'+strings.voucher_code+'">'
+ '<input class="pretix-widget-voucher-input" ref="voucherinput" type="text" v-model="$parent.voucher" name="voucher" placeholder="'+strings.voucher_code+'" v-bind:aria-labelledby="aria_labelledby">'
+ '</div>'
+ '<input type="hidden" v-for="p in hiddenParams" :name="p[0]" :value="p[1]" />'
+ '<div class="pretix-widget-voucher-button-wrap">'
@@ -1064,21 +1083,16 @@ Vue.component('pretix-widget-event-form', {
+ '</div>'
),
data: function () {
return {
buy_disabled: true
}
},
mounted: function() {
this.$root.$on('amounts_changed', this.calculate_buy_disabled)
this.$root.$on('focus_voucher_field', this.focus_voucher_field)
this.calculate_buy_disabled()
},
beforeDestroy: function() {
this.$root.$off('amounts_changed', this.calculate_buy_disabled)
this.$root.$off('focus_voucher_field', this.focus_voucher_field)
},
computed: {
aria_labelledby: function() {
return this.$root.html_id + '-voucher-headline';
},
display_event_info: function () {
return this.$root.display_event_info || (this.$root.display_event_info === null && (this.$root.events || this.$root.weeks || this.$root.days));
},
@@ -1151,28 +1165,6 @@ Vue.component('pretix-widget-event-form', {
$el.focus();
});
},
calculate_buy_disabled: function() {
var i, j, k;
for (i = 0; i < this.$root.categories.length; i++) {
var cat = this.$root.categories[i];
for (j = 0; j < cat.items.length; j++) {
var item = cat.items[j];
if (item.has_variations) {
for (k = 0; k < item.variations.length; k++) {
var v = item.variations[k];
if (v.amount_selected) {
this.buy_disabled = false;
return;
}
}
} else if (item.amount_selected) {
this.buy_disabled = false;
return;
}
}
}
this.buy_disabled = true;
}
}
});
@@ -1408,7 +1400,7 @@ Vue.component('pretix-widget-event-week-cell', {
});
Vue.component('pretix-widget-event-calendar-cell', {
template: ('<td :class="classObject" @click.prevent.stop="selectDay">'
template: ('<td :class="classObject" :role="role" :tabindex="tabindex" v-bind:aria-label="date">'
+ '<div class="pretix-widget-event-calendar-day" v-if="day" v-bind:aria-label="date">'
+ '{{ daynum }}'
+ '</div>'
@@ -1420,10 +1412,12 @@ Vue.component('pretix-widget-event-calendar-cell', {
day: Object,
},
methods: {
selectDay: function () {
selectDay: function (e) {
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);
@@ -1436,9 +1430,40 @@ 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;

View File

@@ -3,7 +3,9 @@
width: 14.29%;
}
h3 {
font-size: 16px;
font-size: 0.875rem;
color: $text-muted;
border-bottom: 2px solid $table-border-color;
}
p {
margin-bottom: 3px;
@@ -11,6 +13,7 @@
.events {
list-style: none;
padding: 0;
margin-bottom: 0;
}
a.event {
--status-bg-color: var(--pretix-brand-primary-tint-90);
@@ -97,9 +100,13 @@
margin-bottom: 15px;
}
h3 {
margin-top: 0;
padding-top: 10px;
padding-bottom: 8px;
margin-bottom: 8px;
font-weight: bold;
cursor: pointer;
background-color: #fff;
}
h3 .fa::before {
content: $fa-var-caret-right;
@@ -112,6 +119,10 @@
}
}
.table-calendar .day:nth-child(even) {
background-color: $table-bg-accent;
}
.event-list-filter-form {
.event-list-filter-form-row {
display: flex;
@@ -244,7 +255,7 @@
}
.day-calendar a.event {
margin: 1px;
margin: 0;
}
.day-calendar a.event .event-time {
display: inline;
@@ -373,9 +384,20 @@ if concurrency is higher than 9, JavaScript (currently in pretixpresale/js/ui/ma
grid-template-rows: repeat(var(--concurrency, 1), auto);
}
.day-timeline {
--total-concurrency: var(--concurrency);
}
.day-timeline > li {
grid-column: calc(1 + var(--offset-hour, 0)*60/var(--raster-size, 5) + var(--offset-minute, 0)/var(--raster-size, 5)) / span calc(var(--duration-hour, 0)*60/var(--raster-size, 5) + var(--duration-minute, 0)/var(--raster-size, 5));
grid-row: var(--concurrency, 1) / span 1;
padding: 3px 8px 0;
/* add 11px of padding-bottom to the events with --concurrency being the same as --total-concurrency, otherwise 0px */
padding-bottom: #{'round(down, calc(11px * var(--concurrency)/var(--total-concurrency)), 11px)'};
}
.day-timeline > li[data-concurrency="1"] {
padding-top: 8px;
}
.day-timeline > li:focus-within {
z-index: 2; /* move to front so focus-outline overlays other elements */
@@ -385,12 +407,14 @@ if concurrency is higher than 9, JavaScript (currently in pretixpresale/js/ui/ma
grid-row: 1 / span var(--concurrency, 1) !important;
}
.ticks li {
padding: 8px 3px 5px;
padding: 11px 8px 8px;
line-height: 1;
border-top-left-radius: $border-radius-base;
border-top-right-radius: $border-radius-base;
border-bottom: 2px solid $table-border-color;
font-weight: bold;
}
.ticks li:nth-of-type(odd), .tick {
.tick {
background-color: $table-bg-accent;
}
.day-timeline:nth-last-of-type(1) li {
@@ -422,7 +446,16 @@ if concurrency is higher than 9, JavaScript (currently in pretixpresale/js/ui/ma
.weekday {
flex: 1;
margin: 0 5px;
padding: 0 8px 8px;
}
.weekday:nth-child(even) {
background-color: $table-bg-accent;
}
.weekday h3 {
margin-left: -8px;
margin-right: -8px;
padding-left: 8px;
padding-right: 8px;
}
.weekday:first-child {
margin-left: 0;

View File

@@ -23,7 +23,7 @@
text-align: center;
&.gone, .gone {
color: $alert-danger-text;
color: $brand-danger;
}
&.unavailable, .unavailable {
color: $alert-warning-text;
@@ -240,14 +240,26 @@ div.front-page {
}
}
.calendar-nav, .calendar-nav li {
.calendar-nav, .calendar-nav > li {
list-style: none;
margin: 0;
padding: 0
}
.calendar-nav li {
padding: 10px 0;
.calendar-nav > li {
padding: 0 0 10px;
}
.calendar-nav {
display: flex;
align-items: end;
}
.calendar-nav > li {
width: 60%;
}
.calendar-nav > li:first-child,
.calendar-nav > li:last-child {
width: 20%;
}
.subevent-toggle {
display: none;

View File

@@ -23,6 +23,10 @@ a.btn, button.btn {
}
}
.input-group:has(.input-group-btn:last-child) *:not(last-child) {
border-right: 0;
}
.panel-title .radio {
margin-left: 20px;
}
@@ -49,6 +53,15 @@ 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;
}

View File

@@ -1,10 +1,18 @@
h1, .h1,
h2, .h2,
h3, .h3 {
margin-top: 2.25 * $line-height-computed;
margin-top: 0.75 * $line-height-computed;
margin-bottom: 0.75 * $line-height-computed;
}
.front-page, .item-category {
h1, .h1,
h2, .h2,
h3, .h3 {
margin-top: 2.25 * $line-height-computed;
}
}
.page-header {
position: relative;
padding-bottom: 9px;
@@ -35,8 +43,9 @@ h3, .h3 {
.page-header-links > div.header-part {
padding-top: 15px;
a:link, a:visited {
a {
color: var(--pretix-link-contrast-color);
outline-color: inherit;
}
a:active, a:hover, a:focus {
color: var(--pretix-link-hover-contrast-color);

View File

@@ -14,7 +14,7 @@ $font-size-h4: ($font-size-base * 1.25) !default;
$font-size-h5: $font-size-base !default;
$font-size-h6: ($font-size-base * .85) !default;
$line-height-base: 1.428571429 !default;
$line-height-base: 1.43 !default;
$line-height-computed: ($font-size-base * $line-height-base) !default;
$line-height-large: 1.3333333 !default; // extra decimals for Win 8.1 Chrome
$line-height-small: 1.5 !default;
@@ -69,6 +69,30 @@ html {
}
}
.on-focus-visible:focus, .on-focus-visible:focus-within {
height: auto;
width: auto;
overflow: auto;
clip: auto;
}
#skip-to-main {
/* padding is needed to make focus-outline visible */
padding: 8px;
background-color: inherit;
p {
margin: 0;
}
a {
padding: .125em .5em;
display: inline-block;
color: var(--pretix-link-contrast-color);
outline-color: inherit;
}
a:active, a:hover, a:focus {
color: var(--pretix-link-hover-contrast-color);
}
}
/* fixe for bootstrap using px-values for fontsize */
.panel-title {
font-size: ($font-size-base * 1.125);
@@ -84,7 +108,22 @@ 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 */
@@ -569,22 +608,18 @@ h2 .label {
display: none !important;
}
.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;
.event-list.full-width-list {
h3, h4, p {
margin-top: 0;
margin-bottom: 0;
}
.row > div {
padding-top: 5px;
padding-bottom: 5px;
h3, h4 {
font-size: 1em;
line-height: 1.25rem;
font-weight: bold;
}
h4 small {
font-size: 85%;
}
}

View File

@@ -165,7 +165,7 @@
margin: 10px 0;
background-color: white;
border: 2px solid $brand-info;
color: $brand-info;
color: $state-info-text;
border-radius: $alert-border-radius;
}
@@ -175,7 +175,7 @@
margin: 10px 0;
background-color: white;
border: 2px solid $brand-danger;
color: $brand-danger;
color: $state-danger-text;
border-radius: $alert-border-radius;
}

View File

@@ -195,4 +195,27 @@ def test_NO_id_valid():
assert validate_vat_id('NO974760673 MVA', 'NO') == 'NO974760673MVA'
@responses.activate
def test_NO_id_valid_without_prefix():
responses.add(
responses.GET,
'https://data.brreg.no/enhetsregisteret/api/enheter/974760673',
body='{"organisasjonsnummer":"974760673","navn":"REGISTERENHETEN I BRØNNØYSUND","organisasjonsform":{"kode":'
'"ORGL","beskrivelse":"Organisasjonsledd","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/'
'organisasjonsformer/ORGL"}}},"hjemmeside":"www.brreg.no","postadresse":{"land":"Norge","landkode":"NO","postn'
'ummer":"8910","poststed":"BRØNNØYSUND","adresse":["Postboks 900"],"kommune":"BRØNNØY","kommunenummer":"1813"}'
',"registreringsdatoEnhetsregisteret":"1995-08-09","registrertIMvaregisteret":false,"naeringskode1":{"beskrivels'
'e":"Generell offentlig administrasjon","kode":"84.110"},"antallAnsatte":455,"overordnetEnhet":"912660680","for'
'retningsadresse":{"land":"Norge","landkode":"NO","postnummer":"8900","poststed":"BRØNNØYSUND","adresse":["Havn'
'egata 48"],"kommune":"BRØNNØY","kommunenummer":"1813"},"institusjonellSektorkode":{"kode":"6100","beskrivelse'
'":"Statsforvaltningen"},"registrertIForetaksregisteret":false,"registrertIStiftelsesregisteret":false,"registr'
'ertIFrivillighetsregisteret":false,"konkurs":false,"underAvvikling":false,"underTvangsavviklingEllerTvangsopp'
'losning":false,"maalform":"Bokmål","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter'
'/974760673"},"overordnetEnhet":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter/912660680"}}}',
status=200
)
assert validate_vat_id('974 760 673 MVA', 'NO') == 'NO974760673MVA'
# No tests for CH currently since it's harder to mock Zeep