Compare commits

..
Author SHA1 Message Date
Richard SchreiberandGitHub e54837c532 remove print statement 2023-08-23 09:51:12 +02:00
Raphael Michel bc49f0f7f1 Fix cache invalidation 2023-08-23 09:47:05 +02:00
Raphael Michel 3e122e0270 Fix quota cache mixup 2023-08-22 13:00:16 +02:00
111 changed files with 676 additions and 1827 deletions
+2 -33
View File
@@ -31,9 +31,9 @@ subevent_mode strings Determines h
``"same"`` (discount is only applied for groups within
the same date), or ``"distinct"`` (discount is only applied
for groups with no two same dates).
condition_all_products boolean If ``true``, the discount condition applies to all items.
condition_all_products boolean If ``true``, the discount applies to all items.
condition_limit_products list of integers If ``condition_all_products`` is not set, this is a list
of internal item IDs that the discount condition applies to.
of internal item IDs that the discount applies to.
condition_apply_to_addons boolean If ``true``, the discount applies to add-on products as well,
otherwise it only applies to top-level items. The discount never
applies to bundled products.
@@ -48,17 +48,6 @@ benefit_discount_matching_percent decimal (string) The percenta
benefit_only_apply_to_cheapest_n_matches integer If set higher than 0, the discount will only be applied to
the cheapest matches. Useful for a "3 for 2"-style discount.
Cannot be combined with ``condition_min_value``.
benefit_same_products boolean If ``true``, the discount benefit applies to the same set of items
as the condition (see above).
benefit_limit_products list of integers If ``benefit_same_products`` is not set, this is a list
of internal item IDs that the discount benefit applies to.
benefit_apply_to_addons boolean (Only used if ``benefit_same_products`` is ``false``.)
If ``true``, the discount applies to add-on products as well,
otherwise it only applies to top-level items. The discount never
applies to bundled products.
benefit_ignore_voucher_discounted boolean (Only used if ``benefit_same_products`` is ``false``.)
If ``true``, the discount does not apply to products which have
been discounted by a voucher.
======================================== ========================== =======================================================
@@ -105,10 +94,6 @@ Endpoints
"condition_ignore_voucher_discounted": false,
"condition_min_count": 3,
"condition_min_value": "0.00",
"benefit_same_products": true,
"benefit_limit_products": [],
"benefit_apply_to_addons": true,
"benefit_ignore_voucher_discounted": false,
"benefit_discount_matching_percent": "100.00",
"benefit_only_apply_to_cheapest_n_matches": 1
}
@@ -161,10 +146,6 @@ Endpoints
"condition_ignore_voucher_discounted": false,
"condition_min_count": 3,
"condition_min_value": "0.00",
"benefit_same_products": true,
"benefit_limit_products": [],
"benefit_apply_to_addons": true,
"benefit_ignore_voucher_discounted": false,
"benefit_discount_matching_percent": "100.00",
"benefit_only_apply_to_cheapest_n_matches": 1
}
@@ -203,10 +184,6 @@ Endpoints
"condition_ignore_voucher_discounted": false,
"condition_min_count": 3,
"condition_min_value": "0.00",
"benefit_same_products": true,
"benefit_limit_products": [],
"benefit_apply_to_addons": true,
"benefit_ignore_voucher_discounted": false,
"benefit_discount_matching_percent": "100.00",
"benefit_only_apply_to_cheapest_n_matches": 1
}
@@ -234,10 +211,6 @@ Endpoints
"condition_ignore_voucher_discounted": false,
"condition_min_count": 3,
"condition_min_value": "0.00",
"benefit_same_products": true,
"benefit_limit_products": [],
"benefit_apply_to_addons": true,
"benefit_ignore_voucher_discounted": false,
"benefit_discount_matching_percent": "100.00",
"benefit_only_apply_to_cheapest_n_matches": 1
}
@@ -294,10 +267,6 @@ Endpoints
"condition_ignore_voucher_discounted": false,
"condition_min_count": 3,
"condition_min_value": "0.00",
"benefit_same_products": true,
"benefit_limit_products": [],
"benefit_apply_to_addons": true,
"benefit_ignore_voucher_discounted": false,
"benefit_discount_matching_percent": "100.00",
"benefit_only_apply_to_cheapest_n_matches": 1
}
+2 -59
View File
@@ -12,7 +12,6 @@ The invoice resource contains the following public fields:
Field Type Description
===================================== ========================== =======================================================
number string Invoice number (with prefix)
event string The slug of the parent event
order string Order code of the order this invoice belongs to
is_cancellation boolean ``true``, if this invoice is the cancellation of a
different invoice.
@@ -122,13 +121,9 @@ internal_reference string Customer's refe
The attribute ``lines.subevent`` has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.
List of all invoices
--------------------
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/
@@ -157,7 +152,6 @@ List of all invoices
"results": [
{
"number": "SAMPLECONF-00001",
"event": "sampleconf",
"order": "ABC12",
"is_cancellation": false,
"invoice_from_name": "Big Events LLC",
@@ -227,50 +221,6 @@ List of all invoices
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/invoices/
Returns a list of all invoices within all events of a given organizer (with sufficient access permissions).
Supported query parameters and output format of this endpoint are identical to the list endpoint within an event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"number": "SAMPLECONF-00001",
"event": "sampleconf",
"order": "ABC12",
...
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
Fetching individual invoices
----------------------------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/(number)/
Returns information on one invoice, identified by its invoice number.
@@ -293,7 +243,6 @@ Fetching individual invoices
{
"number": "SAMPLECONF-00001",
"event": "sampleconf",
"order": "ABC12",
"is_cancellation": false,
"invoice_from_name": "Big Events LLC",
@@ -388,12 +337,6 @@ Fetching individual invoices
:statuscode 409: The file is not yet ready and will now be prepared. Retry the request after waiting for a few
seconds.
Modifying invoices
------------------
Invoices cannot be edited directly, but the following actions can be triggered:
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/invoices/(invoice_no)/reissue/
Cancels the invoice and creates a new one.
-49
View File
@@ -20,7 +20,6 @@ The order resource contains the following public fields:
Field Type Description
===================================== ========================== =======================================================
code string Order code
event string The slug of the parent event
status string Order status, one of:
* ``n`` pending
@@ -131,10 +130,6 @@ last_modified datetime Last modificati
The ``valid_if_pending`` attribute has been added.
.. versionchanged:: 2023.8
The ``event`` attribute has been added. The organizer-level endpoint has been added.
.. _order-position-resource:
@@ -294,7 +289,6 @@ List of all orders
"results": [
{
"code": "ABC12",
"event": "sampleconf",
"status": "p",
"testmode": false,
"secret": "k24fiuwvu8kxz3y1",
@@ -447,48 +441,6 @@ List of all orders
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/orders/
Returns a list of all orders within all events of a given organizer (with sufficient access permissions).
Supported query parameters and output format of this endpoint are identical to the list endpoint within an event,
with the exception that the ``pdf_data`` parameter is not supported here.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/orders/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
X-Page-Generated: 2017-12-01T10:00:00Z
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"code": "ABC12",
"event": "sampleconf",
...
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
Fetching individual orders
--------------------------
@@ -514,7 +466,6 @@ Fetching individual orders
{
"code": "ABC12",
"event": "sampleconf",
"status": "p",
"testmode": false,
"secret": "k24fiuwvu8kxz3y1",
+4 -13
View File
@@ -1,10 +1,10 @@
Scheduled email rules
Automated email rules
=====================
Resource description
--------------------
Scheduled email rules that specify emails that the system will send automatically at a specific point in time, e.g.
Automated email rules that specify emails that the system will send automatically at a specific point in time, e.g.
the day of the event.
.. rst-class:: rest-resource-table
@@ -23,14 +23,10 @@ limit_products list of integers List of product
restrict_to_status list List of order states to restrict recipients to. Valid
entries are ``p`` for paid, ``e`` for expired, ``c`` for canceled,
``n__pending_approval`` for pending approval,
``n__not_pending_approval_and_not_valid_if_pending`` for payment
pending, ``n__valid_if_pending`` for payment pending but already confirmed,
``n__not_pending_approval_and_not_valid_if_pending`` for payment pending,
``n__valid_if_pending`` for payment pending but already confirmed,
and ``n__pending_overdue`` for pending with payment overdue.
The default is ``["p", "n__valid_if_pending"]``.
checked_in_status string Check-in status to restrict recipients to. Valid strings are:
``null`` for no filtering (default), ``checked_in`` for
limiting to attendees that are or have been checked in, and
``no_checkin`` for limiting to attendees who have not checked in.
date_is_absolute boolean If ``true``, the email is set at a specific point in time.
send_date datetime If ``date_is_absolute`` is set: Date and time to send the email.
send_offset_days integer If ``date_is_absolute`` is not set, this is the number of days
@@ -93,7 +89,6 @@ Endpoints
"n__not_pending_approval_and_not_valid_if_pending",
"n__valid_if_pending"
],
"checked_in_status": null,
"send_date": null,
"send_offset_days": 1,
"send_offset_time": "18:00",
@@ -144,7 +139,6 @@ Endpoints
"n__not_pending_approval_and_not_valid_if_pending",
"n__valid_if_pending"
],
"checked_in_status": null,
"send_date": null,
"send_offset_days": 1,
"send_offset_time": "18:00",
@@ -186,7 +180,6 @@ Endpoints
"n__not_pending_approval_and_not_valid_if_pending",
"n__valid_if_pending"
],
"checked_in_status": "checked_in",
"send_date": null,
"send_offset_days": 1,
"send_offset_time": "18:00",
@@ -216,7 +209,6 @@ Endpoints
"n__not_pending_approval_and_not_valid_if_pending",
"n__valid_if_pending"
],
"checked_in_status": "checked_in",
"send_date": null,
"send_offset_days": 1,
"send_offset_time": "18:00",
@@ -274,7 +266,6 @@ Endpoints
"n__not_pending_approval_and_not_valid_if_pending",
"n__valid_if_pending"
],
"checked_in_status": "checked_in",
"send_date": null,
"send_offset_days": 1,
"send_offset_time": "18:00",
+1 -3
View File
@@ -32,13 +32,11 @@ class DiscountSerializer(I18nAwareModelSerializer):
'available_until', 'subevent_mode', 'condition_all_products', 'condition_limit_products',
'condition_apply_to_addons', 'condition_min_count', 'condition_min_value',
'benefit_discount_matching_percent', 'benefit_only_apply_to_cheapest_n_matches',
'benefit_same_products', 'benefit_limit_products', 'benefit_apply_to_addons',
'benefit_ignore_voucher_discounted', 'condition_ignore_voucher_discounted')
'condition_ignore_voucher_discounted')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['condition_limit_products'].queryset = self.context['event'].items.all()
self.fields['benefit_limit_products'].queryset = self.context['event'].items.all()
def validate(self, data):
data = super().validate(data)
+5 -8
View File
@@ -284,12 +284,11 @@ class FailedCheckinSerializer(I18nAwareModelSerializer):
raw_item = serializers.PrimaryKeyRelatedField(queryset=Item.objects.none(), required=False, allow_null=True)
raw_variation = serializers.PrimaryKeyRelatedField(queryset=ItemVariation.objects.none(), required=False, allow_null=True)
raw_subevent = serializers.PrimaryKeyRelatedField(queryset=SubEvent.objects.none(), required=False, allow_null=True)
nonce = serializers.CharField(required=False, allow_null=True)
class Meta:
model = Checkin
fields = ('error_reason', 'error_explanation', 'raw_barcode', 'raw_item', 'raw_variation',
'raw_subevent', 'nonce', 'datetime', 'type', 'position')
'raw_subevent', 'datetime', 'type', 'position')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -615,7 +614,7 @@ class PaymentURLField(serializers.URLField):
def to_representation(self, instance: OrderPayment):
if instance.state != OrderPayment.PAYMENT_STATE_CREATED:
return None
return build_absolute_uri(instance.order.event, 'presale:event.order.pay', kwargs={
return build_absolute_uri(self.context['event'], 'presale:event.order.pay', kwargs={
'order': instance.order.code,
'secret': instance.order.secret,
'payment': instance.pk,
@@ -660,7 +659,7 @@ class OrderRefundSerializer(I18nAwareModelSerializer):
class OrderURLField(serializers.URLField):
def to_representation(self, instance: Order):
return build_absolute_uri(instance.event, 'presale:event.order', kwargs={
return build_absolute_uri(self.context['event'], 'presale:event.order', kwargs={
'order': instance.code,
'secret': instance.secret,
})
@@ -695,7 +694,6 @@ class OrderListSerializer(serializers.ListSerializer):
class OrderSerializer(I18nAwareModelSerializer):
event = SlugRelatedField(slug_field='slug', read_only=True)
invoice_address = InvoiceAddressSerializer(allow_null=True)
positions = OrderPositionSerializer(many=True, read_only=True)
fees = OrderFeeSerializer(many=True, read_only=True)
@@ -711,7 +709,7 @@ class OrderSerializer(I18nAwareModelSerializer):
model = Order
list_serializer_class = OrderListSerializer
fields = (
'code', 'event', 'status', 'testmode', 'secret', 'email', 'phone', 'locale', 'datetime', 'expires', 'payment_date',
'code', 'status', 'testmode', 'secret', 'email', 'phone', 'locale', 'datetime', 'expires', 'payment_date',
'payment_provider', 'fees', 'total', 'comment', 'custom_followup_at', 'invoice_address', 'positions', 'downloads',
'checkin_attention', 'last_modified', 'payments', 'refunds', 'require_approval', 'sales_channel',
'url', 'customer', 'valid_if_pending'
@@ -1595,7 +1593,6 @@ class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
class InvoiceSerializer(I18nAwareModelSerializer):
event = SlugRelatedField(slug_field='slug', read_only=True)
order = serializers.SlugRelatedField(slug_field='code', read_only=True)
refers = serializers.SlugRelatedField(slug_field='full_invoice_no', read_only=True)
lines = InlineInvoiceLineSerializer(many=True)
@@ -1604,7 +1601,7 @@ class InvoiceSerializer(I18nAwareModelSerializer):
class Meta:
model = Invoice
fields = ('event', 'order', 'number', 'is_cancellation', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode',
fields = ('order', 'number', 'is_cancellation', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode',
'invoice_from_city', 'invoice_from_country', 'invoice_from_tax_id', 'invoice_from_vat_id',
'invoice_to', 'invoice_to_company', 'invoice_to_name', 'invoice_to_street', 'invoice_to_zipcode',
'invoice_to_city', 'invoice_to_state', 'invoice_to_country', 'invoice_to_vat_id', 'invoice_to_beneficiary',
-8
View File
@@ -94,14 +94,6 @@ class CustomerSerializer(I18nAwareModelSerializer):
data['name_parts']['_scheme'] = self.context['request'].organizer.settings.name_scheme
return data
def validate_email(self, value):
qs = Customer.objects.filter(organizer=self.context['organizer'], email__iexact=value)
if self.instance and self.instance.pk:
qs = qs.exclude(pk=self.instance.pk)
if qs.exists():
raise ValidationError(_("An account with this email address is already registered."))
return value
class CustomerCreateSerializer(CustomerSerializer):
send_email = serializers.BooleanField(default=False, required=False, allow_null=True)
+1 -3
View File
@@ -61,8 +61,6 @@ orga_router.register(r'membershiptypes', organizer.MembershipTypeViewSet)
orga_router.register(r'reusablemedia', media.ReusableMediaViewSet)
orga_router.register(r'teams', organizer.TeamViewSet)
orga_router.register(r'devices', organizer.DeviceViewSet)
orga_router.register(r'orders', order.OrganizerOrderViewSet)
orga_router.register(r'invoices', order.InvoiceViewSet)
orga_router.register(r'exporters', exporters.OrganizerExportersViewSet, basename='exporters')
team_router = routers.DefaultRouter()
@@ -79,7 +77,7 @@ event_router.register(r'questions', item.QuestionViewSet)
event_router.register(r'discounts', discount.DiscountViewSet)
event_router.register(r'quotas', item.QuotaViewSet)
event_router.register(r'vouchers', voucher.VoucherViewSet)
event_router.register(r'orders', order.EventOrderViewSet)
event_router.register(r'orders', order.OrderViewSet)
event_router.register(r'orderpositions', order.OrderPositionViewSet)
event_router.register(r'invoices', order.InvoiceViewSet)
event_router.register(r'revokedsecrets', order.RevokedSecretViewSet, basename='revokedsecrets')
+1 -14
View File
@@ -164,21 +164,8 @@ class CheckinListViewSet(viewsets.ModelViewSet):
secret=serializer.validated_data['raw_barcode']
).first()
clist = self.get_object()
if serializer.validated_data.get('nonce'):
if kwargs.get('position'):
prev = kwargs['position'].all_checkins.filter(nonce=serializer.validated_data['nonce']).first()
else:
prev = clist.checkins.filter(
nonce=serializer.validated_data['nonce'],
raw_barcode=serializer.validated_data['raw_barcode'],
).first()
if prev:
# Ignore because nonce is already handled
return Response(serializer.data, status=201)
c = serializer.save(
list=clist,
list=self.get_object(),
successful=False,
forced=True,
force_sent=True,
-1
View File
@@ -415,7 +415,6 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
'subeventitem_set',
'subeventitemvariation_set',
'meta_values',
'meta_values__property',
Prefetch(
'seat_category_mappings',
to_attr='_seat_category_mappings',
+25 -71
View File
@@ -44,7 +44,6 @@ from rest_framework.exceptions import (
APIException, NotFound, PermissionDenied, ValidationError,
)
from rest_framework.mixins import CreateModelMixin
from rest_framework.permissions import SAFE_METHODS
from rest_framework.response import Response
from pretix.api.models import OAuthAccessToken
@@ -186,7 +185,7 @@ with scopes_disabled():
)
class OrderViewSetMixin:
class OrderViewSet(viewsets.ModelViewSet):
serializer_class = OrderSerializer
queryset = Order.objects.none()
filter_backends = (DjangoFilterBackend, TotalOrderingFilter)
@@ -194,12 +193,19 @@ class OrderViewSetMixin:
ordering_fields = ('datetime', 'code', 'status', 'last_modified')
filterset_class = OrderFilter
lookup_field = 'code'
permission = 'can_view_orders'
write_permission = 'can_change_orders'
def get_base_queryset(self):
raise NotImplementedError()
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['event'] = self.request.event
ctx['pdf_data'] = self.request.query_params.get('pdf_data', 'false') == 'true'
ctx['exclude'] = self.request.query_params.getlist('exclude')
ctx['include'] = self.request.query_params.getlist('include')
return ctx
def get_queryset(self):
qs = self.get_base_queryset()
qs = self.request.event.orders
if 'fees' not in self.request.GET.getlist('exclude'):
if self.request.query_params.get('include_canceled_fees', 'false') == 'true':
fqs = OrderFee.all
@@ -221,12 +227,11 @@ class OrderViewSetMixin:
opq = OrderPosition.all
else:
opq = OrderPosition.objects
if request.query_params.get('pdf_data', 'false') == 'true' and getattr(request, 'event', None):
if request.query_params.get('pdf_data', 'false') == 'true':
prefetch_related_objects([request.organizer], 'meta_properties')
prefetch_related_objects(
[request.event],
Prefetch('meta_values', queryset=EventMetaValue.objects.select_related('property'),
to_attr='meta_values_cached'),
Prefetch('meta_values', queryset=EventMetaValue.objects.select_related('property'), to_attr='meta_values_cached'),
'questions',
'item_meta_properties',
)
@@ -261,12 +266,13 @@ class OrderViewSetMixin:
)
)
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['exclude'] = self.request.query_params.getlist('exclude')
ctx['include'] = self.request.query_params.getlist('include')
ctx['pdf_data'] = False
return ctx
def _get_output_provider(self, identifier):
responses = register_ticket_outputs.send(self.request.event)
for receiver, response in responses:
prov = response(self.request.event)
if prov.identifier == identifier:
return prov
raise NotFound('Unknown output provider.')
@scopes_disabled() # we are sure enough that get_queryset() is correct, so we save some perforamnce
def list(self, request, **kwargs):
@@ -283,45 +289,6 @@ class OrderViewSetMixin:
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data, headers={'X-Page-Generated': date})
class OrganizerOrderViewSet(OrderViewSetMixin, viewsets.ReadOnlyModelViewSet):
def get_base_queryset(self):
perm = "can_view_orders" if self.request.method in SAFE_METHODS else "can_change_orders"
if isinstance(self.request.auth, (TeamAPIToken, Device)):
return Order.objects.filter(
event__organizer=self.request.organizer,
event__in=self.request.auth.get_events_with_permission(perm)
)
elif self.request.user.is_authenticated:
return Order.objects.filter(
event__organizer=self.request.organizer,
event__in=self.request.user.get_events_with_permission(perm)
)
else:
raise PermissionDenied()
class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet):
permission = 'can_view_orders'
write_permission = 'can_change_orders'
def get_serializer_context(self):
ctx = super().get_serializer_context()
ctx['event'] = self.request.event
ctx['pdf_data'] = self.request.query_params.get('pdf_data', 'false') == 'true'
return ctx
def get_base_queryset(self):
return self.request.event.orders
def _get_output_provider(self, identifier):
responses = register_ticket_outputs.send(self.request.event)
for receiver, response in responses:
prov = response(self.request.event)
if prov.identifier == identifier:
return prov
raise NotFound('Unknown output provider.')
@action(detail=True, url_name='download', url_path='download/(?P<output>[^/]+)')
def download(self, request, output, **kwargs):
provider = self._get_output_provider(output)
@@ -1815,24 +1782,11 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
write_permission = 'can_change_orders'
def get_queryset(self):
perm = "can_view_orders" if self.request.method in SAFE_METHODS else "can_change_orders"
if getattr(self.request, 'event', None):
qs = self.request.event.invoices
elif isinstance(self.request.auth, (TeamAPIToken, Device)):
qs = Invoice.objects.filter(
event__organizer=self.request.organizer,
event__in=self.request.auth.get_events_with_permission(perm)
)
elif self.request.user.is_authenticated:
qs = Invoice.objects.filter(
event__organizer=self.request.organizer,
event__in=self.request.user.get_events_with_permission(perm)
)
return qs.prefetch_related('lines').select_related('order', 'refers').annotate(
return self.request.event.invoices.prefetch_related('lines').select_related('order', 'refers').annotate(
nr=Concat('prefix', 'invoice_no')
)
@action(detail=True)
@action(detail=True, )
def download(self, request, **kwargs):
invoice = self.get_object()
@@ -1851,7 +1805,7 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
return resp
@action(detail=True, methods=['POST'])
def regenerate(self, request, **kwargs):
def regenerate(self, request, **kwarts):
inv = self.get_object()
if inv.canceled:
raise ValidationError('The invoice has already been canceled.')
@@ -1861,7 +1815,7 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
raise PermissionDenied('The invoice file is no longer stored on the server.')
elif inv.sent_to_organizer:
raise PermissionDenied('The invoice file has already been exported.')
elif now().astimezone(inv.event.timezone).date() - inv.date > datetime.timedelta(days=1):
elif now().astimezone(self.request.event.timezone).date() - inv.date > datetime.timedelta(days=1):
raise PermissionDenied('The invoice file is too old to be regenerated.')
else:
inv = regenerate_invoice(inv)
@@ -1876,7 +1830,7 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
return Response(status=204)
@action(detail=True, methods=['POST'])
def reissue(self, request, **kwargs):
def reissue(self, request, **kwarts):
inv = self.get_object()
if inv.canceled:
raise ValidationError('The invoice has already been canceled.')
+5 -5
View File
@@ -62,27 +62,27 @@ class NamespacedCache:
prefix = int(time.time())
self.cache.set(self.prefixkey, prefix)
def set(self, key: str, value: any, timeout: int=300):
def set(self, key: str, value: str, timeout: int=300):
return self.cache.set(self._prefix_key(key), value, timeout)
def get(self, key: str) -> any:
def get(self, key: str) -> str:
return self.cache.get(self._prefix_key(key, known_prefix=self._last_prefix))
def get_or_set(self, key: str, default: Callable, timeout=300) -> any:
def get_or_set(self, key: str, default: Callable, timeout=300) -> str:
return self.cache.get_or_set(
self._prefix_key(key, known_prefix=self._last_prefix),
default=default,
timeout=timeout
)
def get_many(self, keys: List[str]) -> Dict[str, any]:
def get_many(self, keys: List[str]) -> Dict[str, str]:
values = self.cache.get_many([self._prefix_key(key) for key in keys])
newvalues = {}
for k, v in values.items():
newvalues[self._strip_prefix(k)] = v
return newvalues
def set_many(self, values: Dict[str, any], timeout=300):
def set_many(self, values: Dict[str, str], timeout=300):
newvalues = {}
for k, v in values.items():
newvalues[self._prefix_key(k)] = v
+2 -5
View File
@@ -134,11 +134,8 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer):
def template_name(self):
raise NotImplementedError()
def compile_markdown(self, plaintext):
return markdown_compile_email(plaintext)
def render(self, plain_body: str, plain_signature: str, subject: str, order, position) -> str:
body_md = self.compile_markdown(plain_body)
body_md = markdown_compile_email(plain_body)
htmlctx = {
'site': settings.PRETIX_INSTANCE_NAME,
'site_url': settings.SITE_URL,
@@ -156,7 +153,7 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer):
if plain_signature:
signature_md = plain_signature.replace('\n', '<br>\n')
signature_md = self.compile_markdown(signature_md)
signature_md = markdown_compile_email(signature_md)
htmlctx['signature'] = signature_md
if order:
-4
View File
@@ -549,9 +549,7 @@ class OrderListExporter(MultiSheetListExporter):
headers.append(_('End date'))
headers += [
_('Product'),
_('Product ID'),
_('Variation'),
_('Variation ID'),
_('Price'),
_('Tax rate'),
_('Tax rule'),
@@ -658,9 +656,7 @@ class OrderListExporter(MultiSheetListExporter):
row.append('')
row += [
str(op.item),
str(op.item_id),
str(op.variation) if op.variation else '',
str(op.variation_id) if op.variation_id else '',
op.price,
op.tax_rate,
str(op.tax_rule) if op.tax_rule else '',
@@ -1,34 +0,0 @@
# Generated by Django 4.2.4 on 2023-08-28 12:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0244_mediumkeyset"),
]
operations = [
migrations.AddField(
model_name="discount",
name="benefit_apply_to_addons",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="discount",
name="benefit_ignore_voucher_discounted",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="discount",
name="benefit_limit_products",
field=models.ManyToManyField(
related_name="benefit_discounts", to="pretixbase.item"
),
),
migrations.AddField(
model_name="discount",
name="benefit_same_products",
field=models.BooleanField(default=True),
),
]
+23 -74
View File
@@ -99,7 +99,7 @@ class Discount(LoggedModel):
)
condition_apply_to_addons = models.BooleanField(
default=True,
verbose_name=_("Count add-on products"),
verbose_name=_("Apply to add-on products"),
help_text=_("Discounts never apply to bundled products"),
)
condition_ignore_voucher_discounted = models.BooleanField(
@@ -107,7 +107,7 @@ class Discount(LoggedModel):
verbose_name=_("Ignore products discounted by a voucher"),
help_text=_("If this option is checked, products that already received a discount through a voucher will not "
"be considered for this discount. However, products that use a voucher only to e.g. unlock a "
"hidden product or gain access to sold-out quota will still be considered."),
"hidden product or gain access to sold-out quota will still receive the discount."),
)
condition_min_count = models.PositiveIntegerField(
verbose_name=_('Minimum number of matching products'),
@@ -120,19 +120,6 @@ class Discount(LoggedModel):
default=Decimal('0.00'),
)
benefit_same_products = models.BooleanField(
default=True,
verbose_name=_("Apply discount to same set of products"),
help_text=_("By default, the discount is applied across the same selection of products than the condition for "
"the discount given above. If you want, you can however also select a different selection of "
"products.")
)
benefit_limit_products = models.ManyToManyField(
'Item',
verbose_name=_("Apply discount to specific products"),
related_name='benefit_discounts',
blank=True
)
benefit_discount_matching_percent = models.DecimalField(
verbose_name=_('Percentual discount on matching products'),
decimal_places=2,
@@ -152,18 +139,6 @@ class Discount(LoggedModel):
blank=True,
validators=[MinValueValidator(1)],
)
benefit_apply_to_addons = models.BooleanField(
default=True,
verbose_name=_("Apply to add-on products"),
help_text=_("Discounts never apply to bundled products"),
)
benefit_ignore_voucher_discounted = models.BooleanField(
default=False,
verbose_name=_("Ignore products discounted by a voucher"),
help_text=_("If this option is checked, products that already received a discount through a voucher will not "
"be discounted. However, products that use a voucher only to e.g. unlock a hidden product or gain "
"access to sold-out quota will still receive the discount."),
)
# more feature ideas:
# - max_usages_per_order
@@ -212,14 +187,6 @@ class Discount(LoggedModel):
'on a minimum value.')
)
if data.get('subevent_mode') == cls.SUBEVENT_MODE_DISTINCT and not data.get('benefit_same_products'):
raise ValidationError(
{'benefit_same_products': [
_('You cannot apply the discount to a different set of products if the discount is only valid '
'for bookings of different dates.')
]}
)
def allow_delete(self):
return not self.orderposition_set.exists()
@@ -230,7 +197,6 @@ class Discount(LoggedModel):
'condition_min_value': self.condition_min_value,
'benefit_only_apply_to_cheapest_n_matches': self.benefit_only_apply_to_cheapest_n_matches,
'subevent_mode': self.subevent_mode,
'benefit_same_products': self.benefit_same_products,
})
def is_available_by_time(self, now_dt=None) -> bool:
@@ -241,14 +207,14 @@ class Discount(LoggedModel):
return False
return True
def _apply_min_value(self, positions, condition_idx_group, benefit_idx_group, result):
if self.condition_min_value and sum(positions[idx][2] for idx in condition_idx_group) < self.condition_min_value:
def _apply_min_value(self, positions, idx_group, result):
if self.condition_min_value and sum(positions[idx][2] for idx in idx_group) < self.condition_min_value:
return
if self.condition_min_count or self.benefit_only_apply_to_cheapest_n_matches:
raise ValueError('Validation invariant violated.')
for idx in benefit_idx_group:
for idx in idx_group:
previous_price = positions[idx][2]
new_price = round_decimal(
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
@@ -256,8 +222,8 @@ class Discount(LoggedModel):
)
result[idx] = new_price
def _apply_min_count(self, positions, condition_idx_group, benefit_idx_group, result):
if len(condition_idx_group) < self.condition_min_count:
def _apply_min_count(self, positions, idx_group, result):
if len(idx_group) < self.condition_min_count:
return
if not self.condition_min_count or self.condition_min_value:
@@ -267,17 +233,15 @@ class Discount(LoggedModel):
if not self.condition_min_count:
raise ValueError('Validation invariant violated.')
condition_idx_group = sorted(condition_idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
benefit_idx_group = sorted(benefit_idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
idx_group = sorted(idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
# Prevent over-consuming of items, i.e. if our discount is "buy 2, get 1 free", we only
# want to match multiples of 3
n_groups = min(len(condition_idx_group) // self.condition_min_count, len(benefit_idx_group))
consume_idx = condition_idx_group[:n_groups * self.condition_min_count]
benefit_idx = benefit_idx_group[:n_groups * self.benefit_only_apply_to_cheapest_n_matches]
consume_idx = idx_group[:len(idx_group) // self.condition_min_count * self.condition_min_count]
benefit_idx = idx_group[:len(idx_group) // self.condition_min_count * self.benefit_only_apply_to_cheapest_n_matches]
else:
consume_idx = condition_idx_group
benefit_idx = benefit_idx_group
consume_idx = idx_group
benefit_idx = idx_group
for idx in benefit_idx:
previous_price = positions[idx][2]
@@ -312,7 +276,7 @@ class Discount(LoggedModel):
limit_products = {p.pk for p in self.condition_limit_products.all()}
# First, filter out everything not even covered by our product scope
condition_candidates = [
initial_candidates = [
idx
for idx, (item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount) in positions.items()
if (
@@ -322,25 +286,11 @@ class Discount(LoggedModel):
)
]
if self.benefit_same_products:
benefit_candidates = list(condition_candidates)
else:
benefit_products = {p.pk for p in self.benefit_limit_products.all()}
benefit_candidates = [
idx
for idx, (item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount) in positions.items()
if (
item_id in benefit_products and
(self.benefit_apply_to_addons or not is_addon_to) and
(not self.benefit_ignore_voucher_discounted or voucher_discount is None or voucher_discount == Decimal('0.00'))
)
]
if self.subevent_mode == self.SUBEVENT_MODE_MIXED: # also applies to non-series events
if self.condition_min_count:
self._apply_min_count(positions, condition_candidates, benefit_candidates, result)
self._apply_min_count(positions, initial_candidates, result)
else:
self._apply_min_value(positions, condition_candidates, benefit_candidates, result)
self._apply_min_value(positions, initial_candidates, result)
elif self.subevent_mode == self.SUBEVENT_MODE_SAME:
def key(idx):
@@ -349,18 +299,17 @@ class Discount(LoggedModel):
# Build groups of candidates with the same subevent, then apply our regular algorithm
# to each group
_groups = groupby(sorted(condition_candidates, key=key), key=key)
candidate_groups = [(k, list(g)) for k, g in _groups]
_groups = groupby(sorted(initial_candidates, key=key), key=key)
candidate_groups = [list(g) for k, g in _groups]
for subevent_id, g in candidate_groups:
benefit_g = [idx for idx in benefit_candidates if positions[idx][1] == subevent_id]
for g in candidate_groups:
if self.condition_min_count:
self._apply_min_count(positions, g, benefit_g, result)
self._apply_min_count(positions, g, result)
else:
self._apply_min_value(positions, g, benefit_g, result)
self._apply_min_value(positions, g, result)
elif self.subevent_mode == self.SUBEVENT_MODE_DISTINCT:
if self.condition_min_value or not self.benefit_same_products:
if self.condition_min_value:
raise ValueError('Validation invariant violated.')
# Build optimal groups of candidates with distinct subevents, then apply our regular algorithm
@@ -387,7 +336,7 @@ class Discount(LoggedModel):
candidates = []
cardinality = None
for se, l in subevent_to_idx.items():
l = [ll for ll in l if ll in condition_candidates and ll not in current_group]
l = [ll for ll in l if ll in initial_candidates and ll not in current_group]
if cardinality and len(l) != cardinality:
continue
if se not in {positions[idx][1] for idx in current_group}:
@@ -424,5 +373,5 @@ class Discount(LoggedModel):
break
for g in candidate_groups:
self._apply_min_count(positions, g, g, result)
self._apply_min_count(positions, g, result)
return result
+2 -6
View File
@@ -907,18 +907,14 @@ class Event(EventMixin, LoggedModel):
self.items.filter(hidden_if_available_id=oldid).update(hidden_if_available=q)
for d in Discount.objects.filter(event=other).prefetch_related('condition_limit_products'):
c_items = list(d.condition_limit_products.all())
b_items = list(d.benefit_limit_products.all())
items = list(d.condition_limit_products.all())
d.pk = None
d.event = self
d.save(force_insert=True)
d.log_action('pretix.object.cloned')
for i in c_items:
for i in items:
if i.pk in item_map:
d.condition_limit_products.add(item_map[i.pk])
for i in b_items:
if i.pk in item_map:
d.benefit_limit_products.add(item_map[i.pk])
question_map = {}
for q in Question.objects.filter(event=other).prefetch_related('items', 'options'):
+1 -1
View File
@@ -1463,7 +1463,7 @@ class Question(LoggedModel):
(TYPE_PHONENUMBER, _("Phone number")),
)
UNLOCALIZED_TYPES = [TYPE_DATE, TYPE_TIME, TYPE_DATETIME]
ASK_DURING_CHECKIN_UNSUPPORTED = []
ASK_DURING_CHECKIN_UNSUPPORTED = [TYPE_PHONENUMBER]
event = models.ForeignKey(
Event,
+4 -11
View File
@@ -340,17 +340,10 @@ class TaxRule(LoggedModel):
rules = self._custom_rules
if invoice_address:
for r in rules:
if r['country'] == 'ZZ': # Rule: Any country
pass
elif r['country'] == 'EU': # Rule: Any EU country
if not is_eu_country(invoice_address.country):
continue
elif '-' in r['country']: # Rule: Specific country and state
if r['country'] != str(invoice_address.country) + '-' + str(invoice_address.state):
continue
else: # Rule: Specific country
if r['country'] != str(invoice_address.country):
continue
if r['country'] == 'EU' and not is_eu_country(invoice_address.country):
continue
if r['country'] not in ('ZZ', 'EU') and r['country'] != str(invoice_address.country):
continue
if r['address_type'] == 'individual' and invoice_address.is_business:
continue
if r['address_type'] in ('business', 'business_vat_id') and not invoice_address.is_business:
+1 -1
View File
@@ -742,7 +742,7 @@ class BasePaymentProvider:
the amount of money that should be paid.
If you need any special behavior, you can return a string containing the URL the user will be redirected to.
If you are done with your process you should return the user to the order's detail page. Redirection is only
If you are done with your process you should return the user to the order's detail page. Redirection is not
allowed if you set ``execute_payment_needs_user`` to ``True``.
If the payment is completed, you should call ``payment.confirm()``. Please note that this might
+2 -2
View File
@@ -702,10 +702,10 @@ def get_seat(op: OrderPosition):
def generate_compressed_addon_list(op, order, event):
itemcount = defaultdict(int)
addons = [p for p in (
addons = (
op.addons.all() if 'addons' in getattr(op, '_prefetched_objects_cache', {})
else op.addons.select_related('item', 'variation')
) if not p.canceled]
)
for pos in addons:
itemcount[pos.item, pos.variation] += 1
+8 -20
View File
@@ -1078,7 +1078,6 @@ class CartManager:
quotas_ok = _get_quota_availability(self._quota_diff, self.now_dt)
err = None
new_cart_positions = []
deleted_positions = set()
err = err or self._check_min_max_per_product()
@@ -1090,10 +1089,7 @@ class CartManager:
if op.position.expires > self.now_dt:
for q in op.position.quotas:
quotas_ok[q] += 1
addons = op.position.addons.all()
deleted_positions |= {a.pk for a in addons}
addons.delete()
deleted_positions.add(op.position.pk)
op.position.addons.all().delete()
op.position.delete()
elif isinstance(op, (self.AddOperation, self.ExtendOperation)):
@@ -1243,28 +1239,20 @@ class CartManager:
if op.seat and not op.seat.is_available(ignore_cart=op.position, sales_channel=self._sales_channel,
ignore_voucher_id=op.position.voucher_id):
err = err or error_messages['seat_unavailable']
addons = op.position.addons.all()
deleted_positions |= {a.pk for a in addons}
deleted_positions.add(op.position.pk)
addons.delete()
op.position.addons.all().delete()
op.position.delete()
elif available_count == 1:
op.position.expires = self._expiry
op.position.listed_price = op.listed_price
op.position.price_after_voucher = op.price_after_voucher
# op.position.price will be updated by recompute_final_prices_and_taxes()
if op.position.pk not in deleted_positions:
try:
op.position.save(force_update=True, update_fields=['expires', 'listed_price', 'price_after_voucher'])
except DatabaseError:
# Best effort... The position might have been deleted in the meantime!
pass
try:
op.position.save(force_update=True, update_fields=['expires', 'listed_price', 'price_after_voucher'])
except DatabaseError:
# Best effort... The position might have been deleted in the meantime!
pass
elif available_count == 0:
addons = op.position.addons.all()
deleted_positions |= {a.pk for a in addons}
deleted_positions.add(op.position.pk)
addons.delete()
op.position.addons.all().delete()
op.position.delete()
else:
raise AssertionError("ExtendOperation cannot affect more than one item")
+1 -1
View File
@@ -886,7 +886,7 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict,
if isinstance(auth, Device):
device = auth
last_cis = list(op.checkins.order_by('-datetime').filter(list=clist).only('type', 'nonce', 'position_id'))
last_cis = list(op.checkins.order_by('-datetime').filter(list=clist).only('type', 'nonce'))
entry_allowed = (
type == Checkin.TYPE_EXIT or
clist.allow_multiple_entries or
+1 -1
View File
@@ -171,7 +171,7 @@ def apply_discounts(event: Event, sales_channel: str,
Q(available_until__isnull=True) | Q(available_until__gte=now()),
sales_channels__contains=sales_channel,
active=True,
).prefetch_related('condition_limit_products', 'benefit_limit_products').order_by('position', 'pk')
).prefetch_related('condition_limit_products').order_by('position', 'pk')
for discount in discount_qs:
result = discount.apply({
idx: (item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount)
+4 -19
View File
@@ -22,15 +22,13 @@
import sys
from datetime import timedelta
from django.db.models import (
Exists, F, OuterRef, Prefetch, Q, Sum, prefetch_related_objects,
)
from django.db.models import Exists, F, OuterRef, Q, Sum
from django.dispatch import receiver
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import (
Event, EventMetaValue, SeatCategoryMapping, User, WaitingListEntry,
Event, SeatCategoryMapping, User, WaitingListEntry,
)
from pretix.base.models.waitinglist import WaitingListException
from pretix.base.services.tasks import EventTask
@@ -61,21 +59,8 @@ def assign_automatically(event: Event, user_id: int=None, subevent_id: int=None)
).aggregate(free=Sum(F('max_usages') - F('redeemed')))['free'] or 0
seats_available[(m.product_id, m.subevent_id)] = num_free_seets_for_product - num_valid_vouchers_for_product
prefetch_related_objects(
[event.organizer],
'meta_properties'
)
prefetch_related_objects(
[event],
Prefetch(
'meta_values',
EventMetaValue.objects.select_related('property'),
to_attr='meta_values_cached'
)
)
qs = event.waitinglistentries.filter(
voucher__isnull=True
qs = WaitingListEntry.objects.filter(
event=event, voucher__isnull=True
).select_related('item', 'variation', 'subevent').prefetch_related(
'item__quotas', 'variation__quotas'
).order_by('-priority', 'created')
-2
View File
@@ -210,8 +210,6 @@ def slow_delete(qs, batch_size=1000, sleep_time=.5, progress_callback=None, prog
break
if total_deleted >= 0.8 * batch_size:
time.sleep(sleep_time)
if progress_callback and progress_total:
progress_callback((progress_offset + total_deleted) / progress_total)
return total_deleted
+3 -3
View File
@@ -292,7 +292,7 @@ class LinkifyAndCleanExtension(Extension):
)
def markdown_compile_email(source, allowed_tags=ALLOWED_TAGS, allowed_attributes=ALLOWED_ATTRIBUTES):
def markdown_compile_email(source):
linker = bleach.Linker(
url_re=URL_RE,
email_re=EMAIL_RE,
@@ -306,8 +306,8 @@ def markdown_compile_email(source, allowed_tags=ALLOWED_TAGS, allowed_attributes
EmailNl2BrExtension(),
LinkifyAndCleanExtension(
linker,
tags=allowed_tags,
attributes=allowed_attributes,
tags=ALLOWED_TAGS,
attributes=ALLOWED_ATTRIBUTES,
protocols=ALLOWED_PROTOCOLS,
strip=False,
)
+1 -10
View File
@@ -50,16 +50,11 @@ class DiscountForm(I18nModelForm):
'condition_ignore_voucher_discounted',
'benefit_discount_matching_percent',
'benefit_only_apply_to_cheapest_n_matches',
'benefit_same_products',
'benefit_limit_products',
'benefit_apply_to_addons',
'benefit_ignore_voucher_discounted',
]
field_classes = {
'available_from': SplitDateTimeField,
'available_until': SplitDateTimeField,
'condition_limit_products': ItemMultipleChoiceField,
'benefit_limit_products': ItemMultipleChoiceField,
}
widgets = {
'subevent_mode': forms.RadioSelect,
@@ -69,14 +64,11 @@ class DiscountForm(I18nModelForm):
'data-inverse-dependency': '<[name$=all_products]',
'class': 'scrolling-multiple-choice',
}),
'benefit_limit_products': forms.CheckboxSelectMultiple(attrs={
'class': 'scrolling-multiple-choice',
}),
'benefit_only_apply_to_cheapest_n_matches': forms.NumberInput(
attrs={
'data-display-dependency': '#id_condition_min_count',
}
),
)
}
def __init__(self, *args, **kwargs):
@@ -93,7 +85,6 @@ class DiscountForm(I18nModelForm):
widget=forms.CheckboxSelectMultiple,
)
self.fields['condition_limit_products'].queryset = self.event.items.all()
self.fields['benefit_limit_products'].queryset = self.event.items.all()
self.fields['condition_min_count'].required = False
self.fields['condition_min_count'].widget.is_required = False
self.fields['condition_min_value'].required = False
+2 -15
View File
@@ -38,7 +38,6 @@ from decimal import Decimal
from urllib.parse import urlencode, urlparse
from zoneinfo import ZoneInfo
import pycountry
from django import forms
from django.conf import settings
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
@@ -66,8 +65,7 @@ from pretix.base.models import Event, Organizer, TaxRule, Team
from pretix.base.models.event import EventFooterLink, EventMetaValue, SubEvent
from pretix.base.reldate import RelativeDateField, RelativeDateTimeField
from pretix.base.settings import (
COUNTRIES_WITH_STATE_IN_ADDRESS, PERSON_NAME_SCHEMES,
PERSON_NAME_TITLE_GROUPS, validate_event_settings,
PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, validate_event_settings,
)
from pretix.base.validators import multimail_validate
from pretix.control.forms import (
@@ -1430,20 +1428,9 @@ class CountriesAndEU(CachedCountries):
cache_subkey = 'with_any_or_eu'
class CountriesAndEUAndStates(CountriesAndEU):
def __iter__(self):
for country_code, country_name in super().__iter__():
yield country_code, country_name
if country_code in COUNTRIES_WITH_STATE_IN_ADDRESS:
types, form = COUNTRIES_WITH_STATE_IN_ADDRESS[country_code]
yield from sorted(((state.code, country_name + " - " + state.name)
for state in pycountry.subdivisions.get(country_code=country_code)
if state.type in types), key=lambda s: s[1])
class TaxRuleLineForm(I18nForm):
country = LazyTypedChoiceField(
choices=CountriesAndEUAndStates(),
choices=CountriesAndEU(),
required=False
)
address_type = forms.ChoiceField(
+2 -4
View File
@@ -86,14 +86,12 @@ class GlobalSettingsForm(SettingsForm):
('leaflet_tiles', forms.CharField(
required=False,
label=_("Leaflet tiles URL pattern"),
help_text=_("e.g. {sample}").format(sample="https://tile.openstreetmap.org/{z}/{x}/{y}.png")
help_text=_("e.g. {sample}").format(sample="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png")
)),
('leaflet_tiles_attribution', forms.CharField(
required=False,
label=_("Leaflet tiles attribution"),
help_text=_("e.g. {sample}").format(
sample='&copy; &lt;a href=&quot;https://www.openstreetmap.org/copyright&quot;&gt;OpenStreetMap&lt;/a&gt; contributors'
)
help_text=_("e.g. {sample}").format(sample='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors')
)),
])
responses = register_global_settings.send(self)
-3
View File
@@ -340,9 +340,6 @@ class VoucherBulkForm(VoucherForm):
def clean_send_recipients(self):
raw = self.cleaned_data['send_recipients']
if self.cleaned_data.get('send', None) is False:
# No need to validate addresses if the section was turned off
return []
if not raw:
return []
r = raw.split('\n')
@@ -48,12 +48,6 @@
</fieldset>
<fieldset>
<legend>{% trans "Benefit" context "discount" %}</legend>
{% bootstrap_field form.benefit_same_products layout="control" %}
<div data-display-dependency="#id_benefit_same_products" data-inverse>
{% bootstrap_field form.benefit_limit_products layout="control" %}
{% bootstrap_field form.benefit_apply_to_addons layout="control" %}
{% bootstrap_field form.benefit_ignore_voucher_discounted layout="control" %}
</div>
{% bootstrap_field form.benefit_discount_matching_percent layout="control" addon_after="%" %}
{% bootstrap_field form.benefit_only_apply_to_cheapest_n_matches layout="control" %}
</fieldset>
+3 -3
View File
@@ -198,12 +198,12 @@ def waitinglist_widgets(sender, subevent=None, lazy=False, **kwargs):
else item.check_quotas(subevent=subevent, count_waitinglist=False, _cache=quota_cache)
)
if row[1] is None:
happy += wlt['cnt']
happy += 1
elif row[1] > 0:
happy += min(wlt['cnt'], row[1])
happy += 1
for q in quotas:
if q.size is not None:
quota_cache[q.pk] = (quota_cache[q.pk][0], quota_cache[q.pk][1] - min(wlt['cnt'], row[1]))
quota_cache[q.pk] = (quota_cache[q.pk][0], quota_cache[q.pk][1] - 1)
widgets.append({
'content': None if lazy else NUM_WIDGET.format(
+2 -2
View File
@@ -1054,8 +1054,8 @@ class DeviceBulkUpdateView(DeviceQueryMixin, OrganizerDetailViewMixin, Organizer
limit_events_list=Subquery(
Device.limit_events.through.objects.filter(
device_id=OuterRef('pk')
).order_by().values('device_id').annotate(
g=GroupConcat('event_id', separator=',', ordered=True)
).order_by('device_id', 'event_id').values('device_id').annotate(
g=GroupConcat('event_id', separator=',')
).values('g')
)
)
+6 -14
View File
@@ -66,26 +66,18 @@ class GroupConcat(Aggregate):
function = 'group_concat'
template = '%(function)s(%(field)s, "%(separator)s")'
def __init__(self, *expressions, ordered=False, **extra):
self.ordered = ordered
def __init__(self, *expressions, **extra):
if 'separator' not in extra:
# For PostgreSQL separator is an obligatory
extra.update({'separator': ','})
super().__init__(*expressions, **extra)
def as_postgresql(self, compiler, connection):
if self.ordered:
return super().as_sql(
compiler, connection,
function='string_agg',
template="%(function)s(%(field)s::text, '%(separator)s' ORDER BY %(field)s ASC)",
)
else:
return super().as_sql(
compiler, connection,
function='string_agg',
template="%(function)s(%(field)s::text, '%(separator)s')",
)
return super().as_sql(
compiler, connection,
function='string_agg',
template="%(function)s(%(field)s::text, '%(separator)s')",
)
class ReplicaRouter:
+3 -3
View File
@@ -24799,7 +24799,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24877,7 +24877,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24924,7 +24924,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -28366,7 +28366,7 @@ msgstr[5] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "البريد الإلكتروني للحاضر"
#: pretix/plugins/sendmail/signals.py:122
@@ -28460,7 +28460,7 @@ msgstr "إنشاء مستخدم جديد"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28523,7 +28523,7 @@ msgstr "اختيار البيانات"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee e-mail address"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "عنوان البريد الإلكتروني للحاضر"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -28023,7 +28023,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Correu electrònic de l'assistent"
#: pretix/plugins/sendmail/signals.py:122
@@ -28119,7 +28119,7 @@ msgstr "Crear un nou usuari"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28176,7 +28176,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee e-mail address"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Correu electrònic de l'assistent"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -27060,7 +27060,7 @@ msgstr[1] ""
msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -27138,7 +27138,7 @@ msgstr "Vytvořit e-mailové pravidlo"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27185,7 +27185,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24800,7 +24800,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24878,7 +24878,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24925,7 +24925,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -27171,7 +27171,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E-mailadresse"
#: pretix/plugins/sendmail/signals.py:122
@@ -27258,7 +27258,7 @@ msgstr "Opret en ny bruger"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27311,7 +27311,7 @@ msgstr "intet valgt"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "E-mailadresse"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+6 -6
View File
@@ -28103,8 +28103,8 @@ msgstr[0] "%(count)d Tag vor Veranstaltungsbeginn um %(time)s"
msgstr[1] "%(count)d Tage vor Veranstaltungsbeginn um %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgstr "Geplante E-Mails"
msgid "Automated emails"
msgstr "Automatisierte E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
@@ -28183,9 +28183,9 @@ msgstr "Neue Regel erstellen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
"Geplante E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
"Automatische E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
"ist."
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28236,8 +28236,8 @@ msgstr "Letzte Berechnung"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgstr "Regeln für geplante E-Mails"
msgid "Automated email rules"
msgstr "Regeln für automatisierte E-Mails"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
msgid ""
@@ -28055,8 +28055,8 @@ msgstr[0] "%(count)d Tag vor Veranstaltungsbeginn um %(time)s"
msgstr[1] "%(count)d Tage vor Veranstaltungsbeginn um %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgstr "Geplante E-Mails"
msgid "Automated emails"
msgstr "Automatisierte E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
@@ -28135,9 +28135,9 @@ msgstr "Neue Regel erstellen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
"Geplante E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
"Automatische E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
"ist."
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28188,8 +28188,8 @@ msgstr "Letzte Berechnung"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgstr "Regeln für geplante E-Mails"
msgid "Automated email rules"
msgstr "Regeln für automatisierte E-Mails"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
msgid ""
+3 -3
View File
@@ -24800,7 +24800,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24878,7 +24878,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24925,7 +24925,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -29895,7 +29895,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Email συμμετεχόντος"
#: pretix/plugins/sendmail/signals.py:122
@@ -29994,7 +29994,7 @@ msgstr "Δημιουργία νέου χρήστη"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -30060,7 +30060,7 @@ msgstr "Επιλογή δεδομένων"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Email συμμετεχόντος"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24799,7 +24799,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24877,7 +24877,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24924,7 +24924,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -29453,7 +29453,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Correo electrónico del participante"
#: pretix/plugins/sendmail/signals.py:122
@@ -29556,7 +29556,7 @@ msgstr "Crear un nuevo usuario"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -29617,7 +29617,7 @@ msgstr "Selección de datos"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Correo electrónico del participante"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -25621,7 +25621,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -25700,7 +25700,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -25747,7 +25747,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -28317,7 +28317,7 @@ msgstr[0] "%(count)d jour avant le début de l'événement à %(time)s"
msgstr[1] "%(count)d jours avant le début de l'événement à %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E-mails automatisés"
#: pretix/plugins/sendmail/signals.py:122
@@ -28398,7 +28398,7 @@ msgstr "Créer une règle de-mail"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
"Les e-mails automatisés ne sont pas envoyés tant que votre billetterie est "
"hors ligne."
@@ -28451,7 +28451,7 @@ msgstr "Calcul du dernier planning"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Règles de-mails automatiques"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -30019,7 +30019,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Correo electrónico del participante"
#: pretix/plugins/sendmail/signals.py:122
@@ -30113,7 +30113,7 @@ msgstr "Crear un nuevo usuario"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -30168,7 +30168,7 @@ msgstr "Selección de datos"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Correo electrónico del participante"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24825,7 +24825,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24903,7 +24903,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24950,7 +24950,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24809,7 +24809,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24887,7 +24887,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24934,7 +24934,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -25417,7 +25417,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -25503,7 +25503,7 @@ msgstr "Kifizetett megrendelések"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -25552,7 +25552,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24799,7 +24799,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24877,7 +24877,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24924,7 +24924,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -25888,7 +25888,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Email partecipante"
#: pretix/plugins/sendmail/signals.py:122
@@ -25978,7 +25978,7 @@ msgstr "Data di creazione"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -26028,7 +26028,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Email partecipante"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -25094,7 +25094,7 @@ msgid_plural "%(count)d days before event start at %(time)s"
msgstr[0] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -25172,7 +25172,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -25219,7 +25219,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24800,7 +24800,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24878,7 +24878,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24925,7 +24925,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24801,7 +24801,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24879,7 +24879,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24926,7 +24926,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -26285,7 +26285,7 @@ msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Apmeklētāja e-pasts"
#: pretix/plugins/sendmail/signals.py:122
@@ -26365,7 +26365,7 @@ msgstr "Datums un laiks"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -26422,7 +26422,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Apmeklētāja e-pasts"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24799,7 +24799,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24877,7 +24877,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24924,7 +24924,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -25337,7 +25337,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -25419,7 +25419,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -25466,7 +25466,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+124 -60
View File
@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-27 11:49+0000\n"
"PO-Revision-Date: 2023-08-25 04:00+0000\n"
"Last-Translator: Alain <alain@waag.org>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"PO-Revision-Date: 2023-07-16 22:00+0000\n"
"Last-Translator: Freek Engelbarts <freekengelbarts@gmail.com>\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 4.18.2\n"
"X-Generator: Weblate 4.17\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -411,7 +411,7 @@ msgstr "Bestelling is verlopen"
#: pretix/api/webhooks.py:234
msgid "Order expiry date changed"
msgstr "Verloopdatum aangepast"
msgstr "Verloopdatum aangepast."
#: pretix/api/webhooks.py:238 pretix/base/notifications.py:269
msgid "Order information changed"
@@ -534,8 +534,10 @@ msgid "Waiting list entry deleted"
msgstr "Wachtlijstitem verwijderd"
#: pretix/api/webhooks.py:351
#, fuzzy
#| msgid "Waiting list entries"
msgid "Waiting list entry received voucher"
msgstr "Wachtlijstitem heeft voucher ontvangen"
msgstr "Wachtlijstitems"
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:938
@@ -551,11 +553,11 @@ msgstr "Dit veld is verplicht."
#: pretix/base/addressvalidation.py:213
msgid "Enter a postal code in the format XXX."
msgstr "Postcode in het formaat XXX invoeren."
msgstr "Voer een postcode in in het formaat XXX."
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
msgid "Enter a postal code in the format XXXX."
msgstr "Postcode in het format XXXX invoeren."
msgstr "Voer een postcode in in het format XXXX."
#: pretix/base/auth.py:143
#, python-brace-format
@@ -2309,7 +2311,7 @@ msgstr ""
#: pretix/base/exporters/orderlist.py:887
msgid "Converted from legacy version"
msgstr "Vanuit oudere versie geconverteerd"
msgstr ""
#: pretix/base/exporters/orderlist.py:949
msgid "Payments and refunds"
@@ -4378,7 +4380,7 @@ msgstr ""
#: pretix/base/models/items.py:662
msgid "Reusable media type"
msgstr "Mediatype"
msgstr ""
#: pretix/base/models/items.py:664
msgid ""
@@ -6144,7 +6146,7 @@ msgstr "Vul een geldige taalcode in."
#: pretix/base/orderimport.py:669 pretix/base/orderimport.py:692
#, python-brace-format
msgid "Could not parse {value} as a date and time."
msgstr "Kon {value} niet als datum en tijd herkennen."
msgstr ""
#: pretix/base/orderimport.py:711
msgid "Please enter a valid sales channel."
@@ -6845,7 +6847,7 @@ msgstr "Geldig tot"
#: pretix/base/pdf.py:457
msgid "Reusable Medium ID"
msgstr "Media-ID"
msgstr ""
#: pretix/base/pdf.py:462
msgid "Seat: Full name"
@@ -7045,30 +7047,38 @@ msgstr ""
"door u gekozen hoeveelheid. Zie hieronder voor de details."
#: pretix/base/services/cart.py:114
#, python-format
#, fuzzy, python-format
#| msgid "You cannot select more than %s items per order."
msgid "You cannot select more than %s item per order."
msgid_plural "You cannot select more than %s items per order."
msgstr[0] "U kunt niet meer dan %s item per bestelling kiezen."
msgstr[0] "U kunt niet meer dan %s items per bestelling kiezen."
msgstr[1] "U kunt niet meer dan %s items per bestelling kiezen."
#: pretix/base/services/cart.py:118 pretix/base/services/orders.py:1468
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You cannot select more than %(max)s items of the product %(product)s."
msgid "You cannot select more than %(max)s item of the product %(product)s."
msgid_plural ""
"You cannot select more than %(max)s items of the product %(product)s."
msgstr[0] "U kunt niet meer dan %(max)s item van product %(product)s kiezen."
msgstr[0] "U kunt niet meer dan %(max)s items van product %(product)s kiezen."
msgstr[1] "U kunt niet meer dan %(max)s items van product %(product)s kiezen."
#: pretix/base/services/cart.py:123 pretix/base/services/orders.py:1473
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You need to select at least %(min)s items of the product %(product)s."
msgid "You need to select at least %(min)s item of the product %(product)s."
msgid_plural ""
"You need to select at least %(min)s items of the product %(product)s."
msgstr[0] "U moet ten minste %(min)s item van product %(product)s kiezen."
msgstr[0] "U moet ten minste %(min)s items van product %(product)s kiezen."
msgstr[1] "U moet ten minste %(min)s items van product %(product)s kiezen."
#: pretix/base/services/cart.py:128
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "We removed %(product)s from your cart as you can not buy less than "
#| "%(min)s items of it."
msgid ""
"We removed %(product)s from your cart as you can not buy less than %(min)s "
"item of it."
@@ -7077,10 +7087,10 @@ msgid_plural ""
"items of it."
msgstr[0] ""
"We hebben %(product)s uit uw winkelwagen verwijderd, omdat u niet minder dan "
"%(min)s item ervan kunt kopen."
"%(min)s ervan kunt kopen."
msgstr[1] ""
"We hebben %(product)s uit uw winkelwagen verwijderd, omdat u niet minder dan "
"%(min)s items ervan kunt kopen."
"%(min)s ervan kunt kopen."
#: pretix/base/services/cart.py:132 pretix/base/services/orders.py:146
#: pretix/presale/templates/pretixpresale/event/index.html:157
@@ -7242,7 +7252,10 @@ msgid "You can not select two variations of the same add-on product."
msgstr "U kunt niet twee varianten van hetzelfde add-on-product selecteren."
#: pretix/base/services/cart.py:185 pretix/base/services/orders.py:184
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You can select at most %(max)s add-ons from the category %(cat)s for the "
#| "product %(base)s."
msgid ""
"You can select at most %(max)s add-on from the category %(cat)s for the "
"product %(base)s."
@@ -7250,14 +7263,17 @@ msgid_plural ""
"You can select at most %(max)s add-ons from the category %(cat)s for the "
"product %(base)s."
msgstr[0] ""
"U kunt maximaal %(max)s add-on van de categorie %(cat)s selecteren voor het "
"U kunt maximaal %(max)s add-ons van de categorie %(cat)s selecteren voor het "
"product %(base)s."
msgstr[1] ""
"U kunt maximaal %(max)s add-ons van de categorie %(cat)s selecteren voor het "
"product %(base)s."
#: pretix/base/services/cart.py:190 pretix/base/services/orders.py:189
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You need to select at least %(min)s add-ons from the category %(cat)s for "
#| "the product %(base)s."
msgid ""
"You need to select at least %(min)s add-on from the category %(cat)s for the "
"product %(base)s."
@@ -7265,7 +7281,7 @@ msgid_plural ""
"You need to select at least %(min)s add-ons from the category %(cat)s for "
"the product %(base)s."
msgstr[0] ""
"U moet minimaal %(min)s add-on van de categorie %(cat)s selecteren voor het "
"U moet minimaal %(min)s add-ons van de categorie %(cat)s selecteren voor het "
"product %(base)s."
msgstr[1] ""
"U moet minimaal %(min)s add-ons van de categorie %(cat)s selecteren voor het "
@@ -7430,14 +7446,16 @@ msgid "This ticket has been blocked."
msgstr "Dit ticket werd reeds eenmaal gebruikt."
#: pretix/base/services/checkin.py:781 pretix/base/services/checkin.py:785
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Only allowed after {datetime}"
msgid "This ticket is only valid after {datetime}."
msgstr "Dit ticket is geldig vanaf {datetime}."
msgstr "Alleen toegestaan vanaf {datetime}"
#: pretix/base/services/checkin.py:795 pretix/base/services/checkin.py:799
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "This ticket has already been redeemed."
msgid "This ticket was only valid before {datetime}."
msgstr "Dit ticket was geldig vòòr {datetime}."
msgstr "Dit ticket is al gebruikt."
#: pretix/base/services/checkin.py:830
msgid "This order position has an invalid product for this check-in list."
@@ -7498,14 +7516,14 @@ msgid "Export failed"
msgstr "Geëxporteerde bestanden"
#: pretix/base/services/export.py:206
#, fuzzy
#| msgid "Permission denied"
msgid "Permission denied."
msgstr "Geen toestemming."
msgstr "Geen toestemming"
#: pretix/base/services/export.py:221
msgid "Your exported data exceeded the size limit for scheduled exports."
msgstr ""
"De door u geëxporteerde data overschrijdt de grootte-limiet voor geplande "
"exports."
#: pretix/base/services/invoices.py:103
#, python-brace-format
@@ -7530,10 +7548,11 @@ msgstr ""
"{country}"
#: pretix/base/services/invoices.py:220 pretix/base/services/invoices.py:257
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Event location"
msgctxt "invoice"
msgid "Event location: {location}"
msgstr "Evenementlocatie: {location}"
msgstr "Evenementlocatie"
#: pretix/base/services/invoices.py:236
#, python-brace-format
@@ -7747,7 +7766,10 @@ msgid "Your cart is empty."
msgstr "Uw winkelwagen is leeg."
#: pretix/base/services/orders.py:138
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You cannot select more than %(max)s items of the product %(product)s. We "
#| "removed the surplus items from your cart."
msgid ""
"You cannot select more than %(max)s item of the product %(product)s. We "
"removed the surplus items from your cart."
@@ -7755,11 +7777,11 @@ msgid_plural ""
"You cannot select more than %(max)s items of the product %(product)s. We "
"removed the surplus items from your cart."
msgstr[0] ""
"U kunt van het product %(product)s niet meer dan %(max)s per bestelling "
"kiezen. We hebben de overtallige producten uit uw winkelwagen verwijderd."
"U kunt niet meer dan %(max)s kopieën van het product %(product)s kiezen. We "
"hebben het overschot uit uw winkelwagen verwijderd."
msgstr[1] ""
"U kunt van het product %(product)s niet meer dan %(max)s per bestelling "
"kiezen. We hebben de overtallige producten uit uw winkelwagen verwijderd."
"U kunt niet meer dan %(max)s kopieën van het product %(product)s kiezen. We "
"hebben het overschot uit uw winkelwagen verwijderd."
#: pretix/base/services/orders.py:147
msgid "The booking period has ended."
@@ -7809,9 +7831,10 @@ msgstr ""
"niet geldig voor dit item. We hebben dit item uit uw winkelwagen verwijderd."
#: pretix/base/services/orders.py:168
#, fuzzy
#| msgid "You need a valid voucher code to order this product."
msgid "You need a valid voucher code to order one of the products."
msgstr ""
"U heeft een geldige vouchercode nodig om een van de producten te bestellen."
msgstr "U heeft een geldige vouchercode nodig om dit product te bestellen."
#: pretix/base/services/orders.py:170
msgid ""
@@ -7850,8 +7873,10 @@ msgstr ""
"is besteld."
#: pretix/base/services/orders.py:210
#, fuzzy
#| msgid "The order has been canceled."
msgid "The order was not canceled."
msgstr "De bestelling is niet geannuleerd."
msgstr "De bestelling is geannuleerd."
#: pretix/base/services/orders.py:265 pretix/control/forms/orders.py:120
msgid "The new expiry date needs to be in the future."
@@ -7887,8 +7912,10 @@ msgstr ""
"bestelling is betaald."
#: pretix/base/services/orders.py:918
#, fuzzy
#| msgid "This payment method does not support automatic refunds."
msgid "The selected payment methods do not cover the total balance."
msgstr "Deze betalingsmethode dekt het volledige bedrag niet."
msgstr "Deze betalingsmethode ondersteunt geen automatische terugbetalingen."
#: pretix/base/services/orders.py:990
msgid ""
@@ -8043,8 +8070,10 @@ msgid "Something happened in your event after the export, please try again."
msgstr "Er is iets gebeurd in uw evenement na de export, probeer het opnieuw."
#: pretix/base/services/shredder.py:177
#, fuzzy
#| msgid "Payment completed."
msgid "Data shredding completed"
msgstr "Verwijderen van data voltooid."
msgstr "Betaling voltooid."
#: pretix/base/services/stats.py:210
msgid "Uncategorized"
@@ -10071,7 +10100,19 @@ msgid "Your order is pending payment: {code}"
msgstr "Uw bestelling wacht op betaling: {code}"
#: pretix/base/settings.py:2316
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we did not yet receive a full payment for your order for {event}.\n"
#| "Please keep in mind that we only guarantee your order if we receive\n"
#| "your payment before {expire_date}.\n"
#| "\n"
#| "You can view the payment information and the status of your order at\n"
#| "{url}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
msgid ""
"Hello,\n"
"\n"
@@ -10094,7 +10135,7 @@ msgstr ""
"U kunt de betalingsinformatie en de status van uw bestelling inzien op\n"
"{url}.\n"
"\n"
"Met vriendelijke groet, \n"
"Met vriendelijke groet,\n"
"De organisatoren van {event}"
#: pretix/base/settings.py:2329
@@ -10104,7 +10145,19 @@ msgid "Incomplete payment received: {code}"
msgstr "Betaling ontvangen voor uw bestelling: {code}"
#: pretix/base/settings.py:2333
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we did not yet receive a full payment for your order for {event}.\n"
#| "Please keep in mind that we only guarantee your order if we receive\n"
#| "your payment before {expire_date}.\n"
#| "\n"
#| "You can view the payment information and the status of your order at\n"
#| "{url}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
msgid ""
"Hello,\n"
"\n"
@@ -10122,11 +10175,10 @@ msgid ""
msgstr ""
"Hallo,\n"
"\n"
"We hebben een betaling ontvangen voor {event}\n"
"\n"
"Helaas is het ontvangen bedrag minder dan het volledige verschuldigde "
"bedrag. Graag nog het bedrag van **{pending_sum}** voldoen om de bestelling "
"te voltooien.\n"
"We hebben nog geen volledige betaling ontvangen voor uw bestelling voor "
"{event}.\n"
"We kunnen uw bestelling alleen garanderen als we uw betaling ontvangen\n"
"voor {expire_date}.\n"
"\n"
"U kunt de betalingsinformatie en de status van uw bestelling inzien op\n"
"{url}.\n"
@@ -10315,7 +10367,17 @@ msgstr ""
"Organisatie van {event}"
#: pretix/base/settings.py:2446 pretix/base/settings.py:2483
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello {attendee_name},\n"
#| "\n"
#| "a ticket for {event} has been ordered for you.\n"
#| "\n"
#| "You can view the details and status of your ticket here:\n"
#| "{url}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
msgid ""
"Hello,\n"
"\n"
@@ -10327,9 +10389,9 @@ msgid ""
"Best regards, \n"
"Your {event} team"
msgstr ""
"Beste,\n"
"Beste {attendee_name},\n"
"\n"
"Uw ticket voor {event} is geaccordeerd.\n"
"Er is een ticket voor {event} voor u besteld.\n"
"\n"
"U kunt de details en status van uw ticket hier bekijken:\n"
"{url}\n"
@@ -17233,8 +17295,10 @@ msgid "Valid check-in"
msgstr "Alle check-ins"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:67
#, fuzzy
#| msgid "Additional information"
msgid "Additional information required"
msgstr "Extra informatie vereist"
msgstr "Extra informatie"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:69
msgid ""
@@ -28479,7 +28543,7 @@ msgstr[0] "%(count)d dag voor de start van het evenement om %(time)s"
msgstr[1] "%(count)d dagen voor de start van het evenement om %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Automatische e-mails"
#: pretix/plugins/sendmail/signals.py:122
@@ -28567,7 +28631,7 @@ msgstr "Maak e-mailregel"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28622,7 +28686,7 @@ msgstr "Laatst uitgevoerd"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Automatische e-mailregels"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+4 -4
View File
@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-21 11:46+0000\n"
"PO-Revision-Date: 2023-08-24 04:00+0000\n"
"Last-Translator: Alain <alain@waag.org>\n"
"PO-Revision-Date: 2021-10-29 02:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
"nl/>\n"
"Language: nl\n"
@@ -16,7 +16,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 4.18.2\n"
"X-Generator: Weblate 4.8\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -252,7 +252,7 @@ msgstr "Dit ticket is nog niet betaald. Wilt u toch doorgaan?"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr "Extra informatie vereist"
msgstr "Extra informatie nodig"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"
@@ -24801,7 +24801,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24879,7 +24879,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24926,7 +24926,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-27 11:49+0000\n"
"PO-Revision-Date: 2023-08-24 04:00+0000\n"
"Last-Translator: Alain <alain@waag.org>\n"
"PO-Revision-Date: 2023-07-16 22:00+0000\n"
"Last-Translator: Freek Engelbarts <freekengelbarts@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix/nl_Informal/>\n"
"Language: nl_Informal\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 4.18.2\n"
"X-Generator: Weblate 4.17\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -555,8 +555,10 @@ msgid "Waiting list entry deleted"
msgstr "Wachtlijstitem"
#: pretix/api/webhooks.py:351
#, fuzzy
#| msgid "Waiting list entries"
msgid "Waiting list entry received voucher"
msgstr "Wachtlijstitem heeft voucher ontvangen"
msgstr "Wachtlijstitems"
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:938
@@ -28783,7 +28785,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E-mailadres van gast"
#: pretix/plugins/sendmail/signals.py:122
@@ -28877,7 +28879,7 @@ msgstr "Maak een nieuwe gebruiker aan"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28941,7 +28943,7 @@ msgstr "Datakeuze"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee e-mail address"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "E-mailadres van gast"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -26566,7 +26566,7 @@ msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Adres email uczestnika"
#: pretix/plugins/sendmail/signals.py:122
@@ -26660,7 +26660,7 @@ msgstr "Data stworzenia"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -26711,7 +26711,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Adres email uczestnika"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -24820,7 +24820,7 @@ msgstr[1] ""
msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24898,7 +24898,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24945,7 +24945,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -25093,7 +25093,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -25171,7 +25171,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -25218,7 +25218,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -27358,7 +27358,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E-mail do participante"
#: pretix/plugins/sendmail/signals.py:122
@@ -27452,7 +27452,7 @@ msgstr "Tipo de dispositivo"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27506,7 +27506,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "E-mail do participante"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -28193,7 +28193,7 @@ msgstr[0] "%(count)d dia antes do início do evento às %(time)s"
msgstr[1] "%(count)d dias antes do início do evento às %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E -mails automatizados"
#: pretix/plugins/sendmail/signals.py:122
@@ -28275,7 +28275,7 @@ msgstr "Crie regra de email"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28326,7 +28326,7 @@ msgstr "Última programação Computação"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Regras de email automatizadas"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -28777,7 +28777,7 @@ msgstr[1] "cu %(count)d zile înainte de începerea evenimentului la %(time)s"
msgstr[2] "cu %(count)d zile înainte de începerea evenimentului la %(time)s"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "E-mailuri automate"
#: pretix/plugins/sendmail/signals.py:122
@@ -28861,7 +28861,7 @@ msgstr "Creați o regulă de e-mail"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28914,7 +28914,7 @@ msgstr "Calculul ultimului program"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Reguli automatizate de e-mail"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -27155,7 +27155,7 @@ msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Адрес электронной почты посетителя"
#: pretix/plugins/sendmail/signals.py:122
@@ -27241,7 +27241,7 @@ msgstr "Дата и время"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27297,7 +27297,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Адрес электронной почты посетителя"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24872,7 +24872,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24950,7 +24950,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24997,7 +24997,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -26953,7 +26953,7 @@ msgstr[3] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Email udeleženca"
#: pretix/plugins/sendmail/signals.py:122
@@ -27041,7 +27041,7 @@ msgstr "Datum ustvarjenja"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27094,7 +27094,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee e-mail address"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "E-poštni naslov udeleženca"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -26970,7 +26970,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Epost till deltagare"
#: pretix/plugins/sendmail/signals.py:122
@@ -27056,7 +27056,7 @@ msgstr "Avbryt beställning"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27107,7 +27107,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Epost till deltagare"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24802,7 +24802,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24880,7 +24880,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24927,7 +24927,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -29881,7 +29881,7 @@ msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Katılımcı e-postası"
#: pretix/plugins/sendmail/signals.py:122
@@ -29986,7 +29986,7 @@ msgstr "Yeni bir kullanıcı oluştur"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -30050,7 +30050,7 @@ msgstr "Veri seçimi"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "Katılımcı e-postası"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -27634,7 +27634,7 @@ msgstr[1] ""
msgstr[2] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "Автоматизовані електронні листи"
#: pretix/plugins/sendmail/signals.py:122
@@ -27718,7 +27718,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -27768,7 +27768,7 @@ msgstr "Останній розрахунок графіка"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+3 -3
View File
@@ -24809,7 +24809,7 @@ msgstr[0] ""
msgstr[1] ""
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr ""
#: pretix/plugins/sendmail/signals.py:122
@@ -24887,7 +24887,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -24934,7 +24934,7 @@ msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -28499,7 +28499,7 @@ msgstr[0] ""
#: pretix/plugins/sendmail/signals.py:99
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "观众Email"
#: pretix/plugins/sendmail/signals.py:122
@@ -28604,7 +28604,7 @@ msgstr "创建一个新用户"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr ""
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -28667,7 +28667,7 @@ msgstr "数据选择"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
#, fuzzy
#| msgid "Attendee email"
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "观众Email"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
+201 -108
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-27 11:49+0000\n"
"PO-Revision-Date: 2023-08-31 07:34+0000\n"
"Last-Translator: Martin Gross <gross@rami.io>\n"
"PO-Revision-Date: 2023-06-28 06:00+0000\n"
"Last-Translator: Yucheng Lin <yuchenglinedu@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://translate.pretix.eu/projects/"
"pretix/pretix/zh_Hant/>\n"
"Language: zh_Hant\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.18.2\n"
"X-Generator: Weblate 4.17\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -170,7 +170,7 @@ msgstr "目標URL"
#: pretix/api/models.py:113 pretix/base/models/devices.py:123
#: pretix/base/models/organizer.py:264
msgid "All events (including newly created ones)"
msgstr "所有活動(包括新建立的活動"
msgstr "所有事件(包括新建立的事件"
#: pretix/api/models.py:114 pretix/base/models/devices.py:124
#: pretix/base/models/organizer.py:265
@@ -4004,10 +4004,10 @@ msgstr "要此產品,使用者需要直接或透過額度,購買適用於此
#: pretix/base/models/items.py:507
msgid ""
"If this product is part of an order, the order will be put into an \"approval"
"\" state and will need to be confirmed by you before it can be paid and "
"completed. You can use this e.g. for discounted tickets that are only "
"available to specific groups."
"If this product is part of an order, the order will be put into an "
"\"approval\" state and will need to be confirmed by you before it can be "
"paid and completed. You can use this e.g. for discounted tickets that are "
"only available to specific groups."
msgstr ""
"如果此產品是訂單的一部分,則該訂單將進入“批准”狀態,需要你確認才能付款和完"
"成。例如,你可以將其用於僅適用於特定團體的折扣門票。"
@@ -5876,18 +5876,24 @@ msgid "Ambiguous option selected."
msgstr "選擇不明確的選項。"
#: pretix/base/orderimport.py:845
#, fuzzy
#| msgid "No matching seat was found."
msgid "No matching customer was found."
msgstr "未找到符合的客戶。"
msgstr "未找到符合的座位。"
#: pretix/base/payment.py:86
#, fuzzy
#| msgid "Apply"
msgctxt "payment"
msgid "Apple Pay"
msgstr "Apple Pay"
msgstr "應用"
#: pretix/base/payment.py:87
#, fuzzy
#| msgid "Android (Google Play)"
msgctxt "payment"
msgid "Google Pay"
msgstr "安卓(Google Pay"
msgstr "安卓(Google Play"
#: pretix/base/payment.py:256
#: pretix/presale/templates/pretixpresale/event/order.html:115
@@ -5949,13 +5955,13 @@ msgstr "根據包括費用在內的總價值計算費用。"
#, python-brace-format
msgid ""
"We recommend to enable this if you want your users to pay the payment fees "
"of your payment provider. <a href=\"{docs_url}\" target=\"_blank\" rel="
"\"noopener\">Click here for detailed information on what this does.</a> "
"of your payment provider. <a href=\"{docs_url}\" target=\"_blank\" "
"rel=\"noopener\">Click here for detailed information on what this does.</a> "
"Don't forget to set the correct fees above!"
msgstr ""
"如果你想要你的使用者付支付提供者的手續費,我們建議你啟用。<a href="
"\"{docs_url}\" target=\"_blank\" rel=\"noopener\">點這邊來取得所代表意義的詳"
"細資訊。</a>請不要忘記在上面設定正確的手續費!"
"如果你想要你的使用者付支付提供者的手續費,我們建議你啟用。<a "
"href=\"{docs_url}\" target=\"_blank\" rel=\"noopener\">點這邊來取得所代表意義"
"的詳細資訊。</a>請不要忘記在上面設定正確的手續費!"
#: pretix/base/payment.py:388
msgid "Text on invoices"
@@ -6418,12 +6424,16 @@ msgid "List of Add-Ons"
msgstr "附加組件清單"
#: pretix/base/pdf.py:364
#, fuzzy
#| msgid ""
#| "Add-on 1\n"
#| "Add-on 2"
msgid ""
"Add-on 1\n"
"2x Add-on 2"
msgstr ""
"附加1\n"
"2x附加2"
"附加2"
#: pretix/base/pdf.py:370 pretix/control/forms/filter.py:1275
#: pretix/control/forms/filter.py:1277
@@ -7667,6 +7677,8 @@ msgstr "禮品卡貨幣"
#: pretix/base/settings.py:277
#, fuzzy
#| msgid ""
#| "Automatically create a new gift card if a previously unknown chip is seen"
msgid "Automatically create a new gift card if a new chip is encoded"
msgstr "如果看到以前未知的晶片,則自動建立新的禮品卡"
@@ -7962,9 +7974,8 @@ msgid ""
msgstr ""
"這將附加到發票編號的前面。如果將此欄位留空,則將使用該活動 Slug值和破折號。注"
"意:如果同一組織內的多個活動在此欄位中使用相同的值,它們將共用其編號範圍,即"
"每個完整數位最多在您的所有活動中使用一次。此設置僅影響將來的帳單。可以使用 "
"%Y(帶世紀)%y(不帶世紀)插入發票的年份,或使用 %m 和 %d 插入月份中的某一"
"天。"
"每個完整數位最多在您的所有事件中使用一次。此設置僅影響將來的帳單。可以使用 %Y"
"(帶世紀)%y(不帶世紀)插入發票的年份,或使用 %m 和 %d 插入月份中的某一天。"
#: pretix/base/settings.py:682 pretix/base/settings.py:704
#, python-brace-format
@@ -8130,6 +8141,7 @@ msgstr ""
#: pretix/base/settings.py:942
#, fuzzy
#| msgid "Expiration date"
msgid "Expiration delay"
msgstr "過期日期"
@@ -9164,12 +9176,12 @@ msgstr "新訂單附件"
#, python-brace-format
msgid ""
"This file will be attached to the first email that we send for every new "
"order. Therefore it will be combined with the \"Placed order\", \"Free order"
"\", or \"Received order\" texts from above. It will be sent to both order "
"contacts and attendees. You can use this e.g. to send your terms of service. "
"Do not use it to send non-public information as this file might be sent "
"before payment is confirmed or the order is approved. To avoid this vital "
"email going to spam, you can only upload PDF files of up to {size} MB."
"order. Therefore it will be combined with the \"Placed order\", \"Free "
"order\", or \"Received order\" texts from above. It will be sent to both "
"order contacts and attendees. You can use this e.g. to send your terms of "
"service. Do not use it to send non-public information as this file might be "
"sent before payment is confirmed or the order is approved. To avoid this "
"vital email going to spam, you can only upload PDF files of up to {size} MB."
msgstr ""
"此檔將附加到我們為每個新訂單發送的第一封電子郵件中。因此,該檔案將與上面的"
"「已下訂單」、「免費訂單」或「已收到訂單」文本相結合。檔案將同時發送給訂單聯"
@@ -9398,12 +9410,25 @@ msgstr ""
"你的{event} 團隊"
#: pretix/base/settings.py:2349
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid "Payment received for your order: {code}"
msgid "Payment failed for your order: {code}"
msgstr "訂單付款失敗{code}"
msgstr "收到的訂單付款:{code}"
#: pretix/base/settings.py:2353
#, python-brace-format
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "we did not yet receive a full payment for your order for {event}.\n"
#| "Please keep in mind that we only guarantee your order if we receive\n"
#| "your payment before {expire_date}.\n"
#| "\n"
#| "You can view the payment information and the status of your order at\n"
#| "{url}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
msgid ""
"Hello,\n"
"\n"
@@ -9421,12 +9446,11 @@ msgid ""
msgstr ""
"你好\n"
"\n"
"你在 {event} 訂單付款未能成功。\n"
"我們尚未收到你的 {event} 訂單的全額付款。\n"
"請記住,我們僅在收到時保證你的訂單\n"
"你在 {expire_date} 之前的付款。\n"
"\n"
"您的訂單仍然有效,您可以嘗試使用相同或不同的付款方式再次進行支付,唯請在 "
"{expire_date} 前完成付款程序。\n"
"\n"
"您可以重新嘗試付款,並在以下網址檢視您的訂單狀態:\n"
"你可以在以下位置查看付款資訊與訂單狀態:\n"
"{url}\n"
"\n"
"敬此\n"
@@ -9762,7 +9786,7 @@ msgstr ""
#: pretix/base/settings.py:2586
#, python-brace-format
msgid "Confirm email address for your account at {organizer}"
msgstr "在{organizer}確認你帳戶的電子郵件位址"
msgstr "在{organizer}}確認你帳戶的電子郵件位址"
#: pretix/base/settings.py:2590
#, python-brace-format
@@ -10552,7 +10576,7 @@ msgstr "如果這需要超過幾分鐘的時間,請刷新此頁面或與我們
#: pretix/base/templates/pretixbase/email/email_footer.html:3
#, python-format
msgid "powered by <a %(a_attr)s>pretix</a>"
msgstr "由 <%(a_attr)s>pretix 提供支援</a>"
msgstr "由%(a_attr)spretix 提供支援</a>"
#: pretix/base/templates/pretixbase/email/export_failed.txt:2
msgid "Your export failed."
@@ -13544,7 +13568,7 @@ msgstr "已為位置 #{posid} 生成一個新密鑰。"
#, python-brace-format
msgid ""
"The validity start date for position #{posid} has been changed to {value}."
msgstr "位置 #{posid} 的有效開始日期已更改為{value}"
msgstr "位置 #{posid} 的有效開始日期已更改為{value}"
#: pretix/control/logdisplay.py:171
#, python-brace-format
@@ -13822,8 +13846,10 @@ msgid "The medium has been connected to a new ticket."
msgstr "媒體已連接到新票證。"
#: pretix/control/logdisplay.py:371
#, fuzzy
#| msgid "The medium has been connected to a new ticket."
msgid "The medium has been connected to a new gift card."
msgstr "媒體已連接到新的禮品卡。"
msgstr "媒體已連接到新票證。"
#: pretix/control/logdisplay.py:372 pretix/control/logdisplay.py:413
msgid "Sending of an email has failed."
@@ -14059,8 +14085,11 @@ msgid ""
msgstr "包含訂單詳細資訊頁面連結的電子郵件已重新發送給使用者。"
#: pretix/control/logdisplay.py:436
#, fuzzy
#| msgid ""
#| "An email has been sent to notify the user that payment has been received."
msgid "An email has been sent to notify the user that the payment failed."
msgstr "已發送一封電子郵件通知使用者未能成功付款。"
msgstr "已發送一封電子郵件通知使用者已收到付款。"
#: pretix/control/logdisplay.py:437
#, python-brace-format
@@ -16759,8 +16788,10 @@ msgid "Payment reminder"
msgstr "付款提醒"
#: pretix/control/templates/pretixcontrol/event/mail.html:108
#, fuzzy
#| msgid "Payment fee"
msgid "Payment failed"
msgstr "支付失敗"
msgstr "支付費用"
#: pretix/control/templates/pretixcontrol/event/mail.html:111
msgid "Waiting list notification"
@@ -16814,6 +16845,8 @@ msgid "Deadlines"
msgstr "期限"
#: pretix/control/templates/pretixcontrol/event/payment.html:68
#, fuzzy
#| msgid "days"
msgctxt "unit"
msgid "days"
msgstr "日"
@@ -17011,9 +17044,9 @@ msgid ""
"the payment methods that fit your workflow best. Here are just two of them "
"as examples, you can add more in the \"Settings\" part of your event."
msgstr ""
"Pretix 支援<a href=\"https://pretix.eu/about/en/features/payment\" target="
"\"_blank\">>廣泛的支付提供者</a>,允許你選擇最適合你工作流程的支付方式。這裡"
"只是其中兩個作為範例,你可以在活動的“設定”部分添加更多內容。"
"Pretix 支援<a href=\"https://pretix.eu/about/en/features/payment\" "
"target=\"_blank\">>廣泛的支付提供者</a>,允許你選擇最適合你工作流程的支付方"
"式。這裡只是其中兩個作為範例,你可以在活動的“設定”部分添加更多內容。"
#: pretix/control/templates/pretixcontrol/event/quick_setup.html:173
msgid ""
@@ -17249,10 +17282,10 @@ msgstr "稅務規則%(name)s"
#: pretix/control/templates/pretixcontrol/event/tax_edit.html:34
#, python-format
msgid ""
"These settings are intended for advanced users. See the <a href=\"%(docs)s"
"\">documentation</a> for more information. Note that we are not responsible "
"for the correct handling of taxes in your ticket shop. If in doubt, please "
"contact a lawyer or tax consultant."
"These settings are intended for advanced users. See the <a "
"href=\"%(docs)s\">documentation</a> for more information. Note that we are "
"not responsible for the correct handling of taxes in your ticket shop. If in "
"doubt, please contact a lawyer or tax consultant."
msgstr ""
"這些設定適用於進階使用者。有關詳細資訊,請參閱 <a href=\"%(docs)s\">文檔</"
"a>。請注意,我們不負責在你的售票處正確處理稅款。如有疑問,請聯繫律師或稅務顧"
@@ -17534,7 +17567,7 @@ msgid ""
"The list below shows all events you have administrative access to. Click on "
"the event name to access event details."
msgstr ""
"下面的清單顯示你具有管理訪問許可權的所有活動。按兩下活動名稱,以訪問活動詳細"
"下面的清單顯示你具有管理訪問許可權的所有事件。按兩下事件名稱,以訪問事件詳細"
"資訊。"
#: pretix/control/templates/pretixcontrol/events/index.html:12
@@ -17876,9 +17909,9 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/item/create.html:132
msgid ""
"Examples: Ticket category with variations for \"full price\" and \"reduced"
"\", merchandise with variations for different sizes, workshop add-on with "
"variations for simultaneous workshops."
"Examples: Ticket category with variations for \"full price\" and "
"\"reduced\", merchandise with variations for different sizes, workshop add-"
"on with variations for simultaneous workshops."
msgstr ""
"範例:包含「全價」和「折扣價」類型的門票類別、具有不同尺寸類型的商品、包含同"
"時研討會類型的維修中心附加元件。"
@@ -18165,8 +18198,8 @@ msgstr "自動折扣"
msgid ""
"With automatic discounts, you can automatically apply a discount to "
"purchases from your customers based on certain conditions. For example, you "
"can create group discounts like \"get 20%% off if you buy 3 or more tickets"
"\" or \"buy 2 tickets, get 1 free\"."
"can create group discounts like \"get 20%% off if you buy 3 or more "
"tickets\" or \"buy 2 tickets, get 1 free\"."
msgstr ""
"使用自動折扣,你可以根據特定條件自動將折扣應用於客戶的購買。例如,你可以創建"
"團體折扣,例如“如果你購買 3 張或更多門票,可享受 20%%的折扣”或“買 2 張門票,"
@@ -18177,8 +18210,8 @@ msgid ""
"Automatic discounts are available to all customers as long as they are "
"active. If you want to offer special prices only to specific customers, you "
"can use vouchers instead. If you want to offer discounts across multiple "
"purchases (\"buy a package of 10 you can turn into individual tickets later"
"\"), you can use customer accounts and memberships instead."
"purchases (\"buy a package of 10 you can turn into individual tickets "
"later\"), you can use customer accounts and memberships instead."
msgstr ""
"只要所有客戶處於活動狀態,就可以享受自動折扣。如果你只想向特定客戶提供特價,"
"則可以改用優惠券。如果你想為多次購買提供折扣(“購買 10 張套餐,以後可以變成個"
@@ -19540,8 +19573,8 @@ msgstr "標記為完成"
msgid ""
"We received notice that <strong>%(amount)s</strong> have been refunded via "
"<strong>%(method)s</strong>. If this refund is processed, the order will be "
"underpaid by <strong>%(pending)s</strong>. The order total is <strong>"
"%(total)s</strong>."
"underpaid by <strong>%(pending)s</strong>. The order total is "
"<strong>%(total)s</strong>."
msgstr ""
"我們收到通知,(<strong>%(amount)s)已</strong>透過<strong>%(method)s</strong>"
"退款。如果處理此退款,訂單將少付<strong>%(pending)s。</strong>訂單總數為 "
@@ -20455,7 +20488,7 @@ msgstr "召集人頁面"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:68
msgid "The links you configure here will also be shown on all of your events."
msgstr "你在此處設定的連結也將顯示在你的所有活動中。"
msgstr "你在此處設定的連結也將顯示在你的所有事件中。"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:142
msgid ""
@@ -21948,11 +21981,11 @@ msgstr "兩步驟狀態"
#: pretix/control/templates/pretixcontrol/user/2fa_main.html:44
msgid "Two-factor authentication is currently enabled."
msgstr "兩步驟驗證目前啟用"
msgstr "兩步驟驗證目前啟用"
#: pretix/control/templates/pretixcontrol/user/2fa_main.html:60
msgid "Two-factor authentication is currently disabled."
msgstr "兩步驟驗證目前停用"
msgstr "兩步驟驗證目前停用"
#: pretix/control/templates/pretixcontrol/user/2fa_main.html:63
msgid "To enable it, you need to configure at least one device below."
@@ -22252,7 +22285,7 @@ msgstr "刪除優惠券"
#, python-format
msgid ""
"Are you sure you want to delete the voucher <strong>%(voucher)s</strong>?"
msgstr "是否確實要刪除憑證 <strong>%(voucher)s</strong>"
msgstr "是否確實要刪除憑證 <strong>%(voucher)s</strong>"
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:4
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:6
@@ -22277,8 +22310,8 @@ msgstr "刪除購物車"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:9
#, python-format
msgid ""
"Are you sure you want to delete any cart positions with voucher <strong>"
"%(voucher)s</strong>?"
"Are you sure you want to delete any cart positions with voucher "
"<strong>%(voucher)s</strong>?"
msgstr "是否確實要刪除憑證 <strong>%(voucher)s的任何</strong>購物車位置?"
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:10
@@ -22399,8 +22432,8 @@ msgstr "刪除條目"
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html:9
#, python-format
msgid ""
"Are you sure you want to delete the following waiting list entry <strong>"
"%(entry)s</strong>?"
"Are you sure you want to delete the following waiting list entry "
"<strong>%(entry)s</strong>?"
msgstr "是否確實要刪除以下候補名單條目 <strong>%(entry)s</strong>"
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html:4
@@ -22472,8 +22505,8 @@ msgstr "銷售估計"
#, python-format
msgid ""
"If you can make enough room at your event to fit all the persons on the "
"waiting list in, you could sell tickets worth an additional <strong>"
"%(amount)s</strong>."
"waiting list in, you could sell tickets worth an additional "
"<strong>%(amount)s</strong>."
msgstr ""
"如果你能在活動中騰出足夠的空間來容納等候名單上的所有人,你可以出售價值額外"
"<strong>%(amount)s</strong>的票."
@@ -22496,14 +22529,20 @@ msgstr "此條目的優先順序已修改。此數字越高,此人將越早獲
msgid ""
"For safety reasons, the waiting list does not run if the quota is set to "
"unlimited."
msgstr "出於安全考慮,如果額度設定為無限制,將不設等候名單。"
msgstr ""
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:219
#, fuzzy
#| msgid "Quota name"
msgid "Quota unlimited"
msgstr "無限額度"
msgstr "額度名稱"
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:225
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "\n"
#| " Waiting, product %(num)sx available\n"
#| " "
msgid ""
"\n"
" Waiting, product %(num)sx "
@@ -22511,8 +22550,8 @@ msgid ""
" "
msgstr ""
"\n"
" 等待中,產品 %(num)s可用\n"
" "
" 等待中,產品 %(num)s可用\n"
" "
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:231
msgid "Waiting, product unavailable"
@@ -23228,6 +23267,12 @@ msgstr "所選產品已停用。"
#: pretix/control/views/mailsetup.py:195
#, fuzzy
#| msgid ""
#| "We could not find an SPF record set for the domain you are trying to use. "
#| "You can still proceed, but it will increase the chance of emails going to "
#| "spam or being rejected. We strongly recommend setting an SPF record on "
#| "the domain. You can do so through the DNS settings at the provider you "
#| "registered your domain with."
msgid ""
"We could not find an SPF record set for the domain you are trying to use. "
"This means that there is a very high change most of the emails will be "
@@ -23332,7 +23377,9 @@ msgstr "我們無法將上傳的檔解析為 CSV 檔。"
#: pretix/control/views/orders.py:330
msgid "Your invoice"
msgid_plural "Your invoices"
msgstr[0] "你的發票"
msgstr[0] ""
"你的發票,\n"
"你的發票"
#: pretix/control/views/orders.py:332
#, python-brace-format
@@ -23631,7 +23678,7 @@ msgstr "訂單已更改,使用者已收到通知。"
#: pretix/control/views/orders.py:1828 pretix/control/views/orders.py:1962
#: pretix/control/views/orders.py:1999 pretix/presale/views/order.py:1538
msgid "The order has been changed."
msgstr "訂單順序已更改"
msgstr "訂單順序已更改"
#: pretix/control/views/orders.py:1855 pretix/presale/checkoutflow.py:881
#: pretix/presale/views/order.py:799
@@ -23913,7 +23960,7 @@ msgstr "禮品卡已建立,現在可以使用了。"
#: pretix/control/views/organizer.py:1659
msgid "All events (that I have access to)"
msgstr "所有活動(我有權存取)"
msgstr "所有事件(我有權存取)"
#: pretix/control/views/organizer.py:2024
msgid "The selected gate has been deleted."
@@ -25052,7 +25099,7 @@ msgid_plural ""
"You are trying to download a refund export from %(date)s with %(cnt)s order "
"and a total of %(sum)s."
msgstr[0] ""
"你正在嘗試從%(date)s 下載退款匯出,其中包含%(cnt)s的訂單和總計%(sum)s"
"你正在嘗試從%(date)s 下載退款匯出,其中包含%(cnt)s的訂單和總計%(sum)s"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/sepa_export.html:23
msgid ""
@@ -25227,7 +25274,7 @@ msgstr "值機清單 PDF"
#: pretix/plugins/checkinlists/exporters.py:648
msgctxt "export_category"
msgid "Check-in"
msgstr "簽到"
msgstr "Check-in"
#: pretix/plugins/checkinlists/exporters.py:286
msgid ""
@@ -25684,7 +25731,7 @@ msgstr "完成抓取。"
#: pretix/plugins/paypal2/signals.py:67
msgctxt "paypal"
msgid "Capture pending."
msgstr "抓取處理中"
msgstr "抓取處理中"
#: pretix/plugins/paypal2/signals.py:76
msgid "PayPal reported an event: {}"
@@ -26060,6 +26107,9 @@ msgid "Restrict to event dates starting before"
msgstr "限制為早於之前開始的活動日期"
#: pretix/plugins/sendmail/forms.py:170
#, fuzzy
#| msgctxt "sendmail_from"
#| msgid "Send to"
msgctxt "sendmail_form"
msgid "Send to"
msgstr "傳送到"
@@ -26074,6 +26124,9 @@ msgid "Filter check-in status"
msgstr "篩選簽到狀態"
#: pretix/plugins/sendmail/forms.py:189
#, fuzzy
#| msgctxt "sendmail_from"
#| msgid "Restrict to recipients without check-in"
msgctxt "sendmail_form"
msgid "Restrict to recipients without check-in"
msgstr "僅限未簽到的收件者"
@@ -26123,11 +26176,17 @@ msgid "pending with payment overdue"
msgstr "待處理,付款逾期"
#: pretix/plugins/sendmail/forms.py:258
#, fuzzy
#| msgctxt "sendmail_from"
#| msgid "Restrict to orders with status"
msgctxt "sendmail_form"
msgid "Restrict to orders with status"
msgstr "限具有狀態的訂單"
msgstr "限制為具有狀態的訂單"
#: pretix/plugins/sendmail/forms.py:283 pretix/plugins/sendmail/forms.py:287
#, fuzzy
#| msgctxt "sendmail_from"
#| msgid "Restrict to recipients with check-in on list"
msgctxt "sendmail_form"
msgid "Restrict to recipients with check-in on list"
msgstr "僅限在清單中簽到的收件者"
@@ -26198,8 +26257,11 @@ msgid "Limit products"
msgstr "限制商品"
#: pretix/plugins/sendmail/models.py:218
#, fuzzy
#| msgctxt "sendmail_from"
#| msgid "Restrict to orders with status"
msgid "Restrict to orders with status"
msgstr "限具有狀態的訂單"
msgstr "限制為具有狀態的訂單"
#: pretix/plugins/sendmail/models.py:228
msgid "Send date"
@@ -26251,7 +26313,7 @@ msgstr[0] ""
"%(count)d 事件在%(time)s開始的前一天 , 事件在%(time)s開始前的%(count)d天"
#: pretix/plugins/sendmail/signals.py:99
msgid "Scheduled emails"
msgid "Automated emails"
msgstr "自動電子郵件"
#: pretix/plugins/sendmail/signals.py:122
@@ -26329,7 +26391,7 @@ msgstr "建立電子郵件規則"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:14
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:15
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgid "Automated emails are not sent as long as your ticket shop is offline."
msgstr "只要你的售票店處於離線狀態,就不會發送自動電子郵件。"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
@@ -26378,7 +26440,7 @@ msgstr "最後排程計算"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
msgid "Scheduled email rules"
msgid "Automated email rules"
msgstr "自動電子郵件規則"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
@@ -26648,10 +26710,10 @@ msgstr "從Stripe斷線"
#: pretix/plugins/stripe/payment.py:200
msgid ""
"Please configure a <a href=\"https://dashboard.stripe.com/account/webhooks"
"\">Stripe Webhook</a> to the following endpoint in order to automatically "
"cancel orders when charges are refunded externally and to process "
"asynchronous payment methods like SOFORT."
"Please configure a <a href=\"https://dashboard.stripe.com/account/"
"webhooks\">Stripe Webhook</a> to the following endpoint in order to "
"automatically cancel orders when charges are refunded externally and to "
"process asynchronous payment methods like SOFORT."
msgstr ""
"請將<a href=\"https://dashboard.stripe.com/account/webhooks\">Stripe Webhook "
"配置到</a>以下節點,以便在外部退款時,自動取消訂單,並處理非同步支付方式,如 "
@@ -26778,19 +26840,27 @@ msgid "Bancontact"
msgstr "Bancontact"
#: pretix/plugins/stripe/payment.py:357
#, fuzzy
#| msgid "Disable SEPA Direct Debit"
msgid "SEPA Direct Debit"
msgstr "SEPA 直接轉帳"
msgstr "禁用 SEPA 直接扣款"
#: pretix/plugins/stripe/payment.py:362
#, fuzzy
#| msgid ""
#| "Despite the name, Sofort payments via Stripe are <strong>not</strong> "
#| "processed instantly but might take up to <strong>14 days</strong> to be "
#| "confirmed in some cases. Please only activate this payment method if your "
#| "payment term allows for this lag."
msgid ""
"SEPA Direct Debit payments via Stripe are <strong>not</strong> processed "
"instantly but might take up to <strong>14 days</strong> to be confirmed in "
"some cases. Please only activate this payment method if your payment term "
"allows for this lag."
msgstr ""
"通過 Stripe 進行的 SEPA 直接轉帳<strong>不會</strong>立即處理,但在某些情況下"
"可能需要長達 <strong>14 天</strong>才能確認。請只有在您的付款期限允許此延遲的"
"情況下,才啟用此付款方式。"
"儘管有這個名字,但通過 Stripe 進行的 Sofort 付款<strong>不會</strong>立即處"
"理,但在某些情況下可能需要長達 <strong>14 天</strong>才能確認。請僅在你的付款"
"期限,允許此延遲時啟動此付款方式。"
#: pretix/plugins/stripe/payment.py:370
msgid "SEPA Creditor Mandate Name"
@@ -26905,33 +26975,44 @@ msgid "Credit card"
msgstr "信用卡"
#: pretix/plugins/stripe/payment.py:1157
#, fuzzy
#| msgid "EPS via Stripe"
msgid "SEPA Debit via Stripe"
msgstr "透過Stripe進行SEPA直接扣款"
msgstr "EPS透過Stripe"
#: pretix/plugins/stripe/payment.py:1158
msgid "SEPA Debit"
msgstr "SEPA扣款"
msgstr ""
#: pretix/plugins/stripe/payment.py:1197
#, fuzzy
#| msgid "Account holder"
msgid "Account Holder Name"
msgstr "帳戶持有人名稱"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/payment.py:1202
#, fuzzy
#| msgid "Account holder"
msgid "Account Holder Street"
msgstr "帳戶持有人街道"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/payment.py:1214
#, fuzzy
#| msgid "Account holder"
msgid "Account Holder Postal Code"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/payment.py:1226
#, fuzzy
#| msgid "Account holder"
msgid "Account Holder City"
msgstr "帳戶持有人城市"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/payment.py:1238
#, fuzzy
#| msgid "Account holder"
msgid "Account Holder Country"
msgstr "帳戶持有人國家"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/payment.py:1282
msgid "giropay via Stripe"
@@ -27102,8 +27183,10 @@ msgid "Card type"
msgstr "卡片類型"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:14
#, fuzzy
#| msgid "The total amount will be withdrawn from your credit card."
msgid "The total amount will be withdrawn from your bank account."
msgstr "總金額將從你的銀行戶口中提取。"
msgstr "總金額將從你的信用卡中提取。"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:18
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:20
@@ -27112,8 +27195,10 @@ msgstr ""
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:20
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:22
#, fuzzy
#| msgid "Account holder"
msgid "Account number"
msgstr "帳戶號碼"
msgstr "帳戶持有人"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:24
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html:4
@@ -27156,18 +27241,25 @@ msgstr ""
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:10
#, fuzzy
#| msgid "For a credit card payment, please turn on JavaScript."
msgid "For a SEPA Debit payment, please turn on JavaScript."
msgstr "對於信用卡付款,請打開JavaScript。"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:16
#, fuzzy
#| msgid ""
#| "You already entered a card number that we will use to charge the payment "
#| "amount."
msgid ""
"You already entered a bank account that we will use to charge the payment "
"amount."
msgstr "已經輸入了一個我們將用來扣除支付金額的銀行帳戶。"
msgstr "已經輸入了一個卡號,我們將使用該卡號來收取付款金額。"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:27
#, fuzzy
#| msgid "Use a different card"
msgid "Use a different account"
msgstr "使用不同帳戶"
msgstr "使用不同卡片"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_sepadirectdebit.html:51
#, python-format
@@ -27447,7 +27539,7 @@ msgstr "網上check-in"
#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:10
msgid "Check-in"
msgstr "簽到"
msgstr "Check-in"
#: pretix/presale/checkoutflow.py:107
msgctxt "checkoutflow"
@@ -27745,7 +27837,7 @@ msgstr "網站以%(language)s"
#: pretix/presale/templates/pretixpresale/event/base.html:59
#, python-format
msgid "Show all events of %(name)s"
msgstr "顯示%(name)s的所有活動"
msgstr "顯示%(name)s的所有事件"
#: pretix/presale/templates/pretixpresale/event/base.html:73
#: pretix/presale/templates/pretixpresale/event/base.html:78
@@ -29001,7 +29093,7 @@ msgstr "重新傳送訂單連結"
#: pretix/presale/templates/pretixpresale/event/order.html:12
#: pretix/presale/templates/pretixpresale/event/order.html:29
msgid "Thank you!"
msgstr "感謝你"
msgstr "感謝你"
#: pretix/presale/templates/pretixpresale/event/order.html:14
#: pretix/presale/templates/pretixpresale/event/order.html:32
@@ -29218,8 +29310,9 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/order.html:412
#, python-format
msgid ""
"You can cancel this order. In this case, a cancellation fee of <strong>"
"%(fee)s</strong> will be kept and you will receive a refund of the remainder."
"You can cancel this order. In this case, a cancellation fee of "
"<strong>%(fee)s</strong> will be kept and you will receive a refund of the "
"remainder."
msgstr ""
"你可以取消此訂單。在這種情況下,將保留 <strong>%(fee)s</strong> 的取消費用,"
"你將收到剩餘部分的退款。"
@@ -29241,8 +29334,8 @@ msgid ""
"You can cancel this order. As per our cancellation policy, you will still be "
"required to pay a cancellation fee of <strong>%(fee)s</strong>."
msgstr ""
"你可以取消此訂單。根據我們的取消政策,你仍然需要支付以下取消費用: <strong>"
"%(fee)s</strong>."
"你可以取消此訂單。根據我們的取消政策,你仍然需要支付以下取消費用: "
"<strong>%(fee)s</strong>."
#: pretix/presale/templates/pretixpresale/event/order.html:463
msgid "You can cancel this order using the following button."
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-21 11:46+0000\n"
"PO-Revision-Date: 2023-08-31 07:00+0000\n"
"Last-Translator: Ash So <ashs@vankaifong.com>\n"
"PO-Revision-Date: 2023-06-26 23:00+0000\n"
"Last-Translator: Yucheng Lin <yuchenglinedu@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/zh_Hant/>\n"
"Language: zh_Hant\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.18.2\n"
"X-Generator: Weblate 4.17\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -662,8 +662,10 @@ msgid "Your local time:"
msgstr "你的當地時間:"
#: pretix/static/pretixpresale/js/walletdetection.js:39
#, fuzzy
#| msgid "Apple Pay"
msgid "Google Pay"
msgstr "Google Pay"
msgstr "Apple Pay"
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
+1 -19
View File
@@ -607,12 +607,6 @@ class PaypalMethod(BasePaymentProvider):
response = self.client.execute(req)
except IOError as e:
logger.exception('PayPal OrdersGetRequest: {}'.format(str(e)))
payment.fail(info={
"error": {
"name": "IOError",
"message": str(e),
}
})
raise PaymentException(_('We had trouble communicating with PayPal'))
else:
pp_captured_order = response.result
@@ -621,15 +615,9 @@ class PaypalMethod(BasePaymentProvider):
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment, reference=pp_captured_order.id)
except ReferencedPayPalObject.MultipleObjectsReturned:
pass
if Decimal(pp_captured_order.purchase_units[0].amount.value) != payment.amount or \
if str(pp_captured_order.purchase_units[0].amount.value) != str(payment.amount) or \
pp_captured_order.purchase_units[0].amount.currency_code != self.event.currency:
logger.error('Value mismatch: Payment %s vs paypal trans %s' % (payment.id, str(pp_captured_order.dict())))
payment.fail(info={
"error": {
"name": "ValidationError",
"message": "Value mismatch",
}
})
raise PaymentException(_('We were unable to process your payment. See below for details on how to '
'proceed.'))
@@ -672,12 +660,6 @@ class PaypalMethod(BasePaymentProvider):
self.client.execute(patchreq)
except IOError as e:
messages.error(request, _('We had trouble communicating with PayPal'))
payment.fail(info={
"error": {
"name": "IOError",
"message": str(e),
}
})
logger.exception('PayPal OrdersPatchRequest: {}'.format(str(e)))
return
+1 -5
View File
@@ -34,7 +34,7 @@ class RuleSerializer(I18nAwareModelSerializer):
class Meta:
model = Rule
fields = ['id', 'subject', 'template', 'all_products', 'limit_products', 'restrict_to_status',
'checked_in_status', 'send_date', 'send_offset_days', 'send_offset_time', 'date_is_absolute',
'send_date', 'send_offset_days', 'send_offset_time', 'date_is_absolute',
'offset_to_event_end', 'offset_is_after', 'send_to', 'enabled']
read_only_fields = ['id']
@@ -88,10 +88,6 @@ class RuleSerializer(I18nAwareModelSerializer):
]:
raise ValidationError(f'status {s} not allowed: restrict_to_status may only include valid states')
if full_data.get('checked_in_status') == "":
# even though "blank" is not allowed on this field, "" gets accepted without this check
raise ValidationError('empty string not allowed: use null to disable check-in based filtering')
return full_data
def save(self, **kwargs):
+1 -2
View File
@@ -312,7 +312,7 @@ class RuleForm(FormPlaceholderMixin, I18nModelForm):
fields = ['subject', 'template', 'attach_ical',
'send_date', 'send_offset_days', 'send_offset_time',
'all_products', 'limit_products', 'restrict_to_status',
'checked_in_status', 'send_to', 'enabled']
'send_to', 'enabled']
field_classes = {
'subevent': SafeModelMultipleChoiceField,
@@ -337,7 +337,6 @@ class RuleForm(FormPlaceholderMixin, I18nModelForm):
'data-inverse-dependency': '#id_all_products'},
),
'send_to': forms.RadioSelect,
'checked_in_status': forms.RadioSelect,
}
def __init__(self, *args, **kwargs):
@@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-08-09 11:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sendmail', '0004_rule_restrict_to_status'),
]
operations = [
migrations.AddField(
model_name='rule',
name='checked_in_status',
field=models.CharField(max_length=10, null=True),
),
]
+8 -37
View File
@@ -34,8 +34,7 @@ from i18nfield.fields import I18nCharField, I18nTextField
from pretix.base.email import get_email_context
from pretix.base.i18n import language
from pretix.base.models import (
Checkin, Event, InvoiceAddress, Item, Order, OrderPosition, SubEvent,
fields,
Event, InvoiceAddress, Item, Order, OrderPosition, SubEvent, fields,
)
from pretix.base.models.base import LoggingMixin
from pretix.base.services.mail import SendMailException
@@ -113,30 +112,19 @@ class ScheduledMail(models.Model):
e = self.event
orders = e.orders.all()
filter_orders_by_op = False
op_qs = OrderPosition.objects.filter(
order__event=self.event,
canceled=False,
)
limit_products = self.rule.limit_products.values_list('pk', flat=True) if not self.rule.all_products else None
if self.subevent:
filter_orders_by_op = True
op_qs = op_qs.filter(subevent=self.subevent)
orders = orders.filter(
Exists(OrderPosition.objects.filter(order=OuterRef('pk'), subevent=self.subevent))
)
elif e.has_subevents:
return # This rule should not even exist
if not self.rule.all_products:
filter_orders_by_op = True
limit_products = self.rule.limit_products.values_list('pk', flat=True)
op_qs = op_qs.filter(item_id__in=limit_products)
if self.rule.checked_in_status == "no_checkin":
filter_orders_by_op = True
op_qs = op_qs.filter(~Exists(Checkin.objects.filter(position_id=OuterRef('pk'))))
elif self.rule.checked_in_status == "checked_in":
filter_orders_by_op = True
op_qs = op_qs.filter(Exists(Checkin.objects.filter(position_id=OuterRef('pk'))))
orders = orders.filter(
Exists(OrderPosition.objects.filter(order=OuterRef('pk'), item_id__in=limit_products))
)
status_q = Q(status__in=self.rule.restrict_to_status)
if 'n__pending_approval' in self.rule.restrict_to_status:
@@ -154,8 +142,6 @@ class ScheduledMail(models.Model):
pk__gt=self.last_successful_order_id
)
if filter_orders_by_op:
orders = orders.filter(pk__in=op_qs.values_list('order_id', flat=True))
orders = orders.filter(
status_q,
).order_by('pk').select_related('invoice_address').prefetch_related('positions')
@@ -219,12 +205,6 @@ class Rule(models.Model, LoggingMixin):
(BOTH, _('Both (all order contact addresses and all attendee email addresses)'))
]
CHECK_IN_STATUS_CHOICES = [
(None, _("Everyone")),
("checked_in", _("Anyone who is or was checked in")),
("no_checkin", _("Anyone who never checked in before"))
]
id = models.BigAutoField(primary_key=True)
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='sendmail_rules')
@@ -239,15 +219,6 @@ class Rule(models.Model, LoggingMixin):
default=['p', 'n__valid_if_pending'],
)
checked_in_status = models.CharField(
verbose_name=_("Restrict to check-in status"),
default=None,
choices=CHECK_IN_STATUS_CHOICES,
max_length=10,
null=True,
blank=True,
)
attach_ical = models.BooleanField(
default=False,
verbose_name=_("Attach calendar files"),
+1 -1
View File
@@ -96,7 +96,7 @@ def control_nav_import(sender, request=None, **kwargs):
'active': (url.namespace == 'plugins:sendmail' and url.url_name.startswith('send')),
},
{
'label': _('Scheduled emails'),
'label': _('Automated emails'),
'url': reverse('plugins:sendmail:rule.list', kwargs={
'event': request.event.slug,
'organizer': request.event.organizer.slug,
@@ -6,7 +6,7 @@
<h1>{% trans "Create Email Rule" %}</h1>
{% if not request.event.live %}
<div class="alert alert-warning">
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
{% trans "Automated emails are not sent as long as your ticket shop is offline." %}
</div>
{% endif %}
{% block inner %}
@@ -28,8 +28,6 @@
<legend>{% trans "Recipients" %}</legend>
{% bootstrap_field form.send_to layout='control' %}
{% bootstrap_field form.restrict_to_status layout='control' %}
{% bootstrap_field form.checked_in_status layout='control' %}
<hr>
{% bootstrap_field form.all_products layout='control' %}
{% bootstrap_field form.limit_products layout='horizontal' %}
</fieldset>
@@ -11,7 +11,7 @@
</p>
{% if not request.event.live %}
<div class="alert alert-warning">
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
{% trans "Automated emails are not sent as long as your ticket shop is offline." %}
</div>
{% endif %}
<dl class="dl-horizontal">
@@ -1,9 +1,9 @@
{% extends "pretixcontrol/event/base.html" %}
{% load i18n %}
{% load static %}
{% block title %}{% trans "Scheduled email rules" %}{% endblock %}
{% block title %}{% trans "Automated email rules" %}{% endblock %}
{% block content %}
<h1>{% trans "Scheduled email rules" %}</h1>
<h1>{% trans "Automated email rules" %}</h1>
<p>
{% blocktrans trimmed %}
Email rules allow you to automatically send emails to your customers at a specific time before or after
@@ -12,7 +12,7 @@
</p>
{% if not request.event.live %}
<div class="alert alert-warning">
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
{% trans "Automated emails are not sent as long as your ticket shop is offline." %}
</div>
{% endif %}
@@ -7,7 +7,7 @@
<h1>{% trans "Update Email Rule" %}</h1>
{% if not request.event.live %}
<div class="alert alert-warning">
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
{% trans "Automated emails are not sent as long as your ticket shop is offline." %}
</div>
{% endif %}
{% block inner %}
@@ -42,8 +42,6 @@
<legend>{% trans "Recipients" %}</legend>
{% bootstrap_field form.send_to layout='control' %}
{% bootstrap_field form.restrict_to_status layout='control' %}
{% bootstrap_field form.checked_in_status layout='control' %}
<hr>
{% bootstrap_field form.all_products layout='control' %}
{% bootstrap_field form.limit_products layout='horizontal' %}
</fieldset>
+3 -56
View File
@@ -39,13 +39,10 @@ from decimal import Decimal
from django.conf import settings
from django.contrib import messages
from django.core.cache import caches
from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.core.signing import BadSignature, loads
from django.core.validators import EmailValidator
from django.db import models
from django.db.models import Count, F, Q, Sum
from django.db.models.functions import Cast
from django.db.models import F, Q
from django.http import HttpResponseNotAllowed, JsonResponse
from django.shortcuts import redirect
from django.utils import translation
@@ -65,14 +62,12 @@ from pretix.base.services.cart import (
)
from pretix.base.services.memberships import validate_memberships_in_order
from pretix.base.services.orders import perform_order
from pretix.base.services.tasks import EventTask
from pretix.base.settings import PERSON_NAME_SCHEMES
from pretix.base.signals import validate_cart_addons
from pretix.base.templatetags.money import money_filter
from pretix.base.templatetags.phone_format import phone_format
from pretix.base.templatetags.rich_text import rich_text_snippet
from pretix.base.views.tasks import AsyncAction
from pretix.celery_app import app
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.forms.checkout import (
ContactForm, InvoiceAddressForm, InvoiceNameForm, MembershipForm,
@@ -807,9 +802,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
@cached_property
def invoice_form(self):
wd = self.cart_session.get('widget_data', {})
if self.invoice_address.pk:
wd_initial = {}
elif wd:
if not self.invoice_address.pk:
wd_initial = {
'name_parts': {
k[21:].replace('-', '_'): v
@@ -824,9 +817,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
'country': wd.get('invoice-address-country', ''),
}
else:
wd_initial = {
'is_business': self._get_is_business_heuristic(),
}
wd_initial = {}
initial = dict(wd_initial)
if self.cart_customer:
@@ -1035,25 +1026,6 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
ctx['cart_session'] = self.cart_session
ctx['invoice_address_asked'] = self.address_asked
def reduce_initial(v):
if isinstance(v, dict):
# try to flatten objects such as name_parts to a single string to determine whether they have any value set
return ''.join([v for k, v in v.items() if not k.startswith('_') and v])
else:
return v
def is_form_filled(form, ignore_keys=()):
return any([reduce_initial(v) for k, v in form.initial.items() if k not in ignore_keys])
ctx['invoice_address_open'] = (
self.request.event.settings.invoice_address_required or
self.request.event.settings.invoice_name_required or
'invoice' in self.request.GET or
# Checking for self.invoice_address.pk is not enough as when an invoice_address has been added and later edited to be empty, its not None.
# So check initial values as invoice_form can receive pre-filled values from invoice_address, widget-data or overwrites from plug-ins.
is_form_filled(self.invoice_form, ignore_keys=('is_business', 'country'))
)
if self.cart_customer:
if self.address_asked:
addresses = self.cart_customer.stored_addresses.all()
@@ -1142,31 +1114,6 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
ctx['profiles_data'] = profiles_list
return ctx
def _get_is_business_heuristic(self):
key = 'checkout_heuristic_is_business:' + str(self.event.pk)
cached_result = caches['default'].get(key)
if cached_result is None:
if caches['default'].add(key, False, timeout=10): # return False while query is running
QuestionsStep._update_is_business_heuristic.apply_async(args=(self.event.pk,))
return False
else:
return cached_result
@staticmethod
@app.task(base=EventTask)
def _update_is_business_heuristic(event):
result = InvoiceAddress.objects.filter(order__event=event).aggregate(
total=Count('*'), business=Sum(Cast('is_business', output_field=models.IntegerField())))
if result['total'] < 100:
result = InvoiceAddress.objects.filter(order__event__organizer=event.organizer).aggregate(
total=Count('*'), business=Sum(Cast('is_business', output_field=models.IntegerField())))
if result['business'] and result['total']:
is_business = result['business'] / result['total'] >= 0.6
else:
is_business = False
key = 'checkout_heuristic_is_business:' + str(event.pk)
caches['default'].set(key, is_business, timeout=12 * 3600) # 12 hours
class PaymentStep(CartMixin, TemplateFlowStep):
priority = 200
@@ -76,7 +76,7 @@
<div class="panel-heading">
<h3 class="panel-title">
{% trans "Invoice information" %}
<a href="{% eventurl request.event "presale:event.checkout" step="questions" cart_namespace=cart_namespace|default_if_none:"" %}?invoice=1#invoice-details" aria-label="{% trans "Modify invoice information" %}" class="h6">
<a href="{% eventurl request.event "presale:event.checkout" step="questions" cart_namespace=cart_namespace|default_if_none:"" %}?invoice=1" aria-label="{% trans "Modify invoice information" %}" class="h6">
<span class="fa fa-edit" aria-hidden="true"></span>{% trans "Modify" %}
</a>
</h3>
@@ -34,7 +34,7 @@
</div>
</details>
{% if invoice_address_asked %}
<details class="panel panel-default" {% if invoice_address_open %}open{% endif %} id="invoice-details">
<details class="panel panel-default" {% if event.settings.invoice_address_required or event.settings.invoice_name_required %}open{% endif %}>
<summary class="panel-heading">
<h3 class="panel-title">
<strong>{% trans "Invoice information" %}{% if not event.settings.invoice_address_required and not event.settings.invoice_name_required %}
+1 -6
View File
@@ -496,12 +496,7 @@ class OrderPaymentConfirm(EventViewMixin, OrderDetailMixin, TemplateView):
ctx['order'] = self.order
ctx['payment'] = self.payment
if 'order' in inspect.signature(self.payment.payment_provider.checkout_confirm_render).parameters:
if 'info_data' in inspect.signature(self.payment.payment_provider.checkout_confirm_render).parameters:
ctx['payment_info'] = self.payment.payment_provider.checkout_confirm_render(
self.request, order=self.order, info_data=self.payment.info_data
)
else:
ctx['payment_info'] = self.payment.payment_provider.checkout_confirm_render(self.request, order=self.order)
ctx['payment_info'] = self.payment.payment_provider.checkout_confirm_render(self.request, order=self.order)
else:
ctx['payment_info'] = self.payment.payment_provider.checkout_confirm_render(self.request)
ctx['payment_provider'] = self.payment.payment_provider
@@ -8,8 +8,8 @@
"description": "List of rules, executed in order until one matches",
"properties": {
"country": {
"description": "Country code to match. ZZ = any country, EU = any EU country. For selected countries, a state can be matched (e.g. US-NY for New York).",
"enum": ["ZZ", "EU", "AF", "EG", "AX", "AL", "DZ", "AS", "VI", "AD", "AO", "AI", "AQ", "AG", "GQ", "AR", "AM", "AW", "AZ", "ET", "AU", "AU-ACT", "AU-NSW", "AU-NT", "AU-QLD", "AU-SA", "AU-TAS", "AU-VIC", "AU-WA", "BS", "BH", "BD", "BB", "BE", "BZ", "BJ", "BM", "BT", "BO", "BQ", "BA", "BW", "BV", "BR", "BR-AC", "BR-AL", "BR-AP", "BR-AM", "BR-BA", "BR-CE", "BR-ES", "BR-GO", "BR-MA", "BR-MT", "BR-MS", "BR-MG", "BR-PR", "BR-PB", "BR-PA", "BR-PE", "BR-PI", "BR-RN", "BR-RS", "BR-RJ", "BR-RO", "BR-RR", "BR-SC", "BR-SE", "BR-SP", "BR-TO", "VG", "IO", "BN", "BG", "BF", "BI", "CL", "CN", "MP", "CK", "CR", "CI", "CW", "DK", "DE", "DM", "DO", "DJ", "EC", "SV", "ER", "EE", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "GH", "GI", "GD", "GR", "GL", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "HN", "HK", "IN", "ID", "IQ", "IR", "IE", "IS", "IM", "IL", "IT", "JM", "JP", "YE", "JE", "JO", "KY", "KH", "CM", "CA", "CA-AB", "CA-BC", "CA-MB", "CA-NB", "CA-NL", "CA-NT", "CA-NS", "CA-NU", "CA-ON", "CA-PE", "CA-QC", "CA-SK", "CA-YT", "CV", "KZ", "QA", "KE", "KG", "KI", "CC", "CO", "KM", "CG", "CD", "HR", "CU", "KW", "LA", "LS", "LV", "LB", "LR", "LY", "LI", "LT", "LU", "MO", "MG", "MW", "MY", "MY-01", "MY-02", "MY-03", "MY-04", "MY-05", "MY-06", "MY-08", "MY-09", "MY-07", "MY-12", "MY-13", "MY-10", "MY-11", "MV", "ML", "MT", "MA", "MH", "MQ", "MR", "MU", "YT", "MK", "MX", "MX-AGU", "MX-BCN", "MX-BCS", "MX-CAM", "MX-CHP", "MX-CHH", "MX-CMX", "MX-COA", "MX-COL", "MX-DUR", "MX-GUA", "MX-GRO", "MX-HID", "MX-JAL", "MX-MIC", "MX-MOR", "MX-MEX", "MX-NAY", "MX-NLE", "MX-OAX", "MX-PUE", "MX-QUE", "MX-ROO", "MX-SLP", "MX-SIN", "MX-SON", "MX-TAB", "MX-TAM", "MX-TLA", "MX-VER", "MX-YUC", "MX-ZAC", "FM", "MD", "MC", "MN", "ME", "MS", "MZ", "MM", "NA", "NR", "NP", "NC", "NZ", "NI", "NL", "NE", "NG", "NU", "KP", "NF", "NO", "OM", "AT", "TL", "PK", "PS", "PW", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "RE", "RW", "RO", "RU", "BL", "PM", "SB", "ZM", "WS", "SM", "ST", "SA", "SE", "CH", "SN", "RS", "SC", "SL", "ZW", "SG", "SX", "SK", "SI", "SO", "ES", "SJ", "LK", "SH", "KN", "LC", "MF", "VC", "ZA", "SD", "GS", "KR", "SS", "SR", "SZ", "SY", "TJ", "TW", "TZ", "TH", "TG", "TK", "TO", "TT", "TD", "CZ", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "HU", "UY", "UM", "UZ", "VU", "VA", "VE", "AE", "US", "US-AL", "US-AK", "US-AS", "US-AZ", "US-AR", "US-CA", "US-CO", "US-CT", "US-DE", "US-DC", "US-FL", "US-GA", "US-GU", "US-HI", "US-ID", "US-IL", "US-IN", "US-IA", "US-KS", "US-KY", "US-LA", "US-ME", "US-MD", "US-MA", "US-MI", "US-MN", "US-MS", "US-MO", "US-MT", "US-NE", "US-NV", "US-NH", "US-NJ", "US-NM", "US-NY", "US-NC", "US-ND", "US-MP", "US-OH", "US-OK", "US-OR", "US-PA", "US-PR", "US-RI", "US-SC", "US-SD", "US-TN", "US-TX", "US-UM", "US-UT", "US-VT", "US-VI", "US-VA", "US-WA", "US-WV", "US-WI", "US-WY", "GB", "VN", "WF", "CX", "BY", "EH", "CF", "CY"]
"description": "Country code to match. ZZ = any country, EU = any EU country.",
"enum": ["AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "EU", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW", "ZZ"]
},
"address_type": {
"description": "Type of customer, emtpy = any.",
-44
View File
@@ -794,26 +794,6 @@ def test_reupload_same_nonce(token_client, organizer, clist, event, order):
resp = _redeem(token_client, organizer, clist, p.pk, {'nonce': 'foobar'})
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
with scopes_disabled():
assert p.all_checkins.count() == 1
@pytest.mark.django_db
def test_reupload_same_nonce_not_ignored_after_failed(token_client, organizer, clist, event, order):
with scopes_disabled():
p = order.positions.first()
p.all_checkins.create(
type=Checkin.TYPE_ENTRY,
nonce='foobar',
successful=False,
list=clist,
)
resp = _redeem(token_client, organizer, clist, p.pk, {'nonce': 'foobar'})
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
with scopes_disabled():
assert p.all_checkins.count() == 2
@pytest.mark.django_db
@@ -1125,7 +1105,6 @@ def test_store_failed(token_client, organizer, clist, event, order):
organizer.slug, event.slug, clist.pk,
), {
'raw_barcode': '123456',
'nonce': '4321',
'error_reason': 'invalid'
}, format='json')
assert resp.status_code == 201
@@ -1136,7 +1115,6 @@ def test_store_failed(token_client, organizer, clist, event, order):
organizer.slug, event.slug, clist.pk,
), {
'raw_barcode': '123456',
'nonce': '1234',
'position': p.pk,
'error_reason': 'unpaid'
}, format='json')
@@ -1144,28 +1122,6 @@ def test_store_failed(token_client, organizer, clist, event, order):
with scopes_disabled():
assert p.all_checkins.filter(successful=False).count() == 1
# Ignore sending the same nonces again
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/failed_checkins/'.format(
organizer.slug, event.slug, clist.pk,
), {
'raw_barcode': '123456',
'nonce': '4321',
'error_reason': 'invalid'
}, format='json')
assert resp.status_code == 201
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/failed_checkins/'.format(
organizer.slug, event.slug, clist.pk,
), {
'raw_barcode': '123456',
'nonce': '1234',
'position': p.pk,
'error_reason': 'unpaid'
}, format='json')
assert resp.status_code == 201
with scopes_disabled():
assert Checkin.all.filter(successful=False).count() == 2
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/failed_checkins/'.format(
organizer.slug, event.slug, clist.pk,
), {
+1 -1
View File
@@ -211,7 +211,7 @@ def _redeem(token_client, org, clist, p, body=None, query=''):
def test_query_load(token_client, organizer, clist, event, order, django_assert_max_num_queries):
with scopes_disabled():
p = order.positions.first()
with django_assert_max_num_queries(29):
with django_assert_max_num_queries(30):
resp = _redeem(token_client, organizer, clist, p.secret)
assert resp.status_code == 201
assert resp.data['status'] == 'ok'
-28
View File
@@ -104,34 +104,6 @@ def test_customer_create(token_client, organizer):
assert len(djmail.outbox) == 0
@pytest.mark.django_db
def test_customer_create_email_unique(token_client, organizer):
resp = token_client.post(
'/api/v1/organizers/{}/customers/'.format(organizer.slug),
format='json',
data={
'identifier': 'IGNORED',
'email': 'bar@example.com',
'password': 'foobar',
'is_active': True,
'is_verified': True,
}
)
assert resp.status_code == 201
resp = token_client.post(
'/api/v1/organizers/{}/customers/'.format(organizer.slug),
format='json',
data={
'identifier': 'IGNORED',
'email': 'bar@example.com',
'password': 'foobar',
'is_active': True,
'is_verified': True,
}
)
assert resp.status_code == 400
@pytest.mark.django_db
def test_customer_create_send_email(token_client, organizer):
resp = token_client.post(

Some files were not shown because too many files have changed in this diff Show More