forked from CGM_Public/pretix_original
Compare commits
34
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae169ee03a | ||
|
|
826c54bce7 | ||
|
|
0cf2f06fcf | ||
|
|
12095c0c9c | ||
|
|
bca4cd1e23 | ||
|
|
53e84dfb08 | ||
|
|
2e8447486c | ||
|
|
5b184bb1a0 | ||
|
|
8c6f0a5dc1 | ||
|
|
6a53091b91 | ||
|
|
be4bc9a6f3 | ||
|
|
efb1141d59 | ||
|
|
322a730eb2 | ||
|
|
8d2224e725 | ||
|
|
5b819b76f0 | ||
|
|
5d90a42acf | ||
|
|
5398671fde | ||
|
|
f7d4460deb | ||
|
|
f76576a587 | ||
|
|
cf5f0dc7f9 | ||
|
|
567984bd5e | ||
|
|
1c6bd46d21 | ||
|
|
9ba3227837 | ||
|
|
21864885cb | ||
|
|
38173e3a54 | ||
|
|
4baf317934 | ||
|
|
c2b25bad06 | ||
|
|
9e3ad6c05c | ||
|
|
f017de1a21 | ||
|
|
b56bd8541e | ||
|
|
1c9219609a | ||
|
|
0c96f758a8 | ||
|
|
9bd3444aad | ||
|
|
10a83935d9 |
@@ -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 applies to all items.
|
||||
condition_all_products boolean If ``true``, the discount condition 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 applies to.
|
||||
of internal item IDs that the discount condition 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,6 +48,17 @@ 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.
|
||||
======================================== ========================== =======================================================
|
||||
|
||||
|
||||
@@ -94,6 +105,10 @@ 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
|
||||
}
|
||||
@@ -146,6 +161,10 @@ 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
|
||||
}
|
||||
@@ -184,6 +203,10 @@ 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
|
||||
}
|
||||
@@ -211,6 +234,10 @@ 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
|
||||
}
|
||||
@@ -267,6 +294,10 @@ 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
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ 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.
|
||||
@@ -121,9 +122,13 @@ internal_reference string Customer's refe
|
||||
|
||||
The attribute ``lines.subevent`` has been added.
|
||||
|
||||
.. versionchanged:: 2023.8
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
The ``event`` attribute has been added. The organizer-level endpoint has been added.
|
||||
|
||||
|
||||
List of all invoices
|
||||
--------------------
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/
|
||||
|
||||
@@ -152,6 +157,7 @@ Endpoints
|
||||
"results": [
|
||||
{
|
||||
"number": "SAMPLECONF-00001",
|
||||
"event": "sampleconf",
|
||||
"order": "ABC12",
|
||||
"is_cancellation": false,
|
||||
"invoice_from_name": "Big Events LLC",
|
||||
@@ -221,6 +227,50 @@ Endpoints
|
||||
: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.
|
||||
@@ -243,6 +293,7 @@ Endpoints
|
||||
|
||||
{
|
||||
"number": "SAMPLECONF-00001",
|
||||
"event": "sampleconf",
|
||||
"order": "ABC12",
|
||||
"is_cancellation": false,
|
||||
"invoice_from_name": "Big Events LLC",
|
||||
@@ -337,6 +388,12 @@ Endpoints
|
||||
: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.
|
||||
|
||||
@@ -20,6 +20,7 @@ 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
|
||||
@@ -130,6 +131,10 @@ 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:
|
||||
|
||||
@@ -289,6 +294,7 @@ List of all orders
|
||||
"results": [
|
||||
{
|
||||
"code": "ABC12",
|
||||
"event": "sampleconf",
|
||||
"status": "p",
|
||||
"testmode": false,
|
||||
"secret": "k24fiuwvu8kxz3y1",
|
||||
@@ -441,6 +447,48 @@ 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
|
||||
--------------------------
|
||||
|
||||
@@ -466,6 +514,7 @@ Fetching individual orders
|
||||
|
||||
{
|
||||
"code": "ABC12",
|
||||
"event": "sampleconf",
|
||||
"status": "p",
|
||||
"testmode": false,
|
||||
"secret": "k24fiuwvu8kxz3y1",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Automated email rules
|
||||
Scheduled email rules
|
||||
=====================
|
||||
|
||||
Resource description
|
||||
--------------------
|
||||
|
||||
Automated email rules that specify emails that the system will send automatically at a specific point in time, e.g.
|
||||
Scheduled 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,10 +23,14 @@ 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
|
||||
@@ -89,6 +93,7 @@ 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",
|
||||
@@ -139,6 +144,7 @@ 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",
|
||||
@@ -180,6 +186,7 @@ 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",
|
||||
@@ -209,6 +216,7 @@ 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",
|
||||
@@ -266,6 +274,7 @@ 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",
|
||||
|
||||
@@ -112,6 +112,7 @@ memcached = ["pylibmc"]
|
||||
dev = [
|
||||
"coverage",
|
||||
"coveralls",
|
||||
"fakeredis==2.18.*",
|
||||
"flake8==6.0.*",
|
||||
"freezegun",
|
||||
"isort==5.12.*",
|
||||
|
||||
@@ -32,11 +32,13 @@ 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',
|
||||
'condition_ignore_voucher_discounted')
|
||||
'benefit_same_products', 'benefit_limit_products', 'benefit_apply_to_addons',
|
||||
'benefit_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)
|
||||
|
||||
@@ -284,11 +284,12 @@ 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', 'datetime', 'type', 'position')
|
||||
'raw_subevent', 'nonce', 'datetime', 'type', 'position')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
@@ -614,7 +615,7 @@ class PaymentURLField(serializers.URLField):
|
||||
def to_representation(self, instance: OrderPayment):
|
||||
if instance.state != OrderPayment.PAYMENT_STATE_CREATED:
|
||||
return None
|
||||
return build_absolute_uri(self.context['event'], 'presale:event.order.pay', kwargs={
|
||||
return build_absolute_uri(instance.order.event, 'presale:event.order.pay', kwargs={
|
||||
'order': instance.order.code,
|
||||
'secret': instance.order.secret,
|
||||
'payment': instance.pk,
|
||||
@@ -659,7 +660,7 @@ class OrderRefundSerializer(I18nAwareModelSerializer):
|
||||
|
||||
class OrderURLField(serializers.URLField):
|
||||
def to_representation(self, instance: Order):
|
||||
return build_absolute_uri(self.context['event'], 'presale:event.order', kwargs={
|
||||
return build_absolute_uri(instance.event, 'presale:event.order', kwargs={
|
||||
'order': instance.code,
|
||||
'secret': instance.secret,
|
||||
})
|
||||
@@ -694,6 +695,7 @@ 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)
|
||||
@@ -709,7 +711,7 @@ class OrderSerializer(I18nAwareModelSerializer):
|
||||
model = Order
|
||||
list_serializer_class = OrderListSerializer
|
||||
fields = (
|
||||
'code', 'status', 'testmode', 'secret', 'email', 'phone', 'locale', 'datetime', 'expires', 'payment_date',
|
||||
'code', 'event', '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'
|
||||
@@ -1593,6 +1595,7 @@ 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)
|
||||
@@ -1601,7 +1604,7 @@ class InvoiceSerializer(I18nAwareModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Invoice
|
||||
fields = ('order', 'number', 'is_cancellation', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode',
|
||||
fields = ('event', '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',
|
||||
|
||||
@@ -94,6 +94,14 @@ 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)
|
||||
|
||||
@@ -61,6 +61,8 @@ 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()
|
||||
@@ -77,7 +79,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.OrderViewSet)
|
||||
event_router.register(r'orders', order.EventOrderViewSet)
|
||||
event_router.register(r'orderpositions', order.OrderPositionViewSet)
|
||||
event_router.register(r'invoices', order.InvoiceViewSet)
|
||||
event_router.register(r'revokedsecrets', order.RevokedSecretViewSet, basename='revokedsecrets')
|
||||
|
||||
@@ -164,8 +164,21 @@ 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=self.get_object(),
|
||||
list=clist,
|
||||
successful=False,
|
||||
forced=True,
|
||||
force_sent=True,
|
||||
|
||||
@@ -415,6 +415,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
'subeventitem_set',
|
||||
'subeventitemvariation_set',
|
||||
'meta_values',
|
||||
'meta_values__property',
|
||||
Prefetch(
|
||||
'seat_category_mappings',
|
||||
to_attr='_seat_category_mappings',
|
||||
|
||||
@@ -44,6 +44,7 @@ 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
|
||||
@@ -185,7 +186,7 @@ with scopes_disabled():
|
||||
)
|
||||
|
||||
|
||||
class OrderViewSet(viewsets.ModelViewSet):
|
||||
class OrderViewSetMixin:
|
||||
serializer_class = OrderSerializer
|
||||
queryset = Order.objects.none()
|
||||
filter_backends = (DjangoFilterBackend, TotalOrderingFilter)
|
||||
@@ -193,19 +194,12 @@ class OrderViewSet(viewsets.ModelViewSet):
|
||||
ordering_fields = ('datetime', 'code', 'status', 'last_modified')
|
||||
filterset_class = OrderFilter
|
||||
lookup_field = 'code'
|
||||
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'
|
||||
ctx['exclude'] = self.request.query_params.getlist('exclude')
|
||||
ctx['include'] = self.request.query_params.getlist('include')
|
||||
return ctx
|
||||
def get_base_queryset(self):
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_queryset(self):
|
||||
qs = self.request.event.orders
|
||||
qs = self.get_base_queryset()
|
||||
if 'fees' not in self.request.GET.getlist('exclude'):
|
||||
if self.request.query_params.get('include_canceled_fees', 'false') == 'true':
|
||||
fqs = OrderFee.all
|
||||
@@ -227,11 +221,12 @@ class OrderViewSet(viewsets.ModelViewSet):
|
||||
opq = OrderPosition.all
|
||||
else:
|
||||
opq = OrderPosition.objects
|
||||
if request.query_params.get('pdf_data', 'false') == 'true':
|
||||
if request.query_params.get('pdf_data', 'false') == 'true' and getattr(request, 'event', None):
|
||||
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',
|
||||
)
|
||||
@@ -266,13 +261,12 @@ class OrderViewSet(viewsets.ModelViewSet):
|
||||
)
|
||||
)
|
||||
|
||||
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.')
|
||||
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
|
||||
|
||||
@scopes_disabled() # we are sure enough that get_queryset() is correct, so we save some perforamnce
|
||||
def list(self, request, **kwargs):
|
||||
@@ -289,6 +283,45 @@ class OrderViewSet(viewsets.ModelViewSet):
|
||||
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)
|
||||
@@ -1782,11 +1815,24 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
write_permission = 'can_change_orders'
|
||||
|
||||
def get_queryset(self):
|
||||
return self.request.event.invoices.prefetch_related('lines').select_related('order', 'refers').annotate(
|
||||
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(
|
||||
nr=Concat('prefix', 'invoice_no')
|
||||
)
|
||||
|
||||
@action(detail=True, )
|
||||
@action(detail=True)
|
||||
def download(self, request, **kwargs):
|
||||
invoice = self.get_object()
|
||||
|
||||
@@ -1805,7 +1851,7 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
return resp
|
||||
|
||||
@action(detail=True, methods=['POST'])
|
||||
def regenerate(self, request, **kwarts):
|
||||
def regenerate(self, request, **kwargs):
|
||||
inv = self.get_object()
|
||||
if inv.canceled:
|
||||
raise ValidationError('The invoice has already been canceled.')
|
||||
@@ -1815,7 +1861,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(self.request.event.timezone).date() - inv.date > datetime.timedelta(days=1):
|
||||
elif now().astimezone(inv.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)
|
||||
@@ -1830,7 +1876,7 @@ class InvoiceViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
return Response(status=204)
|
||||
|
||||
@action(detail=True, methods=['POST'])
|
||||
def reissue(self, request, **kwarts):
|
||||
def reissue(self, request, **kwargs):
|
||||
inv = self.get_object()
|
||||
if inv.canceled:
|
||||
raise ValidationError('The invoice has already been canceled.')
|
||||
|
||||
@@ -62,27 +62,27 @@ class NamespacedCache:
|
||||
prefix = int(time.time())
|
||||
self.cache.set(self.prefixkey, prefix)
|
||||
|
||||
def set(self, key: str, value: str, timeout: int=300):
|
||||
def set(self, key: str, value: any, timeout: int=300):
|
||||
return self.cache.set(self._prefix_key(key), value, timeout)
|
||||
|
||||
def get(self, key: str) -> str:
|
||||
def get(self, key: str) -> any:
|
||||
return self.cache.get(self._prefix_key(key, known_prefix=self._last_prefix))
|
||||
|
||||
def get_or_set(self, key: str, default: Callable, timeout=300) -> str:
|
||||
def get_or_set(self, key: str, default: Callable, timeout=300) -> any:
|
||||
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, str]:
|
||||
def get_many(self, keys: List[str]) -> Dict[str, any]:
|
||||
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, str], timeout=300):
|
||||
def set_many(self, values: Dict[str, any], timeout=300):
|
||||
newvalues = {}
|
||||
for k, v in values.items():
|
||||
newvalues[self._prefix_key(k)] = v
|
||||
|
||||
@@ -134,8 +134,11 @@ 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 = markdown_compile_email(plain_body)
|
||||
body_md = self.compile_markdown(plain_body)
|
||||
htmlctx = {
|
||||
'site': settings.PRETIX_INSTANCE_NAME,
|
||||
'site_url': settings.SITE_URL,
|
||||
@@ -153,7 +156,7 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer):
|
||||
|
||||
if plain_signature:
|
||||
signature_md = plain_signature.replace('\n', '<br>\n')
|
||||
signature_md = markdown_compile_email(signature_md)
|
||||
signature_md = self.compile_markdown(signature_md)
|
||||
htmlctx['signature'] = signature_md
|
||||
|
||||
if order:
|
||||
|
||||
@@ -549,7 +549,9 @@ class OrderListExporter(MultiSheetListExporter):
|
||||
headers.append(_('End date'))
|
||||
headers += [
|
||||
_('Product'),
|
||||
_('Product ID'),
|
||||
_('Variation'),
|
||||
_('Variation ID'),
|
||||
_('Price'),
|
||||
_('Tax rate'),
|
||||
_('Tax rule'),
|
||||
@@ -656,7 +658,9 @@ 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 '',
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
# 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),
|
||||
),
|
||||
]
|
||||
@@ -99,7 +99,7 @@ class Discount(LoggedModel):
|
||||
)
|
||||
condition_apply_to_addons = models.BooleanField(
|
||||
default=True,
|
||||
verbose_name=_("Apply to add-on products"),
|
||||
verbose_name=_("Count 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 receive the discount."),
|
||||
"hidden product or gain access to sold-out quota will still be considered."),
|
||||
)
|
||||
condition_min_count = models.PositiveIntegerField(
|
||||
verbose_name=_('Minimum number of matching products'),
|
||||
@@ -120,6 +120,19 @@ 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,
|
||||
@@ -139,6 +152,18 @@ 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
|
||||
@@ -187,6 +212,14 @@ 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()
|
||||
|
||||
@@ -197,6 +230,7 @@ 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:
|
||||
@@ -207,14 +241,14 @@ class Discount(LoggedModel):
|
||||
return False
|
||||
return True
|
||||
|
||||
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:
|
||||
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:
|
||||
return
|
||||
|
||||
if self.condition_min_count or self.benefit_only_apply_to_cheapest_n_matches:
|
||||
raise ValueError('Validation invariant violated.')
|
||||
|
||||
for idx in idx_group:
|
||||
for idx in benefit_idx_group:
|
||||
previous_price = positions[idx][2]
|
||||
new_price = round_decimal(
|
||||
previous_price * (Decimal('100.00') - self.benefit_discount_matching_percent) / Decimal('100.00'),
|
||||
@@ -222,8 +256,8 @@ class Discount(LoggedModel):
|
||||
)
|
||||
result[idx] = new_price
|
||||
|
||||
def _apply_min_count(self, positions, idx_group, result):
|
||||
if len(idx_group) < self.condition_min_count:
|
||||
def _apply_min_count(self, positions, condition_idx_group, benefit_idx_group, result):
|
||||
if len(condition_idx_group) < self.condition_min_count:
|
||||
return
|
||||
|
||||
if not self.condition_min_count or self.condition_min_value:
|
||||
@@ -233,15 +267,17 @@ class Discount(LoggedModel):
|
||||
if not self.condition_min_count:
|
||||
raise ValueError('Validation invariant violated.')
|
||||
|
||||
idx_group = sorted(idx_group, key=lambda idx: (positions[idx][2], -idx)) # sort by line_price
|
||||
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
|
||||
|
||||
# Prevent over-consuming of items, i.e. if our discount is "buy 2, get 1 free", we only
|
||||
# want to match multiples of 3
|
||||
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]
|
||||
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]
|
||||
else:
|
||||
consume_idx = idx_group
|
||||
benefit_idx = idx_group
|
||||
consume_idx = condition_idx_group
|
||||
benefit_idx = benefit_idx_group
|
||||
|
||||
for idx in benefit_idx:
|
||||
previous_price = positions[idx][2]
|
||||
@@ -276,7 +312,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
|
||||
initial_candidates = [
|
||||
condition_candidates = [
|
||||
idx
|
||||
for idx, (item_id, subevent_id, line_price_gross, is_addon_to, voucher_discount) in positions.items()
|
||||
if (
|
||||
@@ -286,11 +322,25 @@ 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, initial_candidates, result)
|
||||
self._apply_min_count(positions, condition_candidates, benefit_candidates, result)
|
||||
else:
|
||||
self._apply_min_value(positions, initial_candidates, result)
|
||||
self._apply_min_value(positions, condition_candidates, benefit_candidates, result)
|
||||
|
||||
elif self.subevent_mode == self.SUBEVENT_MODE_SAME:
|
||||
def key(idx):
|
||||
@@ -299,17 +349,18 @@ class Discount(LoggedModel):
|
||||
# Build groups of candidates with the same subevent, then apply our regular algorithm
|
||||
# to each group
|
||||
|
||||
_groups = groupby(sorted(initial_candidates, key=key), key=key)
|
||||
candidate_groups = [list(g) for k, g in _groups]
|
||||
_groups = groupby(sorted(condition_candidates, key=key), key=key)
|
||||
candidate_groups = [(k, list(g)) for k, g in _groups]
|
||||
|
||||
for g in candidate_groups:
|
||||
for subevent_id, g in candidate_groups:
|
||||
benefit_g = [idx for idx in benefit_candidates if positions[idx][1] == subevent_id]
|
||||
if self.condition_min_count:
|
||||
self._apply_min_count(positions, g, result)
|
||||
self._apply_min_count(positions, g, benefit_g, result)
|
||||
else:
|
||||
self._apply_min_value(positions, g, result)
|
||||
self._apply_min_value(positions, g, benefit_g, result)
|
||||
|
||||
elif self.subevent_mode == self.SUBEVENT_MODE_DISTINCT:
|
||||
if self.condition_min_value:
|
||||
if self.condition_min_value or not self.benefit_same_products:
|
||||
raise ValueError('Validation invariant violated.')
|
||||
|
||||
# Build optimal groups of candidates with distinct subevents, then apply our regular algorithm
|
||||
@@ -336,7 +387,7 @@ class Discount(LoggedModel):
|
||||
candidates = []
|
||||
cardinality = None
|
||||
for se, l in subevent_to_idx.items():
|
||||
l = [ll for ll in l if ll in initial_candidates and ll not in current_group]
|
||||
l = [ll for ll in l if ll in condition_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}:
|
||||
@@ -373,5 +424,5 @@ class Discount(LoggedModel):
|
||||
break
|
||||
|
||||
for g in candidate_groups:
|
||||
self._apply_min_count(positions, g, result)
|
||||
self._apply_min_count(positions, g, g, result)
|
||||
return result
|
||||
|
||||
@@ -907,14 +907,18 @@ 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'):
|
||||
items = list(d.condition_limit_products.all())
|
||||
c_items = list(d.condition_limit_products.all())
|
||||
b_items = list(d.benefit_limit_products.all())
|
||||
d.pk = None
|
||||
d.event = self
|
||||
d.save(force_insert=True)
|
||||
d.log_action('pretix.object.cloned')
|
||||
for i in items:
|
||||
for i in c_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'):
|
||||
|
||||
@@ -43,6 +43,7 @@ from typing import Optional, Tuple
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
import dateutil.parser
|
||||
import django_redis
|
||||
from dateutil.tz import datetime_exists
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
@@ -57,7 +58,6 @@ from django.utils.functional import cached_property
|
||||
from django.utils.timezone import is_naive, make_aware, now
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
from django_countries.fields import Country
|
||||
from django_redis import get_redis_connection
|
||||
from django_scopes import ScopedManager
|
||||
from i18nfield.fields import I18nCharField, I18nTextField
|
||||
|
||||
@@ -1463,7 +1463,7 @@ class Question(LoggedModel):
|
||||
(TYPE_PHONENUMBER, _("Phone number")),
|
||||
)
|
||||
UNLOCALIZED_TYPES = [TYPE_DATE, TYPE_TIME, TYPE_DATETIME]
|
||||
ASK_DURING_CHECKIN_UNSUPPORTED = [TYPE_PHONENUMBER]
|
||||
ASK_DURING_CHECKIN_UNSUPPORTED = []
|
||||
|
||||
event = models.ForeignKey(
|
||||
Event,
|
||||
@@ -1910,8 +1910,13 @@ class Quota(LoggedModel):
|
||||
|
||||
def rebuild_cache(self, now_dt=None):
|
||||
if settings.HAS_REDIS:
|
||||
rc = get_redis_connection("redis")
|
||||
rc.hdel(f'quotas:{self.event_id}:availabilitycache', str(self.pk))
|
||||
rc = django_redis.get_redis_connection("redis")
|
||||
p = rc.pipeline()
|
||||
p.hdel(f'quotas:{self.event_id}:availabilitycache', str(self.pk))
|
||||
p.hdel(f'quotas:{self.event_id}:availabilitycache:nocw', str(self.pk))
|
||||
p.hdel(f'quotas:{self.event_id}:availabilitycache:igcl', str(self.pk))
|
||||
p.hdel(f'quotas:{self.event_id}:availabilitycache:nocw:igcl', str(self.pk))
|
||||
p.execute()
|
||||
self.availability(now_dt=now_dt)
|
||||
|
||||
def availability(
|
||||
|
||||
@@ -340,10 +340,17 @@ class TaxRule(LoggedModel):
|
||||
rules = self._custom_rules
|
||||
if invoice_address:
|
||||
for r in rules:
|
||||
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['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['address_type'] == 'individual' and invoice_address.is_business:
|
||||
continue
|
||||
if r['address_type'] in ('business', 'business_vat_id') and not invoice_address.is_business:
|
||||
|
||||
@@ -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 not
|
||||
If you are done with your process you should return the user to the order's detail page. Redirection is only
|
||||
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
|
||||
|
||||
@@ -702,10 +702,10 @@ def get_seat(op: OrderPosition):
|
||||
|
||||
def generate_compressed_addon_list(op, order, event):
|
||||
itemcount = defaultdict(int)
|
||||
addons = (
|
||||
addons = [p for p in (
|
||||
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
|
||||
|
||||
|
||||
@@ -1078,6 +1078,7 @@ 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()
|
||||
|
||||
@@ -1089,7 +1090,10 @@ class CartManager:
|
||||
if op.position.expires > self.now_dt:
|
||||
for q in op.position.quotas:
|
||||
quotas_ok[q] += 1
|
||||
op.position.addons.all().delete()
|
||||
addons = op.position.addons.all()
|
||||
deleted_positions |= {a.pk for a in addons}
|
||||
addons.delete()
|
||||
deleted_positions.add(op.position.pk)
|
||||
op.position.delete()
|
||||
|
||||
elif isinstance(op, (self.AddOperation, self.ExtendOperation)):
|
||||
@@ -1239,20 +1243,28 @@ 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']
|
||||
op.position.addons.all().delete()
|
||||
|
||||
addons = op.position.addons.all()
|
||||
deleted_positions |= {a.pk for a in addons}
|
||||
deleted_positions.add(op.position.pk)
|
||||
addons.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()
|
||||
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
|
||||
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
|
||||
elif available_count == 0:
|
||||
op.position.addons.all().delete()
|
||||
addons = op.position.addons.all()
|
||||
deleted_positions |= {a.pk for a in addons}
|
||||
deleted_positions.add(op.position.pk)
|
||||
addons.delete()
|
||||
op.position.delete()
|
||||
else:
|
||||
raise AssertionError("ExtendOperation cannot affect more than one item")
|
||||
|
||||
@@ -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'))
|
||||
last_cis = list(op.checkins.order_by('-datetime').filter(list=clist).only('type', 'nonce', 'position_id'))
|
||||
entry_allowed = (
|
||||
type == Checkin.TYPE_EXIT or
|
||||
clist.allow_multiple_entries or
|
||||
|
||||
@@ -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').order_by('position', 'pk')
|
||||
).prefetch_related('condition_limit_products', 'benefit_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)
|
||||
|
||||
@@ -24,13 +24,13 @@ import time
|
||||
from collections import Counter, defaultdict
|
||||
from itertools import zip_longest
|
||||
|
||||
import django_redis
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.db.models import (
|
||||
Case, Count, F, Func, Max, OuterRef, Q, Subquery, Sum, Value, When,
|
||||
)
|
||||
from django.utils.timezone import now
|
||||
from django_redis import get_redis_connection
|
||||
|
||||
from pretix.base.models import (
|
||||
CartPosition, Checkin, Order, OrderPosition, Quota, Voucher,
|
||||
@@ -102,6 +102,12 @@ class QuotaAvailability:
|
||||
self.count_waitinglist = defaultdict(int)
|
||||
self.count_cart = defaultdict(int)
|
||||
|
||||
self._cache_key_suffix = ""
|
||||
if not self._count_waitinglist:
|
||||
self._cache_key_suffix += ":nocw"
|
||||
if self._ignore_closed:
|
||||
self._cache_key_suffix += ":igcl"
|
||||
|
||||
self.sizes = {}
|
||||
|
||||
def queue(self, *quota):
|
||||
@@ -121,17 +127,14 @@ class QuotaAvailability:
|
||||
if self._full_results:
|
||||
raise ValueError("You cannot combine full_results and allow_cache.")
|
||||
|
||||
elif not self._count_waitinglist:
|
||||
raise ValueError("If you set allow_cache, you need to set count_waitinglist.")
|
||||
|
||||
elif settings.HAS_REDIS:
|
||||
rc = get_redis_connection("redis")
|
||||
rc = django_redis.get_redis_connection("redis")
|
||||
quotas_by_event = defaultdict(list)
|
||||
for q in [_q for _q in self._queue if _q.id in quota_ids_set]:
|
||||
quotas_by_event[q.event_id].append(q)
|
||||
|
||||
for eventid, evquotas in quotas_by_event.items():
|
||||
d = rc.hmget(f'quotas:{eventid}:availabilitycache', [str(q.pk) for q in evquotas])
|
||||
d = rc.hmget(f'quotas:{eventid}:availabilitycache{self._cache_key_suffix}', [str(q.pk) for q in evquotas])
|
||||
for redisval, q in zip(d, evquotas):
|
||||
if redisval is not None:
|
||||
data = [rv for rv in redisval.decode().split(',')]
|
||||
@@ -164,12 +167,12 @@ class QuotaAvailability:
|
||||
if not settings.HAS_REDIS or not quotas:
|
||||
return
|
||||
|
||||
rc = get_redis_connection("redis")
|
||||
rc = django_redis.get_redis_connection("redis")
|
||||
# We write the computed availability to redis in a per-event hash as
|
||||
#
|
||||
# quota_id -> (availability_state, availability_number, timestamp).
|
||||
#
|
||||
# We store this in a hash instead of inidividual values to avoid making two many redis requests
|
||||
# We store this in a hash instead of individual values to avoid making too many redis requests
|
||||
# which would introduce latency.
|
||||
|
||||
# The individual entries in the hash are "valid" for 120 seconds. This means in a typical peak scenario with
|
||||
@@ -179,16 +182,16 @@ class QuotaAvailability:
|
||||
# these quotas. We choose 10 seconds since that should be well above the duration of a write.
|
||||
|
||||
lock_name = '_'.join([str(p) for p in sorted([q.pk for q in quotas])])
|
||||
if rc.exists(f'quotas:availabilitycachewrite:{lock_name}'):
|
||||
if rc.exists(f'quotas:availabilitycachewrite:{lock_name}{self._cache_key_suffix}'):
|
||||
return
|
||||
rc.setex(f'quotas:availabilitycachewrite:{lock_name}', '1', 10)
|
||||
rc.setex(f'quotas:availabilitycachewrite:{lock_name}{self._cache_key_suffix}', '1', 10)
|
||||
|
||||
update = defaultdict(list)
|
||||
for q in quotas:
|
||||
update[q.event_id].append(q)
|
||||
|
||||
for eventid, quotas in update.items():
|
||||
rc.hmset(f'quotas:{eventid}:availabilitycache', {
|
||||
rc.hmset(f'quotas:{eventid}:availabilitycache{self._cache_key_suffix}', {
|
||||
str(q.id): ",".join(
|
||||
[str(i) for i in self.results[q]] +
|
||||
[str(int(time.time()))]
|
||||
@@ -197,7 +200,7 @@ class QuotaAvailability:
|
||||
# To make sure old events do not fill up our redis instance, we set an expiry on the cache. However, we set it
|
||||
# on 7 days even though we mostly ignore values older than 2 monites. The reasoning is that we have some places
|
||||
# where we set allow_cache_stale and use the old entries anyways to save on performance.
|
||||
rc.expire(f'quotas:{eventid}:availabilitycache', 3600 * 24 * 7)
|
||||
rc.expire(f'quotas:{eventid}:availabilitycache{self._cache_key_suffix}', 3600 * 24 * 7)
|
||||
|
||||
# We used to also delete item_quota_cache:* from the event cache here, but as the cache
|
||||
# gets more complex, this does not seem worth it. The cache is only present for up to
|
||||
|
||||
@@ -22,13 +22,15 @@
|
||||
import sys
|
||||
from datetime import timedelta
|
||||
|
||||
from django.db.models import Exists, F, OuterRef, Q, Sum
|
||||
from django.db.models import (
|
||||
Exists, F, OuterRef, Prefetch, Q, Sum, prefetch_related_objects,
|
||||
)
|
||||
from django.dispatch import receiver
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, SeatCategoryMapping, User, WaitingListEntry,
|
||||
Event, EventMetaValue, SeatCategoryMapping, User, WaitingListEntry,
|
||||
)
|
||||
from pretix.base.models.waitinglist import WaitingListException
|
||||
from pretix.base.services.tasks import EventTask
|
||||
@@ -59,8 +61,21 @@ 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
|
||||
|
||||
qs = WaitingListEntry.objects.filter(
|
||||
event=event, voucher__isnull=True
|
||||
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
|
||||
).select_related('item', 'variation', 'subevent').prefetch_related(
|
||||
'item__quotas', 'variation__quotas'
|
||||
).order_by('-priority', 'created')
|
||||
|
||||
@@ -210,6 +210,8 @@ 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
|
||||
|
||||
|
||||
|
||||
@@ -292,7 +292,7 @@ class LinkifyAndCleanExtension(Extension):
|
||||
)
|
||||
|
||||
|
||||
def markdown_compile_email(source):
|
||||
def markdown_compile_email(source, allowed_tags=ALLOWED_TAGS, allowed_attributes=ALLOWED_ATTRIBUTES):
|
||||
linker = bleach.Linker(
|
||||
url_re=URL_RE,
|
||||
email_re=EMAIL_RE,
|
||||
@@ -306,8 +306,8 @@ def markdown_compile_email(source):
|
||||
EmailNl2BrExtension(),
|
||||
LinkifyAndCleanExtension(
|
||||
linker,
|
||||
tags=ALLOWED_TAGS,
|
||||
attributes=ALLOWED_ATTRIBUTES,
|
||||
tags=allowed_tags,
|
||||
attributes=allowed_attributes,
|
||||
protocols=ALLOWED_PROTOCOLS,
|
||||
strip=False,
|
||||
)
|
||||
|
||||
@@ -50,11 +50,16 @@ 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,
|
||||
@@ -64,11 +69,14 @@ 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):
|
||||
@@ -85,6 +93,7 @@ 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
|
||||
|
||||
@@ -38,6 +38,7 @@ 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
|
||||
@@ -65,7 +66,8 @@ 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 (
|
||||
PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, validate_event_settings,
|
||||
COUNTRIES_WITH_STATE_IN_ADDRESS, PERSON_NAME_SCHEMES,
|
||||
PERSON_NAME_TITLE_GROUPS, validate_event_settings,
|
||||
)
|
||||
from pretix.base.validators import multimail_validate
|
||||
from pretix.control.forms import (
|
||||
@@ -1428,9 +1430,20 @@ 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=CountriesAndEU(),
|
||||
choices=CountriesAndEUAndStates(),
|
||||
required=False
|
||||
)
|
||||
address_type = forms.ChoiceField(
|
||||
|
||||
@@ -86,12 +86,14 @@ class GlobalSettingsForm(SettingsForm):
|
||||
('leaflet_tiles', forms.CharField(
|
||||
required=False,
|
||||
label=_("Leaflet tiles URL pattern"),
|
||||
help_text=_("e.g. {sample}").format(sample="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png")
|
||||
help_text=_("e.g. {sample}").format(sample="https://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='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors')
|
||||
help_text=_("e.g. {sample}").format(
|
||||
sample='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
||||
)
|
||||
)),
|
||||
])
|
||||
responses = register_global_settings.send(self)
|
||||
|
||||
@@ -340,6 +340,9 @@ 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,6 +48,12 @@
|
||||
</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>
|
||||
|
||||
@@ -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 += 1
|
||||
happy += wlt['cnt']
|
||||
elif row[1] > 0:
|
||||
happy += 1
|
||||
happy += min(wlt['cnt'], row[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] - 1)
|
||||
quota_cache[q.pk] = (quota_cache[q.pk][0], quota_cache[q.pk][1] - min(wlt['cnt'], row[1]))
|
||||
|
||||
widgets.append({
|
||||
'content': None if lazy else NUM_WIDGET.format(
|
||||
|
||||
@@ -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('device_id', 'event_id').values('device_id').annotate(
|
||||
g=GroupConcat('event_id', separator=',')
|
||||
).order_by().values('device_id').annotate(
|
||||
g=GroupConcat('event_id', separator=',', ordered=True)
|
||||
).values('g')
|
||||
)
|
||||
)
|
||||
|
||||
@@ -66,18 +66,26 @@ class GroupConcat(Aggregate):
|
||||
function = 'group_concat'
|
||||
template = '%(function)s(%(field)s, "%(separator)s")'
|
||||
|
||||
def __init__(self, *expressions, **extra):
|
||||
def __init__(self, *expressions, ordered=False, **extra):
|
||||
self.ordered = ordered
|
||||
if 'separator' not in extra:
|
||||
# For PostgreSQL separator is an obligatory
|
||||
extra.update({'separator': ','})
|
||||
super().__init__(*expressions, **extra)
|
||||
|
||||
def as_postgresql(self, compiler, connection):
|
||||
return super().as_sql(
|
||||
compiler, connection,
|
||||
function='string_agg',
|
||||
template="%(function)s(%(field)s::text, '%(separator)s')",
|
||||
)
|
||||
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')",
|
||||
)
|
||||
|
||||
|
||||
class ReplicaRouter:
|
||||
|
||||
@@ -24799,7 +24799,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -28366,7 +28366,7 @@ msgstr[5] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "عنوان البريد الإلكتروني للحاضر"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -28023,7 +28023,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Correu electrònic de l'assistent"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -27060,7 +27060,7 @@ msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24800,7 +24800,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -27171,7 +27171,7 @@ msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "E-mailadresse"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -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 "Automated emails"
|
||||
msgstr "Automatisierte E-Mails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "Geplante 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
|
||||
msgstr ""
|
||||
"Automatische E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
|
||||
"Geplante 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 "Automated email rules"
|
||||
msgstr "Regeln für automatisierte E-Mails"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Regeln für geplante 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 "Automated emails"
|
||||
msgstr "Automatisierte E-Mails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "Geplante 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
|
||||
msgstr ""
|
||||
"Automatische E-Mails werden nicht verschickt, solange Ihr Ticketshop offline "
|
||||
"Geplante 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 "Automated email rules"
|
||||
msgstr "Regeln für automatisierte E-Mails"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Regeln für geplante E-Mails"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
msgid ""
|
||||
|
||||
@@ -24800,7 +24800,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -29895,7 +29895,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Email συμμετεχόντος"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24799,7 +24799,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -29453,7 +29453,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Correo electrónico del participante"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -25621,7 +25621,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -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 "Automated emails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "E-mails automatisés"
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:122
|
||||
@@ -28398,7 +28398,7 @@ msgstr "Créer une règle d’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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Règles d’e-mails automatiques"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -30019,7 +30019,7 @@ msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Correo electrónico del participante"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24825,7 +24825,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24809,7 +24809,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -25417,7 +25417,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24799,7 +24799,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -25888,7 +25888,7 @@ msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Email partecipante"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -25094,7 +25094,7 @@ msgid_plural "%(count)d days before event start at %(time)s"
|
||||
msgstr[0] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24800,7 +24800,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24801,7 +24801,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -26285,7 +26285,7 @@ msgstr[2] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Apmeklētāja e-pasts"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24799,7 +24799,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -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-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"
|
||||
"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"
|
||||
"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.17\n"
|
||||
"X-Generator: Weblate 4.18.2\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,10 +534,8 @@ 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 "Wachtlijstitems"
|
||||
msgstr "Wachtlijstitem heeft voucher ontvangen"
|
||||
|
||||
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
|
||||
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:938
|
||||
@@ -553,11 +551,11 @@ msgstr "Dit veld is verplicht."
|
||||
|
||||
#: pretix/base/addressvalidation.py:213
|
||||
msgid "Enter a postal code in the format XXX."
|
||||
msgstr "Voer een postcode in in het formaat XXX."
|
||||
msgstr "Postcode in het formaat XXX invoeren."
|
||||
|
||||
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
|
||||
msgid "Enter a postal code in the format XXXX."
|
||||
msgstr "Voer een postcode in in het format XXXX."
|
||||
msgstr "Postcode in het format XXXX invoeren."
|
||||
|
||||
#: pretix/base/auth.py:143
|
||||
#, python-brace-format
|
||||
@@ -2311,7 +2309,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:887
|
||||
msgid "Converted from legacy version"
|
||||
msgstr ""
|
||||
msgstr "Vanuit oudere versie geconverteerd"
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:949
|
||||
msgid "Payments and refunds"
|
||||
@@ -4380,7 +4378,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py:662
|
||||
msgid "Reusable media type"
|
||||
msgstr ""
|
||||
msgstr "Mediatype"
|
||||
|
||||
#: pretix/base/models/items.py:664
|
||||
msgid ""
|
||||
@@ -6146,7 +6144,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 ""
|
||||
msgstr "Kon {value} niet als datum en tijd herkennen."
|
||||
|
||||
#: pretix/base/orderimport.py:711
|
||||
msgid "Please enter a valid sales channel."
|
||||
@@ -6847,7 +6845,7 @@ msgstr "Geldig tot"
|
||||
|
||||
#: pretix/base/pdf.py:457
|
||||
msgid "Reusable Medium ID"
|
||||
msgstr ""
|
||||
msgstr "Media-ID"
|
||||
|
||||
#: pretix/base/pdf.py:462
|
||||
msgid "Seat: Full name"
|
||||
@@ -7047,38 +7045,30 @@ msgstr ""
|
||||
"door u gekozen hoeveelheid. Zie hieronder voor de details."
|
||||
|
||||
#: pretix/base/services/cart.py:114
|
||||
#, fuzzy, python-format
|
||||
#| msgid "You cannot select more than %s items per order."
|
||||
#, python-format
|
||||
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 items per bestelling kiezen."
|
||||
msgstr[0] "U kunt niet meer dan %s item 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "You cannot select more than %(max)s items of the product %(product)s."
|
||||
#, python-format
|
||||
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 items van product %(product)s kiezen."
|
||||
msgstr[0] "U kunt niet meer dan %(max)s item 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "You need to select at least %(min)s items of the product %(product)s."
|
||||
#, python-format
|
||||
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 items van product %(product)s kiezen."
|
||||
msgstr[0] "U moet ten minste %(min)s item 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "We removed %(product)s from your cart as you can not buy less than "
|
||||
#| "%(min)s items of it."
|
||||
#, python-format
|
||||
msgid ""
|
||||
"We removed %(product)s from your cart as you can not buy less than %(min)s "
|
||||
"item of it."
|
||||
@@ -7087,10 +7077,10 @@ msgid_plural ""
|
||||
"items of it."
|
||||
msgstr[0] ""
|
||||
"We hebben %(product)s uit uw winkelwagen verwijderd, omdat u niet minder dan "
|
||||
"%(min)s ervan kunt kopen."
|
||||
"%(min)s item ervan kunt kopen."
|
||||
msgstr[1] ""
|
||||
"We hebben %(product)s uit uw winkelwagen verwijderd, omdat u niet minder dan "
|
||||
"%(min)s ervan kunt kopen."
|
||||
"%(min)s items ervan kunt kopen."
|
||||
|
||||
#: pretix/base/services/cart.py:132 pretix/base/services/orders.py:146
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:157
|
||||
@@ -7252,10 +7242,7 @@ 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "You can select at most %(max)s add-ons from the category %(cat)s for the "
|
||||
#| "product %(base)s."
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can select at most %(max)s add-on from the category %(cat)s for the "
|
||||
"product %(base)s."
|
||||
@@ -7263,17 +7250,14 @@ 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-ons van de categorie %(cat)s selecteren voor het "
|
||||
"U kunt maximaal %(max)s add-on 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "You need to select at least %(min)s add-ons from the category %(cat)s for "
|
||||
#| "the product %(base)s."
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You need to select at least %(min)s add-on from the category %(cat)s for the "
|
||||
"product %(base)s."
|
||||
@@ -7281,7 +7265,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-ons van de categorie %(cat)s selecteren voor het "
|
||||
"U moet minimaal %(min)s add-on 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 "
|
||||
@@ -7446,16 +7430,14 @@ 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
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "Only allowed after {datetime}"
|
||||
#, python-brace-format
|
||||
msgid "This ticket is only valid after {datetime}."
|
||||
msgstr "Alleen toegestaan vanaf {datetime}"
|
||||
msgstr "Dit ticket is geldig vanaf {datetime}."
|
||||
|
||||
#: pretix/base/services/checkin.py:795 pretix/base/services/checkin.py:799
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "This ticket has already been redeemed."
|
||||
#, python-brace-format
|
||||
msgid "This ticket was only valid before {datetime}."
|
||||
msgstr "Dit ticket is al gebruikt."
|
||||
msgstr "Dit ticket was geldig vòòr {datetime}."
|
||||
|
||||
#: pretix/base/services/checkin.py:830
|
||||
msgid "This order position has an invalid product for this check-in list."
|
||||
@@ -7516,14 +7498,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
|
||||
@@ -7548,11 +7530,10 @@ msgstr ""
|
||||
"{country}"
|
||||
|
||||
#: pretix/base/services/invoices.py:220 pretix/base/services/invoices.py:257
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "Event location"
|
||||
#, python-brace-format
|
||||
msgctxt "invoice"
|
||||
msgid "Event location: {location}"
|
||||
msgstr "Evenementlocatie"
|
||||
msgstr "Evenementlocatie: {location}"
|
||||
|
||||
#: pretix/base/services/invoices.py:236
|
||||
#, python-brace-format
|
||||
@@ -7766,10 +7747,7 @@ msgid "Your cart is empty."
|
||||
msgstr "Uw winkelwagen is leeg."
|
||||
|
||||
#: pretix/base/services/orders.py:138
|
||||
#, 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."
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You cannot select more than %(max)s item of the product %(product)s. We "
|
||||
"removed the surplus items from your cart."
|
||||
@@ -7777,11 +7755,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 niet meer dan %(max)s kopieën van het product %(product)s kiezen. We "
|
||||
"hebben het overschot uit uw winkelwagen verwijderd."
|
||||
"U kunt van het product %(product)s niet meer dan %(max)s per bestelling "
|
||||
"kiezen. We hebben de overtallige producten uit uw winkelwagen verwijderd."
|
||||
msgstr[1] ""
|
||||
"U kunt niet meer dan %(max)s kopieën van het product %(product)s kiezen. We "
|
||||
"hebben het overschot uit uw winkelwagen verwijderd."
|
||||
"U kunt van het product %(product)s niet meer dan %(max)s per bestelling "
|
||||
"kiezen. We hebben de overtallige producten uit uw winkelwagen verwijderd."
|
||||
|
||||
#: pretix/base/services/orders.py:147
|
||||
msgid "The booking period has ended."
|
||||
@@ -7831,10 +7809,9 @@ 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 dit product te bestellen."
|
||||
msgstr ""
|
||||
"U heeft een geldige vouchercode nodig om een van de producten te bestellen."
|
||||
|
||||
#: pretix/base/services/orders.py:170
|
||||
msgid ""
|
||||
@@ -7873,10 +7850,8 @@ 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 geannuleerd."
|
||||
msgstr "De bestelling is niet geannuleerd."
|
||||
|
||||
#: pretix/base/services/orders.py:265 pretix/control/forms/orders.py:120
|
||||
msgid "The new expiry date needs to be in the future."
|
||||
@@ -7912,10 +7887,8 @@ 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 ondersteunt geen automatische terugbetalingen."
|
||||
msgstr "Deze betalingsmethode dekt het volledige bedrag niet."
|
||||
|
||||
#: pretix/base/services/orders.py:990
|
||||
msgid ""
|
||||
@@ -8070,10 +8043,8 @@ 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 "Betaling voltooid."
|
||||
msgstr "Verwijderen van data voltooid."
|
||||
|
||||
#: pretix/base/services/stats.py:210
|
||||
msgid "Uncategorized"
|
||||
@@ -10100,19 +10071,7 @@ msgid "Your order is pending payment: {code}"
|
||||
msgstr "Uw bestelling wacht op betaling: {code}"
|
||||
|
||||
#: pretix/base/settings.py:2316
|
||||
#, 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"
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
@@ -10135,7 +10094,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
|
||||
@@ -10145,19 +10104,7 @@ msgid "Incomplete payment received: {code}"
|
||||
msgstr "Betaling ontvangen voor uw bestelling: {code}"
|
||||
|
||||
#: pretix/base/settings.py:2333
|
||||
#, 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"
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
@@ -10175,10 +10122,11 @@ msgid ""
|
||||
msgstr ""
|
||||
"Hallo,\n"
|
||||
"\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"
|
||||
"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"
|
||||
"\n"
|
||||
"U kunt de betalingsinformatie en de status van uw bestelling inzien op\n"
|
||||
"{url}.\n"
|
||||
@@ -10367,17 +10315,7 @@ msgstr ""
|
||||
"Organisatie van {event}"
|
||||
|
||||
#: pretix/base/settings.py:2446 pretix/base/settings.py:2483
|
||||
#, 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"
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
@@ -10389,9 +10327,9 @@ msgid ""
|
||||
"Best regards, \n"
|
||||
"Your {event} team"
|
||||
msgstr ""
|
||||
"Beste {attendee_name},\n"
|
||||
"Beste,\n"
|
||||
"\n"
|
||||
"Er is een ticket voor {event} voor u besteld.\n"
|
||||
"Uw ticket voor {event} is geaccordeerd.\n"
|
||||
"\n"
|
||||
"U kunt de details en status van uw ticket hier bekijken:\n"
|
||||
"{url}\n"
|
||||
@@ -17295,10 +17233,8 @@ 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"
|
||||
msgstr "Extra informatie vereist"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:69
|
||||
msgid ""
|
||||
@@ -28543,7 +28479,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 "Automated emails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "Automatische e-mails"
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:122
|
||||
@@ -28631,7 +28567,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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
|
||||
@@ -28686,7 +28622,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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Automatische e-mailregels"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -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: 2021-10-29 02:00+0000\n"
|
||||
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
|
||||
"PO-Revision-Date: 2023-08-24 04:00+0000\n"
|
||||
"Last-Translator: Alain <alain@waag.org>\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.8\n"
|
||||
"X-Generator: Weblate 4.18.2\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 nodig"
|
||||
msgstr "Extra informatie vereist"
|
||||
|
||||
#: 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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-07-16 22:00+0000\n"
|
||||
"Last-Translator: Freek Engelbarts <freekengelbarts@gmail.com>\n"
|
||||
"PO-Revision-Date: 2023-08-24 04:00+0000\n"
|
||||
"Last-Translator: Alain <alain@waag.org>\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.17\n"
|
||||
"X-Generator: Weblate 4.18.2\n"
|
||||
|
||||
#: pretix/_base_settings.py:78
|
||||
msgid "English"
|
||||
@@ -555,10 +555,8 @@ msgid "Waiting list entry deleted"
|
||||
msgstr "Wachtlijstitem"
|
||||
|
||||
#: pretix/api/webhooks.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Waiting list entries"
|
||||
msgid "Waiting list entry received voucher"
|
||||
msgstr "Wachtlijstitems"
|
||||
msgstr "Wachtlijstitem heeft voucher ontvangen"
|
||||
|
||||
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
|
||||
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:938
|
||||
@@ -28785,7 +28783,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "E-mailadres van gast"
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:122
|
||||
@@ -28879,7 +28877,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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
|
||||
@@ -28943,7 +28941,7 @@ msgstr "Datakeuze"
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
|
||||
#, fuzzy
|
||||
#| msgid "Attendee e-mail address"
|
||||
msgid "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "E-mailadres van gast"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -26566,7 +26566,7 @@ msgstr[2] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -25093,7 +25093,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Regras de email automatizadas"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Reguli automatizate de e-mail"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -27155,7 +27155,7 @@ msgstr[2] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Адрес электронной почты посетителя"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24872,7 +24872,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -26953,7 +26953,7 @@ msgstr[3] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "E-poštni naslov udeleženca"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -26970,7 +26970,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Epost till deltagare"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24802,7 +24802,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -29881,7 +29881,7 @@ msgstr[1] ""
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
#, fuzzy
|
||||
#| msgid "Attendee email"
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "Katılımcı e-postası"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -27634,7 +27634,7 @@ msgstr[1] ""
|
||||
msgstr[2] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
|
||||
@@ -24809,7 +24809,7 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled 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 "Automated emails"
|
||||
msgid "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled 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 "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "观众Email"
|
||||
|
||||
#: 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-06-28 06:00+0000\n"
|
||||
"Last-Translator: Yucheng Lin <yuchenglinedu@gmail.com>\n"
|
||||
"PO-Revision-Date: 2023-08-31 07:34+0000\n"
|
||||
"Last-Translator: Martin Gross <gross@rami.io>\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.17\n"
|
||||
"X-Generator: Weblate 4.18.2\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,24 +5876,18 @@ 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 "應用"
|
||||
msgstr "Apple Pay"
|
||||
|
||||
#: pretix/base/payment.py:87
|
||||
#, fuzzy
|
||||
#| msgid "Android (Google Play)"
|
||||
msgctxt "payment"
|
||||
msgid "Google Pay"
|
||||
msgstr "安卓(Google Play)"
|
||||
msgstr "安卓(Google Pay)"
|
||||
|
||||
#: pretix/base/payment.py:256
|
||||
#: pretix/presale/templates/pretixpresale/event/order.html:115
|
||||
@@ -5955,13 +5949,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"
|
||||
@@ -6424,16 +6418,12 @@ 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"
|
||||
"附加2"
|
||||
"2x附加2"
|
||||
|
||||
#: pretix/base/pdf.py:370 pretix/control/forms/filter.py:1275
|
||||
#: pretix/control/forms/filter.py:1277
|
||||
@@ -7677,8 +7667,6 @@ 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 "如果看到以前未知的晶片,則自動建立新的禮品卡"
|
||||
|
||||
@@ -7974,8 +7962,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"這將附加到發票編號的前面。如果將此欄位留空,則將使用該活動 Slug值和破折號。注"
|
||||
"意:如果同一組織內的多個活動在此欄位中使用相同的值,它們將共用其編號範圍,即"
|
||||
"每個完整數位最多在您的所有事件中使用一次。此設置僅影響將來的帳單。可以使用 %Y"
|
||||
"(帶世紀)%y(不帶世紀)插入發票的年份,或使用 %m 和 %d 插入月份中的某一天。"
|
||||
"每個完整數位最多在您的所有活動中使用一次。此設置僅影響將來的帳單。可以使用 "
|
||||
"%Y(帶世紀)%y(不帶世紀)插入發票的年份,或使用 %m 和 %d 插入月份中的某一"
|
||||
"天。"
|
||||
|
||||
#: pretix/base/settings.py:682 pretix/base/settings.py:704
|
||||
#, python-brace-format
|
||||
@@ -8141,7 +8130,6 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:942
|
||||
#, fuzzy
|
||||
#| msgid "Expiration date"
|
||||
msgid "Expiration delay"
|
||||
msgstr "過期日期"
|
||||
|
||||
@@ -9176,12 +9164,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 ""
|
||||
"此檔將附加到我們為每個新訂單發送的第一封電子郵件中。因此,該檔案將與上面的"
|
||||
"「已下訂單」、「免費訂單」或「已收到訂單」文本相結合。檔案將同時發送給訂單聯"
|
||||
@@ -9410,25 +9398,12 @@ msgstr ""
|
||||
"你的{event} 團隊"
|
||||
|
||||
#: pretix/base/settings.py:2349
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "Payment received for your order: {code}"
|
||||
#, python-brace-format
|
||||
msgid "Payment failed for your order: {code}"
|
||||
msgstr "收到的訂單付款:{code}"
|
||||
msgstr "訂單付款失敗:{code}"
|
||||
|
||||
#: pretix/base/settings.py:2353
|
||||
#, 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"
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
@@ -9446,11 +9421,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"你好\n"
|
||||
"\n"
|
||||
"我們尚未收到你的 {event} 訂單的全額付款。\n"
|
||||
"請記住,我們僅在收到時保證你的訂單\n"
|
||||
"你在 {expire_date} 之前的付款。\n"
|
||||
"你在 {event} 的訂單付款未能成功。\n"
|
||||
"\n"
|
||||
"你可以在以下位置查看付款資訊與訂單狀態:\n"
|
||||
"您的訂單仍然有效,您可以嘗試使用相同或不同的付款方式再次進行支付,唯請在 "
|
||||
"{expire_date} 前完成付款程序。\n"
|
||||
"\n"
|
||||
"您可以重新嘗試付款,並在以下網址檢視您的訂單狀態:\n"
|
||||
"{url}\n"
|
||||
"\n"
|
||||
"敬此\n"
|
||||
@@ -9786,7 +9762,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
|
||||
@@ -10576,7 +10552,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)spretix 提供支援</a>"
|
||||
msgstr "由 <%(a_attr)s>pretix 提供支援</a>"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt:2
|
||||
msgid "Your export failed."
|
||||
@@ -13568,7 +13544,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
|
||||
@@ -13846,10 +13822,8 @@ 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."
|
||||
@@ -14085,11 +14059,8 @@ 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
|
||||
@@ -16788,10 +16759,8 @@ 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"
|
||||
@@ -16845,8 +16814,6 @@ msgid "Deadlines"
|
||||
msgstr "期限"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/payment.html:68
|
||||
#, fuzzy
|
||||
#| msgid "days"
|
||||
msgctxt "unit"
|
||||
msgid "days"
|
||||
msgstr "日"
|
||||
@@ -17044,9 +17011,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 ""
|
||||
@@ -17282,10 +17249,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>。請注意,我們不負責在你的售票處正確處理稅款。如有疑問,請聯繫律師或稅務顧"
|
||||
@@ -17567,7 +17534,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
|
||||
@@ -17909,9 +17876,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 ""
|
||||
"範例:包含「全價」和「折扣價」類型的門票類別、具有不同尺寸類型的商品、包含同"
|
||||
"時研討會類型的維修中心附加元件。"
|
||||
@@ -18198,8 +18165,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 張門票,"
|
||||
@@ -18210,8 +18177,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 張套餐,以後可以變成個"
|
||||
@@ -19573,8 +19540,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>訂單總數為 "
|
||||
@@ -20488,7 +20455,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 ""
|
||||
@@ -21981,11 +21948,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."
|
||||
@@ -22285,7 +22252,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
|
||||
@@ -22310,8 +22277,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
|
||||
@@ -22432,8 +22399,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
|
||||
@@ -22505,8 +22472,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>的票."
|
||||
@@ -22529,20 +22496,14 @@ 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
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "\n"
|
||||
#| " Waiting, product %(num)sx available\n"
|
||||
#| " "
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" Waiting, product %(num)sx "
|
||||
@@ -22550,8 +22511,8 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" 等待中,產品 %(num)s可用\n"
|
||||
" "
|
||||
" 等待中,產品 %(num)s可用\n"
|
||||
" "
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:231
|
||||
msgid "Waiting, product unavailable"
|
||||
@@ -23267,12 +23228,6 @@ 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 "
|
||||
@@ -23377,9 +23332,7 @@ msgstr "我們無法將上傳的檔解析為 CSV 檔。"
|
||||
#: pretix/control/views/orders.py:330
|
||||
msgid "Your invoice"
|
||||
msgid_plural "Your invoices"
|
||||
msgstr[0] ""
|
||||
"你的發票,\n"
|
||||
"你的發票"
|
||||
msgstr[0] "你的發票"
|
||||
|
||||
#: pretix/control/views/orders.py:332
|
||||
#, python-brace-format
|
||||
@@ -23678,7 +23631,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
|
||||
@@ -23960,7 +23913,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."
|
||||
@@ -25099,7 +25052,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 ""
|
||||
@@ -25274,7 +25227,7 @@ msgstr "值機清單 (PDF)"
|
||||
#: pretix/plugins/checkinlists/exporters.py:648
|
||||
msgctxt "export_category"
|
||||
msgid "Check-in"
|
||||
msgstr "Check-in"
|
||||
msgstr "簽到"
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py:286
|
||||
msgid ""
|
||||
@@ -25731,7 +25684,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: {}"
|
||||
@@ -26107,9 +26060,6 @@ 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 "傳送到"
|
||||
@@ -26124,9 +26074,6 @@ 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 "僅限未簽到的收件者"
|
||||
@@ -26176,17 +26123,11 @@ 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 "僅限在清單中簽到的收件者"
|
||||
@@ -26257,11 +26198,8 @@ 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"
|
||||
@@ -26313,7 +26251,7 @@ msgstr[0] ""
|
||||
"%(count)d 事件在%(time)s開始的前一天 , 事件在%(time)s開始前的%(count)d天"
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:99
|
||||
msgid "Automated emails"
|
||||
msgid "Scheduled emails"
|
||||
msgstr "自動電子郵件"
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:122
|
||||
@@ -26391,7 +26329,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 "Automated emails are not sent as long as your ticket shop is offline."
|
||||
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
|
||||
msgstr "只要你的售票店處於離線狀態,就不會發送自動電子郵件。"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:44
|
||||
@@ -26440,7 +26378,7 @@ msgstr "最後排程計算"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:4
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:6
|
||||
msgid "Automated email rules"
|
||||
msgid "Scheduled email rules"
|
||||
msgstr "自動電子郵件規則"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:8
|
||||
@@ -26710,10 +26648,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>以下節點,以便在外部退款時,自動取消訂單,並處理非同步支付方式,如 "
|
||||
@@ -26840,27 +26778,19 @@ 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 進行的 Sofort 付款<strong>不會</strong>立即處"
|
||||
"理,但在某些情況下可能需要長達 <strong>14 天</strong>才能確認。請僅在你的付款"
|
||||
"期限,允許此延遲時啟動此付款方式。"
|
||||
"通過 Stripe 進行的 SEPA 直接轉帳<strong>不會</strong>立即處理,但在某些情況下"
|
||||
"可能需要長達 <strong>14 天</strong>才能確認。請只有在您的付款期限允許此延遲的"
|
||||
"情況下,才啟用此付款方式。"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:370
|
||||
msgid "SEPA Creditor Mandate Name"
|
||||
@@ -26975,44 +26905,33 @@ msgid "Credit card"
|
||||
msgstr "信用卡"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1157
|
||||
#, fuzzy
|
||||
#| msgid "EPS via Stripe"
|
||||
msgid "SEPA Debit via Stripe"
|
||||
msgstr "EPS透過Stripe"
|
||||
msgstr "透過Stripe進行SEPA直接扣款"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1158
|
||||
msgid "SEPA Debit"
|
||||
msgstr ""
|
||||
msgstr "SEPA扣款"
|
||||
|
||||
#: 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"
|
||||
@@ -27183,10 +27102,8 @@ 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
|
||||
@@ -27195,10 +27112,8 @@ 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
|
||||
@@ -27241,25 +27156,18 @@ 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
|
||||
@@ -27539,7 +27447,7 @@ msgstr "網上check-in"
|
||||
|
||||
#: pretix/plugins/webcheckin/templates/pretixplugins/webcheckin/index.html:10
|
||||
msgid "Check-in"
|
||||
msgstr "Check-in"
|
||||
msgstr "簽到"
|
||||
|
||||
#: pretix/presale/checkoutflow.py:107
|
||||
msgctxt "checkoutflow"
|
||||
@@ -27837,7 +27745,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
|
||||
@@ -29093,7 +29001,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
|
||||
@@ -29310,9 +29218,8 @@ 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> 的取消費用,"
|
||||
"你將收到剩餘部分的退款。"
|
||||
@@ -29334,8 +29241,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-06-26 23:00+0000\n"
|
||||
"Last-Translator: Yucheng Lin <yuchenglinedu@gmail.com>\n"
|
||||
"PO-Revision-Date: 2023-08-31 07:00+0000\n"
|
||||
"Last-Translator: Ash So <ashs@vankaifong.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.17\n"
|
||||
"X-Generator: Weblate 4.18.2\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -662,10 +662,8 @@ msgid "Your local time:"
|
||||
msgstr "你的當地時間:"
|
||||
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
||||
#, fuzzy
|
||||
#| msgid "Apple Pay"
|
||||
msgid "Google Pay"
|
||||
msgstr "Apple Pay"
|
||||
msgstr "Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:17
|
||||
msgctxt "widget"
|
||||
|
||||
@@ -607,6 +607,12 @@ 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
|
||||
@@ -615,9 +621,15 @@ class PaypalMethod(BasePaymentProvider):
|
||||
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment, reference=pp_captured_order.id)
|
||||
except ReferencedPayPalObject.MultipleObjectsReturned:
|
||||
pass
|
||||
if str(pp_captured_order.purchase_units[0].amount.value) != str(payment.amount) or \
|
||||
if Decimal(pp_captured_order.purchase_units[0].amount.value) != 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.'))
|
||||
|
||||
@@ -660,6 +672,12 @@ 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
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class RuleSerializer(I18nAwareModelSerializer):
|
||||
class Meta:
|
||||
model = Rule
|
||||
fields = ['id', 'subject', 'template', 'all_products', 'limit_products', 'restrict_to_status',
|
||||
'send_date', 'send_offset_days', 'send_offset_time', 'date_is_absolute',
|
||||
'checked_in_status', '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,6 +88,10 @@ 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):
|
||||
|
||||
@@ -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',
|
||||
'send_to', 'enabled']
|
||||
'checked_in_status', 'send_to', 'enabled']
|
||||
|
||||
field_classes = {
|
||||
'subevent': SafeModelMultipleChoiceField,
|
||||
@@ -337,6 +337,7 @@ class RuleForm(FormPlaceholderMixin, I18nModelForm):
|
||||
'data-inverse-dependency': '#id_all_products'},
|
||||
),
|
||||
'send_to': forms.RadioSelect,
|
||||
'checked_in_status': forms.RadioSelect,
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# 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),
|
||||
),
|
||||
]
|
||||
@@ -34,7 +34,8 @@ 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 (
|
||||
Event, InvoiceAddress, Item, Order, OrderPosition, SubEvent, fields,
|
||||
Checkin, Event, InvoiceAddress, Item, Order, OrderPosition, SubEvent,
|
||||
fields,
|
||||
)
|
||||
from pretix.base.models.base import LoggingMixin
|
||||
from pretix.base.services.mail import SendMailException
|
||||
@@ -112,19 +113,30 @@ class ScheduledMail(models.Model):
|
||||
e = self.event
|
||||
|
||||
orders = e.orders.all()
|
||||
limit_products = self.rule.limit_products.values_list('pk', flat=True) if not self.rule.all_products else None
|
||||
|
||||
filter_orders_by_op = False
|
||||
op_qs = OrderPosition.objects.filter(
|
||||
order__event=self.event,
|
||||
canceled=False,
|
||||
)
|
||||
|
||||
if self.subevent:
|
||||
orders = orders.filter(
|
||||
Exists(OrderPosition.objects.filter(order=OuterRef('pk'), subevent=self.subevent))
|
||||
)
|
||||
filter_orders_by_op = True
|
||||
op_qs = op_qs.filter(subevent=self.subevent)
|
||||
elif e.has_subevents:
|
||||
return # This rule should not even exist
|
||||
|
||||
if not self.rule.all_products:
|
||||
orders = orders.filter(
|
||||
Exists(OrderPosition.objects.filter(order=OuterRef('pk'), item_id__in=limit_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'))))
|
||||
|
||||
status_q = Q(status__in=self.rule.restrict_to_status)
|
||||
if 'n__pending_approval' in self.rule.restrict_to_status:
|
||||
@@ -142,6 +154,8 @@ 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')
|
||||
@@ -205,6 +219,12 @@ 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')
|
||||
|
||||
@@ -219,6 +239,15 @@ 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"),
|
||||
|
||||
@@ -96,7 +96,7 @@ def control_nav_import(sender, request=None, **kwargs):
|
||||
'active': (url.namespace == 'plugins:sendmail' and url.url_name.startswith('send')),
|
||||
},
|
||||
{
|
||||
'label': _('Automated emails'),
|
||||
'label': _('Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline." %}
|
||||
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% block inner %}
|
||||
@@ -28,6 +28,8 @@
|
||||
<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 "Automated emails are not sent as long as your ticket shop is offline." %}
|
||||
{% trans "Scheduled 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 "Automated email rules" %}{% endblock %}
|
||||
{% block title %}{% trans "Scheduled email rules" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>{% trans "Automated email rules" %}</h1>
|
||||
<h1>{% trans "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline." %}
|
||||
{% trans "Scheduled 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 "Automated emails are not sent as long as your ticket shop is offline." %}
|
||||
{% trans "Scheduled emails are not sent as long as your ticket shop is offline." %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% block inner %}
|
||||
@@ -42,6 +42,8 @@
|
||||
<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>
|
||||
|
||||
@@ -39,10 +39,13 @@ 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.models import F, Q
|
||||
from django.db import models
|
||||
from django.db.models import Count, F, Q, Sum
|
||||
from django.db.models.functions import Cast
|
||||
from django.http import HttpResponseNotAllowed, JsonResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.utils import translation
|
||||
@@ -62,12 +65,14 @@ 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,
|
||||
@@ -802,7 +807,9 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
|
||||
@cached_property
|
||||
def invoice_form(self):
|
||||
wd = self.cart_session.get('widget_data', {})
|
||||
if not self.invoice_address.pk:
|
||||
if self.invoice_address.pk:
|
||||
wd_initial = {}
|
||||
elif wd:
|
||||
wd_initial = {
|
||||
'name_parts': {
|
||||
k[21:].replace('-', '_'): v
|
||||
@@ -817,7 +824,9 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
|
||||
'country': wd.get('invoice-address-country', ''),
|
||||
}
|
||||
else:
|
||||
wd_initial = {}
|
||||
wd_initial = {
|
||||
'is_business': self._get_is_business_heuristic(),
|
||||
}
|
||||
initial = dict(wd_initial)
|
||||
|
||||
if self.cart_customer:
|
||||
@@ -1026,6 +1035,25 @@ 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, it’s 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()
|
||||
@@ -1114,6 +1142,31 @@ 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" 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#invoice-details" 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 event.settings.invoice_address_required or event.settings.invoice_name_required %}open{% endif %}>
|
||||
<details class="panel panel-default" {% if invoice_address_open %}open{% endif %} id="invoice-details">
|
||||
<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 %}
|
||||
|
||||
@@ -496,7 +496,12 @@ 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:
|
||||
ctx['payment_info'] = self.payment.payment_provider.checkout_confirm_render(self.request, order=self.order)
|
||||
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)
|
||||
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.",
|
||||
"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"]
|
||||
"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"]
|
||||
},
|
||||
"address_type": {
|
||||
"description": "Type of customer, emtpy = any.",
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#
|
||||
from contextlib import contextmanager
|
||||
|
||||
import fakeredis
|
||||
from pytest_mock import MockFixture
|
||||
|
||||
|
||||
@@ -34,3 +35,7 @@ def mocker_context():
|
||||
result = MockFixture(FakePytestConfig())
|
||||
yield result
|
||||
result.stopall()
|
||||
|
||||
|
||||
def get_redis_connection(alias="default", write=True):
|
||||
return fakeredis.FakeStrictRedis(server=fakeredis.FakeServer.get_server("127.0.0.1:None:v(7, 0)", (7, 0)))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user