Compare commits

..

5 Commits

Author SHA1 Message Date
Raphael Michel
6920b602ad Pin Django 4.2.25, shouldn't affect us, but better safe than sorry 2025-10-06 11:59:55 +02:00
Raphael Michel
00c78a2ed3 Do not run during tests 2025-10-06 10:12:33 +02:00
Raphael Michel
dff26910e5 Rename parameter, add test 2025-10-06 09:51:24 +02:00
Raphael Michel
add02262fc Update src/pretix/helpers/database.py
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2025-10-02 12:57:55 +02:00
Raphael Michel
f86621a6ec Run exporters in repeatable read by default (Z#23173095) 2025-09-30 12:15:54 +02:00
36 changed files with 451 additions and 517 deletions

View File

@@ -28,14 +28,14 @@ classifiers = [
dependencies = [
"arabic-reshaper==3.0.0", # Support for Arabic in reportlab
"babel",
"BeautifulSoup4==4.14.*",
"BeautifulSoup4==4.13.*",
"bleach==6.2.*",
"celery==5.5.*",
"chardet==5.2.*",
"cryptography>=44.0.0",
"css-inline==0.17.*",
"defusedcsv>=1.1.0",
"Django[argon2]==4.2.*,>=4.2.24",
"Django[argon2]==4.2.*,>=4.2.25",
"django-bootstrap3==25.2",
"django-compressor==4.5.1",
"django-countries==7.6.*",
@@ -91,7 +91,7 @@ dependencies = [
"redis==6.4.*",
"reportlab==4.4.*",
"requests==2.32.*",
"sentry-sdk==2.40.*",
"sentry-sdk==2.38.*",
"sepaxml==2.6.*",
"stripe==7.9.*",
"text-unidecode==1.*",
@@ -113,7 +113,7 @@ dev = [
"fakeredis==2.31.*",
"flake8==7.3.*",
"freezegun",
"isort==6.1.*",
"isort==6.0.*",
"pep8-naming==0.15.*",
"potypo",
"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
# <https://www.gnu.org/licenses/>.
#
__version__ = "2025.9.0.dev0"
__version__ = "2024.9.0.dev0"

View File

@@ -743,7 +743,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
user=request.user if request.user.is_authenticated else None,
auth=request.auth,
)
order_placed.send(self.request.event, order=order, bulk=False)
order_placed.send(self.request.event, order=order)
if order.status == Order.STATUS_PAID:
order_paid.send(self.request.event, order=order)
order.log_action(
@@ -764,13 +764,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
) and not order.invoices.last()
invoice = None
if gen_invoice:
try:
invoice = generate_invoice(order, trigger_pdf=True)
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
invoice = generate_invoice(order, trigger_pdf=True)
# Refresh serializer only after running signals
prefetch_related_objects([order], self._positions_prefetch(request))

View File

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

View File

@@ -106,7 +106,7 @@ class OutboundSyncProvider:
return str(cls.identifier)
@classmethod
def enqueue_order(cls, order, triggered_by, not_before=None, immediate=False):
def enqueue_order(cls, order, triggered_by, not_before=None):
"""
Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute.
@@ -119,14 +119,10 @@ class OutboundSyncProvider:
: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
(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'):
raise TypeError('Call this method on a derived class that defines an "identifier" attribute.')
queue_item, created = OrderSyncQueue.objects.update_or_create(
OrderSyncQueue.objects.update_or_create(
order=order,
sync_provider=cls.identifier,
in_flight=False,
@@ -137,10 +133,6 @@ class OutboundSyncProvider:
"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
def get_external_link_info(cls, event, external_link_href, external_link_display_name):
@@ -391,7 +383,7 @@ class OutboundSyncProvider:
def sync_order(self, order):
if not self.should_sync_order(order):
logger.debug("Skipping order %r", order)
return {}
return
logger.debug("Syncing order %r", order)
positions = list(

View File

@@ -125,7 +125,6 @@ class InvoiceExporter(InvoiceExporterMixin, BaseExporter):
identifier = 'invoices'
verbose_name = _('All invoices')
description = _('Download all invoices created by the system as a ZIP file of PDF files.')
repeatable_read = False
def render(self, form_data: dict, output_file=None):
qs = self.invoices_queryset(form_data).filter(shredded=False)

View File

@@ -1162,7 +1162,7 @@ class QuotaListExporter(ListExporter):
yield headers
quotas = list(self.event.quotas.select_related('subevent'))
qa = QuotaAvailability(full_results=True, allow_repeatable_read=True)
qa = QuotaAvailability(full_results=True, allow_repeatable_read=False)
qa.queue(*quotas)
qa.compute()

View File

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

View File

@@ -1840,10 +1840,6 @@ class OrderPayment(models.Model):
))
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):
locked_instance.info = info
elif info:
@@ -1859,10 +1855,6 @@ class OrderPayment(models.Model):
'data': log_data,
}, 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:
with language(self.order.locale, self.order.event.settings.region):
email_subject = self.order.event.settings.mail_subject_order_payment_failed
@@ -1969,20 +1961,14 @@ class OrderPayment(models.Model):
self.order.invoice_dirty
)
if gen_invoice:
try:
if invoices:
last_i = self.order.invoices.filter(is_cancellation=False).last()
if not last_i.canceled:
generate_cancellation(last_i)
invoice = generate_invoice(
self.order,
trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment
)
except Exception as e:
logger.exception("Could not generate invoice.")
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
if invoices:
last_i = self.order.invoices.filter(is_cancellation=False).last()
if not last_i.canceled:
generate_cancellation(last_i)
invoice = generate_invoice(
self.order,
trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment
)
transmit_invoice_task = invoice_transmission_separately(invoice)
transmit_invoice_mail = not transmit_invoice_task and self.order.event.settings.invoice_email_attachment and self.order.email

View File

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

View File

@@ -671,7 +671,6 @@ def send_invoices_to_organizer(sender, **kwargs):
event=i.event,
invoices=[i],
auto_email=True,
plain_text_only=True,
)
i.sent_to_organizer = True
else:

View File

@@ -19,7 +19,6 @@
# 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/>.
#
import logging
from decimal import Decimal
from typing import List
@@ -34,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_vouchers import get_voucher_import_columns
from pretix.base.models import (
CachedFile, Event, InvoiceAddress, LogEntry, Order, OrderPayment,
OrderPosition, User, Voucher,
CachedFile, Event, InvoiceAddress, Order, OrderPayment, OrderPosition,
User, Voucher,
)
from pretix.base.models.orders import Transaction
from pretix.base.services.invoices import generate_invoice, invoice_qualified
@@ -44,8 +43,6 @@ from pretix.base.services.tasks import ProfiledEventTask
from pretix.base.signals import order_paid, order_placed
from pretix.celery_app import app
logger = logging.getLogger(__name__)
def _validate(cf: CachedFile, charset: str, cols: List[ImportColumn], settings: dict):
try:
@@ -178,7 +175,6 @@ 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.'))
save_transactions = []
save_logentries = []
for o in orders:
o.total = sum([c.price for c in o._positions]) # currently no support for fees
if o.total == Decimal('0.00'):
@@ -215,19 +211,17 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user,
o._address.save()
for c in cols:
c.save(o)
save_logentries.append(o.log_action(
o.log_action(
'pretix.event.order.placed',
user=user,
data={'source': 'import'},
save=False,
))
data={'source': 'import'}
)
save_transactions += o.create_transactions(is_new=True, fees=[], positions=o._positions, save=False)
Transaction.objects.bulk_create(save_transactions)
LogEntry.bulk_create_and_postprocess(save_logentries)
for o in orders:
with language(o.locale, event.settings.region):
order_placed.send(event, order=o, bulk=True)
order_placed.send(event, order=o)
if o.status == Order.STATUS_PAID:
order_paid.send(event, order=o)
@@ -236,13 +230,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user,
(event.settings.get('invoice_generate') == 'paid' and o.status == Order.STATUS_PAID)
) and not o.invoices.last()
if gen_invoice:
try:
generate_invoice(o, trigger_pdf=True)
except Exception as e:
logger.exception("Could not generate invoice.")
o.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
generate_invoice(o, trigger_pdf=True)
except DataImportError:
raise ValidationError(_('We were not able to process your request completely as the server was too busy. '
'Please try again.'))
@@ -298,16 +286,13 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user
raise DataImportError(
_('The seat you selected has already been taken. Please select a different seat.'))
save_logentries = []
for v in vouchers:
v.save()
save_logentries.append(v.log_action(
v.log_action(
'pretix.voucher.added',
user=user,
data={'source': 'import'},
save=False,
))
data={'source': 'import'}
)
for c in cols:
c.save(v)
LogEntry.bulk_create_and_postprocess(save_logentries)
cf.delete()

View File

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

View File

@@ -264,13 +264,7 @@ def reactivate_order(order: Order, force: bool=False, user: User=None, auth=None
num_invoices = order.invoices.filter(is_cancellation=False).count()
if num_invoices > 0 and order.invoices.filter(is_cancellation=True).count() >= num_invoices and invoice_qualified(order):
try:
generate_invoice(order)
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
generate_invoice(order)
def extend_order(order: Order, new_date: datetime, force: bool=False, valid_if_pending: bool=None, user: User=None, auth=None):
@@ -318,13 +312,7 @@ def extend_order(order: Order, new_date: datetime, force: bool=False, valid_if_p
if was_expired:
num_invoices = order.invoices.filter(is_cancellation=False).count()
if num_invoices > 0 and order.invoices.filter(is_cancellation=True).count() >= num_invoices and invoice_qualified(order):
try:
generate_invoice(order)
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
generate_invoice(order)
order.create_transactions()
with transaction.atomic():
@@ -409,19 +397,13 @@ def approve_order(order, user=None, send_mail: bool=True, auth=None, force=False
if order.event.settings.get('invoice_generate') == 'True' and invoice_qualified(order):
if not invoice:
try:
invoice = generate_invoice(
order,
# send_mail will trigger PDF generation later
trigger_pdf=not transmit_invoice_mail
)
if transmit_invoice_task:
transmit_invoice.apply_async(args=(order.event_id, invoice.pk, False))
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
invoice = generate_invoice(
order,
# send_mail will trigger PDF generation later
trigger_pdf=not transmit_invoice_mail
)
if transmit_invoice_task:
transmit_invoice.apply_async(args=(order.event_id, invoice.pk, False))
if send_mail:
with language(order.locale, order.event.settings.region):
@@ -626,13 +608,7 @@ def _cancel_order(order, user=None, send_mail: bool=True, api_token=None, device
order.save(update_fields=['status', 'cancellation_date', 'total'])
if cancel_invoice and i:
try:
invoices.append(generate_invoice(order))
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
invoices.append(generate_invoice(order))
else:
order.status = Order.STATUS_CANCELED
order.cancellation_date = now()
@@ -1115,7 +1091,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no
for msg in meta_info.get('confirm_messages', []):
order.log_action('pretix.event.order.consent', data={'msg': msg})
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
return order, payments
@@ -1330,19 +1306,13 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis
)
)
if invoice_required:
try:
invoice = generate_invoice(
order,
# send_mail will trigger PDF generation later
trigger_pdf=not transmit_invoice_mail
)
if transmit_invoice_task:
transmit_invoice.apply_async(args=(event.pk, invoice.pk, False))
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
invoice = generate_invoice(
order,
# send_mail will trigger PDF generation later
trigger_pdf=not transmit_invoice_mail
)
if transmit_invoice_task:
transmit_invoice.apply_async(args=(event.pk, invoice.pk, False))
if order.email:
if order.require_approval:
@@ -2731,13 +2701,7 @@ class OrderChangeManager:
)
if split_order.total != Decimal('0.00') and self.order.invoices.filter(is_cancellation=False).last():
try:
generate_invoice(split_order)
except Exception as e:
logger.exception("Could not generate invoice.")
split_order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
generate_invoice(split_order)
order_split.send(sender=self.order.event, original=self.order, split_order=split_order)
return split_order
@@ -2848,32 +2812,20 @@ class OrderChangeManager:
if order_now_qualified:
if invoice_should_be_generated_now:
try:
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
self._invoices.append(generate_invoice(self.order))
except Exception as e:
logger.exception("Could not generate invoice.")
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
self._invoices.append(generate_invoice(self.order))
elif invoice_should_be_generated_later:
self.order.invoice_dirty = True
self.order.save(update_fields=["invoice_dirty"])
else:
try:
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
except Exception as e:
logger.exception("Could not generate invoice.")
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
def _check_complete_cancel(self):
current = self.order.positions.count()
cancels = sum([
1 + o.position.addons.filter(canceled=False).count() for o in self._operations if isinstance(o, self.CancelOperation)
1 + o.position.addons.count() for o in self._operations if isinstance(o, self.CancelOperation)
]) + len([
o for o in self._operations if isinstance(o, self.SplitOperation)
])
@@ -3294,14 +3246,8 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay
has_active_invoice = i and not i.canceled
if has_active_invoice and order.total != oldtotal:
try:
generate_cancellation(i)
generate_invoice(order)
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
generate_cancellation(i)
generate_invoice(order)
new_invoice_created = True
elif (not has_active_invoice or order.invoice_dirty) and invoice_qualified(order):
@@ -3309,19 +3255,13 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay
order.event.settings.get('invoice_generate') == 'paid' and
new_payment.payment_provider.requires_invoice_immediately
):
try:
if has_active_invoice:
generate_cancellation(i)
i = generate_invoice(order)
new_invoice_created = True
order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
except Exception as e:
logger.exception("Could not generate invoice.")
order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
if has_active_invoice:
generate_cancellation(i)
i = generate_invoice(order)
new_invoice_created = True
order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
order.create_transactions()
return old_fee, new_fee, fee, new_payment, new_invoice_created

View File

@@ -665,13 +665,12 @@ As with all event-plugin signals, the ``sender`` keyword argument will contain t
order_placed = EventPluginSignal()
"""
Arguments: ``order``, ``bulk``
Arguments: ``order``
This signal is sent out every time an order is placed. The order object is given
as the first argument. The ``bulk`` argument specifies whether the order was placed
as part of a bulk action, e.g. an import from a file.
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 the first argument. 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.
"""

View File

@@ -21,8 +21,6 @@
#
from django import forms
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 pretix.base.modelimport_orders import get_order_import_columns
@@ -73,9 +71,6 @@ class ProcessForm(forms.Form):
raise NotImplementedError() # noqa
format_html_lazy = lazy(format_html, str)
class OrdersProcessForm(ProcessForm):
orders = forms.ChoiceField(
label=_('Import mode'),
@@ -96,11 +91,7 @@ class OrdersProcessForm(ProcessForm):
)
testmode = forms.BooleanField(
label=_('Create orders as test mode orders'),
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.')
)
required=False
)
def __init__(self, *args, **kwargs):
@@ -109,8 +100,6 @@ class OrdersProcessForm(ProcessForm):
initital['testmode'] = self.event.testmode
kwargs['initial'] = initital
super().__init__(*args, **kwargs)
if not self.event.testmode:
self.fields["testmode"].help_text = ""
def get_columns(self):
return get_order_import_columns(self.event)

View File

@@ -455,7 +455,7 @@ class OrderDataSyncSuccessLogEntryType(OrderDataSyncLogEntryType):
links.append(", ".join(
prov.get_external_link_html(logentry.event, obj['external_link_href'], obj['external_link_display_name'])
for obj in objs
if obj and obj.get('external_link_href') and obj.get('external_link_display_name')
if obj and 'external_link_href' in obj and 'external_link_display_name' in obj
))
return mark_safe(escape(super().display(logentry, data)) + "".join("<p>" + link + "</p>" for link in links))
@@ -522,7 +522,6 @@ def pretixcontrol_orderposition_blocked_display(sender: Event, orderposition, bl
'pretix.event.order.customer.changed': _('The customer account has been changed.'),
'pretix.event.order.locale.changed': _('The order locale has been changed.'),
'pretix.event.order.invoice.generated': _('The invoice has been generated.'),
'pretix.event.order.invoice.failed': _('The invoice could not be generated.'),
'pretix.event.order.invoice.regenerated': _('The invoice has been regenerated.'),
'pretix.event.order.invoice.reissued': _('The invoice has been reissued.'),
'pretix.event.order.invoice.sent': _('The invoice {full_invoice_no} has been sent.'),

View File

@@ -78,8 +78,8 @@ class ControlSyncJob(OrderView):
prov, meta = datasync_providers.get(active_in=self.request.event, identifier=provider)
if self.request.POST.get("queue_sync") == "true":
prov.enqueue_order(self.order, 'user', immediate=True)
messages.success(self.request, _('The sync job has been set to run as soon as possible.'))
prov.enqueue_order(self.order, 'user')
messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.'))
elif self.request.POST.get("cancel_job"):
with transaction.atomic():
try:

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-10-03 01:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"PO-Revision-Date: 2025-09-26 13:02+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
"Language: de\n"
@@ -28214,7 +28214,7 @@ msgstr ""
#: pretix/control/views/modelimport.py:174
msgid "The import was successful."
msgstr "Der Import war erfolgreich."
msgstr "Die Import war erfolgreich."
#: pretix/control/views/modelimport.py:186
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"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-10-03 01:00+0000\n"
"Last-Translator: Mira <weller@rami.io>\n"
"PO-Revision-Date: 2025-09-26 13:02+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -28172,7 +28172,7 @@ msgstr ""
#: pretix/control/views/modelimport.py:174
msgid "The import was successful."
msgstr "Der Import war erfolgreich."
msgstr "Die Import war erfolgreich."
#: pretix/control/views/modelimport.py:186
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"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-26 11:16+0000\n"
"PO-Revision-Date: 2025-09-30 16:00+0000\n"
"PO-Revision-Date: 2025-08-30 02:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.13.3\n"
"X-Generator: Weblate 5.13\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -810,23 +810,28 @@ msgstr ""
"Primero verifique la dirección de correo electrónico en su cuenta de cliente."
#: pretix/base/datasync/datasync.py:255
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings."
msgstr ""
"El campo «{field_name}» no existe. Comprueba la configuración de "
"{provider_name}."
"El campo «{field_name}» no es válido para {available_inputs}. Comprueba la "
"configuración de {provider_name}."
#: pretix/base/datasync/datasync.py:262
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
msgid ""
"Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings."
msgstr ""
"El campo «{field_name}» requiere {required_input}, pero solo se ha "
"introducido {available_inputs}. Comprueba la configuración de "
"{provider_name}."
"El campo «{field_name}» no es válido para {available_inputs}. Comprueba la "
"configuración de {provider_name}."
#: pretix/base/datasync/datasync.py:273
#, python-brace-format
@@ -3554,11 +3559,6 @@ msgid ""
"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."
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
#, python-format
@@ -3829,9 +3829,12 @@ msgid "Peppol participant ID"
msgstr "Identificador de participante Peppol"
#: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice"
msgid "Visual copy"
msgstr "Copia visual"
msgstr "Código fiscal"
#: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice"
@@ -3840,9 +3843,6 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network."
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
msgid ""
@@ -14387,8 +14387,10 @@ msgid "Canceled (fully or with paid fee)"
msgstr "Cancelado (totalmente o con tarifa pagada)"
#: pretix/control/forms/filter.py:228
#, fuzzy
#| msgid "Cancel this position"
msgid "Canceled (at least one position)"
msgstr "Cancelado (al menos una posición)"
msgstr "Cancelar posición"
#: pretix/control/forms/filter.py:229
msgid "Cancellation requested"
@@ -17128,9 +17130,10 @@ msgid "The voucher has been deleted."
msgstr "El vale de compra fue eliminado."
#: pretix/control/logdisplay.py:584
#, python-brace-format
#, fuzzy, 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."
msgstr "El vale se ha asignado a {email} a través de la lista de espera."
msgstr "El vale se ha enviado a {email} a través de la lista de espera."
#: pretix/control/logdisplay.py:593
#, python-brace-format
@@ -27674,11 +27677,11 @@ msgstr ""
"próximos minutos."
#: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104
#, fuzzy
#| msgid "The voucher \"{voucher}\" has been used in the meantime."
msgid ""
"The sync job could not be found. It may have been processed in the meantime."
msgstr ""
"No se ha encontrado la tarea de sincronización. Es posible que se haya "
"procesado mientras tanto."
msgstr "El vale de compra {voucher} ya ha sido utilizado."
#: pretix/control/views/datasync.py:93 pretix/control/views/datasync.py:107
msgid "The sync job is already in progress."
@@ -28671,12 +28674,12 @@ msgstr ""
"programado para {name}."
#: 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 ""
"Your user account does not have sufficient permission to run this report, "
"therefore you cannot schedule it."
msgstr ""
"Su cuenta de usuario no tiene permisos suficientes para ejecutar este "
"informe, por lo que no puede programarlo."
msgstr "No tiene permiso suficiente para realizar esta exportación."
#: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259
msgid ""
@@ -29041,14 +29044,17 @@ 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."
#: 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"
msgid ""
"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."
msgstr ""
"La fecha no se pudo eliminar debido a que algunas restricciones (por "
"ejemplo, datos creados por complementos) no lo permitían. En su lugar, se "
"desactivó la fecha."
"El canal no ha podido borrarse porque algunas restricciones (por ejemplo, "
"datos creados por plug-ins) no lo permitían."
#: pretix/control/views/subevents.py:207
msgctxt "subevent"
@@ -33872,12 +33878,18 @@ msgstr ""
"formar un contrato válido."
#: 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 ""
"After you submitted your order using the button below, it will require "
"approval by the event organizer."
msgstr ""
"Después de enviar el pedido mediante el botón que aparece a continuación, "
"será necesario que el organizador del evento lo apruebe."
"Después de enviar su pedido usando el botón a continuación, requerirá la "
"aprobación del organizador del evento antes de que pueda confirmarse y "
"formar un contrato válido."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:195
msgid ""
@@ -36436,8 +36448,10 @@ msgid "The selected date does not exist in this event series."
msgstr "La fecha seleccionada no existe en esta serie de eventos."
#: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available."
msgstr "La fecha seleccionada no está disponible."
msgstr "El asiento seleccionado {seat} no está disponible."
#: pretix/presale/views/widget.py:476
#, python-format

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -36,7 +36,6 @@ import copy
import hmac
import inspect
import json
import logging
import mimetypes
import os
import re
@@ -99,8 +98,6 @@ from pretix.presale.views import (
from pretix.presale.views.event import get_grouped_items
from pretix.presale.views.robots import NoSearchIndexViewMixin
logger = logging.getLogger(__name__)
class OrderDetailMixin(NoSearchIndexViewMixin):
@@ -737,18 +734,11 @@ class OrderInvoiceCreate(EventViewMixin, OrderDetailMixin, View):
elif self.order.invoices.exists():
messages.error(self.request, _('An invoice for this order already exists.'))
else:
try:
i = generate_invoice(self.order)
self.order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
messages.success(self.request, _('The invoice has been generated.'))
except Exception as e:
logger.exception("Could not generate invoice.")
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
messages.error(self.request, _('Invoice generation has failed, please reach out to the organizer.'))
i = generate_invoice(self.order)
self.order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
messages.success(self.request, _('The invoice has been generated.'))
return redirect(self.get_order_url())
@@ -817,37 +807,24 @@ class OrderModify(EventViewMixin, OrderDetailMixin, OrderQuestionsViewMixin, Tem
elif self.order.invoices.exists():
messages.error(self.request, _('An invoice for this order already exists.'))
else:
try:
i = generate_invoice(self.order)
self.order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
messages.success(self.request, _('The invoice has been generated.'))
except Exception as e:
logger.exception("Could not generate invoice.")
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
})
messages.error(self.request, _('Invoice generation has failed, please reach out to the organizer.'))
i = generate_invoice(self.order)
self.order.log_action('pretix.event.order.invoice.generated', data={
'invoice': i.pk
})
messages.success(self.request, _('The invoice has been generated.'))
elif self.request.event.settings.invoice_reissue_after_modify:
if self.invoice_form.changed_data:
try:
inv = self.order.invoices.last()
if inv and not inv.canceled and not inv.shredded:
c = generate_cancellation(inv)
if self.order.status != Order.STATUS_CANCELED:
inv = generate_invoice(self.order)
else:
inv = c
self.order.log_action('pretix.event.order.invoice.reissued', data={
'invoice': inv.pk
})
messages.success(self.request, _('The invoice has been reissued.'))
except Exception as e:
self.order.log_action("pretix.event.order.invoice.failed", data={
"exception": str(e)
inv = self.order.invoices.last()
if inv and not inv.canceled and not inv.shredded:
c = generate_cancellation(inv)
if self.order.status != Order.STATUS_CANCELED:
inv = generate_invoice(self.order)
else:
inv = c
self.order.log_action('pretix.event.order.invoice.reissued', data={
'invoice': inv.pk
})
logger.exception("Could not generate invoice.")
messages.success(self.request, _('The invoice has been reissued.'))
invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'order': self.order.pk})
CachedTicket.objects.filter(order_position__order=self.order).delete()

View File

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

View File

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

View File

@@ -330,11 +330,9 @@ var ajaxErrDialog = {
$("#ajaxerr .links").html("<a class='btn btn-default ajaxerr-close'>"
+ gettext("Close message") + "</a>");
$("body").addClass("ajaxerr has-modal-dialog");
$("#ajaxerr").prop("hidden", false);
},
hide: function () {
"use strict";
$("body").removeClass("ajaxerr has-modal-dialog");
$("#ajaxerr").prop("hidden", true);
},
};

View File

@@ -60,7 +60,7 @@ var i18nToString = function (i18nstring) {
$(document).ajaxError(function (event, jqXHR, settings, thrownError) {
waitingDialog.hide();
var c = $(jqXHR.responseText).filter('.container');
if (jqXHR.responseText && jqXHR.responseText.indexOf("<!-- pretix-login-marker -->") !== -1) {
if (jqXHR.responseText.indexOf("<!-- pretix-login-marker -->") !== -1) {
location.href = '/control/login?next=' + encodeURIComponent(location.pathname + location.search + location.hash)
} else if (c.length > 0) {
ajaxErrDialog.show(c.first().html());
@@ -485,7 +485,6 @@ var form_handlers = function (el) {
theme: "bootstrap",
language: $("body").attr("data-select2-locale"),
data: JSON.parse($(this.getAttribute('data-select2-src')).text()),
width: '100%',
}).val(selectedValue).trigger('change');
});

View File

@@ -63,6 +63,10 @@ td > .form-group > .checkbox {
@include box-shadow(none);
}
div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], div[data-nested-formset-body], details[data-formset-form] {
width: 100%;
}
.form-plugins .panel-title {
line-height: 34px;
}

View File

@@ -1934,7 +1934,7 @@ function buildPoslist(bysetpos, timeset, start, end, ii, dayset) {
function iter(iterResult, options) {
var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos;
var count = options.count;
if (count === 0 || count < 0 || interval === 0 || interval < 0) {
if (count <= 0 || interval <= 0) {
return emitResult(iterResult);
}
var counterDate = datetime_DateTime.fromDate(dtstart);

View File

@@ -327,26 +327,6 @@ def test_enqueue_order_twice(event):
SimpleOrderSync.enqueue_order(order, 'testcase_2nd')
class DoNothingSync(SimpleOrderSync):
def should_sync_order(self, order):
return False
@pytest.mark.django_db
def test_should_not_sync(event):
_register_with_fake_plugin_name(datasync_providers, DoNothingSync, 'testplugin')
DoNothingSync.fake_api_client = FakeSyncAPI()
for order in event.orders.order_by("code").all():
DoNothingSync.enqueue_order(order, 'testcase')
sync_all()
assert DoNothingSync.fake_api_client.fake_database == {}
StaticMappingWithAssociations = namedtuple('StaticMappingWithAssociations', (
'id', 'pretix_model', 'external_object_type', 'pretix_id_field', 'external_id_field', 'property_mappings', 'association_mappings'
))

View File

@@ -54,7 +54,7 @@ def test_sales_channel_all(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PLACED,
all_sales_channels=True,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().checkins.exists()
@@ -67,12 +67,12 @@ def test_sales_channel_limit(event, item, order, checkin_list):
all_sales_channels=False,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert not order.positions.first().checkins.exists()
acr.limit_sales_channels.add(order.sales_channel)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().checkins.exists()
@@ -84,7 +84,7 @@ def test_items_all(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PLACED,
all_products=True,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().checkins.exists()
@@ -97,12 +97,12 @@ def test_items_limit(event, item, order, checkin_list):
all_products=False,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert not order.positions.first().checkins.exists()
acr.limit_products.add(item)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
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)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().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,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert not order.positions.first().checkins.exists()
acr.limit_variations.add(var)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().checkins.exists()
order.positions.first().checkins.all().delete()
acr.limit_products.add(item)
acr.limit_variations.clear()
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
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)
assert not order.positions.first().checkins.exists()
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert order.positions.first().checkins.exists()
@@ -182,7 +182,7 @@ def test_mode_paid(event, item, order, checkin_list):
mode=AutoCheckinRule.MODE_PAID,
)
order_placed.send(event, order=order, bulk=False)
order_placed.send(event, order=order)
assert not order.positions.first().checkins.exists()
order_paid.send(event, order=order)