Compare commits

..
Author SHA1 Message Date
Mira Weller f2cab689af make data-toggle="tooltip" more accessible 2025-05-15 18:01:46 +02:00
87 changed files with 13131 additions and 10580 deletions
+1 -2
View File
@@ -101,7 +101,6 @@ ALL_LANGUAGES = [
('fi', _('Finnish')),
('gl', _('Galician')),
('el', _('Greek')),
('he', _('Hebrew')),
('id', _('Indonesian')),
('it', _('Italian')),
('ja', _('Japanese')),
@@ -123,7 +122,7 @@ LANGUAGES_OFFICIAL = {
}
LANGUAGES_RTL = {
# When adding more right-to-left languages, also update pretix/static/pretixbase/scss/_rtl.scss
'ar', 'he'
'ar', 'hw'
}
LANGUAGES_INCUBATING = {
'pt-br', 'gl',
+10 -13
View File
@@ -35,22 +35,19 @@ def get_powered_by(request, safelink=True):
d = gs.settings.license_check_input
if d.get('poweredby_name'):
if d.get('poweredby_url'):
msg = gettext('<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>').format(
name=d['poweredby_name'],
a_name_attr='href="{}" target="_blank" rel="noopener"'.format(
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
),
a_attr='href="{}" target="_blank" rel="noopener"'.format(
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
)
n = '<a href="{}" target="_blank" rel="noopener">{}</a>'.format(
sl(d['poweredby_url']) if safelink else d['poweredby_url'],
d['poweredby_name']
)
else:
msg = gettext('<a {a_attr}>powered by {name} based on pretix</a>').format(
name=d['poweredby_name'],
a_attr='href="{}" target="_blank" rel="noopener"'.format(
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
)
n = d['poweredby_name']
msg = gettext('powered by {name} based on <a {a_attr}>pretix</a>').format(
name=n,
a_attr='href="{}" target="_blank" rel="noopener"'.format(
sl('https://pretix.eu') if safelink else 'https://pretix.eu',
)
)
else:
msg = gettext('<a %(a_attr)s>ticketing powered by pretix</a>') % {
'a_attr': 'href="{}" target="_blank" rel="noopener"'.format(
@@ -1,18 +0,0 @@
# Generated by Django 4.2.20 on 2025-05-14 14:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0279_discount_event_date_from_discount_event_date_until'),
]
operations = [
migrations.AddField(
model_name='cartposition',
name='max_extend',
field=models.DateTimeField(null=True),
),
]
+1 -4
View File
@@ -3098,10 +3098,7 @@ class CartPosition(AbstractPosition):
verbose_name=_("Expiration date"),
db_index=True
)
max_extend = models.DateTimeField(
verbose_name=_("Limit for extending expiration date"),
null=True
)
tax_rate = models.DecimalField(
max_digits=7, decimal_places=2, default=Decimal('0.00'),
verbose_name=_('Tax rate')
+17 -64
View File
@@ -45,7 +45,6 @@ from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import DatabaseError, transaction
from django.db.models import Count, Exists, IntegerField, OuterRef, Q, Value
from django.db.models.aggregates import Min
from django.dispatch import receiver
from django.utils.timezone import make_aware, now
from django.utils.translation import (
@@ -276,10 +275,7 @@ class CartManager:
}
def __init__(self, event: Event, cart_id: str, sales_channel: SalesChannel,
invoice_address: InvoiceAddress=None, widget_data=None, reservation_time: timedelta=None):
"""
Creates a new CartManager for an event.
"""
invoice_address: InvoiceAddress=None, widget_data=None, expiry=None):
self.event = event
self.cart_id = cart_id
self.real_now_dt = now()
@@ -290,17 +286,11 @@ class CartManager:
self._subevents_cache = {}
self._variations_cache = {}
self._seated_cache = {}
self._expiry = None
self._explicit_expiry = expiry
self.invoice_address = invoice_address
self._widget_data = widget_data or {}
self._sales_channel = sales_channel
self.num_extended_positions = 0
if reservation_time:
self._reservation_time = reservation_time
else:
self._reservation_time = timedelta(minutes=self.event.settings.get('reservation_time', as_type=int))
self._expiry = self.real_now_dt + self._reservation_time
self._max_expiry_extend = self.real_now_dt + (self._reservation_time * 11)
@property
def positions(self):
@@ -315,6 +305,14 @@ class CartManager:
self._seated_cache[item, subevent] = item.seat_category_mappings.filter(subevent=subevent).exists()
return self._seated_cache[item, subevent]
def _calculate_expiry(self):
if self._explicit_expiry:
self._expiry = self._explicit_expiry
else:
self._expiry = self.real_now_dt + timedelta(
minutes=self.event.settings.get('reservation_time', as_type=int)
)
def _check_presale_dates(self):
if self.event.presale_start and time_machine_now(self.real_now_dt) < self.event.presale_start:
raise CartError(error_messages['not_started'])
@@ -331,27 +329,9 @@ class CartManager:
raise CartError(error_messages['payment_ended'])
def _extend_expiry_of_valid_existing_positions(self):
# real_now_dt is initialized at CartManager instantiation, so it's slightly in the past. Add a small
# delta to reduce risk of extending already expired CartPositions.
padded_now_dt = self.real_now_dt + timedelta(seconds=5)
# Make sure we do not extend past the max_extend timestamp, allowing users to extend their valid positions up
# to 11 times the reservation time. If we add new positions to the cart while valid positions exist, the new
# positions' reservation will also be limited to max_extend of the oldest position.
# Only after all positions expire, an ExtendOperation may reset max_extend to another 11x reservation_time.
max_extend_existing = self.positions.filter(expires__gt=padded_now_dt).aggregate(m=Min('max_extend'))['m']
if max_extend_existing:
self._expiry = min(self._expiry, max_extend_existing)
self._max_expiry_extend = max_extend_existing
# Extend this user's cart session to ensure all items in the cart expire at the same time
# We can extend the reservation of items which are not yet expired without risk
if self._expiry > padded_now_dt:
self.num_extended_positions += self.positions.filter(
expires__gt=padded_now_dt, expires__lt=self._expiry,
).update(
expires=self._expiry,
)
self.positions.filter(expires__gt=self.real_now_dt).update(expires=self._expiry)
def _delete_out_of_timeframe(self):
err = None
@@ -1266,7 +1246,6 @@ class CartManager:
item=op.item,
variation=op.variation,
expires=self._expiry,
max_extend=self._max_expiry_extend,
cart_id=self.cart_id,
voucher=op.voucher,
addon_to=op.addon_to if op.addon_to else None,
@@ -1315,9 +1294,7 @@ class CartManager:
event=self.event,
item=b.item,
variation=b.variation,
expires=self._expiry,
max_extend=self._max_expiry_extend,
cart_id=self.cart_id,
expires=self._expiry, cart_id=self.cart_id,
voucher=None,
addon_to=cp,
subevent=b.subevent,
@@ -1344,14 +1321,12 @@ class CartManager:
op.position.delete()
elif available_count == 1:
op.position.expires = self._expiry
op.position.max_extend = self._max_expiry_extend
op.position.listed_price = op.listed_price
op.position.price_after_voucher = op.price_after_voucher
# op.position.price will be updated by recompute_final_prices_and_taxes()
if op.position.pk not in deleted_positions:
try:
op.position.save(force_update=True, update_fields=['expires', 'max_extend', 'listed_price', 'price_after_voucher'])
self.num_extended_positions += 1
op.position.save(force_update=True, update_fields=['expires', 'listed_price', 'price_after_voucher'])
except DatabaseError:
# Best effort... The position might have been deleted in the meantime!
pass
@@ -1441,11 +1416,14 @@ class CartManager:
def commit(self):
self._check_presale_dates()
self._check_max_cart_size()
self._calculate_expiry()
err = self._delete_out_of_timeframe()
err = self.extend_expired_positions() or err
err = err or self._check_min_per_voucher()
self.real_now_dt = now()
self._extend_expiry_of_valid_existing_positions()
err = self._perform_operations() or err
self.recompute_final_prices_and_taxes()
@@ -1654,31 +1632,6 @@ def clear_cart(self, event: Event, cart_id: str=None, locale='en', sales_channel
raise CartError(error_messages['busy'])
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def extend_cart_reservation(self, event: Event, cart_id: str=None, locale='en', sales_channel='web', override_now_dt: datetime=None) -> None:
"""
Resets the expiry time of a cart to the configured reservation time of this event.
Limited to 11x the reservation time.
:param event: The event ID in question
:param cart_id: The cart ID of the cart to modify
"""
with language(locale), time_machine_now_assigned(override_now_dt):
try:
sales_channel = event.organizer.sales_channels.get(identifier=sales_channel)
except SalesChannel.DoesNotExist:
raise CartError("Invalid sales channel.")
try:
try:
cm = CartManager(event=event, cart_id=cart_id, sales_channel=sales_channel)
cm.commit()
return cm.num_extended_positions
except LockTimeoutException:
self.retry()
except (MaxRetriesExceededError, LockTimeoutException):
raise CartError(error_messages['busy'])
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(CartError,))
def set_cart_addons(self, event: Event, addons: List[dict], add_to_cart_items: List[dict], cart_id: str=None, locale='en',
invoice_address: int=None, sales_channel='web', override_now_dt: datetime=None) -> None:
-60
View File
@@ -1,60 +0,0 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from django import template
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _ # NOQA
register = template.Library()
@register.simple_tag
def dialog(html_id, label, description, *args, **kwargs):
format_kwargs = {
"id": html_id,
"label": label,
"description": description,
"icon": format_html('<div class="modal-card-icon"><span class="fa fa-{}" aria-hidden="true"></span></div>', kwargs["icon"]) if "icon" in kwargs else "",
"alert": mark_safe('role="alertdialog"') if kwargs.get("alert", "False") != "False" else "",
}
result = """
<dialog {alert}
id="{id}"
aria-labelledby="{id}-label"
aria-describedby="{id}-description">
<form method="dialog" class="modal-card form-horizontal">
{icon}
<div class="modal-card-content">
<h2 id="{id}-label">{label}</h2>
<p id="{id}-description">{description}</p>
"""
return format_html(result, **format_kwargs)
@register.simple_tag
def enddialog(*args, **kwargs):
return mark_safe("""
</div>
</form>
</dialog>
""")
+1 -1
View File
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -34519,7 +34519,7 @@ msgid "Add to cart"
msgstr "أضف إلى سلة التسوق"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "إذا كنت قد طلبت تذكرة سابقا"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Si ja teniu tiquets demanats"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+21 -12
View File
@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
"PO-Revision-Date: 2025-05-16 17:00+0000\n"
"Last-Translator: David <davemachala@gmail.com>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/>"
"\n"
"PO-Revision-Date: 2025-02-19 17:00+0000\n"
"Last-Translator: Petr Čermák <pcermak@live.com>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix/cs/"
">\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 5.10\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -57,7 +57,7 @@ msgstr "Čeština"
#: pretix/_base_settings.py:96
msgid "Croatian"
msgstr "Chorvatština"
msgstr ""
#: pretix/_base_settings.py:97
msgid "Danish"
@@ -2971,9 +2971,12 @@ msgid "Repeat password"
msgstr "Opakovat heslo"
#: pretix/base/forms/questions.py:134 pretix/base/forms/questions.py:256
#, fuzzy
#| msgctxt "subevent"
#| msgid "No date was specified."
msgctxt "name_salutation"
msgid "not specified"
msgstr "neuvedeno"
msgstr "Nebylo uvedeno žádné datum."
#: pretix/base/forms/questions.py:219
msgid "Please do not use special characters in names."
@@ -4224,14 +4227,20 @@ msgstr ""
"automatická sleva poskytnuta i nadále."
#: pretix/base/models/discount.py:177
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting from"
msgstr "Dostupné pro termíny začínající od"
msgstr "Všechny termíny začínající před"
#: pretix/base/models/discount.py:182
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting until"
msgstr "Dostupné pro termíny začínající do"
msgstr "Všechny termíny začínající před"
#: pretix/base/models/discount.py:214
msgid ""
@@ -13465,7 +13474,7 @@ msgstr "Schváleno, čeká se na platbu"
#: pretix/plugins/reports/exporters.py:380
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:7
msgid "Approval pending"
msgstr "Čeká na schválení"
msgstr "Čeká se na schválení"
#: pretix/control/forms/filter.py:241
#, fuzzy
@@ -18840,7 +18849,7 @@ msgstr "Kontrola"
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html:50
#: pretix/control/templates/pretixcontrol/organizers/logs.html:80
msgid "No results"
msgstr "Žádné výsledky"
msgstr "Bez výsledků"
#: pretix/control/templates/pretixcontrol/event/mail.html:7
#: pretix/control/templates/pretixcontrol/organizers/mail.html:11
@@ -32266,7 +32275,7 @@ msgid "Add to cart"
msgstr "Přidat do košíku"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Pokud jste si již vstupenku objednali"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+58 -35
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-05-16 17:00+0000\n"
"Last-Translator: David <davemachala@gmail.com>\n"
"PO-Revision-Date: 2025-02-19 17:00+0000\n"
"Last-Translator: Petr Čermák <pcermak@live.com>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
"cs/>\n"
"Language: cs\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 5.10\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -237,11 +237,11 @@ msgstr "Zrušeno"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Confirmed"
msgstr "Potvrzeno"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Approval pending"
msgstr "Čeká na schválení"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
msgid "Redeemed"
@@ -440,7 +440,7 @@ msgstr "je po"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
msgid "="
msgstr "="
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Product"
@@ -452,7 +452,7 @@ msgstr "Varianta produktu"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
msgid "Gate"
msgstr "Brána"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
@@ -557,12 +557,12 @@ msgstr "Duplikát"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
msgctxt "entry_status"
msgid "present"
msgstr "přítomen"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
msgctxt "entry_status"
msgid "absent"
msgstr "nepřítomen"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR"
@@ -692,8 +692,10 @@ msgid "Calculating default price…"
msgstr "Výpočet standardní ceny…"
#: pretix/static/pretixcontrol/js/ui/plugins.js:69
#, fuzzy
#| msgid "Search results"
msgid "No results"
msgstr "Žádné výsledky"
msgstr "Vyhledat výsledky"
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
@@ -762,57 +764,64 @@ msgid "Your local time:"
msgstr "Místní čas:"
#: pretix/static/pretixpresale/js/walletdetection.js:39
#, fuzzy
#| msgid "Apple Pay"
msgid "Google Pay"
msgstr "Google Pay"
msgstr "Apple Pay"
#: pretix/static/pretixpresale/js/widget/widget.js:16
msgctxt "widget"
msgid "Quantity"
msgstr "Počet"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
msgid "Decrease quantity"
msgstr "Snížit počet"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18
msgctxt "widget"
msgid "Increase quantity"
msgstr "Zvýšit počet"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Price"
msgstr "Cena"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
#, javascript-format
msgctxt "widget"
msgid "Original price: %s"
msgstr "Původní cena: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
#, javascript-format
msgctxt "widget"
msgid "New price: %s"
msgstr "Nová cena: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
#, fuzzy
#| msgid "Selected only"
msgctxt "widget"
msgid "Select"
msgstr "Vybrat"
msgstr "Pouze vybra"
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
#, fuzzy, javascript-format
#| msgid "Selected only"
msgctxt "widget"
msgid "Select %s"
msgstr "Vybrat %s"
msgstr "Pouze vybrané"
#: pretix/static/pretixpresale/js/widget/widget.js:24
#, javascript-format
#, fuzzy, javascript-format
#| msgctxt "widget"
#| msgid "See variations"
msgctxt "widget"
msgid "Select variant %s"
msgstr "Vybrat variantu %s"
msgstr "Zobrazit možnosti"
#: pretix/static/pretixpresale/js/widget/widget.js:25
msgctxt "widget"
@@ -848,7 +857,7 @@ msgstr "od %(currency)s %(price)s"
#, javascript-format
msgctxt "widget"
msgid "Image of %s"
msgstr "Obrázek%s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32
msgctxt "widget"
@@ -883,19 +892,24 @@ msgstr "K dispozici pouze s poukazem"
#: pretix/static/pretixpresale/js/widget/widget.js:38
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Payment method unavailable"
msgctxt "widget"
msgid "Not yet available"
msgstr "Zatím není k dispozici"
msgstr "Způsob platby není k dispozici"
#: pretix/static/pretixpresale/js/widget/widget.js:39
msgctxt "widget"
msgid "Not available anymore"
msgstr "Již není k dispozici"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40
#, fuzzy
#| msgctxt "widget"
#| msgid "currently available: %s"
msgctxt "widget"
msgid "Currently not available"
msgstr "Momentálně není k dispozici."
msgstr "aktuálně k dispozici: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:42
#, javascript-format
@@ -928,9 +942,12 @@ msgid "Open ticket shop"
msgstr "Obchod vstupenek otevřit"
#: pretix/static/pretixpresale/js/widget/widget.js:48
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Checkout"
msgstr "Checkout"
msgstr "Obnovit checkout"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgctxt "widget"
@@ -992,14 +1009,20 @@ msgid "Continue"
msgstr "Pokračovat"
#: pretix/static/pretixpresale/js/widget/widget.js:61
#, fuzzy
#| msgctxt "widget"
#| msgid "See variations"
msgctxt "widget"
msgid "Show variants"
msgstr "Zobrazit možnosti"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "See variations"
msgctxt "widget"
msgid "Hide variants"
msgstr "Skrýt možnosti"
msgstr "Zobrazit možnosti"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
@@ -1087,31 +1110,31 @@ msgstr "Ne"
#: pretix/static/pretixpresale/js/widget/widget.js:81
msgid "Monday"
msgstr "Pondělí"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:82
msgid "Tuesday"
msgstr "Úterý"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:83
msgid "Wednesday"
msgstr "Středa"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:84
msgid "Thursday"
msgstr "Čtvrtek"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:85
msgid "Friday"
msgstr "Pátek"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:86
msgid "Saturday"
msgstr "Sobota"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:87
msgid "Sunday"
msgstr "Neděle"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:90
msgid "January"
+1 -1
View File
@@ -29951,7 +29951,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Hvis du allerede har bestilt en billet"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Wenn Sie bereits ein Ticket bestellt haben"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -33711,7 +33711,7 @@ msgid "Add to cart"
msgstr "Zum Warenkorb hinzufügen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Wenn du bereits ein Ticket bestellt hast"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29858,7 +29858,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -36098,7 +36098,7 @@ msgid "Add to cart"
msgstr "Προσθήκη στο καλάθι"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Αν έχετε ήδη αγοράσει κάποιο εισιτήριο"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+104 -106
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-14 02:00+0000\n"
"PO-Revision-Date: 2025-05-07 06:00+0000\n"
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -2595,7 +2595,7 @@ msgstr "Vales de compra bloqueados"
#: pretix/base/exporters/orderlist.py:1135 pretix/control/views/item.py:982
msgid "Current user's carts"
msgstr "Carrito actual del usuario"
msgstr "Cesta actual del usuario"
#: pretix/base/exporters/orderlist.py:1135
msgid "Exited orders"
@@ -4244,13 +4244,12 @@ msgid ""
"discounted. If you want to grant the discount on all matching products, keep "
"this field empty."
msgstr ""
"Esta opción le permite crear descuentos del tipo "
"\"compre X y obtenga Y reducido/gratis\". Por ejemplo, si establece "
"\"Número mínimo de productos coincidentes\" en cuatro y este valor en dos, "
"el carrito del cliente se dividirá en grupos de cuatro entradas y se "
"descontarán las dos entradas más baratos dentro de cada grupo. Si desea "
"otorgar el descuento en todos los productos coincidentes, mantenga este "
"campo vacío."
"Esta opción le permite crear descuentos del tipo \"compre X y obtenga Y "
"reducido/gratis\". Por ejemplo, si establece \"Número mínimo de productos "
"coincidentes\" en cuatro y este valor en dos, la cesta del cliente se "
"dividirá en grupos de cuatro entradas y se descontarán las dos entradas más "
"baratos dentro de cada grupo. Si desea otorgar el descuento en todos los "
"productos coincidentes, mantenga este campo vacío."
#: pretix/base/models/discount.py:165
msgid "Apply to add-on products"
@@ -4720,7 +4719,7 @@ msgstr ""
#: pretix/base/models/items.py:126
msgid "Only show if the cart contains one of the following products"
msgstr "Sólo se muestra el carrito contiene uno de los siguientes productos"
msgstr "Sólo se muestra si la cesta contiene uno de los siguientes productos"
#: pretix/base/models/items.py:129
msgid "Cross-selling condition"
@@ -4990,7 +4989,7 @@ msgid ""
"many times. If you keep the field empty or set it to 0, there is no special "
"limit for this product."
msgstr ""
"Este producto sólo se puede comprar si se agrega al carrito por lo menos "
"Este producto sólo se puede comprar si se agrega a la cesta por lo menos "
"esta cantidad de veces. Si deja el campo vacío o lo fija en 0, no hay ningún "
"límite especial para este producto."
@@ -6064,15 +6063,15 @@ msgstr "Posición del pedido"
#: pretix/base/models/orders.py:3091
msgid "Cart ID (e.g. session key)"
msgstr "ID de carrito (p. ej. clave de sesión)"
msgstr "ID de cesta (p. ej. clave de sesión)"
#: pretix/base/models/orders.py:3128
msgid "Cart position"
msgstr "Posición del carrito"
msgstr "Posición de la cesta"
#: pretix/base/models/orders.py:3129
msgid "Cart positions"
msgstr "Posiciones del carrito"
msgstr "Posiciones de la cesta"
#: pretix/base/models/orders.py:3265
msgid "Business customer"
@@ -6637,7 +6636,7 @@ msgid ""
"of a specific product, you can also select a quota. In this case, all "
"products assigned to this quota can be selected."
msgstr ""
"Este producto añadirá al carrito del usuario si está usado el vale de "
"Este producto añadirá a la cesta del usuario si está usado el vale de "
"compra. En vez de un producto específico, se puede seleccionar una cuota. En "
"este caso, todos los productos que están asignados al esta cuota se pueden "
"seleccionar."
@@ -7788,7 +7787,7 @@ msgstr "Usted no seleccionó ningún producto."
#: pretix/base/services/cart.py:105
msgid "Unknown cart position."
msgstr "Posición del carrito desconocida."
msgstr "Posición de la cesta desconocida."
#: pretix/base/services/cart.py:106
msgctxt "subevent"
@@ -7822,7 +7821,7 @@ msgid ""
"products are affected and have not been added to your cart: %s"
msgstr ""
"Algunos de los productos que seleccionó ya no están disponibles. Los "
"siguientes productos están afectados y no se han agregado a su carrito: %s"
"siguientes productos están afectados y no se han agregado a su cesta: %s"
#: pretix/base/services/cart.py:121
#, python-format
@@ -7833,7 +7832,7 @@ msgid ""
msgstr ""
"Algunos de los productos que seleccionó ya no están disponibles en la "
"cantidad que seleccionó. Los siguientes productos están afectados y no se "
"han agregado a su carrito: %s"
"han agregado a su cesta: %s"
#: pretix/base/services/cart.py:126
#, python-format
@@ -7871,11 +7870,11 @@ msgid_plural ""
"We removed %(product)s from your cart as you can not buy less than %(min)s "
"items of it."
msgstr[0] ""
"Eliminamos %(product)s de su carrito ya que no puede comprar menos de %(min)"
"s artículo del mismo."
"Eliminamos %(product)s de su cesta ya que no puede comprar menos de %(min)s "
"artículo del mismo."
msgstr[1] ""
"Eliminamos %(product)s de su carrito ya que no puede comprar menos de %(min)"
"s artículos del mismo."
"Eliminamos %(product)s de su cesta ya que no puede comprar menos de %(min)s "
"artículos del mismo."
#: pretix/base/services/cart.py:144 pretix/base/services/orders.py:154
#: pretix/presale/templates/pretixpresale/event/index.html:167
@@ -7901,7 +7900,7 @@ msgid ""
"positions have been removed from your cart."
msgstr ""
"El período de preventa de este evento aún no ha comenzado. Las posiciones "
"afectadas han sido eliminadas de su carrito."
"afectadas han sido eliminadas de su cesta."
#: pretix/base/services/cart.py:151 pretix/base/services/orders.py:182
msgid ""
@@ -7909,7 +7908,7 @@ msgid ""
"affected positions have been removed from your cart."
msgstr ""
"El período de preventa de uno de los eventos de su cesta ha finalizado. Las "
"posiciones afectadas han sido eliminadas de su carrito."
"posiciones afectadas han sido eliminadas de su cesta."
#: pretix/base/services/cart.py:153
msgid "The entered price is not a number."
@@ -7951,11 +7950,11 @@ msgid_plural ""
msgstr[0] ""
"El vale de compra \"%(voucher)s\" solo se puede utilizar si selecciona al "
"menos %(number)s productos coincidentes. Por lo tanto, hemos eliminado "
"algunas posiciones de su carrito que ya no se pueden comprar así."
"algunas posiciones de su cesta que ya no se pueden comprar así."
msgstr[1] ""
"Los vale de compra \"%(voucher)s\" solo se pueden utilizar si selecciona al "
"menos %(number)s productos coincidentes. Por lo tanto, hemos eliminado "
"algunas posiciones de su carrito que ya no se pueden comprar así."
"algunas posiciones de su cesta que ya no se pueden comprar así."
#: pretix/base/services/cart.py:168
msgid ""
@@ -7972,7 +7971,7 @@ msgid ""
"process. You can try to use it again in %d minutes."
msgstr ""
"Este vale de compra está actualmente bloqueado ya que está contenido en un "
"carrito de la compra. Esto puede significar que otra persona está canjeando "
"cesta de la compra. Esto puede significar que otra persona está canjeando "
"este vale de compra ahora mismo, o que usted intentó canjearlo antes pero no "
"completó el proceso de pago. Puede intentar utilizarlo de nuevo en %d "
"minutos."
@@ -7987,7 +7986,7 @@ msgid ""
"Applying a voucher to the whole cart should not be combined with other "
"operations."
msgstr ""
"La aplicación de un vale de compra a todo el carrito no debe combinarse con "
"La aplicación de un vale de compra a todo la cesta no debe combinarse con "
"otras operaciones."
#: pretix/base/services/cart.py:178
@@ -7995,7 +7994,7 @@ msgid ""
"You already used this voucher code. Remove the associated line from your "
"cart if you want to use it for a different product."
msgstr ""
"Ya ha utilizado este vale de compra. Elimine la línea asociada de su carrito "
"Ya ha utilizado este vale de compra. Elimine la línea asociada de su cesta "
"si desea utilizarlo para un producto diferente."
#: pretix/base/services/cart.py:181
@@ -8016,7 +8015,7 @@ msgid ""
"for. If you want to add something new to your cart using that voucher, you "
"can do so with the voucher redemption option on the bottom of the page."
msgstr ""
"No encontramos ninguna posición en su carrito para la que podamos usar este "
"No encontramos ninguna posición en su cesta para la que podamos usar este "
"vale de compra. Si desea agregar algo nuevo a su cesta usando ese vale de "
"compra, puede hacerlo con la opción de canje de vale de compra en la parte "
"inferior de la página."
@@ -8617,8 +8616,8 @@ msgid ""
"The price of some of the items in your cart has changed in the meantime. "
"Please see below for details."
msgstr ""
"El precio de algunos de los artículos en su carrito ha cambiado en el "
"durante este tiempo. Por favor vea abajo para más detalles."
"El precio de algunos de los artículos en su cesta ha cambiado en el durante "
"este tiempo. Por favor vea abajo para más detalles."
#: pretix/base/services/orders.py:141
msgid "An internal error occurred, please try again."
@@ -8634,7 +8633,7 @@ msgstr ""
#: pretix/base/services/orders.py:144
msgid "Your cart is empty."
msgstr "Su carrito está vacío."
msgstr "Su cesta está vacía."
#: pretix/base/services/orders.py:146
#, python-format
@@ -8646,10 +8645,10 @@ msgid_plural ""
"removed the surplus items from your cart."
msgstr[0] ""
"No puede seleccionar más de %(max)s artículos del producto %(product)s. "
"Eliminamos el artículo sobrante de su carrito."
"Eliminamos el artículo sobrante de su cesta."
msgstr[1] ""
"No puede seleccionar más de %(max)s artículos del producto %(product)s. "
"Eliminamos los artículos sobrantes de su carrito."
"Eliminamos los artículos sobrantes de su cesta."
#: pretix/base/services/orders.py:155
msgid "The booking period has ended."
@@ -8660,7 +8659,7 @@ msgid ""
"The voucher code used for one of the items in your cart is not known in our "
"database."
msgstr ""
"El vale de compra utilizado para uno de los artículos de su carrito no es "
"El vale de compra utilizado para uno de los artículos de su cesta no es "
"conocido en nuestra base de datos."
#: pretix/base/services/orders.py:163
@@ -8669,16 +8668,16 @@ msgid ""
"used the maximum number of times allowed. We removed this item from your "
"cart."
msgstr ""
"El vale de compra utilizado para uno de los artículos de su carrito ya ha "
"sido utilizado el máximo número de veces permitido. Hemos quitado este "
"artículo de su cesta."
"El vale de compra utilizado para uno de los artículos de su cesta ya ha sido "
"utilizado el máximo número de veces permitido. Hemos quitado este artículo "
"de su cesta."
#: pretix/base/services/orders.py:167
msgid ""
"The voucher code used for one of the items in your cart has already been too "
"often. We adjusted the price of the item in your cart."
msgstr ""
"El vale de compra utilizado para uno de los artículos de su carrito ya se ha "
"El vale de compra utilizado para uno de los artículos de su cesta ya se ha "
"utilizado con demasiada frecuencia. Ajustamos el precio del artículo en su "
"cesta."
@@ -8687,16 +8686,16 @@ msgid ""
"The voucher code used for one of the items in your cart is expired. We "
"removed this item from your cart."
msgstr ""
"El vale de compra utilizado para uno de los artículos de su carrito ha "
"caducado. Hemos quitado este artículo de su carrito."
"El vale de compra utilizado para uno de los artículos de su cesta ha "
"caducado. Hemos quitado este artículo de su cesta."
#: pretix/base/services/orders.py:174
msgid ""
"The voucher code used for one of the items in your cart is not valid for "
"this item. We removed this item from your cart."
msgstr ""
"El vale de compra utilizado para uno de los artículos de su carrito no es "
"válido para este artículo. Hemos quitado este artículo de su carrito."
"El vale de compra utilizado para uno de los artículos de su cesta no es "
"válido para este artículo. Hemos quitado este artículo de su cesta."
#: pretix/base/services/orders.py:176
msgid "You need a valid voucher code to order one of the products."
@@ -8707,22 +8706,22 @@ msgid ""
"The booking period for one of the events in your cart has not yet started. "
"The affected positions have been removed from your cart."
msgstr ""
"El período de preventa de uno de los eventos de su carrito aún no ha "
"comenzado. Las posiciones afectadas han sido eliminadas de su carrito."
"El período de preventa de uno de los eventos de su cesta aún no ha "
"comenzado. Las posiciones afectadas han sido eliminadas de su cesta."
#: pretix/base/services/orders.py:185
msgid ""
"One of the seats in your order was invalid, we removed the position from "
"your cart."
msgstr ""
"Uno de las butacas de su pedido no era válida, la eliminamos de su carrito."
"Uno de las butacas de su pedido no era válida, la eliminamos de su cesta."
#: pretix/base/services/orders.py:186
msgid ""
"One of the seats in your order has been taken in the meantime, we removed "
"the position from your cart."
msgstr ""
"Una de las butaca de su pedido ha sido ocupada. La eliminamos de su carrito."
"Una de las butaca de su pedido ha sido ocupada. La eliminamos de su cesta."
#: pretix/base/services/orders.py:202
#, python-format
@@ -9155,8 +9154,8 @@ msgid ""
"Independent of your choice, the cart will show gross prices as this is the "
"price that needs to be paid."
msgstr ""
"Independientemente de su elección, el carrito mostrará los precios brutos, "
"ya que este es el precio que debe pagarse."
"Independientemente de su elección, el cesta mostrará los precios brutos, ya "
"que este es el precio que debe pagarse."
#: pretix/base/settings.py:338
msgid "Hide prices on attendee ticket page"
@@ -9522,15 +9521,15 @@ msgstr "Período de reserva"
msgid ""
"The number of minutes the items in a user's cart are reserved for this user."
msgstr ""
"El número de minutos que los artículos en el carrito de un usuario "
"permanecen reservados para un usuario."
"El número de minutos que los artículos en la cesta de un usuario permanecen "
"reservados para un usuario."
#: pretix/base/settings.py:807
msgid ""
"Directly redirect to check-out after a product has been added to the cart."
msgstr ""
"Redirigir directamente a la compra después de que un producto se haya "
"agregado a la carrito."
"agregado a la cesta."
#: pretix/base/settings.py:816
msgid "End of presale text"
@@ -14676,8 +14675,8 @@ msgid ""
"\"inactive\" instead."
msgstr ""
"La variación \"%s\" no se puede borrar porque ya ha sido pedida por un "
"usuario o está actualmente en el carrito de un usuario. En su lugar, "
"configure la variación como \"inactiva\"."
"usuario o está actualmente en la cesta de un usuario. En su lugar, configure "
"la variación como \"inactiva\"."
#: pretix/control/forms/item.py:994
msgid "Use value from product"
@@ -19855,7 +19854,7 @@ msgstr "Añadir enlace"
#: pretix/control/templates/pretixcontrol/event/settings.html:345
msgid "Cart"
msgstr "Carrito"
msgstr "Cesta"
#: pretix/control/templates/pretixcontrol/event/settings.html:353
msgid ""
@@ -20285,7 +20284,7 @@ msgid ""
msgstr ""
"Ejemplos: múltiples presentaciones del mismo espectáculo, el mismo concierto "
"en múltiples ubicaciones, museos, bibliotecas o piscinas, eventos que deben "
"reservarse juntos en un solo carrito."
"reservarse juntos en una sola cesta."
#: pretix/control/templates/pretixcontrol/events/create_foundation.html:53
msgid ""
@@ -20875,7 +20874,7 @@ msgid ""
"as add-ons in the cart for this product."
msgstr ""
"Con los paquetes, puede especificar productos que siempre se agregan "
"automáticamente al carrito como complementos para este producto."
"automáticamente a la cesta como complementos para este producto."
#: pretix/control/templates/pretixcontrol/item/include_bundles.html:68
msgid "Add a new bundled product"
@@ -21061,7 +21060,7 @@ msgstr "Condición"
#: pretix/control/templates/pretixcontrol/items/discount.html:34
msgid "Minimum cart content"
msgstr "Contenido mínimo del carrito"
msgstr "Contenido mínimo de la cesta"
#: pretix/control/templates/pretixcontrol/items/discount.html:43
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:53
@@ -21157,7 +21156,7 @@ msgid ""
"overlapping discounts, the first one in the order of the list below will "
"apply."
msgstr ""
"Un sólo desuento puede aplicarse a los productos del carrito. Si tiene "
"Un sólo desuento puede aplicarse a los productos de la cesta. Si tiene "
"descuentos superpuestos, se aplicará el primero en el pedido de la lista "
"siguiente."
@@ -25823,7 +25822,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:4
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:6
msgid "Delete carts"
msgstr "Eliminar carrito"
msgstr "Eliminar cestas"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:9
#, python-format
@@ -25831,7 +25830,7 @@ msgid ""
"Are you sure you want to delete any cart positions with voucher "
"<strong>%(voucher)s</strong>?"
msgstr ""
"¿Está seguro de que desea eliminar alguna entrada del carrito con vale de "
"¿Está seguro de que desea eliminar alguna entrada de la cesta con vale de "
"compra <strong>%(voucher)s</strong>?"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:10
@@ -25840,7 +25839,7 @@ msgid ""
"a purchase. This can be really confusing. Only use this if you know that the "
"session is no longer in use."
msgstr ""
"Esto eliminará silenciosamente productos del carrito de un usuario que "
"Esto eliminará silenciosamente productos de la cesta de un usuario que "
"actualmente realiza una compra. Esto puede resultar realmente confuso. "
"Utilice esto únicamente si sabe que la sesión ya no está en uso."
@@ -25860,13 +25859,13 @@ msgid ""
"This voucher is currently used in %(number)s cart sessions and might not be "
"free to use until the cart sessions expire."
msgstr ""
"Este vale de compra se utiliza actualmente en %(number)s sesiones del "
"carrito y es posible que no sea de uso gratuito hasta que caduque la sesión "
"de la cesta."
"Este vale de compra se utiliza actualmente en %(number)s sesiones de la "
"cesta y es posible que no sea de uso gratuito hasta que caduque la sesión de "
"la cesta."
#: pretix/control/templates/pretixcontrol/vouchers/detail.html:28
msgid "Remove cart positions"
msgstr "Eliminar elemento del carrito"
msgstr "Eliminar element de la cesta"
#: pretix/control/templates/pretixcontrol/vouchers/detail.html:43
msgid "Voucher link"
@@ -32152,7 +32151,7 @@ msgid ""
"Your cart includes a product that requires an active membership to be "
"selected."
msgstr ""
"Su carrito incluye un producto que requiere una suscripción activa para ser "
"Su cesta incluye un producto que requiere una suscripción activa para ser "
"seleccionado."
#: pretix/presale/checkoutflow.py:489
@@ -32188,8 +32187,8 @@ msgid ""
"accordingly."
msgstr ""
"Debido a la dirección de factura que ingresó, necesitamos aplicar una tasa "
"impositiva diferente a su compra y el precio de los productos en su carrito "
"ha cambiado en consecuencia."
"impositiva diferente a su compra y el precio de los productos en su cesta ha "
"cambiado en consecuencia."
#: pretix/presale/checkoutflow.py:1029
msgid "Please enter your invoicing address."
@@ -32547,7 +32546,7 @@ msgid ""
"For some of the products in your cart, you can choose additional options "
"before you continue."
msgstr ""
"Para algunos de los productos en su carrito, usted puede elegir opciones "
"Para algunos de los productos en su cesta, usted puede elegir opciones "
"adicionales antes de continuar."
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:16
@@ -32555,7 +32554,7 @@ msgid ""
"A product in your cart is only sold in combination with add-on products that "
"are not available. Please contact the event organizer."
msgstr ""
"Un producto de su carrito sólo se vende en combinación con productos "
"Un producto de su cesta sólo se vende en combinación con productos "
"complementarios que no están disponibles. Póngase en contacto con el "
"organizador del evento."
@@ -32603,17 +32602,17 @@ msgstr "Compra"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:8
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:11
msgid "Your cart"
msgstr "Su carrito"
msgstr "Su cesta"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:28
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:31
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:18
msgid "Cart expired"
msgstr "El carrito de compra ha expirado"
msgstr "La cesta de compra ha expirado"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:36
msgid "Show full cart"
msgstr "Mostrar carrito completo"
msgstr "Mostrar cesta completa"
#: pretix/presale/templates/pretixpresale/event/checkout_base.html:48
#: pretix/presale/templates/pretixpresale/event/index.html:84
@@ -32759,7 +32758,7 @@ msgid ""
"Some of the products in your cart can only be purchased if there is an "
"active membership on your account."
msgstr ""
"Algunos productos del carrito sólo pueden comprarse si existe una "
"Algunos productos de la cesta sólo pueden comprarse si existe una "
"suscripción activa en su cuenta."
#: pretix/presale/templates/pretixpresale/event/checkout_membership.html:37
@@ -32892,7 +32891,7 @@ msgid ""
"browser settings accordingly."
msgstr ""
"Su navegador no acepta cookies de nuestra parte. Sin embargo, necesitamos "
"establecer una cookie para recordar quién es usted y qué hay en su carrito. "
"establecer una cookie para recordar quién es usted y qué hay en su cesta. "
"Por favor, cambie la configuración de su navegador en consecuencia."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:17
@@ -33054,7 +33053,7 @@ msgstr "incluido. %(rate)s%% %(name)s"
#: pretix/presale/templates/pretixpresale/event/voucher.html:252
#, python-format
msgid "Add %(item)s, %(var)s to cart"
msgstr "Cantidad de %(item)s - %(var)s en el carrito"
msgstr "Cantidad de %(item)s - %(var)s en la cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:203
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:349
@@ -33093,7 +33092,7 @@ msgstr "Aumentar cantidad"
#: pretix/presale/templates/pretixpresale/event/voucher.html:408
#, python-format
msgid "Add %(item)s to cart"
msgstr "Añadir %(item)s al carrito"
msgstr "Añadir %(item)s a la cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:379
msgid "There are no add-ons available for this product."
@@ -33215,12 +33214,12 @@ msgstr "Entendido, estamos removiendo eso…"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:289
#, python-format
msgid "Remove %(item)s from your cart"
msgstr "Eliminar %(item)s de su carrito"
msgstr "Eliminar %(item)s de su cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:292
#, python-format
msgid "Remove one %(item)s from your cart"
msgstr "Eliminar un %(item)s de tu carrito"
msgstr "Eliminar un %(item)s de tu cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:294
#, python-format
@@ -33228,7 +33227,7 @@ msgid ""
"Remove one %(item)s from your cart. You currently have %(count)s in your "
"cart."
msgstr ""
"Elimina un %(item)s de su carrito. Actualmente tiene %(count)s en su carrito."
"Elimina un %(item)s de su cesta. Actualmente tiene %(count)s en su cesta."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:302
msgid "We're trying to reserve another one for you!"
@@ -33243,13 +33242,13 @@ msgid ""
"Once the items are in your cart, you will have %(time)s minutes to complete "
"your purchase."
msgstr ""
"Una vez los elementos están en su carrito, tendrá %(time)s minutos para "
"Una vez los elementos están en su cesta, tendrá %(time)s minutos para "
"completar la compra."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:322
#, python-format
msgid "Add one more %(item)s to your cart"
msgstr "Añadir un %(item)s más a su carrito"
msgstr "Añadir un %(item)s más a su cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:324
#, python-format
@@ -33257,8 +33256,7 @@ msgid ""
"Add one more %(item)s to your cart. You currently have %(count)s in your "
"cart."
msgstr ""
"Agregar un %(item)s más a su carrito. Actualmente tiene %(count)s en su "
"carrito."
"Agregar un %(item)s más a su cesta. Actualmente tiene %(count)s en su cesta."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:384
#: pretix/presale/templates/pretixpresale/event/order_giftcard.html:20
@@ -33282,15 +33280,15 @@ msgstr "incl. %(tax_sum)s impuestos"
#, python-format
msgid "The items in your cart are reserved for you for %(minutes)s minutes."
msgstr ""
"Los artículos de su carrito están reservados durante %(minutes)ss minutos."
"Los artículos de su cesta están reservados durante %(minutes)ss minutos."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:493
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Los elementos en su carrito de compras ya no se encuentran reservados. "
"Puedes seguir añadiendo más productos mientras estén disponibles."
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
"seguir añadiendo más productos mientras estén disponibles."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:497
msgid "Overview of your ordered products."
@@ -33308,7 +33306,7 @@ msgstr "Proceder con la compra"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:63
msgid "Empty cart"
msgstr "Vaciar carrito"
msgstr "Vaciar cesta"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:68
#: pretix/presale/templates/pretixpresale/event/index.html:246
@@ -33318,7 +33316,7 @@ msgstr "Canjear vale de compra"
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:71
msgid "We're applying this voucher to your cart..."
msgstr "Estamos aplicando este vale de compra a su carrito..."
msgstr "Estamos aplicando este vale de compra a su cesta..."
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:79
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:26
@@ -33694,11 +33692,11 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:48
msgid "Your cart, general information, add products to your cart"
msgstr "Su carrito, información general, añadir productos a su carrito"
msgstr "Su cesta, información general, añadir productos a su cesta"
#: pretix/presale/templates/pretixpresale/event/index.html:48
msgid "General information, add products to your cart"
msgstr "Información general, añadir productos al carrito"
msgstr "Información general, añadir productos a la cesta"
#: pretix/presale/templates/pretixpresale/event/index.html:68
msgid "Please select a date to redeem your voucher."
@@ -33752,10 +33750,10 @@ msgstr "Registrarse"
#: pretix/presale/templates/pretixpresale/event/index.html:232
#: pretix/presale/templates/pretixpresale/event/voucher.html:443
msgid "Add to cart"
msgstr "Agregar al carrito"
msgstr "Agregar a la cesta"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Si ya ha pedido una entrada"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34592,8 +34590,8 @@ msgid ""
"Functional cookies (e.g. shopping cart, login, payment, language preference) "
"and technical cookies (e.g. security purposes)"
msgstr ""
"Cookies funcionales (por ejemplo, carrito de compras, inicio de sesión, "
"pago, preferencia de idioma) y cookies técnicas (por ejemplo, con fines de "
"Cookies funcionales (por ejemplo, cesta de compras, inicio de sesión, pago, "
"preferencia de idioma) y cookies técnicas (por ejemplo, con fines de "
"seguridad)"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:89
@@ -34885,26 +34883,26 @@ msgstr "Por favor, introduzca sólo números positivos."
#: pretix/presale/views/cart.py:441
msgid "We applied the voucher to as many products in your cart as we could."
msgstr ""
"Aplicamos el vale de compra a tantos productos en su carrito como pudimos."
"Aplicamos el vale de compra a tantos productos en su cesta como pudimos."
#: pretix/presale/views/cart.py:460 pretix/presale/views/cart.py:468
msgid ""
"The gift card has been saved to your cart. Please continue your checkout."
msgstr ""
"La tarjeta regalo se ha guardado en su carrito. Continúe con el proceso de "
"La tarjeta regalo se ha guardado en su cesta. Continúe con el proceso de "
"compra."
#: pretix/presale/views/cart.py:504
msgid "Your cart has been updated."
msgstr "Su carrito ha sido actualizada."
msgstr "Su cesta ha sido actualizada."
#: pretix/presale/views/cart.py:507 pretix/presale/views/cart.py:533
msgid "Your cart is now empty."
msgstr "Su carrito ha sido vaciada."
msgstr "Su cesta ha sido vaciada."
#: pretix/presale/views/cart.py:548
msgid "The products have been successfully added to your cart."
msgstr "Los productos se han añadido con éxito a su carrito."
msgstr "Los productos se han añadido con éxito a su cesta."
#: pretix/presale/views/cart.py:572 pretix/presale/views/event.py:540
#: pretix/presale/views/widget.py:377
@@ -34917,8 +34915,8 @@ msgid ""
"The gift card has been saved to your cart. Please now select the products "
"you want to purchase."
msgstr ""
"La tarjeta regalo se ha guardado en su carrito. Seleccione ahora los "
"productos que desea comprar."
"La tarjeta regalo se ha guardado en su cesta. Seleccione ahora los productos "
"que desea comprar."
#: pretix/presale/views/cart.py:739
msgctxt "subevent"
@@ -34927,7 +34925,7 @@ msgstr "No pudimos encontrar la fecha especificada."
#: pretix/presale/views/checkout.py:55
msgid "Your cart is empty"
msgstr "Su carito está vacío"
msgstr "Su cesta está vacía"
#: pretix/presale/views/checkout.py:59
msgid "The booking period for this event is over or has not yet started."
+6 -6
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-05-14 02:00+0000\n"
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
"pretix-js/es/>\n"
"Language: es\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -706,12 +706,12 @@ msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Los elementos en su carrito de compras ya no se encuentran reservados. "
"Puedes seguir añadiendo más productos mientras estén disponibles."
"Los elementos en su cesta de compras ya no se encuentran reservados. Puedes "
"seguir añadiendo más productos mientras estén disponibles."
#: pretix/static/pretixpresale/js/ui/cart.js:45
msgid "Cart expired"
msgstr "El carrito de compra ha expirado"
msgstr "La cesta de compra ha expirado"
#: pretix/static/pretixpresale/js/ui/cart.js:50
msgid "The items in your cart are reserved for you for one minute."
+1 -1
View File
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -32099,7 +32099,7 @@ msgid "Add to cart"
msgstr "Saskira gehitu"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Dagoeneko sarrera bat eskatu baduzu"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -31848,7 +31848,7 @@ msgid "Add to cart"
msgstr "Lisää ostoskoriin"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Jos tilasit jo tuotteita"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29880,7 +29880,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Si vous avez déjà commandé un billet"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Se xa pediu unha entrada"
#: pretix/presale/templates/pretixpresale/event/index.html:257
File diff suppressed because it is too large Load Diff
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Ako ste već kupili kartu"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+4 -4
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-17 18:00+0000\n"
"PO-Revision-Date: 2025-04-14 23:00+0000\n"
"Last-Translator: Patrick Chilton <chpatrick@gmail.com>\n"
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix/"
"hu/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 5.10.4\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -14670,7 +14670,7 @@ msgstr "A kiválasztott \"{seat}\" ülés nem elérhető."
#: pretix/control/logdisplay.py:406 pretix/control/views/orders.py:1573
#: pretix/presale/views/order.py:1047
msgid "The order has been canceled."
msgstr "A megrendelés sztornózva lett."
msgstr ""
#: pretix/control/logdisplay.py:414
#, python-brace-format
@@ -31023,7 +31023,7 @@ msgid "Add to cart"
msgstr "Hozzáadás a kosárhoz"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Ha már rendeltél jegyet"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Jika kamu sudah memesan tiket"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Se hai già prenotato un biglietto"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -32867,7 +32867,7 @@ msgid "Add to cart"
msgstr "カートに追加"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "すでにチケットを注文済みの場合"
#: pretix/presale/templates/pretixpresale/event/index.html:257
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -29862,7 +29862,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -32169,7 +32169,7 @@ msgid "Add to cart"
msgstr "Pievienot grozam"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Ja jau esat pasūtījis biļeti"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34036,7 +34036,7 @@ msgid "Add to cart"
msgstr "Legg til handlekurv"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Har du allerede bestilt billett"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Als u al een ticket heeft besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34971,7 +34971,7 @@ msgid "Add to cart"
msgstr "Voeg toe aan winkelwagen"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Als je al een kaartje hebt besteld"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Jeżeli bilet jest już zamówiony"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -30093,7 +30093,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -30334,7 +30334,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -32910,7 +32910,7 @@ msgid "Add to cart"
msgstr "Adicionar ao carrinho"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Se você já solicitou um ingresso"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34042,7 +34042,7 @@ msgid "Add to cart"
msgstr "Adicionar ao carrinho"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Se já pediste um bilhete"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Dacă ați comandat deja un bilet"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -33106,7 +33106,7 @@ msgid "Add to cart"
msgstr "Добавить в корзину"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Если вы уже заказали билет"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29992,7 +29992,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Ak ste si už objednali vstupenku"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -32657,7 +32657,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+6 -6
View File
@@ -8,17 +8,17 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
"PO-Revision-Date: 2025-05-16 17:00+0000\n"
"Last-Translator: bstramsek <stramsek.borut+pretix-translate@gmail.com>\n"
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/"
"pretix-js/sl/>\n"
"PO-Revision-Date: 2019-08-27 08:00+0000\n"
"Last-Translator: Bostjan Marusic <bostjan@brokenbones.si>\n"
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/pretix-"
"js/sl/>\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 5.11.4\n"
"X-Generator: Weblate 3.5.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -32,7 +32,7 @@ msgstr "Komentar:"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
msgid "PayPal"
msgstr "PayPal"
msgstr ""
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
+1 -1
View File
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
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 have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Om du redan har bokat en biljett"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29859,7 +29859,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -35827,7 +35827,7 @@ msgid "Add to cart"
msgstr "Sepete ekle"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Zaten bir bilet sipariş ettiyseniz"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -33579,7 +33579,7 @@ msgid "Add to cart"
msgstr "Додати до кошика"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "Якщо Ви вже замовили квиток"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29897,7 +29897,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -1
View File
@@ -29857,7 +29857,7 @@ msgid "Add to cart"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -34570,7 +34570,7 @@ msgid "Add to cart"
msgstr "添加到购物车"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "如果您已经订了票"
#: pretix/presale/templates/pretixpresale/event/index.html:257
@@ -31796,7 +31796,7 @@ msgid "Add to cart"
msgstr "加入購物車"
#: pretix/presale/templates/pretixpresale/event/index.html:253
msgid "If you have already ordered a ticket"
msgid "If you already ordered a ticket"
msgstr "如果你已訂購票"
#: pretix/presale/templates/pretixpresale/event/index.html:257
+1 -15
View File
@@ -625,22 +625,8 @@ class PaypalMethod(BasePaymentProvider):
}
return template.render(ctx)
# We are wrapping the actual _execute_payment() here, since PaymentExceptions
# within the atomic transaction would rollback any changes to the payment-object,
# this throwing away any logentries and payment.fail()
@transaction.atomic
def execute_payment(self, request: HttpRequest, payment: OrderPayment):
ex = None
with transaction.atomic():
try:
return self._execute_payment(request, payment)
except PaymentException as e:
ex = e
if ex:
raise ex
return False
def _execute_payment(self, request: HttpRequest, payment: OrderPayment):
payment = OrderPayment.objects.select_for_update(of=OF_SELF).get(pk=payment.pk)
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED:
logger.warning('payment is already confirmed; possible return-view/webhook race-condition')
-6
View File
@@ -66,8 +66,6 @@ class AuthenticationForm(forms.Form):
error_messages = {
'incomplete': _('You need to fill out all fields.'),
'empty_email': _('You need to enter an email address.'),
'empty_password': _('You need to enter a password.'),
'invalid_login': _(
"We have not found an account with this email address and password."
),
@@ -114,10 +112,6 @@ class AuthenticationForm(forms.Form):
else:
self.confirm_login_allowed(self.customer_cache)
else:
if not email:
self.add_error("email", self.error_messages['empty_email'])
if not password:
self.add_error("password", self.error_messages['empty_password'])
raise forms.ValidationError(
self.error_messages['incomplete'],
code='incomplete'
@@ -94,11 +94,10 @@
</a>
{% else %}
<h1>
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}" class="no-underline">{{ event.name }}
<a href="{% eventurl event "presale:event.index" cart_namespace=cart_namespace|default_if_none:"" %}">{{ event.name }}</a>
{% if request.event.settings.show_dates_on_frontpage and not event.has_subevents %}
<small class="text-muted">{{ event.get_date_range_display_as_html }}</small>
<small>{{ event.get_date_range_display_as_html }}</small>
{% endif %}
</a>
</h1>
{% endif %}
</div>
@@ -261,7 +261,7 @@
{{ line.price|money:event.currency }}
{% endif %}
{% if line.discount and line.line_price_gross != line.price %}
<span class="text-success discounted" data-toggle="tooltip" title="{% trans "The price of this product was reduced because of an automatic discount." %}">
<span class="text-success discounted" data-toggle="tooltip" data-placement="bottom" title="{% trans "The price of this product was reduced because of an automatic discount." %}">
<br>
<span class="fa fa-star fa-fw" aria-hidden="true"></span>
{% if line.price < line.line_price_gross %}
@@ -334,7 +334,7 @@
{{ line.price|money:event.currency }}
{% endif %}
{% if line.discount and line.line_price_gross != line.price %}
<span class="text-success discounted" data-toggle="tooltip" title="{% trans "The price of this product was reduced because of an automatic discount." %}">
<span class="text-success discounted" data-toggle="tooltip" data-placement="bottom" title="{% trans "The price of this product was reduced because of an automatic discount." %}">
<br>
<span class="fa fa-star fa-fw" aria-hidden="true"></span>
{% if line.price < line.line_price_gross %}
@@ -492,21 +492,15 @@
<div class="row">
<div class="col-md-12">
{% if not cart.is_ordered %}
<form class="text-muted"
method="post" data-asynctask action="{% eventurl request.event "presale:event.cart.extend" cart_namespace=cart_namespace %}">
{% csrf_token %}
<span id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you. You can still complete your order as long as theyre available." %}
{% endif %}
</span>
<button class="btn btn-link" type="submit" id="cart-extend-button">
<i class="fa fa-refresh" aria-hidden="true"></i> {% trans "Extend" %}</button>
</form>
<p class="text-muted" id="cart-deadline" data-expires="{{ cart.first_expiry|date:"Y-m-d H:i:sO" }}">
{% if cart.minutes_left > 0 or cart.seconds_left > 0 %}
{% blocktrans trimmed with minutes=cart.minutes_left %}
The items in your cart are reserved for you for {{ minutes }} minutes.
{% endblocktrans %}
{% else %}
{% trans "The items in your cart are no longer reserved for you. You can still complete your order as long as theyre available." %}
{% endif %}
</p>
{% else %}
<p class="sr-only" id="cart-description">{% trans "Overview of your ordered products." %}</p>
{% endif %}
@@ -2,15 +2,15 @@
{% load icon %}
{% load eventurl %}
<div class="event-list full-width-list alternating-rows">
<dl class="full-width-list alternating-rows">
{% for subev in subevent_list.subevent_list %}
<article class="row" aria-labelledby="subevent-{{ subev.pk }}-label" aria-describedby="subevent-{{ subev.pk }}-desc">
<h3 class="col-md-4 col-xs-12">
<a id="subevent-{{ subev.pk }}-label" href="{% if request.GET.voucher %}{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}?voucher={{ request.GET.voucher|urlencode }}&amp;subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}">
<div class="row">
<dt class="col-md-4 col-xs-12">
<a href="{% if request.GET.voucher %}{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}?voucher={{ request.GET.voucher|urlencode }}&amp;subevent={{ subev.pk }}{% else %}{% eventurl event "presale:event.index" subevent=subev.id cart_namespace=cart_namespace %}{% endif %}">
{{ subev.name }}
</a>
</h3>
<p class="col-md-3 col-xs-12" id="subevent-{{ subev.pk }}-desc">
</dt>
<dd class="col-md-3 col-xs-12">
{{ subev.get_date_range_display_as_html }}
{% if event.settings.show_times %}
<br>
@@ -20,13 +20,13 @@
<time datetime="{{ subev.date_from.isoformat }}">{{ subev.date_from|date:"TIME_FORMAT" }}</time>
</span>
{% endif %}
</p>
<p class="col-md-3 col-xs-6">
</dd>
<dd class="col-md-3 col-xs-6">
<small>
{% include "pretixpresale/fragment_event_list_status.html" with event=subev %}
</small>
</p>
<p class="col-md-2 col-xs-6 text-right flip">
</dd>
<dd class="col-md-2 col-xs-6 text-right flip">
<a class="btn btn-primary btn-block" href="{% if request.GET.voucher %}{% eventurl event "presale:event.redeem" cart_namespace=cart_namespace %}?voucher={{ request.GET.voucher|urlencode }}&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>
</p>
</article>
</dd>
</div>
{% endfor %}
</div>
</dl>
@@ -7,8 +7,6 @@
{% load thumb %}
{% load eventsignal %}
{% load rich_text %}
{% load icon %}
{% load dialog %}
{% block title %}
{% if "year" in request.GET %}
@@ -242,13 +240,6 @@
</div>
{% endif %}
</form>
{% if ev.presale_is_running and display_add_to_cart %}
{% trans "You didnt select any ticket." as label_nothing_to_add %}
{% trans "Please tick a checkbox or enter a quantity for one of the ticket types to add to the cart." as description_nothing_to_add %}
{% dialog "dialog-nothing-to-add" label_nothing_to_add description_nothing_to_add icon="exclamation-circle" %}
<p class="modal-card-confirm"><button class="btn btn-primary">{% trans "OK" %}</button></p>
{% enddialog %}
{% endif %}
{% endif %}
{% endif %}
</main>
@@ -261,7 +252,7 @@
{% if not cart_namespace %}
{% eventsignal event "pretix.presale.signals.front_page_bottom" subevent=subevent request=request %}
<aside class="front-page" aria-labelledby="if-you-already-ordered-a-ticket">
<h3 id="if-you-already-ordered-a-ticket">{% trans "If you have already ordered a ticket" %}</h3>
<h3 id="if-you-already-ordered-a-ticket">{% trans "If you already ordered a ticket" %}</h3>
<div class="row">
<div class="col-md-8 col-xs-12">
<p>
@@ -9,13 +9,14 @@
title="{% trans "View customer account" %}" data-toggle="tooltip">
<span class="fa fa-user" aria-hidden="true"></span>
{{ request.customer.name|default:request.customer.email }}</a>
<a href="{% if request.event_domain %}{% abseventurl request.event "presale:organizer.customer.logout" %}{% else %}{% abseventurl request.organizer "presale:organizer.customer.logout" %}{% endif %}?next={{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}">
<a href="{% if request.event_domain %}{% abseventurl request.event "presale:organizer.customer.logout" %}{% else %}{% abseventurl request.organizer "presale:organizer.customer.logout" %}{% endif %}?next={{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}"
aria-label="{% trans "Log out" %}" data-toggle="tooltip" data-placement="left"
title="{% trans "Log out" %}">
<span class="fa fa-sign-out" aria-hidden="true"></span>
{% trans "Log out" %}
<span class="sr-only">{% trans "Log out" %}</span>
</a>
{% else %}
<a href="{% abseventurl request.organizer "presale:organizer.customer.login" %}{% if request.resolver_match.url_name != "organizer.customer.login" %}?next={% if request.event_domain %}{{ request.scheme }}://{{ request.get_host }}{% endif %}{{ request.path|urlencode }}%3F{{ request.META.QUERY_STRING|urlencode }}{% endif %}{% if request.event_domain %}&request_cross_domain_customer_auth=true{% endif %}">
<span class="fa fa-sign-in" aria-hidden="true"></span>
{% trans "Log in" %}</a>
{% endif %}
@@ -2,8 +2,6 @@
{% load rich_text %}
{% load safelink %}
{% load escapejson %}
{% load icon %}
{% load dialog %}
<div id="ajaxerr">
</div>
<div id="popupmodal" hidden aria-live="polite">
@@ -52,74 +50,89 @@
{{ cookie_consent_from_widget|json_script:"cookie-consent-from-widget" }}
{% endif %}
{% if cookie_providers %}
{% with request.event|default:request.organizer as sh %}
{% dialog "cookie-consent-modal" sh.settings.cookie_consent_dialog_title sh.settings.cookie_consent_dialog_text|rich_text icon="shield" %}
{% if sh.settings.cookie_consent_dialog_text_secondary %}
<div class="text-muted">
{{ sh.settings.cookie_consent_dialog_text_secondary|rich_text }}
</div>
{% endif %}
<details id="cookie-consent-details">
<summary>
<span class="fa fa-fw chevron"></span>
{% trans "Adjust settings in detail" %}
</summary>
<div class="checkbox">
<label>
<input type="checkbox" disabled checked="" aira-describedby="cookie-consent-checkbox-required-description">
{% trans "Required cookies" %}
</label>
</div>
<div class="help-block" id="cookie-consent-checkbox-required-description">
<p>{% trans "Functional cookies (e.g. shopping cart, login, payment, language preference) and technical cookies (e.g. security purposes)" %}</p>
</div>
{% for cp in cookie_providers %}
<div class="checkbox">
<label>
<input type="checkbox" name="{{ cp.identifier }}" aira-describedby="cookie-consent-checkbox-{{ cp.identifier }}-description">
{{ cp.provider_name }}
</label>
</div>
<div class="help-block" id="cookie-consent-checkbox-{{ cp.identifier }}-description">
<p>
{% for c in cp.usage_classes %}
{% if forloop.counter0 > 0 %}&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>
<div id="cookie-consent-modal" aria-live="polite">
<div class="modal-card">
<div class="modal-card-content">
<h3 id="cookie-consent-modal-label"></h3>
<div id="cookie-consent-modal-description">
{% with request.event|default:request.organizer as sh %}
<h3>{{ sh.settings.cookie_consent_dialog_title }}</h3>
{{ sh.settings.cookie_consent_dialog_text|rich_text }}
{% if sh.settings.cookie_consent_dialog_text_secondary %}
<div class="text-muted">
{{ sh.settings.cookie_consent_dialog_text_secondary|rich_text }}
</div>
{% endif %}
</p>
</div>
{% endfor %}
</details>
<p class="modal-card-confirm modal-card-confirm-spread">
<button class="btn btn-lg btn-default" id="cookie-consent-button-no" value="no" autofocus="true"
data-summary-text="{{ sh.settings.cookie_consent_dialog_button_no }}"
data-detail-text="{% trans "Save selection" %}">
{{ sh.settings.cookie_consent_dialog_button_no }}
</button>
<button class="btn btn-lg btn-primary" id="cookie-consent-button-yes" value="yes">
{{ sh.settings.cookie_consent_dialog_button_yes }}
</button>
</p>
{% if sh.settings.privacy_url %}
<p class="text-center">
<small><a href="{% safelink sh.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a></small>
</p>
{% endif %}
{% enddialog %}
{% endwith %}
<details id="cookie-consent-details">
<summary>
<span class="fa fa-fw chevron"></span>
{% trans "Adjust settings in detail" %}
</summary>
<div class="checkbox">
<label>
<input type="checkbox" disabled checked="">
{% trans "Required cookies" %}<br>
<span class="text-muted">
{% trans "Functional cookies (e.g. shopping cart, login, payment, language preference) and technical cookies (e.g. security purposes)" %}
</span>
</label>
</div>
{% for cp in cookie_providers %}
<div class="checkbox">
<label>
<input type="checkbox" name="{{ cp.identifier }}">
{{ cp.provider_name }}<br>
<span class="text-muted">
{% for c in cp.usage_classes %}
{% if forloop.counter0 > 0 %}&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>
</label>
</div>
{% endfor %}
</details>
<div class="row">
<div class="col-xs-12 col-md-6">
<p>
<button type="button" class="btn btn-lg btn-block btn-primary" id="cookie-consent-button-no"
data-summary-text="{{ sh.settings.cookie_consent_dialog_button_no }}"
data-detail-text="{% trans "Save selection" %}">
{{ sh.settings.cookie_consent_dialog_button_no }}
</button>
</p>
</div>
<div class="col-xs-12 col-md-6">
<p>
<button type="button" class="btn btn-lg btn-block btn-primary" id="cookie-consent-button-yes">
{{ sh.settings.cookie_consent_dialog_button_yes }}
</button>
</p>
</div>
</div>
{% if sh.settings.privacy_url %}
<p class="text-center">
<a href="{% safelink sh.settings.privacy_url %}" target="_blank" rel="noopener">{% trans "Privacy policy" %}</a>
</p>
{% endif %}
{% endwith %}
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}
@@ -62,7 +62,7 @@
class="organizer-logo" />
</a>
{% else %}
<h1><a href="{% eventurl organizer "presale:organizer.index" %}" class="no-underline">{{ organizer.name }}</a></h1>
<h1><a href="{% eventurl organizer "presale:organizer.index" %}">{{ organizer.name }}</a></h1>
{% endif %}
</div>
{% if organizer.settings.locales|length > 1 or request.organizer.settings.customer_accounts %}
@@ -14,91 +14,94 @@
</div>
<div class="panel-body">
{% if memberships %}
<div class="event-list full-width-list alternating-rows">
<ul class="full-width-list alternating-rows">
{% for m in memberships %}
<article class="row">
<div class="col-xs-5">
<h4>
{% if m.canceled %}<del>{% endif %}
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
{{ m.membership_type.name }}
</a>
{% if m.canceled %}</del>{% endif %}
{% if m.membership_type.transferable %}
<span class="text-muted" data-toggle="tooltip" title="{% trans "Membership is transferable" %}">
{% icon "users" %}
</span>
<li class="row">
<dl>
<div class="col-xs-5">
<dt>
{% if m.canceled %}<del>{% endif %}
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
{{ m.membership_type.name }}
</a>
{% if m.canceled %}</del>{% endif %}
{% if m.membership_type.transferable %}
<span class="text-muted" data-toggle="tooltip" title="{% trans "Membership is transferable" %}">
{% icon "users" %}
</span>
{% endif %}
</dt>
{% if m.attendee_name %}
<dd class="text-muted">
{% icon "id-badge" %}
<span class="sr-only">{% trans "Attendee name" %}:</span>
{{ m.attendee_name }}
</dd>
{% endif %}
</h4>
{% if m.attendee_name %}
<p class="text-muted">
{% icon "id-badge" %}
<span class="sr-only">{% trans "Attendee name" %}:</span>
{{ m.attendee_name }}
</p>
{% endif %}
<p class="text-muted">
<small>
{% if m.canceled %}
{% textbubble "danger" icon="times" %}
{% trans "Canceled" %}
<dd class="text-muted">
<small>
{% if m.canceled %}
{% textbubble "danger" icon="times" %}
{% trans "Canceled" %}
{% endtextbubble %}
{% elif m.expired %}
{% icon "minus-square-o" %}
{% trans "Expired since" %}
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
</time>
{% elif m.not_yet_valid %}
{% icon "clock-o" %}
{% trans "Valid from" %}
<time datetime="{{ m.date_start|date:"Y-m-d H:i" }}">
{{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
</time>
{% else %}
{% icon "check" %}
{% trans "Valid until" %}
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
</time>
{% endif %}
</small>
</dd>
{% if m.testmode %}
<dd>
<small>
{% textbubble "warning" %}
{% trans "TEST MODE" %}
{% endtextbubble %}
{% elif m.expired %}
{% icon "minus-square-o" %}
{% trans "Expired since" %}
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
</time>
{% elif m.not_yet_valid %}
{% icon "clock-o" %}
{% trans "Valid from" %}
<time datetime="{{ m.date_start|date:"Y-m-d H:i" }}">
{{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
</time>
{% else %}
{% icon "check" %}
{% trans "Valid until" %}
<time datetime="{{ m.date_end|date:"Y-m-d H:i" }}">
{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
</time>
</small>
</dd>
{% endif %}
</small>
</p>
{% if m.testmode %}
<p>
<small>
{% textbubble "warning" %}
{% trans "TEST MODE" %}
{% endtextbubble %}
</small>
</p>
{% endif %}
</div>
<div class="col-xs-5">
<p>
<div class="quotabox full-width">
<div class="progress">
<div class="progress-bar progress-bar-success progress-bar-{{ m.percentage_used }}">
</div>
<div class="col-xs-5">
<dd>
<div class="quotabox full-width">
<div class="progress">
<div class="progress-bar progress-bar-success progress-bar-{{ m.percentage_used }}">
</div>
</div>
<div class="numbers">
{{ m.usages }} /
{{ m.membership_type.max_usages|default_if_none:"∞" }}
</div>
</div>
<div class="numbers">
{{ m.usages }} /
{{ m.membership_type.max_usages|default_if_none:"∞" }}
</div>
</div>
</p>
</div>
<div class="col-xs-2">
<p class="text-right">
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
{% icon "list-ul" %}
{% trans "Details" %}
</a>
</p>
</div>
</article>
</dd>
</div>
<div class="col-xs-2">
<dt class="sr-only">{% trans "Actions" %}</dt>
<dd class="text-right">
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}">
{% icon "list-ul" %}
{% trans "Details" %}
</a>
</dd>
</div>
</dl>
</li>
{% endfor %}
</div>
</ul>
{% else %}
<p class="text-center">{% trans "You dont have any memberships in your account yet." %}</p>
{% endif %}
@@ -15,60 +15,65 @@
</div>
<div class="panel-body">
{% if orders %}
<div class="event-list full-width-list alternating-rows">
<ul class="full-width-list alternating-rows">
{% for o in orders %}
<article class="row">
<div class="col-md-4 col-sm-5 col-xs-8">
<h4><strong>
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}" target="_blank">
{% icon "shopping-cart" %}
{{ o.code }}</a>
</strong>
{% if o.customer_id != customer.pk %}
<span class="text-muted" data-toggle="tooltip"
title="{% trans "Matched to the account based on the email address." %}">
{% icon "compress" %}
</span>
<li class="row">
<dl>
<div class="col-md-4 col-sm-5 col-xs-8">
<dt class="sr-only">{% trans "Order" %}</dt>
<dd><strong>
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}" target="_blank">
{% icon "shopping-cart" %}
{{ o.code }}</a>
</strong>
{% if o.customer_id != customer.pk %}
<span class="text-muted" data-toggle="tooltip"
title="{% trans "Matched to the account based on the email address." %}">
{% icon "compress" %}
</span>
{% endif %}
<small>{% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}</small>
</dd>
<dd><time datetime="{{ o.datetime|date:"Y-m-d H:i" }}" class="text-muted small">{{ o.datetime|date:"SHORT_DATETIME_FORMAT" }}</time></dd>
{% if o.testmode %}
<dd>
<small>
{% textbubble "warning" %}
{% trans "TEST MODE" %}
{% endtextbubble %}
</small>
</dd>
{% endif %}
<small>{% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}</small>
</h4>
<p><time datetime="{{ o.datetime|date:"Y-m-d H:i" }}" class="text-muted small">{{ o.datetime|date:"SHORT_DATETIME_FORMAT" }}</time></p>
{% if o.testmode %}
<p>
<small>
{% textbubble "warning" %}
{% trans "TEST MODE" %}
{% endtextbubble %}
</small>
</p>
{% endif %}
</div>
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
<p>
{{ o.total|money:o.event.currency }}
<br><span class="text-muted"><small>{% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}</small>
</span>
</p>
</div>
<div class="col-md-4 col-sm-3 col-xs-8">
<p>
{{ o.event }}
{% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
<br><small class="text-muted">{{ o.event.get_date_range_display }}</small>
{% endif %}
</p>
</div>
<div class="col-sm-2 col-xs-4">
<p class="text-right">
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}"
target="_blank">
{% icon "list-ul" %}
{% trans "Details" %}
</a></p>
</div>
</article>
</div>
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
<dt class="sr-only">{% trans "Order total" %}</dt>
<dd>{{ o.total|money:o.event.currency }}</dd>
<dt class="sr-only">{% trans "Positions" %}</dt>
<dd class="text-muted"><small>{% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}</small>
</dd>
</div>
<div class="col-md-4 col-sm-3 col-xs-8">
<dt class="sr-only">{% trans "Event" %}</dt>
<dd>
{{ o.event }}
{% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
<br><small class="text-muted">{{ o.event.get_date_range_display }}</small>
{% endif %}
</dd>
</div>
<div class="col-sm-2 col-xs-4">
<dt class="sr-only">{% trans "Actions" %}</dt>
<dd class="text-right">
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}"
target="_blank">
{% icon "list-ul" %}
{% trans "Details" %}
</a></dd>
</div>
</dl>
</li>
{% endfor %}
</div>
</ul>
{% else %}
<p class="text-center">{% trans "You dont have any orders in your account yet." %}</p>
{% endif %}
@@ -46,11 +46,11 @@
{% endif %}
{% if events %}
<div class="panel-body">
<div class="event-list full-width-list alternating-rows">
<dl class="full-width-list alternating-rows">
{% for e in events %}{% eventurl e "presale:event.index" as url %}
<article class="row" aria-labelledby="event-{{ e.pk }}-label" aria-describedby="event-{{ e.pk }}-desc">
<h3 class="col-md-4 col-xs-12"><a href="{{ url }}" id="event-{{ e.pk }}-label" class="no-underline">{{ e.name }}</a></h3>
<p class="col-md-3 col-xs-12" id="event-{{ e.pk }}-desc">
<div class="row">
<dt class="col-md-4 col-xs-12"><a href="{{ url }}">{{ e.name }}</a></dt>
<dd class="col-md-3 col-xs-12">
{% if e.settings.show_dates_on_frontpage %}
{% if e.has_subevents %}
{% icon "calendar" %} {% trans "Multiple dates" context "subevent" %}
@@ -78,13 +78,13 @@
{% else %}
&nbsp;
{% endif %}
</p>
<p class="col-md-3 col-xs-6">
</dd>
<dd class="col-md-3 col-xs-6">
<small>
{% include "pretixpresale/fragment_event_list_status.html" with event=e %}
</small>
</p>
<p class="col-md-2 col-xs-6 text-right flip">
</dd>
<dd class="col-md-2 col-xs-6 text-right flip">
<a class="btn btn-primary btn-block" href="{{ url }}{% if e.has_subevents and e.match_by_subevents %}{{ filterquery }}{% endif %}">
{% if e.has_subevents %}{% icon "ticket" %} {% trans "Tickets" %}
{% elif e.presale_is_running and e.best_availability_state == 100 %}
@@ -93,10 +93,10 @@
{% icon "info" %} {% trans "More info" %}
{% endif %}
</a>
</p>
</article>
</dd>
</div>
{% endfor %}
</div>
</dl>
</div>
<hr>
{% endif %}
-1
View File
@@ -56,7 +56,6 @@ frame_wrapped_urls = [
re_path(r'^cart/remove$', pretix.presale.views.cart.CartRemove.as_view(), name='event.cart.remove'),
re_path(r'^cart/voucher$', pretix.presale.views.cart.CartApplyVoucher.as_view(), name='event.cart.voucher'),
re_path(r'^cart/clear$', pretix.presale.views.cart.CartClear.as_view(), name='event.cart.clear'),
re_path(r'^cart/extend$', pretix.presale.views.cart.CartExtendReservation.as_view(), name='event.cart.extend'),
re_path(r'^cart/answer/(?P<answer>[^/]+)/$',
pretix.presale.views.cart.AnswerDownload.as_view(),
name='event.cart.download.answer'),
+1 -15
View File
@@ -62,7 +62,7 @@ from pretix.base.models import (
)
from pretix.base.services.cart import (
CartError, add_items_to_cart, apply_voucher, clear_cart, error_messages,
extend_cart_reservation, remove_cart_position,
remove_cart_position,
)
from pretix.base.timemachine import time_machine_now
from pretix.base.views.tasks import AsyncAction
@@ -537,20 +537,6 @@ class CartClear(EventViewMixin, CartActionMixin, AsyncAction, View):
request.sales_channel.identifier, time_machine_now(default=None))
@method_decorator(allow_frame_if_namespaced, 'dispatch')
class CartExtendReservation(EventViewMixin, CartActionMixin, AsyncAction, View):
task = extend_cart_reservation
known_errortypes = ['CartError']
def get_success_message(self, value):
if value > 0:
return _('Your cart timeout was extended.')
def post(self, request, *args, **kwargs):
return self.do(self.request.event.id, get_or_create_cart_id(self.request), translation.get_language(),
request.sales_channel.identifier, time_machine_now(default=None))
@method_decorator(allow_cors_if_namespaced, 'dispatch')
@method_decorator(allow_frame_if_namespaced, 'dispatch')
@method_decorator(iframe_entry_view_wrapper, 'dispatch')
+44 -9
View File
@@ -1452,7 +1452,7 @@ if (typeof jQuery === 'undefined') {
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
trigger: 'hover focus',
title: '',
delay: 0,
delay: 1,
html: false,
container: false,
viewport: {
@@ -1464,6 +1464,14 @@ if (typeof jQuery === 'undefined') {
whiteList : DefaultWhitelist
}
Tooltip.activeTooltip = null;
function hideOnEscapeListener(e) {
if (Tooltip.activeTooltip && e.key === 'Escape') {
Tooltip.activeTooltip.hide();
}
}
Tooltip.prototype.init = function (type, element, options) {
this.enabled = true
this.type = type
@@ -1476,6 +1484,8 @@ if (typeof jQuery === 'undefined') {
throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
}
document.body.addEventListener('keyup', hideOnEscapeListener);
var triggers = this.options.trigger.split(' ')
for (var i = triggers.length; i--;) {
@@ -1483,7 +1493,7 @@ if (typeof jQuery === 'undefined') {
if (trigger == 'click') {
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
} else if (trigger != 'manual') {
} else if (trigger == 'hover' || trigger == 'focus') {
var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
@@ -1547,7 +1557,8 @@ if (typeof jQuery === 'undefined') {
}
if (obj instanceof $.Event) {
self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
console.log("enter",obj.currentTarget.role, obj.type, obj.currentTarget)
self.inState[(obj.currentTarget.role == 'tooltip' ? 'tip' : '') + (obj.type == 'focusin' ? 'focus' : 'hover')] = true
}
if (self.tip().hasClass('in') || self.hoverState == 'in') {
@@ -1567,6 +1578,7 @@ if (typeof jQuery === 'undefined') {
}
Tooltip.prototype.isInStateTrue = function () {
console.log("state:",this.inState)
for (var key in this.inState) {
if (this.inState[key]) return true
}
@@ -1584,7 +1596,8 @@ if (typeof jQuery === 'undefined') {
}
if (obj instanceof $.Event) {
self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
console.log("leave",obj.currentTarget.role, obj.type, obj.currentTarget)
self.inState[(obj.currentTarget.role == 'tooltip' ? 'tip' : '') + (obj.type == 'focusout' ? 'focus' : 'hover')] = false
}
if (self.isInStateTrue()) return
@@ -1610,6 +1623,12 @@ if (typeof jQuery === 'undefined') {
if (e.isDefaultPrevented() || !inDom) return
var that = this
if (Tooltip.activeTooltip) {
Tooltip.activeTooltip.hide();
}
Tooltip.activeTooltip = this;
var $tip = this.tip()
var tipId = this.getUID(this.type)
@@ -1768,6 +1787,8 @@ if (typeof jQuery === 'undefined') {
if (e.isDefaultPrevented()) return
Tooltip.activeTooltip = null;
$tip.removeClass('in')
$.support.transition && $tip.hasClass('fade') ?
@@ -1812,12 +1833,12 @@ if (typeof jQuery === 'undefined') {
return $.extend({}, elRect, scroll, outerDims, elOffset)
}
const OVERLAP = 3;
Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
return placement == 'bottom' ? { top: pos.top + pos.height - OVERLAP, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'top' ? { top: pos.top - actualHeight + OVERLAP, left: pos.left + pos.width / 2 - actualWidth / 2 } :
placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2 , left: pos.left - actualWidth + OVERLAP } :
/* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width - OVERLAP }
}
@@ -1872,6 +1893,20 @@ if (typeof jQuery === 'undefined') {
if (this.$tip.length != 1) {
throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
}
var triggers = this.options.trigger.split(' ')
for (var i = triggers.length; i--;) {
var trigger = triggers[i]
if (trigger == 'tiphover' || trigger == 'tipfocus') {
var eventIn = trigger == 'tiphover' ? 'mouseenter' : 'focusin'
var eventOut = trigger == 'tiphover' ? 'mouseleave' : 'focusout'
this.$tip.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
this.$tip.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
}
}
}
return this.$tip
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 B

+2 -2
View File
@@ -49,7 +49,7 @@ html.rtl {
}
input[lang=ar], textarea[lang=ar], div[lang=ar], pre[lang=ar],
input[lang=he], textarea[lang=he], div[lang=he], pre[lang=he] {
input[lang=hw], textarea[lang=hw], div[lang=hw], pre[lang=hw] {
/* Keep list of languages in sync with pretix._base_settings.LANGUAGES_RTL */
direction: rtl;
}
}
@@ -262,95 +262,3 @@ svg.svg-icon {
@include table-row-variant('info', var(--pretix-brand-info-success-lighten-30), var(--pretix-brand-info-success-lighten-25));
@include table-row-variant('warning', var(--pretix-brand-warning-lighten-40), var(--pretix-brand-warning-lighten-35));
@include table-row-variant('danger', var(--pretix-brand-danger-lighten-30), var(--pretix-brand-danger-lighten-25));
dialog {
border: none;
width: 80%;
max-width: 43em;
padding: 0;
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
background: white;
border-radius: $border-radius-large;
opacity: 0;
transition: opacity .5s allow-discrete;
.modal-card {
display: flex;
flex-direction: column;
align-content: stretch;
}
.modal-card-icon {
background: $brand-primary;
font-size: 2em;
color: white;
text-align: center;
padding: 3px;
}
.modal-card-content {
padding: 1.5em;
}
.modal-card-content>*:last-child {
margin-bottom: 0;
}
.modal-card-content>*:first-child {
margin-top: 0;
}
.modal-card-confirm {
margin-top: 2em;
display: flex;
justify-content: flex-end;
gap: 1em;
align-items: center;
}
.modal-card-confirm-spread {
justify-content: space-between;
}
}
dialog::backdrop {
background-color: rgba(255, 255, 255, .5);
opacity: 0;
transition: opacity .5s allow-discrete;
}
dialog[open], dialog[open]::backdrop {
opacity: 1;
}
@starting-style {
dialog[open], dialog[open]::backdrop {
opacity: 0;
}
}
@media screen and (min-width: $screen-sm-min) {
dialog {
.modal-card:has(.modal-card-icon) {
flex-direction: row;
}
.modal-card-content {
padding: 2em;
}
.modal-card-icon {
font-size: 4em;
padding: 6px 16px;
}
}
}
.shake-once {
animation: shake .2s;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
}
@keyframes shake {
0% { transform: skewX(0deg); }
20% { transform: skewX(-5deg); }
40% { transform: skewX(5deg); }
60% { transform: skewX(-5deg); }
80% { transform: skewX(5deg); }
100% { transform: skewX(0deg); }
}
+11 -12
View File
@@ -277,8 +277,7 @@ var form_handlers = function (el) {
fill_field.on("dp.show", show);
});
function luminance(r, g, b) {
// Algorithm defined as https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
function luminanace(r, g, b) {
var a = [r, g, b].map(function (v) {
v /= 255;
return v <= 0.03928
@@ -288,9 +287,8 @@ var form_handlers = function (el) {
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
}
function contrast(rgb1, rgb2) {
// Algorithm defined at https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
var l1 = luminance(rgb1[0], rgb1[1], rgb1[2]) + 0.05,
l2 = luminance(rgb2[0], rgb2[1], rgb2[2]) + 0.05,
var l1 = luminanace(rgb1[0], rgb1[1], rgb1[2]) + 0.05,
l2 = luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05,
ratio = l1/l2
if (l2 > l1) {ratio = 1/ratio}
return ratio.toFixed(1)
@@ -329,15 +327,15 @@ var form_handlers = function (el) {
var icon, text, cls;
if (c > 7) {
icon = "fa-check-circle";
text = gettext('Your color has great contrast and will provide excellent accessibility.');
text = gettext('Your color has great contrast and is very easy to read!');
cls = "text-success";
} else if (c > 4.5) {
} else if (c > 2.5) {
icon = "fa-info-circle";
text = gettext('Your color has decent contrast and is sufficient for minimum accessibility requirements.');
text = gettext('Your color has decent contrast and is probably good-enough to read!');
cls = "";
} else {
icon = "fa-warning";
text = gettext('Your color has insufficient contrast to white. Accessibility of your site will be impacted.');
text = gettext('Your color has bad contrast for text on white background, please choose a darker shade.');
cls = "text-danger";
}
if ($icon.length === 0) {
@@ -797,9 +795,10 @@ function setup_basics(el) {
});
});
el.find('[data-toggle="tooltip"]').tooltip();
el.find('[data-toggle="tooltip"]').tooltip({ delay: 1, trigger: 'focus hover tipfocus tiphover' })
.filter(':not([tabindex])').attr('tabindex', '0');
el.find('[data-toggle="tooltip_html"]').tooltip({
'html': true,
'html': true, delay: 1, trigger: 'focus hover tipfocus tiphover',
'whiteList': {
// Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role'],
@@ -814,7 +813,7 @@ function setup_basics(el) {
strong: [],
u: [],
}
});
}).filter(':not([tabindex])').attr('tabindex', '0');
el.find('a.pagination-selection').click(function (e) {
e.preventDefault();
@@ -160,7 +160,7 @@ pre[lang=ht], input[lang=ht], textarea[lang=ht], div[lang=ht] { background-image
pre[lang=hu], input[lang=hu], textarea[lang=hu], div[lang=hu] { background-image: url(static('pretixbase/img/flags/hu.png')); }
pre[lang=id], input[lang=id], textarea[lang=id], div[lang=id] { background-image: url(static('pretixbase/img/flags/id.png')); }
pre[lang=ie], input[lang=ie], textarea[lang=ie], div[lang=ie] { background-image: url(static('pretixbase/img/flags/ie.png')); }
pre[lang=he], input[lang=he], textarea[lang=he], div[lang=he] { background-image: url(static('pretixbase/img/flags/il.png')); }
pre[lang=il], input[lang=il], textarea[lang=il], div[lang=il] { background-image: url(static('pretixbase/img/flags/il.png')); }
pre[lang=in], input[lang=in], textarea[lang=in], div[lang=in] { background-image: url(static('pretixbase/img/flags/in.png')); }
pre[lang=io], input[lang=io], textarea[lang=io], div[lang=io] { background-image: url(static('pretixbase/img/flags/io.png')); }
pre[lang=iq], input[lang=iq], textarea[lang=iq], div[lang=iq] { background-image: url(static('pretixbase/img/flags/iq.png')); }
@@ -306,4 +306,3 @@ pre[lang=za], input[lang=za], textarea[lang=za], div[lang=za] { background-image
pre[lang=zm], input[lang=zm], textarea[lang=zm], div[lang=zm] { background-image: url(static('pretixbase/img/flags/zm.png')); }
pre[lang=zw], input[lang=zw], textarea[lang=zw], div[lang=zw] { background-image: url(static('pretixbase/img/flags/zw.png')); }
pre[lang=en], input[lang=en], textarea[lang=en], div[lang=en] { background-image: url(static('pretixbase/img/flags/gb.png')); }
pre[lang=eu], input[lang=eu], textarea[lang=eu], div[lang=eu] { background-image: url(static('pretixbase/img/flags/basque.png')); }
@@ -55,7 +55,6 @@ var cart = {
pad(diff_minutes.toString(), 2) + ':' + pad(diff_seconds.toString(), 2)
);
}
$("#cart-extend-button").toggle(diff_minutes < 3);
},
init: function () {
@@ -6,7 +6,7 @@ $(function () {
var storage_key = $("#cookie-consent-storage-key").text();
var widget_consent = $("#cookie-consent-from-widget").text();
var consent_checkboxes = $("#cookie-consent-details input[type=checkbox][name]");
var consent_modal = document.getElementById("cookie-consent-modal");
var consent_modal = $("#cookie-consent-modal");
function update_consent(consent, sessionOnly) {
if (storage_key && window.sessionStorage && sessionOnly) {
@@ -108,32 +108,25 @@ $(function () {
_set_button_text();
if (show_dialog) {
consent_modal.showModal();
consent_modal.addEventListener("cancel", function() {
// Dialog was initially shown, interpret Escape as „do not consent to new providers“
var consent = {};
consent_checkboxes.each(function () {
consent[this.name] = storage_val[this.name] || false;
});
update_consent(consent, false);
}, {once : true});
// We use .css() instead of .show() because of some weird issue that only occurs in Firefox
// and only within the widget.
consent_modal.css("display", "block");
}
consent_modal.addEventListener("close", function () {
if (!consent_modal.returnValue) {// ESC, do not save
return;
}
$("#cookie-consent-button-yes, #cookie-consent-button-no").on("click", function () {
consent_modal.hide();
var consent = {};
var consent_all = consent_modal.returnValue == "yes";
var consent_all = this.id == "cookie-consent-button-yes";
consent_checkboxes.each(function () {
consent[this.name] = this.checked = consent_all || this.checked;
});
if (consent_all) _set_button_text();
// Always save explicit consent to permanent storage
update_consent(consent, false);
});
consent_checkboxes.on("change", _set_button_text);
$("#cookie-consent-reopen").on("click", function (e) {
consent_modal.showModal()
consent_modal.show()
e.preventDefault()
return true
})
+29 -21
View File
@@ -307,6 +307,9 @@ function setup_basics(el) {
e.preventDefault();
});
el.find('[data-toggle="tooltip"]').tooltip({ delay: 1, trigger: 'focus hover tipfocus tiphover' })
.filter(':not([tabindex])').attr('tabindex', '0');
// AddOns
el.find('.addon-variation-description').hide();
el.find('.toggle-variation-description').click(function () {
@@ -390,13 +393,6 @@ $(function () {
sessionStorage.removeItem('scrollpos');
}
$("dialog").on("mousedown", function (e) {
if (e.target == this) {
// dialog has no padding, so this triggers only onclick on backdrop
this.close();
}
});
$(".accordion-radio").click(function() {
var $input = $("input", this);
if (!$input.prop("checked")) $input.prop('checked', true).trigger("change");
@@ -485,21 +481,33 @@ $(function () {
sessionStorage.setItem('scrollpos', window.scrollY);
});
}
$("form:has(#btn-add-to-cart)").on("submit", function(e) {
if (
(this.classList.contains("has-seating") && this.querySelector("pretix-seating-checkout-button button")) ||
this.querySelector("input[type=checkbox]:checked") ||
[...this.querySelectorAll(".input-item-count[type=text]")].some(input => input.value && input.value !== "0") // TODO: seating hat noch einen seating-dummy-item-count, das ist Mist!
) {
// okay, let the submit-event bubble to async-task
return;
var update_cart_form = function () {
var is_enabled = $(".product-row input[type=checkbox]:checked, .variations input[type=checkbox]:checked, .product-row input[type=radio]:checked, .variations input[type=radio]:checked").length;
if (!is_enabled) {
$(".input-item-count").each(function () {
if ($(this).val() && $(this).val() !== "0") {
is_enabled = true;
}
});
$(".input-seat-selection option").each(function() {
if ($(this).val() && $(this).val() !== "" && $(this).prop('selected')) {
is_enabled = true;
}
});
}
e.preventDefault();
e.stopPropagation();
document.querySelector("#dialog-nothing-to-add").showModal();
});
if (!is_enabled && (!$(".has-seating").length || $("#seating-dummy-item-count").length)) {
$("#btn-add-to-cart").prop("disabled", !is_enabled).popover({
'content': function () { return gettext("Please enter a quantity for one of the ticket types.") },
'placement': 'top',
'trigger': 'hover focus'
});
} else {
$("#btn-add-to-cart").prop("disabled", false).popover("destroy")
}
};
update_cart_form();
$(".product-row input[type=checkbox], .variations input[type=checkbox], .product-row input[type=radio], .variations input[type=radio], .input-item-count, .input-seat-selection")
.on("change mouseup keyup", update_cart_form);
$(".table-calendar td.has-events").click(function () {
var $grid = $(this).closest("[role='grid']");
@@ -471,7 +471,7 @@ Vue.component('variation', {
// Variation description
+ '<div class="pretix-widget-item-info-col">'
+ '<div class="pretix-widget-item-title-and-description">'
+ '<strong :id="variation_label_id" class="pretix-widget-item-title" role="heading" v-bind:aria-level="headingLevel">{{ variation.value }}</strong>'
+ '<strong :id="variation_label_id" class="pretix-widget-item-title">{{ variation.value }}</strong>'
+ '<div :id="variation_desc_id" class="pretix-widget-item-description" v-if="variation.description" v-html="variation.description"></div>'
+ '<p class="pretix-widget-item-meta" '
+ ' v-if="!variation.has_variations && variation.avail[1] !== null && variation.avail[0] === 100">'
@@ -500,7 +500,6 @@ Vue.component('variation', {
props: {
variation: Object,
item: Object,
category: Object,
},
computed: {
orig_price: function () {
@@ -524,9 +523,6 @@ Vue.component('variation', {
aria_labelledby: function () {
return [this.variation_label_id, this.variation_price_id].join(" ");
},
headingLevel: function () {
return this.category.name ? '5' : '4';
},
}
});
Vue.component('item', {
@@ -537,12 +533,12 @@ Vue.component('item', {
+ '<div class="pretix-widget-item-info-col">'
+ '<a :href="item.picture_fullsize" v-if="item.picture" class="pretix-widget-item-picture-link" @click.prevent.stop="lightbox"><img :src="item.picture" class="pretix-widget-item-picture" :alt="picture_alt_text"></a>'
+ '<div class="pretix-widget-item-title-and-description">'
+ '<a v-if="item.has_variations && show_toggle" :id="item_label_id" role="heading" v-bind:aria-level="headingLevel" class="pretix-widget-item-title" :href="\'#\' + item.id + \'-variants\'"'
+ '<a v-if="item.has_variations && show_toggle" :id="item_label_id" class="pretix-widget-item-title" :href="\'#\' + item.id + \'-variants\'"'
+ ' @click.prevent.stop="expand"'
+ '>'
+ '{{ item.name }}'
+ '</a>'
+ '<strong v-else class="pretix-widget-item-title" :id="item_label_id" role="heading" v-bind:aria-level="headingLevel">{{ item.name }}</strong>'
+ '<strong v-else class="pretix-widget-item-title" :id="item_label_id">{{ item.name }}</strong>'
+ '<div class="pretix-widget-item-description" :id="item_desc_id" v-if="item.description" v-html="item.description"></div>'
+ '<p class="pretix-widget-item-meta" v-if="item.order_min && item.order_min > 1">'
+ '<small>{{ min_order_str }}</small>'
@@ -576,14 +572,13 @@ Vue.component('item', {
// Variations
+ '<div :class="varClasses" v-if="item.has_variations" :id="item.id + \'-variants\'" ref="variations">'
+ '<variation v-for="variation in item.variations" :variation="variation" :item="item" :category="category" :key="variation.id">'
+ '<variation v-for="variation in item.variations" :variation="variation" :item="item" :key="variation.id">'
+ '</variation>'
+ '</div>'
+ '</div>'),
props: {
item: Object,
category: Object,
},
data: function () {
return {
@@ -641,9 +636,6 @@ Vue.component('item', {
picture_alt_text: function () {
return django.interpolate(strings["image_of"], [this.item.name]);
},
headingLevel: function () {
return this.category.name ? '4' : '3';
},
item_label_id: function () {
return this.$root.html_id + '-item-label-' + this.item.id;
},
@@ -695,7 +687,7 @@ Vue.component('category', {
+ '<div class="pretix-widget-category-description" v-if="category.description" v-html="category.description">'
+ '</div>'
+ '<div class="pretix-widget-category-items">'
+ '<item v-for="item in category.items" :category="category" :item="item" :key="item.id"></item>'
+ '<item v-for="item in category.items" :item="item" :key="item.id"></item>'
+ '</div>'
+ '</div>'),
props: {
@@ -1010,7 +1002,7 @@ Vue.component('pretix-widget-event-form', {
// Event name
+ '<div class="pretix-widget-event-header" v-if="display_event_info">'
+ '<strong role="heading" aria-level="2">{{ $root.name }}</strong>'
+ '<strong>{{ $root.name }}</strong>'
+ '</div>'
// Date range
@@ -1408,7 +1400,7 @@ Vue.component('pretix-widget-event-week-cell', {
});
Vue.component('pretix-widget-event-calendar-cell', {
template: ('<td :class="classObject" :role="role" :tabindex="tabindex" v-bind:aria-label="date">'
template: ('<td :class="classObject" @click.prevent.stop="selectDay">'
+ '<div class="pretix-widget-event-calendar-day" v-if="day" v-bind:aria-label="date">'
+ '{{ daynum }}'
+ '</div>'
@@ -1420,12 +1412,10 @@ Vue.component('pretix-widget-event-calendar-cell', {
day: Object,
},
methods: {
selectDay: function (e) {
selectDay: function () {
if (!this.day || !this.day.events.length || !this.$parent.$parent.$parent.mobile) {
return;
}
e.preventDefault();
e.stopPropagation();
if (this.day.events.length === 1) {
var ev = this.day.events[0];
this.$root.parent_stack.push(this.$root.target_url);
@@ -1438,40 +1428,9 @@ Vue.component('pretix-widget-event-calendar-cell', {
this.$root.events = this.day.events;
this.$root.view = "events";
}
},
onKeyDown: function (e) {
var keyDown = e.key !== undefined ? e.key : e.keyCode;
if ( (keyDown === 'Enter' || keyDown === 13) || (['Spacebar', ' '].indexOf(keyDown) >= 0 || keyDown === 32)) {
// (prevent default so the page doesn't scroll when pressing space)
e.preventDefault();
this.selectDay(e);
}
},
},
mounted: function () {
if (this.role == 'button') {
this.$el.addEventListener("click", this.selectDay);
this.$el.addEventListener("keydown", this.onKeyDown);
}
},
watch: {
role: function (newValue) {
if (newValue == 'button') {
this.$el.addEventListener("click", this.selectDay);
this.$el.addEventListener("keydown", this.onKeyDown);
} else {
this.$el.removeEventListener("click", this.selectDay);
this.$el.removeEventListener("keydown", this.onKeyDown);
}
}
},
computed: {
role: function () {
return (!this.day || !this.day.events.length || !this.$parent.$parent.$parent.mobile) ? 'cell' : 'button';
},
tabindex: function () {
return this.role == 'button' ? '0' : '-1';
},
daynum: function () {
if (!this.day) {
return;
@@ -53,15 +53,6 @@ a.btn, button.btn {
}
}
}
.checkbox + .help-block {
padding-left: 20px;
margin-top: 0;
margin-bottom: 0;
p {
margin-bottom: 0;
}
}
output {
padding-top: $padding-base-vertical;
}
+17 -30
View File
@@ -76,7 +76,6 @@ html {
clip: auto;
}
#skip-to-main {
z-index: 9999;
/* padding is needed to make focus-outline visible */
padding: 8px;
background-color: inherit;
@@ -109,22 +108,7 @@ pre {
font-size: $font-size-base;
}
/* make all links in textflow underlined */
h1, h2, h3, h4, h5, h6, p, li {
a:not(.btn) {
text-decoration: underline;
}
}
a.no-underline:link, nav li a:link {
text-decoration: none;
}
a.no-underline:hover, nav li a:hover {
text-decoration: underline;
}
.help-block a {
color: inherit;
}
/* See https://github.com/pretix/pretix/pull/761 */
@@ -157,7 +141,6 @@ button:focus, a:focus, .btn:focus, summary:focus, div:focus,
button:active:focus, a:active:focus, .btn:active:focus, summary:active:focus, div:active:focus,
button.active:focus, a.active:focus, .btn.active:focus,
input:focus, .form-control:focus, .btn-checkbox:has(input:focus),
input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus,
.input-item-count-group:has(input:focus), .input-group-price:has(input:focus) {
outline: 2px solid $link-hover-color;
outline-offset: 2px;
@@ -291,7 +274,7 @@ body.loading .container {
font-size: 120px;
color: $brand-primary;
}
#loadingmodal, #ajaxerr, #popupmodal {
#loadingmodal, #ajaxerr, #cookie-consent-modal, #popupmodal {
position: fixed;
top: 0;
left: 0;
@@ -361,7 +344,7 @@ body.loading .container {
}
}
@media (max-width: 700px) {
#loadingmodal, #ajaxerr, #popupmodal {
#loadingmodal, #ajaxerr, #cookie-consent-modal, #popupmodal {
.modal-card {
margin: 25px auto 0;
max-height: calc(100vh - 50px - 20px);
@@ -610,18 +593,22 @@ h2 .label {
display: none !important;
}
.event-list.full-width-list {
h3, h4, p {
margin-top: 0;
margin-bottom: 0;
.event-list {
margin-bottom: 15px;
border-top: 1px solid $table-border-color;
.row {
margin-left: 0;
margin-right: 0;
padding-top: 5px;
padding-bottom: 5px;
border-bottom: 1px solid $table-border-color;
border-left: 1px solid $table-border-color;
border-right: 1px solid $table-border-color;
}
h3, h4 {
font-size: 1em;
line-height: 1.25rem;
font-weight: bold;
}
h4 small {
font-size: 85%;
.row > div {
padding-top: 5px;
padding-bottom: 5px;
}
}
File diff suppressed because it is too large Load Diff