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
51 changed files with 822 additions and 531 deletions

View File

@@ -48,6 +48,11 @@ seat objects The assigned se
└ seat_guid string Identifier of the seat within the seating plan
===================================== ========================== =======================================================
.. versionchanged:: 4.14
This ``is_bundled`` attribute has been added and the cart creation endpoints have been updated.
Cart position endpoints
-----------------------

View File

@@ -9,6 +9,14 @@ This page describes special APIs built for ticket scanning apps. For managing ch
please also see :ref:`rest-checkinlists`. The check-in list API also contains endpoints to obtain statistics or log
failed scans.
.. versionchanged:: 4.12
The endpoints listed on this page have been added.
.. versionchanged:: 4.18
The ``source_type`` parameter has been added.
.. _`rest-checkin-redeem`:
Checking a ticket in

View File

@@ -40,6 +40,10 @@ ignore_in_statistics boolean If ``true``, ch
consider_tickets_used boolean If ``true`` (default), tickets checked in on this list will be considered "used" by other functionality, i.e. when checking if they can still be canceled.
===================================== ========================== =======================================================
.. versionchanged:: 4.12
The ``addon_match`` attribute has been added.
.. versionchanged:: 2023.9
The ``ignore_in_statistics`` and ``consider_tickets_used`` attributes have been added.

View File

@@ -34,6 +34,12 @@ password string Can only be set
not be included in any responses.
===================================== ========================== =======================================================
.. versionadded:: 4.0
.. versionchanged:: 4.3
Passwords can now be set through the API during customer creation.
.. versionchanged:: 2024.3
The attribute ``phone`` has been added.

View File

@@ -61,6 +61,25 @@ public_url string The public, cus
Endpoints
---------
.. versionchanged:: 4.0
The ``clone_from`` parameter has been added to the event creation endpoint.
.. versionchanged:: 4.1
The ``with_availability_for`` parameter has been added.
The ``search`` query parameter has been added to filter events by their slug, name, or location in any language.
.. versionchanged:: 4.17
The ``public_url`` field has been added.
.. versionchanged:: 5.0
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
added.
.. http:get:: /api/v1/organizers/(organizer)/events/
Returns a list of all events within a given organizer the authenticated user/token has access to.
@@ -611,6 +630,10 @@ organizer level.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. versionchanged:: 4.18
The ``readonly`` flag has been added.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/settings/
Updates event settings. Note that ``PUT`` is not allowed here, only ``PATCH``.

View File

@@ -47,6 +47,11 @@ acceptor string Organizer slug
this field was added.)
===================================== ========================== =======================================================
.. versionchanged:: 4.20
The ``owner_ticket`` and ``issuer`` attributes of the gift card and the ``info`` and ``acceptor`` attributes of the
gift card transaction resource have been added.
Endpoints
---------

View File

@@ -111,6 +111,18 @@ internal_reference string Customer's refe
===================================== ========================== =======================================================
.. versionchanged:: 4.1
The attributes ``fee_type`` and ``fee_internal_type`` have been added.
.. versionchanged:: 4.1
The attribute ``lines.event_location`` has been added.
.. versionchanged:: 4.6
The attribute ``lines.subevent`` has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.

View File

@@ -64,6 +64,10 @@ hide_without_voucher boolean If ``true``, th
meta_data object Values set for event-specific meta data parameters.
===================================== ========================== =======================================================
.. versionchanged:: 4.16
The ``meta_data`` and ``checkin_attention`` attributes have been added.
.. versionchanged:: 2023.10
The ``free_price_suggestion`` attribute has been added.

View File

@@ -211,6 +211,28 @@ bundles list of objects Definition of
meta_data object Values set for event-specific meta data parameters.
======================================= ========================== =======================================================
.. versionchanged:: 4.0
The attributes ``require_membership``, ``require_membership_types``, ``grant_membership_type``, ``grant_membership_duration_like_event``,
``grant_membership_duration_days`` and ``grant_membership_duration_months`` have been added.
.. versionchanged:: 4.4
The attributes ``require_membership_hidden`` attribute has been added.
.. versionchanged:: 4.16
The ``variations[x].meta_data`` and ``variations[x].checkin_attention`` attributes have been added.
The ``personalized`` attribute has been added.
.. versionchanged:: 4.17
The ``validity_*`` attributes have been added.
.. versionchanged:: 4.18
The ``media_policy`` and ``media_type`` attributes have been added.
.. versionchanged:: 2023.10
The ``checkin_text`` and ``variations[x].checkin_text`` attributes have been added.

View File

@@ -114,6 +114,34 @@ plugin_data object Additional data
===================================== ========================== =======================================================
.. versionchanged:: 4.0
The ``customer`` attribute has been added.
.. versionchanged:: 4.1
The ``custom_followup_at`` attribute has been added.
.. versionchanged:: 4.4
The ``item`` and ``variation`` query parameters have been added.
.. versionchanged:: 4.6
The ``subevent`` query parameters has been added.
.. versionchanged:: 4.8
The ``order.fees.id`` attribute has been added.
.. versionchanged:: 4.15
The ``include`` query parameter has been added.
.. versionchanged:: 4.16
The ``valid_if_pending`` attribute has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.
@@ -232,6 +260,10 @@ pdf_data object Data object req
plugin_data object Additional data added by plugins.
===================================== ========================== =======================================================
.. versionchanged:: 4.16
The attributes ``blocked``, ``valid_from`` and ``valid_until`` have been added.
.. versionchanged:: 2024.9
The attribute ``print_logs`` has been added.
@@ -724,6 +756,10 @@ Fetching individual orders
Order ticket download
---------------------
.. versionchanged:: 4.10
The API now supports ticket downloads for pending orders if allowed by the event settings.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/download/(output)/
Download tickets for an order, identified by its order code. Depending on the chosen output, the response might
@@ -1796,6 +1832,10 @@ Fetching individual positions
Order position ticket download
------------------------------
.. versionchanged:: 4.10
The API now supports ticket downloads for pending orders if allowed by the event settings.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/(id)/download/(output)/
Download tickets for one order position, identified by its internal ID.
@@ -1848,6 +1888,15 @@ Order position ticket download
Manipulating individual positions
---------------------------------
.. versionchanged:: 4.8
The ``PATCH`` method now supports changing items, variations, subevents, seats, prices, and tax rules.
The ``POST`` endpoint to add individual positions has been added.
.. versionadded:: 4.16
The endpoints to manage blocks have been added.
.. versionchanged:: 2024.9
The API now supports logging ticket and badge prints.
@@ -2177,6 +2226,10 @@ multiple changes to an order at once within one transaction. This makes it possi
attendees in an order without running into conflicts. This interface also offers some possibilities not available
otherwise, such as splitting an order or changing fees.
.. versionchanged:: 4.8
This endpoint has been added to the system.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/change/
Performs a change operation on an order. You can supply the following fields:

View File

@@ -25,6 +25,10 @@ public_url string The public, cus
Endpoints
---------
.. versionchanged:: 4.17
The ``public_url`` field has been added.
.. http:get:: /api/v1/organizers/
Returns a list of all organizers the authenticated user/token has access to.

View File

@@ -36,6 +36,11 @@ available_number integer Number of avail
slightly out of date. ``null`` means unlimited.
===================================== ========================== =======================================================
.. versionchanged:: 4.1
The ``with_availability`` query parameter has been added.
Endpoints
---------

View File

@@ -6,6 +6,10 @@ Data shredders
pretix and it's plugins include a number of data shredders that allow you to clear personal information from the system.
This page shows you how to use these shredders through the API.
.. versionchanged:: 4.12
This feature has been added to the API.
.. warning::
Unlike the user interface, the API will not force you to download tax-relevant data before you delete it.

View File

@@ -59,6 +59,15 @@ seat_category_mapping object An object mappi
last_modified datetime Last modification of this object
===================================== ========================== =======================================================
.. versionchanged:: 4.15
The ``search`` query parameter has been added to filter sub-events by their name or location in any language.
.. versionchanged:: 5.0
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
added.
.. versionchanged:: 2023.8.0
For the organizer-wide endpoint, the ``search`` query parameter has been modified to filter sub-events by their parent events slug too.
@@ -66,6 +75,10 @@ last_modified datetime Last modificati
Endpoints
---------
.. versionchanged:: 4.1
The ``with_availability_for`` parameter has been added.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
Returns a list of all sub-events of an event.

View File

@@ -40,6 +40,10 @@ custom_rules object Dynamic rules s
===================================== ========================== =======================================================
.. versionchanged:: 4.6
The ``internal_name`` and ``keep_gross_if_rate_changes`` attributes have been added.
.. versionchanged:: 2023.6
The ``custom_rules`` attribute has been added.

View File

@@ -39,6 +39,10 @@ can_change_vouchers boolean
can_checkin_orders boolean
===================================== ========================== =======================================================
.. versionchanged:: 4.18
The ``can_manage_reusable_media`` permission has been added.
Team member resource
--------------------

View File

@@ -178,6 +178,13 @@ You can then implement a view as you would normally do. It will be automatically
* Your plugin is enabled
* The locale is set correctly
.. versionchanged:: 1.7
The ``event_url()`` wrapper has been added in 1.7 to replace the former ``@event_view`` decorator. The
``event_url()`` wrapper is optional and using ``url()`` still works, but you will not be able to set the
``require_live`` setting any more via the decorator. The ``@event_view`` decorator is now deprecated and
does nothing.
REST API viewsets
-----------------

View File

@@ -10,6 +10,7 @@ Contents:
exporter
ticketoutput
payment
payment_2.0
email
placeholder
invoice

View File

@@ -0,0 +1,129 @@
.. highlight:: python
:linenothreshold: 5
.. _`payment2.0`:
Porting a payment provider from pretix 1.x to pretix 2.x
========================================================
In pretix 2.x, we changed large parts of the payment provider API. This documentation details the changes we made
and shows you how you can make an existing pretix 1.x payment provider compatible with pretix 2.x
Conceptual overview
-------------------
In pretix 1.x, an order was always directly connected to a payment provider for the full life of an order. As long as
an order was unpaid, this could still be changed in some cases, but once an order was paid, no changes to the payment
provider were possible any more. Additionally, the internal state of orders allowed orders only to be fully paid or
not paid at all. This leads to a couple of consequences:
* Payment-related functions (like "execute payment" or "do a refund") always operated on full orders.
* Changing the total of an order was basically impossible once an order was paid, since there was no concept of
partial payments or partial refunds.
* Payment provider plugins needed to take complicated steps to detect cases that require human intervention, like e.g.
* An order has expired, no quota is left to revive it, but a payment has been received
* A payment has been received for a canceled order
* A payment has been received for an order that has already been paid with a different payment method
* An external payment service notified us of a refund/dispute
We noticed that we copied and repeated large portions of code in all our official payment provider plugins, just
to deal with some of these cases.
* Sometimes, there is the need to mark an order as refunded within pretix, without automatically triggering a refund
with an external API. Every payment method needed to implement a user interface for this independently.
* If a refund was not possible automatically, there was no way user to track which payments actually have been refunded
manually and which are still left to do.
* When the payment with one payment provider failed and the user changed to a different payment provider, all
information about the first payment was lost from the order object and could only be retrieved from order log data,
which also made it hard to design a data shredder API to get rid of this data.
In pretix 2.x, we introduced two new models, :py:class:`OrderPayment <pretix.base.models.OrderPayment>` and
:py:class:`OrderRefund <pretix.base.models.OrderRefund>`. Each instance of these is connected to an order and
represents one single attempt to pay or refund a specific amount of money. Each one of these has an individual state,
can individually fail or succeed, and carries an amount variable that can differ from the order total.
This has the following advantages:
* The system can now detect orders that are over- or underpaid, independent of the payment providers in use.
* Therefore, we can now allow partial payments, partial refunds, and changing paid orders, and automatically detect
the cases listed above and notify the user.
Payment providers now interact with those payment and refund objects more than with orders.
Your to-do list
---------------
Payment processing
""""""""""""""""""
* The method ``BasePaymentProvider.order_pending_render`` has been removed and replaced by a new
``BasePaymentProvider.payment_pending_render(request, payment)`` method that is passed an ``OrderPayment``
object instead of an ``Order``.
* The method ``BasePaymentProvider.payment_form_render`` now receives a new ``total`` parameter.
* The method ``BasePaymentProvider.payment_perform`` has been removed and replaced by a new method
``BasePaymentProvider.execute_payment(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* The function ``pretix.base.services.mark_order_paid`` has been removed, instead call ``payment.confirm()``
on a pending ``OrderPayment`` object. If no further payments are required for this order, this will also
mark the order as paid automatically. Note that ``payment.confirm()`` can still throw a ``QuotaExceededException``,
however it will still mark the payment as complete (not the order!), so you should catch this exception and
inform the user, but not abort the transaction.
* A new property ``BasePaymentProvider.abort_pending_allowed`` has been introduced. Only if set, the user will
be able to retry a payment or switch the payment method when the order currently has a payment object in
state ``"pending"``. This replaces ``BasePaymentProvider.order_can_retry``, which no longer exists.
* The methods ``BasePaymentProvider.retry_prepare`` and ``BasePaymentProvider.order_prepare`` have both been
replaced by a new method ``BasePaymentProvider.payment_prepare(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``. **Keep in mind that this payment object might have an amount property that
differs from the order total, if the order is already partially paid.**
* The method ``BasePaymentProvider.order_paid_render`` has been removed.
* The method ``BasePaymentProvider.order_control_render`` has been removed and replaced by a new method
``BasePaymentProvider.payment_control_render(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* There's no need to manually deal with excess payments or duplicate payments anymore, just setting the ``OrderPayment``
methods to the correct state will do the job.
Creating refunds
""""""""""""""""
* The methods ``BasePaymentProvider.order_control_refund_render`` and ``BasePaymentProvider.order_control_refund_perform``
have been removed.
* Two new boolean methods ``BasePaymentProvider.payment_refund_supported(payment)`` and ``BasePaymentProvider.payment_partial_refund_supported(payment)``
have been introduced. They should be set to return ``True`` if and only if the payment API allows to *automatically*
transfer the money back to the customer.
* A new method ``BasePaymentProvider.execute_refund(refund)`` has been introduced. This method is called using a
``OrderRefund`` object in ``"created"`` state and is expected to transfer the money back and confirm success with
calling ``refund.done()``. This will only ever be called if either ``BasePaymentProvider.payment_refund_supported(payment)``
or ``BasePaymentProvider.payment_partial_refund_supported(payment)`` return ``True``.
Processing external refunds
"""""""""""""""""""""""""""
* If e.g. a webhook API notifies you that a payment has been disputed or refunded with the external API, you are
expected to call ``OrderPayment.create_external_refund(self, amount, execution_date, info='{}')`` on this payment.
This will create and return an appropriate ``OrderRefund`` object and send out a notification. However, it will not
mark the order as refunded, but will ask the event organizer for a decision.
Data shredders
""""""""""""""
* The method ``BasePaymentProvider.shred_payment_info`` is no longer passed an order, but instead **either**
an ``OrderPayment`` **or** an ``OrderRefund``.

View File

@@ -107,7 +107,7 @@ dependencies = [
[project.optional-dependencies]
memcached = ["pylibmc"]
dev = [
"aiohttp==3.12.*",
"aiohttp==3.11.*",
"coverage",
"coveralls",
"fakeredis==2.26.*",
@@ -122,7 +122,7 @@ dev = [
"pytest-django==4.*",
"pytest-mock==3.14.*",
"pytest-sugar",
"pytest-xdist==3.7.*",
"pytest-xdist==3.6.*",
"pytest==8.3.*",
"responses",
]

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

@@ -184,7 +184,8 @@ class NamePartsWidget(forms.MultiWidget):
these_attrs.pop('data-no-required-attr', None)
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]
these_attrs['aria-label'] = self.scheme['fields'][i][1]
if len(self.widgets) > 1:
these_attrs['aria-label'] = self.scheme['fields'][i][1]
else:
these_attrs = final_attrs
output.append(widget.render(name + '_%s' % i, widget_value, these_attrs, renderer=renderer))

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
@@ -689,6 +632,11 @@ class BasePaymentProvider:
the ``_restrict_countries`` and ``_restrict_to_sales_channels`` setting.
:param total: The total value without the payment method fee, after taxes.
.. versionchanged:: 1.17.0
The ``total`` parameter has been added. For backwards compatibility, this method is called again
without this parameter if it raises a ``TypeError`` on first try.
"""
timing = self._is_available_by_time(cart_id=get_or_create_cart_id(request))
pricing = True
@@ -746,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)
@@ -1370,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:
@@ -1445,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.")
@@ -1468,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,
@@ -1535,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,
@@ -1546,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

@@ -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-06-02 09:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"PO-Revision-Date: 2025-05-27 23:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n"
"Language: ja\n"
@@ -32540,8 +32540,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 "予約を更新"
msgstr "イベントの説明"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
msgid "Overview of your ordered products."

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-06-02 09:00+0000\n"
"PO-Revision-Date: 2025-05-12 13:00+0000\n"
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/ja/>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
"js/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -727,27 +727,34 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "カート内の商品の予約は {num} 分以内に完了します。"
#: pretix/static/pretixpresale/js/ui/cart.js:86
#, fuzzy
#| msgid "Cart expired"
msgid "Your cart has expired."
msgstr "カートの保存期限が切れています"
msgstr "カートの有効期限が切れています"
#: 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 "カートに入っている商品はお取り置きできません。在庫があれば、このまま注文を進"
"めることができます。"
msgstr ""
"カートに入っている商品は現在売り切れです。在庫があれば、このまま注文を完了す"
"ることができます。"
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Do you want to renew the reservation period?"
msgstr "予約の期間を更新しますか?"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:93
msgid "Renew reservation"
msgstr "予約を更新"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "主催者は%(currency)s %(amount)sを留保します"
msgstr "主催者は%(currency)s %(amount)sが与えられます"
#: pretix/static/pretixpresale/js/ui/main.js:202
msgid "You get %(currency)s %(amount)s back"
@@ -755,7 +762,7 @@ msgstr "%(currency)s %(amount)s が払い戻されます"
#: pretix/static/pretixpresale/js/ui/main.js:218
msgid "Please enter the amount the organizer can keep."
msgstr "主催者が留保する料金を入力してください。"
msgstr "イベント開催者が受け取る料金を入力してください。"
#: pretix/static/pretixpresale/js/ui/main.js:558
msgid "Your local time:"

View File

@@ -79,7 +79,7 @@ class CheckoutFieldRenderer(FieldRenderer):
def __init__(self, *args, **kwargs):
kwargs['layout'] = 'horizontal'
super().__init__(*args, **kwargs)
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or self.is_multi_widget
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
def get_form_group_class(self):
form_group_class = self.form_group_class

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

@@ -186,7 +186,7 @@
{% endif %}
{% endif %}
</div>
{% if not item.current_unavailability_reason and not var.current_unavailability_reason and var.cached_availability.0 == 100 or var.initial %}
{% if var.cached_availability.0 == 100 or var.initial %}
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if c.max_count == 1 or not c.multi_allowed %}
<label class="btn btn-default btn-checkbox">
@@ -327,7 +327,7 @@
{% endif %}
</p>
</div>
{% if not item.current_unavailability_reason and item.cached_availability.0 == 100 or item.initial %}
{% if item.cached_availability.0 == 100 or item.initial %}
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if c.max_count == 1 or not c.multi_allowed %}
<label class="btn btn-default btn-checkbox">

View File

@@ -2,21 +2,22 @@
{% load eventurl %}
{% load urlreplace %}
<div class="btn-group" role="navigation" aria-label="{% trans "Event overview by month, week, etc." %}">
<a href="?{% url_replace request "style" "list" "date" "" %}"
class="btn btn-default{% if style == "list" %} active" aria-current="page{% endif %}">
<div class="btn-group" role="group">
<a href="?{% url_replace request "style" "list" "date" "" %}" type="button"
class="btn btn-default{% if style == "list" %} active{% endif %}">
{% trans "List" %}
</a>
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "week" "old" "" "page" "" "date" date|date:"o-\WW" %}{% else %}{% url_replace request "style" "week" "old" "" "page" "" %}{% endif %}"
class="btn btn-default{% if style == "week" %} active" aria-current="page{% endif %}">
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "week" "old" "" "page" "" "date" date|date:"o-\WW" %}{% else %}{% url_replace request "style" "week" "old" "" "page" "" %}{% endif %}" type="button"
class="btn btn-default{% if style == "week" %} active{% endif %}">
{% trans "Week" %}
</a>
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "calendar" "old" "" "page" "" "date" date|date:"Y-m" %}{% else %}{% url_replace request "style" "calendar" "old" "" "page" "" %}{% endif %}"
class="btn btn-default{% if style == "calendar" %} active" aria-current="page{% endif %}">
type="button"
class="btn btn-default{% if style == "calendar" %} active{% endif %}">
{% trans "Month" %}
</a>
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "day" "old" "" "page" "" "date" date|date:"Y-m-d" %}{% else %}{% url_replace request "style" "day" "old" "" "page" "" "date" %}{% endif %}"
class="btn btn-default{% if style == "day" %} active" aria-current="page{% endif %}">
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "day" "old" "" "page" "" "date" date|date:"Y-m-d" %}{% else %}{% url_replace request "style" "day" "old" "" "page" "" "date" %}{% endif %}" type="button"
class="btn btn-default{% if style == "day" %} active{% endif %}">
{% trans "Day" %}
</a>
</div>

View File

@@ -4,11 +4,7 @@
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}
{% blocktrans trimmed with month=date|date:"F Y" %}
Events in {{ month }}
{% endblocktrans %}
{% endblock %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div class="blank-after">

View File

@@ -4,11 +4,7 @@
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}
{% blocktrans trimmed with day=date|date:"DATE_FORMAT" %}
Events on {{ day }}
{% endblocktrans %}
{% endblock %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div class="blank-after">

View File

@@ -4,11 +4,7 @@
{% load rich_text %}
{% load eventurl %}
{% load urlreplace %}
{% block title %}
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date_to|date:short_month_day_format %}
Events in {{ week }} ({{ week_day_from }} {{ week_day_to }})
{% endblocktrans %}
{% endblock %}
{% block title %}{% trans "Event overview" %}{% endblock %}
{% block content %}
{% if organizer_homepage_text %}
<div class="blank-after">
@@ -22,7 +18,7 @@
<div class="panel-heading">
<h2 class="panel-title">
<strong>
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date_to|date:short_month_day_format %}
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date|date:short_month_day_format %}
Events in {{ week }} ({{ week_day_from }} {{ week_day_to }})
{% endblocktrans %}
</strong>

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

@@ -811,7 +811,6 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
) + timedelta(days=1)
ctx['date'] = week.monday()
ctx['date_to'] = week.sunday()
ctx['before'] = before
ctx['after'] = after

View File

@@ -8,8 +8,8 @@
"name": "pretix",
"version": "0.0.0",
"dependencies": {
"@babel/core": "^7.27.4",
"@babel/preset-env": "^7.27.2",
"@babel/core": "^7.27.1",
"@babel/preset-env": "^7.27.1",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^16.0.1",
"rollup": "^2.79.1",
@@ -45,30 +45,30 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
"integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
"integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
"integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.27.3",
"@babel/helpers": "^7.27.4",
"@babel/parser": "^7.27.4",
"@babel/template": "^7.27.2",
"@babel/traverse": "^7.27.4",
"@babel/types": "^7.27.3",
"@babel/generator": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-module-transforms": "^7.27.1",
"@babel/helpers": "^7.27.1",
"@babel/parser": "^7.27.1",
"@babel/template": "^7.27.1",
"@babel/traverse": "^7.27.1",
"@babel/types": "^7.27.1",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -103,13 +103,13 @@
}
},
"node_modules/@babel/generator": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
"integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
"integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.3",
"@babel/types": "^7.27.3",
"@babel/parser": "^7.27.1",
"@babel/types": "^7.27.1",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -144,12 +144,12 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
"integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
"@babel/compat-data": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
@@ -278,14 +278,14 @@
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
"integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/traverse": "^7.27.3"
"@babel/traverse": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -404,25 +404,25 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
"integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3"
"@babel/template": "^7.27.1",
"@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
"integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
"integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
"@babel/types": "^7.27.1"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -714,9 +714,9 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz",
"integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz",
"integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -1041,14 +1041,13 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz",
"integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz",
"integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==",
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/plugin-transform-destructuring": "^7.27.3",
"@babel/plugin-transform-parameters": "^7.27.1"
},
"engines": {
@@ -1354,13 +1353,13 @@
}
},
"node_modules/@babel/preset-env": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
"integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz",
"integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==",
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/compat-data": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
@@ -1402,7 +1401,7 @@
"@babel/plugin-transform-new-target": "^7.27.1",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
"@babel/plugin-transform-numeric-separator": "^7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.27.2",
"@babel/plugin-transform-object-rest-spread": "^7.27.1",
"@babel/plugin-transform-object-super": "^7.27.1",
"@babel/plugin-transform-optional-catch-binding": "^7.27.1",
"@babel/plugin-transform-optional-chaining": "^7.27.1",
@@ -1458,13 +1457,13 @@
}
},
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
"integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/parser": "^7.27.2",
"@babel/parser": "^7.27.1",
"@babel/types": "^7.27.1"
},
"engines": {
@@ -1472,16 +1471,16 @@
}
},
"node_modules/@babel/traverse": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
"integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/parser": "^7.27.4",
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3",
"@babel/generator": "^7.27.1",
"@babel/parser": "^7.27.1",
"@babel/template": "^7.27.1",
"@babel/types": "^7.27.1",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1490,9 +1489,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -3839,25 +3838,25 @@
}
},
"@babel/compat-data": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
"integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw=="
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
"integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A=="
},
"@babel/core": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
"integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
"requires": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.27.3",
"@babel/helpers": "^7.27.4",
"@babel/parser": "^7.27.4",
"@babel/template": "^7.27.2",
"@babel/traverse": "^7.27.4",
"@babel/types": "^7.27.3",
"@babel/generator": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-module-transforms": "^7.27.1",
"@babel/helpers": "^7.27.1",
"@babel/parser": "^7.27.1",
"@babel/template": "^7.27.1",
"@babel/traverse": "^7.27.1",
"@babel/types": "^7.27.1",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -3878,12 +3877,12 @@
}
},
"@babel/generator": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
"integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
"integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
"requires": {
"@babel/parser": "^7.27.3",
"@babel/types": "^7.27.3",
"@babel/parser": "^7.27.1",
"@babel/types": "^7.27.1",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -3910,11 +3909,11 @@
}
},
"@babel/helper-compilation-targets": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
"integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
"requires": {
"@babel/compat-data": "^7.27.2",
"@babel/compat-data": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
@@ -4010,13 +4009,13 @@
}
},
"@babel/helper-module-transforms": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
"integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
"requires": {
"@babel/helper-module-imports": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/traverse": "^7.27.3"
"@babel/traverse": "^7.27.1"
}
},
"@babel/helper-optimise-call-expression": {
@@ -4087,20 +4086,20 @@
}
},
"@babel/helpers": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
"integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
"requires": {
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3"
"@babel/template": "^7.27.1",
"@babel/types": "^7.27.1"
}
},
"@babel/parser": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
"integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
"integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
"requires": {
"@babel/types": "^7.27.3"
"@babel/types": "^7.27.1"
}
},
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
@@ -4263,9 +4262,9 @@
}
},
"@babel/plugin-transform-destructuring": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz",
"integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz",
"integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==",
"requires": {
"@babel/helper-plugin-utils": "^7.27.1"
}
@@ -4443,13 +4442,12 @@
}
},
"@babel/plugin-transform-object-rest-spread": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz",
"integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz",
"integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==",
"requires": {
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/plugin-transform-destructuring": "^7.27.3",
"@babel/plugin-transform-parameters": "^7.27.1"
}
},
@@ -4616,12 +4614,12 @@
}
},
"@babel/preset-env": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
"integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz",
"integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==",
"requires": {
"@babel/compat-data": "^7.27.2",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/compat-data": "^7.27.1",
"@babel/helper-compilation-targets": "^7.27.1",
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
@@ -4663,7 +4661,7 @@
"@babel/plugin-transform-new-target": "^7.27.1",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
"@babel/plugin-transform-numeric-separator": "^7.27.1",
"@babel/plugin-transform-object-rest-spread": "^7.27.2",
"@babel/plugin-transform-object-rest-spread": "^7.27.1",
"@babel/plugin-transform-object-super": "^7.27.1",
"@babel/plugin-transform-optional-catch-binding": "^7.27.1",
"@babel/plugin-transform-optional-chaining": "^7.27.1",
@@ -4709,33 +4707,33 @@
}
},
"@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
"integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
"requires": {
"@babel/code-frame": "^7.27.1",
"@babel/parser": "^7.27.2",
"@babel/parser": "^7.27.1",
"@babel/types": "^7.27.1"
}
},
"@babel/traverse": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
"integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
"requires": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.27.3",
"@babel/parser": "^7.27.4",
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.3",
"@babel/generator": "^7.27.1",
"@babel/parser": "^7.27.1",
"@babel/template": "^7.27.1",
"@babel/types": "^7.27.1",
"debug": "^4.3.1",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"

View File

@@ -4,8 +4,8 @@
"private": true,
"scripts": {},
"dependencies": {
"@babel/core": "^7.27.4",
"@babel/preset-env": "^7.27.2",
"@babel/core": "^7.27.1",
"@babel/preset-env": "^7.27.1",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^16.0.1",
"vue": "^2.7.16",

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

@@ -170,10 +170,6 @@ input:focus, .form-control:focus {
.btn-checkbox input:focus, .input-item-count-group input:focus, .input-group-price input:focus {
outline: none;
}
/* bootstrap sets dark background for active elements with hover/focus, we need to match specifity of selector */
.btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus {
background-color: inherit;
}
/* border-radius on these containers is needed for correctly rounded focus-outlines */
.input-item-count-group, .input-group-price {
border-radius: var(--pretix-border-radius-base);

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():