Compare commits

..

29 Commits

Author SHA1 Message Date
Raphael Michel
b2237af4c0 Only show product settings that match quotas 2025-10-06 14:07:38 +02:00
Raphael Michel
43c2f15994 Make submit row sticky on really long forms 2025-10-06 12:50:41 +02:00
Raphael Michel
571724b1f7 Use select2 item input in newly added quotas 2025-10-06 12:45:25 +02:00
Raphael Michel
85a9a3caa6 Run exporters in repeatable read by default (Z#23173095) (#5500)
* Run exporters in repeatable read by default (Z#23173095)

* Update src/pretix/helpers/database.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Rename parameter, add test

* Do not run during tests

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2025-10-06 10:38:19 +02:00
Sebastian Bożek
42b1010c36 Translations: Update Polish
Currently translated at 95.5% (5803 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Jan Van Haver
5b851e270b Translations: Update Dutch
Currently translated at 97.2% (5907 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Sebastian Bożek
2b796aa45e Translations: Update Finnish
Currently translated at 64.4% (3917 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Sebastian Bożek
11460d878b Translations: Update Polish
Currently translated at 95.5% (5803 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Yasunobu YesNo Kawaguchi
1ce4c11572 Translations: Update Japanese
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Mira
11269c277b Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Mira
2650bf6f4f Translations: Update German
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-06 09:53:18 +02:00
Raphael Michel
301191e4bd Notification queues: Optimize order for less queries (#5512)
* Notification queues: Optimize order for less queries

* Update src/pretix/api/webhooks.py

Co-authored-by: luelista <weller@rami.io>

---------

Co-authored-by: luelista <weller@rami.io>
2025-10-06 09:24:51 +02:00
Raphael Michel
867cd8c59e Model import: Create logentries in bulk (#5511)
* Model import: Create logentries in bulk

* Update src/pretix/base/services/modelimport.py

Co-authored-by: luelista <weller@rami.io>

---------

Co-authored-by: luelista <weller@rami.io>
2025-10-06 09:24:39 +02:00
Raphael Michel
7e8da3cef6 Do not sent "payment failed" email if payment is no longer expected (Z#23202699) (#5509) 2025-10-06 09:24:20 +02:00
Raphael Michel
25f57f89b0 Order import: Additional warning for disabling test mode (Z#23208360) (#5494) 2025-10-02 19:14:29 +02:00
Martin Gross
22f351cb89 OCM: Ignore already canceled addons in remaining item calculation (Z#23209824) 2025-10-02 10:30:33 +02:00
Raphael Michel
2611ff74a5 Badges: Fix incorrect offsets for DURABLE 8334-02 2025-10-02 09:57:59 +02:00
Hijiri Umemoto
cc1c7e1c23 Translations: Update Japanese
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-02 09:50:39 +02:00
CVZ-es
e2eedac93b Translations: Update Spanish
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-02 09:50:39 +02:00
CVZ-es
432064c3ae Translations: Update French
Currently translated at 100.0% (6076 of 6076 strings)

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

powered by weblate
2025-10-02 09:50:39 +02:00
Raphael Michel
457115f4ca Add refund comment to gift card transaction text (Z#23208349) (#5499)
* Add refund comment to gift card transaction text (Z#23208349)

* Update src/pretix/base/models/giftcards.py

Co-authored-by: luelista <weller@rami.io>

---------

Co-authored-by: luelista <weller@rami.io>
2025-10-02 09:38:32 +02:00
luelista
9d5563018e Add "bulk" argument to order_placed signal (#5505)
* datasync: add immediate parameter to enqueue_order

* interactive argument for order_placed signal

The ``interactive`` argument specifies whether the order was
placed interactively, by a customer (as opposed to via a bulk
import or the REST API).

* use bulk=True instead of interactive=False to mark bulk imports
2025-10-02 09:36:02 +02:00
luelista
425f4da1f1 datasync: add immediate parameter to enqueue_order (#5504) 2025-10-02 09:34:56 +02:00
dependabot[bot]
aa0ea27d6c Update isort requirement from ==6.0.* to ==6.1.* (#5507) 2025-10-02 09:32:10 +02:00
dependabot[bot]
5a2219124a Bump @babel/core from 7.28.3 to 7.28.4 in /src/pretix/static/npm_dir (#5506)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.28.3 to 7.28.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.28.4/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-version: 7.28.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-02 09:32:02 +02:00
luelista
f79813ea32 datasync: return a reference to newly create queue item (#5502) 2025-09-30 17:25:25 +02:00
luelista
ba62db7a19 Fix version number (2024 -> 2025) 2025-09-30 16:01:27 +02:00
Jan Van Haver
aa8b699b89 Translations: Update Dutch
Currently translated at 96.9% (5892 of 6076 strings)

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

powered by weblate
2025-09-30 09:19:26 +02:00
dependabot[bot]
6adabd54dc Update beautifulsoup4 requirement from ==4.13.* to ==4.14.*
Updates the requirements on [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) to permit the latest version.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-version: 4.14.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-30 09:19:21 +02:00
31 changed files with 423 additions and 432 deletions

View File

@@ -28,14 +28,14 @@ classifiers = [
dependencies = [ dependencies = [
"arabic-reshaper==3.0.0", # Support for Arabic in reportlab "arabic-reshaper==3.0.0", # Support for Arabic in reportlab
"babel", "babel",
"BeautifulSoup4==4.13.*", "BeautifulSoup4==4.14.*",
"bleach==6.2.*", "bleach==6.2.*",
"celery==5.5.*", "celery==5.5.*",
"chardet==5.2.*", "chardet==5.2.*",
"cryptography>=44.0.0", "cryptography>=44.0.0",
"css-inline==0.17.*", "css-inline==0.17.*",
"defusedcsv>=1.1.0", "defusedcsv>=1.1.0",
"Django[argon2]==4.2.*,>=4.2.25", "Django[argon2]==4.2.*,>=4.2.24",
"django-bootstrap3==25.2", "django-bootstrap3==25.2",
"django-compressor==4.5.1", "django-compressor==4.5.1",
"django-countries==7.6.*", "django-countries==7.6.*",
@@ -113,7 +113,7 @@ dev = [
"fakeredis==2.31.*", "fakeredis==2.31.*",
"flake8==7.3.*", "flake8==7.3.*",
"freezegun", "freezegun",
"isort==6.0.*", "isort==6.1.*",
"pep8-naming==0.15.*", "pep8-naming==0.15.*",
"potypo", "potypo",
"pytest-asyncio>=0.24", "pytest-asyncio>=0.24",

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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
__version__ = "2024.9.0.dev0" __version__ = "2025.9.0.dev0"

View File

@@ -743,7 +743,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
user=request.user if request.user.is_authenticated else None, user=request.user if request.user.is_authenticated else None,
auth=request.auth, auth=request.auth,
) )
order_placed.send(self.request.event, order=order) order_placed.send(self.request.event, order=order, bulk=False)
if order.status == Order.STATUS_PAID: if order.status == Order.STATUS_PAID:
order_paid.send(self.request.event, order=order) order_paid.send(self.request.event, order=order)
order.log_action( order.log_action(

View File

@@ -439,8 +439,12 @@ def register_default_webhook_events(sender, **kwargs):
def notify_webhooks(logentry_ids: list): def notify_webhooks(logentry_ids: list):
if not isinstance(logentry_ids, list): if not isinstance(logentry_ids, list):
logentry_ids = [logentry_ids] logentry_ids = [logentry_ids]
qs = LogEntry.all.select_related('event', 'event__organizer', 'organizer').filter(id__in=logentry_ids) qs = LogEntry.all.select_related(
_org, _at, webhooks = None, None, None 'event', 'event__organizer', 'organizer'
).order_by(
'action_type', 'organizer_id', 'event_id',
).filter(id__in=logentry_ids)
_org, _at, _ev, webhooks = None, None, None, None
for logentry in qs: for logentry in qs:
if not logentry.organizer: if not logentry.organizer:
break # We need to know the organizer break # We need to know the organizer
@@ -450,7 +454,7 @@ def notify_webhooks(logentry_ids: list):
if not notification_type: if not notification_type:
break # Ignore, no webhooks for this event type break # Ignore, no webhooks for this event type
if _org != logentry.organizer or _at != logentry.action_type or webhooks is None: if _org != logentry.organizer or _at != logentry.action_type or _ev != logentry.event_id or webhooks is None:
_org = logentry.organizer _org = logentry.organizer
_at = logentry.action_type _at = logentry.action_type

View File

@@ -106,7 +106,7 @@ class OutboundSyncProvider:
return str(cls.identifier) return str(cls.identifier)
@classmethod @classmethod
def enqueue_order(cls, order, triggered_by, not_before=None): def enqueue_order(cls, order, triggered_by, not_before=None, immediate=False):
""" """
Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute. Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute.
@@ -119,10 +119,14 @@ class OutboundSyncProvider:
:param order: the Order that should be synced :param order: the Order that should be synced
:param triggered_by: the reason why the order should be synced, e.g. name of the signal :param triggered_by: the reason why the order should be synced, e.g. name of the signal
(currently only used internally for logging) (currently only used internally for logging)
:param immediate: whether a new sync task should run immediately for this order, instead
of waiting for the next periodic_task interval
:return: Return a tuple (queue_item, created), where created is a boolean
specifying whether a new queue item was created.
""" """
if not hasattr(cls, 'identifier'): if not hasattr(cls, 'identifier'):
raise TypeError('Call this method on a derived class that defines an "identifier" attribute.') raise TypeError('Call this method on a derived class that defines an "identifier" attribute.')
OrderSyncQueue.objects.update_or_create( queue_item, created = OrderSyncQueue.objects.update_or_create(
order=order, order=order,
sync_provider=cls.identifier, sync_provider=cls.identifier,
in_flight=False, in_flight=False,
@@ -133,6 +137,10 @@ class OutboundSyncProvider:
"need_manual_retry": None, "need_manual_retry": None,
}, },
) )
if immediate:
from pretix.base.services.datasync import sync_single
sync_single.apply_async(args=(queue_item.pk,))
return queue_item, created
@classmethod @classmethod
def get_external_link_info(cls, event, external_link_href, external_link_display_name): def get_external_link_info(cls, event, external_link_href, external_link_display_name):

View File

@@ -195,20 +195,21 @@ class GiftCardTransaction(models.Model):
return response return response
if self.order_id: if self.order_id:
if not self.text: if not customer_facing:
if not customer_facing: return format_html(
return format_html( '<a href="{}">{}</a> {}',
'<a href="{}">{}</a>', reverse(
reverse( "control:event.order",
"control:event.order", kwargs={
kwargs={ "event": self.order.event.slug,
"event": self.order.event.slug, "organizer": self.order.event.organizer.slug,
"organizer": self.order.event.organizer.slug, "code": self.order.code,
"code": self.order.code, }
} ),
), self.order.full_code,
self.order.full_code self.text or "",
) )
elif not self.text:
return self.order.full_code return self.order.full_code
else: else:
return self.text return self.text

View File

@@ -1840,6 +1840,10 @@ class OrderPayment(models.Model):
)) ))
return False return False
if locked_instance.state == OrderPayment.PAYMENT_STATE_CANCELED:
# Never send mails when the payment was already canceled intentionally
send_mail = False
if isinstance(info, str): if isinstance(info, str):
locked_instance.info = info locked_instance.info = info
elif info: elif info:
@@ -1855,6 +1859,10 @@ class OrderPayment(models.Model):
'data': log_data, 'data': log_data,
}, user=user, auth=auth) }, user=user, auth=auth)
if self.order.status in (Order.STATUS_PAID, Order.STATUS_CANCELED, Order.STATUS_EXPIRED):
# No reason to send mail, as the payment is no longer really expected
send_mail = False
if send_mail: if send_mail:
with language(self.order.locale, self.order.event.settings.region): with language(self.order.locale, self.order.event.settings.region):
email_subject = self.order.event.settings.mail_subject_order_payment_failed email_subject = self.order.event.settings.mail_subject_order_payment_failed

View File

@@ -1627,6 +1627,7 @@ class GiftCardPayment(BasePaymentProvider):
order=refund.order, order=refund.order,
refund=refund, refund=refund,
acceptor=self.event.organizer, acceptor=self.event.organizer,
text=refund.comment,
) )
refund.info_data = { refund.info_data = {
'gift_card': gc.pk, 'gift_card': gc.pk,

View File

@@ -33,8 +33,8 @@ from pretix.base.modelimport import DataImportError, ImportColumn, parse_csv
from pretix.base.modelimport_orders import get_order_import_columns from pretix.base.modelimport_orders import get_order_import_columns
from pretix.base.modelimport_vouchers import get_voucher_import_columns from pretix.base.modelimport_vouchers import get_voucher_import_columns
from pretix.base.models import ( from pretix.base.models import (
CachedFile, Event, InvoiceAddress, Order, OrderPayment, OrderPosition, CachedFile, Event, InvoiceAddress, LogEntry, Order, OrderPayment,
User, Voucher, OrderPosition, User, Voucher,
) )
from pretix.base.models.orders import Transaction from pretix.base.models.orders import Transaction
from pretix.base.services.invoices import generate_invoice, invoice_qualified from pretix.base.services.invoices import generate_invoice, invoice_qualified
@@ -175,6 +175,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user,
raise DataImportError(_('The seat you selected has already been taken. Please select a different seat.')) raise DataImportError(_('The seat you selected has already been taken. Please select a different seat.'))
save_transactions = [] save_transactions = []
save_logentries = []
for o in orders: for o in orders:
o.total = sum([c.price for c in o._positions]) # currently no support for fees o.total = sum([c.price for c in o._positions]) # currently no support for fees
if o.total == Decimal('0.00'): if o.total == Decimal('0.00'):
@@ -211,17 +212,19 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user,
o._address.save() o._address.save()
for c in cols: for c in cols:
c.save(o) c.save(o)
o.log_action( save_logentries.append(o.log_action(
'pretix.event.order.placed', 'pretix.event.order.placed',
user=user, user=user,
data={'source': 'import'} data={'source': 'import'},
) save=False,
))
save_transactions += o.create_transactions(is_new=True, fees=[], positions=o._positions, save=False) save_transactions += o.create_transactions(is_new=True, fees=[], positions=o._positions, save=False)
Transaction.objects.bulk_create(save_transactions) Transaction.objects.bulk_create(save_transactions)
LogEntry.bulk_create_and_postprocess(save_logentries)
for o in orders: for o in orders:
with language(o.locale, event.settings.region): with language(o.locale, event.settings.region):
order_placed.send(event, order=o) order_placed.send(event, order=o, bulk=True)
if o.status == Order.STATUS_PAID: if o.status == Order.STATUS_PAID:
order_paid.send(event, order=o) order_paid.send(event, order=o)
@@ -286,13 +289,16 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
raise DataImportError( raise DataImportError(
_('The seat you selected has already been taken. Please select a different seat.')) _('The seat you selected has already been taken. Please select a different seat.'))
save_logentries = []
for v in vouchers: for v in vouchers:
v.save() v.save()
v.log_action( save_logentries.append(v.log_action(
'pretix.voucher.added', 'pretix.voucher.added',
user=user, user=user,
data={'source': 'import'} data={'source': 'import'},
) save=False,
))
for c in cols: for c in cols:
c.save(v) c.save(v)
LogEntry.bulk_create_and_postprocess(save_logentries)
cf.delete() cf.delete()

View File

@@ -41,7 +41,11 @@ def notify(logentry_ids: list):
if not isinstance(logentry_ids, list): if not isinstance(logentry_ids, list):
logentry_ids = [logentry_ids] logentry_ids = [logentry_ids]
qs = LogEntry.all.select_related('event', 'event__organizer').filter(id__in=logentry_ids) qs = LogEntry.all.select_related(
'event', 'event__organizer'
).order_by(
'action_type', 'event_id',
).filter(id__in=logentry_ids)
_event, _at, notify_specific, notify_global = None, None, None, None _event, _at, notify_specific, notify_global = None, None, None, None
for logentry in qs: for logentry in qs:

View File

@@ -1091,7 +1091,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no
for msg in meta_info.get('confirm_messages', []): for msg in meta_info.get('confirm_messages', []):
order.log_action('pretix.event.order.consent', data={'msg': msg}) order.log_action('pretix.event.order.consent', data={'msg': msg})
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
return order, payments return order, payments
@@ -2825,7 +2825,7 @@ class OrderChangeManager:
def _check_complete_cancel(self): def _check_complete_cancel(self):
current = self.order.positions.count() current = self.order.positions.count()
cancels = sum([ cancels = sum([
1 + o.position.addons.count() for o in self._operations if isinstance(o, self.CancelOperation) 1 + o.position.addons.filter(canceled=False).count() for o in self._operations if isinstance(o, self.CancelOperation)
]) + len([ ]) + len([
o for o in self._operations if isinstance(o, self.SplitOperation) o for o in self._operations if isinstance(o, self.SplitOperation)
]) ])

View File

@@ -665,12 +665,13 @@ As with all event-plugin signals, the ``sender`` keyword argument will contain t
order_placed = EventPluginSignal() order_placed = EventPluginSignal()
""" """
Arguments: ``order`` Arguments: ``order``, ``bulk``
This signal is sent out every time an order is placed. The order object is given This signal is sent out every time an order is placed. The order object is given
as the first argument. This signal is *not* sent out if an order is created through as the first argument. The ``bulk`` argument specifies whether the order was placed
splitting an existing order, so you can not expect to see all orders by listening as part of a bulk action, e.g. an import from a file.
to this signal. This signal is *not* sent out if an order is created through splitting an existing order,
so you can not expect to see all orders by listening to this signal.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event. As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
""" """

View File

@@ -21,6 +21,8 @@
# #
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.functional import lazy
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from pretix.base.modelimport_orders import get_order_import_columns from pretix.base.modelimport_orders import get_order_import_columns
@@ -71,6 +73,9 @@ class ProcessForm(forms.Form):
raise NotImplementedError() # noqa raise NotImplementedError() # noqa
format_html_lazy = lazy(format_html, str)
class OrdersProcessForm(ProcessForm): class OrdersProcessForm(ProcessForm):
orders = forms.ChoiceField( orders = forms.ChoiceField(
label=_('Import mode'), label=_('Import mode'),
@@ -91,7 +96,11 @@ class OrdersProcessForm(ProcessForm):
) )
testmode = forms.BooleanField( testmode = forms.BooleanField(
label=_('Create orders as test mode orders'), label=_('Create orders as test mode orders'),
required=False required=False,
help_text=format_html_lazy(
'<div class="alert alert-warning" data-display-dependency="#id_testmode" data-inverse>{}</div>',
_('Orders not created in test mode cannot be deleted again after import.')
)
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -100,6 +109,8 @@ class OrdersProcessForm(ProcessForm):
initital['testmode'] = self.event.testmode initital['testmode'] = self.event.testmode
kwargs['initial'] = initital kwargs['initial'] = initital
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if not self.event.testmode:
self.fields["testmode"].help_text = ""
def get_columns(self): def get_columns(self):
return get_order_import_columns(self.event) return get_order_import_columns(self.event)

View File

@@ -390,7 +390,8 @@ class QuotaFormSet(I18nInlineFormSet):
use_required_attribute=False, use_required_attribute=False,
locales=self.locales, locales=self.locales,
event=self.event, event=self.event,
items=self.items items=self.items,
searchable_selection=self.searchable_selection,
) )
self.add_fields(form, None) self.add_fields(form, None)
return form return form

View File

@@ -487,30 +487,32 @@
{% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %} {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %}
</p> </p>
{% for f in itemvar_forms %} {% for f in itemvar_forms %}
{% bootstrap_form_errors f %} <div data-itemvar="{{ f.item.id }}{% if f.variation %}-{{ f.variation.id }}{% endif %}">
<div class="form-group subevent-itemvar-group"> {% bootstrap_form_errors f %}
<label class="col-md-3 control-label" for="id_{{ f.prefix }}-price"> <div class="form-group subevent-itemvar-group">
{% if f.variation %}{{ f.item }} {{ f.variation }}{% else %}{{ f.item }}{% endif %} <label class="col-md-3 control-label" for="id_{{ f.prefix }}-price">
</label> {% if f.variation %}{{ f.item }} {{ f.variation }}{% else %}{{ f.item }}{% endif %}
<div class="col-md-4"> </label>
<label for="{{ f.price.id_for_label }}" class="text-muted">{% trans "Price" %}</label><br> <div class="col-md-4">
{% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} <label for="{{ f.price.id_for_label }}" class="text-muted">{% trans "Price" %}</label><br>
{% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %}
</div>
<div class="col-md-4">
<br>
{% bootstrap_field f.disabled layout="inline" form_group_class="" %}
</div>
</div> </div>
<div class="col-md-4"> <div class="form-group subevent-itemvar-group">
<br> <div class="col-md-4 col-md-offset-3">
{% bootstrap_field f.disabled layout="inline" form_group_class="" %} <label for="{{ f.rel_available_from.id_for_label }}" class="text-muted">{% trans "Available from" %}</label>
</div> {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}<br>
</div> {% bootstrap_field f.rel_available_from form_group_class="" layout="inline" %}
<div class="form-group subevent-itemvar-group"> </div>
<div class="col-md-4 col-md-offset-3"> <div class="col-md-4">
<label for="{{ f.rel_available_from.id_for_label }}" class="text-muted">{% trans "Available from" %}</label> <label for="{{ f.rel_available_until.id_for_label }}" class="text-muted">{% trans "Available until" %}</label>
{% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}<br> {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}<br>
{% bootstrap_field f.rel_available_from form_group_class="" layout="inline" %} {% bootstrap_field f.rel_available_until form_group_class="" layout="inline" %}
</div> </div>
<div class="col-md-4">
<label for="{{ f.rel_available_until.id_for_label }}" class="text-muted">{% trans "Available until" %}</label>
{% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}<br>
{% bootstrap_field f.rel_available_until form_group_class="" layout="inline" %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
@@ -625,7 +627,7 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</fieldset> </fieldset>
<div class="form-group submit-group"> <div class="form-group submit-group submit-group-sticky">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}
</button> </button>

View File

@@ -363,7 +363,7 @@
</div> </div>
{% endif %} {% endif %}
</fieldset> </fieldset>
<div class="form-group submit-group"> <div class="form-group submit-group submit-group-sticky">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}
</button> </button>

View File

@@ -130,30 +130,32 @@
{% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %} {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %}
</p> </p>
{% for f in itemvar_forms %} {% for f in itemvar_forms %}
{% bootstrap_form_errors f %} <div data-itemvar="{{ f.item.id }}{% if f.variation %}-{{ f.variation.id }}{% endif %}">
<div class="form-group subevent-itemvar-group"> {% bootstrap_form_errors f %}
<label class="col-md-3 control-label" for="id_{{ f.prefix }}-price"> <div class="form-group subevent-itemvar-group">
{% if f.variation %}{{ f.item }} {{ f.variation }}{% else %}{{ f.item }}{% endif %} <label class="col-md-3 control-label" for="id_{{ f.prefix }}-price">
</label> {% if f.variation %}{{ f.item }} {{ f.variation }}{% else %}{{ f.item }}{% endif %}
<div class="col-md-4"> </label>
<label for="{{ f.price.id_for_label }}" class="text-muted">{% trans "Price" %}</label><br> <div class="col-md-4">
{% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} <label for="{{ f.price.id_for_label }}" class="text-muted">{% trans "Price" %}</label><br>
{% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %}
</div>
<div class="col-md-4">
<br>
{% bootstrap_field f.disabled layout="inline" form_group_class="" %}
</div>
</div> </div>
<div class="col-md-4"> <div class="form-group subevent-itemvar-group">
<br> <div class="col-md-4 col-md-offset-3">
{% bootstrap_field f.disabled layout="inline" form_group_class="" %} <label for="{{ f.available_from.id_for_label }}" class="text-muted">{% trans "Available from" %}</label>
</div> {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}<br>
</div> {% bootstrap_field f.available_from form_group_class="foo" layout="inline" %}
<div class="form-group subevent-itemvar-group"> </div>
<div class="col-md-4 col-md-offset-3"> <div class="col-md-4">
<label for="{{ f.available_from.id_for_label }}" class="text-muted">{% trans "Available from" %}</label> <label for="{{ f.available_until.id_for_label }}" class="text-muted">{% trans "Available until" %}</label>
{% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}<br> {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}<br>
{% bootstrap_field f.available_from form_group_class="foo" layout="inline" %} {% bootstrap_field f.available_until form_group_class="" layout="inline" %}
</div> </div>
<div class="col-md-4">
<label for="{{ f.available_until.id_for_label }}" class="text-muted">{% trans "Available until" %}</label>
{% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}<br>
{% bootstrap_field f.available_until form_group_class="" layout="inline" %}
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
@@ -282,7 +284,7 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="form-group submit-group"> <div class="form-group submit-group submit-group-sticky">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}
</button> </button>

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-09-26 13:02+0000\n" "PO-Revision-Date: 2025-10-03 01:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n" "Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/" "Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n" ">\n"
"Language: de\n" "Language: de\n"
@@ -28214,7 +28214,7 @@ msgstr ""
#: pretix/control/views/modelimport.py:174 #: pretix/control/views/modelimport.py:174
msgid "The import was successful." msgid "The import was successful."
msgstr "Die Import war erfolgreich." msgstr "Der Import war erfolgreich."
#: pretix/control/views/modelimport.py:186 #: pretix/control/views/modelimport.py:186
msgid "We've been unable to parse the uploaded file as a CSV file." msgid "We've been unable to parse the uploaded file as a CSV file."

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-09-26 13:02+0000\n" "PO-Revision-Date: 2025-10-03 01:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n" "Last-Translator: Mira <weller@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/" "Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n" "pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n" "Language: de_Informal\n"
@@ -28172,7 +28172,7 @@ msgstr ""
#: pretix/control/views/modelimport.py:174 #: pretix/control/views/modelimport.py:174
msgid "The import was successful." msgid "The import was successful."
msgstr "Die Import war erfolgreich." msgstr "Der Import war erfolgreich."
#: pretix/control/views/modelimport.py:186 #: pretix/control/views/modelimport.py:186
msgid "We've been unable to parse the uploaded file as a CSV file." msgid "We've been unable to parse the uploaded file as a CSV file."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-08-30 02:00+0000\n" "PO-Revision-Date: 2025-09-30 16:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n" "es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13\n" "X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -810,28 +810,23 @@ msgstr ""
"Primero verifique la dirección de correo electrónico en su cuenta de cliente." "Primero verifique la dirección de correo electrónico en su cuenta de cliente."
#: pretix/base/datasync/datasync.py:255 #: pretix/base/datasync/datasync.py:255
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} " "Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings." "settings."
msgstr "" msgstr ""
"El campo «{field_name}» no es válido para {available_inputs}. Comprueba la " "El campo «{field_name}» no existe. Comprueba la configuración de "
"configuración de {provider_name}." "{provider_name}."
#: pretix/base/datasync/datasync.py:262 #: pretix/base/datasync/datasync.py:262
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" requires {required_input}, but only got " "Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings." "{available_inputs}. Please check your {provider_name} settings."
msgstr "" msgstr ""
"El campo «{field_name}» no es válido para {available_inputs}. Comprueba la " "El campo «{field_name}» requiere {required_input}, pero solo se ha "
"configuración de {provider_name}." "introducido {available_inputs}. Comprueba la configuración de "
"{provider_name}."
#: pretix/base/datasync/datasync.py:273 #: pretix/base/datasync/datasync.py:273
#, python-brace-format #, python-brace-format
@@ -3559,6 +3554,11 @@ msgid ""
"in accordance with the procedures and terms set forth in No. 89757/2018 of " "in accordance with the procedures and terms set forth in No. 89757/2018 of "
"April 30, 2018, issued by the Director of the Revenue Agency." "April 30, 2018, issued by the Director of the Revenue Agency."
msgstr "" msgstr ""
"Este documento PDF es una copia visual de la factura y no constituye una "
"factura a efectos del IVA. La factura se emite en formato XML, transmitida "
"de acuerdo con los procedimientos y términos establecidos en el n.º 89757/"
"2018, de 30 de abril de 2018, emitido por el Director de la Agencia "
"Tributaria."
#: pretix/base/invoicing/pdf.py:141 #: pretix/base/invoicing/pdf.py:141
#, python-format #, python-format
@@ -3829,12 +3829,9 @@ msgid "Peppol participant ID"
msgstr "Identificador de participante Peppol" msgstr "Identificador de participante Peppol"
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "Código fiscal" msgstr "Copia visual"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -3843,6 +3840,9 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and " "invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network." "transmitted through the Peppol network."
msgstr "" msgstr ""
"Este documento PDF es una copia visual de la factura y no constituye una "
"factura a efectos del IVA. La factura original se emite en formato XML y se "
"transmite a través de la red Peppol."
#: pretix/base/logentrytype_registry.py:43 #: pretix/base/logentrytype_registry.py:43
msgid "" msgid ""
@@ -14387,10 +14387,8 @@ msgid "Canceled (fully or with paid fee)"
msgstr "Cancelado (totalmente o con tarifa pagada)" msgstr "Cancelado (totalmente o con tarifa pagada)"
#: pretix/control/forms/filter.py:228 #: pretix/control/forms/filter.py:228
#, fuzzy
#| msgid "Cancel this position"
msgid "Canceled (at least one position)" msgid "Canceled (at least one position)"
msgstr "Cancelar posición" msgstr "Cancelado (al menos una posición)"
#: pretix/control/forms/filter.py:229 #: pretix/control/forms/filter.py:229
msgid "Cancellation requested" msgid "Cancellation requested"
@@ -17130,10 +17128,9 @@ msgid "The voucher has been deleted."
msgstr "El vale de compra fue eliminado." msgstr "El vale de compra fue eliminado."
#: pretix/control/logdisplay.py:584 #: pretix/control/logdisplay.py:584
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "The voucher has been sent to {email} through the waiting list."
msgid "The voucher has been assigned to {email} through the waiting list." msgid "The voucher has been assigned to {email} through the waiting list."
msgstr "El vale se ha enviado a {email} a través de la lista de espera." msgstr "El vale se ha asignado a {email} a través de la lista de espera."
#: pretix/control/logdisplay.py:593 #: pretix/control/logdisplay.py:593
#, python-brace-format #, python-brace-format
@@ -27677,11 +27674,11 @@ msgstr ""
"próximos minutos." "próximos minutos."
#: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104 #: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104
#, fuzzy
#| msgid "The voucher \"{voucher}\" has been used in the meantime."
msgid "" msgid ""
"The sync job could not be found. It may have been processed in the meantime." "The sync job could not be found. It may have been processed in the meantime."
msgstr "El vale de compra {voucher} ya ha sido utilizado." msgstr ""
"No se ha encontrado la tarea de sincronización. Es posible que se haya "
"procesado mientras tanto."
#: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107 #: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107
msgid "The sync job is already in progress." msgid "The sync job is already in progress."
@@ -28674,12 +28671,12 @@ msgstr ""
"programado para {name}." "programado para {name}."
#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207 #: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207
#, fuzzy
#| msgid "You do not have sufficient permission to perform this export."
msgid "" msgid ""
"Your user account does not have sufficient permission to run this report, " "Your user account does not have sufficient permission to run this report, "
"therefore you cannot schedule it." "therefore you cannot schedule it."
msgstr "No tiene permiso suficiente para realizar esta exportación." msgstr ""
"Su cuenta de usuario no tiene permisos suficientes para ejecutar este "
"informe, por lo que no puede programarlo."
#: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259 #: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259
msgid "" msgid ""
@@ -29044,17 +29041,14 @@ msgid "A date can not be deleted if orders already have been placed."
msgstr "No se puede borrar una fecha si ya se han realizado pedidos." msgstr "No se puede borrar una fecha si ya se han realizado pedidos."
#: pretix/control/views/subevents.py:203 #: pretix/control/views/subevents.py:203
#, fuzzy
#| msgid ""
#| "The channel could not be deleted as some constraints (e.g. data created "
#| "by plug-ins) did not allow it."
msgctxt "subevent" msgctxt "subevent"
msgid "" msgid ""
"The date could not be deleted as some constraints (e.g. data created by plug-" "The date could not be deleted as some constraints (e.g. data created by plug-"
"ins) did not allow it. The date was disabled instead." "ins) did not allow it. The date was disabled instead."
msgstr "" msgstr ""
"El canal no ha podido borrarse porque algunas restricciones (por ejemplo, " "La fecha no se pudo eliminar debido a que algunas restricciones (por "
"datos creados por plug-ins) no lo permitían." "ejemplo, datos creados por complementos) no lo permitían. En su lugar, se "
"desactivó la fecha."
#: pretix/control/views/subevents.py:207 #: pretix/control/views/subevents.py:207
msgctxt "subevent" msgctxt "subevent"
@@ -33878,18 +33872,12 @@ msgstr ""
"formar un contrato válido." "formar un contrato válido."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192
#, fuzzy
#| msgid ""
#| "After you submitted your order using the button below, it will require "
#| "approval by the event organizer before it can be confirmed and forms a "
#| "valid contract."
msgid "" msgid ""
"After you submitted your order using the button below, it will require " "After you submitted your order using the button below, it will require "
"approval by the event organizer." "approval by the event organizer."
msgstr "" msgstr ""
"Después de enviar su pedido usando el botón a continuación, requerirá la " "Después de enviar el pedido mediante el botón que aparece a continuación, "
"aprobación del organizador del evento antes de que pueda confirmarse y " "será necesario que el organizador del evento lo apruebe."
"formar un contrato válido."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195
msgid "" msgid ""
@@ -36448,10 +36436,8 @@ msgid "The selected date does not exist in this event series."
msgstr "La fecha seleccionada no existe en esta serie de eventos." msgstr "La fecha seleccionada no existe en esta serie de eventos."
#: pretix/presale/views/widget.py:412 #: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available." msgid "The selected date is not available."
msgstr "El asiento seleccionado {seat} no está disponible." msgstr "La fecha seleccionada no está disponible."
#: pretix/presale/views/widget.py:476 #: pretix/presale/views/widget.py:476
#, python-format #, python-format

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-05-04 16:00+0000\n" "PO-Revision-Date: 2025-10-04 10:10+0000\n"
"Last-Translator: Pekka Sarkola <pekka.sarkola@gispo.fi>\n" "Last-Translator: Sebastian Bożek <sebastian@log-mar.pl>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix/"
"fi/>\n" "fi/>\n"
"Language: fi\n" "Language: fi\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.11.1\n" "X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -113,7 +113,7 @@ msgstr "norja (kirjakieli)"
#: pretix/_base_settings.py:110 #: pretix/_base_settings.py:110
msgid "Polish" msgid "Polish"
msgstr "puola" msgstr "Puola"
#: pretix/_base_settings.py:111 #: pretix/_base_settings.py:111
msgid "Portuguese (Portugal)" msgid "Portuguese (Portugal)"

View File

@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-08-29 17:00+0000\n" "PO-Revision-Date: 2025-09-30 16:00+0000\n"
"Last-Translator: patch-works-be <webmaster@patch-works.be>\n" "Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/" "Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n" ">\n"
"Language: fr\n" "Language: fr\n"
@@ -13,7 +13,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.13\n" "X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -810,28 +810,22 @@ msgstr ""
"mail dans votre espace client." "mail dans votre espace client."
#: pretix/base/datasync/datasync.py:255 #: pretix/base/datasync/datasync.py:255
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} " "Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings." "settings."
msgstr "" msgstr ""
"Le champ « {field_name} » n'est pas valide pour {available_inputs}. Veuillez " "Le champ « {field_name} » n'existe pas. Veuillez vérifier vos paramètres "
"vérifier vos paramètres {provider_name}." "pour {provider_name}."
#: pretix/base/datasync/datasync.py:262 #: pretix/base/datasync/datasync.py:262
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" requires {required_input}, but only got " "Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings." "{available_inputs}. Please check your {provider_name} settings."
msgstr "" msgstr ""
"Le champ « {field_name} » n'est pas valide pour {available_inputs}. Veuillez " "Le champ « {field_name} » nécessite {required_input}, mais n'a reçu que "
"vérifier vos paramètres {provider_name}." "{available_inputs}. Veuillez vérifier vos paramètres pour {provider_name}."
#: pretix/base/datasync/datasync.py:273 #: pretix/base/datasync/datasync.py:273
#, python-brace-format #, python-brace-format
@@ -3564,6 +3558,10 @@ msgid ""
"in accordance with the procedures and terms set forth in No. 89757/2018 of " "in accordance with the procedures and terms set forth in No. 89757/2018 of "
"April 30, 2018, issued by the Director of the Revenue Agency." "April 30, 2018, issued by the Director of the Revenue Agency."
msgstr "" msgstr ""
"Ce document PDF est une copie visuelle de la facture et ne constitue pas une "
"facture aux fins de la TVA. La facture est émise au format XML, transmise "
"conformément aux procédures et conditions énoncées dans le n° 89757/2018 du "
"30 avril 2018, émis par le directeur de l'Agence des recettes."
#: pretix/base/invoicing/pdf.py:141 #: pretix/base/invoicing/pdf.py:141
#, python-format #, python-format
@@ -3834,12 +3832,9 @@ msgid "Peppol participant ID"
msgstr "Identifiant participant Peppol" msgstr "Identifiant participant Peppol"
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "Code fiscal" msgstr "Copie visuelle"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -3848,6 +3843,9 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and " "invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network." "transmitted through the Peppol network."
msgstr "" msgstr ""
"Ce document PDF est une reproduction visuelle de la facture et ne constitue "
"pas une facture au sens de la TVA. La facture originale est émise au format "
"XML et transmise via le réseau Peppol."
#: pretix/base/logentrytype_registry.py:43 #: pretix/base/logentrytype_registry.py:43
msgid "" msgid ""
@@ -14513,10 +14511,8 @@ msgid "Canceled (fully or with paid fee)"
msgstr "Annulé (entièrement ou avec des frais payés)" msgstr "Annulé (entièrement ou avec des frais payés)"
#: pretix/control/forms/filter.py:228 #: pretix/control/forms/filter.py:228
#, fuzzy
#| msgid "Cancel this position"
msgid "Canceled (at least one position)" msgid "Canceled (at least one position)"
msgstr "Annuler cette position" msgstr "Annulé (au moins pour une position)"
#: pretix/control/forms/filter.py:229 #: pretix/control/forms/filter.py:229
msgid "Cancellation requested" msgid "Cancellation requested"
@@ -17268,10 +17264,9 @@ msgid "The voucher has been deleted."
msgstr "Le bon a été supprimé." msgstr "Le bon a été supprimé."
#: pretix/control/logdisplay.py:584 #: pretix/control/logdisplay.py:584
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "The voucher has been sent to {email} through the waiting list."
msgid "The voucher has been assigned to {email} through the waiting list." msgid "The voucher has been assigned to {email} through the waiting list."
msgstr "Le bon a été envoyé à {email} via la liste d'attente." msgstr "Le bon a été attribué à {email} via de la liste d'attente."
#: pretix/control/logdisplay.py:593 #: pretix/control/logdisplay.py:593
#, python-brace-format #, python-brace-format
@@ -27886,11 +27881,11 @@ msgstr ""
"les prochaines minutes." "les prochaines minutes."
#: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104 #: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104
#, fuzzy
#| msgid "The voucher \"{voucher}\" has been used in the meantime."
msgid "" msgid ""
"The sync job could not be found. It may have been processed in the meantime." "The sync job could not be found. It may have been processed in the meantime."
msgstr "Le bon de réduction \"{voucher}\" a été utilisé entre-temps." msgstr ""
"La tâche de synchronisation est introuvable. Elle a peut-être été traitée "
"entre-temps."
#: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107 #: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107
msgid "The sync job is already in progress." msgid "The sync job is already in progress."
@@ -28894,14 +28889,12 @@ msgstr ""
"planifié pour {name}." "planifié pour {name}."
#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207 #: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207
#, fuzzy
#| msgid "You do not have sufficient permission to perform this export."
msgid "" msgid ""
"Your user account does not have sufficient permission to run this report, " "Your user account does not have sufficient permission to run this report, "
"therefore you cannot schedule it." "therefore you cannot schedule it."
msgstr "" msgstr ""
"Vous ne disposez pas des autorisations suffisantes pour effectuer cette " "Votre compte utilisateur ne dispose pas des autorisations suffisantes pour "
"exportation." "exécuter ce rapport, vous ne pouvez donc pas le planifier."
#: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259 #: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259
msgid "" msgid ""
@@ -29272,17 +29265,14 @@ msgid "A date can not be deleted if orders already have been placed."
msgstr "Une date ne peut pas être supprimée si des ordres ont déjà été passés." msgstr "Une date ne peut pas être supprimée si des ordres ont déjà été passés."
#: pretix/control/views/subevents.py:203 #: pretix/control/views/subevents.py:203
#, fuzzy
#| msgid ""
#| "The channel could not be deleted as some constraints (e.g. data created "
#| "by plug-ins) did not allow it."
msgctxt "subevent" msgctxt "subevent"
msgid "" msgid ""
"The date could not be deleted as some constraints (e.g. data created by plug-" "The date could not be deleted as some constraints (e.g. data created by plug-"
"ins) did not allow it. The date was disabled instead." "ins) did not allow it. The date was disabled instead."
msgstr "" msgstr ""
"Le canal de vente n'a pas pu être supprimé car certaines contraintes (par " "La date n'a pas pu être supprimée car certaines contraintes (par exemple, "
"exemple, les données créées par les plug-ins) ne le permettent pas." "les données créées par les plug-ins) ne le permettaient pas. La date a donc "
"été désactivée."
#: pretix/control/views/subevents.py:207 #: pretix/control/views/subevents.py:207
msgctxt "subevent" msgctxt "subevent"
@@ -34147,18 +34137,12 @@ msgstr ""
"puisse être confirmée et forme un contrat valide." "puisse être confirmée et forme un contrat valide."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192
#, fuzzy
#| msgid ""
#| "After you submitted your order using the button below, it will require "
#| "approval by the event organizer before it can be confirmed and forms a "
#| "valid contract."
msgid "" msgid ""
"After you submitted your order using the button below, it will require " "After you submitted your order using the button below, it will require "
"approval by the event organizer." "approval by the event organizer."
msgstr "" msgstr ""
"Après avoir soumis votre commande en utilisant le bouton ci-dessous, elle " "Une fois que vous aurez soumis votre commande à l'aide du bouton ci-dessous, "
"nécessitera lapprobation de lorganisateur de lévénement avant quelle " "celle-ci devra être approuvée par l'organisateur de l'événement."
"puisse être confirmée et forme un contrat valide."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195
msgid "" msgid ""
@@ -36776,10 +36760,8 @@ msgid "The selected date does not exist in this event series."
msgstr "La date sélectionnée nexiste pas dans cette série dévénements." msgstr "La date sélectionnée nexiste pas dans cette série dévénements."
#: pretix/presale/views/widget.py:412 #: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available." msgid "The selected date is not available."
msgstr "La place {seat} sélectionné n'est pas disponible." msgstr "La date sélectionnée n'est pas disponible."
#: pretix/presale/views/widget.py:476 #: pretix/presale/views/widget.py:476
#, python-format #, python-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-08-19 16:35+0000\n" "POT-Creation-Date: 2025-08-19 16:35+0000\n"
"PO-Revision-Date: 2025-09-27 16:00+0000\n" "PO-Revision-Date: 2025-10-03 20:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n" "Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/" "Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n" "ja/>\n"
@@ -796,28 +796,21 @@ msgstr ""
"メールアドレスを先に検証してください。" "メールアドレスを先に検証してください。"
#: pretix/base/datasync/datasync.py:255 #: pretix/base/datasync/datasync.py:255
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} " "Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings." "settings."
msgstr "" msgstr "フィールド「{field_name}」は存在しません。{provider_name}の設定を確認してくだ"
"フィールド\"{field_name}\"は{available_inputs}に対して有効ではありません。" "さい。"
"{provider_name}の設定を確認してください。"
#: pretix/base/datasync/datasync.py:262 #: pretix/base/datasync/datasync.py:262
#, fuzzy, python-brace-format #, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid "" msgid ""
"Field \"{field_name}\" requires {required_input}, but only got " "Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings." "{available_inputs}. Please check your {provider_name} settings."
msgstr "" msgstr ""
"フィールド\"{field_name}\"は{available_inputs}に対して有効ではありません。" "フィールド{field_name}」には{required_input}が必要ですが、{available_inputs"
"{provider_name}の設定を確認してください。" "}しか取得できませんでした。{provider_name}の設定を確認してください。"
#: pretix/base/datasync/datasync.py:273 #: pretix/base/datasync/datasync.py:273
#, python-brace-format #, python-brace-format
@@ -3527,6 +3520,9 @@ msgid ""
"in accordance with the procedures and terms set forth in No. 89757/2018 of " "in accordance with the procedures and terms set forth in No. 89757/2018 of "
"April 30, 2018, issued by the Director of the Revenue Agency." "April 30, 2018, issued by the Director of the Revenue Agency."
msgstr "" msgstr ""
"この PDF ドキュメントは請求書の画像情報の写しであり、VAT "
"のための請求書を構成するものではありません。請求書はXML形式で発行され、"
"2018年4月30日のNo. 89757/2018に定められた手順と条件に従って送信されます。"
#: pretix/base/invoicing/pdf.py:141 #: pretix/base/invoicing/pdf.py:141
#, python-format #, python-format
@@ -3794,12 +3790,9 @@ msgid "Peppol participant ID"
msgstr "Peppol参加者ID" msgstr "Peppol参加者ID"
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "納税者番号" msgstr "写しの画像"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -3808,6 +3801,10 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and " "invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network." "transmitted through the Peppol network."
msgstr "" msgstr ""
"この PDF "
"ドキュメントは請求書の画像情報の写しであり、VATのための請求書を構成するもので"
"はありません。請求書の原本はXML形式で発行され、Peppolネットワークを介して送信"
"されます。"
#: pretix/base/logentrytype_registry.py:43 #: pretix/base/logentrytype_registry.py:43
msgid "" msgid ""
@@ -13970,10 +13967,8 @@ msgid "Canceled (fully or with paid fee)"
msgstr "キャンセル(全額返金または手数料を支払って)" msgstr "キャンセル(全額返金または手数料を支払って)"
#: pretix/control/forms/filter.py:228 #: pretix/control/forms/filter.py:228
#, fuzzy
#| msgid "Cancel this position"
msgid "Canceled (at least one position)" msgid "Canceled (at least one position)"
msgstr "このポジションをキャンセルします" msgstr "キャンセル済み少なくとも1つのポジション"
#: pretix/control/forms/filter.py:229 #: pretix/control/forms/filter.py:229
msgid "Cancellation requested" msgid "Cancellation requested"
@@ -16622,10 +16617,9 @@ msgid "The voucher has been deleted."
msgstr "そのバウチャーは削除されました。" msgstr "そのバウチャーは削除されました。"
#: pretix/control/logdisplay.py:584 #: pretix/control/logdisplay.py:584
#, fuzzy, python-brace-format #, python-brace-format
#| msgid "The voucher has been sent to {email} through the waiting list."
msgid "The voucher has been assigned to {email} through the waiting list." msgid "The voucher has been assigned to {email} through the waiting list."
msgstr "バウチャー空席待ちリストを通じて{email}に送信されました。" msgstr "バウチャーは、空席待ちリストを通じて{email}に割り当てられました。"
#: pretix/control/logdisplay.py:593 #: pretix/control/logdisplay.py:593
#, python-brace-format #, python-brace-format
@@ -26896,11 +26890,9 @@ msgid "The sync job has been enqueued and will run in the next minutes."
msgstr "同期ジョブがキューに追加されました。数分以内に実行されます。" msgstr "同期ジョブがキューに追加されました。数分以内に実行されます。"
#: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104 #: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104
#, fuzzy
#| msgid "The voucher \"{voucher}\" has been used in the meantime."
msgid "" msgid ""
"The sync job could not be found. It may have been processed in the meantime." "The sync job could not be found. It may have been processed in the meantime."
msgstr "そのバウチャー「{voucher}」はすでに使用されています。" msgstr "同期ジョブが見つかりませんでした。その間に処理されていたかもしれません。"
#: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107 #: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107
msgid "The sync job is already in progress." msgid "The sync job is already in progress."
@@ -27862,12 +27854,11 @@ msgstr ""
"このメールに、{name}の新しい定期レポートを添付しています。" "このメールに、{name}の新しい定期レポートを添付しています。"
#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207 #: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207
#, fuzzy
#| msgid "You do not have sufficient permission to perform this export."
msgid "" msgid ""
"Your user account does not have sufficient permission to run this report, " "Your user account does not have sufficient permission to run this report, "
"therefore you cannot schedule it." "therefore you cannot schedule it."
msgstr "このエクスポートを実行するための十分な権限がありません。" msgstr "ユーザーアカウントにはこのレポートを実行するの十分な権限がないため、スケジ"
"ュールを設定できません。"
#: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259 #: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259
msgid "" msgid ""
@@ -28229,17 +28220,12 @@ msgid "A date can not be deleted if orders already have been placed."
msgstr "注文がすでにある場合、日付を削除することはできません。" msgstr "注文がすでにある場合、日付を削除することはできません。"
#: pretix/control/views/subevents.py:203 #: pretix/control/views/subevents.py:203
#, fuzzy
#| msgid ""
#| "The channel could not be deleted as some constraints (e.g. data created "
#| "by plug-ins) did not allow it."
msgctxt "subevent" msgctxt "subevent"
msgid "" msgid ""
"The date could not be deleted as some constraints (e.g. data created by plug-" "The date could not be deleted as some constraints (e.g. data created by plug-"
"ins) did not allow it. The date was disabled instead." "ins) did not allow it. The date was disabled instead."
msgstr "" msgstr "日付は、いくつかの制約(プラグインによって作成されたデータなど)で許可されて"
"チャンネルは削除できませんでした。プラグインによって作成されたデータなど、い" "いないため、削除できませんでした。代わりに日付が無効になりました。"
"くつかの制約がそれを許可していませんでした。"
#: pretix/control/views/subevents.py:207 #: pretix/control/views/subevents.py:207
msgctxt "subevent" msgctxt "subevent"
@@ -30774,7 +30760,7 @@ msgstr "このイベントのメール設定でチケットの添付が無効に
#: pretix/plugins/sendmail/forms.py:234 pretix/plugins/sendmail/forms.py:386 #: pretix/plugins/sendmail/forms.py:234 pretix/plugins/sendmail/forms.py:386
#: pretix/plugins/sendmail/views.py:267 #: pretix/plugins/sendmail/views.py:267
msgid "payment pending but already confirmed" msgid "payment pending but already confirmed"
msgstr "支払い保留中ですが、すでに確認済み" msgstr "支払い保留中だが確認済み"
#: pretix/plugins/sendmail/forms.py:235 pretix/plugins/sendmail/forms.py:388 #: pretix/plugins/sendmail/forms.py:235 pretix/plugins/sendmail/forms.py:388
#: pretix/plugins/sendmail/views.py:268 #: pretix/plugins/sendmail/views.py:268
@@ -32934,17 +32920,10 @@ msgstr ""
"ます。その後、有効な契約が形成されます。" "ます。その後、有効な契約が形成されます。"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:192
#, fuzzy
#| msgid ""
#| "After you submitted your order using the button below, it will require "
#| "approval by the event organizer before it can be confirmed and forms a "
#| "valid contract."
msgid "" msgid ""
"After you submitted your order using the button below, it will require " "After you submitted your order using the button below, it will require "
"approval by the event organizer." "approval by the event organizer."
msgstr "" msgstr "下のボタンを使って注文を送信した後、イベント主催者の承認が必要になります。"
"以下のボタンを使用して注文を送信した後、イベント主催者による承認が必要となり"
"ます。その後、有効な契約が形成されます。"
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195
msgid "" msgid ""
@@ -35434,10 +35413,8 @@ msgid "The selected date does not exist in this event series."
msgstr "選択された日付は、このイベントシリーズに存在しません。" msgstr "選択された日付は、このイベントシリーズに存在しません。"
#: pretix/presale/views/widget.py:412 #: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available." msgid "The selected date is not available."
msgstr "選択した座席 \"{seat}\"はご利用になれません。" msgstr "選択した日付は利用できません。"
#: pretix/presale/views/widget.py:476 #: pretix/presale/views/widget.py:476
#, python-format #, python-format

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-08-26 19:00+0000\n" "PO-Revision-Date: 2025-10-04 19:00+0000\n"
"Last-Translator: Jan Van Haver <jan.van.haver@gmail.com>\n" "Last-Translator: Jan Van Haver <jan.van.haver@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/" "Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
">\n" "\n"
"Language: nl\n" "Language: nl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13\n" "X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -808,6 +808,8 @@ msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} " "Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings." "settings."
msgstr "" msgstr ""
"Het veld \"{field_name}\" bestaat niet. Controleer uw {provider_name} "
"instellingen."
#: pretix/base/datasync/datasync.py:262 #: pretix/base/datasync/datasync.py:262
#, python-brace-format #, python-brace-format
@@ -815,6 +817,8 @@ msgid ""
"Field \"{field_name}\" requires {required_input}, but only got " "Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings." "{available_inputs}. Please check your {provider_name} settings."
msgstr "" msgstr ""
"Het veld \"{field_name}\" vereist {required_input}, maar heeft alleen "
"{available_inputs}. Controleer uw {provider_name} instellingen."
#: pretix/base/datasync/datasync.py:273 #: pretix/base/datasync/datasync.py:273
#, python-brace-format #, python-brace-format
@@ -822,18 +826,16 @@ msgid ""
"Please update value mapping for field \"{field_name}\" - option \"{val}\" " "Please update value mapping for field \"{field_name}\" - option \"{val}\" "
"not assigned" "not assigned"
msgstr "" msgstr ""
"Werk de mapping van de waarden bij voor veld \"{field_name}\" - optie "
"\"{val}\" is niet toegewezen"
#: pretix/base/datasync/sourcefields.py:128 #: pretix/base/datasync/sourcefields.py:128
#, fuzzy
#| msgid "Order positions"
msgid "Order position details" msgid "Order position details"
msgstr "Bestelde producten" msgstr "Details bestelde producten"
#: pretix/base/datasync/sourcefields.py:129 #: pretix/base/datasync/sourcefields.py:129
#, fuzzy
#| msgid "Attendee email"
msgid "Attendee details" msgid "Attendee details"
msgstr "E-mailadres van aanwezige" msgstr "Details van aanwezige"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66 #: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172 #: pretix/base/models/items.py:1767 pretix/control/navigation.py:172
@@ -843,10 +845,8 @@ msgid "Questions"
msgstr "Vragen" msgstr "Vragen"
#: pretix/base/datasync/sourcefields.py:131 #: pretix/base/datasync/sourcefields.py:131
#, fuzzy
#| msgid "Product data"
msgid "Product details" msgid "Product details"
msgstr "Productgegevens" msgstr "Productdetails"
#: pretix/base/datasync/sourcefields.py:132 #: pretix/base/datasync/sourcefields.py:132
#: pretix/control/templates/pretixcontrol/event/settings.html:280 #: pretix/control/templates/pretixcontrol/event/settings.html:280
@@ -1038,16 +1038,12 @@ msgid "Product ID"
msgstr "Product ID" msgstr "Product ID"
#: pretix/base/datasync/sourcefields.py:419 #: pretix/base/datasync/sourcefields.py:419
#, fuzzy
#| msgid "Non-admission product"
msgid "Product is admission product" msgid "Product is admission product"
msgstr "Geen toegangsbewijs" msgstr "Product is een toegangsbewijs"
#: pretix/base/datasync/sourcefields.py:428 #: pretix/base/datasync/sourcefields.py:428
#, fuzzy
#| msgid "Event short name"
msgid "Event short form" msgid "Event short form"
msgstr "Korte naam evenement" msgstr "Kort formulier evenement"
#: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57 #: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57
#: pretix/base/exporters/orderlist.py:262 #: pretix/base/exporters/orderlist.py:262
@@ -1090,10 +1086,8 @@ msgid "Order code and position number"
msgstr "Bestelcode en plaatsnummer" msgstr "Bestelcode en plaatsnummer"
#: pretix/base/datasync/sourcefields.py:482 #: pretix/base/datasync/sourcefields.py:482
#, fuzzy
#| msgid "Ticket page"
msgid "Ticket price" msgid "Ticket price"
msgstr "Ticketpagina" msgstr "Ticketprijs"
#: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204 #: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204
#: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:85 #: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:85
@@ -1101,22 +1095,16 @@ msgid "Order status"
msgstr "Bestelstatus" msgstr "Bestelstatus"
#: pretix/base/datasync/sourcefields.py:500 #: pretix/base/datasync/sourcefields.py:500
#, fuzzy
#| msgid "Device status"
msgid "Ticket status" msgid "Ticket status"
msgstr "Apparaatstatus" msgstr "Ticketstatus"
#: pretix/base/datasync/sourcefields.py:509 #: pretix/base/datasync/sourcefields.py:509
#, fuzzy
#| msgid "Purchase date and time"
msgid "Order date and time" msgid "Order date and time"
msgstr "Aankoopdatum en -tijd" msgstr "Besteldatum en -tijd"
#: pretix/base/datasync/sourcefields.py:518 #: pretix/base/datasync/sourcefields.py:518
#, fuzzy
#| msgid "Printing date and time"
msgid "Payment date and time" msgid "Payment date and time"
msgstr "Printdatum en -tijd" msgstr "Betaaldatum en -tijd"
#: pretix/base/datasync/sourcefields.py:527 #: pretix/base/datasync/sourcefields.py:527
#: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:271
@@ -1127,23 +1115,17 @@ msgid "Order locale"
msgstr "Taal van bestelling" msgstr "Taal van bestelling"
#: pretix/base/datasync/sourcefields.py:536 #: pretix/base/datasync/sourcefields.py:536
#, fuzzy
#| msgid "Order position"
msgid "Order position ID" msgid "Order position ID"
msgstr "Besteld product" msgstr "ID besteld product"
#: pretix/base/datasync/sourcefields.py:545 #: pretix/base/datasync/sourcefields.py:545
#: pretix/base/exporters/orderlist.py:291 #: pretix/base/exporters/orderlist.py:291
#, fuzzy
#| msgid "Order time"
msgid "Order link" msgid "Order link"
msgstr "Besteltijd" msgstr "Bestellink"
#: pretix/base/datasync/sourcefields.py:560 #: pretix/base/datasync/sourcefields.py:560
#, fuzzy
#| msgid "Ticket block"
msgid "Ticket link" msgid "Ticket link"
msgstr "Ticketblok" msgstr "Ticketlink"
#: pretix/base/datasync/sourcefields.py:578 #: pretix/base/datasync/sourcefields.py:578
#, fuzzy, python-brace-format #, fuzzy, python-brace-format
@@ -3808,6 +3790,8 @@ msgstr "Evenementdatum: {date_range}"
msgid "" msgid ""
"A Peppol participant ID always starts with a prefix, followed by a colon (:)." "A Peppol participant ID always starts with a prefix, followed by a colon (:)."
msgstr "" msgstr ""
"Een Peppol deelnemer-ID begint altijd met een prefix, gevolgd door een "
"dubbele punt (:)."
#: pretix/base/invoicing/peppol.py:132 #: pretix/base/invoicing/peppol.py:132
#, python-format #, python-format
@@ -3815,6 +3799,8 @@ msgid ""
"The Peppol participant ID prefix %(number)s is not known to our system. " "The Peppol participant ID prefix %(number)s is not known to our system. "
"Please reach out to us if you are sure this ID is correct." "Please reach out to us if you are sure this ID is correct."
msgstr "" msgstr ""
"De prefix van de Peppol deelnemer-ID %(number)s is niet bekend in ons "
"systeem. Neem contact met ons op als u zeker weet dat deze ID correct is."
#: pretix/base/invoicing/peppol.py:136 #: pretix/base/invoicing/peppol.py:136
#, python-format #, python-format
@@ -3822,17 +3808,18 @@ msgid ""
"The Peppol participant ID does not match the validation rules for the prefix " "The Peppol participant ID does not match the validation rules for the prefix "
"%(number)s. Please reach out to us if you are sure this ID is correct." "%(number)s. Please reach out to us if you are sure this ID is correct."
msgstr "" msgstr ""
"De Peppol deelnemer-ID komt niet overeen met de validatieregels voor het "
"prefix %(number)s. Neem contact met ons op als u zeker weet dat deze ID "
"correct is."
#: pretix/base/invoicing/peppol.py:156 #: pretix/base/invoicing/peppol.py:156
msgid "Peppol participant ID" msgid "Peppol participant ID"
msgstr "" msgstr "Peppol deelnemer-ID"
#: pretix/base/invoicing/peppol.py:170 #: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgid "Gift card code"
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
msgid "Visual copy" msgid "Visual copy"
msgstr "Cadeauboncode" msgstr "Visuele kopie"
#: pretix/base/invoicing/peppol.py:175 #: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice" msgctxt "peppol_invoice"
@@ -3841,6 +3828,9 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and " "invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network." "transmitted through the Peppol network."
msgstr "" msgstr ""
"Dit PDF-document is een visuele kopie van de factuur en vormt geen factuur "
"voor BTW-doeleinden. De originele factuur wordt opgemaakt in XML-formaat en "
"verzonden via het Peppol-netwerk."
#: pretix/base/logentrytype_registry.py:43 #: pretix/base/logentrytype_registry.py:43
msgid "" msgid ""

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n" "POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-06-02 23:00+0000\n" "PO-Revision-Date: 2025-10-04 19:00+0000\n"
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n" "Last-Translator: Sebastian Bożek <sebastian@log-mar.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/" "Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
">\n" ">\n"
"Language: pl\n" "Language: pl\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n" "|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.4\n" "X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87 #: pretix/_base_settings.py:87
msgid "English" msgid "English"
@@ -90,7 +90,7 @@ msgstr "Grecki"
#: pretix/_base_settings.py:104 #: pretix/_base_settings.py:104
msgid "Hebrew" msgid "Hebrew"
msgstr "" msgstr "Hebrajski"
#: pretix/_base_settings.py:105 #: pretix/_base_settings.py:105
msgid "Indonesian" msgid "Indonesian"
@@ -146,7 +146,7 @@ msgstr "Hiszpański"
#: pretix/_base_settings.py:118 #: pretix/_base_settings.py:118
msgid "Spanish (Latin America)" msgid "Spanish (Latin America)"
msgstr "" msgstr "Hiszpański (Ameryka Łacińska)"
#: pretix/_base_settings.py:119 #: pretix/_base_settings.py:119
msgid "Turkish" msgid "Turkish"
@@ -2328,7 +2328,7 @@ msgstr ""
#: pretix/base/exporters/waitinglist.py:115 pretix/control/forms/event.py:1671 #: pretix/base/exporters/waitinglist.py:115 pretix/control/forms/event.py:1671
#: pretix/control/forms/organizer.py:116 #: pretix/control/forms/organizer.py:116
msgid "Event slug" msgid "Event slug"
msgstr "Kod wydarzenia" msgstr "Fragment adresu URL, który pojawia się po nazwie domeny."
#: pretix/base/exporters/orderlist.py:262 #: pretix/base/exporters/orderlist.py:262
#: pretix/base/exporters/orderlist.py:452 #: pretix/base/exporters/orderlist.py:452
@@ -32680,7 +32680,7 @@ msgid ""
"banks. Please keep your online banking account and login information " "banks. Please keep your online banking account and login information "
"available." "available."
msgstr "" msgstr ""
"Przelewy24 to metoda płatności online dostępna dla klientów polskich banków. " "Przelewy24 to metoda płatności online dostępna dla klientów Polskich banków. "
"Prosimy o zachowanie danych logowania i konta bankowego." "Prosimy o zachowanie danych logowania i konta bankowego."
#: pretix/plugins/stripe/payment.py:1768 #: pretix/plugins/stripe/payment.py:1768

View File

@@ -170,7 +170,7 @@ OPTIONS = OrderedDict([
'cols': 2, 'cols': 2,
'rows': 6, 'rows': 6,
'margins': [28.5 * mm, 30 * mm, 28.5 * mm, 30 * mm], 'margins': [28.5 * mm, 30 * mm, 28.5 * mm, 30 * mm],
'offsets': [93 * mm, 60 * mm], 'offsets': [75 * mm, 40 * mm],
'pagesize': pagesizes.A4, 'pagesize': pagesizes.A4,
}), }),
('herma_50x80', { ('herma_50x80', {

View File

@@ -8,7 +8,7 @@
"name": "pretix", "name": "pretix",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@babel/core": "^7.28.3", "@babel/core": "^7.28.4",
"@babel/preset-env": "^7.28.3", "@babel/preset-env": "^7.28.3",
"@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",
@@ -18,18 +18,6 @@
"vue-template-compiler": "^2.7.16" "vue-template-compiler": "^2.7.16"
} }
}, },
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"dependencies": {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.27.1", "version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -53,20 +41,20 @@
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.28.3", "@babel/helper-module-transforms": "^7.28.3",
"@babel/helpers": "^7.28.3", "@babel/helpers": "^7.28.4",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/traverse": "^7.28.3", "@babel/traverse": "^7.28.4",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@@ -115,15 +103,6 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
"version": "0.3.12",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
"integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@babel/helper-annotate-as-pure": { "node_modules/@babel/helper-annotate-as-pure": {
"version": "7.27.3", "version": "7.27.3",
"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
@@ -401,23 +380,23 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
"integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
"dependencies": { "dependencies": {
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"dependencies": { "dependencies": {
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@@ -1475,16 +1454,16 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
"integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-globals": "^7.28.0", "@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"debug": "^4.3.1" "debug": "^4.3.1"
}, },
"engines": { "engines": {
@@ -1492,9 +1471,9 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.28.2", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.27.1", "@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1" "@babel/helper-validator-identifier": "^7.27.1"
@@ -1504,15 +1483,21 @@
} }
}, },
"node_modules/@jridgewell/gen-mapping": { "node_modules/@jridgewell/gen-mapping": {
"version": "0.1.1", "version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dependencies": { "dependencies": {
"@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/trace-mapping": "^0.3.24"
}, }
"engines": { },
"node": ">=6.0.0" "node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
} }
}, },
"node_modules/@jridgewell/resolve-uri": { "node_modules/@jridgewell/resolve-uri": {
@@ -1523,14 +1508,6 @@
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": { "node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
@@ -3802,15 +3779,6 @@
} }
}, },
"dependencies": { "dependencies": {
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"requires": {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@babel/code-frame": { "@babel/code-frame": {
"version": "7.27.1", "version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -3827,20 +3795,20 @@
"integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="
}, },
"@babel/core": { "@babel/core": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
"requires": { "requires": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.28.3", "@babel/helper-module-transforms": "^7.28.3",
"@babel/helpers": "^7.28.3", "@babel/helpers": "^7.28.4",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/traverse": "^7.28.3", "@babel/traverse": "^7.28.4",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@@ -3870,17 +3838,6 @@
"@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28", "@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2" "jsesc": "^3.0.2"
},
"dependencies": {
"@jridgewell/gen-mapping": {
"version": "0.3.12",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
"integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
"requires": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
}
} }
}, },
"@babel/helper-annotate-as-pure": { "@babel/helper-annotate-as-pure": {
@@ -4074,20 +4031,20 @@
} }
}, },
"@babel/helpers": { "@babel/helpers": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
"integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
"requires": { "requires": {
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"requires": { "requires": {
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
} }
}, },
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
@@ -4718,35 +4675,44 @@
} }
}, },
"@babel/traverse": { "@babel/traverse": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
"integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
"requires": { "requires": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-globals": "^7.28.0", "@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"debug": "^4.3.1" "debug": "^4.3.1"
} }
}, },
"@babel/types": { "@babel/types": {
"version": "7.28.2", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"requires": { "requires": {
"@babel/helper-string-parser": "^7.27.1", "@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1" "@babel/helper-validator-identifier": "^7.27.1"
} }
}, },
"@jridgewell/gen-mapping": { "@jridgewell/gen-mapping": {
"version": "0.1.1", "version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"requires": { "requires": {
"@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/trace-mapping": "^0.3.24"
}
},
"@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"requires": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
} }
}, },
"@jridgewell/resolve-uri": { "@jridgewell/resolve-uri": {
@@ -4754,11 +4720,6 @@
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
}, },
"@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
},
"@jridgewell/sourcemap-codec": { "@jridgewell/sourcemap-codec": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",

View File

@@ -4,7 +4,7 @@
"private": true, "private": true,
"scripts": {}, "scripts": {},
"dependencies": { "dependencies": {
"@babel/core": "^7.28.3", "@babel/core": "^7.28.4",
"@babel/preset-env": "^7.28.3", "@babel/preset-env": "^7.28.3",
"@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",

View File

@@ -26,6 +26,7 @@ $(document).on("pretix:bind-forms", function () {
} }
} }
// RRule editor
function rrule_preview() { function rrule_preview() {
var ruleset = new rrule.RRuleSet(); var ruleset = new rrule.RRuleSet();
@@ -121,7 +122,14 @@ $(document).on("pretix:bind-forms", function () {
}); });
} }
} }
$("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () {
rrule_preview();
});
rrule_preview();
$("#rrule-formset").on("formAdded", "div", function (event) {rrule_bind_form($(event.target)); });
// Timeslot editor
$("#subevent_add_many_slots_go").on("click", function () { $("#subevent_add_many_slots_go").on("click", function () {
$("#time-formset [data-formset-form]").each(function () { $("#time-formset [data-formset-form]").each(function () {
var tf = $(this).find("[name$=time_from]").val() var tf = $(this).find("[name$=time_from]").val()
@@ -167,13 +175,45 @@ $(document).on("pretix:bind-forms", function () {
$(this).addClass("hidden"); $(this).addClass("hidden");
}); });
$("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () { // Hide config for products that are not for sale
rrule_preview(); function quota_form_handlers(el) {
}); // searchable_selection = True
rrule_preview(); el.find('[id^="id_quotas-"]').on("select2:select select2:unselect", () => {
update_item_visibility();
});
// searchable_selection = False
el.find('input[id^="id_quotas-"][id*=itemvars_]').on("change", () => {
update_item_visibility();
});
}
function update_item_visibility() {
const itemvars = [];
$("#rrule-formset").on("formAdded", "div", function (event) { rrule_bind_form($(event.target)); }); // searchable_selection = True
$("select[id^=id_quotas-][id$=-itemvars]").filter((idx, el) => {
return !$(el).closest('[data-formset-form]').is('[data-formset-form-deleted]');
}).each((_, e) => itemvars.push(...$(e).val()));
// searchable_selection = False
$("input[id^=id_quotas-][id*=itemvars_]:checked").filter((idx, el) => {
return !$(el).closest('[data-formset-form]').is('[data-formset-form-deleted]');
}).each((_, e) => itemvars.push($(e).val()));
$("div[data-itemvar]").each(function (idx, e) {
const el = $(e);
el.prop("hidden", !itemvars.includes(el.attr("data-itemvar")) && !el.find(".has-error, .alert-danger").length);
});
}
$('[data-formset-prefix="quotas"]').on("formDeleted", "div", () => {
update_item_visibility();
}).on("formAdded", "div", (event) => {
quota_form_handlers($(event.target));
update_item_visibility();
})
quota_form_handlers($("body"));
update_item_visibility();
// Auto-set name of check-in list
var $namef = $("input[id^=id_name]").first(); var $namef = $("input[id^=id_name]").first();
var lastValue = $namef.val(); var lastValue = $namef.val();
$namef.change(function () { $namef.change(function () {

View File

@@ -95,6 +95,12 @@ div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], d
} }
} }
.submit-group-sticky {
position: sticky;
bottom: 0;
z-index: 100;
}
.panel .form-group:last-child { .panel .form-group:last-child {
margin-bottom: 0; margin-bottom: 0;
} }

View File

@@ -54,7 +54,7 @@ def test_sales_channel_all(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PLACED, mode=AutoCheckinRule.MODE_PLACED,
all_sales_channels=True, all_sales_channels=True,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -67,12 +67,12 @@ def test_sales_channel_limit(event, item, order, checkin_list):
all_sales_channels=False, all_sales_channels=False,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert not order.positions.first().checkins.exists() assert not order.positions.first().checkins.exists()
acr.limit_sales_channels.add(order.sales_channel) acr.limit_sales_channels.add(order.sales_channel)
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -84,7 +84,7 @@ def test_items_all(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PLACED, mode=AutoCheckinRule.MODE_PLACED,
all_products=True, all_products=True,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -97,12 +97,12 @@ def test_items_limit(event, item, order, checkin_list):
all_products=False, all_products=False,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert not order.positions.first().checkins.exists() assert not order.positions.first().checkins.exists()
acr.limit_products.add(item) acr.limit_products.add(item)
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -124,7 +124,7 @@ def test_variations_limit_mixed_order(event, item, order, checkin_list):
) )
acr.limit_variations.add(var) acr.limit_variations.add(var)
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
assert not order.positions.last().checkins.exists() assert not order.positions.last().checkins.exists()
@@ -143,19 +143,19 @@ def test_variations_limit(event, item, order, checkin_list):
all_products=False, all_products=False,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert not order.positions.first().checkins.exists() assert not order.positions.first().checkins.exists()
acr.limit_variations.add(var) acr.limit_variations.add(var)
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
order.positions.first().checkins.all().delete() order.positions.first().checkins.all().delete()
acr.limit_products.add(item) acr.limit_products.add(item)
acr.limit_variations.clear() acr.limit_variations.clear()
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -170,7 +170,7 @@ def test_mode_placed(event, item, order, checkin_list):
order_paid.send(event, order=order) order_paid.send(event, order=order)
assert not order.positions.first().checkins.exists() assert not order.positions.first().checkins.exists()
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert order.positions.first().checkins.exists() assert order.positions.first().checkins.exists()
@@ -182,7 +182,7 @@ def test_mode_paid(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PAID, mode=AutoCheckinRule.MODE_PAID,
) )
order_placed.send(event, order=order) order_placed.send(event, order=order, bulk=False)
assert not order.positions.first().checkins.exists() assert not order.positions.first().checkins.exists()
order_paid.send(event, order=order) order_paid.send(event, order=order)