mirror of
https://github.com/pretix/pretix.git
synced 2026-10-03 19:34:41 +00:00
Compare commits
151
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
acd050456e | ||
|
|
baaea0109d | ||
|
|
dd9d59d4bf | ||
|
|
4db39b0b10 | ||
|
|
56b6147535 | ||
|
|
752db242d8 | ||
|
|
c43875b22c | ||
|
|
e2de10f10f | ||
|
|
930b329a62 | ||
|
|
985a51300b | ||
|
|
20246ff533 | ||
|
|
ce433f6c7d | ||
|
|
157bb10f7e | ||
|
|
55434445da | ||
|
|
84858bc048 | ||
|
|
e8c091741b | ||
|
|
ebdfd21b0f | ||
|
|
ed0b3cab7f | ||
|
|
3dd8cc5862 | ||
|
|
23e9ca8f34 | ||
|
|
e19afd39fb | ||
|
|
f7863c9fee | ||
|
|
fc3150fecc | ||
|
|
89318bcc24 | ||
|
|
a388391f06 | ||
|
|
b4d000379c | ||
|
|
ba9bba49c6 | ||
|
|
824624cce6 | ||
|
|
8601f62581 | ||
|
|
7547d64dea | ||
|
|
d1186c83ef | ||
|
|
e4782ff217 | ||
|
|
3328dc28c7 | ||
|
|
6c83b4288a | ||
|
|
6ff37796c3 | ||
|
|
fa60c320b9 | ||
|
|
ca9d9faef4 | ||
|
|
9718d1ee83 | ||
|
|
7bdb2c1555 | ||
|
|
da6753b53f | ||
|
|
33df9d13be | ||
|
|
582f9ac642 | ||
|
|
5ce2957965 | ||
|
|
eb9d6ad9a3 | ||
|
|
d339e1d594 | ||
|
|
cb15559ac6 | ||
|
|
3c95f1fee7 | ||
|
|
6a380c9356 | ||
|
|
eeea01b31a | ||
|
|
470621b5cb | ||
|
|
5802153101 | ||
|
|
e9f89d5d92 | ||
|
|
695689ed06 | ||
|
|
12d405d861 | ||
|
|
649eee3025 | ||
|
|
149b4f23aa | ||
|
|
fa40ccc623 | ||
|
|
2ba74b1697 | ||
|
|
e54cd6af44 | ||
|
|
d2b58d428e | ||
|
|
74332faa7b | ||
|
|
bbf391f7d5 | ||
|
|
d78d5b52fa | ||
|
|
9c0fef3d72 | ||
|
|
c7d6630979 | ||
|
|
4edd3c4654 | ||
|
|
b1ae638394 | ||
|
|
ae9bb68645 | ||
|
|
48f5a7c8cc | ||
|
|
d43032274b | ||
|
|
ae9a744fd9 | ||
|
|
ff4d3cd403 | ||
|
|
3440ee16f2 | ||
|
|
43e5b62db3 | ||
|
|
b249c7b417 | ||
|
|
b68c324389 | ||
|
|
4b320b6dab | ||
|
|
df74cbf5fc | ||
|
|
c875d758f9 | ||
|
|
2ebdd048c2 | ||
|
|
ca40b09080 | ||
|
|
558bf910fd | ||
|
|
7e1e472691 | ||
|
|
b06c9ef463 | ||
|
|
2af8d29ca9 | ||
|
|
2791d5e49e | ||
|
|
ed68719731 | ||
|
|
9aeb4b9731 | ||
|
|
9324887790 | ||
|
|
d353384555 | ||
|
|
b8f8e49cce | ||
|
|
806d0a5748 | ||
|
|
69e541e5af | ||
|
|
0723e6015c | ||
|
|
b8e1ab8258 | ||
|
|
81764278ae | ||
|
|
f3068e627a | ||
|
|
993a3f96e9 | ||
|
|
1af0b5e442 | ||
|
|
71b6bf630f | ||
|
|
59026da06b | ||
|
|
b3e0892d76 | ||
|
|
3029a6839b | ||
|
|
a826b0a1bd | ||
|
|
7d7474c07d | ||
|
|
58023381b9 | ||
|
|
e5c44e7aed | ||
|
|
d77a179606 | ||
|
|
29614db1e2 | ||
|
|
365051cc21 | ||
|
|
5c6b0eef6f | ||
|
|
bc0a6b662b | ||
|
|
0bc1aed1a0 | ||
|
|
0eaa5a081c | ||
|
|
688c434c4f | ||
|
|
c0474604a1 | ||
|
|
1741d08c2c | ||
|
|
6bbd808aaa | ||
|
|
aa90c5b3b1 | ||
|
|
bfbabe0e58 | ||
|
|
aa14505d2c | ||
|
|
df69656364 | ||
|
|
82cffd1519 | ||
|
|
7fc527135d | ||
|
|
8e39b67ee9 | ||
|
|
289cbe5bfc | ||
|
|
7143b877c8 | ||
|
|
e2a78100af | ||
|
|
ca77467e48 | ||
|
|
d3cbfcd4da | ||
|
|
3648ef28d7 | ||
|
|
689b99c3aa | ||
|
|
6c40daa863 | ||
|
|
efdc83f72a | ||
|
|
8b10534c74 | ||
|
|
bcacff2ee7 | ||
|
|
47096f7f1b | ||
|
|
c240ebcb8e | ||
|
|
ce3e59e020 | ||
|
|
4a9da40028 | ||
|
|
eab1efd5f4 | ||
|
|
c7290b614e | ||
|
|
1aea5633eb | ||
|
|
86cc719651 | ||
|
|
742a69f09f | ||
|
|
c05dee7af5 | ||
|
|
e399a49c8b | ||
|
|
b9b951e56b | ||
|
|
88bb1f4008 | ||
|
|
24e7db7ddd | ||
|
|
96ed6fe1a6 |
@@ -0,0 +1,2 @@
|
||||
# Format pre-vue code with eslint where possible (2026-09-10)
|
||||
d85e52c83ed3639e040372fd0052e842e4899d90
|
||||
+1
-2
@@ -16,8 +16,6 @@ recursive-include src/pretix/plugins/banktransfer/templates *
|
||||
recursive-include src/pretix/plugins/banktransfer/static *
|
||||
recursive-include src/pretix/plugins/manualpayment/templates *
|
||||
recursive-include src/pretix/plugins/manualpayment/static *
|
||||
recursive-include src/pretix/plugins/paypal/templates *
|
||||
recursive-include src/pretix/plugins/paypal/static *
|
||||
recursive-include src/pretix/plugins/paypal2/templates *
|
||||
recursive-include src/pretix/plugins/paypal2/static *
|
||||
recursive-include src/pretix/plugins/src/pretixdroid/templates *
|
||||
@@ -44,6 +42,7 @@ recursive-include src *.py
|
||||
recursive-include src *.svg
|
||||
recursive-include src *.txt
|
||||
recursive-include src Makefile
|
||||
recursive-include src *.pdf
|
||||
|
||||
recursive-exclude doc *
|
||||
recursive-exclude deployment *
|
||||
|
||||
@@ -53,6 +53,8 @@ Checking a ticket in
|
||||
Defaults to ``false`` in which case the server will determine the language (currently
|
||||
the event default language, might change in the future with support for the
|
||||
``Accept-Language`` header).
|
||||
:<json boolean simulate: Do not actually perform the check-in, only simulate the response. The ``position`` response
|
||||
object will not reflect the simulated changes.
|
||||
:>json string status: ``"ok"``, ``"incomplete"``, ``"exchange"``, or ``"error"``
|
||||
:>json string reason: Reason code, only set on status ``"error"``, see below for possible values.
|
||||
:>json string reason_explanation: Human-readable explanation, only set on status ``"error"`` and reason ``"rules"``, can be null.
|
||||
@@ -71,8 +73,6 @@ Checking a ticket in
|
||||
:>json object questions: List of questions to be answered for check-in, only set on status ``"incomplete"``.
|
||||
:>json object media_policy: Reusable media policy (see documentation on items), only set on status ``"exchange"``.
|
||||
:>json object media_type: Reusable media type (see documentation on items), only set on status ``"exchange"``.
|
||||
:>json boolean simulate: Do not actually perform the check-in, only simulate the response. The ``position`` response
|
||||
object will not reflect the simulated changes.
|
||||
|
||||
**Example request**:
|
||||
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
Event Meta Properties
|
||||
=====================
|
||||
|
||||
Resource description
|
||||
--------------------
|
||||
|
||||
An event meta property is used to to define meta information fields for its events.
|
||||
This information can be re-used, for example, in ticket layouts.
|
||||
|
||||
The event meta property resource contains the following public fields:
|
||||
|
||||
.. rst-class:: rest-resource-table
|
||||
|
||||
===================================== ========================== =======================================================
|
||||
Field Type Description
|
||||
===================================== ========================== =======================================================
|
||||
id integer Unique ID for this property
|
||||
name string Name of the property
|
||||
default string Value of the default option
|
||||
required boolean If ``true``, an event can only be taken live if the
|
||||
property is set. In event series, it's always optional
|
||||
to set a value for individual dates
|
||||
protected boolean If ``true``, the value for an event can only be changed
|
||||
by organizer-level administrators
|
||||
filter_public boolean If ``true``, this property will be shown to filter
|
||||
events in the public event list and calendar
|
||||
public_label string Public name of the property
|
||||
filter_allowed boolean If ``true``, this property will be shown to filter
|
||||
events or reports in the backend, and it can also be
|
||||
used for hidden filter parameters in the frontend
|
||||
choices list of objects List of JSON objects representing all permitted values
|
||||
for this property, or ``null`` for no limitation.
|
||||
Each choice object has a required internal name named
|
||||
``key`` and optional public name named ``label``
|
||||
consisting of a dictionary of i18n string translations
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/event_meta_properties/
|
||||
|
||||
Returns a list of all meta properties for the organizer.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
GET /api/v1/organizers/bigevents/meta_properties/ 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": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Color",
|
||||
"default": "blue",
|
||||
"required": false,
|
||||
"protected": false,
|
||||
"filter_public": false,
|
||||
"public_label": {},
|
||||
"filter_allowed": true,
|
||||
"choices": [
|
||||
{
|
||||
"key": "blue",
|
||||
"label": {
|
||||
"en": "Blue"
|
||||
},
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to view this resource.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/event_meta_properties/(id)/
|
||||
|
||||
Returns information on one property, identified by its id.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
GET /api/v1/organizers/bigevents/event_meta_properties/1/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Color",
|
||||
"default": "blue",
|
||||
"required": false,
|
||||
"protected": false,
|
||||
"filter_public": false,
|
||||
"public_label": {},
|
||||
"filter_allowed": true,
|
||||
"choices": null
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer
|
||||
:param id: The ``id`` field of the meta property to retrieve
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to view this resource.
|
||||
|
||||
.. http:post:: /api/v1/organizers/(organizer)/event_meta_properties/
|
||||
|
||||
Creates a new meta property
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
POST /api/v1/organizers/bigevents/event_meta_properties/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"name": "ref-code",
|
||||
"default": "abcde",
|
||||
"required": true,
|
||||
"choices": null
|
||||
}
|
||||
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
{
|
||||
"id": 2,
|
||||
"name": "reference",
|
||||
"default": "abcde",
|
||||
"required": true,
|
||||
"protected": false,
|
||||
"filter_public": false,
|
||||
"public_label": null,
|
||||
"filter_allowed": true,
|
||||
"choices": null
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer
|
||||
:statuscode 201: no error
|
||||
:statuscode 400: The meta property could not be created due to invalid submitted data.
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to create this resource.
|
||||
|
||||
.. http:patch:: /api/v1/organizers/(organizer)/event_meta_properties/(id)/
|
||||
|
||||
Update a meta property. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide
|
||||
all fields of the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the
|
||||
fields that you want to change.
|
||||
|
||||
You can change all fields of the resource except the ``id`` field.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
PATCH /api/v1/organizers/bigevents/event_meta_properties/2/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
Content-Type: application/json
|
||||
Content-Length: 94
|
||||
|
||||
{
|
||||
"required": false
|
||||
}
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Vary: Accept
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"id": 3,
|
||||
"name": "reference",
|
||||
"default": "abcde",
|
||||
"required": false,
|
||||
"protected": false,
|
||||
"filter_public": false,
|
||||
"public_label": null,
|
||||
"filter_allowed": true,
|
||||
"choices": null
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer
|
||||
:param id: The ``id`` field of the meta property to modify
|
||||
:statuscode 200: no error
|
||||
:statuscode 400: The property could not be modified due to invalid submitted data
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to change this resource.
|
||||
|
||||
.. http:delete:: /api/v1/organizers/(organizer)/event_meta_properties/(id)/
|
||||
|
||||
Delete a meta property.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
DELETE /api/v1/organizers/bigevents/event_meta_properties/1/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
HTTP/1.1 204 No Content
|
||||
Vary: Accept
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer
|
||||
:param id: The ``id`` field of the meta property to delete
|
||||
:statuscode 204: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to delete this resource.
|
||||
@@ -110,7 +110,7 @@ Endpoints
|
||||
"plugins": [
|
||||
"pretix.plugins.banktransfer",
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal",
|
||||
"pretix.plugins.paypal2",
|
||||
"pretix.plugins.ticketoutputpdf"
|
||||
],
|
||||
"all_sales_channels": false,
|
||||
@@ -199,7 +199,7 @@ Endpoints
|
||||
"plugins": [
|
||||
"pretix.plugins.banktransfer",
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal",
|
||||
"pretix.plugins.paypal2",
|
||||
"pretix.plugins.ticketoutputpdf"
|
||||
],
|
||||
"valid_keys": {
|
||||
@@ -262,7 +262,7 @@ Endpoints
|
||||
"item_meta_properties": {},
|
||||
"plugins": [
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal"
|
||||
"pretix.plugins.paypal2"
|
||||
],
|
||||
"all_sales_channels": true,
|
||||
"limit_sales_channels": []
|
||||
@@ -299,7 +299,7 @@ Endpoints
|
||||
"item_meta_properties": {},
|
||||
"plugins": [
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal"
|
||||
"pretix.plugins.paypal2"
|
||||
],
|
||||
"all_sales_channels": true,
|
||||
"limit_sales_channels": [],
|
||||
@@ -364,7 +364,7 @@ Endpoints
|
||||
"item_meta_properties": {},
|
||||
"plugins": [
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal"
|
||||
"pretix.plugins.paypal2"
|
||||
],
|
||||
"all_sales_channels": true,
|
||||
"limit_sales_channels": []
|
||||
@@ -401,7 +401,7 @@ Endpoints
|
||||
"item_meta_properties": {},
|
||||
"plugins": [
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal"
|
||||
"pretix.plugins.paypal2"
|
||||
],
|
||||
"all_sales_channels": true,
|
||||
"limit_sales_channels": [],
|
||||
@@ -438,7 +438,7 @@ Endpoints
|
||||
"plugins": [
|
||||
"pretix.plugins.banktransfer",
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal",
|
||||
"pretix.plugins.paypal2",
|
||||
"pretix.plugins.pretixdroid"
|
||||
]
|
||||
}
|
||||
@@ -475,7 +475,7 @@ Endpoints
|
||||
"plugins": [
|
||||
"pretix.plugins.banktransfer",
|
||||
"pretix.plugins.stripe",
|
||||
"pretix.plugins.paypal",
|
||||
"pretix.plugins.paypal2",
|
||||
"pretix.plugins.pretixdroid"
|
||||
],
|
||||
"all_sales_channels": true,
|
||||
|
||||
@@ -12,6 +12,7 @@ at :ref:`plugin-docs`.
|
||||
organizers
|
||||
events
|
||||
subevents
|
||||
event_meta_properties
|
||||
taxrules
|
||||
categories
|
||||
items
|
||||
|
||||
@@ -116,6 +116,7 @@ Endpoints
|
||||
|
||||
:query integer page: The page number in case of a multi-page result set, default is 1
|
||||
:query string code: Only show the voucher with the given voucher code.
|
||||
:query string search: Only show the voucher with the given query found in the code, tag, or comment.
|
||||
:query integer max_usages: Only show vouchers with the given maximal number of usages.
|
||||
:query integer redeemed: Only show vouchers with the given number of redemptions. Note that this doesn't tell you if
|
||||
the voucher can still be redeemed, as this also depends on ``max_usages``. See the
|
||||
|
||||
@@ -83,7 +83,7 @@ Dashboards
|
||||
|
||||
.. automodule:: pretix.control.signals
|
||||
:no-index:
|
||||
:members: event_dashboard_widgets, user_dashboard_widgets, event_dashboard_top
|
||||
:members: event_dashboard_statistics, user_dashboard_widgets, event_dashboard_top
|
||||
|
||||
Ticket designs
|
||||
""""""""""""""
|
||||
|
||||
@@ -49,7 +49,6 @@ const ignores = globalIgnores([
|
||||
'src/pretix/static/pretixcontrol/js/ui/editor.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/geo.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/main.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/plugins.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/subevent.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/variations.js',
|
||||
'src/pretix/static/pretixcontrol/js/ui/webauthn.js',
|
||||
|
||||
Generated
+42
-28
@@ -194,16 +194,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array/node_modules/brace-expansion": {
|
||||
"version": "5.0.4",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
|
||||
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
|
||||
"version": "5.0.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
|
||||
"integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"node": "20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/config-array/node_modules/minimatch": {
|
||||
@@ -294,29 +294,43 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/core": {
|
||||
"version": "0.19.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
||||
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
|
||||
"version": "0.19.2",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
|
||||
"integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@humanfs/types": "^0.15.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/node": {
|
||||
"version": "0.16.7",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
|
||||
"integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
|
||||
"version": "0.16.8",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
|
||||
"integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@humanfs/core": "^0.19.1",
|
||||
"@humanfs/core": "^0.19.2",
|
||||
"@humanfs/types": "^0.15.0",
|
||||
"@humanwhocodes/retry": "^0.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanfs/types": {
|
||||
"version": "0.15.0",
|
||||
"resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
|
||||
"integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=18.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/module-importer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
||||
@@ -1325,16 +1339,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
||||
"version": "5.0.4",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
|
||||
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
|
||||
"version": "5.0.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
|
||||
"integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"node": "20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
||||
@@ -1683,9 +1697,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||
"version": "2.1.7",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
|
||||
"integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2108,16 +2122,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/brace-expansion": {
|
||||
"version": "5.0.4",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
|
||||
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
|
||||
"version": "5.0.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
|
||||
"integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^4.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "18 || 20 || >=22"
|
||||
"node": "20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/eslint-visitor-keys": {
|
||||
@@ -3380,9 +3394,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-selector-parser": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
|
||||
"integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
|
||||
"version": "7.1.5",
|
||||
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
|
||||
"integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -4148,9 +4162,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/smol-toml": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
|
||||
"integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz",
|
||||
"integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
|
||||
+11
-10
@@ -33,14 +33,14 @@ dependencies = [
|
||||
"bleach==6.4.*",
|
||||
"celery==5.6.*",
|
||||
"chardet==5.2.*",
|
||||
"cryptography>=50.0.0",
|
||||
"cryptography>=50.0.1",
|
||||
"css-inline==0.21.*",
|
||||
"defusedcsv>=3.0.0",
|
||||
"dnspython==2.*",
|
||||
"Django[argon2]==5.2.*",
|
||||
"Django[argon2]==5.2.*,>=5.2.17",
|
||||
"django-bootstrap3==26.2",
|
||||
"django-compressor==4.6.0",
|
||||
"django-countries==9.0.*",
|
||||
"django-countries==9.1.*",
|
||||
"django-filter==26.1",
|
||||
"django-formset-js-improved==0.5.0.5",
|
||||
"django-formtools==2.7",
|
||||
@@ -67,7 +67,7 @@ dependencies = [
|
||||
"kombu==5.6.*",
|
||||
"libsass==0.23.*",
|
||||
"lxml",
|
||||
"markdown==3.10.3", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||
"markdown==3.11", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
|
||||
"mt-940==4.30.*",
|
||||
"oauthlib==3.3.*",
|
||||
@@ -75,7 +75,7 @@ dependencies = [
|
||||
"packaging",
|
||||
"paypalrestsdk==1.13.*",
|
||||
"paypal-checkout-serversdk==1.0.*",
|
||||
"PyJWT==2.13.*",
|
||||
"PyJWT==2.15.*",
|
||||
"phonenumberslite==9.0.*",
|
||||
"Pillow==12.3.*",
|
||||
"pretix-plugin-build",
|
||||
@@ -84,7 +84,7 @@ dependencies = [
|
||||
"pycountry",
|
||||
"pycparser==3.0",
|
||||
"pycryptodome==3.23.*",
|
||||
"pypdf==6.5.*",
|
||||
"pypdf==6.19.*",
|
||||
"python-bidi==0.6.*", # Support for Arabic in reportlab
|
||||
"python-dateutil==2.9.*",
|
||||
"pytz",
|
||||
@@ -94,7 +94,7 @@ dependencies = [
|
||||
"redis==7.4.*",
|
||||
"reportlab==5.0.*",
|
||||
"requests==2.34.*",
|
||||
"sentry-sdk==2.68.*",
|
||||
"sentry-sdk==2.70.*",
|
||||
"sepaxml==2.7.*",
|
||||
"stripe==7.9.*",
|
||||
"text-unidecode==1.*",
|
||||
@@ -112,10 +112,10 @@ dev = [
|
||||
"aiohttp==3.14.*",
|
||||
"coverage",
|
||||
"coveralls",
|
||||
"fakeredis==2.37.*",
|
||||
"flake8==7.3.*",
|
||||
"fakeredis==2.38.*",
|
||||
"flake8==7.4.*",
|
||||
"freezegun",
|
||||
"isort==8.0.*",
|
||||
"isort==9.0.*",
|
||||
"pep8-naming==0.15.*",
|
||||
"potypo",
|
||||
"pytest-asyncio>=1.4.0",
|
||||
@@ -129,6 +129,7 @@ dev = [
|
||||
"pytest==9.1.*",
|
||||
"playwright",
|
||||
"responses",
|
||||
"pypdfium2"
|
||||
]
|
||||
|
||||
[project.entry-points."distutils.commands"]
|
||||
|
||||
@@ -26,7 +26,6 @@ ignore =
|
||||
src/tests/plugins/*
|
||||
src/tests/plugins/badges/*
|
||||
src/tests/plugins/banktransfer/*
|
||||
src/tests/plugins/paypal/*
|
||||
src/tests/plugins/paypal2/*
|
||||
src/tests/plugins/pretixdroid/*
|
||||
src/tests/plugins/stripe/*
|
||||
|
||||
@@ -30,3 +30,5 @@ npminstall:
|
||||
npmbuild:
|
||||
npm run build
|
||||
|
||||
licenseheaders:
|
||||
licenseheaders -t ../.licenseheader -E .py -x "*/migrations/*.py"
|
||||
@@ -19,4 +19,4 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
__version__ = "2026.8.0.dev0"
|
||||
__version__ = "2026.9.0.dev0"
|
||||
|
||||
@@ -19,13 +19,12 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
from django.dispatch import receiver
|
||||
|
||||
from pretix.base.signals import register_payment_providers
|
||||
def get_session_key_for_api_auth(user, auth):
|
||||
if user.is_authenticated:
|
||||
return f'api-upload-User-{user.pk}'
|
||||
else:
|
||||
return f'api-upload-{str(type(auth))}-{auth.pk}'
|
||||
|
||||
|
||||
@receiver(register_payment_providers, dispatch_uid="payment_paypal")
|
||||
def register_payment_provider(sender, **kwargs):
|
||||
from .payment import Paypal
|
||||
return Paypal
|
||||
def get_session_key_for_api_request(request):
|
||||
return get_session_key_for_api_auth(request.user, request.auth)
|
||||
@@ -101,6 +101,10 @@ class OAuthAccessToken(AbstractAccessToken):
|
||||
self.expires = now() - timedelta(hours=1)
|
||||
self.save(update_fields=['expires'])
|
||||
|
||||
def is_valid(self, scopes=None):
|
||||
# Can maybe be removed after upgrading django-oauth-toolkit to 3.4.1
|
||||
return super().is_valid(scopes) and self.application.is_usable(None)
|
||||
|
||||
|
||||
class OAuthRefreshToken(AbstractRefreshToken):
|
||||
application = models.ForeignKey(
|
||||
|
||||
@@ -37,6 +37,8 @@ from collections import OrderedDict
|
||||
from django.core.exceptions import ValidationError
|
||||
from rest_framework import serializers
|
||||
|
||||
from pretix.api.auth.utils import get_session_key_for_api_request
|
||||
|
||||
|
||||
def remove_duplicates_from_list(data):
|
||||
return list(OrderedDict.fromkeys(data))
|
||||
@@ -83,10 +85,16 @@ class UploadedFileField(serializers.Field):
|
||||
request = self.context.get('request', None)
|
||||
try:
|
||||
cf = CachedFile.objects.get(
|
||||
session_key=f'api-upload-{str(type(request.user or request.auth))}-{(request.user or request.auth).pk}',
|
||||
file__isnull=False,
|
||||
pk=data[len("file:"):],
|
||||
)
|
||||
if cf.session_key == "api-upload-<class 'django.contrib.auth.models.AnonymousUser'>-None":
|
||||
# OK, backwards-compatibility of a security bug fixed 2026-09, delete this at some point, but should
|
||||
# also be harmless because all files with this key are expired one day after deployment of this fix
|
||||
# and no new files with this key are created
|
||||
pass
|
||||
elif cf.session_key != get_session_key_for_api_request(request):
|
||||
self.fail('not_found')
|
||||
except (ValidationError, IndexError): # invalid uuid
|
||||
self.fail('not_found')
|
||||
except CachedFile.DoesNotExist:
|
||||
|
||||
@@ -41,6 +41,7 @@ from rest_framework.exceptions import ValidationError
|
||||
from rest_framework.relations import SlugRelatedField
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from pretix.api.auth.utils import get_session_key_for_api_request
|
||||
from pretix.api.serializers import CompatDecimalField, CompatibleJSONField
|
||||
from pretix.api.serializers.event import SubEventSerializer
|
||||
from pretix.api.serializers.forms import form_field_to_serializer_field
|
||||
@@ -258,16 +259,21 @@ class AnswerSerializer(I18nAwareModelSerializer):
|
||||
if data['answer'] == 'file:keep':
|
||||
return data
|
||||
try:
|
||||
ao = self.context["request"].user or self.context["request"].auth
|
||||
cf = CachedFile.objects.get(
|
||||
session_key=f'api-upload-{str(type(ao))}-{ao.pk}',
|
||||
file__isnull=False,
|
||||
pk=data['answer'][len("file:"):],
|
||||
)
|
||||
if cf.session_key == "api-upload-<class 'django.contrib.auth.models.AnonymousUser'>-None":
|
||||
# OK, backwards-compatibility of a security bug fixed 2026-09, delete this at some point, but should
|
||||
# also be harmless because all files with this key are expired one day after deployment of this fix
|
||||
# and no new files with this key are created
|
||||
pass
|
||||
elif cf.session_key != get_session_key_for_api_request(self.context["request"]):
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data['answer']))
|
||||
except (ValidationError, IndexError): # invalid uuid
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data))
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data['answer']))
|
||||
except CachedFile.DoesNotExist:
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data))
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data['answer']))
|
||||
|
||||
allowed_types = (
|
||||
'image/png', 'image/jpeg', 'image/gif', 'application/pdf'
|
||||
|
||||
@@ -28,6 +28,7 @@ from django.db import transaction
|
||||
from django.db.models import Q
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.translation import gettext, gettext_lazy as _
|
||||
from i18nfield.rest_framework import I18nField
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
@@ -40,9 +41,10 @@ from pretix.api.serializers.settings import SettingsSerializer
|
||||
from pretix.base.auth import get_auth_backends
|
||||
from pretix.base.i18n import get_language_without_region
|
||||
from pretix.base.models import (
|
||||
Customer, Device, GiftCard, GiftCardAcceptance, GiftCardTransaction,
|
||||
Membership, MembershipType, OrderPosition, Organizer, ReusableMedium,
|
||||
SalesChannel, SeatingPlan, Team, TeamAPIToken, TeamInvite, User,
|
||||
Customer, Device, EventMetaProperty, GiftCard, GiftCardAcceptance,
|
||||
GiftCardTransaction, Membership, MembershipType, OrderPosition, Organizer,
|
||||
ReusableMedium, SalesChannel, SeatingPlan, Team, TeamAPIToken, TeamInvite,
|
||||
User,
|
||||
)
|
||||
from pretix.base.models.seating import SeatingPlanLayoutValidator
|
||||
from pretix.base.permissions import (
|
||||
@@ -640,3 +642,88 @@ class OrganizerSettingsSerializer(SettingsSerializer):
|
||||
)
|
||||
# TODO: make sure pub is always correct
|
||||
return 'pub/' + fname
|
||||
|
||||
|
||||
class MetaPropertyListField(serializers.ListField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs["validators"] = kwargs.pop("validators", [])
|
||||
|
||||
def validate_keys_unique(choices):
|
||||
if not choices:
|
||||
return
|
||||
keys = [c.get("key") for c in choices]
|
||||
if len(set(keys)) < len(keys):
|
||||
raise ValidationError("The key for each meta property value option must be unique.")
|
||||
|
||||
kwargs["validators"].append(
|
||||
validate_keys_unique
|
||||
)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
|
||||
class MetaPropertyDictField(serializers.DictField):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.label_child = kwargs.pop("label_child", I18nField())
|
||||
super().__init__(**kwargs)
|
||||
|
||||
def to_representation(self, value):
|
||||
# django added unneccessary keys DELETE, ORDER through formsets, filter them here for backwards compat
|
||||
d = {
|
||||
"key": value["key"]
|
||||
}
|
||||
if "label" in value:
|
||||
d["label"] = self.label_child.to_representation(value["label"])
|
||||
|
||||
return super().to_representation(d)
|
||||
|
||||
def to_internal_value(self, data):
|
||||
if not isinstance(data, dict):
|
||||
raise ValidationError("Meta property value options must be a dict.")
|
||||
|
||||
if not isinstance(data.get("key"), str):
|
||||
raise ValidationError("Meta property value options must have a key of type string.")
|
||||
|
||||
if any(k not in {"key", "label"} for k in data.keys()):
|
||||
raise ValidationError("Meta property value options may only have a key and optionally a label.")
|
||||
|
||||
if "label" in data:
|
||||
try:
|
||||
data["label"] = self.label_child.to_internal_value(data["label"])
|
||||
except ValidationError as e:
|
||||
raise ValidationError({"label": e.detail})
|
||||
|
||||
return super().to_internal_value(data)
|
||||
|
||||
|
||||
class EventMetaPropertiesSerializer(I18nAwareModelSerializer):
|
||||
choices = MetaPropertyListField(
|
||||
child=MetaPropertyDictField(
|
||||
label_child=I18nField()
|
||||
),
|
||||
allow_null=True,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = EventMetaProperty
|
||||
fields = (
|
||||
'id', 'name', 'default', 'required', 'protected', 'filter_public', 'public_label', 'filter_allowed',
|
||||
'choices'
|
||||
)
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
|
||||
full_data.update(data)
|
||||
|
||||
choices = full_data.get("choices")
|
||||
default = full_data.get("default")
|
||||
if choices and default:
|
||||
choice_keys = [c.get("key") for c in choices]
|
||||
if default not in choice_keys:
|
||||
raise ValidationError("You cannot set a default value that is not a valid value.")
|
||||
|
||||
if not choices and "choices" in data:
|
||||
# normalize empty dict to None
|
||||
data["choices"] = None
|
||||
return data
|
||||
|
||||
@@ -68,6 +68,7 @@ orga_router.register(r'scheduled_exports', exporters.ScheduledOrganizerExportVie
|
||||
orga_router.register(r'exporters', exporters.OrganizerExportersViewSet, basename='exporters')
|
||||
orga_router.register(r'transactions', order.OrganizerTransactionViewSet)
|
||||
orga_router.register(r'orderpositions', order.OrganizerOrderPositionViewSet, basename='orderpositions')
|
||||
orga_router.register(r'event_meta_properties', organizer.EventMetaPropertiesViewSet)
|
||||
|
||||
team_router = routers.DefaultRouter()
|
||||
team_router.register(r'members', organizer.TeamMemberViewSet)
|
||||
|
||||
@@ -50,6 +50,7 @@ from rest_framework.generics import ListAPIView
|
||||
from rest_framework.permissions import SAFE_METHODS
|
||||
from rest_framework.response import Response
|
||||
|
||||
from pretix.api.auth.utils import get_session_key_for_api_auth
|
||||
from pretix.api.serializers.checkin import (
|
||||
CheckinListSerializer, CheckinRPCAnnulInputSerializer,
|
||||
CheckinRPCRedeemInputSerializer, MiniCheckinListSerializer,
|
||||
@@ -331,10 +332,16 @@ with scopes_disabled():
|
||||
def _handle_file_upload(data, user, auth):
|
||||
try:
|
||||
cf = CachedFile.objects.get(
|
||||
session_key=f'api-upload-{str(type(user or auth))}-{(user or auth).pk}',
|
||||
file__isnull=False,
|
||||
pk=data[len("file:"):],
|
||||
)
|
||||
if cf.session_key == "api-upload-<class 'django.contrib.auth.models.AnonymousUser'>-None":
|
||||
# OK, backwards-compatibility of a security bug fixed 2026-09, delete this at some point, but should
|
||||
# also be harmless because all files with this key are expired one day after deployment of this fix
|
||||
# and no new files with this key are created
|
||||
pass
|
||||
elif cf.session_key != get_session_key_for_api_auth(user, auth):
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data))
|
||||
except (ValidationError, BaseValidationError, IndexError): # invalid uuid
|
||||
raise ValidationError('The submitted file ID "{fid}" was not found.'.format(fid=data))
|
||||
except CachedFile.DoesNotExist:
|
||||
|
||||
@@ -44,15 +44,16 @@ from pretix.api.models import OAuthAccessToken
|
||||
from pretix.api.pagination import TotalOrderingFilter
|
||||
from pretix.api.serializers.organizer import (
|
||||
CustomerCreateSerializer, CustomerSerializer, DeviceSerializer,
|
||||
GiftCardSerializer, GiftCardTransactionSerializer, MembershipSerializer,
|
||||
EventMetaPropertiesSerializer, GiftCardSerializer,
|
||||
GiftCardTransactionSerializer, MembershipSerializer,
|
||||
MembershipTypeSerializer, OrganizerSerializer, OrganizerSettingsSerializer,
|
||||
SalesChannelSerializer, SeatingPlanSerializer, TeamAPITokenSerializer,
|
||||
TeamInviteSerializer, TeamMemberSerializer, TeamSerializer,
|
||||
)
|
||||
from pretix.base.models import (
|
||||
Customer, Device, Event, GiftCard, GiftCardTransaction, LogEntry,
|
||||
Membership, MembershipType, Organizer, SalesChannel, SeatingPlan, Team,
|
||||
TeamAPIToken, TeamInvite, User,
|
||||
Customer, Device, Event, EventMetaProperty, GiftCard, GiftCardTransaction,
|
||||
LogEntry, Membership, MembershipType, Organizer, SalesChannel, SeatingPlan,
|
||||
Team, TeamAPIToken, TeamInvite, User,
|
||||
)
|
||||
from pretix.base.plugins import (
|
||||
PLUGIN_LEVEL_EVENT, PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID,
|
||||
@@ -846,3 +847,49 @@ class SalesChannelViewSet(viewsets.ModelViewSet):
|
||||
data={'id': instance.pk}
|
||||
)
|
||||
instance.delete()
|
||||
|
||||
|
||||
class EventMetaPropertiesViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = EventMetaPropertiesSerializer
|
||||
queryset = EventMetaProperty.objects.none()
|
||||
write_permission = 'organizer.settings.general:write'
|
||||
|
||||
def get_queryset(self):
|
||||
return self.request.organizer.meta_properties.all()
|
||||
|
||||
def get_serializer_context(self):
|
||||
ctx = super().get_serializer_context()
|
||||
ctx['organizer'] = self.request.organizer
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.log_action(
|
||||
'pretix.property.deleted',
|
||||
user=self.request.user,
|
||||
auth=self.request.auth,
|
||||
data={'id': instance.pk}
|
||||
)
|
||||
instance.delete()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
inst = serializer.save(organizer_id=self.request.organizer.pk)
|
||||
serializer.instance.log_action(
|
||||
'pretix.property.created',
|
||||
user=self.request.user,
|
||||
auth=self.request.auth,
|
||||
data=self.request.data,
|
||||
)
|
||||
return inst
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
inst = serializer.save(organizer_id=self.request.organizer.pk)
|
||||
serializer.instance.log_action(
|
||||
'pretix.property.changed',
|
||||
user=self.request.user,
|
||||
auth=self.request.auth,
|
||||
data=self.request.data,
|
||||
)
|
||||
return inst
|
||||
|
||||
@@ -33,6 +33,7 @@ from rest_framework.views import APIView
|
||||
from pretix.api.auth.device import DeviceTokenAuthentication
|
||||
from pretix.api.auth.permission import AnyAuthenticatedClientPermission
|
||||
from pretix.api.auth.token import TeamTokenAuthentication
|
||||
from pretix.api.auth.utils import get_session_key_for_api_request
|
||||
from pretix.base.models import CachedFile
|
||||
from pretix.helpers.images import (
|
||||
IMAGE_TYPES, validate_uploaded_file_for_valid_image,
|
||||
@@ -78,7 +79,7 @@ class UploadView(APIView):
|
||||
web_download=False,
|
||||
filename=file_obj.name,
|
||||
type=content_type,
|
||||
session_key=f'api-upload-{str(type(request.user or request.auth))}-{(request.user or request.auth).pk}'
|
||||
session_key=get_session_key_for_api_request(request)
|
||||
)
|
||||
cf.file.save(file_obj.name, file_obj)
|
||||
cf.save()
|
||||
|
||||
@@ -40,6 +40,7 @@ with scopes_disabled():
|
||||
class VoucherFilter(FilterSet):
|
||||
active = BooleanFilter(method='filter_active')
|
||||
code = CharFilter(lookup_expr='iexact')
|
||||
search = CharFilter(method='search_qs')
|
||||
|
||||
class Meta:
|
||||
model = Voucher
|
||||
@@ -54,6 +55,9 @@ with scopes_disabled():
|
||||
return queryset.filter(Q(redeemed__gte=F('max_usages')) |
|
||||
(Q(valid_until__isnull=False) & Q(valid_until__lte=now())))
|
||||
|
||||
def search_qs(self, qs, name, value):
|
||||
return qs.filter(Q(code__icontains=value) | Q(tag__icontains=value) | Q(comment__icontains=value))
|
||||
|
||||
|
||||
class VoucherViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = VoucherSerializer
|
||||
|
||||
@@ -27,7 +27,7 @@ from datetime import timedelta
|
||||
from functools import cached_property
|
||||
from typing import List, Optional, Protocol
|
||||
|
||||
import sentry_sdk
|
||||
from django.conf import settings
|
||||
from django.db import DatabaseError, transaction
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
@@ -236,7 +236,9 @@ class OutboundSyncProvider:
|
||||
# model changes saved by set_sync_error / clear_in_flight calls below
|
||||
if sq.failed_attempts >= self.max_attempts:
|
||||
logger.exception('Failed to sync order (max attempts exceeded)')
|
||||
sentry_sdk.capture_exception(e)
|
||||
if settings.SENTRY_ENABLED:
|
||||
import sentry_sdk
|
||||
sentry_sdk.capture_exception(e)
|
||||
sq.set_sync_error("exceeded", e.messages, e.full_message)
|
||||
else:
|
||||
logger.info(
|
||||
@@ -247,7 +249,9 @@ class OutboundSyncProvider:
|
||||
sq.clear_in_flight()
|
||||
except Exception as e:
|
||||
logger.exception('Failed to sync order (unhandled exception)')
|
||||
sentry_sdk.capture_exception(e)
|
||||
if settings.SENTRY_ENABLED:
|
||||
import sentry_sdk
|
||||
sentry_sdk.capture_exception(e)
|
||||
sq.set_sync_error("internal", [], str(e))
|
||||
|
||||
@cached_property
|
||||
|
||||
@@ -54,6 +54,7 @@ from ...control.forms.filter import get_all_payment_providers
|
||||
from ...helpers import GroupConcat
|
||||
from ...helpers.iter import chunked_iterable
|
||||
from ..exporter import BaseExporter, MultiSheetListExporter
|
||||
from ..invoicing.transmission import get_transmission_types
|
||||
from ..services.export import ExportError
|
||||
from ..services.invoices import invoice_pdf_task
|
||||
from ..signals import (
|
||||
@@ -197,7 +198,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter):
|
||||
def iterate_sheet(self, form_data, sheet):
|
||||
_ = gettext
|
||||
if sheet == 'invoices':
|
||||
yield [
|
||||
headers = [
|
||||
_('Invoice number'),
|
||||
_('Date'),
|
||||
_('Order code'),
|
||||
@@ -230,8 +231,18 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter):
|
||||
_('Total value (without taxes)'),
|
||||
_('Payment matching IDs'),
|
||||
_('Payment providers'),
|
||||
_('Transmission type'),
|
||||
_('Transmission status'),
|
||||
_('Transmission date'),
|
||||
]
|
||||
|
||||
transmission_types = get_transmission_types()
|
||||
for tt in transmission_types:
|
||||
for c in tt.describe_info_columns():
|
||||
headers.append(str(tt.verbose_name) + ': ' + str(c))
|
||||
|
||||
yield headers
|
||||
|
||||
p_providers = OrderPayment.objects.filter(
|
||||
order=OuterRef('order'),
|
||||
state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED,
|
||||
@@ -242,7 +253,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter):
|
||||
'm'
|
||||
).order_by()
|
||||
|
||||
base_qs = self.invoices_queryset(form_data)\
|
||||
base_qs = self.invoices_queryset(form_data)
|
||||
|
||||
qs = base_qs.select_related(
|
||||
'order', 'refers'
|
||||
@@ -280,7 +291,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter):
|
||||
if mid:
|
||||
pmis.append(mid)
|
||||
pmi = '\n'.join(pmis)
|
||||
yield [
|
||||
line = [
|
||||
i.full_invoice_no,
|
||||
date_format(i.date, "SHORT_DATE_FORMAT"),
|
||||
i.order.code,
|
||||
@@ -315,8 +326,20 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter):
|
||||
', '.join([
|
||||
str(self.providers.get(p, p)) for p in sorted(set((i.payment_providers or '').split(',')))
|
||||
if p and p != 'free'
|
||||
])
|
||||
]),
|
||||
i.transmission_type_instance.verbose_name,
|
||||
i.get_transmission_status_display(),
|
||||
date_format(i.transmission_date, "SHORT_DATETIME_FORMAT") if i.transmission_date else "",
|
||||
]
|
||||
for tt in transmission_types:
|
||||
if tt.identifier == i.transmission_type:
|
||||
described = dict(tt.describe_info(i.invoice_to_transmission_info, i.invoice_to_country, i.invoice_to_is_business))
|
||||
for c in tt.describe_info_columns():
|
||||
line.append(described.get(c, ""))
|
||||
else:
|
||||
for c in tt.describe_info_columns():
|
||||
line.append("")
|
||||
yield line
|
||||
elif sheet == 'lines':
|
||||
yield [
|
||||
_('Invoice number'),
|
||||
|
||||
@@ -350,16 +350,22 @@ class WrappedPhonePrefixSelect(Select):
|
||||
return super().render(name, value or self.initial, *args, **kwargs)
|
||||
|
||||
def get_context(self, name, value, attrs):
|
||||
if value and self.choices[1][0] != value:
|
||||
matching_choices = len([1 for p, c in self.choices if p == value])
|
||||
# self.choices is lazy evaluated, needs to be realized to be modifiable
|
||||
choices = list(self.choices)
|
||||
if value and choices[1][0] != value:
|
||||
matching_choices = len([1 for p, c in choices if p == value])
|
||||
if matching_choices > 1:
|
||||
# Some countries share a phone prefix, for example +1 is used all over the Americas.
|
||||
# This causes a UX problem: If the default value or the existing data is +12125552368,
|
||||
# the widget will just show the first <option> entry with value="+1" as selected,
|
||||
# which alphabetically is America Samoa, although most numbers statistically are from
|
||||
# the US. As a workaround, we detect this case and add an aditional choice value with
|
||||
# the US. As a workaround, we detect this case and add an additional choice value with
|
||||
# just <option value="+1">+1</option> without an explicit country.
|
||||
self.choices.insert(1, (value, value))
|
||||
self.choices = [
|
||||
choices[0],
|
||||
(value, value),
|
||||
*choices[1:],
|
||||
]
|
||||
context = super().get_context(name, value, attrs)
|
||||
return context
|
||||
|
||||
@@ -594,12 +600,16 @@ class PortraitImageField(SizeValidationMixin, ExtValidationMixin, forms.FileFiel
|
||||
image = ImageOps.exif_transpose(image)
|
||||
|
||||
if f._cropdata:
|
||||
image = image.crop((
|
||||
f._cropdata.get('x', 0),
|
||||
f._cropdata.get('y', 0),
|
||||
f._cropdata.get('x', 0) + f._cropdata.get('width', image.width),
|
||||
f._cropdata.get('y', 0) + f._cropdata.get('height', image.height),
|
||||
))
|
||||
left = int(f._cropdata.get('x', 0))
|
||||
top = int(f._cropdata.get('y', 0))
|
||||
right = left + int(f._cropdata.get('width', image.width))
|
||||
bottom = top + int(f._cropdata.get('height', image.height))
|
||||
if left >= image.width or top >= image.height or right > image.width or bottom > image.height:
|
||||
raise ValidationError(
|
||||
self.error_messages['max_dimension'],
|
||||
code='max_dimension',
|
||||
)
|
||||
image = image.crop((left, top, right, bottom))
|
||||
with BytesIO() as output:
|
||||
# This might use a lot of memory, but temporary files are not a good option since
|
||||
# we don't control the cleanup
|
||||
@@ -1196,8 +1206,9 @@ class TicketLevelQuestionsForm(BaseQuestionsForm):
|
||||
return field
|
||||
|
||||
def clean(self):
|
||||
from pretix.base.addressvalidation import \
|
||||
validate_address # local import to prevent impact on startup time
|
||||
from pretix.base.addressvalidation import ( # local import to prevent impact on startup time
|
||||
validate_address,
|
||||
)
|
||||
|
||||
d = super().clean()
|
||||
|
||||
@@ -1438,8 +1449,9 @@ class BaseInvoiceAddressForm(forms.ModelForm):
|
||||
self.fields['transmission_type'].widget.attrs['data-trigger-address-info'] = 'on'
|
||||
|
||||
def clean(self):
|
||||
from pretix.base.addressvalidation import \
|
||||
validate_address # local import to prevent impact on startup time
|
||||
from pretix.base.addressvalidation import ( # local import to prevent impact on startup time
|
||||
validate_address,
|
||||
)
|
||||
|
||||
data = self.cleaned_data
|
||||
|
||||
@@ -1493,7 +1505,7 @@ class BaseInvoiceAddressForm(forms.ModelForm):
|
||||
"vat_id": _("This field is required.")
|
||||
})
|
||||
|
||||
if self.validate_vat_id and self.instance.vat_id_validated and 'vat_id' not in self.changed_data:
|
||||
if self.validate_vat_id and self.instance.vat_id_validated and not any(v in self.changed_data for v in ('is_business', 'vat_id', 'country')):
|
||||
pass # Skip re-validation if it is validated
|
||||
elif self.validate_vat_id and vat_id_applicable:
|
||||
try:
|
||||
|
||||
@@ -82,8 +82,8 @@ class UserSettingsForm(forms.ModelForm):
|
||||
class User2FADeviceAddForm(forms.Form):
|
||||
name = forms.CharField(label=_('Device name'), max_length=64)
|
||||
devicetype = forms.ChoiceField(label=_('Device type'), widget=forms.RadioSelect, choices=(
|
||||
('totp', _('Smartphone with the Authenticator application')),
|
||||
('webauthn', _('WebAuthn-compatible hardware token (e.g. Yubikey)')),
|
||||
('otp_totp.totpdevice', _('Smartphone with the Authenticator application')),
|
||||
('pretixbase.webauthndevice', _('WebAuthn-compatible hardware token (e.g. Yubikey)')),
|
||||
))
|
||||
|
||||
|
||||
|
||||
@@ -71,8 +71,8 @@ class EmailTransmissionType(TransmissionType):
|
||||
|
||||
def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
|
||||
return {
|
||||
"transmission_email_other": bool(transmission_info.get("transmission_email_address")),
|
||||
"transmission_email_address": transmission_info.get("transmission_email_address"),
|
||||
"transmission_email_other": bool((transmission_info or {}).get("transmission_email_address")),
|
||||
"transmission_email_address": (transmission_info or {}).get("transmission_email_address"),
|
||||
}
|
||||
|
||||
def form_data_to_transmission_info(self, form_data: dict) -> dict:
|
||||
|
||||
@@ -107,6 +107,9 @@ class TransmissionType:
|
||||
def transmission_info_to_form_data(self, transmission_info: dict) -> dict:
|
||||
return transmission_info
|
||||
|
||||
def describe_info_columns(self):
|
||||
return [f.label for f in self.invoice_address_form_fields.values()]
|
||||
|
||||
def describe_info(self, transmission_info: dict, country: Country, is_business: bool):
|
||||
form_data = self.transmission_info_to_form_data(transmission_info)
|
||||
data = []
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
# Generated by Django 5.2.17 on 2026-09-21 11:30
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
def fix_unshredded_invoices(apps, _):
|
||||
Invoice = apps.get_model("pretixbase", "Invoice")
|
||||
InvoiceLine = apps.get_model("pretixbase", "InvoiceLine")
|
||||
ignore_fields = (
|
||||
# bool/int fields are not listed and skipped automatically
|
||||
'prefix', 'invoice_no', 'full_invoice_no', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode',
|
||||
'invoice_from_city', 'invoice_from_state', 'invoice_from_country', 'invoice_from_tax_id',
|
||||
'invoice_from_vat_id', 'locale', 'payment_provider_stamp', 'footer_text', 'foreign_currency_display',
|
||||
'foreign_currency_source', 'transmission_type', 'transmission_provider', 'transmission_status',
|
||||
)
|
||||
|
||||
for i in Invoice.objects.filter(shredded=True):
|
||||
for f in Invoice._meta.fields:
|
||||
if f.name in ignore_fields:
|
||||
continue
|
||||
val = getattr(i, f.name, None)
|
||||
if val and isinstance(val, str):
|
||||
setattr(i, f.name, "█")
|
||||
elif val and isinstance(val, list): # jsonfield
|
||||
setattr(i, f.name, [])
|
||||
elif val and isinstance(val, dict): # jsonfield
|
||||
setattr(i, f.name, {"_shredded": True})
|
||||
i.save()
|
||||
|
||||
InvoiceLine.objects.filter(
|
||||
attendee_name__isnull=False,
|
||||
invoice__shredded=True
|
||||
).update(attendee_name="█")
|
||||
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("pretixbase", "0310_question_valid_string_length_min"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(
|
||||
fix_unshredded_invoices,
|
||||
migrations.RunPython.noop,
|
||||
),
|
||||
]
|
||||
@@ -166,6 +166,7 @@ class Device(LoggedModel):
|
||||
)
|
||||
security_profile = models.CharField(
|
||||
max_length=190,
|
||||
verbose_name=_('Security profile'),
|
||||
default='full',
|
||||
null=True,
|
||||
blank=False
|
||||
|
||||
@@ -1050,10 +1050,8 @@ class Item(LoggedModel):
|
||||
|
||||
replace_year = valid_until.year
|
||||
replace_month = valid_until.month + self.validity_dynamic_duration_months
|
||||
|
||||
while replace_month > 12:
|
||||
replace_month -= 12
|
||||
replace_year += 1
|
||||
replace_year += (replace_month - 1) // 12
|
||||
replace_month = ((replace_month - 1) % 12) + 1
|
||||
max_day = calendar.monthrange(replace_year, replace_month)[1]
|
||||
replace_date = date(
|
||||
year=replace_year,
|
||||
|
||||
+41
-35
@@ -801,6 +801,18 @@ def generate_compressed_addon_list(op, order, event, only_checked_in=False):
|
||||
return addonlist
|
||||
|
||||
|
||||
def get_sizebox(page: pypdf.PageObject):
|
||||
mediabox = page.mediabox
|
||||
cropbox = page.cropbox
|
||||
|
||||
return pypdf.generic.RectangleObject((
|
||||
max(mediabox[0], cropbox[0]),
|
||||
max(mediabox[1], cropbox[1]),
|
||||
min(mediabox[2], cropbox[2]),
|
||||
min(mediabox[3], cropbox[3]),
|
||||
))
|
||||
|
||||
|
||||
class Renderer:
|
||||
|
||||
def __init__(self, event, layout, background_file):
|
||||
@@ -1079,7 +1091,7 @@ class Renderer:
|
||||
fontsize = float(o['fontsize'])
|
||||
height = float(o['height']) * mm
|
||||
width = float(o['width']) * mm
|
||||
while True:
|
||||
for _i in range(25): # try adapting the font size at most 25 times
|
||||
p, ad, lineheight = self._text_paragraph(op, order, o, override_fontsize=fontsize)
|
||||
w, h = p.wrapOn(canvas, width, 1000 * mm)
|
||||
widths = p.getActualLineWidths0()
|
||||
@@ -1153,11 +1165,10 @@ class Renderer:
|
||||
elif o['type'] == "poweredby":
|
||||
self._draw_poweredby(canvas, op, o)
|
||||
if self.bg_pdf:
|
||||
page_size = (
|
||||
self.bg_pdf.pages[0].mediabox[2] - self.bg_pdf.pages[0].mediabox[0],
|
||||
self.bg_pdf.pages[0].mediabox[3] - self.bg_pdf.pages[0].mediabox[1]
|
||||
)
|
||||
if self.bg_pdf.pages[0].get('/Rotate') in (90, 270):
|
||||
first_page = self.bg_pdf.pages[0]
|
||||
sizebox = get_sizebox(first_page)
|
||||
page_size = (sizebox.width, sizebox.height)
|
||||
if first_page.rotation in (90, 270):
|
||||
# swap dimensions due to pdf being rotated
|
||||
page_size = page_size[::-1]
|
||||
canvas.setPageSize(page_size)
|
||||
@@ -1232,9 +1243,7 @@ class Renderer:
|
||||
|
||||
for i, page in enumerate(fg_pdf.pages):
|
||||
bg_page = self.bg_pdf.pages[i]
|
||||
_correct_page_media_box(bg_page)
|
||||
page.merge_page(bg_page, over=False)
|
||||
output.add_page(page)
|
||||
_merge_with_correct_page_media_box(output, page, bg_page)
|
||||
|
||||
# pdf_header is a string like "%pdf-X.X"
|
||||
if float(self.bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
|
||||
@@ -1299,39 +1308,36 @@ def merge_background(fg_pdf: PdfWriter, bg_pdf: PdfWriter, out_file, compress):
|
||||
bg_pdf.write(bg_filename)
|
||||
subprocess.run(pdftk_cmd, check=True, stdout=out_file)
|
||||
else:
|
||||
output = PdfWriter()
|
||||
for i, page in enumerate(fg_pdf.pages):
|
||||
bg_page = bg_pdf.pages[i]
|
||||
_correct_page_media_box(bg_page)
|
||||
page.merge_page(bg_page, over=False)
|
||||
_merge_with_correct_page_media_box(output, page, bg_page)
|
||||
|
||||
# pdf_header is a string like "%pdf-X.X"
|
||||
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:]):
|
||||
fg_pdf.pdf_header = bg_pdf.pdf_header
|
||||
|
||||
fg_pdf.write(out_file)
|
||||
output.pdf_header = (
|
||||
bg_pdf.pdf_header
|
||||
if float(bg_pdf.pdf_header[5:]) > float(fg_pdf.pdf_header[5:])
|
||||
else fg_pdf.pdf_header
|
||||
)
|
||||
output.write(out_file)
|
||||
|
||||
|
||||
def _correct_page_media_box(page: pypdf.PageObject):
|
||||
if page.rotation != 0:
|
||||
page.transfer_rotation_to_content()
|
||||
media_box = page.mediabox
|
||||
def _merge_with_correct_page_media_box(output: pypdf.PdfWriter, fg_page: pypdf.PageObject, bg_page: pypdf.PageObject):
|
||||
"""
|
||||
Adds fg_page to output, merging bg_page behind it.
|
||||
|
||||
If bg_page has a non-zero mergebox/cropbox or is rotated via /Rotate, a transformation is applied to fix this."""
|
||||
trsf = pypdf.Transformation()
|
||||
if media_box.bottom != 0:
|
||||
trsf = trsf.translate(0, -media_box.bottom)
|
||||
if media_box.left != 0:
|
||||
trsf = trsf.translate(-media_box.left, 0)
|
||||
page.add_transformation(trsf, False)
|
||||
for b in ["/MediaBox", "/CropBox", "/BleedBox", "/TrimBox", "/ArtBox"]:
|
||||
if b in page:
|
||||
rr = pypdf.generic.RectangleObject(page[b])
|
||||
pt1 = trsf.apply_on(rr.lower_left)
|
||||
pt2 = trsf.apply_on(rr.upper_right)
|
||||
page[pypdf.generic.NameObject(b)] = pypdf.generic.RectangleObject((
|
||||
min(pt1[0], pt2[0]),
|
||||
min(pt1[1], pt2[1]),
|
||||
max(pt1[0], pt2[0]),
|
||||
max(pt1[1], pt2[1]),
|
||||
))
|
||||
if bg_page.rotation != 0:
|
||||
trsf = trsf.rotate(-bg_page.rotation)
|
||||
|
||||
mb = get_sizebox(bg_page)
|
||||
pt1 = trsf.apply_on(mb.lower_left)
|
||||
pt2 = trsf.apply_on(mb.upper_right)
|
||||
trsf = trsf.translate(-min(pt1[0], pt2[0]), -min(pt1[1], pt2[1]))
|
||||
|
||||
fg_page = output.add_page(fg_page)
|
||||
fg_page.merge_transformed_page(bg_page, trsf, over=False, expand=False)
|
||||
|
||||
|
||||
@deconstructible
|
||||
|
||||
@@ -54,7 +54,7 @@ from celery.exceptions import MaxRetriesExceededError
|
||||
from django.conf import settings
|
||||
from django.core.files.storage import default_storage
|
||||
from django.core.mail import EmailMultiAlternatives, SafeMIMEMultipart
|
||||
from django.core.mail.message import SafeMIMEText
|
||||
from django.core.mail.message import SafeMIMEText, utf8_charset_qp
|
||||
from django.db import connection, transaction
|
||||
from django.db.models import Q
|
||||
from django.dispatch import receiver
|
||||
@@ -380,6 +380,8 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
||||
|
||||
|
||||
class CustomEmail(EmailMultiAlternatives):
|
||||
encoding = utf8_charset_qp
|
||||
|
||||
def _create_mime_attachment(self, content, mimetype):
|
||||
"""
|
||||
Convert the content, mimetype pair into a MIME attachment object.
|
||||
@@ -449,9 +451,9 @@ def mail_send_task(self, **kwargs) -> bool:
|
||||
|
||||
# Rewrite all <img> tags from real URLs or data URLs to inline attachments referred to by content ID
|
||||
if outgoing_mail.body_html is not None:
|
||||
html_message = SafeMIMEMultipart(_subtype='related', encoding=settings.DEFAULT_CHARSET)
|
||||
html_message = SafeMIMEMultipart(_subtype='related')
|
||||
html_with_cid, cid_images = replace_images_with_cid_paths(outgoing_mail.body_html)
|
||||
html_message.attach(SafeMIMEText(html_with_cid, 'html', settings.DEFAULT_CHARSET))
|
||||
html_message.attach(SafeMIMEText(html_with_cid, 'html', utf8_charset_qp))
|
||||
attach_cid_images(html_message, cid_images, verify_ssl=True)
|
||||
email.attach_alternative(html_message, "multipart/related")
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
+22
-10
@@ -50,8 +50,8 @@ from pretix.api.serializers.order import (
|
||||
from pretix.api.serializers.waitinglist import WaitingListSerializer
|
||||
from pretix.base.i18n import LazyLocaleException
|
||||
from pretix.base.models import (
|
||||
CachedCombinedTicket, CachedTicket, Event, InvoiceAddress, OrderPayment,
|
||||
OrderPosition, OrderRefund, OutgoingMail, QuestionAnswer,
|
||||
CachedCombinedTicket, CachedTicket, Event, Invoice, InvoiceAddress,
|
||||
OrderPayment, OrderPosition, OrderRefund, OutgoingMail, QuestionAnswer,
|
||||
)
|
||||
from pretix.base.services.invoices import invoice_pdf_task
|
||||
from pretix.base.signals import register_data_shredders
|
||||
@@ -598,18 +598,30 @@ class InvoiceShredder(BaseDataShredder):
|
||||
def shred_data(self, progress_callback=None):
|
||||
qs_i = self.event.invoices.filter(shredded=False)
|
||||
total = qs_i.count()
|
||||
ignore_fields = (
|
||||
'prefix', 'invoice_no', 'full_invoice_no', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode',
|
||||
'invoice_from_city', 'invoice_from_state', 'invoice_from_country', 'invoice_from_tax_id',
|
||||
'invoice_from_vat_id', 'locale', 'payment_provider_stamp', 'footer_text', 'foreign_currency_display',
|
||||
'foreign_currency_source', 'transmission_type', 'transmission_provider', 'transmission_status',
|
||||
)
|
||||
|
||||
for i in _progress_helper(qs_i, progress_callback, 0, total):
|
||||
if i.file:
|
||||
i.file.delete()
|
||||
i.shredded = True
|
||||
i.introductory_text = "█"
|
||||
i.additional_text = "█"
|
||||
i.invoice_to = "█"
|
||||
i.payment_provider_text = "█"
|
||||
i.transmission_info = {"_shredded": True}
|
||||
i.save()
|
||||
i.lines.update(description="█")
|
||||
i.shredded = True
|
||||
|
||||
for f in Invoice._meta.fields:
|
||||
if f.name in ignore_fields:
|
||||
continue
|
||||
val = getattr(i, f.name, None)
|
||||
if val and isinstance(val, str):
|
||||
setattr(i, f.name, "█")
|
||||
elif val and isinstance(val, list): # jsonfield
|
||||
setattr(i, f.name, [])
|
||||
elif val and isinstance(val, dict): # jsonfield
|
||||
setattr(i, f.name, {"_shredded": True})
|
||||
i.save()
|
||||
i.lines.update(description="█", attendee_name="█")
|
||||
|
||||
|
||||
class CachedTicketShredder(BaseDataShredder):
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from decimal import ROUND_HALF_UP, Decimal
|
||||
from typing import Optional
|
||||
|
||||
from babel import Locale, UnknownLocaleError
|
||||
from babel.numbers import format_currency
|
||||
@@ -35,32 +36,32 @@ register = template.Library()
|
||||
|
||||
|
||||
@register.filter("money")
|
||||
def money_filter(value: Decimal, arg='', hide_currency=False):
|
||||
if isinstance(value, (float, int)):
|
||||
def money_filter(value: Optional[Decimal | float | int | str], arg='', hide_currency=False):
|
||||
if isinstance(value, (float, int, str)):
|
||||
if value == '':
|
||||
return value
|
||||
value = Decimal(value)
|
||||
if value is None:
|
||||
value = Decimal('0.00')
|
||||
if not isinstance(value, Decimal):
|
||||
if value == '':
|
||||
return value
|
||||
raise TypeError("Invalid data type passed to money filter: %r" % type(value))
|
||||
if not arg:
|
||||
raise ValueError("No currency passed.")
|
||||
arg = arg.upper()
|
||||
|
||||
places = settings.CURRENCY_PLACES.get(arg, 2)
|
||||
rounded = value.quantize(Decimal('1') / 10 ** places, ROUND_HALF_UP)
|
||||
if places < 2 and rounded != value:
|
||||
# We display decimal places even if we shouldn't for this currency if rounding
|
||||
# would make the numbers incorrect. If this branch executes, it's likely a bug in
|
||||
# pretix, but we won't show wrong numbers!
|
||||
if hide_currency:
|
||||
return floatformat(value, "2g")
|
||||
else:
|
||||
return '{} {}'.format(arg, floatformat(value, "2g"))
|
||||
if value.normalize().as_tuple().exponent < -9:
|
||||
# Heuristic: It's unlikely we'll ever see values of less than 0.000000001 in any currency. Therefore, if we
|
||||
# do see them, we very likely deal with a floating point error. This happens mostly in dev mode when computations
|
||||
# are made in SQLite, which uses REAL precision, but it can also happen when we naively pass a float from Python
|
||||
# land to this filter (even though it should not happen).
|
||||
value = value.quantize(Decimal('1e-9'), ROUND_HALF_UP).normalize()
|
||||
|
||||
currency_places = settings.CURRENCY_PLACES.get(arg, 2)
|
||||
required_places = -value.normalize().as_tuple().exponent
|
||||
render_places = max(currency_places, required_places)
|
||||
|
||||
if hide_currency:
|
||||
return floatformat(value, f"{places}g")
|
||||
return floatformat(value, f"{render_places}g")
|
||||
|
||||
try:
|
||||
locale = Locale(get_babel_locale())
|
||||
@@ -68,14 +69,29 @@ def money_filter(value: Decimal, arg='', hide_currency=False):
|
||||
locale = "en"
|
||||
|
||||
try:
|
||||
return format_currency(value, arg, locale=locale)
|
||||
return format_currency(
|
||||
value,
|
||||
arg,
|
||||
locale=locale,
|
||||
# We only allow Babel to restrict the digits to the digits defined by the currency if this does not remove any
|
||||
# precision in case we have sub-currency precision (which we shouldn't have in most places, but it's still
|
||||
# better than showing wrong data). Note: Weird precision effects can occur after in-database arithmetic
|
||||
# on SQLite, since SQLite does not have fixed-decimal computation.
|
||||
currency_digits=currency_places >= required_places,
|
||||
decimal_quantization=currency_places >= required_places,
|
||||
)
|
||||
except:
|
||||
return '{} {}'.format(arg, floatformat(value, f"{places}g"))
|
||||
return '{} {}'.format(arg, floatformat(value, f"{render_places}g"))
|
||||
|
||||
|
||||
@register.filter("money_without_currency")
|
||||
def money_filter_without_currency(value: Optional[Decimal | float | int | str], arg=''):
|
||||
return money_filter(value, arg, hide_currency=True)
|
||||
|
||||
|
||||
@register.filter("money_numberfield")
|
||||
def money_numberfield_filter(value: Decimal, arg=''):
|
||||
if isinstance(value, (float, int)):
|
||||
def money_numberfield_filter(value: Optional[Decimal | float | int | str], arg=''):
|
||||
if isinstance(value, (float, int, str)):
|
||||
value = Decimal(value)
|
||||
if not isinstance(value, Decimal):
|
||||
raise TypeError("Invalid data type passed to money filter: %r" % type(value))
|
||||
@@ -87,15 +103,28 @@ def money_numberfield_filter(value: Decimal, arg=''):
|
||||
|
||||
|
||||
@register.filter(is_safe=True)
|
||||
def tax_rate_format(number):
|
||||
def tax_rate_format(number: Optional[Decimal | float | int | str]):
|
||||
"""
|
||||
Display a Decimal to its significant decimal places, used for tax rates.
|
||||
"""
|
||||
assert isinstance(number, Decimal)
|
||||
if isinstance(number, (float, int, str)):
|
||||
if number == '':
|
||||
return number
|
||||
number = Decimal(number)
|
||||
if number is None:
|
||||
number = Decimal('0.00')
|
||||
if not isinstance(number, Decimal):
|
||||
raise TypeError("Invalid data type passed to tax rate format filter: %r" % type(number))
|
||||
if number.normalize().as_tuple().exponent < -9:
|
||||
# Heuristic: It's unlikely we'll ever see values of less than 0.000000001 in any currency. Therefore, if we
|
||||
# do see them, we very likely deal with a floating point error. This happens mostly in dev mode when computations
|
||||
# are made in SQLite, which uses REAL precision, but it can also happen when we naively pass a float from Python
|
||||
# land to this filter (even though it should not happen).
|
||||
number = number.quantize(Decimal('1e-9'), ROUND_HALF_UP).normalize()
|
||||
return mark_safe(
|
||||
formats.number_format(
|
||||
number.normalize(),
|
||||
-number.as_tuple().exponent,
|
||||
number,
|
||||
-number.normalize().as_tuple().exponent,
|
||||
use_l10n=True,
|
||||
force_grouping=False,
|
||||
)
|
||||
|
||||
@@ -38,18 +38,19 @@ from pretix.base.middleware import (
|
||||
register = template.Library()
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
_MANIFEST = {}
|
||||
_MANIFEST_ENTRIES = {}
|
||||
# TODO more os.path.join ?
|
||||
MANIFEST_PATH = settings.STATIC_ROOT + "/vite/control/.vite/manifest.json"
|
||||
MANIFEST_BASE = "vite/control/"
|
||||
|
||||
# entry_name -> {"manifest_entry": {...}, "url_base": "..."}
|
||||
# entry_name -> {"manifest": {...}, "key": "...", "url_base": "..."}
|
||||
_PLUGIN_REGISTRY = {}
|
||||
|
||||
|
||||
def _discover_plugin_manifests():
|
||||
"""Discover plugin vite manifests at startup.
|
||||
|
||||
Scans installed pretix plugins for a .vite/manifest.json inside a static.dist
|
||||
Scans installed pretix plugins for a .vite/manifest.json inside a static
|
||||
directory. Only non-editable (wheel) plugins are expected to ship pre-built
|
||||
assets; editable plugins are served through the Vite dev server.
|
||||
"""
|
||||
@@ -84,10 +85,11 @@ def _discover_plugin_manifests():
|
||||
|
||||
url_base = re.search(r'/static/(.+?)/\.vite/', str(manifest_rel)).group(1) + '/'
|
||||
|
||||
for _key, entry in plugin_manifest.items():
|
||||
for key, entry in plugin_manifest.items():
|
||||
if entry.get('isEntry') and 'name' in entry:
|
||||
_PLUGIN_REGISTRY[entry['name']] = {
|
||||
'manifest_entry': entry,
|
||||
'manifest': plugin_manifest,
|
||||
'key': key,
|
||||
'url_base': url_base,
|
||||
}
|
||||
except Exception:
|
||||
@@ -99,6 +101,9 @@ if not settings.VITE_DEV_MODE and not settings.VITE_IGNORE:
|
||||
try:
|
||||
with open(MANIFEST_PATH) as fp:
|
||||
_MANIFEST = json.load(fp)
|
||||
_MANIFEST_ENTRIES = {
|
||||
entry["name"]: key for key, entry in _MANIFEST.items() if entry.get("isEntry") and "name" in entry
|
||||
}
|
||||
except Exception as e:
|
||||
LOGGER.warning(f"Error reading vite manifest at {MANIFEST_PATH}: {str(e)}")
|
||||
|
||||
@@ -117,34 +122,29 @@ def _generate_script_tag(path, attrs, src=None):
|
||||
return f'<script {all_attrs} src="{src}"></script>'
|
||||
|
||||
|
||||
def _generate_css_tags(asset, already_processed=None):
|
||||
"""Recursively builds all CSS tags used in a given asset from the core manifest."""
|
||||
def _generate_css_tags(manifest, key, url_base, seen_chunks=None, seen_css=None):
|
||||
"""
|
||||
Builds the CSS tags for a manifest chunk and everything it imports statically.
|
||||
|
||||
Vite lists a chunk's own CSS only. Traverse dependency graph to find all CSS that is imported by this chunk and its dependencies.
|
||||
"""
|
||||
if seen_chunks is None:
|
||||
seen_chunks = set()
|
||||
if seen_css is None:
|
||||
seen_css = set()
|
||||
if key in seen_chunks:
|
||||
return []
|
||||
seen_chunks.add(key)
|
||||
|
||||
manifest_entry = manifest[key]
|
||||
tags = []
|
||||
manifest_entry = _MANIFEST[asset]
|
||||
if already_processed is None:
|
||||
already_processed = []
|
||||
|
||||
if "css" in manifest_entry:
|
||||
for css_path in manifest_entry["css"]:
|
||||
if css_path not in already_processed:
|
||||
full_path = urljoin(settings.STATIC_URL, MANIFEST_BASE + css_path)
|
||||
tags.append(f'<link rel="stylesheet" href="{full_path}" />')
|
||||
already_processed.append(css_path)
|
||||
|
||||
if "imports" in manifest_entry:
|
||||
for import_path in manifest_entry["imports"]:
|
||||
tags += _generate_css_tags(import_path, already_processed)
|
||||
|
||||
return tags
|
||||
|
||||
|
||||
def _generate_plugin_css_tags(manifest_entry, url_base):
|
||||
"""Build CSS tags for a plugin manifest entry."""
|
||||
tags = []
|
||||
if "css" in manifest_entry:
|
||||
for css_path in manifest_entry["css"]:
|
||||
full_path = urljoin(settings.STATIC_URL, url_base + css_path)
|
||||
tags.append(f'<link rel="stylesheet" href="{full_path}" />')
|
||||
for css_path in manifest_entry.get("css", []):
|
||||
# Different chunks can reference the same emitted stylesheet.
|
||||
if css_path not in seen_css:
|
||||
tags.append(f'<link rel="stylesheet" href="{urljoin(settings.STATIC_URL, url_base + css_path)}" />')
|
||||
seen_css.add(css_path)
|
||||
for import_key in manifest_entry.get("imports", []):
|
||||
tags += _generate_css_tags(manifest, import_key, url_base, seen_chunks, seen_css)
|
||||
return tags
|
||||
|
||||
|
||||
@@ -161,11 +161,10 @@ def vite_asset(path):
|
||||
# Check plugin registry (non-editable plugins with pre-built assets)
|
||||
if path in _PLUGIN_REGISTRY:
|
||||
info = _PLUGIN_REGISTRY[path]
|
||||
entry = info['manifest_entry']
|
||||
url_base = info['url_base']
|
||||
tags = _generate_plugin_css_tags(entry, url_base)
|
||||
manifest, key, url_base = info['manifest'], info['key'], info['url_base']
|
||||
tags = _generate_css_tags(manifest, key, url_base)
|
||||
# Always use STATIC_URL for pre-built plugin assets, even in dev mode
|
||||
src = urljoin(settings.STATIC_URL, url_base + entry["file"])
|
||||
src = urljoin(settings.STATIC_URL, url_base + manifest[key]["file"])
|
||||
tags.append(_generate_script_tag(path, {"type": "module", "crossorigin": ""}, src=src))
|
||||
return "".join(tags)
|
||||
|
||||
@@ -173,12 +172,13 @@ def vite_asset(path):
|
||||
if settings.VITE_DEV_MODE:
|
||||
return _generate_script_tag(path, {"type": "module"})
|
||||
|
||||
# Prod mode
|
||||
manifest_entry = _MANIFEST.get(path)
|
||||
# Prod mode: core addresses entries by source path (the manifest key), plugins by entry name
|
||||
key = _MANIFEST_ENTRIES.get(path, path)
|
||||
manifest_entry = _MANIFEST.get(key)
|
||||
if not manifest_entry:
|
||||
raise RuntimeError(f"Cannot find {path} in Vite manifest at {MANIFEST_PATH}")
|
||||
|
||||
tags = _generate_css_tags(path)
|
||||
tags = _generate_css_tags(_MANIFEST, key, MANIFEST_BASE)
|
||||
tags.append(
|
||||
_generate_script_tag(
|
||||
MANIFEST_BASE + manifest_entry["file"], {"type": "module", "crossorigin": ""}
|
||||
@@ -199,7 +199,7 @@ _dev_importmap_cache = None
|
||||
|
||||
|
||||
def _get_dev_importmap():
|
||||
"""Fetch the shared-dep import map from the Vite dev server. Cached after first call."""
|
||||
"""Fetch the shared-dep import map from the Vite dev server. Cached after first successful fetch."""
|
||||
global _dev_importmap_cache
|
||||
if _dev_importmap_cache is not None:
|
||||
return _dev_importmap_cache
|
||||
@@ -212,7 +212,7 @@ def _get_dev_importmap():
|
||||
}
|
||||
except Exception:
|
||||
LOGGER.warning("Failed to fetch import map from Vite dev server")
|
||||
_dev_importmap_cache = {}
|
||||
return {}
|
||||
return _dev_importmap_cache
|
||||
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ def timeline_for_event(event, subevent=None):
|
||||
ev = subevent or event
|
||||
if subevent:
|
||||
ev_edit_url = reverse(
|
||||
'control:event.subevent', kwargs={
|
||||
'control:event.subevent.edit', kwargs={
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'subevent': subevent.pk
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
#
|
||||
import contextvars
|
||||
from contextlib import contextmanager
|
||||
from datetime import datetime
|
||||
|
||||
from dateutil.parser import parse
|
||||
from django.utils.timezone import now
|
||||
|
||||
from pretix.base.auth import has_event_access_permission
|
||||
@@ -34,7 +34,7 @@ timemachine_now_var = contextvars.ContextVar('timemachine_now', default=None)
|
||||
def time_machine_now_assigned_from_request(request):
|
||||
if hasattr(request, 'event') and f'timemachine_now_dt:{request.event.pk}' in request.session and \
|
||||
request.event.testmode and has_event_access_permission(request):
|
||||
request.now_dt = parse(request.session[f'timemachine_now_dt:{request.event.pk}'])
|
||||
request.now_dt = datetime.fromisoformat(request.session[f'timemachine_now_dt:{request.event.pk}'])
|
||||
request.now_dt_is_fake = True
|
||||
else:
|
||||
request.now_dt = now()
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from django.conf import settings
|
||||
from django.http import (
|
||||
HttpResponseForbidden, HttpResponseNotFound, HttpResponseServerError,
|
||||
)
|
||||
@@ -27,7 +28,6 @@ from django.template import TemplateDoesNotExist, loader
|
||||
from django.template.loader import get_template
|
||||
from django.utils.functional import Promise
|
||||
from django.utils.translation import gettext as _
|
||||
from sentry_sdk import last_event_id
|
||||
|
||||
from pretix.base.i18n import language
|
||||
from pretix.base.middleware import get_language_from_request
|
||||
@@ -106,9 +106,14 @@ def server_error(request):
|
||||
template = loader.get_template('500.html')
|
||||
except TemplateDoesNotExist:
|
||||
return HttpResponseServerError('<h1>Server Error (500)</h1>', content_type='text/html')
|
||||
if settings.SENTRY_ENABLED:
|
||||
from sentry_sdk import last_event_id
|
||||
sentry_id = last_event_id()
|
||||
else:
|
||||
sentry_id = None
|
||||
r = HttpResponseServerError(template.render({
|
||||
'request': request,
|
||||
'sentry_event_id': last_event_id(),
|
||||
'sentry_event_id': sentry_id,
|
||||
}))
|
||||
r.xframe_options_exempt = True
|
||||
return r
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import logging
|
||||
import multiprocessing
|
||||
import os
|
||||
|
||||
from celery import Celery, signals
|
||||
@@ -54,6 +55,21 @@ def on_task_received(sender, request, **kwargs):
|
||||
logger.info(f"Task {request.id} has trace {trace}")
|
||||
|
||||
|
||||
@receiver(signals.after_setup_task_logger)
|
||||
def on_after_setup_task_logger(sender, logger, loglevel, logfile, format, colorize, **kwargs):
|
||||
# This hack seems to be required to get celery to log internal events from eg billiard/pool.py such as
|
||||
# "worker killed because it used too much memory"
|
||||
# You can test that it is working by starting a celery worker with a low value like
|
||||
# --max-memory-per-child 300000
|
||||
# and then trigger a task. Result should look like this:
|
||||
# [2026-09-23 10:42:26,234: WARNING/ForkPoolWorker-16]: [???:???] child process exiting after exceeding memory limit (394540KiB / 300000KiB)
|
||||
# The ???:??? are likely because by copying the handlers, we are also copying the format, but I was unable to find
|
||||
# a better compatible way.
|
||||
multi_logger = multiprocessing.get_logger()
|
||||
multi_logger.setLevel(logging.WARNING)
|
||||
multi_logger.handlers = logger.handlers
|
||||
|
||||
|
||||
@receiver(signals.task_prerun)
|
||||
def on_task_prerun(sender, task_id, task, **kwargs):
|
||||
from pretix.helpers.logs import local
|
||||
|
||||
@@ -400,10 +400,10 @@ class EventMetaValueForm(forms.ModelForm):
|
||||
if self.disabled:
|
||||
self.fields['value'].widget.attrs['readonly'] = 'readonly'
|
||||
|
||||
def clean_slug(self):
|
||||
def clean_value(self):
|
||||
if self.disabled:
|
||||
return self.instance.value if self.instance else None
|
||||
return self.cleaned_data['slug']
|
||||
return self.cleaned_data['value']
|
||||
|
||||
class Meta:
|
||||
model = EventMetaValue
|
||||
@@ -838,9 +838,10 @@ class CancelSettingsForm(SettingsForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if self.obj.settings.giftcard_expiry_years is not None:
|
||||
self.fields['cancel_allow_user_paid_refund_as_giftcard'].help_text = gettext(
|
||||
'You have configured gift cards to be valid {} years plus the year the gift card is issued in.'
|
||||
).format(self.obj.settings.giftcard_expiry_years)
|
||||
self.fields['cancel_allow_user_paid_refund_as_giftcard'].help_text = format_html(
|
||||
gettext('You have configured gift cards to be valid {} years plus the year the gift card is issued in.'),
|
||||
self.obj.settings.giftcard_expiry_years
|
||||
)
|
||||
|
||||
|
||||
class PaymentSettingsForm(EventSettingsValidationMixin, SettingsForm):
|
||||
@@ -1635,10 +1636,15 @@ class MailSettingsForm(FormPlaceholderMixin, SettingsForm):
|
||||
self._set_field_placeholders(k, v, rich=k.startswith('mail_text_') and k not in self.plain_rendering)
|
||||
|
||||
for k, v in list(self.fields.items()):
|
||||
if k.endswith('_attendee') and not event.settings.attendee_emails_asked:
|
||||
# If we don't ask for attendee emails, we can't send them anything and we don't need to clutter
|
||||
# the user interface with it
|
||||
del self.fields[k]
|
||||
if k.endswith('_attendee'):
|
||||
if not event.settings.attendee_emails_asked:
|
||||
# If we don't ask for attendee emails, we can't send them anything and we don't need to clutter
|
||||
# the user interface with it
|
||||
del self.fields[k]
|
||||
elif 'subject' in k and k.replace("subject", "send") in self.fields:
|
||||
v.widget.attrs["data-display-dependency"] = f'#id_{k.replace("subject", "send")}'
|
||||
elif 'text' in k and k.replace("text", "send") in self.fields:
|
||||
v.widget.attrs["data-display-dependency"] = f'#id_{k.replace("text", "send")}'
|
||||
|
||||
|
||||
class TicketSettingsForm(SettingsForm):
|
||||
|
||||
@@ -105,13 +105,6 @@ class GlobalSettingsForm(SettingsForm):
|
||||
domain=settings.SITE_URL
|
||||
)
|
||||
)),
|
||||
('widget_vite_origins', forms.CharField(
|
||||
widget=forms.Textarea(attrs={'rows': '3'}),
|
||||
required=False,
|
||||
# Not translated on purpose, this is a temporary feature and contains too many special case words
|
||||
label="Vite widget origins",
|
||||
help_text="One origin per line (e.g. https://example.com). Requests from these origins will be served the new vite-based widget.",
|
||||
))
|
||||
])
|
||||
responses = register_global_settings.send(self)
|
||||
for r, response in sorted(responses, key=lambda r: str(r[0])):
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.functional import lazy
|
||||
from django.utils.html import format_html
|
||||
from django.utils.html import conditional_escape, format_html
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from pretix.base.modelimport_orders import get_order_import_columns
|
||||
@@ -66,7 +66,7 @@ class ProcessForm(forms.Form):
|
||||
widget=forms.Select(
|
||||
attrs={'data-static': 'true'}
|
||||
),
|
||||
help_text=c.help_text,
|
||||
help_text=conditional_escape(c.help_text),
|
||||
)
|
||||
|
||||
def get_columns(self):
|
||||
|
||||
@@ -364,7 +364,7 @@ class TeamForm(forms.ModelForm):
|
||||
for opt in pg.options
|
||||
],
|
||||
label=pg.label,
|
||||
help_text=pg.help_text,
|
||||
help_text=conditional_escape(pg.help_text),
|
||||
initial=initial,
|
||||
widget=forms.RadioSelect,
|
||||
)
|
||||
@@ -389,7 +389,7 @@ class TeamForm(forms.ModelForm):
|
||||
for opt in pg.options
|
||||
],
|
||||
label=pg.label,
|
||||
help_text=pg.help_text,
|
||||
help_text=conditional_escape(pg.help_text),
|
||||
initial=initial,
|
||||
widget=forms.RadioSelect,
|
||||
)
|
||||
|
||||
@@ -435,10 +435,10 @@ class SubEventMetaValueForm(forms.ModelForm):
|
||||
if self.disabled:
|
||||
self.fields['value'].widget.attrs['readonly'] = 'readonly'
|
||||
|
||||
def clean_slug(self):
|
||||
def clean_value(self):
|
||||
if self.disabled:
|
||||
return self.instance.value if self.instance else None
|
||||
return self.cleaned_data['slug']
|
||||
return self.cleaned_data['value']
|
||||
|
||||
class Meta:
|
||||
model = SubEventMetaValue
|
||||
|
||||
@@ -44,6 +44,7 @@ from django.db.models import Count, F, Max
|
||||
from django.db.models.functions import Upper
|
||||
from django.forms.utils import ErrorDict
|
||||
from django.urls import reverse
|
||||
from django.utils.html import escape
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
from django_scopes.forms import SafeModelChoiceField
|
||||
@@ -176,7 +177,7 @@ class VoucherForm(I18nModelForm):
|
||||
required=False,
|
||||
widget=forms.TextInput(attrs={'data-seat-guid-field': '1'}),
|
||||
initial=self.instance.seat.seat_guid if self.instance.seat else '',
|
||||
help_text=str(self.instance.seat) if self.instance.seat else '',
|
||||
help_text=escape(str(self.instance.seat) if self.instance.seat else ''),
|
||||
)
|
||||
|
||||
def parse_itemvar(self, data):
|
||||
|
||||
@@ -717,6 +717,10 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
|
||||
'pretix.organizer.export.schedule.failed': _('A scheduled export has failed: {reason}.'),
|
||||
'pretix.organizer.outgoingmails.retried': _('Failed emails have been scheduled to be retried.'),
|
||||
'pretix.organizer.outgoingmails.aborted': _('Queued emails have been aborted.'),
|
||||
'pretix.property.created': _('An organizer meta property has been created.'),
|
||||
'pretix.property.deleted': _('An organizer meta property has been deleted.'),
|
||||
'pretix.property.changed': _('An organizer meta property has been changed.'),
|
||||
'pretix.property.reordered': _('An organizer meta property has been reordered.'),
|
||||
'pretix.giftcards.acceptance.added': _('Gift card acceptance for another organizer has been added.'),
|
||||
'pretix.giftcards.acceptance.removed': _('Gift card acceptance for another organizer has been removed.'),
|
||||
'pretix.giftcards.acceptance.acceptor.invited': _('A new gift card acceptor has been invited.'),
|
||||
@@ -774,6 +778,7 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
|
||||
'pretix.user.settings.2fa.disabled': _('Two-factor authentication has been disabled.'),
|
||||
'pretix.user.settings.2fa.regenemergency': _('Your two-factor emergency codes have been regenerated.'),
|
||||
'pretix.user.settings.2fa.emergency': _('A two-factor emergency code has been generated.'),
|
||||
'pretix.user.settings.2fa.resetdrift': _('Drift and throttle values for two-factor devices have been reset.'),
|
||||
'pretix.user.settings.2fa.device.added': _('A new two-factor authentication device "{name}" has been added to '
|
||||
'your account.'),
|
||||
'pretix.user.settings.2fa.device.deleted': _('The two-factor authentication device "{name}" has been removed '
|
||||
|
||||
@@ -85,8 +85,8 @@ class PermissionMiddleware:
|
||||
"user.settings.2fa.enable",
|
||||
"user.settings.2fa.disable",
|
||||
"user.settings.2fa.regenemergency",
|
||||
"user.settings.2fa.confirm.totp",
|
||||
"user.settings.2fa.confirm.webauthn",
|
||||
"user.settings.2fa.confirm.otp_totp.totpdevice",
|
||||
"user.settings.2fa.confirm.pretixbase.webauthndevice",
|
||||
"user.settings.2fa.delete",
|
||||
"user.settings.2fa.leaveteams",
|
||||
"auth.logout",
|
||||
|
||||
@@ -133,22 +133,14 @@ This signal is sent out to include custom HTML in the top part of the the event
|
||||
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
|
||||
|
||||
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
|
||||
An additional keyword argument ``subevent`` *can* contain a sub-event.
|
||||
"""
|
||||
|
||||
event_dashboard_widgets = EventPluginSignal()
|
||||
event_dashboard_statistics = EventPluginSignal()
|
||||
"""
|
||||
This signal is sent out to include widgets in the event dashboard. Receivers
|
||||
should return a list of dictionaries, where each dictionary can have the keys:
|
||||
|
||||
* content (SafeString, containing HTML)
|
||||
* display_size (str, one of "full" (whole row), "big" (half a row) or "small"
|
||||
(quarter of a row). May be ignored on small displays, default is "small")
|
||||
* priority (int, used for ordering, higher comes first, default is 1)
|
||||
* url (str, optional, if the full widget should be a link)
|
||||
This signal is sent out to include statistical content on the event dashboard.
|
||||
Receivers should return a SafeString containing HTML, or a string that will be HTML-escaped.
|
||||
|
||||
As with all event plugin signals, the ``sender`` keyword argument will contain the event.
|
||||
An additional keyword argument ``subevent`` *can* contain a sub-event.
|
||||
"""
|
||||
|
||||
user_dashboard_widgets = GlobalSignal()
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
</p>
|
||||
|
||||
<div class="form-group buttons">
|
||||
<input type="submit" class="btn btn-large btn-default" value="Cancel"/>
|
||||
<input type="submit" class="btn btn-large btn-primary" name="allow" value="Authorize"/>
|
||||
<input type="submit" class="btn btn-large btn-default" value="{% trans "Cancel" %}"/>
|
||||
<input type="submit" class="btn btn-large btn-primary" name="allow" value="{% trans "Authorize" %}"/>
|
||||
</div>
|
||||
</form>
|
||||
{% else %}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
{% endif %}
|
||||
{% compress js %}
|
||||
<script type="text/javascript" src="{% static "jquery/js/jquery-3.6.4.min.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "htmx/htmx-2.0.10.min.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "js/jquery.formset.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "typeahead/typeahead.bundle.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "bootstrap/js/bootstrap.js" %}"></script>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
{% load humanize %}
|
||||
{% for cl in lists %}
|
||||
<a class="quotabox quotabox-full availability"
|
||||
href="{% url "control:event.orders.checkinlists.show" organizer=request.event.organizer.slug event=request.event.slug list=cl.id %}">
|
||||
<strong>{{ cl.name }}</strong>
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success progress-bar-{{ cl.percent }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="numbers">
|
||||
{% icon "sign-in" %}
|
||||
{{ cl.checkin_count|default_if_none:0|intcomma }} /
|
||||
{{ cl.position_count|default_if_none:0|intcomma }}
|
||||
<br>
|
||||
{% icon "user" %}
|
||||
{% blocktrans trimmed with n=cl.inside_count|intcomma %}
|
||||
{{ n }} present
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
</a>
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,17 @@
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
<div id="comment-form">
|
||||
<strong>{% trans "Comment" %}:</strong>
|
||||
{% if "event.settings.general:write" in request.eventpermset %}
|
||||
<button type="button" class="btn btn-default btn-xs"
|
||||
hx-get="{% url "control:event.index.comment" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-target="#comment-form">
|
||||
{% icon "edit" %}
|
||||
</button>
|
||||
{% endif %}
|
||||
{% if request.event.comment %}
|
||||
<p>
|
||||
{{ request.event.comment|linebreaksbr }}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -0,0 +1,16 @@
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
<form class="form" method="post"
|
||||
hx-post="{% url "control:event.index.comment" event=request.event.slug organizer=request.event.organizer.slug %}">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
<p>
|
||||
{% bootstrap_field form.comment layout="inline" show_help=True show_label=False horizontal_field_class="col-md-12" %}
|
||||
</p>
|
||||
<p class="text-right flip">
|
||||
<button class="btn btn-default">
|
||||
{% trans "Update comment" %}
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
@@ -0,0 +1,4 @@
|
||||
{% load i18n %}
|
||||
{% for q in quotas %}
|
||||
{% include "pretixcontrol/fragment_quota_box.html" with quota=q full=1 %}
|
||||
{% endfor %}
|
||||
@@ -0,0 +1,11 @@
|
||||
{% load i18n %}
|
||||
{% load humanize %}
|
||||
{% if count %}
|
||||
<a href="{% url "control:event.orders.waitinglist" event=request.event.slug organizer=request.organizer.slug %}">
|
||||
{% blocktrans trimmed with number=count|intcomma count count=count %}
|
||||
{{ number }} person waiting
|
||||
{% plural %}
|
||||
{{ number }} persons waiting
|
||||
{% endblocktrans %}
|
||||
</a>
|
||||
{% endif %}
|
||||
@@ -1,4 +1,5 @@
|
||||
{% load i18n %}
|
||||
{% load eventsignal %}
|
||||
{% if has_overpaid_orders %}
|
||||
<div class="alert alert-warning">
|
||||
{% blocktrans trimmed %}
|
||||
@@ -56,3 +57,4 @@
|
||||
class="btn btn-primary">{% trans "Show sync problems" %}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
{% load i18n %}
|
||||
<div class="panel panel-primary">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">{% trans "Welcome to pretix!" %}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="attentionline">{% trans "Get started with our setup tool" %}</div>
|
||||
<p>
|
||||
{% blocktrans trimmed %}
|
||||
To start selling tickets, you need to create products or quotas. The fastest way to create
|
||||
this is to use our setup tool.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<a href="{% url "control:event.quick" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
class="btn btn-primary btn-lg">
|
||||
{% trans "Set up event" %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,12 +0,0 @@
|
||||
<div class="welcome-wizard">
|
||||
<h3>{{ title }}</h3>
|
||||
{% if subtitle %}
|
||||
<div class="attentionline">{{ subtitle }}</div>
|
||||
{% endif %}
|
||||
{% if text %}
|
||||
<p>{{ text }}</p>
|
||||
{% endif %}
|
||||
{% if button_text %}
|
||||
<p><a href="{{ button_url }}" class="btn btn-primary btn-lg">{{ button_text }}</a></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -1,10 +1,10 @@
|
||||
{% load i18n %}
|
||||
<div class="panel panel-default items">
|
||||
<div class="panel-heading">
|
||||
<details class="panel panel-default items" open>
|
||||
<summary class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
{% trans "Your timeline" %}
|
||||
{% trans "Timeline" %}
|
||||
</h3>
|
||||
</div>
|
||||
</summary>
|
||||
<div class="panel-body timeline">
|
||||
{% regroup timeline by date as tl_list %}
|
||||
{% for day in tl_list %}
|
||||
@@ -33,4 +33,4 @@
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
{% load eventurl %}
|
||||
{% load bootstrap3 %}
|
||||
{% load static %}
|
||||
{% load eventsignal %}
|
||||
{% load icon %}
|
||||
{% block title %}{{ request.event.name }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>
|
||||
<h1 class="event-dashboard-header">
|
||||
{{ request.event.name }}
|
||||
<small>
|
||||
{% if request.event.has_subevents %}
|
||||
@@ -14,11 +14,43 @@
|
||||
{% else %}
|
||||
{{ request.event.get_date_range_display }}
|
||||
{% endif %}
|
||||
<span id="warnings_loading" class="fa fa-cog fa-spin"></span>
|
||||
<span id="warnings_indicator" class="htmx-indicator">{% icon "cog fa-spin" %}</span>
|
||||
</small>
|
||||
<div class="pull-right flip">
|
||||
<a href="{% url "control:event.live" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
data-toggle="tooltip"
|
||||
title="{% trans "Click to change shop status" %}">
|
||||
{% icon "pencil" %}</a>
|
||||
<a href="{% url "control:event.live" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
data-toggle="tooltip"
|
||||
title="{% trans "Click to change shop status" %}">
|
||||
{% if request.event.live and request.event.testmode %}
|
||||
<span class="label label-warning">
|
||||
<span class="fa fa-warning"></span>
|
||||
{% trans "public test mode" %}
|
||||
</span>
|
||||
{% elif request.event.live %}
|
||||
<span class="label label-success">
|
||||
<span class="fa fa-check"></span>
|
||||
{% trans "live" %}
|
||||
</span>
|
||||
{% elif request.event.testmode %}
|
||||
<span class="label label-warning">
|
||||
<span class="fa fa-power-off"></span>
|
||||
{% trans "private test mode" %}
|
||||
</span>
|
||||
{% else %}
|
||||
<span class="label label-danger">
|
||||
<span class="fa fa-power-off"></span>
|
||||
{% trans "offline" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</h1>
|
||||
<div class="helper-space-below">
|
||||
{% trans "Shop URL:" %}
|
||||
<strong>{% trans "Shop URL:" %}</strong>
|
||||
<span id="shop_url" class="text-muted">{% abseventurl request.event "presale:event.index" %}</span>
|
||||
<button type="button" class="btn btn-default btn-xs btn-clipboard js-only" data-clipboard-target="#shop_url">
|
||||
<i class="fa fa-clipboard" aria-hidden="true"></i>
|
||||
@@ -31,75 +63,80 @@
|
||||
{% include "pretixcontrol/event/fragment_qr_dropdown.html" with url=0 %}
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div id="warnings_target"></div>
|
||||
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %}
|
||||
|
||||
{% if request.event.has_subevents %}
|
||||
<form class="form-inline helper-display-inline" action="" method="get">
|
||||
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if not request.event.has_subevents or subevent %}
|
||||
{% include "pretixcontrol/event/fragment_timeline.html" %}
|
||||
{% endif %}
|
||||
<div class="dashboard">
|
||||
{% for w in widgets %}
|
||||
<div class="widget-container widget-{{ w.display_size|default:"small" }} {% if w.lazy %}widget-lazy-loading{% endif %}" data-lazy-id="{{ w.lazy }}">
|
||||
{% if w.url %}{# backwards compatibility #}
|
||||
<a href="{{ w.url }}" class="widget">
|
||||
{% if w.lazy %}
|
||||
<span class="fa fa-cog fa-4x"></span>
|
||||
{% else %}
|
||||
{{ w.content }}
|
||||
{% endif %}
|
||||
</a>
|
||||
{% elif w.link %}
|
||||
<a href="{{ w.link }}" class="widget">
|
||||
{% if w.lazy %}
|
||||
<span class="fa fa-cog fa-4x´"></span>
|
||||
{% else %}
|
||||
{{ w.content }}
|
||||
{% endif %}
|
||||
</a>
|
||||
{% else %}
|
||||
<div class="widget">
|
||||
{% if w.lazy %}
|
||||
<span class="fa fa-cog fa-4x"></span>
|
||||
{% else %}
|
||||
{{ w.content }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% include "pretixcontrol/event/dashboard_partial_comment.html" with url=0 %}
|
||||
</div>
|
||||
|
||||
{% if not request.event.items.exists %}
|
||||
{% include "pretixcontrol/event/dashboard_partial_welcome.html" %}
|
||||
{% endif %}
|
||||
|
||||
<div hx-get="{% url "control:event.index.warnings" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
{# loading indicator is somewhere else because the happy case is "no warnings" and shouldn't make the page jump #}
|
||||
hx-indicator="#warnings_indicator"
|
||||
hx-trigger="load"></div>
|
||||
|
||||
{% if stats %}
|
||||
{{ stats }}
|
||||
{% endif %}
|
||||
<p> </p>
|
||||
<div class="panel panel-default items">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
{% trans "Internal comment" %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<form class="form" method="post"
|
||||
action="{% url "control:event.comment" event=request.event.slug organizer=request.event.organizer.slug %}">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
{% bootstrap_field comment_form.comment layout="horizontal" show_help=True show_label=False horizontal_field_class="col-md-12" %}
|
||||
|
||||
{% if not request.event.items.exists %}
|
||||
{# pass #}
|
||||
{% elif not request.event.has_subevents %}
|
||||
{% include "pretixcontrol/event/fragment_timeline.html" %}
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<div class="pull-right">
|
||||
<div hx-get="{% url "control:event.index.waiting" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-trigger="load">
|
||||
<span class="loading-mock loading-mock-text-short"></span>
|
||||
</div>
|
||||
</div>
|
||||
<h2 class="panel-title">{% trans "Quotas" %}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div hx-get="{% url "control:event.index.quotas" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-trigger="load">
|
||||
{% for i in "12" %}
|
||||
{% include "pretixcontrol/fragment_quota_box_mock.html" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if not comment_form.readonly %}
|
||||
<p class="text-right flip">
|
||||
<br>
|
||||
<button class="btn btn-default">
|
||||
{% trans "Update comment" %}
|
||||
</button>
|
||||
</p>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-6 col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">{% trans "Check-in lists" %}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div hx-get="{% url "control:event.index.checkin" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-trigger="load">
|
||||
{% for i in "12" %}
|
||||
{% include "pretixcontrol/fragment_quota_box_mock.html" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% elif has_checkin_widgets %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">{% trans "Check-in lists" %}</h2>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div hx-get="{% url "control:event.index.checkin" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-trigger="load">
|
||||
{% for i in "12" %}
|
||||
{% include "pretixcontrol/fragment_quota_box_mock.html" %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if "event.orders:read" in request.eventpermset or "event.orders:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset or "event.items:write" in request.eventpermset %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -107,10 +144,27 @@
|
||||
{% trans "Event logs" %}
|
||||
</h3>
|
||||
</div>
|
||||
<ul class="list-group" id="logs_target">
|
||||
<div class="logs-lazy-loading">
|
||||
<span class="fa fa-cog fa-4x"></span>
|
||||
</div>
|
||||
<ul class="list-group"
|
||||
hx-get="{% url "control:event.index.logs" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-trigger="load">
|
||||
{% for i in "12345" %}
|
||||
<li class="list-group-item logentry">
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-sm-6 col-xs-12">
|
||||
<span class="loading-mock loading-mock-text-medium"></span>
|
||||
</div>
|
||||
<div class="col-lg-2 col-sm-6 col-xs-12">
|
||||
<span class="loading-mock loading-mock-text-short"></span>
|
||||
</div>
|
||||
<div class="col-lg-2 col-sm-12 col-xs-12">
|
||||
<span class="loading-mock loading-mock-text-medium"></span>
|
||||
</div>
|
||||
<div class="col-lg-6 col-sm-12 col-xs-12">
|
||||
<span class="loading-mock loading-mock-text-long"></span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="panel-footer">
|
||||
<a href="{% url "control:event.log" event=request.event.slug organizer=request.event.organizer.slug %}">
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
</div>
|
||||
<div class="slug-length alert alert-warning helper-display-none-soft">
|
||||
{% blocktrans trimmed %}
|
||||
We strongly recommend against using short forms of more then 16 characters.
|
||||
We strongly recommend against using short forms of more than 16 characters.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
<a href="?{% url_replace request 'ordering' 'date_to' %}"><i class="fa fa-caret-up"></i></a>
|
||||
</th>
|
||||
<th>
|
||||
{% trans "Paid tickets per quota" %}
|
||||
{% trans "Quota utilization" %}
|
||||
</th>
|
||||
<th>
|
||||
{% trans "Status" %}
|
||||
@@ -151,7 +151,7 @@
|
||||
</td>
|
||||
<td>
|
||||
{% for q in e.first_quotas|slice:":3" %}
|
||||
{% include "pretixcontrol/fragment_quota_box_paid.html" with quota=q %}
|
||||
{% include "pretixcontrol/fragment_quota_box.html" with quota=q %}
|
||||
{% endfor %}
|
||||
{% if e.first_quotas|length > 3 %}
|
||||
<a href="{% url "control:event.items.quotas" organizer=e.organizer.slug event=e.slug %}"
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
{% load i18n %}
|
||||
<div class="quotabox availability" data-toggle="tooltip_html" data-placement="top"
|
||||
title="{% trans "Quota:" %} {{ q.name|force_escape|force_escape }}<br>{% blocktrans with date=q.cached_availability_time|date:"SHORT_DATETIME_FORMAT" %}Numbers as of {{ date }}{% endblocktrans %}">
|
||||
{% load humanize %}
|
||||
<a class="quotabox {% if full %}quotabox-full{% endif %}" data-toggle="tooltip_html" data-placement="top"
|
||||
title="{% trans "Quota:" %} {{ q.name|force_escape|force_escape }}{% if q.cached_avail.1 is not None %}<br>{% blocktrans with num=q.cached_avail.1 %}Currently available: {{ num }}{% endblocktrans %}{% endif %}"
|
||||
href="{% url "control:event.items.quotas.show" event=q.event.slug organizer=q.event.organizer.slug quota=q.pk %}">
|
||||
{% if full %}
|
||||
<strong>{{ q.name }}</strong>
|
||||
{% endif %}
|
||||
{% if q.size|default_if_none:"NONE" == "NONE" %}
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success progress-bar-100">
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-{% if q.cached_avail.0 <= 10 or q.cached_avail.0 >= 100 %}danger{% else %}warning{% endif %} progress-bar-{{ q.inv_percent }}">
|
||||
<div class="progress-bar progress-bar-{% if q.cached_avail.0 < 10 %}danger{% elif q.cached_avail.0 < 100 %}warning{% else %}success{% endif %} progress-bar-{{ q.percent_paid }}">
|
||||
</div>
|
||||
<div class="progress-bar progress-bar-{% if q.cached_avail.0 < 10 %}danger{% elif q.cached_avail.0 < 100 %}warning{% else %}success{% endif %} progress-bar-unconfirmed progress-bar-{{ q.percent_other }}">
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="numbers">
|
||||
{{ q.cached_avail.1|default_if_none:"∞" }} / {{ q.size|default_if_none:"∞" }}
|
||||
{{ q.used|default_if_none:"∞" }} / {{ q.size|default_if_none:"∞" }}<br>
|
||||
{% blocktrans trimmed with n=q.cached_availability_paid_orders %}
|
||||
{{ n }} paid
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<a class="quotabox quotabox-full">
|
||||
<strong>
|
||||
<span class="loading-mock loading-mock-text-short"></span>
|
||||
</strong>
|
||||
<div class="progress loading-mock"></div>
|
||||
<div class="numbers">
|
||||
<span class="loading-mock loading-mock-text-short"></span>
|
||||
<br><span class="loading-mock loading-mock-text-short"></span>
|
||||
</div>
|
||||
</a>
|
||||
@@ -1,17 +0,0 @@
|
||||
{% load i18n %}
|
||||
<a class="quotabox" data-toggle="tooltip_html" data-placement="top"
|
||||
title="{% trans "Quota:" %} {{ q.name|force_escape|force_escape }}{% if q.cached_avail.1 is not None %}<br>{% blocktrans with num=q.cached_avail.1 %}Currently available: {{ num }}{% endblocktrans %}{% endif %}"
|
||||
href="{% url "control:event.items.quotas.show" event=q.event.slug organizer=q.event.organizer.slug quota=q.pk %}">
|
||||
{% if q.size|default_if_none:"NONE" == "NONE" %}
|
||||
<div class="progress">
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-{% if q.cached_avail.0 < 10 %}danger{% elif q.cached_avail.0 < 100 %}warning{% else %}success{% endif %} progress-bar-{{ q.percent_paid }}">
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="numbers">
|
||||
{{ q.cached_availability_paid_orders|default_if_none:"?" }} / {{ q.size|default_if_none:"∞" }}
|
||||
</div>
|
||||
</a>
|
||||
@@ -72,6 +72,7 @@
|
||||
{% endif %}
|
||||
</dl>
|
||||
</fieldset>
|
||||
{% include "pretixcontrol/event/fragment_timeline.html" %}
|
||||
<fieldset>
|
||||
<legend>{% trans "Quotas" %}</legend>
|
||||
<div class="table-responsive">
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<a href="?{% url_replace request 'filter-ordering' 'date_from' %}"><i class="fa fa-caret-up"></i></a>
|
||||
</th>
|
||||
<th>
|
||||
{% trans "Paid tickets per quota" %}
|
||||
{% trans "Quota utilization" %}
|
||||
</th>
|
||||
<th>
|
||||
{% trans "Status" %}
|
||||
@@ -155,7 +155,7 @@
|
||||
</td>
|
||||
<td>
|
||||
{% for q in s.first_quotas|slice:":3" %}
|
||||
{% include "pretixcontrol/fragment_quota_box_paid.html" with quota=q %}
|
||||
{% include "pretixcontrol/fragment_quota_box.html" with quota=q %}
|
||||
{% endfor %}
|
||||
{% if s.first_quotas|length > 3 %}
|
||||
<a href="{% url "control:event.items.quotas" organizer=request.event.organizer.slug event=request.event.slug %}?subevent={{ s.id }}"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<div>
|
||||
<div class="big-radio radio">
|
||||
<label>
|
||||
<input type="radio" required value="totp" name="{{ form.devicetype.html_name }}" {% if form.devicetype.value == "totp" %}checked{% endif %}>
|
||||
<input type="radio" required value="otp_totp.totpdevice" name="{{ form.devicetype.html_name }}" {% if form.devicetype.value == "otp_totp.totpdevice" %}checked{% endif %}>
|
||||
<strong>{% trans "Smartphone with Authenticator app" %}</strong><br>
|
||||
<div class="help-block">
|
||||
{% blocktrans trimmed %}
|
||||
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
<div class="big-radio radio">
|
||||
<label>
|
||||
<input type="radio" required value="webauthn" name="{{ form.devicetype.html_name }}" {% if form.devicetype.value == "webauthn" %}checked{% endif %}>
|
||||
<input type="radio" required value="pretixbase.webauthndevice" name="{{ form.devicetype.html_name }}" {% if form.devicetype.value == "pretixbase.webauthndevice" %}checked{% endif %}>
|
||||
<strong>{% trans "WebAuthn-compatible hardware token" %}</strong><br>
|
||||
<div class="help-block">
|
||||
{% blocktrans trimmed %}
|
||||
|
||||
@@ -116,14 +116,14 @@
|
||||
{% for d in devices %}
|
||||
<li class="list-group-item">
|
||||
<a class="btn btn-danger btn-xs pull-right flip"
|
||||
href="{% url "control:user.settings.2fa.delete" devicetype=d.devicetype device=d.pk %}">
|
||||
href="{% url "control:user.settings.2fa.delete" devicetype=d.model_label device=d.pk %}">
|
||||
Delete
|
||||
</a>
|
||||
{% if d.devicetype == "totp" %}
|
||||
{% if d.model_label == "otp_totp.totpdevice" %}
|
||||
<span class="fa fa-mobile"></span>
|
||||
{% elif d.devicetype == "webauthn" %}
|
||||
{% elif d.model_label == "pretixbase.webauthndevice" %}
|
||||
<span class="fa fa-usb"></span>
|
||||
{% elif d.devicetype == "u2f" %}
|
||||
{% elif d.model_label == "pretixbase.u2fdevice" %}
|
||||
<span class="fa fa-usb"></span>
|
||||
{% endif %}
|
||||
{{ d.name }}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{% extends "pretixcontrol/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
{% load icon %}
|
||||
{% block title %}{% trans "User" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>{% trans "User" %} {{ user.email }}</h1>
|
||||
@@ -59,8 +60,83 @@
|
||||
{% bootstrap_field form.is_verified layout='control' %}
|
||||
{% endif %}
|
||||
{% bootstrap_field form.last_login layout='control' %}
|
||||
{% bootstrap_field form.require_2fa layout='control' %}
|
||||
{% bootstrap_field form.needs_password_change layout='control' %}
|
||||
{% bootstrap_field form.require_2fa layout='control' %}
|
||||
<div class="form-group">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<button class="btn btn-default btn-xs pull-right" type="submit" form="resetdriftthrottle">
|
||||
{% trans "Reset drift and throttle" %}
|
||||
</button>
|
||||
<h3 class="panel-title">
|
||||
{% trans "Available two-factor authentication methods" %}
|
||||
</h3>
|
||||
</div>
|
||||
<table class="panel-body table table-hover">
|
||||
{% for d in devices %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if d.model_label == 'otp_totp.totpdevice' %}
|
||||
TOTP
|
||||
{% elif d.model_label == 'pretixbase.u2fdevice' %}
|
||||
U2F
|
||||
{% elif d.model_label == 'pretixbase.webauthndevice' %}
|
||||
WebAuthn
|
||||
{% elif d.model_label == 'otp_static.staticdevice' %}
|
||||
{% trans "Emergency tokens" %}
|
||||
{% endif %}
|
||||
{% if d.confirmed %}
|
||||
{% icon "check" %}
|
||||
{% else %}
|
||||
{% icon "warning" %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ d.name }}
|
||||
</td>
|
||||
<td>
|
||||
{% if d.throttling_failure_timestamp %}
|
||||
{% blocktrans trimmed with date=d.throttling_failure_timestamp|date:"SHORT_DATETIME_FORMAT" count cnt=d.throttling_failure_count %}
|
||||
1 failed attempt since {{ date }}
|
||||
{% plural %}
|
||||
{{ cnt }} failed attempts since {{ date }}
|
||||
{% endblocktrans %}
|
||||
<br>
|
||||
{% endif %}
|
||||
{% if d.throttling_enabled and not d.verify_is_allowed.0 %}
|
||||
<strong>
|
||||
{% blocktrans trimmed with date=d.verify_is_allowed.1.locked_until|date:"SHORT_DATETIME_FORMAT" %}
|
||||
Currently locked until {{ date }}
|
||||
{% endblocktrans %}
|
||||
</strong>
|
||||
<br>
|
||||
{% endif %}
|
||||
{% if d.model_label == 'otp_totp.totpdevice' %}
|
||||
<small>
|
||||
<code>step = {{ d.step }},
|
||||
t0 = {{ d.t0 }},
|
||||
digits = {{ d.digits }},
|
||||
tolerance = {{ d.tolerance }},
|
||||
drift = {{ d.drift }},
|
||||
last_t = {{ d.last_t }}</code>
|
||||
</small>
|
||||
{% elif d.model_label == 'pretixbase.u2fdevice' %}
|
||||
<small>
|
||||
<code>sign_count = {{ d.sign_count }}</code>
|
||||
</small>
|
||||
{% elif d.model_label == 'otp_static.staticdevice' %}
|
||||
<small>
|
||||
<code>token_count = {{ d.token_set.count }}</code>
|
||||
</small>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Team memberships" %}</legend>
|
||||
@@ -102,4 +178,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form action="{% url "control:users.resetdriftthrottle" id=user.pk %}" id="resetdriftthrottle" method="post">
|
||||
{% csrf_token %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
@@ -78,6 +78,7 @@ urlpatterns = [
|
||||
re_path(r'^users/(?P<id>\d+)/impersonate$', users.UserImpersonateView.as_view(), name='users.impersonate'),
|
||||
re_path(r'^users/(?P<id>\d+)/anonymize$', users.UserAnonymizeView.as_view(), name='users.anonymize'),
|
||||
re_path(r'^users/(?P<id>\d+)/emergencytoken$', users.UserEmergencyTokenView.as_view(), name='users.emergencytoken'),
|
||||
re_path(r'^users/(?P<id>\d+)/resetdriftthrottle$', users.Reset2FADriftThrottleView.as_view(), name='users.resetdriftthrottle'),
|
||||
re_path(r'^pdf/editor/webfonts.css', pdf.FontsCSSView.as_view(), name='pdf.css'),
|
||||
re_path(r'^settings/?$', user.UserSettings.as_view(), name='user.settings'),
|
||||
re_path(r'^settings/history/$', user.UserHistoryView.as_view(), name='user.settings.history'),
|
||||
@@ -106,9 +107,9 @@ urlpatterns = [
|
||||
re_path(r'^settings/2fa/regenemergency', user.User2FARegenerateEmergencyView.as_view(),
|
||||
name='user.settings.2fa.regenemergency'),
|
||||
re_path(r'^settings/2fa/totp/(?P<device>[0-9]+)/confirm', user.User2FADeviceConfirmTOTPView.as_view(),
|
||||
name='user.settings.2fa.confirm.totp'),
|
||||
name='user.settings.2fa.confirm.otp_totp.totpdevice'),
|
||||
re_path(r'^settings/2fa/webauthn/(?P<device>[0-9]+)/confirm', user.User2FADeviceConfirmWebAuthnView.as_view(),
|
||||
name='user.settings.2fa.confirm.webauthn'),
|
||||
name='user.settings.2fa.confirm.pretixbase.webauthndevice'),
|
||||
re_path(r'^settings/2fa/(?P<devicetype>[^/]+)/(?P<device>[0-9]+)/delete', user.User2FADeviceDeleteView.as_view(),
|
||||
name='user.settings.2fa.delete'),
|
||||
re_path(r'^settings/email/confirm$', user.UserEmailConfirmView.as_view(), name='user.settings.email.confirm'),
|
||||
@@ -272,15 +273,16 @@ urlpatterns = [
|
||||
re_path(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include([
|
||||
re_path(r'^$', dashboards.event_index, name='event.index'),
|
||||
re_path(r'^qrcode.(?P<filetype>(png|jpeg|gif|svg))$', event.EventQRCode.as_view(), name='event.qrcode'),
|
||||
re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
|
||||
re_path(r'^dashboard/partials/logs$', dashboards.event_index_log_lazy, name='event.index.logs'),
|
||||
re_path(r'^dashboard/partials/warnings$', dashboards.event_index_warnings_lazy, name='event.index.warnings'),
|
||||
re_path(r'^dashboard/partials/quotas$', dashboards.event_index_quotas_lazy, name='event.index.quotas'),
|
||||
re_path(r'^dashboard/partials/waiting$', dashboards.event_index_waiting_lazy, name='event.index.waiting'),
|
||||
re_path(r'^dashboard/partials/checkin$', dashboards.event_index_checkin_lazy, name='event.index.checkin'),
|
||||
re_path(r'^dashboard/partials/comment$', event.EventComment.as_view(), name='event.index.comment'),
|
||||
re_path(r'^live/$', event.EventLive.as_view(), name='event.live'),
|
||||
re_path(r'^transfer_session/$', event.EventTransferSession.as_view(), name='event.transfer_session'),
|
||||
re_path(r'^logs/$', event.EventLog.as_view(), name='event.log'),
|
||||
re_path(r'^delete/$', event.EventDelete.as_view(), name='event.delete'),
|
||||
re_path(r'^comment/$', event.EventComment.as_view(),
|
||||
name='event.comment'),
|
||||
re_path(r'^quickstart/$', event.QuickSetupView.as_view(), name='event.quick'),
|
||||
re_path(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
|
||||
re_path(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
import base64
|
||||
import json
|
||||
import logging
|
||||
import math
|
||||
import time
|
||||
from urllib.parse import quote, urljoin, urlparse
|
||||
|
||||
@@ -50,11 +51,12 @@ from django.shortcuts import redirect, render
|
||||
from django.urls import reverse
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.http import url_has_allowed_host_and_scheme
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _, ngettext
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.views.decorators.http import require_http_methods
|
||||
from django.views.generic import TemplateView
|
||||
from django_otp import match_token
|
||||
from django_otp import devices_for_user
|
||||
from django_otp.plugins.otp_static.models import StaticDevice
|
||||
from webauthn.helpers import generate_challenge
|
||||
|
||||
@@ -463,6 +465,7 @@ class Login2FAView(TemplateView):
|
||||
token = request.POST.get('token', '').strip().replace(' ', '')
|
||||
|
||||
valid = False
|
||||
retry_after = None
|
||||
if 'webauthn_challenge' in self.request.session and token.startswith('{'):
|
||||
challenge = self.request.session['webauthn_challenge']
|
||||
|
||||
@@ -518,12 +521,28 @@ class Login2FAView(TemplateView):
|
||||
valid = True
|
||||
break
|
||||
else:
|
||||
valid = match_token(self.user, token)
|
||||
if isinstance(valid, StaticDevice):
|
||||
with transaction.atomic():
|
||||
for device in devices_for_user(self.user, for_verify=True):
|
||||
if isinstance(device, StaticDevice) and len(token) < 12:
|
||||
# If we enter a wrong TOTP token (which is 6 characters), do not even try if it is a valid
|
||||
# emergency token, which will only "lock up" the StaticDevice due to the throttling plugin
|
||||
# and just locks people out without security gain.
|
||||
continue
|
||||
if device.verify_token(token):
|
||||
valid = True
|
||||
break
|
||||
elif hasattr(device, 'verify_is_allowed'):
|
||||
verify_allowed, reason_dict = device.verify_is_allowed()
|
||||
if not verify_allowed:
|
||||
if not retry_after or reason_dict['locked_until'] > retry_after:
|
||||
retry_after = reason_dict['locked_until']
|
||||
else:
|
||||
device = None
|
||||
|
||||
if isinstance(device, StaticDevice):
|
||||
self.user.send_security_notice([
|
||||
_("A recovery code for two-factor authentification was used to log in.")
|
||||
])
|
||||
|
||||
if valid:
|
||||
logger.info(f"Backend login successful for user {self.user.pk} with 2FA.")
|
||||
pretix_successful_logins.inc(1)
|
||||
@@ -536,7 +555,23 @@ class Login2FAView(TemplateView):
|
||||
return redirect('control:index')
|
||||
else:
|
||||
pretix_failed_logins.inc(1, reason="2fa")
|
||||
messages.error(request, _('Invalid code, please try again.'))
|
||||
msg = _('Invalid code, please try again.')
|
||||
if retry_after:
|
||||
seconds = (retry_after - now()).total_seconds()
|
||||
minutes = seconds / 60
|
||||
if minutes >= 1:
|
||||
msg = ngettext(
|
||||
'Invalid code. Please try again after waiting {value} minute.',
|
||||
'Invalid code. Please try again after waiting {value} minutes.',
|
||||
minutes,
|
||||
).format(value=math.ceil(minutes))
|
||||
elif seconds >= 1:
|
||||
msg = ngettext(
|
||||
'Invalid code. Please try again after waiting {value} second.',
|
||||
'Invalid code. Please try again after waiting {value} seconds.',
|
||||
seconds,
|
||||
).format(value=math.ceil(seconds))
|
||||
messages.error(request, msg)
|
||||
return redirect('control:auth.login.2fa')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
||||
@@ -33,317 +33,48 @@
|
||||
# License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.contrib.humanize.templatetags.humanize import intcomma
|
||||
from django.db.models import (
|
||||
Count, IntegerField, Max, Min, OuterRef, Prefetch, Q, Subquery, Sum,
|
||||
Count, IntegerField, Max, Min, OuterRef, Q, Subquery,
|
||||
)
|
||||
from django.db.models.functions import Coalesce, Greatest
|
||||
from django.dispatch import receiver
|
||||
from django.http import JsonResponse
|
||||
from django.http import Http404, JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.template.loader import get_template
|
||||
from django.urls import reverse
|
||||
from django.utils.formats import date_format
|
||||
from django.utils.html import conditional_escape, escape, format_html
|
||||
from django.utils.html import (
|
||||
conditional_escape, escape, format_html, format_html_join,
|
||||
)
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _, ngettext, pgettext
|
||||
|
||||
from pretix.base.decimal import round_decimal
|
||||
from pretix.base.models import (
|
||||
Item, ItemCategory, ItemVariation, Order, OrderPosition, OrderRefund,
|
||||
Question, Quota, SubEvent, Voucher, WaitingListEntry,
|
||||
Item, ItemCategory, Order, OrderRefund, Question, Quota, Voucher,
|
||||
WaitingListEntry,
|
||||
)
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
from pretix.base.timeline import timeline_for_event
|
||||
from pretix.control.signals import (
|
||||
event_dashboard_widgets, user_dashboard_widgets,
|
||||
event_dashboard_statistics, user_dashboard_widgets,
|
||||
)
|
||||
from pretix.helpers.daterange import daterange
|
||||
|
||||
from ...base.models.orders import CancellationRequest
|
||||
from ...base.models.organizer import TeamQuerySet
|
||||
from ...base.templatetags.money import money_filter
|
||||
from ..logdisplay import OVERVIEW_BANLIST
|
||||
|
||||
NUM_WIDGET = '<div class="numwidget"><span class="num">{num}</span><span class="text">{text}</span></div>'
|
||||
from .utils import prepare_quotas_for_boxes
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def base_widgets(sender, subevent=None, lazy=False, **kwargs):
|
||||
if not lazy:
|
||||
prodc = Item.objects.filter(
|
||||
event=sender, active=True,
|
||||
).filter(
|
||||
(Q(available_until__isnull=True) | Q(available_until__gte=now())) &
|
||||
(Q(available_from__isnull=True) | Q(available_from__lte=now()))
|
||||
).count()
|
||||
|
||||
if subevent:
|
||||
opqs = OrderPosition.objects.filter(subevent=subevent)
|
||||
else:
|
||||
opqs = OrderPosition.objects
|
||||
|
||||
tickc = opqs.filter(
|
||||
order__event=sender, item__admission=True,
|
||||
order__status__in=(Order.STATUS_PAID, Order.STATUS_PENDING),
|
||||
).count()
|
||||
|
||||
paidc = opqs.filter(
|
||||
order__event=sender, item__admission=True,
|
||||
order__status=Order.STATUS_PAID,
|
||||
).count()
|
||||
|
||||
if subevent:
|
||||
rev = opqs.filter(
|
||||
order__event=sender, order__status=Order.STATUS_PAID
|
||||
).aggregate(
|
||||
sum=Sum('price')
|
||||
)['sum'] or Decimal('0.00')
|
||||
else:
|
||||
rev = Order.objects.filter(
|
||||
event=sender,
|
||||
status=Order.STATUS_PAID
|
||||
).aggregate(sum=Sum('total'))['sum'] or Decimal('0.00')
|
||||
|
||||
return [
|
||||
def event_index_waiting_lazy(request, organizer, event):
|
||||
wles = WaitingListEntry.objects.filter(event=request.event, voucher__isnull=True)
|
||||
return render(
|
||||
request,
|
||||
'pretixcontrol/event/dashboard_partial_waiting.html',
|
||||
{
|
||||
'content': None if lazy else format_html(NUM_WIDGET, num=intcomma(tickc), text=_('Attendees (ordered)')),
|
||||
'lazy': 'attendees-ordered',
|
||||
'display_size': 'small',
|
||||
'priority': 100,
|
||||
'url': reverse('control:event.orders', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||
},
|
||||
{
|
||||
'content': None if lazy else format_html(NUM_WIDGET, num=intcomma(paidc), text=_('Attendees (paid)')),
|
||||
'lazy': 'attendees-paid',
|
||||
'display_size': 'small',
|
||||
'priority': 100,
|
||||
'url': reverse('control:event.orders.overview', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||
},
|
||||
{
|
||||
'content': None if lazy else format_html(
|
||||
NUM_WIDGET,
|
||||
num=money_filter(round_decimal(rev, sender.currency), sender.currency, hide_currency=True),
|
||||
text=_('Total revenue ({currency})').format(currency=sender.currency)
|
||||
),
|
||||
'lazy': 'total-revenue',
|
||||
'display_size': 'small',
|
||||
'priority': 100,
|
||||
'url': reverse('control:event.orders.overview', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
}) + ('?subevent={}'.format(subevent.pk) if subevent else '')
|
||||
},
|
||||
{
|
||||
'content': None if lazy else format_html(NUM_WIDGET, num=prodc, text=_('Active products')),
|
||||
'lazy': 'active-products',
|
||||
'display_size': 'small',
|
||||
'priority': 100,
|
||||
'url': reverse('control:event.items', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
})
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def waitinglist_widgets(sender, subevent=None, lazy=False, **kwargs):
|
||||
widgets = []
|
||||
|
||||
wles = WaitingListEntry.objects.filter(event=sender, subevent=subevent, voucher__isnull=True)
|
||||
if wles.exists():
|
||||
if not lazy:
|
||||
quota_cache = {}
|
||||
happy = 0
|
||||
tuples = wles.values('item', 'variation').order_by().annotate(cnt=Count('id'))
|
||||
|
||||
items = {
|
||||
i.pk: i for i in sender.items.filter(id__in=[t['item'] for t in tuples]).prefetch_related(
|
||||
Prefetch('quotas',
|
||||
to_attr='_subevent_quotas',
|
||||
queryset=sender.quotas.using(settings.DATABASE_REPLICA).filter(subevent=subevent)),
|
||||
)
|
||||
}
|
||||
vars = {
|
||||
i.pk: i for i in ItemVariation.objects.filter(
|
||||
item__event=sender, id__in=[t['variation'] for t in tuples if t['variation']]
|
||||
).prefetch_related(
|
||||
Prefetch('quotas',
|
||||
to_attr='_subevent_quotas',
|
||||
queryset=sender.quotas.using(settings.DATABASE_REPLICA).filter(subevent=subevent)),
|
||||
)
|
||||
}
|
||||
|
||||
for wlt in tuples:
|
||||
item = items.get(wlt['item'])
|
||||
variation = vars.get(wlt['variation'])
|
||||
if not item:
|
||||
continue
|
||||
quotas = (
|
||||
variation._get_quotas(subevent=subevent)
|
||||
if variation
|
||||
else item._get_quotas(subevent=subevent)
|
||||
)
|
||||
row = (
|
||||
variation.check_quotas(subevent=subevent, count_waitinglist=False, _cache=quota_cache)
|
||||
if variation
|
||||
else item.check_quotas(subevent=subevent, count_waitinglist=False, _cache=quota_cache)
|
||||
)
|
||||
if row[1] is None:
|
||||
happy += wlt['cnt']
|
||||
elif row[1] > 0:
|
||||
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] - min(wlt['cnt'], row[1]))
|
||||
|
||||
widgets.append({
|
||||
'content': None if lazy else format_html(
|
||||
NUM_WIDGET, num=intcomma(happy), text=_('available to give to people on waiting list')
|
||||
),
|
||||
'lazy': 'waitinglist-avail',
|
||||
'priority': 50,
|
||||
'url': reverse('control:event.orders.waitinglist', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug,
|
||||
})
|
||||
})
|
||||
widgets.append({
|
||||
'content': None if lazy else format_html(
|
||||
NUM_WIDGET, num=intcomma(wles.count()), text=_('total waiting list length')
|
||||
),
|
||||
'lazy': 'waitinglist-length',
|
||||
'display_size': 'small',
|
||||
'priority': 50,
|
||||
'url': reverse('control:event.orders.waitinglist', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug,
|
||||
})
|
||||
})
|
||||
|
||||
return widgets
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def quota_widgets(sender, subevent=None, lazy=False, **kwargs):
|
||||
widgets = []
|
||||
quotas = sender.quotas.filter(subevent=subevent)
|
||||
|
||||
qa = QuotaAvailability()
|
||||
if quotas:
|
||||
qa.queue(*quotas)
|
||||
qa.compute(allow_cache=True)
|
||||
|
||||
for q in quotas:
|
||||
if not lazy:
|
||||
status, left = qa.results[q] if q in qa.results else q.availability(allow_cache=True)
|
||||
widgets.append({
|
||||
'content': None if lazy else format_html(
|
||||
NUM_WIDGET,
|
||||
num='{}/{}'.format(intcomma(left), intcomma(q.size)) if q.size is not None else '\u221e',
|
||||
text=format_html(_('{quota} left'), quota=q.name)
|
||||
),
|
||||
'lazy': 'quota-{}'.format(q.pk),
|
||||
'display_size': 'small',
|
||||
'priority': 50,
|
||||
'url': reverse('control:event.items.quotas.show', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug,
|
||||
'quota': q.id
|
||||
})
|
||||
})
|
||||
return widgets
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def shop_state_widget(sender, **kwargs):
|
||||
return [{
|
||||
'display_size': 'small',
|
||||
'priority': 1000,
|
||||
'content': format_html(
|
||||
'<div class="shopstate">{t1}<br><span class="{cls}"><span class="fa {icon}"></span> {state}</span>{t2}</div>',
|
||||
t1=_('Your ticket shop is'), t2=_('Click here to change'),
|
||||
state=_('live') if sender.live and not sender.testmode else (
|
||||
_('live and in test mode') if sender.live else (
|
||||
_('not yet public') if not sender.testmode else (
|
||||
_('in private test mode')
|
||||
)
|
||||
)
|
||||
),
|
||||
icon='fa-check-circle' if sender.live and not sender.testmode else (
|
||||
'fa-warning' if sender.live else (
|
||||
'fa-times-circle' if not sender.testmode else (
|
||||
'fa-times-circle'
|
||||
)
|
||||
)
|
||||
),
|
||||
cls='live' if sender.live else 'off'
|
||||
),
|
||||
'url': reverse('control:event.live', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
})
|
||||
}]
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def checkin_widget(sender, subevent=None, lazy=False, **kwargs):
|
||||
widgets = []
|
||||
qs = sender.checkin_lists.filter(subevent=subevent)
|
||||
for cl in qs:
|
||||
widgets.append({
|
||||
'content': None if lazy else format_html(
|
||||
NUM_WIDGET,
|
||||
num='{}/{}'.format(intcomma(cl.inside_count), intcomma(cl.position_count)),
|
||||
text=format_html(_('Present – {list}'), list=cl.name)
|
||||
),
|
||||
'lazy': 'checkin-{}'.format(cl.pk),
|
||||
'display_size': 'small',
|
||||
'priority': 50,
|
||||
'url': reverse('control:event.orders.checkinlists.show', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug,
|
||||
'list': cl.pk
|
||||
})
|
||||
})
|
||||
return widgets
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def welcome_wizard_widget(sender, **kwargs):
|
||||
template = get_template('pretixcontrol/event/dashboard_widget_welcome.html')
|
||||
ctx = {
|
||||
'title': _('Welcome to pretix!')
|
||||
}
|
||||
kwargs = {'event': sender.slug, 'organizer': sender.organizer.slug}
|
||||
|
||||
if not sender.items.exists():
|
||||
ctx.update({
|
||||
'subtitle': _('Get started with our setup tool'),
|
||||
'text': _('To start selling tickets, you need to create products or quotas. The fastest way to create '
|
||||
'this is to use our setup tool.'),
|
||||
'button_text': _('Set up event'),
|
||||
'button_url': reverse('control:event.quick', kwargs=kwargs)
|
||||
})
|
||||
else:
|
||||
return []
|
||||
return [{
|
||||
'display_size': 'full',
|
||||
'priority': 2000,
|
||||
'content': template.render(ctx)
|
||||
}]
|
||||
'count': wles.count,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def build_json_response(widgets):
|
||||
@@ -353,62 +84,38 @@ def build_json_response(widgets):
|
||||
|
||||
|
||||
def event_index(request, organizer, event):
|
||||
from pretix.control.forms.event import CommentForm
|
||||
can_view_orders = request.user.has_event_permission(
|
||||
request.organizer,
|
||||
request.event,
|
||||
'event.orders:read',
|
||||
request=request
|
||||
)
|
||||
|
||||
subevent = None
|
||||
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
|
||||
i = request.GET.get("subevent", "")
|
||||
try:
|
||||
subevent = request.event.subevents.get(pk=i)
|
||||
except SubEvent.DoesNotExist:
|
||||
pass
|
||||
|
||||
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
|
||||
request=request)
|
||||
can_change_event_settings = request.user.has_event_permission(request.organizer, request.event,
|
||||
'event.settings.general:write', request=request)
|
||||
|
||||
widgets = []
|
||||
stats = []
|
||||
if can_view_orders:
|
||||
for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=True):
|
||||
widgets.extend(result)
|
||||
for r, result in event_dashboard_statistics.send(sender=request.event, request=request):
|
||||
stats.append(result)
|
||||
|
||||
ctx = {
|
||||
'widgets': rearrange(widgets),
|
||||
'subevent': subevent,
|
||||
'comment_form': CommentForm(initial={'comment': request.event.comment}, readonly=not can_change_event_settings),
|
||||
'stats': format_html_join("", "{}", [(s,) for s in stats]),
|
||||
}
|
||||
|
||||
ctx['timeline'] = [
|
||||
{
|
||||
'date': t.datetime.astimezone(request.event.timezone).date(),
|
||||
'entry': t,
|
||||
'time': t.datetime.astimezone(request.event.timezone)
|
||||
}
|
||||
for t in timeline_for_event(request.event, subevent)
|
||||
]
|
||||
if not request.event.has_subevents:
|
||||
ctx['timeline'] = [
|
||||
{
|
||||
'date': t.datetime.astimezone(request.event.timezone).date(),
|
||||
'entry': t,
|
||||
'time': t.datetime.astimezone(request.event.timezone)
|
||||
}
|
||||
for t in timeline_for_event(request.event, None)
|
||||
]
|
||||
ctx['today'] = now().astimezone(request.event.timezone).date()
|
||||
ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20)
|
||||
ctx['has_checkin_widgets'] = not request.event.has_subevents or request.event.checkin_lists.filter(subevent=None).exists()
|
||||
resp = render(request, 'pretixcontrol/event/index.html', ctx)
|
||||
return resp
|
||||
|
||||
|
||||
def event_index_widgets_lazy(request, organizer, event):
|
||||
subevent = None
|
||||
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
|
||||
i = request.GET.get("subevent", "")
|
||||
try:
|
||||
subevent = request.event.subevents.get(pk=i)
|
||||
except SubEvent.DoesNotExist:
|
||||
pass
|
||||
|
||||
widgets = []
|
||||
for r, result in event_dashboard_widgets.send(sender=request.event, subevent=subevent, lazy=False):
|
||||
widgets.extend(result)
|
||||
|
||||
return build_json_response(widgets)
|
||||
|
||||
|
||||
def event_index_warnings_lazy(request, organizer, event):
|
||||
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
|
||||
request=request)
|
||||
@@ -445,6 +152,32 @@ def event_index_warnings_lazy(request, organizer, event):
|
||||
)
|
||||
|
||||
|
||||
def event_index_quotas_lazy(request, organizer, event):
|
||||
if request.event.has_subevents:
|
||||
raise Http404()
|
||||
|
||||
quotas = request.event.quotas.filter(subevent=None)[:10]
|
||||
prepare_quotas_for_boxes(quotas)
|
||||
return render(
|
||||
request,
|
||||
'pretixcontrol/event/dashboard_partial_quotas.html',
|
||||
{
|
||||
'quotas': quotas,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def event_index_checkin_lazy(request, organizer, event):
|
||||
lists = request.event.checkin_lists.filter(subevent=None)[:10]
|
||||
return render(
|
||||
request,
|
||||
'pretixcontrol/event/dashboard_partial_checkin.html',
|
||||
{
|
||||
'lists': lists,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def event_index_log_lazy(request, organizer, event):
|
||||
qs = request.event.logentry_set.all().select_related('user', 'content_type', 'api_token', 'oauth_application',
|
||||
'device').order_by('-datetime')
|
||||
|
||||
@@ -163,6 +163,9 @@ class DiscountCreate(EventPermissionRequiredMixin, CreateView):
|
||||
i = modelcopy(self.copy_from)
|
||||
i.pk = None
|
||||
kwargs['instance'] = i
|
||||
kwargs["initial"]["limit_sales_channels"] = self.copy_from.limit_sales_channels.all()
|
||||
kwargs["initial"]["condition_limit_products"] = self.copy_from.condition_limit_products.all()
|
||||
kwargs["initial"]["benefit_limit_products"] = self.copy_from.benefit_limit_products.all()
|
||||
else:
|
||||
kwargs['instance'] = Discount(event=self.request.event)
|
||||
|
||||
|
||||
@@ -57,10 +57,9 @@ from django.db import transaction
|
||||
from django.db.models import Count, ProtectedError
|
||||
from django.forms import inlineformset_factory
|
||||
from django.http import (
|
||||
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed,
|
||||
JsonResponse,
|
||||
Http404, HttpResponse, HttpResponseBadRequest, JsonResponse,
|
||||
)
|
||||
from django.shortcuts import redirect
|
||||
from django.shortcuts import redirect, render
|
||||
from django.urls import NoReverseMatch, reverse
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.html import conditional_escape, format_html
|
||||
@@ -1299,24 +1298,23 @@ class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
||||
return LogFilterForm(data=self.request.GET, organizer=self.request.organizer)
|
||||
|
||||
|
||||
class EventComment(EventPermissionRequiredMixin, View):
|
||||
class EventComment(EventPermissionRequiredMixin, UpdateView):
|
||||
permission = 'event.settings.general:write'
|
||||
form_class = CommentForm
|
||||
template_name = 'pretixcontrol/event/dashboard_partial_comment_form.html'
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
form = CommentForm(self.request.POST)
|
||||
if form.is_valid():
|
||||
self.request.event.comment = form.cleaned_data.get('comment')
|
||||
self.request.event.save()
|
||||
self.request.event.log_action('pretix.event.comment', user=self.request.user, data={
|
||||
'new_comment': form.cleaned_data.get('comment')
|
||||
})
|
||||
messages.success(self.request, _('The comment has been updated.'))
|
||||
else:
|
||||
messages.error(self.request, _('Could not update the comment.'))
|
||||
return redirect(self.get_success_url())
|
||||
def get_object(self, queryset=None):
|
||||
return self.request.event
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return HttpResponseNotAllowed(['POST'])
|
||||
def form_valid(self, form):
|
||||
form.save()
|
||||
self.request.event.log_action('pretix.event.comment', user=self.request.user, data={
|
||||
'new_comment': form.cleaned_data.get('comment')
|
||||
})
|
||||
return render(
|
||||
self.request,
|
||||
'pretixcontrol/event/dashboard_partial_comment.html',
|
||||
)
|
||||
|
||||
def get_success_url(self) -> str:
|
||||
return reverse('control:event.index', kwargs={
|
||||
|
||||
@@ -52,13 +52,13 @@ from pretix.base.forms import SafeSessionWizardView
|
||||
from pretix.base.i18n import language
|
||||
from pretix.base.models import Event, EventMetaValue, Organizer, Quota, Team
|
||||
from pretix.base.models.organizer import TeamQuerySet
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
from pretix.control.forms.event import (
|
||||
EventWizardBasicsForm, EventWizardCopyForm, EventWizardFoundationForm,
|
||||
)
|
||||
from pretix.control.forms.filter import EventFilterForm
|
||||
from pretix.control.permissions import OrganizerPermissionRequiredMixin
|
||||
from pretix.control.views import PaginationMixin
|
||||
from pretix.control.views.utils import prepare_quotas_for_boxes
|
||||
|
||||
|
||||
class EventList(PaginationMixin, ListView):
|
||||
@@ -117,19 +117,7 @@ class EventList(PaginationMixin, ListView):
|
||||
s.first_quotas = s.first_quotas[:4]
|
||||
quotas += list(s.first_quotas)
|
||||
|
||||
qa = QuotaAvailability(early_out=False)
|
||||
for q in quotas:
|
||||
qa.queue(q)
|
||||
qa.compute()
|
||||
|
||||
for q in quotas:
|
||||
q.cached_avail = qa.results[q]
|
||||
q.cached_availability_paid_orders = qa.count_paid_orders.get(q, 0)
|
||||
if q.size is not None:
|
||||
q.percent_paid = min(
|
||||
100,
|
||||
round(q.cached_availability_paid_orders / q.size * 100) if q.size > 0 else 100
|
||||
)
|
||||
prepare_quotas_for_boxes(quotas)
|
||||
return ctx
|
||||
|
||||
@cached_property
|
||||
|
||||
@@ -1177,6 +1177,8 @@ class OrderRefundView(OrderView):
|
||||
manual_value = formats.sanitize_separators(manual_value)
|
||||
try:
|
||||
manual_value = Decimal(manual_value)
|
||||
if manual_value < Decimal("0.00"):
|
||||
raise TypeError("Please do not use negative numbers")
|
||||
except (DecimalException, TypeError):
|
||||
messages.error(self.request, _('You entered an invalid number.'))
|
||||
is_valid = False
|
||||
@@ -1206,6 +1208,8 @@ class OrderRefundView(OrderView):
|
||||
giftcard_value = formats.sanitize_separators(giftcard_value)
|
||||
try:
|
||||
giftcard_value = Decimal(giftcard_value)
|
||||
if giftcard_value < Decimal("0.00"):
|
||||
raise TypeError("Please do not use negative numbers")
|
||||
except (DecimalException, TypeError):
|
||||
messages.error(self.request, _('You entered an invalid number.'))
|
||||
is_valid = False
|
||||
@@ -1255,6 +1259,8 @@ class OrderRefundView(OrderView):
|
||||
offsetting_value = formats.sanitize_separators(offsetting_value)
|
||||
try:
|
||||
offsetting_value = Decimal(offsetting_value)
|
||||
if offsetting_value < Decimal("0.00"):
|
||||
raise TypeError("Please do not use negative numbers")
|
||||
except (DecimalException, TypeError):
|
||||
messages.error(self.request, _('You entered an invalid number.'))
|
||||
is_valid = False
|
||||
@@ -1271,6 +1277,9 @@ class OrderRefundView(OrderView):
|
||||
if offset_order.event.currency != self.request.event.currency:
|
||||
messages.error(self.request, _('You entered an order in an event with a different currency.'))
|
||||
is_valid = False
|
||||
if not self.request.user.has_event_permission(self.request.organizer, offset_order.event, 'event.orders:write', request=self.request):
|
||||
messages.error(self.request, _('You entered an order in an event that you do not have access to.'))
|
||||
is_valid = False
|
||||
refunds.append(OrderRefund(
|
||||
order=order,
|
||||
payment=None,
|
||||
@@ -1286,10 +1295,13 @@ class OrderRefundView(OrderView):
|
||||
))
|
||||
|
||||
for identifier, prov in self.request.event.get_payment_providers().items():
|
||||
# prof = process form, not a typo for prov(ider)
|
||||
prof_value = self.request.POST.get(f'newrefund-{identifier}', '0') or '0'
|
||||
prof_value = formats.sanitize_separators(prof_value)
|
||||
try:
|
||||
prof_value = Decimal(prof_value)
|
||||
if prof_value < Decimal("0.00"):
|
||||
raise TypeError("Please do not use negative numbers")
|
||||
except (DecimalException, TypeError):
|
||||
messages.error(self.request, _('You entered an invalid number.'))
|
||||
is_valid = False
|
||||
@@ -1313,6 +1325,8 @@ class OrderRefundView(OrderView):
|
||||
value = formats.sanitize_separators(value)
|
||||
try:
|
||||
value = Decimal(value)
|
||||
if value < Decimal("0.00"):
|
||||
raise TypeError("Please do not use negative numbers")
|
||||
except (DecimalException, TypeError):
|
||||
messages.error(self.request, _('You entered an invalid number.'))
|
||||
is_valid = False
|
||||
@@ -1342,7 +1356,12 @@ class OrderRefundView(OrderView):
|
||||
))
|
||||
|
||||
any_success = False
|
||||
if refund_selected == full_refund and is_valid:
|
||||
if refund_selected != full_refund:
|
||||
messages.error(self.request, _('The refunds you selected do not match the selected total refund '
|
||||
'amount.'))
|
||||
is_valid = False
|
||||
|
||||
if is_valid:
|
||||
for r in refunds:
|
||||
r.save()
|
||||
order.log_action('pretix.event.order.refund.created', {
|
||||
@@ -1414,9 +1433,6 @@ class OrderRefundView(OrderView):
|
||||
)
|
||||
}))
|
||||
return redirect(self.get_order_url())
|
||||
else:
|
||||
messages.error(self.request, _('The refunds you selected do not match the selected total refund '
|
||||
'amount.'))
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
if self.start_form.is_valid():
|
||||
|
||||
@@ -778,9 +778,9 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs["events"] = self.request.user.get_events_with_permission(
|
||||
"event.settings.general:write", request=self.request
|
||||
).filter(organizer=self.request.organizer)
|
||||
# Assumption: Who has access to modify organizer settings may see all events and disable/enable plugins
|
||||
# for them. Otherwise, inconsistent situations occur.
|
||||
kwargs["events"] = self.request.organizer.events.all()
|
||||
kwargs["initial"] = {
|
||||
"events": self.request.organizer.events.filter(plugins__regex='(^|,)' + self.plugin.module + '(,|$)')
|
||||
}
|
||||
@@ -2202,7 +2202,7 @@ class ExportView(OrganizerPermissionRequiredMixin, ExportMixin, ListView):
|
||||
owner=self.request.user,
|
||||
timezone=str(get_current_timezone()),
|
||||
)
|
||||
if not self.scheduled:
|
||||
if not self.scheduled and not self.scheduled_copy_from:
|
||||
initial = {
|
||||
"mail_subject": gettext("Export: {title}").format(title=self.exporter.verbose_name),
|
||||
"mail_template": gettext(
|
||||
|
||||
@@ -69,6 +69,7 @@ from pretix.base.models.orders import CancellationRequest
|
||||
from pretix.base.reldate import RelativeDate, RelativeDateWrapper
|
||||
from pretix.base.services import tickets
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
from pretix.base.timeline import timeline_for_event
|
||||
from pretix.base.views.tasks import AsyncFormView
|
||||
from pretix.control.forms.checkin import SimpleCheckinListForm
|
||||
from pretix.control.forms.filter import SubEventFilterForm
|
||||
@@ -83,6 +84,7 @@ from pretix.control.permissions import EventPermissionRequiredMixin
|
||||
from pretix.control.signals import subevent_forms
|
||||
from pretix.control.views import PaginationMixin
|
||||
from pretix.control.views.event import MetaDataEditorMixin
|
||||
from pretix.control.views.utils import prepare_quotas_for_boxes
|
||||
from pretix.helpers import GroupConcat
|
||||
from pretix.helpers.compat import CompatDeleteView
|
||||
from pretix.helpers.i18n import get_format_without_seconds
|
||||
@@ -144,19 +146,7 @@ class SubEventList(EventPermissionRequiredMixin, PaginationMixin, SubEventQueryM
|
||||
s.first_quotas = s.first_quotas[:4]
|
||||
quotas += list(s.first_quotas)
|
||||
|
||||
qa = QuotaAvailability(early_out=False)
|
||||
for q in quotas:
|
||||
qa.queue(q)
|
||||
qa.compute()
|
||||
|
||||
for q in quotas:
|
||||
q.cached_avail = qa.results[q]
|
||||
q.cached_availability_paid_orders = qa.count_paid_orders.get(q, 0)
|
||||
if q.size is not None:
|
||||
q.percent_paid = min(
|
||||
100,
|
||||
round(q.cached_availability_paid_orders / q.size * 100) if q.size > 0 else 100
|
||||
)
|
||||
prepare_quotas_for_boxes(quotas)
|
||||
return ctx
|
||||
|
||||
|
||||
@@ -566,6 +556,17 @@ class SubEventDetail(EventPermissionRequiredMixin, DetailView):
|
||||
for quota in ctx["quotas"]:
|
||||
quota.cached_avail = qa.results[quota]
|
||||
|
||||
ctx['timeline'] = [
|
||||
{
|
||||
'date': t.datetime.astimezone(self.request.event.timezone).date(),
|
||||
'entry': t,
|
||||
'time': t.datetime.astimezone(self.request.event.timezone)
|
||||
}
|
||||
for t in timeline_for_event(self.request.event, self.object)
|
||||
]
|
||||
ctx['today'] = now().astimezone(self.request.event.timezone).date()
|
||||
ctx['nearly_now'] = now().astimezone(self.request.event.timezone) - timedelta(seconds=20)
|
||||
|
||||
return super().get_context_data(
|
||||
**kwargs,
|
||||
**ctx,
|
||||
@@ -1276,6 +1277,11 @@ class SubEventBulkEdit(SubEventQueryMixin, EventPermissionRequiredMixin, FormVie
|
||||
self._default_meta = self.request.event.meta_data
|
||||
|
||||
for p in self.request.organizer.meta_properties.all():
|
||||
if p.protected and not self.request.user.has_organizer_permission(
|
||||
self.request.organizer, 'organizer.settings.general:write', request=self.request
|
||||
):
|
||||
continue
|
||||
|
||||
inst = SubEventMetaValue(property=p)
|
||||
if len(matches[p.id]) == 1 and matches[p.id][0]['c'] == total:
|
||||
inst.value = matches[p.id][0]['value']
|
||||
|
||||
@@ -59,6 +59,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from django.views import View
|
||||
from django.views.decorators.cache import never_cache
|
||||
from django.views.generic import FormView, ListView, TemplateView, UpdateView
|
||||
from django_otp import devices_for_user
|
||||
from django_otp.plugins.otp_static.models import StaticDevice
|
||||
from django_otp.plugins.otp_totp.models import TOTPDevice
|
||||
from django_scopes import scopes_disabled
|
||||
@@ -85,7 +86,6 @@ from pretix.helpers.ratelimit import rate_limit, rate_limit_reset
|
||||
from pretix.helpers.security import session_reauth
|
||||
from pretix.helpers.u2f import websafe_encode
|
||||
|
||||
REAL_DEVICE_TYPES = (TOTPDevice, WebAuthnDevice, U2FDevice)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -313,17 +313,7 @@ class User2FAMainView(RecentAuthenticationRequiredMixin, TemplateView):
|
||||
except StaticDevice.DoesNotExist:
|
||||
ctx['static_tokens_device'] = None
|
||||
|
||||
ctx['devices'] = []
|
||||
for dt in REAL_DEVICE_TYPES:
|
||||
objs = list(dt.objects.filter(user=self.request.user, confirmed=True))
|
||||
for obj in objs:
|
||||
if dt == TOTPDevice:
|
||||
obj.devicetype = 'totp'
|
||||
elif dt == U2FDevice:
|
||||
obj.devicetype = 'u2f'
|
||||
elif dt == WebAuthnDevice:
|
||||
obj.devicetype = 'webauthn'
|
||||
ctx['devices'] += objs
|
||||
ctx['devices'] = [d for d in devices_for_user(self.request.user) if not isinstance(d, StaticDevice)]
|
||||
|
||||
ctx['obligatory'] = None
|
||||
if settings.PRETIX_OBLIGATORY_2FA is True:
|
||||
@@ -342,9 +332,9 @@ class User2FADeviceAddView(RecentAuthenticationRequiredMixin, FormView):
|
||||
template_name = 'pretixcontrol/user/2fa_add.html'
|
||||
|
||||
def form_valid(self, form):
|
||||
if form.cleaned_data['devicetype'] == 'totp':
|
||||
if form.cleaned_data['devicetype'] == 'otp_totp.totpdevice':
|
||||
dev = TOTPDevice.objects.create(user=self.request.user, confirmed=False, name=form.cleaned_data['name'])
|
||||
elif form.cleaned_data['devicetype'] == 'webauthn':
|
||||
elif form.cleaned_data['devicetype'] == 'pretixbase.webauthndevice':
|
||||
if not self.request.is_secure():
|
||||
messages.error(self.request,
|
||||
_('Security devices are only available if pretix is served via HTTPS.'))
|
||||
@@ -364,11 +354,11 @@ class User2FADeviceDeleteView(RecentAuthenticationRequiredMixin, TemplateView):
|
||||
|
||||
@cached_property
|
||||
def device(self):
|
||||
if self.kwargs['devicetype'] == 'totp':
|
||||
if self.kwargs['devicetype'] == 'otp_totp.totpdevice':
|
||||
return get_object_or_404(TOTPDevice, user=self.request.user, pk=self.kwargs['device'], confirmed=True)
|
||||
elif self.kwargs['devicetype'] == 'webauthn':
|
||||
elif self.kwargs['devicetype'] == 'pretixbase.webauthndevice':
|
||||
return get_object_or_404(WebAuthnDevice, user=self.request.user, pk=self.kwargs['device'], confirmed=True)
|
||||
elif self.kwargs['devicetype'] == 'u2f':
|
||||
elif self.kwargs['devicetype'] == 'pretixbase.u2fdevice':
|
||||
return get_object_or_404(U2FDevice, user=self.request.user, pk=self.kwargs['device'], confirmed=True)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@@ -386,7 +376,7 @@ class User2FADeviceDeleteView(RecentAuthenticationRequiredMixin, TemplateView):
|
||||
msgs = [
|
||||
_('A two-factor authentication device has been removed from your account.')
|
||||
]
|
||||
if not any(dt.objects.filter(user=self.request.user, confirmed=True) for dt in REAL_DEVICE_TYPES):
|
||||
if not any(d.confirmed for d in devices_for_user(self.request.user) if not isinstance(d, StaticDevice)):
|
||||
self.request.user.require_2fa = False
|
||||
self.request.user.save()
|
||||
self.request.user.log_action('pretix.user.settings.2fa.disabled', user=self.request.user)
|
||||
@@ -461,7 +451,7 @@ class User2FADeviceConfirmWebAuthnView(RecentAuthenticationRequiredMixin, Templa
|
||||
).first()
|
||||
if credential_id_exists:
|
||||
messages.error(request, _('This security device is already registered.'))
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.webauthn', kwargs={
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.pretixbase.webauthndevice', kwargs={
|
||||
'device': self.device.pk
|
||||
}))
|
||||
|
||||
@@ -475,7 +465,7 @@ class User2FADeviceConfirmWebAuthnView(RecentAuthenticationRequiredMixin, Templa
|
||||
self.device.save()
|
||||
self.request.user.log_action('pretix.user.settings.2fa.device.added', user=self.request.user, data={
|
||||
'id': self.device.pk,
|
||||
'devicetype': 'u2f',
|
||||
'devicetype': 'pretixbase.webauthndevice',
|
||||
'name': self.device.name,
|
||||
})
|
||||
notices = [
|
||||
@@ -503,7 +493,7 @@ class User2FADeviceConfirmWebAuthnView(RecentAuthenticationRequiredMixin, Templa
|
||||
except Exception:
|
||||
messages.error(request, _('The registration could not be completed. Please try again.'))
|
||||
logger.exception('WebAuthn registration failed')
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.webauthn', kwargs={
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.pretixbase.webauthndevice', kwargs={
|
||||
'device': self.device.pk
|
||||
}))
|
||||
|
||||
@@ -537,7 +527,7 @@ class User2FADeviceConfirmTOTPView(RecentAuthenticationRequiredMixin, TemplateVi
|
||||
self.request.user.log_action('pretix.user.settings.2fa.device.added', user=self.request.user, data={
|
||||
'id': self.device.pk,
|
||||
'name': self.device.name,
|
||||
'devicetype': 'totp'
|
||||
'devicetype': 'otp_totp.totpdevice'
|
||||
})
|
||||
notices = [
|
||||
_('A new two-factor authentication device has been added to your account.')
|
||||
@@ -563,7 +553,7 @@ class User2FADeviceConfirmTOTPView(RecentAuthenticationRequiredMixin, TemplateVi
|
||||
else:
|
||||
messages.error(request, _('The code you entered was not valid. If this problem persists, please check '
|
||||
'that the date and time of your phone are configured correctly.'))
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.totp', kwargs={
|
||||
return redirect(reverse('control:user.settings.2fa.confirm.otp_totp.totpdevice', kwargs={
|
||||
'device': self.device.pk
|
||||
}))
|
||||
|
||||
@@ -594,7 +584,7 @@ class User2FAEnableView(RecentAuthenticationRequiredMixin, TemplateView):
|
||||
template_name = 'pretixcontrol/user/2fa_enable.html'
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not any(dt.objects.filter(user=self.request.user, confirmed=True) for dt in REAL_DEVICE_TYPES):
|
||||
if not any(d.confirmed for d in devices_for_user(self.request.user) if not isinstance(d, StaticDevice)):
|
||||
messages.error(request, _('Please configure at least one device before enabling two-factor '
|
||||
'authentication.'))
|
||||
return redirect(reverse('control:user.settings.2fa'))
|
||||
@@ -956,7 +946,7 @@ class UserEmailConfirmView(FormView):
|
||||
|
||||
@transaction.atomic()
|
||||
def form_valid(self, form):
|
||||
reason = self.request.GET['reason']
|
||||
reason = self.request.GET.get('reason')
|
||||
if reason not in ('email_change', 'email_verify'):
|
||||
raise PermissionDenied
|
||||
try:
|
||||
|
||||
@@ -40,6 +40,7 @@ from django.utils.functional import cached_property
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views import View
|
||||
from django.views.generic import ListView, TemplateView
|
||||
from django_otp import devices_for_user
|
||||
from django_otp.plugins.otp_static.models import StaticDevice
|
||||
from hijack import signals
|
||||
|
||||
@@ -107,6 +108,9 @@ class UserEditView(AdministratorPermissionRequiredMixin, RecentAuthenticationReq
|
||||
ctx['backend'] = (
|
||||
b[self.object.auth_backend].verbose_name if self.object.auth_backend in b else self.object.auth_backend
|
||||
)
|
||||
|
||||
ctx['devices'] = devices_for_user(self.object)
|
||||
|
||||
return ctx
|
||||
|
||||
def get_success_url(self):
|
||||
@@ -183,6 +187,25 @@ class UserEmergencyTokenView(AdministratorPermissionRequiredMixin, RecentAuthent
|
||||
return reverse('control:users.edit', kwargs=self.kwargs)
|
||||
|
||||
|
||||
class Reset2FADriftThrottleView(AdministratorPermissionRequiredMixin, RecentAuthenticationRequiredMixin, View):
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
return redirect(reverse('control:users.edit', kwargs=self.kwargs))
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = get_object_or_404(User, pk=self.kwargs.get("id"))
|
||||
self.object.totpdevice_set.update(drift=0, throttling_failure_timestamp=None, throttling_failure_count=0)
|
||||
self.object.staticdevice_set.update(throttling_failure_timestamp=None, throttling_failure_count=0)
|
||||
self.object.log_action('pretix.user.settings.2fa.resetdrift', user=self.request.user)
|
||||
messages.success(request, _(
|
||||
'The drift values for TOTP devices have been reset.'
|
||||
))
|
||||
return redirect(self.get_success_url())
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('control:users.edit', kwargs=self.kwargs)
|
||||
|
||||
|
||||
class UserAnonymizeView(AdministratorPermissionRequiredMixin, RecentAuthenticationRequiredMixin, TemplateView):
|
||||
template_name = "pretixcontrol/users/anonymize.html"
|
||||
|
||||
|
||||
@@ -19,15 +19,33 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
|
||||
# This file is based on an earlier version of pretix which was released under the Apache License 2.0. The full text of
|
||||
# the Apache License 2.0 can be obtained at <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
#
|
||||
# This file may have since been changed and any changes are released under the terms of AGPLv3 as described above. A
|
||||
# full history of changes and contributors is available at <https://github.com/pretix/pretix>.
|
||||
#
|
||||
# This file contains Apache-licensed contributions copyrighted by: Tobias Kunze
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
|
||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
def prepare_quotas_for_boxes(quotas):
|
||||
qa = QuotaAvailability(early_out=False)
|
||||
for q in quotas:
|
||||
qa.queue(q)
|
||||
qa.compute()
|
||||
|
||||
for q in quotas:
|
||||
q.cached_avail = qa.results[q]
|
||||
q.cached_availability_paid_orders = qa.count_paid_orders.get(q, 0)
|
||||
q.used = (
|
||||
qa.count_paid_orders.get(q, 0) +
|
||||
qa.count_pending_orders.get(q, 0) +
|
||||
qa.count_exited_orders.get(q, 0) +
|
||||
qa.count_vouchers.get(q, 0) +
|
||||
qa.count_waitinglist.get(q, 0) +
|
||||
qa.count_cart.get(q, 0)
|
||||
)
|
||||
if q.size is not None:
|
||||
other_blocked = q.size - q.cached_availability_paid_orders - q.cached_avail[1]
|
||||
q.percent_paid = min(
|
||||
100,
|
||||
round(q.cached_availability_paid_orders / q.size * 100) if q.size > 0 else 100
|
||||
)
|
||||
q.percent_other = min(
|
||||
100,
|
||||
round(other_blocked / q.size * 100) if q.size > 0 else 100
|
||||
)
|
||||
@@ -144,7 +144,7 @@ class VoucherList(VoucherQueryMixin, PaginationMixin, EventPermissionRequiredMix
|
||||
headers = [
|
||||
_('Voucher code'), _('Valid until'), _('Product'), _('Reserve quota'), _('Bypass quota'),
|
||||
_('Price effect'), _('Value'), _('Tag'), _('Redeemed'), _('Maximum usages'), _('Seat'),
|
||||
_('Comment')
|
||||
_('Comment'), _('Budget'), _('Budget used')
|
||||
]
|
||||
writer.writerow(headers)
|
||||
|
||||
@@ -170,7 +170,9 @@ class VoucherList(VoucherQueryMixin, PaginationMixin, EventPermissionRequiredMix
|
||||
str(v.redeemed),
|
||||
str(v.max_usages),
|
||||
str(v.seat) if v.seat else "",
|
||||
str(v.comment) if v.comment else ""
|
||||
str(v.comment) if v.comment else "",
|
||||
str(v.budget) if v.budget is not None else "",
|
||||
str(v.budget_used) if v.budget is not None else "",
|
||||
]
|
||||
writer.writerow(row)
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ from http import cookies
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import SuspiciousFileOperation
|
||||
from django.middleware.csrf import CsrfViewMiddleware as BaseCsrfMiddleware
|
||||
from PIL import Image
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.connection import HTTPConnection, HTTPSConnection
|
||||
@@ -42,6 +43,7 @@ from urllib3.util.timeout import _DEFAULT_TIMEOUT
|
||||
|
||||
from pretix.helpers.reportlab import ThumbnailingImageReader
|
||||
from pretix.helpers.ssrf import should_block_access
|
||||
from pretix.multidomain.middlewares import CsrfViewMiddleware
|
||||
|
||||
|
||||
def monkeypatch_vobject_performance():
|
||||
@@ -242,6 +244,20 @@ def monkeypatch_reportlab_imagereader():
|
||||
utils.ImageReader.__init__ = new_init
|
||||
|
||||
|
||||
def monkeypatch_csrf_middleware():
|
||||
# Some views from django or plugins use the middleware or the derived decorators directly,
|
||||
# so we have to also patch the stock middleware
|
||||
BaseCsrfMiddleware._get_secret = CsrfViewMiddleware._get_secret
|
||||
BaseCsrfMiddleware._set_csrf_cookie = CsrfViewMiddleware._set_csrf_cookie
|
||||
|
||||
|
||||
def monkeypatch_json_constants():
|
||||
from json.decoder import _CONSTANTS # noqa
|
||||
del _CONSTANTS['-Infinity']
|
||||
del _CONSTANTS['Infinity']
|
||||
del _CONSTANTS['NaN']
|
||||
|
||||
|
||||
def monkeypatch_all_at_ready():
|
||||
monkeypatch_vobject_performance()
|
||||
monkeypatch_pillow_safer()
|
||||
@@ -249,3 +265,5 @@ def monkeypatch_all_at_ready():
|
||||
monkeypatch_urllib3_ssrf_protection()
|
||||
monkeypatch_cookie_morsel()
|
||||
monkeypatch_reportlab_imagereader()
|
||||
monkeypatch_csrf_middleware()
|
||||
monkeypatch_json_constants()
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: 2026-07-15 14:20+0000\n"
|
||||
"Last-Translator: Llewelyn Barkhuizen <llewelyn@akademia.ac.za>\n"
|
||||
"Language-Team: Afrikaans <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
@@ -198,7 +198,7 @@ msgid "Allowed Post Logout URIs list, space separated"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/api/models.py pretix/base/models/customers.py
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Client ID"
|
||||
msgstr ""
|
||||
|
||||
@@ -1718,6 +1718,18 @@ msgstr ""
|
||||
msgid "Payment providers"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission status"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Cancellation"
|
||||
msgstr ""
|
||||
@@ -2361,7 +2373,6 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
@@ -2385,7 +2396,6 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -2467,7 +2477,6 @@ msgstr ""
|
||||
|
||||
#: pretix/base/exporters/orderlist.py
|
||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payment ID"
|
||||
msgstr ""
|
||||
@@ -4225,6 +4234,10 @@ msgstr ""
|
||||
msgid "Initialization date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/devices.py
|
||||
msgid "Security profile"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/discount.py
|
||||
msgctxt "subevent"
|
||||
msgid "Dates can be mixed without limitation"
|
||||
@@ -5440,6 +5453,10 @@ msgstr ""
|
||||
msgid "Maximum value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Minimum length"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Maximum length"
|
||||
msgstr ""
|
||||
@@ -5506,6 +5523,10 @@ msgstr ""
|
||||
msgid "The maximum value must not be lower than the minimum value."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "The maximum length must not be shorter than the minimum length."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid ""
|
||||
"The system already contains answers to this question that are not compatible "
|
||||
@@ -5999,10 +6020,6 @@ msgstr ""
|
||||
msgid "This reference will be printed on your invoice for your convenience."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html
|
||||
msgid "Badge"
|
||||
@@ -9476,6 +9493,17 @@ msgid ""
|
||||
"'Last date of payments' configured above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow postponed payment choice for sales channels"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"If postponed payment is allowed on a sales channel, customers can complete "
|
||||
"their order without selecting a payment method. This is useful whenever "
|
||||
"orders are not created by the same person who is making the payment."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Show start date"
|
||||
msgstr ""
|
||||
@@ -9997,12 +10025,6 @@ msgstr ""
|
||||
msgid "Hide all unavailable dates from calendar or list views"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"This option currently only affects the calendar of this event series, not "
|
||||
"the organizer-wide calendar."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Hide all past dates from calendar"
|
||||
msgstr ""
|
||||
@@ -14691,6 +14713,11 @@ msgctxt "rrule"
|
||||
msgid "third"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "fourth"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "last"
|
||||
@@ -15674,6 +15701,22 @@ msgstr ""
|
||||
msgid "Queued emails have been aborted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been created."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been changed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been reordered."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Gift card acceptance for another organizer has been added."
|
||||
msgstr ""
|
||||
@@ -15876,6 +15919,10 @@ msgstr ""
|
||||
msgid "A two-factor emergency code has been generated."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Drift and throttle values for two-factor devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -16708,6 +16755,87 @@ msgid ""
|
||||
"Granting access to your pretix account happens at your own risk."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Authorize"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Error:"
|
||||
msgstr ""
|
||||
@@ -17069,82 +17197,6 @@ msgid_plural ""
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||
@@ -19256,7 +19308,7 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
msgid ""
|
||||
"We strongly recommend against using short forms of more then 16 characters."
|
||||
"We strongly recommend against using short forms of more than 16 characters."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
@@ -24196,6 +24248,7 @@ msgid "Add a new device"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_main.html
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Emergency tokens"
|
||||
msgstr ""
|
||||
|
||||
@@ -24440,6 +24493,26 @@ msgstr ""
|
||||
msgid "Authentication backend"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Reset drift and throttle"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Available two-factor authentication methods"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "1 failed attempt since %(date)s"
|
||||
msgid_plural "%(cnt)s failed attempts since %(date)s"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "Currently locked until %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Team memberships"
|
||||
msgstr ""
|
||||
@@ -24893,6 +24966,20 @@ msgstr ""
|
||||
msgid "Invalid code, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} minute."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} minutes."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} second."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} seconds."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/checkin.py
|
||||
msgid "The selected check-ins have been reverted."
|
||||
msgstr ""
|
||||
@@ -25645,6 +25732,10 @@ msgstr ""
|
||||
msgid "You entered an order in an event with a different currency."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "You entered an order in an event that you do not have access to."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid ""
|
||||
"You can not refund more than the amount of a payment that is not yet "
|
||||
@@ -25657,6 +25748,10 @@ msgid ""
|
||||
"refunds."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -25698,10 +25793,6 @@ msgid ""
|
||||
"Your {event} team"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The payment has been created successfully."
|
||||
msgstr ""
|
||||
@@ -26413,6 +26504,10 @@ msgid ""
|
||||
"remain active."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The drift values for TOTP devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The new user has been created."
|
||||
msgstr ""
|
||||
@@ -26425,6 +26520,14 @@ msgstr ""
|
||||
msgid "Bypass quota"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget used"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "The requested voucher does not exist."
|
||||
msgstr ""
|
||||
@@ -26577,12 +26680,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/autocheckin/apps.py pretix/plugins/badges/apps.py
|
||||
#: pretix/plugins/banktransfer/apps.py pretix/plugins/checkinlists/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal/apps.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/pretixdroid/apps.py
|
||||
#: pretix/plugins/reports/apps.py pretix/plugins/returnurl/apps.py
|
||||
#: pretix/plugins/sendmail/apps.py pretix/plugins/statistics/apps.py
|
||||
#: pretix/plugins/stripe/apps.py pretix/plugins/ticketoutputpdf/apps.py
|
||||
#: pretix/plugins/webcheckin/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal2/apps.py
|
||||
#: pretix/plugins/pretixdroid/apps.py pretix/plugins/reports/apps.py
|
||||
#: pretix/plugins/returnurl/apps.py pretix/plugins/sendmail/apps.py
|
||||
#: pretix/plugins/statistics/apps.py pretix/plugins/stripe/apps.py
|
||||
#: pretix/plugins/ticketoutputpdf/apps.py pretix/plugins/webcheckin/apps.py
|
||||
msgid "the pretix team"
|
||||
msgstr ""
|
||||
|
||||
@@ -27133,7 +27235,6 @@ msgstr ""
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payer"
|
||||
@@ -27627,8 +27728,7 @@ msgstr ""
|
||||
msgid "Automatically checked in"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
@@ -27687,152 +27787,6 @@ msgstr ""
|
||||
msgid "A fully customizable payment method for manual processing."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. PayPal is one of the most popular "
|
||||
"payment methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py
|
||||
msgid "PayPal account"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_confirm.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_form.html
|
||||
msgid ""
|
||||
"After you clicked continue, we will redirect you to PayPal to fill in your "
|
||||
"payment details. You will then be redirected back here to review and confirm "
|
||||
"your order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
msgid ""
|
||||
"Our attempt to execute your Payment via PayPal has failed. Please try again "
|
||||
"or contact us."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. In addition to regular PayPal "
|
||||
@@ -27842,10 +27796,23 @@ msgid ""
|
||||
"methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal Merchant ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Even if a customer chooses an Alternative Payment Method, they will always "
|
||||
@@ -27914,6 +27881,26 @@ msgid ""
|
||||
"while the last payment is still under investigation."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "-- Automatic --"
|
||||
msgstr ""
|
||||
@@ -27934,6 +27921,10 @@ msgstr ""
|
||||
msgid "Connect with {icon} PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Please configure a PayPal Webhook to the following endpoint in order to "
|
||||
@@ -27962,6 +27953,12 @@ msgstr ""
|
||||
msgid "An error occurred during connecting with PayPal, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
@@ -27970,6 +27967,10 @@ msgid ""
|
||||
"attempt. You can also try other payment methods, if available."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Something went wrong when requesting the payment status. Please try again."
|
||||
@@ -27979,12 +27980,41 @@ msgstr ""
|
||||
msgid "You may need to enable JavaScript for PayPal payments."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Refunding the amount via PayPal failed: The original payment does not "
|
||||
"contain the required information to issue an automated refund."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal APM"
|
||||
msgstr ""
|
||||
@@ -28072,6 +28102,12 @@ msgstr ""
|
||||
msgid "We will then charge your PayPal account and finalize the order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"After placing your order, you will be able to select your desired payment "
|
||||
@@ -28103,6 +28139,11 @@ msgid ""
|
||||
"different payment method, if you prefer."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
msgid "Capture status"
|
||||
msgstr ""
|
||||
@@ -28113,6 +28154,17 @@ msgid ""
|
||||
"money will not be disbursed and the order remain in its pending state."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca_return.html
|
||||
@@ -28146,6 +28198,12 @@ msgid ""
|
||||
"to resolve this case."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid ""
|
||||
"An error occurred returning from PayPal: request parameters missing. Please "
|
||||
@@ -28176,6 +28234,18 @@ msgid ""
|
||||
"in detail below."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/pretixdroid/apps.py
|
||||
msgid "Old check-in device API"
|
||||
msgstr ""
|
||||
@@ -30195,7 +30265,6 @@ msgstr ""
|
||||
#: pretix/presale/forms/order.py
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
@@ -30616,6 +30685,31 @@ msgid ""
|
||||
"Please go to the payment settings and activate one or more payment providers."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"Not sure yet? You can complete your order first and then select a payment "
|
||||
"method later."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"To do so, please first remove the payment methods you already selected above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed within %(minutes)s minutes."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed by %(deadline)s."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid "Proceed without selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html
|
||||
msgid "Before we continue, we need you to answer some questions."
|
||||
msgstr ""
|
||||
@@ -30682,14 +30776,12 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "minimum amount to order: %(num)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "price"
|
||||
msgid "free"
|
||||
msgstr ""
|
||||
@@ -30718,66 +30810,56 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Original price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "New price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s, at least %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "<strong>plus</strong> %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "incl. %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "checkbox"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -31238,12 +31320,10 @@ msgid "Your order qualifies for a discount"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Uncategorized items"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Show full-size image of %(item)s"
|
||||
msgstr ""
|
||||
@@ -31256,19 +31336,16 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s without taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Set price in %(currency)s for %(item)s"
|
||||
msgstr ""
|
||||
@@ -31927,11 +32004,6 @@ msgid ""
|
||||
"products at the specified price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "from %(minprice)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "You need to select at least %(number)s products."
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-07 09:33+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -765,194 +765,163 @@ msgstr ""
|
||||
msgid "Google Pay"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -960,25 +929,21 @@ msgid ""
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -986,13 +951,11 @@ msgid ""
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1000,115 +963,96 @@ msgid ""
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1117,138 +1061,111 @@ msgid ""
|
||||
"again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -196,7 +196,7 @@ msgid "Allowed Post Logout URIs list, space separated"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/api/models.py pretix/base/models/customers.py
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Client ID"
|
||||
msgstr ""
|
||||
|
||||
@@ -1716,6 +1716,18 @@ msgstr ""
|
||||
msgid "Payment providers"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission status"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Cancellation"
|
||||
msgstr ""
|
||||
@@ -2359,7 +2371,6 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
@@ -2383,7 +2394,6 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -2465,7 +2475,6 @@ msgstr ""
|
||||
|
||||
#: pretix/base/exporters/orderlist.py
|
||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payment ID"
|
||||
msgstr ""
|
||||
@@ -4223,6 +4232,10 @@ msgstr ""
|
||||
msgid "Initialization date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/devices.py
|
||||
msgid "Security profile"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/discount.py
|
||||
msgctxt "subevent"
|
||||
msgid "Dates can be mixed without limitation"
|
||||
@@ -5438,6 +5451,10 @@ msgstr ""
|
||||
msgid "Maximum value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Minimum length"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Maximum length"
|
||||
msgstr ""
|
||||
@@ -5504,6 +5521,10 @@ msgstr ""
|
||||
msgid "The maximum value must not be lower than the minimum value."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "The maximum length must not be shorter than the minimum length."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid ""
|
||||
"The system already contains answers to this question that are not compatible "
|
||||
@@ -5997,10 +6018,6 @@ msgstr ""
|
||||
msgid "This reference will be printed on your invoice for your convenience."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html
|
||||
msgid "Badge"
|
||||
@@ -9474,6 +9491,17 @@ msgid ""
|
||||
"'Last date of payments' configured above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow postponed payment choice for sales channels"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"If postponed payment is allowed on a sales channel, customers can complete "
|
||||
"their order without selecting a payment method. This is useful whenever "
|
||||
"orders are not created by the same person who is making the payment."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Show start date"
|
||||
msgstr ""
|
||||
@@ -9995,12 +10023,6 @@ msgstr ""
|
||||
msgid "Hide all unavailable dates from calendar or list views"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"This option currently only affects the calendar of this event series, not "
|
||||
"the organizer-wide calendar."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Hide all past dates from calendar"
|
||||
msgstr ""
|
||||
@@ -14689,6 +14711,11 @@ msgctxt "rrule"
|
||||
msgid "third"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "fourth"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "last"
|
||||
@@ -15672,6 +15699,22 @@ msgstr ""
|
||||
msgid "Queued emails have been aborted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been created."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been changed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been reordered."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Gift card acceptance for another organizer has been added."
|
||||
msgstr ""
|
||||
@@ -15874,6 +15917,10 @@ msgstr ""
|
||||
msgid "A two-factor emergency code has been generated."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Drift and throttle values for two-factor devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -16706,6 +16753,87 @@ msgid ""
|
||||
"Granting access to your pretix account happens at your own risk."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Authorize"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Error:"
|
||||
msgstr ""
|
||||
@@ -17067,82 +17195,6 @@ msgid_plural ""
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||
@@ -19254,7 +19306,7 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
msgid ""
|
||||
"We strongly recommend against using short forms of more then 16 characters."
|
||||
"We strongly recommend against using short forms of more than 16 characters."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
@@ -24194,6 +24246,7 @@ msgid "Add a new device"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_main.html
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Emergency tokens"
|
||||
msgstr ""
|
||||
|
||||
@@ -24438,6 +24491,26 @@ msgstr ""
|
||||
msgid "Authentication backend"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Reset drift and throttle"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Available two-factor authentication methods"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "1 failed attempt since %(date)s"
|
||||
msgid_plural "%(cnt)s failed attempts since %(date)s"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "Currently locked until %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Team memberships"
|
||||
msgstr ""
|
||||
@@ -24891,6 +24964,20 @@ msgstr ""
|
||||
msgid "Invalid code, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} minute."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} minutes."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} second."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} seconds."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/checkin.py
|
||||
msgid "The selected check-ins have been reverted."
|
||||
msgstr ""
|
||||
@@ -25643,6 +25730,10 @@ msgstr ""
|
||||
msgid "You entered an order in an event with a different currency."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "You entered an order in an event that you do not have access to."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid ""
|
||||
"You can not refund more than the amount of a payment that is not yet "
|
||||
@@ -25655,6 +25746,10 @@ msgid ""
|
||||
"refunds."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -25696,10 +25791,6 @@ msgid ""
|
||||
"Your {event} team"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The payment has been created successfully."
|
||||
msgstr ""
|
||||
@@ -26411,6 +26502,10 @@ msgid ""
|
||||
"remain active."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The drift values for TOTP devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The new user has been created."
|
||||
msgstr ""
|
||||
@@ -26423,6 +26518,14 @@ msgstr ""
|
||||
msgid "Bypass quota"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget used"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "The requested voucher does not exist."
|
||||
msgstr ""
|
||||
@@ -26575,12 +26678,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/autocheckin/apps.py pretix/plugins/badges/apps.py
|
||||
#: pretix/plugins/banktransfer/apps.py pretix/plugins/checkinlists/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal/apps.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/pretixdroid/apps.py
|
||||
#: pretix/plugins/reports/apps.py pretix/plugins/returnurl/apps.py
|
||||
#: pretix/plugins/sendmail/apps.py pretix/plugins/statistics/apps.py
|
||||
#: pretix/plugins/stripe/apps.py pretix/plugins/ticketoutputpdf/apps.py
|
||||
#: pretix/plugins/webcheckin/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal2/apps.py
|
||||
#: pretix/plugins/pretixdroid/apps.py pretix/plugins/reports/apps.py
|
||||
#: pretix/plugins/returnurl/apps.py pretix/plugins/sendmail/apps.py
|
||||
#: pretix/plugins/statistics/apps.py pretix/plugins/stripe/apps.py
|
||||
#: pretix/plugins/ticketoutputpdf/apps.py pretix/plugins/webcheckin/apps.py
|
||||
msgid "the pretix team"
|
||||
msgstr ""
|
||||
|
||||
@@ -27131,7 +27233,6 @@ msgstr ""
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payer"
|
||||
@@ -27625,8 +27726,7 @@ msgstr ""
|
||||
msgid "Automatically checked in"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
@@ -27685,152 +27785,6 @@ msgstr ""
|
||||
msgid "A fully customizable payment method for manual processing."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. PayPal is one of the most popular "
|
||||
"payment methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py
|
||||
msgid "PayPal account"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_confirm.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_form.html
|
||||
msgid ""
|
||||
"After you clicked continue, we will redirect you to PayPal to fill in your "
|
||||
"payment details. You will then be redirected back here to review and confirm "
|
||||
"your order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
msgid ""
|
||||
"Our attempt to execute your Payment via PayPal has failed. Please try again "
|
||||
"or contact us."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. In addition to regular PayPal "
|
||||
@@ -27840,10 +27794,23 @@ msgid ""
|
||||
"methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal Merchant ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Even if a customer chooses an Alternative Payment Method, they will always "
|
||||
@@ -27912,6 +27879,26 @@ msgid ""
|
||||
"while the last payment is still under investigation."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "-- Automatic --"
|
||||
msgstr ""
|
||||
@@ -27932,6 +27919,10 @@ msgstr ""
|
||||
msgid "Connect with {icon} PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Please configure a PayPal Webhook to the following endpoint in order to "
|
||||
@@ -27960,6 +27951,12 @@ msgstr ""
|
||||
msgid "An error occurred during connecting with PayPal, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
@@ -27968,6 +27965,10 @@ msgid ""
|
||||
"attempt. You can also try other payment methods, if available."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Something went wrong when requesting the payment status. Please try again."
|
||||
@@ -27977,12 +27978,41 @@ msgstr ""
|
||||
msgid "You may need to enable JavaScript for PayPal payments."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Refunding the amount via PayPal failed: The original payment does not "
|
||||
"contain the required information to issue an automated refund."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal APM"
|
||||
msgstr ""
|
||||
@@ -28070,6 +28100,12 @@ msgstr ""
|
||||
msgid "We will then charge your PayPal account and finalize the order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"After placing your order, you will be able to select your desired payment "
|
||||
@@ -28101,6 +28137,11 @@ msgid ""
|
||||
"different payment method, if you prefer."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
msgid "Capture status"
|
||||
msgstr ""
|
||||
@@ -28111,6 +28152,17 @@ msgid ""
|
||||
"money will not be disbursed and the order remain in its pending state."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca_return.html
|
||||
@@ -28144,6 +28196,12 @@ msgid ""
|
||||
"to resolve this case."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid ""
|
||||
"An error occurred returning from PayPal: request parameters missing. Please "
|
||||
@@ -28174,6 +28232,18 @@ msgid ""
|
||||
"in detail below."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/pretixdroid/apps.py
|
||||
msgid "Old check-in device API"
|
||||
msgstr ""
|
||||
@@ -30193,7 +30263,6 @@ msgstr ""
|
||||
#: pretix/presale/forms/order.py
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
@@ -30614,6 +30683,31 @@ msgid ""
|
||||
"Please go to the payment settings and activate one or more payment providers."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"Not sure yet? You can complete your order first and then select a payment "
|
||||
"method later."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"To do so, please first remove the payment methods you already selected above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed within %(minutes)s minutes."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed by %(deadline)s."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid "Proceed without selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html
|
||||
msgid "Before we continue, we need you to answer some questions."
|
||||
msgstr ""
|
||||
@@ -30680,14 +30774,12 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "minimum amount to order: %(num)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "price"
|
||||
msgid "free"
|
||||
msgstr ""
|
||||
@@ -30716,66 +30808,56 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Original price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "New price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s, at least %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "<strong>plus</strong> %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "incl. %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "checkbox"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -31236,12 +31318,10 @@ msgid "Your order qualifies for a discount"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Uncategorized items"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Show full-size image of %(item)s"
|
||||
msgstr ""
|
||||
@@ -31254,19 +31334,16 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s without taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Set price in %(currency)s for %(item)s"
|
||||
msgstr ""
|
||||
@@ -31925,11 +32002,6 @@ msgid ""
|
||||
"products at the specified price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "from %(minprice)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "You need to select at least %(number)s products."
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -766,194 +766,163 @@ msgstr ""
|
||||
msgid "Google Pay"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -961,25 +930,21 @@ msgid ""
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -987,13 +952,11 @@ msgid ""
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1001,115 +964,96 @@ msgid ""
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1118,138 +1062,111 @@ msgid ""
|
||||
"again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: 2026-07-13 11:28+0000\n"
|
||||
"Last-Translator: ahmed badr <ahmedbadr@oma.com.eg>\n"
|
||||
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -648,7 +648,8 @@ msgstr "خطأ غير معروف."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "يتميز لونك بتباين رائع ويسهل قراءته للغاية! وسيوفر إمكانية وصول ممتازة."
|
||||
msgstr ""
|
||||
"يتميز لونك بتباين رائع ويسهل قراءته للغاية! وسيوفر إمكانية وصول ممتازة."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid ""
|
||||
@@ -663,8 +664,8 @@ msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"اللون الذي اخترته لا يتمتع بتباين كافٍ مع اللون الأبيض. وسيؤثر ذلك على إمكانية "
|
||||
"الوصول إلى موقعك."
|
||||
"اللون الذي اخترته لا يتمتع بتباين كافٍ مع اللون الأبيض. وسيؤثر ذلك على "
|
||||
"إمكانية الوصول إلى موقعك."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Search query"
|
||||
@@ -794,194 +795,163 @@ msgstr "التوقيت المحلي:"
|
||||
msgid "Google Pay"
|
||||
msgstr "Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr "الكمية"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr "تقليل الكمية"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr "زيادة الكمية"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr "تصفية الأحداث حسب"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr "فلتر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr "السعر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr "السعر الأصلي: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr "السعر الجديد: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr "المختارة فقط"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr "تم اختيار %s فقط"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr "اختر النوع %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr "تم البيع بالكامل"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr "اشتري"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr "سجل"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr "محجوز"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr "مجاني"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr "من %(currency) s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr "صورة لـ %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr "يشمل %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr "بالإضافة إلى %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr "شامل الضريبة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr "بالإضافة إلى الضرائب"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr "متوفر حاليا: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr "متوفرة مع القسيمة فقط"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr "حاليًا غير متوفر: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr "لم يعد متوفراً"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "غير متوفر حاليًا: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr "الحد الأدنى للطلب: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr "إغلاق متجر التذاكر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr "لا يمكن تحميل متجر التذاكر."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -991,25 +961,21 @@ msgstr ""
|
||||
"يوجد حالياً عدد كبير من المستخدمين في متجر التذاكر هذا. يرجى فتح المتجر في "
|
||||
"علامة تبويب جديدة للمتابعة."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr "إغلاق/فتح متجر التذاكر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr "استئناف عملية الدفع"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr "لا يمكن إنشاء سلة التسوق. الرجاء المحاولة مرة أخرى في وقت لاحق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1017,16 +983,14 @@ msgid ""
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
"لم نتمكن من إنشاء سلة التسوق الخاصة بك، نظرًا لوجود عدد كبير جدًّا من "
|
||||
"المستخدمين حاليًّا في متجر التذاكر هذا. يرجى النقر على «متابعة» لإعادة المحاولة "
|
||||
"في علامة تبويب جديدة."
|
||||
"المستخدمين حاليًّا في متجر التذاكر هذا. يرجى النقر على «متابعة» لإعادة "
|
||||
"المحاولة في علامة تبويب جديدة."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr "قائمة الإنتظار"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1036,115 +1000,96 @@ msgstr ""
|
||||
"لديك الآن سلة تسوق مفعلة لهذا الحدث. إذا قمت باختيار منتجات أخرى سيتم "
|
||||
"إضافتها إلى سلة التسوق الموجودة حالياً."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr "استئناف الدفع"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr "استبدال قسيمة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr "استبدال"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr "رمز القسيمة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr "إغلاق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "إغلاق عملية الدفع"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr "لا يمكنك إلغاء هذه العملية. يرجى الانتظار حتى ينتهي التحميل."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr "استمرار"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr "انظر الاختلافات"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr "إخفاء الاختلافات"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr "اختر فعالية أخرى"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr "اختر تاريخا آخر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr "العودة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr "الشهر القادم"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr "الشهر السابق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr "الأسبوع القادم"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr "الأسبوع السابق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr "خيارات المقاعد"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1155,138 +1100,111 @@ msgstr ""
|
||||
"تم بيع جميع فئات التذاكر أو بعضها حاليًا. إذا أردت، يمكنك إضافة اسمك إلى "
|
||||
"قائمة الانتظار. وسنقوم بإخطارك إذا توفرت مقاعد مرة أخرى."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr "تحميل المزيد"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr "الإثنين"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr "الثلاثاء"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr "الأربعاء"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr "الخميس"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr "الجمعة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr "السبت"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr "الأحد"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr "الاثنين"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr "الثلاثاء"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr "الأربعاء"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr "الخميس"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr "الجمعة"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr "السبت"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr "الأحد"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr "يناير"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr "فبراير"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr "مارس"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr "أبريل"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr "هناك"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr "يونيو"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr "يوليو"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr "أغسطس"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr "سبتمبر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr "أكتوبر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr "نوفمبر"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr "ديسمبر"
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-08-24 15:35+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: 2024-12-11 01:00+0000\n"
|
||||
"Last-Translator: Neriman Memmedli <nerim4n@pm.me>\n"
|
||||
"Language-Team: Azerbaijani <https://translate.pretix.eu/projects/pretix/"
|
||||
@@ -198,7 +198,7 @@ msgid "Allowed Post Logout URIs list, space separated"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/api/models.py pretix/base/models/customers.py
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Client ID"
|
||||
msgstr ""
|
||||
|
||||
@@ -1718,6 +1718,18 @@ msgstr ""
|
||||
msgid "Payment providers"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission status"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Transmission date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/exporters/invoices.py
|
||||
msgid "Cancellation"
|
||||
msgstr ""
|
||||
@@ -2361,7 +2373,6 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/organizers/giftcard.html
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
@@ -2385,7 +2396,6 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -2467,7 +2477,6 @@ msgstr ""
|
||||
|
||||
#: pretix/base/exporters/orderlist.py
|
||||
#: pretix/control/templates/pretixcontrol/search/payments.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payment ID"
|
||||
msgstr ""
|
||||
@@ -4225,6 +4234,10 @@ msgstr ""
|
||||
msgid "Initialization date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/devices.py
|
||||
msgid "Security profile"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/discount.py
|
||||
msgctxt "subevent"
|
||||
msgid "Dates can be mixed without limitation"
|
||||
@@ -5440,6 +5453,10 @@ msgstr ""
|
||||
msgid "Maximum value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Minimum length"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Maximum length"
|
||||
msgstr ""
|
||||
@@ -5506,6 +5523,10 @@ msgstr ""
|
||||
msgid "The maximum value must not be lower than the minimum value."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "The maximum length must not be shorter than the minimum length."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid ""
|
||||
"The system already contains answers to this question that are not compatible "
|
||||
@@ -5999,10 +6020,6 @@ msgstr ""
|
||||
msgid "This reference will be printed on your invoice for your convenience."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
msgid "Transmission type"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/models/orders.py
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html
|
||||
msgid "Badge"
|
||||
@@ -9476,6 +9493,17 @@ msgid ""
|
||||
"'Last date of payments' configured above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow postponed payment choice for sales channels"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"If postponed payment is allowed on a sales channel, customers can complete "
|
||||
"their order without selecting a payment method. This is useful whenever "
|
||||
"orders are not created by the same person who is making the payment."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Show start date"
|
||||
msgstr ""
|
||||
@@ -9997,12 +10025,6 @@ msgstr ""
|
||||
msgid "Hide all unavailable dates from calendar or list views"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"This option currently only affects the calendar of this event series, not "
|
||||
"the organizer-wide calendar."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Hide all past dates from calendar"
|
||||
msgstr ""
|
||||
@@ -14691,6 +14713,11 @@ msgctxt "rrule"
|
||||
msgid "third"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "fourth"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/forms/rrule.py
|
||||
msgctxt "rrule"
|
||||
msgid "last"
|
||||
@@ -15674,6 +15701,22 @@ msgstr ""
|
||||
msgid "Queued emails have been aborted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been created."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been deleted."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been changed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "An organizer meta property has been reordered."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Gift card acceptance for another organizer has been added."
|
||||
msgstr ""
|
||||
@@ -15876,6 +15919,10 @@ msgstr ""
|
||||
msgid "A two-factor emergency code has been generated."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "Drift and throttle values for two-factor devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -16708,6 +16755,87 @@ msgid ""
|
||||
"Granting access to your pretix account happens at your own risk."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Authorize"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html
|
||||
msgid "Error:"
|
||||
msgstr ""
|
||||
@@ -17069,82 +17197,6 @@ msgid_plural ""
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/reset.html
|
||||
#: pretix/control/templates/pretixcontrol/datasync/control_order_info.html
|
||||
#: pretix/control/templates/pretixcontrol/email_setup_simple.html
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/item/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/category_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/discount_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/question_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/items/quota_delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html
|
||||
#: pretix/control/templates/pretixcontrol/oauth/auth_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_contact.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_locale.html
|
||||
#: pretix/control/templates/pretixcontrol/order/change_questions.html
|
||||
#: pretix/control/templates/pretixcontrol/order/extend.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay.html
|
||||
#: pretix/control/templates/pretixcontrol/order/pay_complete.html
|
||||
#: pretix/control/templates/pretixcontrol/order/reactivate.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_choose.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_done.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_process.html
|
||||
#: pretix/control/templates/pretixcontrol/order/refund_start.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/bulk_action.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/channel_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_revoke.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/membershiptype_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/property_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoclient_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/ssoprovider_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/team_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/subevents/edit.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_disable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_enable.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_email.html
|
||||
#: pretix/control/templates/pretixcontrol/user/change_password.html
|
||||
#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/edit.html
|
||||
#: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html
|
||||
#: pretix/plugins/badges/templates/pretixplugins/badges/delete.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/delete.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_modify.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_change.html
|
||||
#: pretix/presale/templates/pretixpresale/event/position_modify.html
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html
|
||||
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html
|
||||
#: pretix/control/templates/pretixcontrol/event/delete.html
|
||||
@@ -19256,7 +19308,7 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
msgid ""
|
||||
"We strongly recommend against using short forms of more then 16 characters."
|
||||
"We strongly recommend against using short forms of more than 16 characters."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/events/create_basics.html
|
||||
@@ -24196,6 +24248,7 @@ msgid "Add a new device"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_main.html
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Emergency tokens"
|
||||
msgstr ""
|
||||
|
||||
@@ -24440,6 +24493,26 @@ msgstr ""
|
||||
msgid "Authentication backend"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Reset drift and throttle"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Available two-factor authentication methods"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "1 failed attempt since %(date)s"
|
||||
msgid_plural "%(cnt)s failed attempts since %(date)s"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
#, python-format
|
||||
msgid "Currently locked until %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html
|
||||
msgid "Team memberships"
|
||||
msgstr ""
|
||||
@@ -24893,6 +24966,20 @@ msgstr ""
|
||||
msgid "Invalid code, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} minute."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} minutes."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/auth.py
|
||||
#, python-brace-format
|
||||
msgid "Invalid code. Please try again after waiting {value} second."
|
||||
msgid_plural "Invalid code. Please try again after waiting {value} seconds."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/control/views/checkin.py
|
||||
msgid "The selected check-ins have been reverted."
|
||||
msgstr ""
|
||||
@@ -25645,6 +25732,10 @@ msgstr ""
|
||||
msgid "You entered an order in an event with a different currency."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "You entered an order in an event that you do not have access to."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid ""
|
||||
"You can not refund more than the amount of a payment that is not yet "
|
||||
@@ -25657,6 +25748,10 @@ msgid ""
|
||||
"refunds."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
@@ -25698,10 +25793,6 @@ msgid ""
|
||||
"Your {event} team"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The refunds you selected do not match the selected total refund amount."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/orders.py
|
||||
msgid "The payment has been created successfully."
|
||||
msgstr ""
|
||||
@@ -26413,6 +26504,10 @@ msgid ""
|
||||
"remain active."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The drift values for TOTP devices have been reset."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/users.py
|
||||
msgid "The new user has been created."
|
||||
msgstr ""
|
||||
@@ -26425,6 +26520,14 @@ msgstr ""
|
||||
msgid "Bypass quota"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "Budget used"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/control/views/vouchers.py
|
||||
msgid "The requested voucher does not exist."
|
||||
msgstr ""
|
||||
@@ -26579,12 +26682,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/autocheckin/apps.py pretix/plugins/badges/apps.py
|
||||
#: pretix/plugins/banktransfer/apps.py pretix/plugins/checkinlists/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal/apps.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/pretixdroid/apps.py
|
||||
#: pretix/plugins/reports/apps.py pretix/plugins/returnurl/apps.py
|
||||
#: pretix/plugins/sendmail/apps.py pretix/plugins/statistics/apps.py
|
||||
#: pretix/plugins/stripe/apps.py pretix/plugins/ticketoutputpdf/apps.py
|
||||
#: pretix/plugins/webcheckin/apps.py
|
||||
#: pretix/plugins/manualpayment/apps.py pretix/plugins/paypal2/apps.py
|
||||
#: pretix/plugins/pretixdroid/apps.py pretix/plugins/reports/apps.py
|
||||
#: pretix/plugins/returnurl/apps.py pretix/plugins/sendmail/apps.py
|
||||
#: pretix/plugins/statistics/apps.py pretix/plugins/stripe/apps.py
|
||||
#: pretix/plugins/ticketoutputpdf/apps.py pretix/plugins/webcheckin/apps.py
|
||||
msgid "the pretix team"
|
||||
msgstr ""
|
||||
|
||||
@@ -27135,7 +27237,6 @@ msgstr ""
|
||||
#: pretix/plugins/banktransfer/refund_export.py
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Payer"
|
||||
@@ -27629,8 +27730,7 @@ msgstr ""
|
||||
msgid "Automatically checked in"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/checkinlists/exporters.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
@@ -27689,152 +27789,6 @@ msgstr ""
|
||||
msgid "A fully customizable payment method for manual processing."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py pretix/plugins/paypal/payment.py
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. PayPal is one of the most popular "
|
||||
"payment methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py
|
||||
msgid "PayPal account"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/payment.py pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_confirm.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/checkout_payment_form.html
|
||||
msgid ""
|
||||
"After you clicked continue, we will redirect you to PayPal to fill in your "
|
||||
"payment details. You will then be redirected back here to review and confirm "
|
||||
"your order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
msgid ""
|
||||
"Our attempt to execute your Payment via PayPal has failed. Please try again "
|
||||
"or contact us."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/templates/pretixplugins/paypal/pending.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal/views.py pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py
|
||||
msgid ""
|
||||
"Accept payments with your PayPal account. In addition to regular PayPal "
|
||||
@@ -27844,10 +27798,23 @@ msgid ""
|
||||
"methods world-wide."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/apps.py pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal Merchant ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Click here for a tutorial on how to obtain the required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py pretix/plugins/stripe/payment.py
|
||||
msgid "Endpoint"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Even if a customer chooses an Alternative Payment Method, they will always "
|
||||
@@ -27916,6 +27883,26 @@ msgid ""
|
||||
"while the last payment is still under investigation."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference prefix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added in front of the regular booking "
|
||||
"reference containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Reference postfix"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Any value entered here will be added behind the regular booking reference "
|
||||
"containing the order number."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "-- Automatic --"
|
||||
msgstr ""
|
||||
@@ -27936,6 +27923,10 @@ msgstr ""
|
||||
msgid "Connect with {icon} PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "Disconnect from PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Please configure a PayPal Webhook to the following endpoint in order to "
|
||||
@@ -27964,6 +27955,12 @@ msgstr ""
|
||||
msgid "An error occurred during connecting with PayPal, please try again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"The PayPal sandbox is being used, you can test without actually sending "
|
||||
"money but you will need a PayPal sandbox user to log in."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
@@ -27972,6 +27969,10 @@ msgid ""
|
||||
"attempt. You can also try other payment methods, if available."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "We had trouble communicating with PayPal"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Something went wrong when requesting the payment status. Please try again."
|
||||
@@ -27981,12 +27982,41 @@ msgstr ""
|
||||
msgid "You may need to enable JavaScript for PayPal payments."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"We were unable to process your payment. See below for details on how to "
|
||||
"proceed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"PayPal has not yet approved the payment. We will inform you as soon as the "
|
||||
"payment completed."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid ""
|
||||
"Refunding the amount via PayPal failed: The original payment does not "
|
||||
"contain the required information to issue an automated refund."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
#, python-brace-format
|
||||
msgid "Refunding the amount via PayPal failed: {}"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "The payment for this invoice has already been received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal payment ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/payment.py
|
||||
msgid "PayPal APM"
|
||||
msgstr ""
|
||||
@@ -28074,6 +28104,12 @@ msgstr ""
|
||||
msgid "We will then charge your PayPal account and finalize the order."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"The total amount listed above will be withdrawn from your PayPal account "
|
||||
"after the confirmation of your purchase."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/checkout_payment_confirm.html
|
||||
msgid ""
|
||||
"After placing your order, you will be able to select your desired payment "
|
||||
@@ -28105,6 +28141,11 @@ msgid ""
|
||||
"different payment method, if you prefer."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Sale ID"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
msgid "Capture status"
|
||||
msgstr ""
|
||||
@@ -28115,6 +28156,17 @@ msgid ""
|
||||
"money will not be disbursed and the order remain in its pending state."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
msgid "Last update"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html
|
||||
msgid "Total value"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca.html
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/sca_return.html
|
||||
@@ -28148,6 +28200,12 @@ msgid ""
|
||||
"to resolve this case."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pending.html
|
||||
msgid ""
|
||||
"We're waiting for an answer from PayPal regarding your payment. Please "
|
||||
"contact us, if this takes more than a few hours."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid ""
|
||||
"An error occurred returning from PayPal: request parameters missing. Please "
|
||||
@@ -28178,6 +28236,18 @@ msgid ""
|
||||
"in detail below."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Invalid response from PayPal received."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "It looks like you canceled the PayPal payment"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/views.py
|
||||
msgid "Your PayPal account has been disconnected."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/plugins/pretixdroid/apps.py
|
||||
msgid "Old check-in device API"
|
||||
msgstr ""
|
||||
@@ -30197,7 +30267,6 @@ msgstr ""
|
||||
#: pretix/presale/forms/order.py
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
@@ -30618,6 +30687,31 @@ msgid ""
|
||||
"Please go to the payment settings and activate one or more payment providers."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"Not sure yet? You can complete your order first and then select a payment "
|
||||
"method later."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid ""
|
||||
"To do so, please first remove the payment methods you already selected above."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed within %(minutes)s minutes."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
#, python-format
|
||||
msgid "Your payment needs to be completed by %(deadline)s."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html
|
||||
msgid "Proceed without selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html
|
||||
msgid "Before we continue, we need you to answer some questions."
|
||||
msgstr ""
|
||||
@@ -30684,14 +30778,12 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "minimum amount to order: %(num)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "price"
|
||||
msgid "free"
|
||||
msgstr ""
|
||||
@@ -30720,66 +30812,56 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Original price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "New price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s, at least %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Modify price for %(item)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "<strong>plus</strong> %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "incl. %(rate)s%% %(name)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgctxt "checkbox"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
@@ -31240,12 +31322,10 @@ msgid "Your order qualifies for a discount"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
msgid "Uncategorized items"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Show full-size image of %(item)s"
|
||||
msgstr ""
|
||||
@@ -31258,19 +31338,16 @@ msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "%(value)s without taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "Set price in %(currency)s for %(item)s"
|
||||
msgstr ""
|
||||
@@ -31929,11 +32006,6 @@ msgid ""
|
||||
"products at the specified price:"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "from %(minprice)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/voucher.html
|
||||
#, python-format
|
||||
msgid "You need to select at least %(number)s products."
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -766,194 +766,163 @@ msgstr ""
|
||||
msgid "Google Pay"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -961,25 +930,21 @@ msgid ""
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -987,13 +952,11 @@ msgid ""
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1001,115 +964,96 @@ msgid ""
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1118,138 +1062,111 @@ msgid ""
|
||||
"again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: 2025-10-31 17:00+0000\n"
|
||||
"Last-Translator: Núria Masclans <nuriamasclansserrat@gmail.com>\n"
|
||||
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -787,194 +787,163 @@ msgstr "La teva hora local:"
|
||||
msgid "Google Pay"
|
||||
msgstr "Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr "Quantitat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr "Disminueix quantitat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr "Augmenta quantitat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr "Filtra els esdeveniments per"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr "Filtra"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr "Preu"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr "Preu original: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr "Nou preu: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr "Selecciona"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr "Selecciona %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr "Selecciona la variant %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr "Esgotat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr "Compra"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr "Registrar-vos"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr "Reservat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr "GRATUÏT"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr "des de %(price)s %(currency)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr "Imatge de %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr "Inclòs %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr "més %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr "incl. impostos"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr "més impostos"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr "disponibles: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr "Només disponible amb un cupó"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr "Encara no disponible"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr "Ja no està disponible"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "No disponible"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr "Comanda mínima: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr "Tanca la botiga d'entrades"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr "No s'ha pogut carregar la botiga d'entrades."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -982,25 +951,21 @@ msgid ""
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1008,13 +973,11 @@ msgid ""
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1022,115 +985,96 @@ msgid ""
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1139,138 +1083,111 @@ msgid ""
|
||||
"again."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"POT-Creation-Date: 2026-09-30 07:26+0000\n"
|
||||
"PO-Revision-Date: 2026-01-08 04:00+0000\n"
|
||||
"Last-Translator: Jiří Pastrňák <jiri@pastrnak.email>\n"
|
||||
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -801,194 +801,163 @@ msgstr "Místní čas:"
|
||||
msgid "Google Pay"
|
||||
msgstr "Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr "Počet"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr "Snížit počet"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr "Zvýšit počet"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr "Filtrovat události"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr "Filtrovat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr "Cena"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr "Původní cena: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr "Nová cena: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr "Vybrat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr "Vybrat %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr "Vybrat variantu %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr "Vyprodáno"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr "Koupit"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr "Zaregistrovat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr "Rezervováno"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr "ZDARMA"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr "od %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr "Obrázek%s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr "včetně %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr "plus %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr "včetně daní"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr "plus daně"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr "aktuálně k dispozici: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr "K dispozici pouze s poukazem"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr "Zatím není k dispozici"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr "Již není k dispozici"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "Momentálně není k dispozici"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr "minimální množství pro objednávku: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr "Zavřít obchod"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr "Obchod vstupenek nemohl být načten."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -998,25 +967,21 @@ msgstr ""
|
||||
"V současné době je v tomto obchodě s vstupenkami mnoho uživatelů. Otevřete "
|
||||
"prosím obchod v nové kartě."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr "Obchod vstupenek otevřit"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr "Přejít k platbě"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr "Nákupní košík se nepodařilo vytvořit. Zkuste to prosím znovu"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1027,13 +992,11 @@ msgstr ""
|
||||
"mnoho uživatelů. Klikněte prosím na \"Pokračovat\" a zkuste to znovu na nové "
|
||||
"kartě."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr "Čekací listina"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1043,37 +1006,31 @@ msgstr ""
|
||||
"V současné době máte aktivní košík pro tuto událost. Pokud vyberete další "
|
||||
"produkty, budou přidány do vašeho košíku."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr "Obnovit checkout"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr "Uplatnit poukázku"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr "Uplatnit"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr "Kód poukázky"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr "Zavřít"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
@@ -1082,79 +1039,66 @@ msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Obnovit checkout"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr "Pokračovat"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr "Zobrazit možnosti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr "Skrýt možnosti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr "Vybrat jinou událost"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr "Vybrat jiný datum"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr "Zpět"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr "Následující měsíc"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr "Předchozí měsíc"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr "Příští týden"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr "Předchozí týden"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr "Otevřete výběr míst"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid ""
|
||||
@@ -1166,138 +1110,111 @@ msgstr ""
|
||||
"Pokud chcete, můžete se přidat na čekací listinu. Poté vás budeme "
|
||||
"informovat, pokud budou místa opět volná."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr "Načíst více"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Mo"
|
||||
msgstr "Po"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tu"
|
||||
msgstr "Út"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "We"
|
||||
msgstr "St"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Th"
|
||||
msgstr "Čt"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Fr"
|
||||
msgstr "Pá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sa"
|
||||
msgstr "So"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Su"
|
||||
msgstr "Ne"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr "Pondělí"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr "Úterý"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr "Středa"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr "Čtvrtek"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr "Pátek"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr "Sobota"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr "Neděle"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr "Leden"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr "Únor"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr "Březen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr "Duben"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr "Květen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr "červen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr "Červenec"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr "Srpen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr "Září"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr "Říjen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr "Listopad"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr "Prosinec"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user