Compare commits

..

1 Commits

Author SHA1 Message Date
Raphael Michel
58a0791770 Do not allow to bulk-set empty names for subevents (Z#23194943) 2025-05-30 12:55:22 +02:00
19 changed files with 335 additions and 368 deletions

View File

@@ -19,4 +19,4 @@
# 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/>.
#
__version__ = "2025.6.0.dev0"
__version__ = "2025.5.0.dev0"

View File

@@ -182,13 +182,7 @@ class NamePartsWidget(forms.MultiWidget):
if self.field.required:
these_attrs['required'] = 'required'
these_attrs.pop('data-no-required-attr', None)
autofill_section = self.attrs.get('autocomplete', '')
autofill_by_name_scheme = self.autofill_map.get(self.scheme['fields'][i][0], 'off')
if autofill_by_name_scheme == "off" or autofill_section.strip() == "off":
these_attrs['autocomplete'] = "off"
else:
these_attrs['autocomplete'] = (autofill_section + ' ' + autofill_by_name_scheme).strip()
these_attrs['autocomplete'] = (self.attrs.get('autocomplete', '') + ' ' + self.autofill_map.get(self.scheme['fields'][i][0], 'off')).strip()
these_attrs['data-size'] = self.scheme['fields'][i][2]
if len(self.widgets) > 1:
these_attrs['aria-label'] = self.scheme['fields'][i][1]
@@ -994,11 +988,7 @@ class BaseQuestionsForm(forms.Form):
for k, v in self.fields.items():
if v.widget.attrs.get('autocomplete') or k == 'attendee_name_parts':
autocomplete = v.widget.attrs.get('autocomplete', '')
if autocomplete.strip() == "off":
v.widget.attrs['autocomplete'] = 'off'
else:
v.widget.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + autocomplete
v.widget.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + v.widget.attrs.get('autocomplete', '')
def clean(self):
from pretix.base.addressvalidation import \
@@ -1212,11 +1202,7 @@ class BaseInvoiceAddressForm(forms.ModelForm):
for k, v in self.fields.items():
if v.widget.attrs.get('autocomplete') or k == 'name_parts':
autocomplete = v.widget.attrs.get('autocomplete', '')
if autocomplete.strip() == "off":
v.widget.attrs['autocomplete'] = 'off'
else:
v.widget.attrs['autocomplete'] = 'section-invoice billing ' + autocomplete
v.widget.attrs['autocomplete'] = 'section-invoice billing ' + v.widget.attrs.get('autocomplete', '')
def clean(self):
from pretix.base.addressvalidation import \

View File

@@ -43,6 +43,7 @@ from zoneinfo import ZoneInfo
from django import forms
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.db import transaction
from django.dispatch import receiver
@@ -92,73 +93,15 @@ class PaymentProviderForm(Form):
cleaned_data = super().clean()
for k, v in self.fields.items():
val = cleaned_data.get(k)
if hasattr(v, '_required') and v._required and not val:
if v._required and not val:
self.add_error(k, _('This field is required.'))
return cleaned_data
class GiftCardPaymentForm(PaymentProviderForm):
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
self.testmode = kwargs.pop('testmode')
self.positions = kwargs.pop('positions')
self.used_cards = kwargs.pop('used_cards')
super().__init__(*args, **kwargs)
def clean(self):
cleaned_data = super().clean()
if "code" not in cleaned_data:
return cleaned_data
code = cleaned_data["code"].strip()
msg = ""
for p in self.positions:
if p.item.issue_giftcard:
msg = _("You cannot pay with gift cards when buying a gift card.")
self.add_error('code', msg)
return cleaned_data
try:
event = self.event
gc = event.organizer.accepted_gift_cards.get(
secret=code
)
if gc.currency != event.currency:
msg = _("This gift card does not support this currency.")
elif gc.testmode and not self.testmode:
msg = _("This gift card can only be used in test mode.")
elif not gc.testmode and self.testmode:
msg = _("Only test gift cards can be used in test mode.")
elif gc.expires and gc.expires < time_machine_now():
msg = _("This gift card is no longer valid.")
elif gc.value <= Decimal("0.00"):
msg = _("All credit on this gift card has been used.")
if msg:
self.add_error('code', msg)
return cleaned_data
if gc.pk in self.used_cards:
self.add_error('code', _("This gift card is already used for your payment."))
return cleaned_data
except GiftCard.DoesNotExist:
if event.vouchers.filter(code__iexact=code).exists():
msg = _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
"the product selection.")
self.add_error('code', msg)
else:
msg = _("This gift card is not known.")
self.add_error('code', msg)
except GiftCard.MultipleObjectsReturned:
msg = _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event.")
self.add_error('code', msg)
return cleaned_data
class BasePaymentProvider:
"""
This is the base class for all payment providers.
"""
payment_form_template_name = 'pretixpresale/event/checkout_payment_form_default.html'
def __init__(self, event: Event):
self.event = event
@@ -751,7 +694,7 @@ class BasePaymentProvider:
:param order: Only set when this is a change to a new payment method for an existing order.
"""
form = self.payment_form(request)
template = get_template(self.payment_form_template_name)
template = get_template('pretixpresale/event/checkout_payment_form_default.html')
ctx = {'request': request, 'form': form}
return template.render(ctx)
@@ -1375,49 +1318,6 @@ class GiftCardPayment(BasePaymentProvider):
multi_use_supported = True
execute_payment_needs_user = False
verbose_name = _("Gift card")
payment_form_class = GiftCardPaymentForm
payment_form_template_name = 'pretixcontrol/giftcards/checkout.html'
def payment_form(self, request: HttpRequest) -> Form:
# Unfortunately, in payment_form we do not know if we're in checkout
# or in an existing order. But we need to do the validation logic in the
# form to get the error messages in the right places for accessbility :-(
if 'checkout' in request.resolver_match.url_name:
cs = cart_session(request)
used_cards = [
p.get('info_data', {}).get('gift_card')
for p in cs.get('payments', [])
if p.get('info_data', {}).get('gift_card')
]
positions = get_cart(request)
testmode = self.event.testmode
else:
used_cards = []
order = self.event.orders.get(code=request.resolver_match.kwargs["order"])
positions = order.positions.all()
testmode = order.testmode
form = self.payment_form_class(
event=self.event,
used_cards=used_cards,
positions=positions,
testmode=testmode,
data=(request.POST if request.method == 'POST' and request.POST.get("payment") == self.identifier else None),
prefix='payment_%s' % self.identifier,
initial={
k.replace('payment_%s_' % self.identifier, ''): v
for k, v in request.session.items()
if k.startswith('payment_%s_' % self.identifier)
}
)
form.fields = self.payment_form_fields
for k, v in form.fields.items():
v._required = v.required
v.required = False
v.widget.is_required = False
return form
@property
def public_name(self) -> str:
@@ -1450,19 +1350,6 @@ class GiftCardPayment(BasePaymentProvider):
f.move_to_end("_enabled", last=False)
return f
@property
def payment_form_fields(self):
fields = [
(
"code",
forms.CharField(
label=_("Gift card code"),
required=True,
),
),
]
return OrderedDict(fields)
@property
def test_mode_message(self) -> str:
return _("In test mode, only test cards will work.")
@@ -1473,6 +1360,11 @@ class GiftCardPayment(BasePaymentProvider):
def order_change_allowed(self, order: Order) -> bool:
return super().order_change_allowed(order) and self.event.organizer.has_gift_cards
def payment_form_render(self, request: HttpRequest, total: Decimal) -> str:
return get_template('pretixcontrol/giftcards/checkout.html').render({
'request': request,
})
def checkout_confirm_render(self, request, order=None, info_data=None) -> str:
return get_template('pretixcontrol/giftcards/checkout_confirm.html').render({
'info_data': info_data,
@@ -1540,6 +1432,21 @@ class GiftCardPayment(BasePaymentProvider):
def _add_giftcard_to_cart(self, cs, gc):
from pretix.base.services.cart import add_payment_to_cart_session
if gc.currency != self.event.currency:
raise ValidationError(_("This gift card does not support this currency."))
if gc.testmode and not self.event.testmode:
raise ValidationError(_("This gift card can only be used in test mode."))
if not gc.testmode and self.event.testmode:
raise ValidationError(_("Only test gift cards can be used in test mode."))
if gc.expires and gc.expires < time_machine_now():
raise ValidationError(_("This gift card is no longer valid."))
if gc.value <= Decimal("0.00"):
raise ValidationError(_("All credit on this gift card has been used."))
for p in cs.get('payments', []):
if p['provider'] == self.identifier and p['info_data']['gift_card'] == gc.pk:
raise ValidationError(_("This gift card is already used for your payment."))
add_payment_to_cart_session(
cs,
self,
@@ -1551,32 +1458,77 @@ class GiftCardPayment(BasePaymentProvider):
)
def checkout_prepare(self, request: HttpRequest, cart: Dict[str, Any]) -> Union[bool, str, None]:
form = self.payment_form(request)
if not form.is_valid():
return False
for p in get_cart(request):
if p.item.issue_giftcard:
messages.error(request, _("You cannot pay with gift cards when buying a gift card."))
return
gc = self.event.organizer.accepted_gift_cards.get(
secret=form.cleaned_data["code"]
)
cs = cart_session(request)
self._add_giftcard_to_cart(cs, gc)
return True
if not request.POST.get("giftcard"):
messages.error(request, _("Please enter the code of your gift card."))
return
try:
gc = self.event.organizer.accepted_gift_cards.get(
secret=request.POST.get("giftcard").strip()
)
cs = cart_session(request)
try:
self._add_giftcard_to_cart(cs, gc)
return True
except ValidationError as e:
messages.error(request, str(e.message))
return
except GiftCard.DoesNotExist:
if self.event.vouchers.filter(code__iexact=request.POST.get("giftcard")).exists():
messages.warning(request, _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
"the product selection."))
else:
messages.error(request, _("This gift card is not known."))
except GiftCard.MultipleObjectsReturned:
messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event."))
def payment_prepare(self, request: HttpRequest, payment: OrderPayment) -> Union[bool, str, None]:
form = self.payment_form(request)
if not form.is_valid():
return False
gc = self.event.organizer.accepted_gift_cards.get(
secret=form.cleaned_data["code"]
)
payment.info_data = {
'gift_card': gc.pk,
'gift_card_secret': gc.secret,
'retry': True
}
payment.amount = min(payment.amount, gc.value)
payment.save()
return True
for p in payment.order.positions.all():
if p.item.issue_giftcard:
messages.error(request, _("You cannot pay with gift cards when buying a gift card."))
return
try:
gc = self.event.organizer.accepted_gift_cards.get(
secret=request.POST.get("giftcard").strip()
)
if gc.currency != self.event.currency:
messages.error(request, _("This gift card does not support this currency."))
return
if gc.testmode and not payment.order.testmode:
messages.error(request, _("This gift card can only be used in test mode."))
return
if not gc.testmode and payment.order.testmode:
messages.error(request, _("Only test gift cards can be used in test mode."))
return
if gc.expires and gc.expires < time_machine_now():
messages.error(request, _("This gift card is no longer valid."))
return
if gc.value <= Decimal("0.00"):
messages.error(request, _("All credit on this gift card has been used."))
return
payment.info_data = {
'gift_card': gc.pk,
'gift_card_secret': gc.secret,
'retry': True
}
payment.amount = min(payment.amount, gc.value)
payment.save()
return True
except GiftCard.DoesNotExist:
if self.event.vouchers.filter(code__iexact=request.POST.get("giftcard").strip()).exists():
messages.warning(request, _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
"the product selection."))
else:
messages.error(request, _("This gift card is not known."))
except GiftCard.MultipleObjectsReturned:
messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event."))
def execute_payment(self, request: HttpRequest, payment: OrderPayment, is_early_special_case=False) -> str:
for p in payment.order.positions.all():

View File

@@ -1,6 +1,5 @@
{% load i18n %}
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="14" viewBox="0 0 18 14"
class="{{ cls }}" role="img" aria-label="{% trans "Seat" %}">
class="{{ cls }}">
<path d="M7.713 3.573c-.787-.124-1.677.472-1.511 1.529l.857 3.473c.116.579.578 1.086 1.317 1.086h3.166v3.504c0 1.108 1.556 1.113 1.556.019V8.682c0-.536-.376-1.116-1.099-1.116L9.52 7.563l-.752-2.936c-.147-.648-.583-.981-1.055-1.055v.001Z"></path>
<path d="M4.48 5.835a.6.6 0 0 0-.674.725l.71 3.441c.287 1.284 1.39 2.114 2.495 2.114h2.273c.807 0 .811-1.215-.01-1.215H7.188c-.753 0-1.375-.45-1.563-1.289l-.672-3.293c-.062-.3-.26-.452-.474-.483ZM7.433.102a1.468 1.468 0 1 0 0 2.937 1.469 1.469 0 1 0 0-2.937Z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 695 B

After

Width:  |  Height:  |  Size: 636 B

View File

@@ -1,7 +1,5 @@
{% load i18n %}
{% load bootstrap3 %}
{% load rich_text %}
{{ request.event.settings.payment_giftcard_public_description|rich_text }}
{% bootstrap_form form layout='checkout' %}
<input name="giftcard" class="form-control" placeholder="{% trans "Gift card code" %}">

View File

@@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
@@ -10699,17 +10699,23 @@ msgstr ""
"sammeln."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "URL zu Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2072
#, fuzzy
#| msgid ""
#| "This should point e.g. to a part of your website that explains how you "
#| "use data gathered in your ticket shop."
msgid ""
"This should point e.g. to a part of your website that explains how your "
"ticket shop complies with accessibility regulation."
msgstr ""
"Dies sollte bspw. ein Link zu einem Teil Ihrer Website sein, auf dem Sie "
"beschreiben, wie Ihr Ticketshop im Einklang mit Richtlinien zur "
"Barrierefreiheit steht."
"beschreiben, wie Sie persönliche Daten nutzen, die Sie in Ihrem Ticketshop "
"sammeln."
#: pretix/base/settings.py:2079
#: pretix/presale/templates/pretixpresale/event/base.html:228
@@ -10717,16 +10723,22 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information"
msgstr "Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2083
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information title"
msgstr "Titel für Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2093
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information text"
msgstr "Text für Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2114
msgid "Attach ticket files"
@@ -23858,8 +23870,10 @@ msgstr ""
"Drittanbietern nicht kennen."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
#, fuzzy
#| msgid "Availability"
msgid "Accessibility"
msgstr "Barrierefreiheit"
msgstr "Verfügbarkeit"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
msgid ""
@@ -23868,19 +23882,12 @@ msgid ""
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
"target=\"_blank\">our documentation</a>."
msgstr ""
"In einigen Regionen, einschließlich der Europäischen Union, sind Sie "
"verpflichtet, Informationen über die Barrierefreiheit Ihres Ticketshops zu "
"veröffentlichen. Sie finden eine Vorlage in <a href="
"\"https://docs.pretix.eu/de/trust/accessibility/\" target=\"_blank\">unserer "
"Dokumentation</a>."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"Statt einer URL kannst du auch einen Text eingeben, der von pretix angezeigt "
"wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
msgid "Barcode media"
@@ -33392,6 +33399,8 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Extend reservation"
msgid "Renew reservation"
msgstr "Reservierung verlängern"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-30 11:08+0000\n"
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
"de/>\n"
@@ -728,7 +728,7 @@ msgstr "Warenkorb abgelaufen"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr "Ihr Warenkorb läuft gleich ab."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -739,10 +739,16 @@ msgstr[1] ""
"Die Produkte in Ihrem Warenkorb sind noch {num} Minuten für Sie reserviert."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "Ihr Warenkorb ist abgelaufen."
msgstr "Warenkorb abgelaufen"
#: pretix/static/pretixpresale/js/ui/cart.js:89
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
@@ -753,11 +759,11 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr "Möchten Sie die Reservierung verlängern?"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr "Reservierung verlängern"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -800,12 +806,12 @@ msgstr "Menge erhöhen"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr "Veranstaltungen filtern nach"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr "Filtern"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1052,16 +1058,17 @@ msgid "Close"
msgstr "Schließen"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "Kauf schließen"
msgstr "Kauf fortsetzen"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
"Sie können diese Aktion nicht abbrechen. Bitte warten Sie, bis der "
"Ladevorgang abgeschlossen ist."
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
@@ -10685,17 +10685,23 @@ msgstr ""
"sammelst."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "URL zu Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2072
#, fuzzy
#| msgid ""
#| "This should point e.g. to a part of your website that explains how you "
#| "use data gathered in your ticket shop."
msgid ""
"This should point e.g. to a part of your website that explains how your "
"ticket shop complies with accessibility regulation."
msgstr ""
"Dies sollte bspw. ein Link zu einem Teil deiner Website sein, auf dem du "
"beschreibst, wie dein Ticketshop im Einklang mit Richtlinien zur "
"Barrierefreiheit steht."
"beschreibst, wie du persönliche Daten nutzt, die du in deinem Ticketshop "
"sammelst."
#: pretix/base/settings.py:2079
#: pretix/presale/templates/pretixpresale/event/base.html:228
@@ -10703,16 +10709,22 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information"
msgstr "Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2083
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information title"
msgstr "Titel für Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2093
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information text"
msgstr "Text für Informationen zur Barrierefreiheit"
msgstr "Konto-Informationen"
#: pretix/base/settings.py:2114
msgid "Attach ticket files"
@@ -23822,8 +23834,10 @@ msgstr ""
"eingesetzten Drittanbietern nicht kennen."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
#, fuzzy
#| msgid "Availability"
msgid "Accessibility"
msgstr "Barrierefreiheit"
msgstr "Verfügbarkeit"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
msgid ""
@@ -23832,19 +23846,12 @@ msgid ""
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
"target=\"_blank\">our documentation</a>."
msgstr ""
"In einigen Regionen, einschließlich der Europäischen Union, bist du "
"verpflichtet, Informationen über die Barrierefreiheit Ihres Ticketshops zu "
"veröffentlichen. Du findest eine Vorlage in <a href="
"\"https://docs.pretix.eu/de/trust/accessibility/\" target=\"_blank\">unserer "
"Dokumentation</a>."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"Statt einer URL kannst du auch einen Text eingeben, der von pretix angezeigt "
"wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
msgid "Barcode media"
@@ -33335,6 +33342,8 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Extend reservation"
msgid "Renew reservation"
msgstr "Reservierung verlängern"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-30 11:07+0000\n"
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/de_Informal/>\n"
@@ -728,7 +728,7 @@ msgstr "Warenkorb abgelaufen"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr "Dein Warenkorb läuft gleich ab."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -739,10 +739,16 @@ msgstr[1] ""
"Die Produkte in deinem Warenkorb sind noch {num} Minuten für dich reserviert."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "Dein Warenkorb ist abgelaufen."
msgstr "Warenkorb abgelaufen"
#: pretix/static/pretixpresale/js/ui/cart.js:89
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
@@ -753,11 +759,11 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr "Möchtest du die Reservierung verlängern?"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr "Reservierung verlängern"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -800,12 +806,12 @@ msgstr "Menge erhöhen"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr "Veranstaltungen filtern nach"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr "Filtern"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1052,16 +1058,17 @@ msgid "Close"
msgstr "Schließen"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "Kauf schließen"
msgstr "Kauf fortsetzen"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
"Du kannst diese Aktion nicht abbrechen. Bitte warte, bis der Ladevorgang "
"abgeschlossen ist."
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"PO-Revision-Date: 2025-05-14 02:00+0000\n"
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
"Language: es\n"
@@ -4379,15 +4379,13 @@ msgstr "Opcional. Ningún producto será vendido antes de esta fecha."
#: pretix/base/models/event.py:621
msgid "This event is remote or partially remote."
msgstr "Este evento es remoto o parcialmente remoto."
msgstr ""
#: pretix/base/models/event.py:622
msgid ""
"This will be used to let users know if the event is in a different timezone "
"and lets us calculate users local times."
msgstr ""
"Esto se utilizará para que los usuarios sepan si el evento se celebra en una "
"zona horaria diferente y nos permite calcular la hora local de los usuarios."
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
msgid "Plugins"
@@ -10690,16 +10688,22 @@ msgstr ""
"cómo utiliza los datos recopilados en su taquilla virtual."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "Información sobre accesibilidad URL"
msgstr "Información de la cuenta"
#: pretix/base/settings.py:2072
#, fuzzy
#| msgid ""
#| "This should point e.g. to a part of your website that explains how you "
#| "use data gathered in your ticket shop."
msgid ""
"This should point e.g. to a part of your website that explains how your "
"ticket shop complies with accessibility regulation."
msgstr ""
"Debe remitir, por ejemplo, a una parte de su sitio web que explique cómo su "
"tienda de entradas cumple la normativa sobre accesibilidad."
"Esto debería señalar, por ejemplo, a una parte de su sitio web que explica "
"cómo utiliza los datos recopilados en su taquilla virtual."
#: pretix/base/settings.py:2079
#: pretix/presale/templates/pretixpresale/event/base.html:228
@@ -10707,16 +10711,22 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information"
msgstr "Información sobre accesibilidad"
msgstr "Información de la cuenta"
#: pretix/base/settings.py:2083
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information title"
msgstr "Título de la información sobre accesibilidad"
msgstr "Información de la cuenta"
#: pretix/base/settings.py:2093
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information text"
msgstr "Texto informativo sobre accesibilidad"
msgstr "Información de la cuenta"
#: pretix/base/settings.py:2114
msgid "Attach ticket files"
@@ -17811,7 +17821,7 @@ msgstr "Funcionamiento en modo de desarrollo"
#: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros."
msgstr "Si esto tarda más de unos minutos, póngase en contacto con nosotros."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
@@ -23848,8 +23858,10 @@ msgstr ""
"proveedores de pago o de seguimiento."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
#, fuzzy
#| msgid "Availability"
msgid "Accessibility"
msgstr "Accesibilidad"
msgstr "Disponibilidad"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
msgid ""
@@ -23858,19 +23870,12 @@ msgid ""
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
"target=\"_blank\">our documentation</a>."
msgstr ""
"Algunas jurisdicciones, incluida la Unión Europea, exigen que publique "
"información sobre la accesibilidad de su taquilla/tienda de entradas. Puede "
"encontrar una plantilla en <a href="
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">nuestra "
"documentación</a>."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"En lugar de una URL, también puede configurar un texto que se mostrará "
"dentro de pretix. Esto se ignorará si se configura una URL."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
msgid "Barcode media"
@@ -32403,6 +32408,8 @@ msgstr ""
"y contraseña."
#: pretix/presale/forms/customer.py:74
#, fuzzy
#| msgid "Please verify that you entered the correct email addess."
msgid "Please verify that you entered the correct email address."
msgstr ""
"Compruebe que ha introducido la dirección de correo electrónico correcta."
@@ -33383,8 +33390,10 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation"
msgstr "Renovar reserva"
msgstr "Descripción del evento"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
msgid "Overview of your ordered products."
@@ -34684,8 +34693,10 @@ msgstr ""
"Una vez completado el proceso en la nueva ventana, podrás continuar aquí."
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
#, fuzzy
#| msgid "Closed"
msgid "Close"
msgstr "Cerrar"
msgstr "Cerrado"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:79
msgid "Adjust settings in detail"
@@ -34729,6 +34740,8 @@ msgid "Save selection"
msgstr "Guarda selección"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
#, fuzzy
#| msgid "You didnt select any ticket."
msgid "You didn't select any ticket."
msgstr "No ha seleccionado ninguna entrada."

View File

@@ -8,10 +8,10 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
"PO-Revision-Date: 2025-05-22 08:37+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-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -343,7 +343,7 @@ msgstr "No"
#: pretix/static/lightbox/js/lightbox.js:96
msgid "close"
msgstr "cerrar"
msgstr "Cerrar"
#: pretix/static/pretixbase/js/addressform.js:59
#: pretix/static/pretixpresale/js/ui/main.js:513
@@ -416,7 +416,7 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message"
@@ -725,7 +725,7 @@ msgstr "El carrito de compra ha expirado"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr "Su carrito está a punto de caducar."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -737,10 +737,16 @@ msgstr[1] ""
"minutos."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "Su cesta ha caducado."
msgstr "El carrito de compra ha expirado"
#: pretix/static/pretixpresale/js/ui/cart.js:89
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
@@ -750,11 +756,11 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr "¿Desea renovar el periodo de reserva?"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr "Renovar reserva"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -797,12 +803,12 @@ msgstr "Incrementar cantidad"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr "Filtrar eventos por"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr "Filtrar"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1050,14 +1056,17 @@ msgid "Close"
msgstr "Cerrar"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "Cerrar caja"
msgstr "Continuar pago"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr "No puede cancelar esta operación. Espere a que finalice la carga."
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
"PO-Revision-Date: 2025-05-30 11:06+0000\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
@@ -4396,16 +4396,13 @@ msgstr "Facultatif. Aucun produit ne sera vendu avant cette date."
#: pretix/base/models/event.py:621
msgid "This event is remote or partially remote."
msgstr "Cet événement est éloigné ou partiellement éloigné."
msgstr ""
#: pretix/base/models/event.py:622
msgid ""
"This will be used to let users know if the event is in a different timezone "
"and lets us calculate users local times."
msgstr ""
"Elle sera utilisée pour indiquer aux utilisateurs si l'événement se déroule "
"dans un autre fuseau horaire et nous permettra de calculer l'heure locale "
"des utilisateurs."
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
msgid "Plugins"
@@ -10788,17 +10785,22 @@ msgstr ""
"explique comment vous utilisez les données collectées dans votre billetterie."
#: pretix/base/settings.py:2071
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information URL"
msgstr "Informations d'accessibilité URL"
msgstr "Informations sur le compte"
#: pretix/base/settings.py:2072
#, fuzzy
#| msgid ""
#| "This should point e.g. to a part of your website that explains how you "
#| "use data gathered in your ticket shop."
msgid ""
"This should point e.g. to a part of your website that explains how your "
"ticket shop complies with accessibility regulation."
msgstr ""
"Elle doit renvoyer, par exemple, à une partie de votre site web qui explique "
"comment votre billetterie est conforme à la réglementation en matière "
"d'accessibilité."
"Cela devrait pointer par exemple vers une partie de votre site Web qui "
"explique comment vous utilisez les données collectées dans votre billetterie."
#: pretix/base/settings.py:2079
#: pretix/presale/templates/pretixpresale/event/base.html:228
@@ -10806,16 +10808,22 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information"
msgstr "Informations sur l'accessibilité"
msgstr "Informations sur le compte"
#: pretix/base/settings.py:2083
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information title"
msgstr "Titre de l'information sur l'accessibilité"
msgstr "Informations sur le compte"
#: pretix/base/settings.py:2093
#, fuzzy
#| msgid "Account information"
msgid "Accessibility information text"
msgstr "Texte d'information sur l'accessibilité"
msgstr "Informations sur le compte"
#: pretix/base/settings.py:2114
msgid "Attach ticket files"
@@ -24033,8 +24041,10 @@ msgstr ""
"tiers tels que les fournisseurs de paiement ou de suivi."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
#, fuzzy
#| msgid "Availability"
msgid "Accessibility"
msgstr "Accessibilité"
msgstr "Disponibilité"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
msgid ""
@@ -24043,19 +24053,12 @@ msgid ""
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
"target=\"_blank\">our documentation</a>."
msgstr ""
"Certaines juridictions, y compris l'Union européenne, vous obligent à "
"publier des informations sur l'accessibilité de votre billetterie. Vous "
"pouvez trouver un modèle dans <a href="
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">notre "
"documentation</a>."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"Au lieu d'une URL, vous pouvez également configurer un texte qui sera "
"affiché dans pretix. Ce texte sera ignoré si une URL est configurée."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
msgid "Barcode media"
@@ -32664,8 +32667,10 @@ msgstr ""
"passe."
#: pretix/presale/forms/customer.py:74
#, fuzzy
#| msgid "Please verify that you entered the correct email addess."
msgid "Please verify that you entered the correct email address."
msgstr "Veuillez vérifier que vous avez saisi l'adresse électronique correcte."
msgstr "Veuillez vérifier que vous avez saisi une adresse e-mail conforme."
#: pretix/presale/forms/customer.py:75
msgid "Please enter the correct password."
@@ -33656,8 +33661,10 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation"
msgstr "Renouveler la réservation"
msgstr "Description de lévénement"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
msgid "Overview of your ordered products."
@@ -34995,8 +35002,10 @@ msgstr ""
"continuer ici."
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
#, fuzzy
#| msgid "Closed"
msgid "Close"
msgstr "Fermer"
msgstr "Fermé"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:79
msgid "Adjust settings in detail"
@@ -35040,6 +35049,8 @@ msgid "Save selection"
msgstr "Enregistrer la sélection"
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
#, fuzzy
#| msgid "You didnt select any ticket."
msgid "You didn't select any ticket."
msgstr "Vous n'avez sélectionné aucun billet."

View File

@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
"PO-Revision-Date: 2025-05-30 11:06+0000\n"
"PO-Revision-Date: 2025-05-22 08:37+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
@@ -417,7 +417,7 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:270
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Si cela prend plus de quelques minutes, veuillez nous contacter."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:325
msgid "Close message"
@@ -634,7 +634,8 @@ msgstr "Erreur inconnue."
#: pretix/static/pretixcontrol/js/ui/main.js:292
msgid "Your color has great contrast and will provide excellent accessibility."
msgstr "Votre choix de couleur a un bon contraste et il est très facile à lire."
msgstr ""
"Votre choix de couleur a un bon contraste et il est très facile à lire!"
#: pretix/static/pretixcontrol/js/ui/main.js:296
msgid ""
@@ -642,7 +643,7 @@ msgid ""
"requirements."
msgstr ""
"Votre choix de couleur est assez bon pour la lecture et offre un bon "
"contraste."
"contraste !"
#: pretix/static/pretixcontrol/js/ui/main.js:300
msgid ""
@@ -726,7 +727,7 @@ msgstr "Panier expiré"
#: pretix/static/pretixpresale/js/ui/cart.js:59
#: pretix/static/pretixpresale/js/ui/cart.js:87
msgid "Your cart is about to expire."
msgstr "Votre panier est sur le point d'expirer."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:64
msgid "The items in your cart are reserved for you for one minute."
@@ -735,24 +736,30 @@ msgstr[0] "Les articles de votre panier sont réservés pour une minute."
msgstr[1] "Les articles de votre panier sont réservés pendant {num} minutes."
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "Votre panier a expiré."
msgstr "Panier expiré"
#: pretix/static/pretixpresale/js/ui/cart.js:89
#, fuzzy
#| msgid ""
#| "The items in your cart are no longer reserved for you. You can still "
#| "complete your order as long as theyre available."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as they're available."
msgstr ""
"Les articles de votre panier ne vous sont plus réservés. Vous pouvez encore "
"compléter votre commande tant qu'ils sont disponibles."
"Les articles de votre panier ne vous sont plus réservés. Vous pouvez "
"toujours compléter votre commande tant qu'ils sont disponibles."
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr "Souhaitez-vous renouveler la période de réservation ?"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr "Renouveler la réservation"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
@@ -796,12 +803,12 @@ msgstr "Augmenter la quantité"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Filter events by"
msgstr "Filtrer les événements par"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Filter"
msgstr "Filtrer"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
@@ -1049,16 +1056,17 @@ msgid "Close"
msgstr "Fermer"
#: pretix/static/pretixpresale/js/widget/widget.js:62
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Close checkout"
msgstr "Fermer la caisse"
msgstr "Finaliser ma commande"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgctxt "widget"
msgid "You cannot cancel this operation. Please wait for loading to finish."
msgstr ""
"Vous ne pouvez pas annuler cette opération. Veuillez attendre la fin du "
"chargement."
#: pretix/static/pretixpresale/js/widget/widget.js:64
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60

View File

@@ -16,17 +16,16 @@
{% for p in current_payments %}
<div class="list-group-item">
<div class="row">
<div class="col-md-7 col-sm-6 col-xs-8">
<strong id="payment-label-{{ forloop.counter }}">{{ p.provider_name }}</strong>
<div class="col-xs-9">
{{ p.provider_name }}
</div>
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
<div class="col-xs-2 text-right">
{{ p.payment_amount|money:request.event.currency }}
</div>
<div class="col-md-3 col-sm-4 col-xs-12 text-right">
<button name="remove_payment" value="{{ p.id }}" aria-describedby="payment-label-{{ forloop.counter }}"
class="btn btn-danger">
<span class="fa fa-trash"></span>
{% trans "Remove payment" %}
<div class="col-xs-1 text-right">
<button name="remove_payment" value="{{ p.id }}" title="{% trans "Remove payment" %}"
class="btn btn-link btn-xs">
<span class="fa fa-trash text-danger"></span>
</button>
</div>
</div>
@@ -35,11 +34,11 @@
{% if remaining %}
<div class="list-group-item">
<div class="row">
<div class="col-md-7 col-sm-6 col-xs-8">
<div class="col-xs-9">
<strong>{% trans "Remaining balance" %}</strong><br>
<span class="text-muted">{% trans "Please select a payment method below." %}</span>
</div>
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
<div class="col-xs-2 text-right">
<strong>
{{ remaining|money:request.event.currency }}
</strong>

View File

@@ -70,7 +70,7 @@ from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.views import (
CartMixin, EventViewMixin, allow_cors_if_namespaced,
allow_frame_if_namespaced, get_cart, iframe_entry_view_wrapper,
allow_frame_if_namespaced, iframe_entry_view_wrapper,
)
from pretix.presale.views.event import (
get_grouped_items, item_group_by_category,
@@ -441,7 +441,7 @@ class CartApplyVoucher(EventViewMixin, CartActionMixin, AsyncAction, View):
return _('We applied the voucher to as many products in your cart as we could.')
def post(self, request, *args, **kwargs):
from pretix.base.payment import GiftCardPayment, GiftCardPaymentForm
from pretix.base.payment import GiftCardPayment
if 'voucher' in request.POST:
code = request.POST.get('voucher').strip()
@@ -454,22 +454,6 @@ class CartApplyVoucher(EventViewMixin, CartActionMixin, AsyncAction, View):
raise ValidationError(error_messages['voucher_invalid'])
else:
cs = cart_session(request)
used_cards = [
p.get('info_data', {}).get('gift_card')
for p in cs.get('payments', [])
if p.get('info_data', {}).get('gift_card')
]
form = GiftCardPaymentForm(
event=request.event,
used_cards=used_cards,
positions=get_cart(request),
testmode=request.event.testmode,
data={'code': code},
)
form.fields = gcp.payment_form_fields
if not form.is_valid():
# raise first validation-error in form
raise next(iter(form.errors.as_data().values()))[0]
gcp._add_giftcard_to_cart(cs, gc)
messages.success(
request,
@@ -710,7 +694,7 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
return context
def dispatch(self, request, *args, **kwargs):
from pretix.base.payment import GiftCardPayment, GiftCardPaymentForm
from pretix.base.payment import GiftCardPayment
err = None
v = request.GET.get('voucher')
@@ -735,28 +719,12 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
err = error_messages['voucher_redeemed_cart'] % self.request.event.settings.reservation_time
except Voucher.DoesNotExist:
try:
gc = request.event.organizer.accepted_gift_cards.get(secret=v)
gcp = GiftCardPayment(request.event)
if not gcp.is_enabled or not gcp.is_allowed(request, Decimal("1.00")):
gc = self.request.event.organizer.accepted_gift_cards.get(secret=v.strip())
gcp = GiftCardPayment(self.request.event)
if not gcp.is_enabled or not gcp.is_allowed(self.request, Decimal("1.00")):
err = error_messages['voucher_invalid']
else:
cs = cart_session(request)
used_cards = [
p.get('info_data', {}).get('gift_card')
for p in cs.get('payments', [])
if p.get('info_data', {}).get('gift_card')
]
form = GiftCardPaymentForm(
event=request.event,
used_cards=used_cards,
positions=get_cart(request),
testmode=request.event.testmode,
data={'code': v},
)
form.fields = gcp.payment_form_fields
if not form.is_valid():
# raise first validation-error in form
raise next(iter(form.errors.as_data().values()))[0]
gcp._add_giftcard_to_cart(cs, gc)
messages.success(
request,

View File

@@ -683,8 +683,6 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView):
ctx['show_fees'] = any(p['fee_diff'] for p in self.provider_forms)
if len(self.provider_forms) == 1:
ctx['selected'] = self.provider_forms[0]['provider'].identifier
elif "payment" in self.request.POST:
ctx['selected'] = self.request.POST.get("payment")
return ctx
def get_confirm_url(self, payment):

View File

@@ -10,12 +10,6 @@ body {
padding: 50px 0;
}
*:focus, .btn:focus {
outline: 2px solid $link-hover-color;
outline-offset: 2px;
box-shadow: none;
}
.big-icon {
font-size: 200px;
color: $navbar-inverse-bg;

View File

@@ -1591,7 +1591,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
self.assertEqual(len(doc.select('input[name="payment"]')), 3)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1636,7 +1636,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
self.assertEqual(len(doc.select('input[name="payment"]')), 3)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1646,7 +1646,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc2.secret
'giftcard': gc2.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1677,7 +1677,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
self.assertEqual(len(doc.select('input[name="payment"]')), 3)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1706,7 +1706,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
self.assertEqual(len(doc.select('input[name="payment"]')), 3)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1748,7 +1748,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card is no longer valid.' in response.content.decode()
@@ -1763,7 +1763,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card does not support this currency.' in response.content.decode()
@@ -1780,7 +1780,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card is not known.' in response.content.decode()
@@ -1798,7 +1798,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -1828,7 +1828,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card is not known.' in response.content.decode()
@@ -1845,7 +1845,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'Only test gift cards can be used in test mode.' in response.content.decode()
@@ -1860,7 +1860,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card can only be used in test mode.' in response.content.decode()
@@ -1874,7 +1874,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'All credit on this gift card has been used.' in response.content.decode()
@@ -1889,11 +1889,11 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'This gift card is already used for your payment.' in response.content.decode()
@@ -1910,7 +1910,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
)
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
assert 'You cannot pay with gift cards when buying a gift card.' in response.content.decode()
@@ -1964,7 +1964,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug),
target_status_code=200)
@@ -2006,7 +2006,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), {
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)

View File

@@ -673,7 +673,7 @@ class OrdersTest(BaseOrdersTest):
assert "gift card" in response.content.decode()
response = self.client.post(
'/%s/%s/order/%s/%s/cancel/do' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {
'payment_giftcard-code': 'false'
'giftcard': 'false'
}, follow=True)
self.assertRedirects(response,
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
@@ -1421,7 +1421,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
with scopes_disabled():
@@ -1458,7 +1458,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "You cannot pay with gift cards when buying a gift card." in response.content.decode()
@@ -1471,7 +1471,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "This gift card does not support this currency." in response.content.decode()
@@ -1486,7 +1486,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "Only test gift cards can be used in test mode." in response.content.decode()
@@ -1499,7 +1499,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "This gift card can only be used in test mode." in response.content.decode()
@@ -1511,7 +1511,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "All credit on this gift card has been used." in response.content.decode()
@@ -1526,7 +1526,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
assert "This gift card is not known." in response.content.decode()
@@ -1548,7 +1548,7 @@ class OrdersTest(BaseOrdersTest):
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'giftcard',
'payment_giftcard-code': gc.secret
'giftcard': gc.secret
}
)
with scopes_disabled():