Compare commits

...
Author SHA1 Message Date
Raphael Michel 37f48ffd49 Expose logs of all running processes to docker 2020-12-14 13:10:44 +01:00
Raphael Michel a5e41aae50 Add MapQuest as additional geocoding provider 2020-12-12 15:13:56 +01:00
Raphael Michel 54e4ad1a1c Merge pull request #1871 from pretix-translations/weblate-pretix-pretix 2020-12-11 18:47:15 +01:00
Maarten van den Berg b6e4163c2b Translated on translate.pretix.eu (Dutch)
Currently translated at 99.2% (3830 of 3859 strings)

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

powered by weblate
2020-12-11 17:50:38 +01:00
Maarten van den Berg 1aa1583eae Translated on translate.pretix.eu (Dutch)
Currently translated at 98.9% (3817 of 3859 strings)

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

powered by weblate
2020-12-11 17:50:38 +01:00
Raphael Michel fc210cf06d Add sanity check to tax calculation 2020-12-11 17:46:42 +01:00
Raphael Michel 3459f3e4c4 Tax rules: Allow per-country text on invoices 2020-12-11 17:45:36 +01:00
Raphael Michel 903a7f122d Tax rule editor: Allow to reorder lines 2020-12-11 16:24:05 +01:00
Raphael Michel 246d150511 Tax rule editor: Show edit history 2020-12-11 15:38:05 +01:00
Raphael Michel 2cd5094393 Tax rule editor: Use cacehd countries 2020-12-11 15:19:34 +01:00
Raphael Michel a665836a60 Add a custom text field for every attendee in the question step 2020-12-10 18:19:51 +01:00
Raphael Michel e7d2d0ddab Adjust tests broken by 0a55fdbc4 2020-12-10 18:10:45 +01:00
Raphael Michel 1d722da5af Fix tax calculation issue 2020-12-10 18:04:56 +01:00
Raphael Michel 90475e4159 Fix another bug introduced in last commit 2020-12-10 17:38:43 +01:00
Raphael Michel 3690dba73b Fix bug in widget introduced by last commit 2020-12-10 17:38:11 +01:00
Raphael Michel 0a55fdbc49 Widget: Do not show "buy now" if no availability state is known 2020-12-10 17:07:24 +01:00
Martin Gross eac32c25ba Fix advanced order search for "order placed before" 2020-12-10 16:46:43 +01:00
Raphael Michel c2345d200a Add option to hide "payment pending" bubble on ticket pages 2020-12-09 17:05:04 +01:00
Raphael Michel 663fd8a57a Move settings field for invoice address cancellation to correct tab 2020-12-09 16:53:00 +01:00
Raphael Michel a204302910 Disable all debug toolbar panels by default (cuts down 80% of request time locally) 2020-12-09 16:04:45 +01:00
Raphael Michel 13e464bcf1 Fix another export issue 2020-12-08 22:16:31 +01:00
Raphael Michel 8b2b98c128 Fix handling of empty values in new exporter 2020-12-08 22:09:29 +01:00
Raphael Michel a5f806d975 Tax list exporter: Add sheets with reports by country and company 2020-12-08 22:01:52 +01:00
Raphael Michel b51bd2118e Do not create session cookie on first page view 2020-12-07 22:29:05 +01:00
Martin Gross 089938c3ee Do not pass organizer settings API calls through the event's validate_settings() 2020-12-07 16:46:19 +01:00
Raphael Michel 574fe9094c API: Fix missing context 2020-12-04 17:51:28 +01:00
Raphael Michel 6fdd32de6a Check-in list: Fix secondary sorting by date 2020-12-04 13:03:38 +01:00
Martin Gross b3e95f54dd Add option to limit events to specific sales channels (#1867) 2020-12-03 17:10:54 +01:00
Raphael MichelandMartin Gross 55d8639ecc REST API: Add organizer-level settings (#1866)
Co-authored-by: Martin Gross <gross@rami.io>
2020-12-03 15:19:11 +01:00
Richard Schreiber 978130551a Apply EXIF-orientation data from source image to thumbnail with PIL.ImageOps.exif_transpose (#1869) 2020-12-03 10:55:18 +01:00
Raphael Michel a452bf816c Show emails to order positions in email history 2020-12-02 16:14:46 +01:00
Raphael Michel 99c3981e2d Gift card API: Allow to inspect transactions (#1868) 2020-12-02 16:10:05 +01:00
Raphael Michel 87a514ca8b PDFs: Fix country name evaluation 2020-12-02 14:26:50 +01:00
Richard SchreiberandRaphael Michel 937b967259 Added export of WaitingList for single and mutliple events with filter for voucher-status (#1864)
* added export of WaitingList for single and mutliple events

* removed unnecessary empty line

Co-authored-by: Raphael Michel <michel@rami.io>

* used better conversion from list of tuples to dict

Co-authored-by: Raphael Michel <michel@rami.io>

* added missing 'subevent' in select_related

Co-authored-by: Raphael Michel <michel@rami.io>

* removed prefetch_related from queryset as it is not needed

* use name for subevent, added 2 cols for start and end date

Co-authored-by: Raphael Michel <michel@rami.io>
2020-12-01 17:49:54 +01:00
Raphael Michel 242bfc0023 CartPosition API: Fix setting a custom cart ID 2020-12-01 17:13:09 +01:00
Raphael Michel eed309636f CartPosition API: Allow to buy multiple seats despite distance settings 2020-12-01 17:13:09 +01:00
Martin Gross 0944929818 Add custom invoice address field to Orderdata Export 2020-12-01 14:11:53 +01:00
Martin Gross 2592b8b221 Add Invoice and Attendee address mergefields for all address segments (#1865) 2020-12-01 13:17:00 +01:00
pajowu fcdd852860 Remove last usage of blacklist in comment (#1863) 2020-11-30 22:43:36 +01:00
Felix Rindt f43585bf36 Payment term on weekdays should not be required (#1862) 2020-11-30 11:52:21 +01:00
Raphael Michel 5a034f1339 Exclude rrule from locale files 2020-11-27 18:34:08 +01:00
Raphael Michel 0eb5b73502 Fix typo 2020-11-27 18:25:36 +01:00
Raphael Michel 41e878fabb Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2020-11-27 16:24:17 +01:00
Raphael Michel 93a7c5df09 Allow plugins to use django.contrib.postgres 2020-11-27 16:23:39 +01:00
Richard Schreiber c71c78cf69 Added Person-Name-Scheme for showing/entering academic degree after the name (e.g. <Name>, MA) (#1861) 2020-11-27 16:08:34 +01:00
Raphael Michel 66af5973ec Add min/max validation for date, datetime, and number questions (#1858) 2020-11-27 11:02:07 +01:00
Raphael MichelandMartin Gross 921b28f8d4 Move front page text above date selection (#1859)
Co-authored-by: Martin Gross <gross@rami.io>
2020-11-27 10:38:54 +01:00
Raphael Michel 0aa5df8a17 Merge pull request #1860 from pretix-translations/weblate-pretix-pretix
Translations update from Weblate
2020-11-27 10:38:44 +01:00
Svyatoslav 65f6da8d9e Translated on translate.pretix.eu (Latvian)
Currently translated at 28.5% (1097 of 3850 strings)

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

powered by weblate
2020-11-27 05:00:13 +01:00
Richard Schreiber 827afd6d39 Fix preview of subevent repetition rule with UNTIL (#1857) 2020-11-26 17:01:29 +01:00
Raphael Michel 97561819e2 Merge pull request #1856 from pretix-translations/weblate-pretix-pretix 2020-11-26 17:00:57 +01:00
Raphael Michel d02e8b1dcf Orders API: Consistently use "send_email" instead of "send_mail" 2020-11-26 16:59:57 +01:00
Raphael Michel 7ad46addee Order API: Add send_email parameter to creating payments 2020-11-26 16:57:52 +01:00
Raphael Michel 956b6f43e4 Fix typo 2020-11-25 18:03:21 +01:00
Raphael Michel cc493968a1 Do not call banner "banner", ad-blocks interfere… 2020-11-25 18:02:58 +01:00
Raphael Michel fd6fb52a11 Widget: Do not deny access to CSS of disabled shop 2020-11-25 12:39:14 +01:00
Raphael Michel ef11084613 Auto event selection: Do not suggest events without permission 2020-11-25 11:39:14 +01:00
Raphael Michel 2a85f327fd Fix wrong default value during event creation 2020-11-25 09:08:48 +01:00
Raphael Michel bd9d8ce0ad Device profiles: Fix missing listed URL for pretixPOS 2020-11-24 16:47:55 +01:00
Martin Gross d71db5a8ad Fix self-service refund with 0 cancellation fee 2020-11-24 16:10:40 +01:00
Raphael Michel 755d1b5692 Bump to 3.14.0.dev0 2020-11-24 11:59:39 +01:00
Raphael Michel 0fad2ab728 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3850 of 3850 strings)

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

powered by weblate
2020-11-24 11:52:31 +01:00
Raphael Michel 2b9461e847 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (3850 of 3850 strings)

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

powered by weblate
2020-11-24 11:52:31 +01:00
157 changed files with 14520 additions and 9230 deletions
+2 -2
View File
@@ -24,8 +24,8 @@ http {
default_type application/octet-stream; default_type application/octet-stream;
add_header X-Content-Type-Options nosniff; add_header X-Content-Type-Options nosniff;
access_log /var/log/nginx/access.log private; access_log /dev/stdout private;
error_log /var/log/nginx/error.log; error_log /dev/stderr;
add_header Referrer-Policy same-origin; add_header Referrer-Policy same-origin;
gzip on; gzip on;
+2 -2
View File
@@ -2,8 +2,8 @@
file=/tmp/supervisor.sock file=/tmp/supervisor.sock
[supervisord] [supervisord]
logfile=/tmp/supervisord.log logfile=/dev/stderr
logfile_maxbytes=50MB logfile_maxbytes=0
logfile_backups=10 logfile_backups=10
loglevel=info loglevel=info
pidfile=/tmp/supervisord.pid pidfile=/tmp/supervisord.pid
+4
View File
@@ -5,3 +5,7 @@ autorestart=true
priority=10 priority=10
stdout_events_enabled=true stdout_events_enabled=true
stderr_events_enabled=true stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
@@ -4,3 +4,7 @@ autostart=true
autorestart=true autorestart=true
priority=5 priority=5
user=pretixuser user=pretixuser
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
@@ -5,3 +5,7 @@ autorestart=true
priority=5 priority=5
user=pretixuser user=pretixuser
environment=HOME=/pretix environment=HOME=/pretix
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
+50 -7
View File
@@ -47,6 +47,8 @@ item_meta_properties object Item-specific m
valid_keys object Cryptographic keys for non-default signature schemes. valid_keys object Cryptographic keys for non-default signature schemes.
For performance reason, value is omitted in lists and For performance reason, value is omitted in lists and
only contained in detail views. Value can be cached. only contained in detail views. Value can be cached.
sales_channels list A list of sales channels this event is available for
sale on.
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
@@ -91,6 +93,11 @@ valid_keys object Cryptographic k
The attribute ``valid_keys`` has been added. The attribute ``valid_keys`` has been added.
.. versionchanged:: 3.14
The attribute ``sales_channels`` has been added.
Endpoints Endpoints
--------- ---------
@@ -147,11 +154,16 @@ Endpoints
"timezone": "Europe/Berlin", "timezone": "Europe/Berlin",
"item_meta_properties": {}, "item_meta_properties": {},
"plugins": [ "plugins": [
"pretix.plugins.banktransfer" "pretix.plugins.banktransfer",
"pretix.plugins.stripe" "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal",
"pretix.plugins.ticketoutputpdf" "pretix.plugins.ticketoutputpdf"
], ],
"sales_channels": [
"web",
"pretixpos",
"resellers"
]
} }
] ]
} }
@@ -170,6 +182,7 @@ Endpoints
only contain the events matching the set criteria. Providing ``?attr[Format]=Seminar`` would return only those only contain the events matching the set criteria. Providing ``?attr[Format]=Seminar`` would return only those
events having set their ``Format`` meta data to ``Seminar``, ``?attr[Format]=`` only those, that have no value events having set their ``Format`` meta data to ``Seminar``, ``?attr[Format]=`` only those, that have no value
set. Please note that this filter will respect default values set on organizer level. set. Please note that this filter will respect default values set on organizer level.
:query sales_channel: If set to a sales channel identifier, only events allowed to be sold on the specified sales channel are returned.
:param organizer: The ``slug`` field of a valid organizer :param organizer: The ``slug`` field of a valid organizer
:statuscode 200: no error :statuscode 200: no error
:statuscode 401: Authentication failure :statuscode 401: Authentication failure
@@ -219,16 +232,21 @@ Endpoints
"timezone": "Europe/Berlin", "timezone": "Europe/Berlin",
"item_meta_properties": {}, "item_meta_properties": {},
"plugins": [ "plugins": [
"pretix.plugins.banktransfer" "pretix.plugins.banktransfer",
"pretix.plugins.stripe" "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal",
"pretix.plugins.ticketoutputpdf" "pretix.plugins.ticketoutputpdf"
], ],
"valid_keys": { "valid_keys": {
"pretix_sig1": [ "pretix_sig1": [
"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQTdBRDcvdkZBMzNFc1k0ejJQSHI3aVpQc1o4bjVkaDBhalA4Z3l6Tm1tSXM9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=" "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQTdBRDcvdkZBMzNFc1k0ejJQSHI3aVpQc1o4bjVkaDBhalA4Z3l6Tm1tSXM9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo="
] ]
} },
"sales_channels": [
"web",
"pretixpos",
"resellers"
]
} }
:param organizer: The ``slug`` field of the organizer to fetch :param organizer: The ``slug`` field of the organizer to fetch
@@ -279,6 +297,11 @@ Endpoints
"plugins": [ "plugins": [
"pretix.plugins.stripe", "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal"
],
"sales_channels": [
"web",
"pretixpos",
"resellers"
] ]
} }
@@ -314,6 +337,11 @@ Endpoints
"plugins": [ "plugins": [
"pretix.plugins.stripe", "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal"
],
"sales_channels": [
"web",
"pretixpos",
"resellers"
] ]
} }
@@ -369,6 +397,11 @@ Endpoints
"plugins": [ "plugins": [
"pretix.plugins.stripe", "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal"
],
"sales_channels": [
"web",
"pretixpos",
"resellers"
] ]
} }
@@ -404,6 +437,11 @@ Endpoints
"plugins": [ "plugins": [
"pretix.plugins.stripe", "pretix.plugins.stripe",
"pretix.plugins.paypal" "pretix.plugins.paypal"
],
"sales_channels": [
"web",
"pretixpos",
"resellers"
] ]
} }
@@ -473,6 +511,11 @@ Endpoints
"pretix.plugins.stripe", "pretix.plugins.stripe",
"pretix.plugins.paypal", "pretix.plugins.paypal",
"pretix.plugins.pretixdroid" "pretix.plugins.pretixdroid"
],
"sales_channels": [
"web",
"pretixpos",
"resellers"
] ]
} }
+61
View File
@@ -22,9 +22,28 @@ expires datetime Expiry date (or
conditions string Special terms and conditions for this card (or ``null``) conditions string Special terms and conditions for this card (or ``null``)
===================================== ========================== ======================================================= ===================================== ========================== =======================================================
The gift card transaction resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the gift card transaction
datetime datetime Creation date of the transaction
value money (string) Transaction amount
event string Event slug, if the gift card was used in the web shop (or ``null``)
order string Order code, if the gift card was used in the web shop (or ``null``)
text string Custom text of the transaction (or ``null``)
===================================== ========================== =======================================================
Endpoints Endpoints
--------- ---------
.. versionadded:: 3.14
The transaction list endpoint was added.
.. http:get:: /api/v1/organizers/(organizer)/giftcards/ .. http:get:: /api/v1/organizers/(organizer)/giftcards/
Returns a list of all gift cards issued by a given organizer. Returns a list of all gift cards issued by a given organizer.
@@ -250,3 +269,45 @@ Endpoints
:statuscode 401: Authentication failure :statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to change this resource. :statuscode 403: The requested organizer does not exist **or** you have no permission to change this resource.
:statuscode 409: There is not sufficient credit on the gift card. :statuscode 409: There is not sufficient credit on the gift card.
.. http:get:: /api/v1/organizers/(organizer)/giftcards/(id)/transactions/
List all transactions of a gift card.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/giftcards/1/transactions/ 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": 82,
"datetime": "2020-06-22T15:41:42.800534Z",
"value": "50.00",
"event": "democon",
"order": "FXQYW",
"text": null
}
]
}
:param organizer: The ``slug`` field of the organizer to view
:param id: The ``id`` field of the gift card to view
: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.
+3 -2
View File
@@ -940,9 +940,9 @@ Creating orders
during order generation and is not respected automatically when the order changes later.) during order generation and is not respected automatically when the order changes later.)
* ``force`` (optional). If set to ``true``, quotas will be ignored. * ``force`` (optional). If set to ``true``, quotas will be ignored.
* ``send_mail`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of * ``send_email`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of
whether these emails are enabled for certain sales channels. Defaults to whether these emails are enabled for certain sales channels. Defaults to
``false``. ``false``. Used to be ``send_mail`` before pretix 3.14.
If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually
to incrementing integers starting with ``1``. Then, you can reference one of these to incrementing integers starting with ``1``. Then, you can reference one of these
@@ -1976,6 +1976,7 @@ Order payment endpoints
"amount": "23.00", "amount": "23.00",
"payment_date": "2017-12-04T12:13:12Z", "payment_date": "2017-12-04T12:13:12Z",
"info": {}, "info": {},
"send_email": false,
"provider": "banktransfer" "provider": "banktransfer"
} }
+117
View File
@@ -90,3 +90,120 @@ Endpoints
:statuscode 200: no error :statuscode 200: no error
:statuscode 401: Authentication failure :statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it. :statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
Organizer settings
------------------
pretix organizers and events have lots and lots of parameters of different types that are stored in a key-value store on our system.
Since many of these settings depend on each other in complex ways, we can not give direct access to all of these
settings through the API. However, we do expose many of the simple and useful flags through the API.
Please note that the available settings flags change between pretix versions, and we do not give a guarantee on backwards-compatibility like with other parts of the API.
Therefore, we're also not including a list of the options here, but instead recommend to look at the endpoint output
to see available options. The ``explain=true`` flag enables a verbose mode that provides you with human-readable
information about the properties.
.. note:: Please note that this is not a complete representation of all organizer settings. You will find more settings
in the web interface.
.. warning:: This API is intended for advanced users. Even though we take care to validate your input, you will be
able to break your shops using this API by creating situations of conflicting settings. Please take care.
.. versionchanged:: 3.14
Initial support for settings has been added to the API.
.. http:get:: /api/v1/organizers/(organizer)/settings/
Get current values of organizer settings.
Permission required: "Can change organizer settings"
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/settings/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example standard response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"event_list_type": "calendar",
…
}
**Example verbose response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"event_list_type":
{
"value": "calendar",
"label": "Default overview style",
"help_text": "If your event series has more than 50 dates in the future, only the month or week calendar can be used."
}
},
…
}
:param organizer: The ``slug`` field of the organizer to access
:query explain: Set to ``true`` to enable verbose response mode
: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:patch:: /api/v1/organizers/(organizer)/settings/
Updates organizer settings. Note that ``PUT`` is not allowed here, only ``PATCH``.
.. warning::
Settings can be stored at different levels in pretix. If a value is not set on organizer level, a default setting
from a higher level (global) will be returned. If you explicitly set a setting on organizer level, it
will no longer be inherited from the higher levels. Therefore, we recommend you to send only settings that you
explicitly want to set on organizer level. To unset a settings, pass ``null``.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/settings/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
{
"event_list_type": "calendar"
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"event_list_type": "calendar",
…
}
:param organizer: The ``slug`` field of the organizer to update
:statuscode 200: no error
:statuscode 400: The organizer could not be updated 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.
+38 -1
View File
@@ -1,4 +1,7 @@
.. spelling:: checkin .. spelling::
checkin
datetime
.. _rest-questions: .. _rest-questions:
@@ -53,6 +56,12 @@ options list of objects In case of ques
├ identifier string An arbitrary string that can be used for matching with ├ identifier string An arbitrary string that can be used for matching with
other sources. other sources.
└ answer multi-lingual string The displayed value of this option └ answer multi-lingual string The displayed value of this option
valid_number_min string Minimum value for number questions (optional)
valid_number_max string Maximum value for number questions (optional)
valid_date_min date Minimum value for date questions (optional)
valid_date_max date Maximum value for date questions (optional)
valid_datetime_min datetime Minimum value for date and time questions (optional)
valid_datetime_max datetime Maximum value for date and time questions (optional)
dependency_question integer Internal ID of a different question. The current dependency_question integer Internal ID of a different question. The current
question will only be shown if the question given in question will only be shown if the question given in
this attribute is set to the value given in this attribute is set to the value given in
@@ -92,6 +101,10 @@ dependency_value string An old version
The attribute ``help_text`` has been added. The attribute ``help_text`` has been added.
.. versionchanged:: 3.14
The attributes ``valid_*`` have been added.
Endpoints Endpoints
--------- ---------
@@ -137,6 +150,12 @@ Endpoints
"ask_during_checkin": false, "ask_during_checkin": false,
"hidden": false, "hidden": false,
"print_on_invoice": false, "print_on_invoice": false,
"valid_number_min": null,
"valid_number_max": null,
"valid_date_min": null,
"valid_date_max": null,
"valid_datetime_min": null,
"valid_datetime_max": null,
"dependency_question": null, "dependency_question": null,
"dependency_value": null, "dependency_value": null,
"dependency_values": [], "dependency_values": [],
@@ -208,6 +227,12 @@ Endpoints
"ask_during_checkin": false, "ask_during_checkin": false,
"hidden": false, "hidden": false,
"print_on_invoice": false, "print_on_invoice": false,
"valid_number_min": null,
"valid_number_max": null,
"valid_date_min": null,
"valid_date_max": null,
"valid_datetime_min": null,
"valid_datetime_max": null,
"dependency_question": null, "dependency_question": null,
"dependency_value": null, "dependency_value": null,
"dependency_values": [], "dependency_values": [],
@@ -302,6 +327,12 @@ Endpoints
"dependency_question": null, "dependency_question": null,
"dependency_value": null, "dependency_value": null,
"dependency_values": [], "dependency_values": [],
"valid_number_min": null,
"valid_number_max": null,
"valid_date_min": null,
"valid_date_max": null,
"valid_datetime_min": null,
"valid_datetime_max": null,
"options": [ "options": [
{ {
"id": 1, "id": 1,
@@ -377,6 +408,12 @@ Endpoints
"dependency_question": null, "dependency_question": null,
"dependency_value": null, "dependency_value": null,
"dependency_values": [], "dependency_values": [],
"valid_number_min": null,
"valid_number_max": null,
"valid_date_min": null,
"valid_date_max": null,
"valid_datetime_min": null,
"valid_datetime_max": null,
"options": [ "options": [
{ {
"id": 1, "id": 1,
+1 -1
View File
@@ -7,7 +7,7 @@ localecompile:
localegen: localegen:
./manage.py makemessages --keep-pot --ignore "pretix/helpers/*" $(LNGS) ./manage.py makemessages --keep-pot --ignore "pretix/helpers/*" $(LNGS)
./manage.py makemessages --keep-pot -d djangojs --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "build/*" $(LNGS) ./manage.py makemessages --keep-pot -d djangojs --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "pretix/static/rrule/*" --ignore "build/*" $(LNGS)
staticfiles: jsi18n staticfiles: jsi18n
./manage.py collectstatic --noinput ./manage.py collectstatic --noinput
+1 -1
View File
@@ -1 +1 @@
__version__ = "3.13.0" __version__ = "3.14.0.dev0"
+1
View File
@@ -102,6 +102,7 @@ class PretixPosSecurityProfile(AllowListSecurityProfile):
('DELETE', 'api-v1:cartposition-detail'), ('DELETE', 'api-v1:cartposition-detail'),
('GET', 'api-v1:giftcard-list'), ('GET', 'api-v1:giftcard-list'),
('POST', 'api-v1:giftcard-transact'), ('POST', 'api-v1:giftcard-transact'),
('GET', 'plugins:pretix_posbackend:posclosing-list'),
('POST', 'plugins:pretix_posbackend:posreceipt-list'), ('POST', 'plugins:pretix_posbackend:posreceipt-list'),
('POST', 'plugins:pretix_posbackend:posclosing-list'), ('POST', 'plugins:pretix_posbackend:posclosing-list'),
('POST', 'plugins:pretix_posbackend:posdebugdump-list'), ('POST', 'plugins:pretix_posbackend:posdebugdump-list'),
+5 -1
View File
@@ -87,7 +87,10 @@ class CartPositionCreateSerializer(I18nAwareModelSerializer):
raise ValidationError('The specified seat ID is not unique.') raise ValidationError('The specified seat ID is not unique.')
else: else:
validated_data['seat'] = seat validated_data['seat'] = seat
if not seat.is_available(sales_channel=validated_data.get('sales_channel', 'web')): if not seat.is_available(
sales_channel=validated_data.get('sales_channel', 'web'),
distance_ignore_cart_id=validated_data['cart_id'],
):
raise ValidationError(gettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name)) raise ValidationError(gettext_lazy('The selected seat "{seat}" is not available.').format(seat=seat.name))
elif seated: elif seated:
raise ValidationError('The specified product requires to choose a seat.') raise ValidationError('The specified product requires to choose a seat.')
@@ -104,6 +107,7 @@ class CartPositionCreateSerializer(I18nAwareModelSerializer):
def validate_cart_id(self, cid): def validate_cart_id(self, cid):
if cid and not cid.endswith('@api'): if cid and not cid.endswith('@api'):
raise ValidationError('Cart ID should end in @api or be empty.') raise ValidationError('Cart ID should end in @api or be empty.')
return cid
def validate_item(self, item): def validate_item(self, item):
if item.event != self.context['event']: if item.event != self.context['event']:
+15 -3
View File
@@ -17,7 +17,7 @@ from pretix.base.models.items import SubEventItem, SubEventItemVariation
from pretix.base.services.seating import ( from pretix.base.services.seating import (
SeatProtected, generate_seats, validate_plan_change, SeatProtected, generate_seats, validate_plan_change,
) )
from pretix.base.settings import DEFAULTS, validate_settings from pretix.base.settings import DEFAULTS, validate_event_settings
from pretix.base.signals import api_event_settings_fields from pretix.base.signals import api_event_settings_fields
@@ -124,7 +124,8 @@ class EventSerializer(I18nAwareModelSerializer):
fields = ('name', 'slug', 'live', 'testmode', 'currency', 'date_from', fields = ('name', 'slug', 'live', 'testmode', 'currency', 'date_from',
'date_to', 'date_admission', 'is_public', 'presale_start', 'date_to', 'date_admission', 'is_public', 'presale_start',
'presale_end', 'location', 'geo_lat', 'geo_lon', 'has_subevents', 'meta_data', 'seating_plan', 'presale_end', 'location', 'geo_lat', 'geo_lon', 'has_subevents', 'meta_data', 'seating_plan',
'plugins', 'seat_category_mapping', 'timezone', 'item_meta_properties', 'valid_keys') 'plugins', 'seat_category_mapping', 'timezone', 'item_meta_properties', 'valid_keys',
'sales_channels')
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@@ -596,6 +597,7 @@ class EventSettingsSerializer(serializers.Serializer):
'attendee_addresses_required', 'attendee_addresses_required',
'attendee_company_asked', 'attendee_company_asked',
'attendee_company_required', 'attendee_company_required',
'attendee_data_explanation_text',
'confirm_texts', 'confirm_texts',
'order_email_asked_twice', 'order_email_asked_twice',
'payment_term_mode', 'payment_term_mode',
@@ -606,6 +608,7 @@ class EventSettingsSerializer(serializers.Serializer):
'payment_term_expire_automatically', 'payment_term_expire_automatically',
'payment_term_accept_late', 'payment_term_accept_late',
'payment_explanation', 'payment_explanation',
'payment_pending_hidden',
'ticket_download', 'ticket_download',
'ticket_download_date', 'ticket_download_date',
'ticket_download_addons', 'ticket_download_addons',
@@ -661,10 +664,17 @@ class EventSettingsSerializer(serializers.Serializer):
'change_allow_user_variation', 'change_allow_user_variation',
'change_allow_user_until', 'change_allow_user_until',
'change_allow_user_price', 'change_allow_user_price',
'primary_color',
'theme_color_success',
'theme_color_danger',
'theme_color_background',
'theme_round_borders',
'primary_font',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event') self.event = kwargs.pop('event')
self.changed_data = []
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
for fname in self.default_fields: for fname in self.default_fields:
kwargs = DEFAULTS[fname].get('serializer_kwargs', {}) kwargs = DEFAULTS[fname].get('serializer_kwargs', {})
@@ -693,15 +703,17 @@ class EventSettingsSerializer(serializers.Serializer):
for attr, value in validated_data.items(): for attr, value in validated_data.items():
if value is None: if value is None:
instance.delete(attr) instance.delete(attr)
self.changed_data.append(attr)
elif instance.get(attr, as_type=type(value)) != value: elif instance.get(attr, as_type=type(value)) != value:
instance.set(attr, value) instance.set(attr, value)
self.changed_data.append(attr)
return instance return instance
def validate(self, data): def validate(self, data):
data = super().validate(data) data = super().validate(data)
settings_dict = self.instance.freeze() settings_dict = self.instance.freeze()
settings_dict.update(data) settings_dict.update(data)
validate_settings(self.event, settings_dict) validate_event_settings(self.event, settings_dict)
return data return data
+3 -1
View File
@@ -277,7 +277,9 @@ class QuestionSerializer(I18nAwareModelSerializer):
model = Question model = Question
fields = ('id', 'question', 'type', 'required', 'items', 'options', 'position', fields = ('id', 'question', 'type', 'required', 'items', 'options', 'position',
'ask_during_checkin', 'identifier', 'dependency_question', 'dependency_values', 'ask_during_checkin', 'identifier', 'dependency_question', 'dependency_values',
'hidden', 'dependency_value', 'print_on_invoice', 'help_text') 'hidden', 'dependency_value', 'print_on_invoice', 'help_text', 'valid_number_min',
'valid_number_max', 'valid_date_min', 'valid_date_max', 'valid_datetime_min', 'valid_datetime_max'
)
def validate_identifier(self, value): def validate_identifier(self, value):
Question._clean_identifier(self.context['event'], value, self.instance) Question._clean_identifier(self.context['event'], value, self.instance)
+3 -3
View File
@@ -682,7 +682,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
consume_carts = serializers.ListField(child=serializers.CharField(), required=False) consume_carts = serializers.ListField(child=serializers.CharField(), required=False)
force = serializers.BooleanField(default=False, required=False) force = serializers.BooleanField(default=False, required=False)
payment_date = serializers.DateTimeField(required=False, allow_null=True) payment_date = serializers.DateTimeField(required=False, allow_null=True)
send_mail = serializers.BooleanField(default=False, required=False) send_email = serializers.BooleanField(default=False, required=False)
simulate = serializers.BooleanField(default=False, required=False) simulate = serializers.BooleanField(default=False, required=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -693,7 +693,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
model = Order model = Order
fields = ('code', 'status', 'testmode', 'email', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel', fields = ('code', 'status', 'testmode', 'email', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel',
'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'payment_date', 'consume_carts', 'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'payment_date', 'consume_carts',
'force', 'send_mail', 'simulate') 'force', 'send_email', 'simulate')
def validate_payment_provider(self, pp): def validate_payment_provider(self, pp):
if pp is None: if pp is None:
@@ -786,7 +786,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
payment_date = validated_data.pop('payment_date', now()) payment_date = validated_data.pop('payment_date', now())
force = validated_data.pop('force', False) force = validated_data.pop('force', False)
simulate = validated_data.pop('simulate', False) simulate = validated_data.pop('simulate', False)
self._send_mail = validated_data.pop('send_mail', False) self._send_mail = validated_data.pop('send_email', False)
if 'invoice_address' in validated_data: if 'invoice_address' in validated_data:
iadata = validated_data.pop('invoice_address') iadata = validated_data.pop('invoice_address')
+79 -2
View File
@@ -2,6 +2,7 @@ from decimal import Decimal
from django.db.models import Q from django.db.models import Q
from django.utils.translation import get_language, gettext_lazy as _ from django.utils.translation import get_language, gettext_lazy as _
from hierarkey.proxy import HierarkeyProxy
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
@@ -9,11 +10,12 @@ from pretix.api.serializers.i18n import I18nAwareModelSerializer
from pretix.api.serializers.order import CompatibleJSONField from pretix.api.serializers.order import CompatibleJSONField
from pretix.base.auth import get_auth_backends from pretix.base.auth import get_auth_backends
from pretix.base.models import ( from pretix.base.models import (
Device, GiftCard, Organizer, SeatingPlan, Team, TeamAPIToken, TeamInvite, Device, GiftCard, GiftCardTransaction, Organizer, SeatingPlan, Team,
User, TeamAPIToken, TeamInvite, User,
) )
from pretix.base.models.seating import SeatingPlanLayoutValidator from pretix.base.models.seating import SeatingPlanLayoutValidator
from pretix.base.services.mail import SendMailException, mail from pretix.base.services.mail import SendMailException, mail
from pretix.base.settings import DEFAULTS, validate_organizer_settings
from pretix.helpers.urls import build_absolute_uri from pretix.helpers.urls import build_absolute_uri
@@ -59,6 +61,21 @@ class GiftCardSerializer(I18nAwareModelSerializer):
fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions') fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions')
class OrderEventSlugField(serializers.RelatedField):
def to_representation(self, obj):
return obj.event.slug
class GiftCardTransactionSerializer(I18nAwareModelSerializer):
order = serializers.SlugRelatedField(slug_field='code', read_only=True)
event = OrderEventSlugField(source='order', read_only=True)
class Meta:
model = GiftCardTransaction
fields = ('id', 'datetime', 'value', 'event', 'order', 'text')
class EventSlugField(serializers.SlugRelatedField): class EventSlugField(serializers.SlugRelatedField):
def get_queryset(self): def get_queryset(self):
return self.context['organizer'].events.all() return self.context['organizer'].events.all()
@@ -187,3 +204,63 @@ class TeamMemberSerializer(serializers.ModelSerializer):
fields = ( fields = (
'id', 'email', 'fullname', 'require_2fa' 'id', 'email', 'fullname', 'require_2fa'
) )
class OrganizerSettingsSerializer(serializers.Serializer):
default_fields = [
'organizer_info_text',
'event_list_type',
'event_list_availability',
'organizer_homepage_text',
'organizer_link_back',
'organizer_logo_image_large',
'giftcard_length',
'giftcard_expiry_years',
'locales',
'event_team_provisioning',
'primary_color',
'theme_color_success',
'theme_color_danger',
'theme_color_background',
'theme_round_borders',
'primary_font'
]
def __init__(self, *args, **kwargs):
self.organizer = kwargs.pop('organizer')
self.changed_data = []
super().__init__(*args, **kwargs)
for fname in self.default_fields:
kwargs = DEFAULTS[fname].get('serializer_kwargs', {})
if callable(kwargs):
kwargs = kwargs()
kwargs.setdefault('required', False)
kwargs.setdefault('allow_null', True)
form_kwargs = DEFAULTS[fname].get('form_kwargs', {})
if callable(form_kwargs):
form_kwargs = form_kwargs()
if 'serializer_class' not in DEFAULTS[fname]:
raise ValidationError('{} has no serializer class'.format(fname))
f = DEFAULTS[fname]['serializer_class'](
**kwargs
)
f._label = form_kwargs.get('label', fname)
f._help_text = form_kwargs.get('help_text')
self.fields[fname] = f
def update(self, instance: HierarkeyProxy, validated_data):
for attr, value in validated_data.items():
if value is None:
instance.delete(attr)
self.changed_data.append(attr)
elif instance.get(attr, as_type=type(value)) != value:
instance.set(attr, value)
self.changed_data.append(attr)
return instance
def validate(self, data):
data = super().validate(data)
settings_dict = self.instance.freeze()
settings_dict.update(data)
validate_organizer_settings(self.organizer, settings_dict)
return data
+6
View File
@@ -62,6 +62,9 @@ order_router = routers.DefaultRouter()
order_router.register(r'payments', order.PaymentViewSet) order_router.register(r'payments', order.PaymentViewSet)
order_router.register(r'refunds', order.RefundViewSet) order_router.register(r'refunds', order.RefundViewSet)
giftcard_router = routers.DefaultRouter()
giftcard_router.register(r'transactions', organizer.GiftCardTransactionViewSet)
# Force import of all plugins to give them a chance to register URLs with the router # Force import of all plugins to give them a chance to register URLs with the router
for app in apps.get_app_configs(): for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'): if hasattr(app, 'PretixPluginMeta'):
@@ -71,6 +74,9 @@ for app in apps.get_app_configs():
urlpatterns = [ urlpatterns = [
url(r'^', include(router.urls)), url(r'^', include(router.urls)),
url(r'^organizers/(?P<organizer>[^/]+)/', include(orga_router.urls)), url(r'^organizers/(?P<organizer>[^/]+)/', include(orga_router.urls)),
url(r'^organizers/(?P<organizer>[^/]+)/settings/$', organizer.OrganizerSettingsView.as_view(),
name="organizer.settings"),
url(r'^organizers/(?P<organizer>[^/]+)/giftcards/(?P<giftcard>[^/]+)/', include(giftcard_router.urls)),
url(r'^organizers/(?P<organizer>[^/]+)/events/(?P<event>[^/]+)/settings/$', event.EventSettingsView.as_view(), url(r'^organizers/(?P<organizer>[^/]+)/events/(?P<event>[^/]+)/settings/$', event.EventSettingsView.as_view(),
name="event.settings"), name="event.settings"),
url(r'^organizers/(?P<organizer>[^/]+)/events/(?P<event>[^/]+)/', include(event_router.urls)), url(r'^organizers/(?P<organizer>[^/]+)/events/(?P<event>[^/]+)/', include(event_router.urls)),
+2 -1
View File
@@ -131,7 +131,7 @@ class EventSelectionView(APIView):
@property @property
def base_event_qs(self): def base_event_qs(self):
qs = self.request.auth.organizer.events.annotate( qs = self.request.auth.get_events_with_any_permission().annotate(
first_date=Coalesce('date_admission', 'date_from'), first_date=Coalesce('date_admission', 'date_from'),
last_date=Coalesce('date_to', 'date_from'), last_date=Coalesce('date_to', 'date_from'),
).filter( ).filter(
@@ -154,6 +154,7 @@ class EventSelectionView(APIView):
).filter( ).filter(
event__organizer=self.request.auth.organizer, event__organizer=self.request.auth.organizer,
event__live=True, event__live=True,
event__in=self.request.auth.get_events_with_any_permission(),
active=True, active=True,
).select_related('event').order_by('first_date') ).select_related('event').order_by('first_date')
if self.request.auth.gate: if self.request.auth.gate:
+8
View File
@@ -18,7 +18,9 @@ from pretix.base.models import (
CartPosition, Device, Event, TaxRule, TeamAPIToken, CartPosition, Device, Event, TaxRule, TeamAPIToken,
) )
from pretix.base.models.event import SubEvent from pretix.base.models.event import SubEvent
from pretix.base.settings import SETTINGS_AFFECTING_CSS
from pretix.helpers.dicts import merge_dicts from pretix.helpers.dicts import merge_dicts
from pretix.presale.style import regenerate_css
from pretix.presale.views.organizer import filter_qs_by_attr from pretix.presale.views.organizer import filter_qs_by_attr
with scopes_disabled(): with scopes_disabled():
@@ -26,6 +28,7 @@ with scopes_disabled():
is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs') is_past = django_filters.rest_framework.BooleanFilter(method='is_past_qs')
is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs') is_future = django_filters.rest_framework.BooleanFilter(method='is_future_qs')
ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs') ends_after = django_filters.rest_framework.IsoDateTimeFilter(method='ends_after_qs')
sales_channel = django_filters.rest_framework.CharFilter(method='sales_channel_qs')
class Meta: class Meta:
model = Event model = Event
@@ -67,6 +70,9 @@ with scopes_disabled():
else: else:
return queryset.exclude(expr) return queryset.exclude(expr)
def sales_channel_qs(self, queryset, name, value):
return queryset.filter(sales_channels__contains=value)
class EventViewSet(viewsets.ModelViewSet): class EventViewSet(viewsets.ModelViewSet):
serializer_class = EventSerializer serializer_class = EventSerializer
@@ -385,5 +391,7 @@ class EventSettingsView(views.APIView):
k: v for k, v in s.validated_data.items() k: v for k, v in s.validated_data.items()
} }
) )
if any(p in s.changed_data for p in SETTINGS_AFFECTING_CSS):
regenerate_css.apply_async(args=(request.organizer.pk,))
s = EventSettingsSerializer(instance=request.event.settings, event=request.event) s = EventSettingsSerializer(instance=request.event.settings, event=request.event)
return Response(s.data) return Response(s.data)
+6 -1
View File
@@ -558,6 +558,8 @@ class OrderViewSet(viewsets.ModelViewSet):
) )
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
if 'send_mail' in request.data and 'send_email' not in request.data:
request.data['send_email'] = request.data['send_mail']
serializer = OrderCreateSerializer(data=request.data, context=self.get_serializer_context()) serializer = OrderCreateSerializer(data=request.data, context=self.get_serializer_context())
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
with transaction.atomic(): with transaction.atomic():
@@ -949,6 +951,7 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
def get_serializer_context(self): def get_serializer_context(self):
ctx = super().get_serializer_context() ctx = super().get_serializer_context()
ctx['order'] = get_object_or_404(Order, code=self.kwargs['order'], event=self.request.event) ctx['order'] = get_object_or_404(Order, code=self.kwargs['order'], event=self.request.event)
ctx['event'] = self.request.event
return ctx return ctx
def get_queryset(self): def get_queryset(self):
@@ -956,6 +959,7 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
return order.payments.all() return order.payments.all()
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
send_mail = request.data.get('send_email', True)
serializer = OrderPaymentCreateSerializer(data=request.data, context=self.get_serializer_context()) serializer = OrderPaymentCreateSerializer(data=request.data, context=self.get_serializer_context())
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
with transaction.atomic(): with transaction.atomic():
@@ -971,7 +975,8 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet):
user=self.request.user if self.request.user.is_authenticated else None, user=self.request.user if self.request.user.is_authenticated else None,
auth=self.request.auth, auth=self.request.auth,
count_waitinglist=False, count_waitinglist=False,
force=request.data.get('force', False) force=request.data.get('force', False),
send_mail=send_mail,
) )
except Quota.QuotaExceededException: except Quota.QuotaExceededException:
pass pass
+63 -6
View File
@@ -6,7 +6,9 @@ from django.shortcuts import get_object_or_404
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django_filters.rest_framework import DjangoFilterBackend, FilterSet from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from django_scopes import scopes_disabled from django_scopes import scopes_disabled
from rest_framework import filters, mixins, serializers, status, viewsets from rest_framework import (
filters, mixins, serializers, status, views, viewsets,
)
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.exceptions import MethodNotAllowed, PermissionDenied from rest_framework.exceptions import MethodNotAllowed, PermissionDenied
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin from rest_framework.mixins import CreateModelMixin, DestroyModelMixin
@@ -15,15 +17,18 @@ from rest_framework.viewsets import GenericViewSet
from pretix.api.models import OAuthAccessToken from pretix.api.models import OAuthAccessToken
from pretix.api.serializers.organizer import ( from pretix.api.serializers.organizer import (
DeviceSerializer, GiftCardSerializer, OrganizerSerializer, DeviceSerializer, GiftCardSerializer, GiftCardTransactionSerializer,
SeatingPlanSerializer, TeamAPITokenSerializer, TeamInviteSerializer, OrganizerSerializer, OrganizerSettingsSerializer, SeatingPlanSerializer,
TeamMemberSerializer, TeamSerializer, TeamAPITokenSerializer, TeamInviteSerializer, TeamMemberSerializer,
TeamSerializer,
) )
from pretix.base.models import ( from pretix.base.models import (
Device, GiftCard, Organizer, SeatingPlan, Team, TeamAPIToken, TeamInvite, Device, GiftCard, GiftCardTransaction, Organizer, SeatingPlan, Team,
User, TeamAPIToken, TeamInvite, User,
) )
from pretix.base.settings import SETTINGS_AFFECTING_CSS
from pretix.helpers.dicts import merge_dicts from pretix.helpers.dicts import merge_dicts
from pretix.presale.style import regenerate_organizer_css
class OrganizerViewSet(viewsets.ReadOnlyModelViewSet): class OrganizerViewSet(viewsets.ReadOnlyModelViewSet):
@@ -191,6 +196,24 @@ class GiftCardViewSet(viewsets.ModelViewSet):
raise MethodNotAllowed("Gift cards cannot be deleted.") raise MethodNotAllowed("Gift cards cannot be deleted.")
class GiftCardTransactionViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = GiftCardTransactionSerializer
queryset = GiftCardTransaction.objects.none()
permission = 'can_manage_gift_cards'
write_permission = 'can_manage_gift_cards'
@cached_property
def giftcard(self):
if self.request.GET.get('include_accepted') == 'true':
qs = self.request.organizer.accepted_gift_cards
else:
qs = self.request.organizer.issued_gift_cards.all()
return get_object_or_404(qs, pk=self.kwargs.get('giftcard'))
def get_queryset(self):
return self.giftcard.transactions.select_related('order', 'order__event')
class TeamViewSet(viewsets.ModelViewSet): class TeamViewSet(viewsets.ModelViewSet):
serializer_class = TeamSerializer serializer_class = TeamSerializer
queryset = Team.objects.none() queryset = Team.objects.none()
@@ -396,3 +419,37 @@ class DeviceViewSet(mixins.CreateModelMixin,
data=self.request.data data=self.request.data
) )
return inst return inst
class OrganizerSettingsView(views.APIView):
permission = 'can_change_organizer_settings'
def get(self, request, *args, **kwargs):
s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer)
if 'explain' in request.GET:
return Response({
fname: {
'value': s.data[fname],
'label': getattr(field, '_label', fname),
'help_text': getattr(field, '_help_text', None)
} for fname, field in s.fields.items()
})
return Response(s.data)
def patch(self, request, *wargs, **kwargs):
s = OrganizerSettingsSerializer(
instance=request.organizer.settings, data=request.data, partial=True,
organizer=request.organizer
)
s.is_valid(raise_exception=True)
with transaction.atomic():
s.save()
self.request.organizer.log_action(
'pretix.organizer.settings', user=self.request.user, auth=self.request.auth, data={
k: v for k, v in s.validated_data.items()
}
)
if any(p in s.changed_data for p in SETTINGS_AFFECTING_CSS):
regenerate_organizer_css.apply_async(args=(request.organizer.pk,))
s = OrganizerSettingsSerializer(instance=request.organizer.settings, organizer=request.organizer)
return Response(s.data)
+1
View File
@@ -4,3 +4,4 @@ from .invoices import * # noqa
from .json import * # noqa from .json import * # noqa
from .mail import * # noqa from .mail import * # noqa
from .orderlist import * # noqa from .orderlist import * # noqa
from .waitinglist import * # noqa
+4 -3
View File
@@ -147,8 +147,8 @@ class OrderListExporter(MultiSheetListExporter):
for k, label, w in name_scheme['fields']: for k, label, w in name_scheme['fields']:
headers.append(label) headers.append(label)
headers += [ headers += [
_('Address'), _('ZIP code'), _('City'), _('Country'), pgettext('address', 'State'), _('VAT ID'), _('Address'), _('ZIP code'), _('City'), _('Country'), pgettext('address', 'State'),
_('Date of last payment'), _('Fees'), _('Order locale') _('Custom address field'), _('VAT ID'), _('Date of last payment'), _('Fees'), _('Order locale')
] ]
for tr in tax_rates: for tr in tax_rates:
@@ -235,10 +235,11 @@ class OrderListExporter(MultiSheetListExporter):
order.invoice_address.country if order.invoice_address.country else order.invoice_address.country if order.invoice_address.country else
order.invoice_address.country_old, order.invoice_address.country_old,
order.invoice_address.state, order.invoice_address.state,
order.invoice_address.custom_field,
order.invoice_address.vat_id, order.invoice_address.vat_id,
] ]
except InvoiceAddress.DoesNotExist: except InvoiceAddress.DoesNotExist:
row += [''] * (8 + (len(name_scheme['fields']) if name_scheme and len(name_scheme['fields']) > 1 else 0)) row += [''] * (9 + (len(name_scheme['fields']) if name_scheme and len(name_scheme['fields']) > 1 else 0))
row += [ row += [
order.payment_date.astimezone(tz).strftime('%Y-%m-%d') if order.payment_date else '', order.payment_date.astimezone(tz).strftime('%Y-%m-%d') if order.payment_date else '',
+165
View File
@@ -0,0 +1,165 @@
from collections import OrderedDict
import pytz
from django import forms
from django.db.models import F, Q
from django.dispatch import receiver
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.models.waitinglist import WaitingListEntry
from ..exporter import ListExporter
from ..signals import (
register_data_exporters, register_multievent_data_exporters,
)
class WaitingListExporter(ListExporter):
identifier = 'waitinglist'
verbose_name = _('Waiting list')
# map selected status to label and queryset-filter
status_filters = [
(
'',
_('All entries'),
lambda qs: qs
),
(
'awaiting-voucher',
_('Waiting for a voucher'),
lambda qs: qs.filter(voucher__isnull=True)
),
(
'voucher-assigned',
_('Voucher assigned'),
lambda qs: qs.filter(voucher__isnull=False)
),
(
'awaiting-redemption',
_('Waiting for redemption'),
lambda qs: qs.filter(
voucher__isnull=False,
voucher__redeemed__lt=F('voucher__max_usages'),
).filter(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gt=now()))
),
(
'voucher-redeemed',
_('Voucher redeemed'),
lambda qs: qs.filter(
voucher__isnull=False,
voucher__redeemed__gte=F('voucher__max_usages'),
)
),
(
'voucher-expired',
_('Voucher expired'),
lambda qs: qs.filter(
voucher__isnull=False,
voucher__redeemed__lt=F('voucher__max_usages'),
voucher__valid_until__isnull=False,
voucher__valid_until__lte=now()
)
),
]
def iterate_list(self, form_data):
# create dicts for easier access by key, which is passed by form_data[status]
status_labels = {k: v for k, v, c in self.status_filters}
queryset_mutators = {k: c for k, v, c in self.status_filters}
entries = WaitingListEntry.objects.filter(
event__in=self.events,
).select_related(
'item', 'variation', 'voucher', 'subevent'
).order_by('created')
# apply filter to queryset/entries according to status
# if unknown status-filter is given, django will handle the error
status_filter = form_data.get("status", "")
entries = queryset_mutators[status_filter](entries)
headers = [
_('Date'),
_('Email'),
_('Product name'),
_('Variation'),
_('Event slug'),
_('Event name'),
pgettext_lazy('subevents', 'Date'), # Name of subevent
_('Start date'), # Start date of subevent or event
_('End date'), # End date of subevent or event
_('Language'),
_('Priority'),
_('Status'),
_('Voucher code'),
]
yield headers
yield self.ProgressSetTotal(total=len(entries))
for entry in entries:
if entry.voucher:
if entry.voucher.redeemed >= entry.voucher.max_usages:
status_label = status_labels['voucher-redeemed']
elif not entry.voucher.is_active():
status_label = status_labels['voucher-expired']
else:
status_label = status_labels['voucher-assigned']
else:
status_label = status_labels['awaiting-voucher']
# which event should be used to output dates in columns "Start date" and "End date"
event_for_date_columns = entry.subevent if entry.subevent else entry.event
tz = pytz.timezone(entry.event.settings.timezone)
datetime_format = '%Y-%m-%d %H:%M:%S'
row = [
entry.created.astimezone(tz).strftime(datetime_format), # alternative: .isoformat(),
entry.email,
str(entry.item) if entry.item else "",
str(entry.variation) if entry.variation else "",
entry.event.slug,
entry.event.name,
entry.subevent.name if entry.subevent else "",
event_for_date_columns.date_from.astimezone(tz).strftime(datetime_format),
event_for_date_columns.date_to.astimezone(tz).strftime(datetime_format) if event_for_date_columns.date_to else "",
entry.locale,
str(entry.priority),
status_label,
entry.voucher.code if entry.voucher else '',
]
yield row
@property
def additional_form_fields(self):
return OrderedDict(
[
('status',
forms.ChoiceField(
label=_('Status'),
initial=['awaiting-voucher'],
required=False,
choices=[(k, v) for (k, v, c) in self.status_filters]
)),
]
)
def get_filename(self):
if self.is_multievent:
event = self.events.first()
slug = event.organizer.slug if len(self.events) > 1 else event.slug
else:
slug = self.event.slug
return '{}_waitinglist'.format(slug)
@receiver(register_data_exporters, dispatch_uid="exporter_waitinglist")
def register_waitinglist_exporter(sender, **kwargs):
return WaitingListExporter
@receiver(register_multievent_data_exporters, dispatch_uid="multiexporter_waitinglist")
def register_multievent_i_waitinglist_exporter(sender, **kwargs):
return WaitingListExporter
+61 -3
View File
@@ -13,10 +13,13 @@ from babel import localedata
from django import forms from django import forms
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db.models import QuerySet from django.db.models import QuerySet
from django.forms import Select from django.forms import Select
from django.utils.formats import date_format
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.timezone import get_current_timezone
from django.utils.translation import ( from django.utils.translation import (
get_language, gettext_lazy as _, pgettext_lazy, get_language, gettext_lazy as _, pgettext_lazy,
) )
@@ -234,6 +237,43 @@ class QuestionCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
option_template_name = 'pretixbase/forms/widgets/checkbox_option_with_links.html' option_template_name = 'pretixbase/forms/widgets/checkbox_option_with_links.html'
class MinDateValidator(MinValueValidator):
def __call__(self, value):
try:
return super().__call__(value)
except ValidationError as e:
e.params['limit_value'] = date_format(e.params['limit_value'], 'SHORT_DATE_FORMAT')
raise e
class MinDateTimeValidator(MinValueValidator):
def __call__(self, value):
try:
return super().__call__(value)
except ValidationError as e:
e.params['limit_value'] = date_format(e.params['limit_value'].astimezone(get_current_timezone()), 'SHORT_DATETIME_FORMAT')
raise e
class MaxDateValidator(MaxValueValidator):
def __call__(self, value):
try:
return super().__call__(value)
except ValidationError as e:
e.params['limit_value'] = date_format(e.params['limit_value'], 'SHORT_DATE_FORMAT')
raise e
class MaxDateTimeValidator(MaxValueValidator):
def __call__(self, value):
try:
return super().__call__(value)
except ValidationError as e:
e.params['limit_value'] = date_format(e.params['limit_value'].astimezone(get_current_timezone()), 'SHORT_DATETIME_FORMAT')
raise e
class BaseQuestionsForm(forms.Form): class BaseQuestionsForm(forms.Form):
""" """
This form class is responsible for asking order-related questions. This includes This form class is responsible for asking order-related questions. This includes
@@ -392,9 +432,10 @@ class BaseQuestionsForm(forms.Form):
elif q.type == Question.TYPE_NUMBER: elif q.type == Question.TYPE_NUMBER:
field = forms.DecimalField( field = forms.DecimalField(
label=label, required=required, label=label, required=required,
min_value=q.valid_number_min or Decimal('0.00'),
max_value=q.valid_number_max,
help_text=q.help_text, help_text=q.help_text,
initial=initial.answer if initial else None, initial=initial.answer if initial else None,
min_value=Decimal('0.00'),
) )
elif q.type == Question.TYPE_STRING: elif q.type == Question.TYPE_STRING:
field = forms.CharField( field = forms.CharField(
@@ -453,12 +494,21 @@ class BaseQuestionsForm(forms.Form):
max_size=10 * 1024 * 1024, max_size=10 * 1024 * 1024,
) )
elif q.type == Question.TYPE_DATE: elif q.type == Question.TYPE_DATE:
attrs = {}
if q.valid_date_min:
attrs['data-min'] = q.valid_date_min.isoformat()
if q.valid_date_max:
attrs['data-max'] = q.valid_date_max.isoformat()
field = forms.DateField( field = forms.DateField(
label=label, required=required, label=label, required=required,
help_text=help_text, help_text=help_text,
initial=dateutil.parser.parse(initial.answer).date() if initial and initial.answer else None, initial=dateutil.parser.parse(initial.answer).date() if initial and initial.answer else None,
widget=DatePickerWidget(), widget=DatePickerWidget(attrs),
) )
if q.valid_date_min:
field.validators.append(MinDateValidator(q.valid_date_min))
if q.valid_date_max:
field.validators.append(MaxDateValidator(q.valid_date_max))
elif q.type == Question.TYPE_TIME: elif q.type == Question.TYPE_TIME:
field = forms.TimeField( field = forms.TimeField(
label=label, required=required, label=label, required=required,
@@ -471,8 +521,16 @@ class BaseQuestionsForm(forms.Form):
label=label, required=required, label=label, required=required,
help_text=help_text, help_text=help_text,
initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None, initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None,
widget=SplitDateTimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')), widget=SplitDateTimePickerWidget(
time_format=get_format_without_seconds('TIME_INPUT_FORMATS'),
min_date=q.valid_datetime_min,
max_date=q.valid_datetime_max
),
) )
if q.valid_datetime_min:
field.validators.append(MinDateTimeValidator(q.valid_datetime_min))
if q.valid_datetime_max:
field.validators.append(MaxDateTimeValidator(q.valid_datetime_max))
elif q.type == Question.TYPE_PHONENUMBER: elif q.type == Question.TYPE_PHONENUMBER:
babel_locale = 'en' babel_locale = 'en'
# Babel, and therefore django-phonenumberfield, do not support our custom locales such das de_Informal # Babel, and therefore django-phonenumberfield, do not support our custom locales such das de_Informal
+11 -2
View File
@@ -1,9 +1,10 @@
import os import os
from datetime import date
from django import forms from django import forms
from django.utils.formats import get_format from django.utils.formats import get_format
from django.utils.functional import lazy from django.utils.functional import lazy
from django.utils.timezone import now from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -92,7 +93,7 @@ class UploadedFileWidget(forms.ClearableFileInput):
class SplitDateTimePickerWidget(forms.SplitDateTimeWidget): class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
template_name = 'pretixbase/forms/widgets/splitdatetime.html' template_name = 'pretixbase/forms/widgets/splitdatetime.html'
def __init__(self, attrs=None, date_format=None, time_format=None): def __init__(self, attrs=None, date_format=None, time_format=None, min_date=None, max_date=None):
attrs = attrs or {} attrs = attrs or {}
if 'placeholder' in attrs: if 'placeholder' in attrs:
del attrs['placeholder'] del attrs['placeholder']
@@ -106,6 +107,14 @@ class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
time_attrs['class'] += ' timepickerfield' time_attrs['class'] += ' timepickerfield'
date_attrs['autocomplete'] = 'date-picker-do-not-autofill' date_attrs['autocomplete'] = 'date-picker-do-not-autofill'
time_attrs['autocomplete'] = 'time-picker-do-not-autofill' time_attrs['autocomplete'] = 'time-picker-do-not-autofill'
if min_date:
date_attrs['data-min'] = (
min_date if isinstance(min_date, date) else min_date.astimezone(get_current_timezone()).date()
).isoformat()
if max_date:
date_attrs['data-max'] = (
max_date if isinstance(max_date, date) else max_date.astimezone(get_current_timezone()).date()
).isoformat()
def date_placeholder(): def date_placeholder():
df = date_format or get_format('DATE_INPUT_FORMATS')[0] df = date_format or get_format('DATE_INPUT_FORMATS')[0]
@@ -0,0 +1,49 @@
# Generated by Django 3.0.11 on 2020-11-26 16:35
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0170_remove_hidden_urls'),
]
operations = [
migrations.AddField(
model_name='question',
name='valid_date_max',
field=models.DateField(blank=True, null=True),
),
migrations.AddField(
model_name='question',
name='valid_date_min',
field=models.DateField(blank=True, null=True),
),
migrations.AddField(
model_name='question',
name='valid_datetime_max',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='question',
name='valid_datetime_min',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='question',
name='valid_number_max',
field=models.DecimalField(decimal_places=6, max_digits=16, null=True),
),
migrations.AddField(
model_name='question',
name='valid_number_min',
field=models.DecimalField(decimal_places=6, max_digits=16, null=True),
),
migrations.AlterField(
model_name='seat',
name='product',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='seats', to='pretixbase.Item'),
),
]
@@ -0,0 +1,20 @@
# Generated by Django 3.0.9 on 2020-12-02 12:37
from django.db import migrations
import pretix.base.models.fields
from pretix.base.channels import get_all_sales_channels
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0171_auto_20201126_1635'),
]
operations = [
migrations.AddField(
model_name='event',
name='sales_channels',
field=pretix.base.models.fields.MultiStringField(default=list(get_all_sales_channels().keys())),
),
]
+1 -1
View File
@@ -20,7 +20,7 @@ class CheckinList(LoggedModel):
include_pending = models.BooleanField(verbose_name=pgettext_lazy('checkin', 'Include pending orders'), include_pending = models.BooleanField(verbose_name=pgettext_lazy('checkin', 'Include pending orders'),
default=False, default=False,
help_text=_('With this option, people will be able to check in even if the ' help_text=_('With this option, people will be able to check in even if the '
'order have not been paid.')) 'order has not been paid.'))
gates = models.ManyToManyField( gates = models.ManyToManyField(
'Gate', verbose_name=_("Gates"), blank=True, 'Gate', verbose_name=_("Gates"), blank=True,
help_text=_("Does not have any effect for the validation of tickets, only for the automatic configuration of " help_text=_("Does not have any effect for the validation of tickets, only for the automatic configuration of "
+8 -1
View File
@@ -23,6 +23,7 @@ from django_scopes import ScopedManager, scopes_disabled
from i18nfield.fields import I18nCharField, I18nTextField from i18nfield.fields import I18nCharField, I18nTextField
from pretix.base.models.base import LoggedModel from pretix.base.models.base import LoggedModel
from pretix.base.models.fields import MultiStringField
from pretix.base.reldate import RelativeDateWrapper from pretix.base.reldate import RelativeDateWrapper
from pretix.base.validators import EventSlugBanlistValidator from pretix.base.validators import EventSlugBanlistValidator
from pretix.helpers.database import GroupConcat from pretix.helpers.database import GroupConcat
@@ -331,6 +332,8 @@ class Event(EventMixin, LoggedModel):
:type plugins: str :type plugins: str
:param has_subevents: Enable event series functionality :param has_subevents: Enable event series functionality
:type has_subevents: bool :type has_subevents: bool
:param sales_channels: A list of sales channel identifiers, that this event is available for sale on
:type sales_channels: list
""" """
settings_namespace = 'event' settings_namespace = 'event'
@@ -409,7 +412,11 @@ class Event(EventMixin, LoggedModel):
) )
seating_plan = models.ForeignKey('SeatingPlan', on_delete=models.PROTECT, null=True, blank=True, seating_plan = models.ForeignKey('SeatingPlan', on_delete=models.PROTECT, null=True, blank=True,
related_name='events') related_name='events')
sales_channels = MultiStringField(
verbose_name=_('Restrict to specific sales channels'),
help_text=_('Only sell tickets for this event on the following sales channels.'),
default=['web'],
)
objects = ScopedManager(organizer='organizer') objects = ScopedManager(organizer='organizer')
class Meta: class Meta:
+30 -3
View File
@@ -1084,6 +1084,18 @@ class Question(LoggedModel):
'Question', null=True, blank=True, on_delete=models.SET_NULL, related_name='dependent_questions' 'Question', null=True, blank=True, on_delete=models.SET_NULL, related_name='dependent_questions'
) )
dependency_values = MultiStringField(default=[]) dependency_values = MultiStringField(default=[])
valid_number_min = models.DecimalField(decimal_places=6, max_digits=16, null=True, blank=True,
verbose_name=_('Minimum value'), help_text=_('Currently not supported in our apps'))
valid_number_max = models.DecimalField(decimal_places=6, max_digits=16, null=True, blank=True,
verbose_name=_('Maximum value'), help_text=_('Currently not supported in our apps'))
valid_date_min = models.DateField(null=True, blank=True,
verbose_name=_('Minimum value'), help_text=_('Currently not supported in our apps'))
valid_date_max = models.DateField(null=True, blank=True,
verbose_name=_('Maximum value'), help_text=_('Currently not supported in our apps'))
valid_datetime_min = models.DateTimeField(null=True, blank=True,
verbose_name=_('Minimum value'), help_text=_('Currently not supported in our apps'))
valid_datetime_max = models.DateTimeField(null=True, blank=True,
verbose_name=_('Maximum value'), help_text=_('Currently not supported in our apps'))
objects = ScopedManager(organizer='event__organizer') objects = ScopedManager(organizer='event__organizer')
@@ -1173,14 +1185,24 @@ class Question(LoggedModel):
answer = formats.sanitize_separators(answer) answer = formats.sanitize_separators(answer)
answer = str(answer).strip() answer = str(answer).strip()
try: try:
return Decimal(answer) v = Decimal(answer)
if self.valid_number_min is not None and v < self.valid_number_min:
raise ValidationError(_('The number is to low.'))
if self.valid_number_max is not None and v > self.valid_number_max:
raise ValidationError(_('The number is to high.'))
return v
except DecimalException: except DecimalException:
raise ValidationError(_('Invalid number input.')) raise ValidationError(_('Invalid number input.'))
elif self.type == Question.TYPE_DATE: elif self.type == Question.TYPE_DATE:
if isinstance(answer, date): if isinstance(answer, date):
return answer return answer
try: try:
return dateutil.parser.parse(answer).date() dt = dateutil.parser.parse(answer).date()
if self.valid_date_min is not None and dt < self.valid_date_min:
raise ValidationError(_('Please choose a later date.'))
if self.valid_date_max is not None and dt > self.valid_date_max:
raise ValidationError(_('Please choose an earlier date.'))
return dt
except: except:
raise ValidationError(_('Invalid date input.')) raise ValidationError(_('Invalid date input.'))
elif self.type == Question.TYPE_TIME: elif self.type == Question.TYPE_TIME:
@@ -1197,9 +1219,14 @@ class Question(LoggedModel):
dt = dateutil.parser.parse(answer) dt = dateutil.parser.parse(answer)
if is_naive(dt): if is_naive(dt):
dt = make_aware(dt, pytz.timezone(self.event.settings.timezone)) dt = make_aware(dt, pytz.timezone(self.event.settings.timezone))
return dt
except: except:
raise ValidationError(_('Invalid datetime input.')) raise ValidationError(_('Invalid datetime input.'))
else:
if self.valid_datetime_min is not None and dt < self.valid_datetime_min:
raise ValidationError(_('Please choose a later date.'))
if self.valid_datetime_max is not None and dt > self.valid_datetime_max:
raise ValidationError(_('Please choose an earlier date.'))
return dt
elif self.type == Question.TYPE_COUNTRYCODE and answer: elif self.type == Question.TYPE_COUNTRYCODE and answer:
c = Country(answer.upper()) c = Country(answer.upper())
if c.name: if c.name:
+6 -3
View File
@@ -639,7 +639,7 @@ class Order(LockModel, LoggedModel):
return return
if iteration > 20: if iteration > 20:
# Safeguard: If we don't find an unused and non-blacklisted code within 20 iterations, we increase # Safeguard: If we don't find an unused and non-banlisted code within 20 iterations, we increase
# the length. # the length.
length += 1 length += 1
iteration = 0 iteration = 0
@@ -1874,7 +1874,7 @@ class OrderFee(models.Model):
self.tax_rule = self.order.event.settings.tax_rate_default self.tax_rule = self.order.event.settings.tax_rate_default
if self.tax_rule: if self.tax_rule:
tax = self.tax_rule.tax(self.value, base_price_is='gross', invoice_address=ia) tax = self.tax_rule.tax(self.value, base_price_is='gross', invoice_address=ia, force_fixed_gross_price=True)
self.tax_rate = tax.rate self.tax_rate = tax.rate
self.tax_value = tax.tax self.tax_value = tax.tax
else: else:
@@ -2026,9 +2026,11 @@ class OrderPosition(AbstractPosition):
except InvoiceAddress.DoesNotExist: except InvoiceAddress.DoesNotExist:
ia = None ia = None
if self.tax_rule: if self.tax_rule:
tax = self.tax_rule.tax(self.price, invoice_address=ia, base_price_is='gross') tax = self.tax_rule.tax(self.price, invoice_address=ia, base_price_is='gross', force_fixed_gross_price=True)
self.tax_rate = tax.rate self.tax_rate = tax.rate
self.tax_value = tax.tax self.tax_value = tax.tax
if tax.gross != self.price:
raise ValueError('Invalid tax calculation')
else: else:
self.tax_value = Decimal('0.00') self.tax_value = Decimal('0.00')
self.tax_rate = Decimal('0.00') self.tax_rate = Decimal('0.00')
@@ -2038,6 +2040,7 @@ class OrderPosition(AbstractPosition):
if self.tax_rate is None: if self.tax_rate is None:
self._calculate_tax() self._calculate_tax()
self.order.touch() self.order.touch()
if not self.pk: if not self.pk:
while not self.secret or OrderPosition.all.filter( while not self.secret or OrderPosition.all.filter(
+23 -3
View File
@@ -5,8 +5,9 @@ from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.formats import localize from django.utils.formats import localize
from django.utils.timezone import get_current_timezone, now from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _, pgettext
from i18nfield.fields import I18nCharField from i18nfield.fields import I18nCharField
from i18nfield.strings import LazyI18nString
from pretix.base.decimal import round_decimal from pretix.base.decimal import round_decimal
from pretix.base.models.base import LoggedModel from pretix.base.models.base import LoggedModel
@@ -188,7 +189,7 @@ class TaxRule(LoggedModel):
return Decimal(self.rate) return Decimal(self.rate)
def tax(self, base_price, base_price_is='auto', currency=None, override_tax_rate=None, invoice_address=None, def tax(self, base_price, base_price_is='auto', currency=None, override_tax_rate=None, invoice_address=None,
subtract_from_gross=Decimal('0.00'), gross_price_is_tax_rate: Decimal = None): subtract_from_gross=Decimal('0.00'), gross_price_is_tax_rate: Decimal = None, force_fixed_gross_price=False):
from .event import Event from .event import Event
try: try:
currency = currency or self.event.currency currency = currency or self.event.currency
@@ -200,7 +201,7 @@ class TaxRule(LoggedModel):
rate = override_tax_rate rate = override_tax_rate
elif invoice_address: elif invoice_address:
adjust_rate = self.tax_rate_for(invoice_address) adjust_rate = self.tax_rate_for(invoice_address)
if adjust_rate == gross_price_is_tax_rate and base_price_is == 'gross': if (adjust_rate == gross_price_is_tax_rate or force_fixed_gross_price) and base_price_is == 'gross':
rate = adjust_rate rate = adjust_rate
elif adjust_rate != rate: elif adjust_rate != rate:
normal_price = self.tax(base_price, base_price_is, currency, subtract_from_gross=subtract_from_gross) normal_price = self.tax(base_price, base_price_is, currency, subtract_from_gross=subtract_from_gross)
@@ -268,6 +269,25 @@ class TaxRule(LoggedModel):
return r return r
return {'action': 'vat'} return {'action': 'vat'}
def invoice_text(self, invoice_address):
if self._custom_rules:
rule = self.get_matching_rule(invoice_address)
t = rule.get('invoice_text', {})
if t and any(l for l in t.values()):
return str(LazyI18nString(t))
if self.is_reverse_charge(invoice_address):
if is_eu_country(invoice_address.country):
return pgettext(
"invoice",
"Reverse Charge: According to Article 194, 196 of Council Directive 2006/112/EEC, VAT liability "
"rests with the service recipient."
)
else:
return pgettext(
"invoice",
"VAT liability rests with the service recipient."
)
def is_reverse_charge(self, invoice_address): def is_reverse_charge(self, invoice_address):
if self._custom_rules: if self._custom_rules:
rule = self.get_matching_rule(invoice_address) rule = self.get_matching_rule(invoice_address)
+40
View File
@@ -121,6 +121,26 @@ DEFAULT_VARIABLES = OrderedDict((
'editor_sample': _('John Doe\nSample company\nSesame Street 42\n12345 Any City\nAtlantis'), 'editor_sample': _('John Doe\nSample company\nSesame Street 42\n12345 Any City\nAtlantis'),
'evaluate': lambda op, order, event: op.address_format() 'evaluate': lambda op, order, event: op.address_format()
}), }),
("attendee_street", {
"label": _("Attendee street"),
"editor_sample": 'Sesame Street 42',
"evaluate": lambda op, order, ev: op.street or (op.addon_to.street if op.addon_to else '')
}),
("attendee_zipcode", {
"label": _("Attendee ZIP code"),
"editor_sample": '12345',
"evaluate": lambda op, order, ev: op.zipcode or (op.addon_to.zipcode if op.addon_to else '')
}),
("attendee_city", {
"label": _("Attendee city"),
"editor_sample": 'Any City',
"evaluate": lambda op, order, ev: op.city or (op.addon_to.city if op.addon_to else '')
}),
("attendee_state", {
"label": _("Attendee state"),
"editor_sample": 'Sample State',
"evaluate": lambda op, order, ev: op.state or (op.addon_to.state if op.addon_to else '')
}),
("attendee_country", { ("attendee_country", {
"label": _("Attendee country"), "label": _("Attendee country"),
"editor_sample": 'Atlantis', "editor_sample": 'Atlantis',
@@ -219,11 +239,31 @@ DEFAULT_VARIABLES = OrderedDict((
"editor_sample": _("Sample company"), "editor_sample": _("Sample company"),
"evaluate": lambda op, order, ev: order.invoice_address.company if getattr(order, 'invoice_address', None) else '' "evaluate": lambda op, order, ev: order.invoice_address.company if getattr(order, 'invoice_address', None) else ''
}), }),
("invoice_street", {
"label": _("Invoice address street"),
"editor_sample": _("Sesame Street 42"),
"evaluate": lambda op, order, ev: order.invoice_address.street if getattr(order, 'invoice_address', None) else ''
}),
("invoice_zipcode", {
"label": _("Invoice address ZIP code"),
"editor_sample": _("12345"),
"evaluate": lambda op, order, ev: order.invoice_address.zipcode if getattr(order, 'invoice_address', None) else ''
}),
("invoice_city", { ("invoice_city", {
"label": _("Invoice address city"), "label": _("Invoice address city"),
"editor_sample": _("Sample city"), "editor_sample": _("Sample city"),
"evaluate": lambda op, order, ev: order.invoice_address.city if getattr(order, 'invoice_address', None) else '' "evaluate": lambda op, order, ev: order.invoice_address.city if getattr(order, 'invoice_address', None) else ''
}), }),
("invoice_state", {
"label": _("Invoice address state"),
"editor_sample": _("Sample State"),
"evaluate": lambda op, order, ev: order.invoice_address.state if getattr(order, 'invoice_address', None) else ''
}),
("invoice_country", {
"label": _("Invoice address country"),
"editor_sample": _("Atlantis"),
"evaluate": lambda op, order, ev: str(getattr(order.invoice_address.country, 'name', '')) if getattr(order, 'invoice_address', None) else ''
}),
("addons", { ("addons", {
"label": _("List of Add-Ons"), "label": _("List of Add-Ons"),
"editor_sample": _("Add-on 1\nAdd-on 2"), "editor_sample": _("Add-on 1\nAdd-on 2"),
+21 -17
View File
@@ -24,7 +24,7 @@ from pretix.base.i18n import language
from pretix.base.models import ( from pretix.base.models import (
Invoice, InvoiceAddress, InvoiceLine, Order, OrderFee, Invoice, InvoiceAddress, InvoiceLine, Order, OrderFee,
) )
from pretix.base.models.tax import EU_CURRENCIES, is_eu_country from pretix.base.models.tax import EU_CURRENCIES
from pretix.base.services.tasks import TransactionAwareTask from pretix.base.services.tasks import TransactionAwareTask
from pretix.base.settings import GlobalSettingsObject from pretix.base.settings import GlobalSettingsObject
from pretix.base.signals import invoice_line_text, periodic_task from pretix.base.signals import invoice_line_text, periodic_task
@@ -142,6 +142,8 @@ def build_invoice(invoice: Invoice) -> Invoice:
reverse_charge = False reverse_charge = False
positions.sort(key=lambda p: p.sort_key) positions.sort(key=lambda p: p.sort_key)
tax_texts = []
for i, p in enumerate(positions): for i, p in enumerate(positions):
if not invoice.event.settings.invoice_include_free and p.price == Decimal('0.00') and not p.addon_c: if not invoice.event.settings.invoice_include_free and p.price == Decimal('0.00') and not p.addon_c:
continue continue
@@ -178,22 +180,10 @@ def build_invoice(invoice: Invoice) -> Invoice:
if p.tax_rule and p.tax_rule.is_reverse_charge(ia) and p.price and not p.tax_value: if p.tax_rule and p.tax_rule.is_reverse_charge(ia) and p.price and not p.tax_value:
reverse_charge = True reverse_charge = True
if reverse_charge: if p.tax_rule:
if invoice.additional_text: tax_text = p.tax_rule.invoice_text(ia)
invoice.additional_text += "<br /><br />" if tax_text and tax_text not in tax_texts:
if is_eu_country(invoice.invoice_to_country): tax_texts.append(tax_text)
invoice.additional_text += pgettext(
"invoice",
"Reverse Charge: According to Article 194, 196 of Council Directive 2006/112/EEC, VAT liability "
"rests with the service recipient."
)
else:
invoice.additional_text += pgettext(
"invoice",
"VAT liability rests with the service recipient."
)
invoice.reverse_charge = True
invoice.save()
offset = len(positions) offset = len(positions)
for i, fee in enumerate(invoice.order.fees.all()): for i, fee in enumerate(invoice.order.fees.all()):
@@ -213,6 +203,20 @@ def build_invoice(invoice: Invoice) -> Invoice:
tax_name=fee.tax_rule.name if fee.tax_rule else '' tax_name=fee.tax_rule.name if fee.tax_rule else ''
) )
if fee.tax_rule and fee.tax_rule.is_reverse_charge(ia) and fee.value and not fee.tax_value:
reverse_charge = True
if fee.tax_rule:
tax_text = fee.tax_rule.invoice_text(ia)
if tax_text and tax_text not in tax_texts:
tax_texts.append(tax_text)
if tax_texts:
invoice.additional_text += "<br /><br />"
invoice.additional_text += "<br />".join(tax_texts)
invoice.reverse_charge = reverse_charge
invoice.save()
return invoice return invoice
+246 -18
View File
@@ -9,7 +9,9 @@ from django import forms
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.files import File from django.core.files import File
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import (
MaxValueValidator, MinValueValidator, RegexValidator,
)
from django.db.models import Model from django.db.models import Model
from django.utils.translation import ( from django.utils.translation import (
gettext_lazy as _, gettext_noop, pgettext, pgettext_lazy, gettext_lazy as _, gettext_noop, pgettext, pgettext_lazy,
@@ -26,7 +28,9 @@ from pretix.base.reldate import (
RelativeDateField, RelativeDateTimeField, RelativeDateWrapper, RelativeDateField, RelativeDateTimeField, RelativeDateWrapper,
SerializerRelativeDateField, SerializerRelativeDateTimeField, SerializerRelativeDateField, SerializerRelativeDateTimeField,
) )
from pretix.control.forms import MultipleLanguagesWidget, SingleLanguageWidget from pretix.control.forms import (
FontSelect, MultipleLanguagesWidget, SingleLanguageWidget,
)
from pretix.helpers.countries import CachedCountries from pretix.helpers.countries import CachedCountries
@@ -38,6 +42,18 @@ def country_choice_kwargs():
} }
def primary_font_kwargs():
from pretix.presale.style import get_fonts
choices = [('Open Sans', 'Open Sans')]
choices += [
(a, {"title": a, "data": v}) for a, v in get_fonts().items()
]
return {
'choices': choices,
}
class LazyI18nStringList(UserList): class LazyI18nStringList(UserList):
def __init__(self, init_list=None): def __init__(self, init_list=None):
super().__init__() super().__init__()
@@ -252,7 +268,6 @@ DEFAULTS = {
'form_kwargs': dict( 'form_kwargs': dict(
label=_("Ask for beneficiary"), label=_("Ask for beneficiary"),
widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_invoice_address_asked'}), widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_invoice_address_asked'}),
required=False
) )
}, },
'invoice_address_custom_field': { 'invoice_address_custom_field': {
@@ -421,7 +436,6 @@ DEFAULTS = {
widget_kwargs={'attrs': { widget_kwargs={'attrs': {
'rows': 3, 'rows': 3,
}}, }},
required=False,
label=_("Guidance text"), label=_("Guidance text"),
help_text=_("This text will be shown above the payment options. You can explain the choices to the user here, " help_text=_("This text will be shown above the payment options. You can explain the choices to the user here, "
"if you want.") "if you want.")
@@ -441,7 +455,6 @@ DEFAULTS = {
'form_kwargs': dict( 'form_kwargs': dict(
label=_("Set payment term"), label=_("Set payment term"),
widget=forms.RadioSelect, widget=forms.RadioSelect,
required=True,
choices=( choices=(
('days', _("in days")), ('days', _("in days")),
('minutes', _("in minutes")) ('minutes', _("in minutes"))
@@ -488,7 +501,6 @@ DEFAULTS = {
widget=forms.CheckboxInput( widget=forms.CheckboxInput(
attrs={ attrs={
'data-display-dependency': '#id_payment_term_mode_0', 'data-display-dependency': '#id_payment_term_mode_0',
'data-required-if': '#id_payment_term_mode_0'
}, },
), ),
) )
@@ -541,6 +553,18 @@ DEFAULTS = {
"the pool and can be ordered by other people."), "the pool and can be ordered by other people."),
) )
}, },
'payment_pending_hidden': {
'default': 'False',
'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_('Hide "payment pending" state on customer-facing pages'),
help_text=_("The payment instructions panel will still be shown to the primary customer, but no indication "
"of missing payment will be visible on the ticket pages of attendees who did not buy the ticket "
"themselves.")
)
},
'payment_giftcard__enabled': { 'payment_giftcard__enabled': {
'default': 'True', 'default': 'True',
'type': bool 'type': bool
@@ -990,7 +1014,16 @@ DEFAULTS = {
}, },
'event_list_availability': { 'event_list_availability': {
'default': 'True', 'default': 'True',
'type': bool 'type': bool,
'serializer_class': serializers.BooleanField,
'form_class': forms.BooleanField,
'form_kwargs': dict(
label=_('Show availability in event overviews'),
help_text=_('If checked, the list of events will show if events are sold out. This might '
'make for longer page loading times if you have lots of events and the shown status might be out '
'of date for up to two minutes.'),
required=False
)
}, },
'event_list_type': { 'event_list_type': {
'default': 'list', 'default': 'list',
@@ -1599,26 +1632,106 @@ Your {event} team"""))
'primary_color': { 'primary_color': {
'default': settings.PRETIX_PRIMARY_COLOR, 'default': settings.PRETIX_PRIMARY_COLOR,
'type': str, 'type': str,
'form_class': forms.CharField,
'serializer_class': serializers.CharField,
'serializer_kwargs': dict(
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
),
'form_kwargs': dict(
label=_("Primary color"),
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
),
}, },
'theme_color_success': { 'theme_color_success': {
'default': '#50A167', 'default': '#50A167',
'type': str 'type': str,
'form_class': forms.CharField,
'serializer_class': serializers.CharField,
'serializer_kwargs': dict(
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
),
'form_kwargs': dict(
label=_("Accent color for success"),
help_text=_("We strongly suggest to use a shade of green."),
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
),
}, },
'theme_color_danger': { 'theme_color_danger': {
'default': '#D36060', 'default': '#D36060',
'type': str 'type': str,
'form_class': forms.CharField,
'serializer_class': serializers.CharField,
'serializer_kwargs': dict(
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
),
'form_kwargs': dict(
label=_("Accent color for errors"),
help_text=_("We strongly suggest to use a shade of red."),
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
),
}, },
'theme_color_background': { 'theme_color_background': {
'default': '#FFFFFF', 'default': '#FFFFFF',
'type': str 'type': str,
'form_class': forms.CharField,
'serializer_class': serializers.CharField,
'serializer_kwargs': dict(
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
),
'form_kwargs': dict(
label=_("Page background color"),
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield no-contrast'})
),
}, },
'theme_round_borders': { 'theme_round_borders': {
'default': 'True', 'default': 'True',
'type': bool 'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_("Use round edges"),
)
}, },
'primary_font': { 'primary_font': {
'default': 'Open Sans', 'default': 'Open Sans',
'type': str 'type': str,
'form_class': forms.ChoiceField,
'serializer_class': serializers.ChoiceField,
'serializer_kwargs': lambda: dict(**primary_font_kwargs()),
'form_kwargs': lambda: dict(
label=_('Font'),
help_text=_('Only respected by modern browsers.'),
widget=FontSelect,
**primary_font_kwargs()
),
}, },
'presale_css_file': { 'presale_css_file': {
'default': None, 'default': None,
@@ -1654,7 +1767,13 @@ Your {event} team"""))
}, },
'organizer_logo_image_large': { 'organizer_logo_image_large': {
'default': 'False', 'default': 'False',
'type': bool 'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_('Use header image in its full size'),
help_text=_('We recommend to upload a picture at least 1170 pixels wide.'),
)
}, },
'og_image': { 'og_image': {
'default': None, 'default': None,
@@ -1713,6 +1832,19 @@ Your {event} team"""))
"how to obtain a voucher code.") "how to obtain a voucher code.")
) )
}, },
'attendee_data_explanation_text': {
'default': '',
'type': LazyI18nString,
'serializer_class': I18nField,
'form_class': I18nFormField,
'form_kwargs': dict(
label=_("Attendee data explanation"),
widget=I18nTextarea,
widget_kwargs={'attrs': {'rows': '2'}},
help_text=_("This text will be shown above the questions asked for every admission product. You can use it e.g. to explain "
"why you need information from them.")
)
},
'checkout_email_helptext': { 'checkout_email_helptext': {
'default': LazyI18nString.from_gettext(gettext_noop( 'default': LazyI18nString.from_gettext(gettext_noop(
'Make sure to enter a valid email address. We will send you an order ' 'Make sure to enter a valid email address. We will send you an order '
@@ -1733,11 +1865,26 @@ Your {event} team"""))
}, },
'organizer_info_text': { 'organizer_info_text': {
'default': '', 'default': '',
'type': LazyI18nString 'type': LazyI18nString,
'serializer_class': I18nField,
'form_class': I18nFormField,
'form_kwargs': dict(
label=_('Info text'),
widget=I18nTextarea,
help_text=_('Not displayed anywhere by default, but if you want to, you can use this e.g. in ticket templates.')
)
}, },
'event_team_provisioning': { 'event_team_provisioning': {
'default': 'True', 'default': 'True',
'type': bool 'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_('Allow creating a new team during event creation'),
help_text=_('Users that do not have access to all events under this organizer, must select one of their teams '
'to have access to the created event. This setting allows users to create an event-specified team'
' on-the-fly, even when they do not have \"Can change teams and permissions\" permission.'),
)
}, },
'update_check_ack': { 'update_check_ack': {
'default': 'False', 'default': 'False',
@@ -1779,6 +1926,10 @@ Your {event} team"""))
'default': None, 'default': None,
'type': str 'type': str
}, },
'mapquest_apikey': {
'default': None,
'type': str
},
'leaflet_tiles': { 'leaflet_tiles': {
'default': None, 'default': None,
'type': str 'type': str
@@ -1811,13 +1962,51 @@ Your {event} team"""))
# When adding a new ordering, remember to also define it in the event model # When adding a new ordering, remember to also define it in the event model
) )
}, },
'organizer_link_back': {
'default': 'False',
'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_('Link back to organizer overview on all event pages'),
)
},
'organizer_homepage_text': {
'default': '',
'type': LazyI18nString,
'serializer_class': I18nField,
'form_class': I18nFormField,
'form_kwargs': dict(
label=_('Homepage text'),
widget=I18nTextarea,
help_text=_('This will be displayed on the organizer homepage.')
)
},
'name_scheme': { 'name_scheme': {
'default': 'full', 'default': 'full',
'type': str 'type': str
}, },
'giftcard_length': { 'giftcard_length': {
'default': settings.ENTROPY['giftcard_secret'], 'default': settings.ENTROPY['giftcard_secret'],
'type': int 'type': int,
'form_class': forms.IntegerField,
'serializer_class': serializers.IntegerField,
'form_kwargs': dict(
label=_('Length of gift card codes'),
help_text=_('The system generates by default {}-character long gift card codes. However, if a different length '
'is required, it can be set here.'.format(settings.ENTROPY['giftcard_secret'])),
)
},
'giftcard_expiry_years': {
'default': None,
'type': int,
'form_class': forms.IntegerField,
'serializer_class': serializers.IntegerField,
'form_kwargs': dict(
label=_('Validity of gift card codes in years'),
help_text=_('If you set a number here, gift cards will by default expire at the end of the year after this '
'many years. If you keep it empty, gift cards do not have an explicit expiry date.'),
)
}, },
'seating_choice': { 'seating_choice': {
'default': 'True', 'default': 'True',
@@ -1853,6 +2042,10 @@ Your {event} team"""))
), ),
} }
} }
SETTINGS_AFFECTING_CSS = {
'primary_color', 'theme_color_success', 'theme_color_danger', 'primary_font',
'theme_color_background', 'theme_round_borders'
}
PERSON_NAME_TITLE_GROUPS = OrderedDict([ PERSON_NAME_TITLE_GROUPS = OrderedDict([
('english_common', (_('Most common English titles'), ( ('english_common', (_('Most common English titles'), (
'Mr', 'Mr',
@@ -2052,6 +2245,30 @@ PERSON_NAME_SCHEMES = OrderedDict([
'_scheme': 'salutation_title_given_family', '_scheme': 'salutation_title_given_family',
}, },
}), }),
('salutation_title_given_family_degree', {
'fields': (
('salutation', pgettext_lazy('person_name', 'Salutation'), 1),
('title', pgettext_lazy('person_name', 'Title'), 1),
('given_name', _('Given name'), 2),
('family_name', _('Family name'), 2),
('degree', pgettext_lazy('person_name', 'Degree (after name)'), 2),
),
'concatenation': lambda d: (
' '.join(
str(p) for p in (d.get(key, '') for key in ["title", "given_name", "family_name"]) if p
) +
str((', ' if d.get('degree') else '')) +
str(d.get('degree', ''))
),
'sample': {
'salutation': pgettext_lazy('person_name_sample', 'Mr'),
'title': pgettext_lazy('person_name_sample', 'Dr'),
'given_name': pgettext_lazy('person_name_sample', 'John'),
'family_name': pgettext_lazy('person_name_sample', 'Doe'),
'degree': pgettext_lazy('person_name_sample', 'MA'),
'_scheme': 'salutation_title_given_family_degree',
},
}),
]) ])
COUNTRIES_WITH_STATE_IN_ADDRESS = { COUNTRIES_WITH_STATE_IN_ADDRESS = {
# Source: http://www.bitboost.com/ref/international-address-formats.html # Source: http://www.bitboost.com/ref/international-address-formats.html
@@ -2143,7 +2360,8 @@ class SettingsSandbox:
self._event.settings.set(self._convert_key(key), value) self._event.settings.set(self._convert_key(key), value)
def validate_settings(event, settings_dict): def validate_event_settings(event, settings_dict):
from pretix.base.models import Event
from pretix.base.signals import validate_event_settings from pretix.base.signals import validate_event_settings
if 'locales' in settings_dict and settings_dict['locale'] not in settings_dict['locales']: if 'locales' in settings_dict and settings_dict['locale'] not in settings_dict['locales']:
@@ -2174,4 +2392,14 @@ def validate_settings(event, settings_dict):
'payment_term_last': _('The last payment date cannot be before the end of presale.') 'payment_term_last': _('The last payment date cannot be before the end of presale.')
}) })
validate_event_settings.send(sender=event, settings_dict=settings_dict) if isinstance(event, Event):
validate_event_settings.send(sender=event, settings_dict=settings_dict)
def validate_organizer_settings(organizer, settings_dict):
# This is not doing anything for the time being.
# But earlier we called validate_event_settings for the organizer, too - and that didn't do anything for
# organizer-settings either.
#
# N.B.: When actually fleshing out this stub, adding it to the OrganizerUpdateForm should be considered.
pass
+52 -65
View File
@@ -3,15 +3,14 @@ from urllib.parse import urlencode, urlparse
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator, validate_email from django.core.validators import validate_email
from django.db.models import Q from django.db.models import Q
from django.forms import formset_factory from django.forms import CheckboxSelectMultiple, formset_factory
from django.urls import reverse from django.urls import reverse
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.timezone import get_current_timezone_name from django.utils.timezone import get_current_timezone_name
from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy
from django_countries import Countries
from django_countries.fields import LazyTypedChoiceField from django_countries.fields import LazyTypedChoiceField
from i18nfield.forms import ( from i18nfield.forms import (
I18nForm, I18nFormField, I18nFormSetMixin, I18nTextarea, I18nTextInput, I18nForm, I18nFormField, I18nFormSetMixin, I18nTextarea, I18nTextInput,
@@ -20,18 +19,21 @@ from pytz import common_timezones, timezone
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
from pretix.base.email import get_available_placeholders from pretix.base.email import get_available_placeholders
from pretix.base.forms import I18nModelForm, PlaceholderValidator, SettingsForm from pretix.base.forms import (
I18nModelForm, PlaceholderValidator, SettingsForm,
)
from pretix.base.models import Event, Organizer, TaxRule, Team from pretix.base.models import Event, Organizer, TaxRule, Team
from pretix.base.models.event import EventMetaValue, SubEvent from pretix.base.models.event import EventMetaValue, SubEvent
from pretix.base.reldate import RelativeDateField, RelativeDateTimeField from pretix.base.reldate import RelativeDateField, RelativeDateTimeField
from pretix.base.settings import ( from pretix.base.settings import (
PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, validate_settings, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, validate_event_settings,
) )
from pretix.control.forms import ( from pretix.control.forms import (
ExtFileField, FontSelect, MultipleLanguagesWidget, SlugWidget, ExtFileField, MultipleLanguagesWidget, SlugWidget, SplitDateTimeField,
SplitDateTimeField, SplitDateTimePickerWidget, SplitDateTimePickerWidget,
) )
from pretix.control.forms.widgets import Select2 from pretix.control.forms.widgets import Select2
from pretix.helpers.countries import CachedCountries
from pretix.multidomain.models import KnownDomain from pretix.multidomain.models import KnownDomain
from pretix.multidomain.urlreverse import build_absolute_uri from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.plugins.banktransfer.payment import BankTransfer from pretix.plugins.banktransfer.payment import BankTransfer
@@ -311,6 +313,16 @@ class EventUpdateForm(I18nModelForm):
required=False, required=False,
help_text=_('You need to configure the custom domain in the webserver beforehand.') help_text=_('You need to configure the custom domain in the webserver beforehand.')
) )
self.fields['sales_channels'] = forms.MultipleChoiceField(
label=self.fields['sales_channels'].label,
help_text=self.fields['sales_channels'].help_text,
required=self.fields['sales_channels'].required,
initial=self.fields['sales_channels'].initial,
choices=(
(c.identifier, c.verbose_name) for c in get_all_sales_channels().values()
),
widget=forms.CheckboxSelectMultiple
)
def clean_domain(self): def clean_domain(self):
d = self.cleaned_data['domain'] d = self.cleaned_data['domain']
@@ -367,6 +379,7 @@ class EventUpdateForm(I18nModelForm):
'location', 'location',
'geo_lat', 'geo_lat',
'geo_lon', 'geo_lon',
'sales_channels'
] ]
field_classes = { field_classes = {
'date_from': SplitDateTimeField, 'date_from': SplitDateTimeField,
@@ -381,6 +394,7 @@ class EventUpdateForm(I18nModelForm):
'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}), 'date_admission': SplitDateTimePickerWidget(attrs={'data-date-default': '#id_date_from_0'}),
'presale_start': SplitDateTimePickerWidget(), 'presale_start': SplitDateTimePickerWidget(),
'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}), 'presale_end': SplitDateTimePickerWidget(attrs={'data-date-after': '#id_presale_start_0'}),
'sales_channels': CheckboxSelectMultiple()
} }
@@ -431,57 +445,6 @@ class EventSettingsForm(SettingsForm):
'WhatsApp and Reddit only show a square preview, so we recommend to make sure it still looks good ' 'WhatsApp and Reddit only show a square preview, so we recommend to make sure it still looks good '
'only the center square is shown. If you do not fill this, we will use the logo given above.') 'only the center square is shown. If you do not fill this, we will use the logo given above.')
) )
primary_color = forms.CharField(
label=_("Primary color"),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_success = forms.CharField(
label=_("Accent color for success"),
help_text=_("We strongly suggest to use a shade of green."),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_danger = forms.CharField(
label=_("Accent color for errors"),
help_text=_("We strongly suggest to use a dark shade of red."),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_background = forms.CharField(
label=_("Page background color"),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield no-contrast'})
)
theme_round_borders = forms.BooleanField(
label=_("Use round edges"),
required=False,
)
primary_font = forms.ChoiceField(
label=_('Font'),
choices=[
('Open Sans', 'Open Sans')
],
widget=FontSelect,
help_text=_('Only respected by modern browsers.')
)
auto_fields = [ auto_fields = [
'imprint_url', 'imprint_url',
@@ -518,18 +481,25 @@ class EventSettingsForm(SettingsForm):
'attendee_company_required', 'attendee_company_required',
'attendee_addresses_asked', 'attendee_addresses_asked',
'attendee_addresses_required', 'attendee_addresses_required',
'attendee_data_explanation_text',
'banner_text', 'banner_text',
'banner_text_bottom', 'banner_text_bottom',
'order_email_asked_twice', 'order_email_asked_twice',
'last_order_modification_date', 'last_order_modification_date',
'checkout_show_copy_answers_button', 'checkout_show_copy_answers_button',
'primary_color',
'theme_color_success',
'theme_color_danger',
'theme_color_background',
'theme_round_borders',
'primary_font',
] ]
def clean(self): def clean(self):
data = super().clean() data = super().clean()
settings_dict = self.event.settings.freeze() settings_dict = self.event.settings.freeze()
settings_dict.update(data) settings_dict.update(data)
validate_settings(self.event, data) validate_event_settings(self.event, data)
return data return data
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -592,6 +562,7 @@ class PaymentSettingsForm(SettingsForm):
'payment_term_last', 'payment_term_last',
'payment_term_expire_automatically', 'payment_term_expire_automatically',
'payment_term_accept_late', 'payment_term_accept_late',
'payment_pending_hidden',
'payment_explanation', 'payment_explanation',
] ]
tax_rate_default = forms.ModelChoiceField( tax_rate_default = forms.ModelChoiceField(
@@ -618,7 +589,7 @@ class PaymentSettingsForm(SettingsForm):
data = super().clean() data = super().clean()
settings_dict = self.obj.settings.freeze() settings_dict = self.obj.settings.freeze()
settings_dict.update(data) settings_dict.update(data)
validate_settings(self.obj, data) validate_event_settings(self.obj, data)
return data return data
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -750,7 +721,7 @@ class InvoiceSettingsForm(SettingsForm):
data = super().clean() data = super().clean()
settings_dict = self.obj.settings.freeze() settings_dict = self.obj.settings.freeze()
settings_dict.update(data) settings_dict.update(data)
validate_settings(self.obj, data) validate_event_settings(self.obj, data)
return data return data
@@ -1121,15 +1092,16 @@ class CommentForm(I18nModelForm):
} }
class CountriesAndEU(Countries): class CountriesAndEU(CachedCountries):
override = { override = {
'ZZ': _('Any country'), 'ZZ': _('Any country'),
'EU': _('European Union') 'EU': _('European Union')
} }
first = ['ZZ', 'EU'] first = ['ZZ', 'EU']
cache_subkey = 'with_any_or_eu'
class TaxRuleLineForm(forms.Form): class TaxRuleLineForm(I18nForm):
country = LazyTypedChoiceField( country = LazyTypedChoiceField(
choices=CountriesAndEU(), choices=CountriesAndEU(),
required=False required=False
@@ -1156,11 +1128,26 @@ class TaxRuleLineForm(forms.Form):
max_digits=10, decimal_places=2, max_digits=10, decimal_places=2,
required=False required=False
) )
invoice_text = I18nFormField(
label=_('Text on invoice'),
required=False,
widget=I18nTextInput
)
class I18nBaseFormSet(I18nFormSetMixin, forms.BaseFormSet):
# compatibility shim for django-i18nfield library
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event', None)
if self.event:
kwargs['locales'] = self.event.settings.get('locales')
super().__init__(*args, **kwargs)
TaxRuleLineFormSet = formset_factory( TaxRuleLineFormSet = formset_factory(
TaxRuleLineForm, TaxRuleLineForm, formset=I18nBaseFormSet,
can_order=False, can_delete=True, extra=0 can_order=True, can_delete=True, extra=0
) )
+3 -3
View File
@@ -564,7 +564,7 @@ class EventOrderExpertFilterForm(EventOrderFilterForm):
if fdata.get('created_from'): if fdata.get('created_from'):
qs = qs.filter(datetime__gte=fdata.get('created_from')) qs = qs.filter(datetime__gte=fdata.get('created_from'))
if fdata.get('created_to'): if fdata.get('created_to'):
qs = qs.filter(datetime__gte=fdata.get('created_to')) qs = qs.filter(datetime__lte=fdata.get('created_to'))
if fdata.get('comment'): if fdata.get('comment'):
qs = qs.filter(comment__icontains=fdata.get('comment')) qs = qs.filter(comment__icontains=fdata.get('comment'))
if fdata.get('sales_channel'): if fdata.get('sales_channel'):
@@ -1113,8 +1113,8 @@ class CheckInFilterForm(FilterForm):
'-item': ('-item__name', '-variation__value', '-order__code'), '-item': ('-item__name', '-variation__value', '-order__code'),
'seat': ('seat__sorting_rank', 'seat__guid'), 'seat': ('seat__sorting_rank', 'seat__guid'),
'-seat': ('-seat__sorting_rank', '-seat__guid'), '-seat': ('-seat__sorting_rank', '-seat__guid'),
'date': ('subevent__date_from', 'order__code'), 'date': ('subevent__date_from', 'subevent__id', 'order__code'),
'-date': ('-subevent__date_from', '-order__code'), '-date': ('-subevent__date_from', 'subevent__id', '-order__code'),
'name': {'_order': F('display_name').asc(nulls_first=True), 'name': {'_order': F('display_name').asc(nulls_first=True),
'display_name': Coalesce('attendee_name_cached', 'addon_to__attendee_name_cached')}, 'display_name': Coalesce('attendee_name_cached', 'addon_to__attendee_name_cached')},
'-name': {'_order': F('display_name').desc(nulls_last=True), '-name': {'_order': F('display_name').desc(nulls_last=True),
@@ -41,6 +41,10 @@ class GlobalSettingsForm(SettingsForm):
required=False, required=False,
label=_("OpenCage API key for geocoding"), label=_("OpenCage API key for geocoding"),
)), )),
('mapquest_apikey', SecretKeySettingsField(
required=False,
label=_("MapQuest API key for geocoding"),
)),
('leaflet_tiles', forms.CharField( ('leaflet_tiles', forms.CharField(
required=False, required=False,
label=_("Leaflet tiles URL pattern"), label=_("Leaflet tiles URL pattern"),
+13
View File
@@ -16,6 +16,7 @@ from i18nfield.forms import I18nFormField, I18nTextarea
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
from pretix.base.forms import I18nFormSet, I18nModelForm from pretix.base.forms import I18nFormSet, I18nModelForm
from pretix.base.forms.widgets import DatePickerWidget
from pretix.base.models import ( from pretix.base.models import (
Item, ItemCategory, ItemVariation, Question, QuestionOption, Quota, Item, ItemCategory, ItemVariation, Question, QuestionOption, Quota,
) )
@@ -111,14 +112,26 @@ class QuestionForm(I18nModelForm):
'dependency_question', 'dependency_question',
'dependency_values', 'dependency_values',
'print_on_invoice', 'print_on_invoice',
'valid_number_min',
'valid_number_max',
'valid_datetime_min',
'valid_datetime_max',
'valid_date_min',
'valid_date_max',
] ]
widgets = { widgets = {
'valid_datetime_min': SplitDateTimePickerWidget(),
'valid_datetime_max': SplitDateTimePickerWidget(),
'valid_date_min': DatePickerWidget(),
'valid_date_max': DatePickerWidget(),
'items': forms.CheckboxSelectMultiple( 'items': forms.CheckboxSelectMultiple(
attrs={'class': 'scrolling-multiple-choice'} attrs={'class': 'scrolling-multiple-choice'}
), ),
'dependency_values': forms.SelectMultiple, 'dependency_values': forms.SelectMultiple,
} }
field_classes = { field_classes = {
'valid_datetime_min': SplitDateTimeField,
'valid_datetime_max': SplitDateTimeField,
'items': SafeModelMultipleChoiceField, 'items': SafeModelMultipleChoiceField,
'dependency_question': SafeModelChoiceField, 'dependency_question': SafeModelChoiceField,
} }
+19 -126
View File
@@ -4,24 +4,19 @@ from urllib.parse import urlparse
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.db.models import Q from django.db.models import Q
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _, pgettext_lazy from django.utils.translation import gettext_lazy as _, pgettext_lazy
from django_scopes.forms import SafeModelMultipleChoiceField from django_scopes.forms import SafeModelMultipleChoiceField
from i18nfield.forms import I18nFormField, I18nTextarea
from pretix.api.models import WebHook from pretix.api.models import WebHook
from pretix.api.webhooks import get_all_webhook_events from pretix.api.webhooks import get_all_webhook_events
from pretix.base.forms import I18nModelForm, SettingsForm from pretix.base.forms import I18nModelForm, SettingsForm
from pretix.base.forms.widgets import SplitDateTimePickerWidget from pretix.base.forms.widgets import SplitDateTimePickerWidget
from pretix.base.models import Device, Gate, GiftCard, Organizer, Team from pretix.base.models import Device, Gate, GiftCard, Organizer, Team
from pretix.control.forms import ( from pretix.control.forms import ExtFileField, SplitDateTimeField
ExtFileField, FontSelect, MultipleLanguagesWidget, SplitDateTimeField,
)
from pretix.control.forms.event import SafeEventMultipleChoiceField from pretix.control.forms.event import SafeEventMultipleChoiceField
from pretix.multidomain.models import KnownDomain from pretix.multidomain.models import KnownDomain
from pretix.presale.style import get_fonts
class OrganizerForm(I18nModelForm): class OrganizerForm(I18nModelForm):
@@ -218,72 +213,26 @@ class DeviceForm(forms.ModelForm):
class OrganizerSettingsForm(SettingsForm): class OrganizerSettingsForm(SettingsForm):
auto_fields = [
'organizer_info_text',
'event_list_type',
'event_list_availability',
'organizer_homepage_text',
'organizer_link_back',
'organizer_logo_image_large',
'giftcard_length',
'giftcard_expiry_years',
'locales',
'event_team_provisioning',
'primary_color',
'theme_color_success',
'theme_color_danger',
'theme_color_background',
'theme_round_borders',
'primary_font'
organizer_info_text = I18nFormField( ]
label=_('Info text'),
required=False,
widget=I18nTextarea,
help_text=_('Not displayed anywhere by default, but if you want to, you can use this e.g. in ticket templates.')
)
event_team_provisioning = forms.BooleanField(
label=_('Allow creating a new team during event creation'),
help_text=_('Users that do not have access to all events under this organizer, must select one of their teams '
'to have access to the created event. This setting allows users to create an event-specified team'
' on-the-fly, even when they do not have \"Can change teams and permissions\" permission.'),
required=False,
)
primary_color = forms.CharField(
label=_("Primary color"),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_success = forms.CharField(
label=_("Accent color for success"),
help_text=_("We strongly suggest to use a shade of green."),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_danger = forms.CharField(
label=_("Accent color for errors"),
help_text=_("We strongly suggest to use a shade of red."),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield'})
)
theme_color_background = forms.CharField(
label=_("Page background color"),
required=False,
validators=[
RegexValidator(regex='^#[0-9a-fA-F]{6}$',
message=_('Please enter the hexadecimal code of a color, e.g. #990000.')),
],
widget=forms.TextInput(attrs={'class': 'colorpickerfield no-contrast'})
)
theme_round_borders = forms.BooleanField(
label=_("Use round edges"),
required=False,
)
organizer_homepage_text = I18nFormField(
label=_('Homepage text'),
required=False,
widget=I18nTextarea,
help_text=_('This will be displayed on the organizer homepage.')
)
organizer_logo_image = ExtFileField( organizer_logo_image = ExtFileField(
label=_('Header image'), label=_('Header image'),
ext_whitelist=(".png", ".jpg", ".gif", ".jpeg"), ext_whitelist=(".png", ".jpg", ".gif", ".jpeg"),
@@ -294,44 +243,6 @@ class OrganizerSettingsForm(SettingsForm):
'can increase the size with the setting below. We recommend not using small details on the picture ' 'can increase the size with the setting below. We recommend not using small details on the picture '
'as it will be resized on smaller screens.') 'as it will be resized on smaller screens.')
) )
organizer_logo_image_large = forms.BooleanField(
label=_('Use header image in its full size'),
help_text=_('We recommend to upload a picture at least 1170 pixels wide.'),
required=False,
)
event_list_type = forms.ChoiceField(
label=_('Default overview style'),
choices=(
('list', _('List')),
('week', _('Week calendar')),
('calendar', _('Month calendar')),
)
)
event_list_availability = forms.BooleanField(
label=_('Show availability in event overviews'),
help_text=_('If checked, the list of events will show if events are sold out. This might '
'make for longer page loading times if you have lots of events and the shown status might be out '
'of date for up to two minutes.'),
required=False
)
organizer_link_back = forms.BooleanField(
label=_('Link back to organizer overview on all event pages'),
required=False
)
locales = forms.MultipleChoiceField(
choices=settings.LANGUAGES,
label=_("Use languages"),
widget=MultipleLanguagesWidget,
help_text=_('Choose all languages that your organizer homepage should be available in.')
)
primary_font = forms.ChoiceField(
label=_('Font'),
choices=[
('Open Sans', 'Open Sans')
],
widget=FontSelect,
help_text=_('Only respected by modern browsers.')
)
favicon = ExtFileField( favicon = ExtFileField(
label=_('Favicon'), label=_('Favicon'),
ext_whitelist=(".ico", ".png", ".jpg", ".gif", ".jpeg"), ext_whitelist=(".ico", ".png", ".jpg", ".gif", ".jpeg"),
@@ -340,24 +251,6 @@ class OrganizerSettingsForm(SettingsForm):
help_text=_('If you provide a favicon, we will show it instead of the default pretix icon. ' help_text=_('If you provide a favicon, we will show it instead of the default pretix icon. '
'We recommend a size of at least 200x200px to accommodate most devices.') 'We recommend a size of at least 200x200px to accommodate most devices.')
) )
giftcard_length = forms.IntegerField(
label=_('Length of gift card codes'),
help_text=_('The system generates by default {}-character long gift card codes. However, if a different length '
'is required, it can be set here.'.format(settings.ENTROPY['giftcard_secret'])),
required=False
)
giftcard_expiry_years = forms.IntegerField(
label=_('Validity of gift card codes in years'),
help_text=_('If you set a number here, gift cards will by default expire at the end of the year after this '
'many years. If you keep it empty, gift cards do not have an explicit expiry date.'),
required=False
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['primary_font'].choices += [
(a, {"title": a, "data": v}) for a, v in get_fonts().items()
]
class WebHookForm(forms.ModelForm): class WebHookForm(forms.ModelForm):
+1
View File
@@ -305,6 +305,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
'pretix.event.order.email.attachments.skipped': _('The email has been sent without attachments since they ' 'pretix.event.order.email.attachments.skipped': _('The email has been sent without attachments since they '
'would have been too large to be likely to arrive.'), 'would have been too large to be likely to arrive.'),
'pretix.event.order.email.custom_sent': _('A custom email has been sent.'), 'pretix.event.order.email.custom_sent': _('A custom email has been sent.'),
'pretix.event.order.position.email.custom_sent': _('A custom email has been sent to an attendee.'),
'pretix.event.order.email.download_reminder_sent': _('An email has been sent with a reminder that the ticket ' 'pretix.event.order.email.download_reminder_sent': _('An email has been sent with a reminder that the ticket '
'is available for download.'), 'is available for download.'),
'pretix.event.order.email.expire_warning_sent': _('An email has been sent with a warning that the order is about ' 'pretix.event.order.email.expire_warning_sent': _('An email has been sent with a warning that the order is about '
@@ -31,6 +31,7 @@
{% bootstrap_field form.invoice_address_beneficiary layout="control" %} {% bootstrap_field form.invoice_address_beneficiary layout="control" %}
{% bootstrap_field form.invoice_address_not_asked_free layout="control" %} {% bootstrap_field form.invoice_address_not_asked_free layout="control" %}
{% bootstrap_field form.invoice_address_custom_field layout="control" %} {% bootstrap_field form.invoice_address_custom_field layout="control" %}
{% bootstrap_field form.invoice_address_explanation_text layout="control" %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Issuer details" %}</legend> <legend>{% trans "Issuer details" %}</legend>
@@ -51,7 +52,6 @@
{% bootstrap_field form.invoice_additional_text layout="control" %} {% bootstrap_field form.invoice_additional_text layout="control" %}
{% bootstrap_field form.invoice_footer_text layout="control" %} {% bootstrap_field form.invoice_footer_text layout="control" %}
{% bootstrap_field form.invoice_logo_image layout="control" %} {% bootstrap_field form.invoice_logo_image layout="control" %}
{% bootstrap_field form.invoice_address_explanation_text layout="control" %}
{% bootstrap_field form.invoice_eu_currencies layout="control" %} {% bootstrap_field form.invoice_eu_currencies layout="control" %}
</fieldset> </fieldset>
</div> </div>
@@ -66,6 +66,7 @@
{% bootstrap_field form.payment_term_last layout="control" %} {% bootstrap_field form.payment_term_last layout="control" %}
{% bootstrap_field form.payment_term_expire_automatically layout="control" %} {% bootstrap_field form.payment_term_expire_automatically layout="control" %}
{% bootstrap_field form.payment_term_accept_late layout="control" %} {% bootstrap_field form.payment_term_accept_late layout="control" %}
{% bootstrap_field form.payment_pending_hidden layout="control" %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Advanced" %}</legend> <legend>{% trans "Advanced" %}</legend>
@@ -98,6 +98,7 @@
{% bootstrap_field sform.attendee_addresses_asked layout="control" %} {% bootstrap_field sform.attendee_addresses_asked layout="control" %}
{% bootstrap_field sform.attendee_addresses_required layout="control" %} {% bootstrap_field sform.attendee_addresses_required layout="control" %}
{% bootstrap_field sform.checkout_show_copy_answers_button layout="control" %} {% bootstrap_field sform.checkout_show_copy_answers_button layout="control" %}
{% bootstrap_field sform.attendee_data_explanation_text layout="control" %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Texts" %}</legend> <legend>{% trans "Texts" %}</legend>
@@ -219,6 +220,7 @@
{% if sform.event_list_type %} {% if sform.event_list_type %}
{% bootstrap_field sform.event_list_type layout="control" %} {% bootstrap_field sform.event_list_type layout="control" %}
{% endif %} {% endif %}
{% bootstrap_field form.sales_channels layout="control" %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Cart" %}</legend> <legend>{% trans "Cart" %}</legend>
@@ -18,103 +18,135 @@
<form action="" method="post" class="form-horizontal"> <form action="" method="post" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
<div class="tabbed-form"> <div class="row">
<fieldset> <div class="col-xs-12 col-lg-10">
<legend>{% trans "General" %}</legend> <div class="tabbed-form">
{% bootstrap_field form.name layout="control" %} <fieldset>
{% bootstrap_field form.rate addon_after="%" layout="control" %} <legend>{% trans "General" %}</legend>
{% bootstrap_field form.price_includes_tax layout="control" %} {% bootstrap_field form.name layout="control" %}
</fieldset> {% bootstrap_field form.rate addon_after="%" layout="control" %}
<fieldset> {% bootstrap_field form.price_includes_tax layout="control" %}
<legend>{% trans "Advanced" %}</legend> </fieldset>
<div class="alert alert-legal"> <fieldset>
{% blocktrans trimmed with docs="https://docs.pretix.eu/en/latest/user/events/taxes.html" %} <legend>{% trans "Advanced" %}</legend>
These settings are intended for advanced users. See the <div class="alert alert-legal">
<a href="{{ docs }}">documentation</a> {% blocktrans trimmed with docs="https://docs.pretix.eu/en/latest/user/events/taxes.html" %}
for more information. Note that we are not responsible for the correct handling These settings are intended for advanced users. See the
of taxes in your ticket shop. If in doubt, please contact a lawyer or tax consultant. <a href="{{ docs }}">documentation</a>
{% endblocktrans %} for more information. Note that we are not responsible for the correct handling
</div> of taxes in your ticket shop. If in doubt, please contact a lawyer or tax consultant.
{% bootstrap_field form.eu_reverse_charge layout="control" %} {% endblocktrans %}
{% bootstrap_field form.home_country layout="control" %} </div>
<h3>{% trans "Custom taxation rules" %}</h3> {% bootstrap_field form.eu_reverse_charge layout="control" %}
<div class="alert alert-warning"> {% bootstrap_field form.home_country layout="control" %}
{% blocktrans trimmed %} <h3>{% trans "Custom taxation rules" %}</h3>
These settings are intended for professional users with very specific taxation situations. <div class="alert alert-warning">
If you create any rule here, the reverse charge settings above will be ignored. The rules will be {% blocktrans trimmed %}
checked in order and once the first rule matches the order, it will be used and all further rules will These settings are intended for professional users with very specific taxation situations.
be ignored. If no rule matches, tax will be charged. If you create any rule here, the reverse charge settings above will be ignored. The rules will be
{% endblocktrans %} checked in order and once the first rule matches the order, it will be used and all further rules will
{% trans "All of these rules will only apply if an invoice address is set." %} be ignored. If no rule matches, tax will be charged.
</div> {% endblocktrans %}
{% trans "All of these rules will only apply if an invoice address is set." %}
</div>
<div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}"> <div class="formset tax-rules-formset" data-formset data-formset-prefix="{{ formset.prefix }}">
{{ formset.management_form }} {{ formset.management_form }}
{% bootstrap_formset_errors formset %} {% bootstrap_formset_errors formset %}
<div data-formset-body> <script type="form-template" data-formset-empty-form>
{% for form in formset %} {% escapescript %}
{% bootstrap_form_errors form %} <div class="row tax-rule-line" data-formset-form>
<div class="row" data-formset-form> <div class="sr-only">
<div class="sr-only"> {{ formset.empty_form.id }}
{{ form.id }} {% bootstrap_field formset.empty_form.DELETE form_group_class="" layout="inline" %}
{% bootstrap_field form.DELETE form_group_class="" layout="inline" %} {% bootstrap_field formset.empty_form.ORDER form_group_class="" layout="inline" %}
</div> </div>
<div class="col-sm-3"> <div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field form.country layout='inline' form_group_class="" %} {% bootstrap_field formset.empty_form.country layout='inline' form_group_class="" %}
</div> </div>
<div class="col-sm-3"> <div class="col-sm-6 col-md-3 col-lg-4">
{% bootstrap_field form.address_type layout='inline' form_group_class="" %} {% bootstrap_field formset.empty_form.address_type layout='inline' form_group_class="" %}
</div> </div>
<div class="col-sm-3"> <div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field form.action layout='inline' form_group_class="" %} {% bootstrap_field formset.empty_form.action layout='inline' form_group_class="" %}
</div> </div>
<div class="col-sm-2"> <div class="col-sm-6 col-md-3 col-lg-2 text-right flip">
{% bootstrap_field form.rate layout='inline' form_group_class="" %} <button type="button" class="btn btn-default" data-formset-move-up-button>
</div> <i class="fa fa-arrow-up"></i></button>
<div class="col-sm-1 text-right flip"> <button type="button" class="btn btn-default" data-formset-move-down-button>
<button type="button" class="btn btn-block btn-danger" data-formset-delete-button> <i class="fa fa-arrow-down"></i></button>
<i class="fa fa-trash"></i></button> <button type="button" class="btn btn-danger" data-formset-delete-button>
<i class="fa fa-trash"></i></button>
</div>
<div class="col-sm-6 col-md-3 col-lg-4 col-md-offset-3">
{% bootstrap_field formset.empty_form.invoice_text layout='inline' form_group_class="" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field formset.empty_form.rate layout='inline' form_group_class="" %}
</div>
</div>
{% endescapescript %}
</script>
<div data-formset-body class="tax-rule-lines">
{% for form in formset %}
{% bootstrap_form_errors form %}
<div class="row tax-rule-line" data-formset-form>
<div class="sr-only">
{{ form.id }}
{% bootstrap_field form.DELETE form_group_class="" layout="inline" %}
{% bootstrap_field form.ORDER form_group_class="" layout="inline" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field form.country layout='inline' form_group_class="" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-4">
{% bootstrap_field form.address_type layout='inline' form_group_class="" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field form.action layout='inline' form_group_class="" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-2 text-right flip">
<button type="button" class="btn btn-default" data-formset-move-up-button>
<i class="fa fa-arrow-up"></i></button>
<button type="button" class="btn btn-default" data-formset-move-down-button>
<i class="fa fa-arrow-down"></i></button>
<button type="button" class="btn btn-danger" data-formset-delete-button>
<i class="fa fa-trash"></i></button>
</div>
<div class="col-sm-6 col-md-3 col-lg-4 col-md-offset-3">
{% bootstrap_field form.invoice_text layout='inline' form_group_class="" %}
</div>
<div class="col-sm-6 col-md-3 col-lg-3">
{% bootstrap_field form.rate layout='inline' form_group_class="" %}
</div>
</div>
{% endfor %}
</div>
<div class="row tax-rule-line" data-formset-form>
<div class="col-sm-12">
<button type="button" class="btn btn-default" data-formset-add>
<i class="fa fa-plus"></i> {% trans "Add a new rule" %}</button>
</div> </div>
</div> </div>
{% endfor %} </div>
</div> </fieldset>
<script type="form-template" data-formset-empty-form>
{% escapescript %}
<div class="row" data-formset-form>
<div class="sr-only">
{{ form.id }}
{% bootstrap_field formset.empty_form.DELETE form_group_class="" layout="inline" %}
</div>
<div class="col-sm-3">
{% bootstrap_field formset.empty_form.country layout='inline' form_group_class="" %}
</div>
<div class="col-sm-3">
{% bootstrap_field formset.empty_form.address_type layout='inline' form_group_class="" %}
</div>
<div class="col-sm-3">
{% bootstrap_field formset.empty_form.action layout='inline' form_group_class="" %}
</div>
<div class="col-sm-2">
{% bootstrap_field formset.empty_form.rate layout='inline' form_group_class="" %}
</div>
<div class="col-sm-1 text-right flip">
<button type="button" class="btn btn-block btn-danger" data-formset-delete-button>
<i class="fa fa-trash"></i></button>
</div>
</div>
{% endescapescript %}
</script>
<p>
<button type="button" class="btn btn-default" data-formset-add>
<i class="fa fa-plus"></i> {% trans "Add a new rule" %}</button>
</p>
</div> </div>
</fieldset> <div class="form-group submit-group">
</div> <button type="submit" class="btn btn-primary btn-save">
<div class="form-group submit-group"> {% trans "Save" %}
<button type="submit" class="btn btn-primary btn-save"> </button>
{% trans "Save" %} </div>
</button> </div>
<div class="col-xs-12 col-lg-2">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% trans "Change history" %}
</h3>
</div>
{% include "pretixcontrol/includes/logs.html" with obj=rule %}
</div>
</div>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}
@@ -27,7 +27,7 @@
</div> </div>
<div class="big-radio radio"> <div class="big-radio radio">
<label> <label>
<input type="radio" value="on" name="{{ form.has_subevents.html_name }}" {% if not form.has_subevents.value %}checked{% endif %}> <input type="radio" value="on" name="{{ form.has_subevents.html_name }}" {% if form.has_subevents.avalue %}checked{% endif %}>
<span class="fa fa-calendar"></span> <span class="fa fa-calendar"></span>
<strong>{% trans "Event series or time slot booking" %}</strong> <strong>{% trans "Event series or time slot booking" %}</strong>
<div class="help-block"> <div class="help-block">
@@ -6,7 +6,7 @@
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data"> <form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form_errors form %} {% bootstrap_form_errors form %}
{% bootstrap_form form layout='horizontal' %} {% bootstrap_form form layout='control' %}
<div class="form-group submit-group"> <div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save"> <button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %} {% trans "Save" %}
@@ -32,6 +32,18 @@
accepted. If you want to allow both options, do not make this field required. accepted. If you want to allow both options, do not make this field required.
{% endblocktrans %} {% endblocktrans %}
</div> </div>
<div id="valid-number">
{% bootstrap_field form.valid_number_min layout="control" %}
{% bootstrap_field form.valid_number_max layout="control" %}
</div>
<div id="valid-date">
{% bootstrap_field form.valid_date_min layout="control" %}
{% bootstrap_field form.valid_date_max layout="control" %}
</div>
<div id="valid-datetime">
{% bootstrap_field form.valid_datetime_min layout="control" %}
{% bootstrap_field form.valid_datetime_max layout="control" %}
</div>
<div id="answer-options"> <div id="answer-options">
<h3>{% trans "Answer options" %}</h3> <h3>{% trans "Answer options" %}</h3>
<noscript> <noscript>
+9 -11
View File
@@ -10,7 +10,6 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.files import File from django.core.files import File
from django.core.serializers.json import DjangoJSONEncoder
from django.db import transaction from django.db import transaction
from django.db.models import ProtectedError from django.db.models import ProtectedError
from django.forms import inlineformset_factory from django.forms import inlineformset_factory
@@ -28,6 +27,7 @@ from django.views.generic import DeleteView, FormView, ListView
from django.views.generic.base import TemplateView, View from django.views.generic.base import TemplateView, View
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from i18nfield.utils import I18nJSONEncoder
from pytz import timezone from pytz import timezone
from pretix.base.channels import get_all_sales_channels from pretix.base.channels import get_all_sales_channels
@@ -56,7 +56,7 @@ from pretix.plugins.stripe.payment import StripeSettingsHolder
from pretix.presale.style import regenerate_css from pretix.presale.style import regenerate_css
from ...base.models.items import ItemMetaProperty from ...base.models.items import ItemMetaProperty
from ...base.settings import LazyI18nStringList from ...base.settings import SETTINGS_AFFECTING_CSS, LazyI18nStringList
from ..logdisplay import OVERVIEW_BANLIST from ..logdisplay import OVERVIEW_BANLIST
from . import CreateView, PaginationMixin, UpdateView from . import CreateView, PaginationMixin, UpdateView
@@ -161,11 +161,7 @@ class EventUpdate(DecoupleMixin, EventSettingsViewMixin, EventPermissionRequired
if self.confirm_texts_formset.has_changed(): if self.confirm_texts_formset.has_changed():
data.update(confirm_texts=self.confirm_texts_formset.cleaned_data) data.update(confirm_texts=self.confirm_texts_formset.cleaned_data)
self.request.event.log_action('pretix.event.settings', user=self.request.user, data=data) self.request.event.log_action('pretix.event.settings', user=self.request.user, data=data)
display_properties = ( if any(p in self.sform.changed_data for p in SETTINGS_AFFECTING_CSS):
'primary_color', 'theme_color_success', 'theme_color_danger', 'primary_font',
'theme_color_background', 'theme_round_borders',
)
if any(p in self.sform.changed_data for p in display_properties):
change_css = True change_css = True
if form.has_changed(): if form.has_changed():
self.request.event.log_action('pretix.event.changed', user=self.request.user, data={ self.request.event.log_action('pretix.event.changed', user=self.request.user, data={
@@ -1097,6 +1093,7 @@ class TaxCreate(EventSettingsViewMixin, EventPermissionRequiredMixin, CreateView
def formset(self): def formset(self):
return TaxRuleLineFormSet( return TaxRuleLineFormSet(
data=self.request.POST if self.request.method == "POST" else None, data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
) )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@@ -1108,8 +1105,8 @@ class TaxCreate(EventSettingsViewMixin, EventPermissionRequiredMixin, CreateView
def form_valid(self, form): def form_valid(self, form):
form.instance.event = self.request.event form.instance.event = self.request.event
form.instance.custom_rules = json.dumps([ form.instance.custom_rules = json.dumps([
f.cleaned_data for f in self.formset if f not in self.formset.deleted_forms f.cleaned_data for f in self.formset.ordered_forms if f not in self.formset.deleted_forms
], cls=DjangoJSONEncoder) ], cls=I18nJSONEncoder)
messages.success(self.request, _('The new tax rule has been created.')) messages.success(self.request, _('The new tax rule has been created.'))
ret = super().form_valid(form) ret = super().form_valid(form)
form.instance.log_action('pretix.event.taxrule.added', user=self.request.user, data=dict(form.cleaned_data)) form.instance.log_action('pretix.event.taxrule.added', user=self.request.user, data=dict(form.cleaned_data))
@@ -1147,6 +1144,7 @@ class TaxUpdate(EventSettingsViewMixin, EventPermissionRequiredMixin, UpdateView
def formset(self): def formset(self):
return TaxRuleLineFormSet( return TaxRuleLineFormSet(
data=self.request.POST if self.request.method == "POST" else None, data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
initial=json.loads(self.object.custom_rules) if self.object.custom_rules else [] initial=json.loads(self.object.custom_rules) if self.object.custom_rules else []
) )
@@ -1159,8 +1157,8 @@ class TaxUpdate(EventSettingsViewMixin, EventPermissionRequiredMixin, UpdateView
def form_valid(self, form): def form_valid(self, form):
messages.success(self.request, _('Your changes have been saved.')) messages.success(self.request, _('Your changes have been saved.'))
form.instance.custom_rules = json.dumps([ form.instance.custom_rules = json.dumps([
f.cleaned_data for f in self.formset if f not in self.formset.deleted_forms f.cleaned_data for f in self.formset.ordered_forms if f not in self.formset.deleted_forms
], cls=DjangoJSONEncoder) ], cls=I18nJSONEncoder)
if form.has_changed(): if form.has_changed():
self.object.log_action( self.object.log_action(
'pretix.event.taxrule.changed', user=self.request.user, data={ 'pretix.event.taxrule.changed', user=self.request.user, data={
+48 -13
View File
@@ -14,14 +14,7 @@ logger = logging.getLogger(__name__)
class GeoCodeView(LoginRequiredMixin, View): class GeoCodeView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
gs = GlobalSettingsObject() q = self.request.GET.get('q')
if not gs.settings.opencagedata_apikey:
return JsonResponse({
'success': False,
'results': []
}, status=200)
q = request.GET.get('q')
cd = cache.get('geocode:{}'.format(q)) cd = cache.get('geocode:{}'.format(q))
if cd: if cd:
return JsonResponse({ return JsonResponse({
@@ -29,6 +22,26 @@ class GeoCodeView(LoginRequiredMixin, View):
'results': cd 'results': cd
}, status=200) }, status=200)
gs = GlobalSettingsObject()
if gs.settings.opencagedata_apikey:
res = self._use_opencage(q)
if gs.settings.mapquest_apikey:
res = self._use_mapquest(q)
else:
return JsonResponse({
'success': False,
'results': []
}, status=200)
cache.set('geocode:{}'.format(q), res, timeout=3600 * 6)
return JsonResponse({
'success': True,
'results': res
}, status=200)
def _use_opencage(self, q):
gs = GlobalSettingsObject()
try: try:
r = requests.get( r = requests.get(
'https://api.opencagedata.com/geocode/v1/json?q={}&key={}'.format( 'https://api.opencagedata.com/geocode/v1/json?q={}&key={}'.format(
@@ -51,9 +64,31 @@ class GeoCodeView(LoginRequiredMixin, View):
'lon': r['geometry']['lng'], 'lon': r['geometry']['lng'],
} for r in d['results'] } for r in d['results']
] ]
cache.set('geocode:{}'.format(q), res, timeout=3600 * 6) return res
return JsonResponse({ def _use_mapquest(self, q):
'success': True, gs = GlobalSettingsObject()
'results': res
}, status=200) try:
r = requests.get(
'http://www.mapquestapi.com/geocoding/v1/address?location={}&key={}'.format(
quote(q), gs.settings.mapquest_apikey
)
)
r.raise_for_status()
except IOError:
logger.exception("Geocoding failed")
return JsonResponse({
'success': False,
'results': []
}, status=200)
else:
d = r.json()
res = [
{
'formatted': q,
'lat': r['locations'][0]['latLng']['lat'],
'lon': r['locations'][0]['latLng']['lng'],
} for r in d['results']
]
return res
+2 -1
View File
@@ -1885,7 +1885,8 @@ class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView):
) )
qs = order.all_logentries() qs = order.all_logentries()
qs = qs.filter( qs = qs.filter(
action_type__contains="order.email" Q(action_type__contains="order.email") |
Q(action_type__contains="order.position.email")
) )
return qs return qs
+2 -5
View File
@@ -39,6 +39,7 @@ from pretix.base.models.organizer import TeamAPIToken
from pretix.base.payment import PaymentException from pretix.base.payment import PaymentException
from pretix.base.services.export import multiexport from pretix.base.services.export import multiexport
from pretix.base.services.mail import SendMailException, mail from pretix.base.services.mail import SendMailException, mail
from pretix.base.settings import SETTINGS_AFFECTING_CSS
from pretix.base.signals import register_multievent_data_exporters from pretix.base.signals import register_multievent_data_exporters
from pretix.base.views.tasks import AsyncAction from pretix.base.views.tasks import AsyncAction
from pretix.control.forms.filter import ( from pretix.control.forms.filter import (
@@ -287,11 +288,7 @@ class OrganizerUpdate(OrganizerPermissionRequiredMixin, UpdateView):
for k in self.sform.changed_data for k in self.sform.changed_data
} }
) )
display_properties = ( if any(p in self.sform.changed_data for p in SETTINGS_AFFECTING_CSS):
'primary_color', 'theme_color_success', 'theme_color_danger', 'primary_font',
'theme_color_background', 'theme_round_borders'
)
if any(p in self.sform.changed_data for p in display_properties):
change_css = True change_css = True
if form.has_changed(): if form.has_changed():
self.request.organizer.log_action( self.request.organizer.log_action(
+3
View File
@@ -6,6 +6,7 @@ from django_countries.fields import CountryField
class CachedCountries(Countries): class CachedCountries(Countries):
_cached_lists = {} _cached_lists = {}
cache_subkey = None
def __iter__(self): def __iter__(self):
""" """
@@ -14,6 +15,8 @@ class CachedCountries(Countries):
slow. slow.
""" """
cache_key = "countries:all:{}".format(get_language()) cache_key = "countries:all:{}".format(get_language())
if self.cache_subkey:
cache_key += ":" + self.cache_subkey
if cache_key in self._cached_lists: if cache_key in self._cached_lists:
yield from self._cached_lists[cache_key] yield from self._cached_lists[cache_key]
return return
+4 -1
View File
@@ -3,7 +3,7 @@ from io import BytesIO
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from PIL import Image from PIL import Image, ImageOps
from PIL.Image import LANCZOS from PIL.Image import LANCZOS
from pretix.helpers.models import Thumbnail from pretix.helpers.models import Thumbnail
@@ -56,6 +56,9 @@ def create_thumbnail(sourcename, size):
except: except:
raise ThumbnailError('Could not load image') raise ThumbnailError('Could not load image')
# before we calc thumbnail, we need to check and apply EXIF-orientation
image = ImageOps.exif_transpose(image)
scale, crop = get_sizes(size, image.size) scale, crop = get_sizes(size, image.size)
image = image.resize(scale, resample=LANCZOS) image = image.resize(scale, resample=LANCZOS)
if crop: if crop:
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-07-30 19:00+0000\n" "PO-Revision-Date: 2020-07-30 19:00+0000\n"
"Last-Translator: Abdullah <abdullah.gumaijan@gmail.com>\n" "Last-Translator: Abdullah <abdullah.gumaijan@gmail.com>\n"
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -280,37 +280,37 @@ msgstr "توليد رسائل ..."
msgid "Unknown error." msgid "Unknown error."
msgstr "خطأ غير معروف." msgstr "خطأ غير معروف."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "اللون لديه التباين الكبير وهو من السهل جدا أن تقرأ!" msgstr "اللون لديه التباين الكبير وهو من السهل جدا أن تقرأ!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "اللون لديه النقيض لائق وهو على الارجح جيدة بما فيه الكفاية لقراءة!" msgstr "اللون لديه النقيض لائق وهو على الارجح جيدة بما فيه الكفاية لقراءة!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "اللون لديه النقيض سيئة للنص على خلفية بيضاء، يرجى اختيار الظل أغمق." msgstr "اللون لديه النقيض سيئة للنص على خلفية بيضاء، يرجى اختيار الظل أغمق."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "الكل" msgstr "الكل"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "لا شيء" msgstr "لا شيء"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "استخدام اسم مختلف داخليا" msgstr "استخدام اسم مختلف داخليا"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "انقر لقريب" msgstr "انقر لقريب"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -326,15 +326,15 @@ msgstr "الآخرين"
msgid "Count" msgid "Count"
msgstr "عد" msgstr "عد"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "نعم" msgstr "نعم"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "لا" msgstr "لا"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -362,34 +362,34 @@ msgstr[3] "سيتم إلغاء الحجز تلقائيا بعد {num} دقيقة
msgstr[4] "سيتم إلغاء الحجز تلقائيا بعد {num} دقيقة." msgstr[4] "سيتم إلغاء الحجز تلقائيا بعد {num} دقيقة."
msgstr[5] "سيتم إلغاء الحجز تلقائيا بعد {num} دقيقة." msgstr[5] "سيتم إلغاء الحجز تلقائيا بعد {num} دقيقة."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "الرجاء إدخال كمية التذاكر لأحد أنواع التذاكر." msgstr "الرجاء إدخال كمية التذاكر لأحد أنواع التذاكر."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "من٪ (العملة) ق٪ (سعر) ق" msgstr "من٪ (العملة) ق٪ (سعر) ق"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "من٪ (العملة) ق٪ (سعر) ق" msgstr "من٪ (العملة) ق٪ (سعر) ق"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -643,6 +643,33 @@ msgstr "شهر نوفمبر"
msgid "December" msgid "December"
msgstr "ديسمبر" msgstr "ديسمبر"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "مايو"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "لا شيء"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "الشهر القادم"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "الشهر القادم"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "الآخرين"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -257,37 +257,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -303,15 +303,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -331,28 +331,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -257,37 +257,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -303,15 +303,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -333,28 +333,28 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] "" msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+52 -19
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-09-15 02:00+0000\n" "PO-Revision-Date: 2020-09-15 02:00+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n" "Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -284,37 +284,37 @@ msgstr "Opretter beskeder …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Ukendt fejl." msgstr "Ukendt fejl."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Ingen" msgstr "Ingen"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Klik for at lukke" msgstr "Klik for at lukke"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Du har ændringer, der ikke er gemt!" msgstr "Du har ændringer, der ikke er gemt!"
@@ -332,17 +332,17 @@ msgstr "Andre"
msgid "Count" msgid "Count"
msgstr "Antal" msgstr "Antal"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
#, fuzzy #, fuzzy
#| msgid "None" #| msgid "None"
msgid "No" msgid "No"
msgstr "Ingen" msgstr "Ingen"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(en dato mere)" msgstr[0] "(en dato mere)"
@@ -362,34 +362,34 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Varerne i din kurv er reserveret for dig i et minut." msgstr[0] "Varerne i din kurv er reserveret for dig i et minut."
msgstr[1] "Varerne i din kurv er reserveret for dig i {num} minutter." msgstr[1] "Varerne i din kurv er reserveret for dig i {num} minutter."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "fra %(currency)s %(price)s" msgstr "fra %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "fra %(currency)s %(price)s" msgstr "fra %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Tidszone:" msgstr "Tidszone:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "Din lokaltid:" msgstr "Din lokaltid:"
@@ -643,6 +643,39 @@ msgstr "November"
msgid "December" msgid "December"
msgstr "December" msgstr "December"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Maj"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Næste uge"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Ingen"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Næste måned"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Næste måned"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Andre"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+57 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-08-25 02:00+0000\n" "PO-Revision-Date: 2020-08-25 02:00+0000\n"
"Last-Translator: Dennis Lichtenthäler <lichtenthaeler@rami.io>\n" "Last-Translator: Dennis Lichtenthäler <lichtenthaeler@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -276,16 +276,16 @@ msgstr "Generiere Nachrichten…"
msgid "Unknown error." msgid "Unknown error."
msgstr "Unbekannter Fehler." msgstr "Unbekannter Fehler."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Diese Farbe hat einen sehr guten Kontrast und ist sehr gut zu lesen!" msgstr "Diese Farbe hat einen sehr guten Kontrast und ist sehr gut zu lesen!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Diese Farbe hat einen ausreichenden Kontrast und wahrscheinlich gut zu lesen!" "Diese Farbe hat einen ausreichenden Kontrast und wahrscheinlich gut zu lesen!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -293,23 +293,23 @@ msgstr ""
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen " "Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
"Hintergrund. Bitte wählen Sie eine dunklere Farbe." "Hintergrund. Bitte wählen Sie eine dunklere Farbe."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Keine" msgstr "Keine"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Intern einen anderen Namen verwenden" msgstr "Intern einen anderen Namen verwenden"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Klicken zum Schließen" msgstr "Klicken zum Schließen"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Sie haben ungespeicherte Änderungen!" msgstr "Sie haben ungespeicherte Änderungen!"
@@ -325,15 +325,15 @@ msgstr "Sonstige"
msgid "Count" msgid "Count"
msgstr "Anzahl" msgstr "Anzahl"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(ein weiterer Termin)" msgstr[0] "(ein weiterer Termin)"
@@ -355,28 +355,28 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"Die Produkte in Ihrem Warenkorb sind noch {num} Minuten für Sie reserviert." "Die Produkte in Ihrem Warenkorb sind noch {num} Minuten für Sie reserviert."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein." msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "Der Veranstalter behält %(currency)s %(amount)s ein" msgstr "Der Veranstalter behält %(currency)s %(amount)s ein"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "Sie erhalten %(currency)s %(amount)s zurück" msgstr "Sie erhalten %(currency)s %(amount)s zurück"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf." msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Zeitzone:" msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "Deine lokale Zeit:" msgstr "Deine lokale Zeit:"
@@ -627,6 +627,44 @@ msgstr "November"
msgid "December" msgid "December"
msgstr "Dezember" msgstr "Dezember"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mai"
#, fuzzy
#~| msgid "Nein"
#~ msgid "in"
#~ msgstr "Nein"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Nächste Woche"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Keine"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Nächster Monat"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Nächster Monat"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Sonstige"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
@@ -638,9 +676,6 @@ msgstr "Dezember"
#~ msgid "Ja" #~ msgid "Ja"
#~ msgstr "Ja" #~ msgstr "Ja"
#~ msgid "Nein"
#~ msgstr "Nein"
#~ msgid "" #~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If " #~ "Your request has been queued on the server and will now be processed. If "
#~ "this takes longer than two minutes, please contact us or go back in your " #~ "this takes longer than two minutes, please contact us or go back in your "
+1
View File
@@ -128,6 +128,7 @@ Leaflet
loszulegen loszulegen
Ltd Ltd
max max
MapQuest
Merchandise Merchandise
Meta Meta
Metadaten Metadaten
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-08-25 02:00+0000\n" "PO-Revision-Date: 2020-08-25 02:00+0000\n"
"Last-Translator: Dennis Lichtenthäler <lichtenthaeler@rami.io>\n" "Last-Translator: Dennis Lichtenthäler <lichtenthaeler@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/" "Language-Team: German (informal) <https://translate.pretix.eu/projects/"
@@ -275,16 +275,16 @@ msgstr "Generiere Nachrichten…"
msgid "Unknown error." msgid "Unknown error."
msgstr "Unbekannter Fehler." msgstr "Unbekannter Fehler."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Diese Farbe hat einen sehr guten Kontrast und ist sehr gut zu lesen!" msgstr "Diese Farbe hat einen sehr guten Kontrast und ist sehr gut zu lesen!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Diese Farbe hat einen ausreichenden Kontrast und wahrscheinlich gut zu lesen!" "Diese Farbe hat einen ausreichenden Kontrast und wahrscheinlich gut zu lesen!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -292,23 +292,23 @@ msgstr ""
"Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen " "Diese Farbe hat einen schlechten Kontrast für Text auf einem weißen "
"Hintergrund. Bitte wähle eine dunklere Farbe." "Hintergrund. Bitte wähle eine dunklere Farbe."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Keine" msgstr "Keine"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Intern einen anderen Namen verwenden" msgstr "Intern einen anderen Namen verwenden"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Klicken zum Schließen" msgstr "Klicken zum Schließen"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Du hast ungespeicherte Änderungen!" msgstr "Du hast ungespeicherte Änderungen!"
@@ -324,15 +324,15 @@ msgstr "Sonstige"
msgid "Count" msgid "Count"
msgstr "Anzahl" msgstr "Anzahl"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(ein weiterer Termin)" msgstr[0] "(ein weiterer Termin)"
@@ -354,28 +354,28 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"Die Produkte in deinem Warenkorb sind noch {num} Minuten für dich reserviert." "Die Produkte in deinem Warenkorb sind noch {num} Minuten für dich reserviert."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte trage eine Menge für eines der Produkte ein." msgstr "Bitte trage eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "Der Veranstalter behält %(currency)s %(amount)s ein" msgstr "Der Veranstalter behält %(currency)s %(amount)s ein"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "Du erhältst %(currency)s %(amount)s zurück" msgstr "Du erhältst %(currency)s %(amount)s zurück"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf." msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Zeitzone:" msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "Deine lokale Zeit:" msgstr "Deine lokale Zeit:"
@@ -626,6 +626,44 @@ msgstr "November"
msgid "December" msgid "December"
msgstr "Dezember" msgstr "Dezember"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mai"
#, fuzzy
#~| msgid "Nein"
#~ msgid "in"
#~ msgstr "Nein"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Nächste Woche"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Keine"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Nächster Monat"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Nächster Monat"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Sonstige"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
@@ -637,9 +675,6 @@ msgstr "Dezember"
#~ msgid "Ja" #~ msgid "Ja"
#~ msgstr "Ja" #~ msgstr "Ja"
#~ msgid "Nein"
#~ msgstr "Nein"
#~ msgid "" #~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If " #~ "Your request has been queued on the server and will now be processed. If "
#~ "this takes longer than two minutes, please contact us or go back in your " #~ "this takes longer than two minutes, please contact us or go back in your "
@@ -128,6 +128,7 @@ Leaflet
loszulegen loszulegen
Ltd Ltd
max max
MapQuest
Merchandise Merchandise
Meta Meta
Metadaten Metadaten
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -258,37 +258,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -304,15 +304,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -332,28 +332,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2019-10-03 19:00+0000\n" "PO-Revision-Date: 2019-10-03 19:00+0000\n"
"Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n" "Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -293,18 +293,18 @@ msgstr "Δημιουργία μηνυμάτων …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Άγνωστο σφάλμα." msgstr "Άγνωστο σφάλμα."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
"Το χρώμα σας έχει μεγάλη αντίθεση και είναι πολύ εύκολο να το διαβάσετε!" "Το χρώμα σας έχει μεγάλη αντίθεση και είναι πολύ εύκολο να το διαβάσετε!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Το χρώμα σας έχει αξιοπρεπή αντίθεση και είναι ίσως αρκετά καλό για να " "Το χρώμα σας έχει αξιοπρεπή αντίθεση και είναι ίσως αρκετά καλό για να "
"διαβάσετε!" "διαβάσετε!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -312,23 +312,23 @@ msgstr ""
"Το χρώμα σας έχει κακή αντίθεση για κείμενο σε λευκό φόντο, επιλέξτε μια πιο " "Το χρώμα σας έχει κακή αντίθεση για κείμενο σε λευκό φόντο, επιλέξτε μια πιο "
"σκούρα σκιά." "σκούρα σκιά."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Όλα" msgstr "Όλα"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Κανένας" msgstr "Κανένας"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά" msgstr "Χρησιμοποιήστε διαφορετικό όνομα εσωτερικά"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Κάντε κλικ για να κλείσετε" msgstr "Κάντε κλικ για να κλείσετε"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -344,15 +344,15 @@ msgstr "Άλλοι"
msgid "Count" msgid "Count"
msgstr "Λογαριασμός" msgstr "Λογαριασμός"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ναι" msgstr "Ναι"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Όχι" msgstr "Όχι"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(μία παραπάνω ημερομηνία)" msgstr[0] "(μία παραπάνω ημερομηνία)"
@@ -372,34 +372,34 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για ένα λεπτό." msgstr[0] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για ένα λεπτό."
msgstr[1] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για {num} λεπτά." msgstr[1] "Τα είδη στο καλάθι θα παραμείνουν δεσμευμένα για {num} λεπτά."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων." msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "απο %(currency)s %(price)s" msgstr "απο %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "απο %(currency)s %(price)s" msgstr "απο %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -654,6 +654,33 @@ msgstr "Νοέμβριος"
msgid "December" msgid "December"
msgstr "Δεκέμβριος" msgstr "Δεκέμβριος"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Μάιος"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Κανένας"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Επόμενος μήνας"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Επόμενος μήνας"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Άλλοι"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-04-27 20:00+0000\n" "PO-Revision-Date: 2020-04-27 20:00+0000\n"
"Last-Translator: Gonzalo Gabriel Perez <zalitoar@gmail.com>\n" "Last-Translator: Gonzalo Gabriel Perez <zalitoar@gmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -289,17 +289,17 @@ msgstr "Generando mensajes…"
msgid "Unknown error." msgid "Unknown error."
msgstr "Error desconocido." msgstr "Error desconocido."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "¡Tu color tiene gran contraste y es muy legible!" msgstr "¡Tu color tiene gran contraste y es muy legible!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"¡Tu color tiene un contraste decente y es probablemente suficientemente " "¡Tu color tiene un contraste decente y es probablemente suficientemente "
"legible!" "legible!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -307,23 +307,23 @@ msgstr ""
"Tu color tiene mal contraste para un texto con fondo blanco, por favor " "Tu color tiene mal contraste para un texto con fondo blanco, por favor "
"escoge un tono más oscuro." "escoge un tono más oscuro."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Todos" msgstr "Todos"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Ninguno" msgstr "Ninguno"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Usar un nombre diferente internamente" msgstr "Usar un nombre diferente internamente"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Click para cerrar" msgstr "Click para cerrar"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "¡Tienes cambios sin guardar!" msgstr "¡Tienes cambios sin guardar!"
@@ -339,15 +339,15 @@ msgstr "Otros"
msgid "Count" msgid "Count"
msgstr "Cantidad" msgstr "Cantidad"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Si" msgstr "Si"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "No" msgstr "No"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(una fecha más)" msgstr[0] "(una fecha más)"
@@ -369,34 +369,34 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"Los elementos en su carrito de compras se han reservado por {num} minutos." "Los elementos en su carrito de compras se han reservado por {num} minutos."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Por favor, introduce un valor para cada tipo de entrada." msgstr "Por favor, introduce un valor para cada tipo de entrada."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "a partir de %(currency)s %(price)s" msgstr "a partir de %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "a partir de %(currency)s %(price)s" msgstr "a partir de %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -652,6 +652,33 @@ msgstr "Noviembre"
msgid "December" msgid "December"
msgstr "Diciembre" msgstr "Diciembre"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mayo"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Ninguno"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Siguiente mes"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Siguiente mes"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Otros"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+47 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-10-17 20:00+0000\n" "PO-Revision-Date: 2020-10-17 20:00+0000\n"
"Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n" "Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -261,37 +261,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "Tuntematon virhe." msgstr "Tuntematon virhe."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Kaikki" msgstr "Kaikki"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Käytä toista nimeä sisäisesti" msgstr "Käytä toista nimeä sisäisesti"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Sulje klikkaamalla" msgstr "Sulje klikkaamalla"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Sinulla on tallentamattomia muutoksia!" msgstr "Sinulla on tallentamattomia muutoksia!"
@@ -307,15 +307,15 @@ msgstr "Muut"
msgid "Count" msgid "Count"
msgstr "Määrä" msgstr "Määrä"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Kyllä" msgstr "Kyllä"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Ei" msgstr "Ei"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -335,28 +335,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Aikavyöhyke:" msgstr "Aikavyöhyke:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -604,3 +604,31 @@ msgstr "Marraskuu"
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
msgid "December" msgid "December"
msgstr "Joulukuu" msgstr "Joulukuu"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Toukokuu"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Seuraava viikko"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Seuraava kuukausi"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Seuraava kuukausi"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Muut"
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: French\n" "Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-09-15 17:00+0000\n" "PO-Revision-Date: 2020-09-15 17:00+0000\n"
"Last-Translator: Martin Gross <martin@pc-coholic.de>\n" "Last-Translator: Martin Gross <martin@pc-coholic.de>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -287,17 +287,17 @@ msgstr "Création de messages …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Erreur inconnue." msgstr "Erreur inconnue."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
"Votre choix de couleur est très facile à lire, il a un excellent contraste !" "Votre choix de couleur est très facile à lire, il a un excellent contraste !"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Votre choix de couleur est assez bon pour la lecture et a un bon contraste !" "Votre choix de couleur est assez bon pour la lecture et a un bon contraste !"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -305,23 +305,23 @@ msgstr ""
"Votre choix de couleur n'a pas un bon contraste avec du texte sur un fond " "Votre choix de couleur n'a pas un bon contraste avec du texte sur un fond "
"blanc, SVP choisissez un ton plus sombre." "blanc, SVP choisissez un ton plus sombre."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Tous" msgstr "Tous"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Aucun" msgstr "Aucun"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Utiliser un nom différent en interne" msgstr "Utiliser un nom différent en interne"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Cliquez pour fermer" msgstr "Cliquez pour fermer"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Vous avez des modifications non sauvegardées !" msgstr "Vous avez des modifications non sauvegardées !"
@@ -337,15 +337,15 @@ msgstr "Autres"
msgid "Count" msgid "Count"
msgstr "Compter" msgstr "Compter"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Oui" msgstr "Oui"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Non" msgstr "Non"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(une date en plus)" msgstr[0] "(une date en plus)"
@@ -365,34 +365,34 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Les articles de votre panier vous sont réservés pour une minute." msgstr[0] "Les articles de votre panier vous sont réservés pour une minute."
msgstr[1] "Les articles de votre panier vous sont réservés pour {num} minutes." msgstr[1] "Les articles de votre panier vous sont réservés pour {num} minutes."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "SVP entrez une quantité pour un de vos types de billets." msgstr "SVP entrez une quantité pour un de vos types de billets."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "de %(currency)s %(price)s" msgstr "de %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "de %(currency)s %(price)s" msgstr "de %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -646,6 +646,33 @@ msgstr "Novembre"
msgid "December" msgid "December"
msgstr "Décembre" msgstr "Décembre"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mai"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Aucun"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Mois suivant"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Mois suivant"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Autres"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-01-24 08:00+0000\n" "PO-Revision-Date: 2020-01-24 08:00+0000\n"
"Last-Translator: Prokaj Miklós <mixolid0@gmail.com>\n" "Last-Translator: Prokaj Miklós <mixolid0@gmail.com>\n"
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -283,16 +283,16 @@ msgstr "Üzenetek generálása…"
msgid "Unknown error." msgid "Unknown error."
msgstr "Ismeretlen hiba." msgstr "Ismeretlen hiba."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni!" msgstr "A választott színek remek kontrasztot adnak, és nagyon könnyű olvasni!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"A választott színek kontrasztja elégséges, és valószínűleg jól olvasható!" "A választott színek kontrasztja elégséges, és valószínűleg jól olvasható!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -300,23 +300,23 @@ msgstr ""
"A választott színek kontrasztja elégtelen, kérjük válassz sötétebb " "A választott színek kontrasztja elégtelen, kérjük válassz sötétebb "
"árnyalatot." "árnyalatot."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Összes" msgstr "Összes"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Semmi" msgstr "Semmi"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Használj másik nevet" msgstr "Használj másik nevet"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Bezárásért kattints" msgstr "Bezárásért kattints"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Mentetlen változtatások!" msgstr "Mentetlen változtatások!"
@@ -332,15 +332,15 @@ msgstr "Egyéb"
msgid "Count" msgid "Count"
msgstr "Számítás" msgstr "Számítás"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Igen" msgstr "Igen"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nem" msgstr "Nem"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(még egy időpont)" msgstr[0] "(még egy időpont)"
@@ -360,34 +360,34 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "A kosár tartalma egy percig foglalva van számodra." msgstr[0] "A kosár tartalma egy percig foglalva van számodra."
msgstr[1] "A kosár tartalma {num} percig foglalva van számodra." msgstr[1] "A kosár tartalma {num} percig foglalva van számodra."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Adjon meg egy mennyiséget az egyik jegytípusból." msgstr "Adjon meg egy mennyiséget az egyik jegytípusból."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "%(currency) %(price)-tól" msgstr "%(currency) %(price)-tól"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "%(currency) %(price)-tól" msgstr "%(currency) %(price)-tól"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -640,3 +640,30 @@ msgstr "November"
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
msgid "December" msgid "December"
msgstr "December" msgstr "December"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Május"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Semmi"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Következő hónap"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Következő hónap"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Egyéb"
File diff suppressed because it is too large Load Diff
+52 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-06-12 20:00+0000\n" "PO-Revision-Date: 2020-06-12 20:00+0000\n"
"Last-Translator: Frank <webappconcept@gmail.com>\n" "Last-Translator: Frank <webappconcept@gmail.com>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -283,39 +283,39 @@ msgstr "Stiamo generando i messaggi …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Errore sconosciuto." msgstr "Errore sconosciuto."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile!" msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Il colore scelto ha un buon contrasto e probabilmente è abbastanza leggibile!" "Il colore scelto ha un buon contrasto e probabilmente è abbastanza leggibile!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
"Il colore scelto non ha un buon contrasto, per favore scegline uno più scuro." "Il colore scelto non ha un buon contrasto, per favore scegline uno più scuro."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Tutto" msgstr "Tutto"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Nessuno" msgstr "Nessuno"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Utilizza un nome diverso internamente" msgstr "Utilizza un nome diverso internamente"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Clicca per chiudere" msgstr "Clicca per chiudere"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Hai cambiamenti non salvati!" msgstr "Hai cambiamenti non salvati!"
@@ -331,15 +331,15 @@ msgstr "Altri"
msgid "Count" msgid "Count"
msgstr "Conteggio" msgstr "Conteggio"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Si" msgstr "Si"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "No" msgstr "No"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(un'altra data)" msgstr[0] "(un'altra data)"
@@ -359,28 +359,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Gli elementi nel tuo carrello sono riservati per 1 minuto." msgstr[0] "Gli elementi nel tuo carrello sono riservati per 1 minuto."
msgstr[1] "Gli elementi nel tuo carrello sono riservati per {num} minuti." msgstr[1] "Gli elementi nel tuo carrello sono riservati per {num} minuti."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Inserisci la quantità per una tipologia di biglietto." msgstr "Inserisci la quantità per una tipologia di biglietto."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "L'organizzatore trattiene %(currency)s %(amount)s" msgstr "L'organizzatore trattiene %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "Ricevi indietro %(currency)s %(amount)s" msgstr "Ricevi indietro %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Inserisci l'importo che l'organizzatore può trattenere." msgstr "Inserisci l'importo che l'organizzatore può trattenere."
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -630,3 +630,36 @@ msgstr "Novembre"
#: pretix/static/pretixpresale/js/widget/widget.js:72 #: pretix/static/pretixpresale/js/widget/widget.js:72
msgid "December" msgid "December"
msgstr "Dicembre" msgstr "Dicembre"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Maggio"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Settimana successiva"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Nessuno"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Mese successivo"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Mese successivo"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Altri"
File diff suppressed because it is too large Load Diff
+46 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2019-11-13 06:00+0000\n" "PO-Revision-Date: 2019-11-13 06:00+0000\n"
"Last-Translator: Zane Smite <z.smite@riga-jurmala.com>\n" "Last-Translator: Zane Smite <z.smite@riga-jurmala.com>\n"
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-" "Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -290,17 +290,17 @@ msgstr "Ziņas tiek ģenerētas …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Nezināma kļūda." msgstr "Nezināma kļūda."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Izvēlētā teksta krāsa ļoti labi izceļas un ir viegli lasāma!" msgstr "Izvēlētā teksta krāsa ļoti labi izceļas un ir viegli lasāma!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Izvēlētā teksta krāsa pietiekami izceļas un visdrīzāk būs samērā viegli " "Izvēlētā teksta krāsa pietiekami izceļas un visdrīzāk būs samērā viegli "
"lasāma!" "lasāma!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -308,23 +308,23 @@ msgstr ""
"Izvēlētā krāsa tekstam neizceļas uz esošā fona, lūdzu, izvēlieties tumšāku " "Izvēlētā krāsa tekstam neizceļas uz esošā fona, lūdzu, izvēlieties tumšāku "
"krāsu." "krāsu."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Visi" msgstr "Visi"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Neviens" msgstr "Neviens"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Izmantojiet citu nosaukumu iekšēji" msgstr "Izmantojiet citu nosaukumu iekšēji"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Noklikšķiniet, lai aizvērtu" msgstr "Noklikšķiniet, lai aizvērtu"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -340,15 +340,15 @@ msgstr "Citi"
msgid "Count" msgid "Count"
msgstr "Skaits" msgstr "Skaits"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Jā" msgstr "Jā"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nē" msgstr "Nē"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(neviens datums)" msgstr[0] "(neviens datums)"
@@ -370,34 +370,34 @@ msgstr[0] "Preces jūsu grozā ir rezervētas nulle minūtes."
msgstr[1] "Preces jūsu grozā ir rezervētas uz vienu minūti." msgstr[1] "Preces jūsu grozā ir rezervētas uz vienu minūti."
msgstr[2] "Preces jūsu grozā ir rezervētas uz {num} minūtēm." msgstr[2] "Preces jūsu grozā ir rezervētas uz {num} minūtēm."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Lūdzu, ievadiet nepieciešamo daudzumu izvēlētajam biļešu veidam." msgstr "Lūdzu, ievadiet nepieciešamo daudzumu izvēlētajam biļešu veidam."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "no %(currency)s %(price)s" msgstr "no %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "no %(currency)s %(price)s" msgstr "no %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -652,6 +652,33 @@ msgstr "Novembris"
msgid "December" msgid "December"
msgstr "Decembris" msgstr "Decembris"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Maijs"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Neviens"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Nākamais mēnesis"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Nākamais mēnesis"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Citi"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -258,37 +258,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -304,15 +304,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -332,28 +332,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
+52 -19
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-08-05 06:00+0000\n" "PO-Revision-Date: 2020-08-05 06:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n" "Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -269,16 +269,16 @@ msgstr "Bezig met het genereren van berichten …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Onbekende fout." msgstr "Onbekende fout."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Uw kleur heeft een goed contrast, en is gemakkelijk te lezen!" msgstr "Uw kleur heeft een goed contrast, en is gemakkelijk te lezen!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Uw kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!" "Uw kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -286,23 +286,23 @@ msgstr ""
"Uw kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies " "Uw kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
"een donkerdere kleur." "een donkerdere kleur."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Geen" msgstr "Geen"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Gebruik intern een andere naam" msgstr "Gebruik intern een andere naam"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Klik om te sluiten" msgstr "Klik om te sluiten"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "U heeft nog niet opgeslagen wijzigingen!" msgstr "U heeft nog niet opgeslagen wijzigingen!"
@@ -318,15 +318,15 @@ msgstr "Andere"
msgid "Count" msgid "Count"
msgstr "Aantal" msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nee" msgstr "Nee"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(één andere datum)" msgstr[0] "(één andere datum)"
@@ -347,28 +347,28 @@ msgstr[0] "De items in uw winkelwagen zijn nog één voor u gereserveerd."
msgstr[1] "" msgstr[1] ""
"De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd." "De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Voer een hoeveelheid voor een van de producten in." msgstr "Voer een hoeveelheid voor een van de producten in."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "De organisator houdt %(currency)s %(amount)s" msgstr "De organisator houdt %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "U krijgt %(currency)s %(amount)s terug" msgstr "U krijgt %(currency)s %(amount)s terug"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Voer het bedrag in dat de organisator mag houden." msgstr "Voer het bedrag in dat de organisator mag houden."
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Tijdzone:" msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "Uw lokale tijd:" msgstr "Uw lokale tijd:"
@@ -621,6 +621,39 @@ msgstr "November"
msgid "December" msgid "December"
msgstr "December" msgstr "December"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mei"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Volgende week"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Geen"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Volgende maand"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Volgende maand"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Andere"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+19 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -257,37 +257,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -303,15 +303,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -331,28 +331,28 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2020-08-09 00:00+0000\n" "PO-Revision-Date: 2020-08-09 00:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n" "Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/" "Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
@@ -271,16 +271,16 @@ msgstr "Bezig met het genereren van berichten …"
msgid "Unknown error." msgid "Unknown error."
msgstr "Onbekende fout." msgstr "Onbekende fout."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Je kleur heeft een goed contrast, en is gemakkelijk te lezen!" msgstr "Je kleur heeft een goed contrast, en is gemakkelijk te lezen!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Je kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!" "Je kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -288,23 +288,23 @@ msgstr ""
"Je kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies " "Je kleur heeft een slecht contrast voor tekst op een witte achtergrond, kies "
"een donkerdere kleur." "een donkerdere kleur."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Geen" msgstr "Geen"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Gebruik intern een andere naam" msgstr "Gebruik intern een andere naam"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Klik om te sluiten" msgstr "Klik om te sluiten"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "Je hebt nog niet opgeslagen wijzigingen!" msgstr "Je hebt nog niet opgeslagen wijzigingen!"
@@ -320,15 +320,15 @@ msgstr "Andere"
msgid "Count" msgid "Count"
msgstr "Aantal" msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nee" msgstr "Nee"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(één andere datum)" msgstr[0] "(één andere datum)"
@@ -350,28 +350,28 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"De items in je winkelwagen zijn nog {num} minuten voor je gereserveerd." "De items in je winkelwagen zijn nog {num} minuten voor je gereserveerd."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Voer een hoeveelheid voor een van de producten in." msgstr "Voer een hoeveelheid voor een van de producten in."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "De organisator houdt %(currency)s %(amount)s" msgstr "De organisator houdt %(currency)s %(amount)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "Jij krijgt %(currency)s %(amount)s terug" msgstr "Jij krijgt %(currency)s %(amount)s terug"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "Voer het bedrag in dat de organisator mag houden." msgstr "Voer het bedrag in dat de organisator mag houden."
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "Tijdzone:" msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "Je lokale tijd:" msgstr "Je lokale tijd:"
@@ -624,6 +624,39 @@ msgstr "November"
msgid "December" msgid "December"
msgstr "December" msgstr "December"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Mei"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next week"
#~ msgid "week"
#~ msgstr "Volgende week"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Geen"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Volgende maand"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Volgende maand"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Andere"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
File diff suppressed because it is too large Load Diff
+51 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: 2019-09-24 19:00+0000\n" "PO-Revision-Date: 2019-09-24 19:00+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n" "Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/" "Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -288,16 +288,16 @@ msgstr "Generowanie wiadomości…"
msgid "Unknown error." msgid "Unknown error."
msgstr "Nieznany błąd." msgstr "Nieznany błąd."
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "Wybrany kolor ma wysoki kontrast i zapewnia doskonałą czytelność!" msgstr "Wybrany kolor ma wysoki kontrast i zapewnia doskonałą czytelność!"
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
"Wybrany kolor ma odpowiedni kontrast i zapewnia wystarczającą czytelność!" "Wybrany kolor ma odpowiedni kontrast i zapewnia wystarczającą czytelność!"
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
@@ -305,23 +305,23 @@ msgstr ""
"Wybrany kolor ma za słaby kontrast dla tekstu na białym tle, prosimy wybrać " "Wybrany kolor ma za słaby kontrast dla tekstu na białym tle, prosimy wybrać "
"ciemniejszy odcień." "ciemniejszy odcień."
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "Zaznacz wszystko" msgstr "Zaznacz wszystko"
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "Odznacz wszystko" msgstr "Odznacz wszystko"
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "Użyj innej nazwy wewnętrznie" msgstr "Użyj innej nazwy wewnętrznie"
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "Zamknij" msgstr "Zamknij"
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -337,15 +337,15 @@ msgstr "Inne"
msgid "Count" msgid "Count"
msgstr "Ilość" msgstr "Ilość"
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "Tak" msgstr "Tak"
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "Nie" msgstr "Nie"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "(jedna data więcej)" msgstr[0] "(jedna data więcej)"
@@ -367,34 +367,34 @@ msgstr[0] "Przedmioty w koszyku są zarezerwowane na jedną minutę."
msgstr[1] "Przedmioty w koszyku są zarezerwowane na {num} minuty." msgstr[1] "Przedmioty w koszyku są zarezerwowane na {num} minuty."
msgstr[2] "Przedmioty w koszyku są zarezerwowane na {num} minut." msgstr[2] "Przedmioty w koszyku są zarezerwowane na {num} minut."
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "Proszę wybrać liczbę dla jednego z typów biletów." msgstr "Proszę wybrać liczbę dla jednego z typów biletów."
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "od %(currency)s %(price)s" msgstr "od %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
#, fuzzy #, fuzzy
#| msgctxt "widget" #| msgctxt "widget"
#| msgid "from %(currency)s %(price)s" #| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "od %(currency)s %(price)s" msgstr "od %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
@@ -648,6 +648,38 @@ msgstr "Listopad"
msgid "December" msgid "December"
msgstr "Grudzień" msgstr "Grudzień"
#, fuzzy
#~| msgid "May"
#~ msgid "day"
#~ msgstr "Maj"
#, fuzzy
#~| msgid "Nein"
#~ msgid "in"
#~ msgstr "Nie"
#, fuzzy
#~| msgid "None"
#~ msgid "on"
#~ msgstr "Odznacz wszystko"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "months"
#~ msgstr "Przyszły miesiąc"
#, fuzzy
#~| msgctxt "widget"
#~| msgid "Next month"
#~ msgid "month"
#~ msgstr "Przyszły miesiąc"
#, fuzzy
#~| msgid "Others"
#~ msgid "the"
#~ msgstr "Inne"
#~ msgctxt "widget" #~ msgctxt "widget"
#~ msgid "" #~ msgid ""
#~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event " #~ "<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
@@ -658,6 +690,3 @@ msgstr "Grudzień"
#~ msgid "Ja" #~ msgid "Ja"
#~ msgstr "Tak" #~ msgstr "Tak"
#~ msgid "Nein"
#~ msgstr "Nie"
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-24 09:10+0000\n" "POT-Creation-Date: 2020-11-27 17:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -258,37 +258,37 @@ msgstr ""
msgid "Unknown error." msgid "Unknown error."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:233 #: pretix/static/pretixcontrol/js/ui/main.js:241
msgid "Your color has great contrast and is very easy to read!" msgid "Your color has great contrast and is very easy to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:237 #: pretix/static/pretixcontrol/js/ui/main.js:245
msgid "Your color has decent contrast and is probably good-enough to read!" msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:241 #: pretix/static/pretixcontrol/js/ui/main.js:249
msgid "" msgid ""
"Your color has bad contrast for text on white background, please choose a " "Your color has bad contrast for text on white background, please choose a "
"darker shade." "darker shade."
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:376 #: pretix/static/pretixcontrol/js/ui/main.js:384
msgid "All" msgid "All"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:377 #: pretix/static/pretixcontrol/js/ui/main.js:385
msgid "None" msgid "None"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:698 #: pretix/static/pretixcontrol/js/ui/main.js:706
msgid "Use a different name internally" msgid "Use a different name internally"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:755 #: pretix/static/pretixcontrol/js/ui/main.js:763
msgid "Click to close" msgid "Click to close"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:770 #: pretix/static/pretixcontrol/js/ui/main.js:778
msgid "You have unsaved changes!" msgid "You have unsaved changes!"
msgstr "" msgstr ""
@@ -304,15 +304,15 @@ msgstr ""
msgid "Count" msgid "Count"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:131 #: pretix/static/pretixcontrol/js/ui/question.js:135
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:132 #: pretix/static/pretixcontrol/js/ui/question.js:136
msgid "No" msgid "No"
msgstr "" msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108 #: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)" msgid "(one more date)"
msgid_plural "({num} more dates)" msgid_plural "({num} more dates)"
msgstr[0] "" msgstr[0] ""
@@ -334,28 +334,28 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] "" msgstr[2] ""
#: pretix/static/pretixpresale/js/ui/main.js:260 #: pretix/static/pretixpresale/js/ui/main.js:268
msgid "Please enter a quantity for one of the ticket types." msgid "Please enter a quantity for one of the ticket types."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:386 #: pretix/static/pretixpresale/js/ui/main.js:394
msgid "The organizer keeps %(currency)s %(amount)s" msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:394 #: pretix/static/pretixpresale/js/ui/main.js:402
msgid "You get %(currency)s %(amount)s back" msgid "You get %(currency)s %(amount)s back"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:410 #: pretix/static/pretixpresale/js/ui/main.js:418
msgid "Please enter the amount the organizer can keep." msgid "Please enter the amount the organizer can keep."
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:424 #: pretix/static/pretixpresale/js/ui/main.js:432
#: pretix/static/pretixpresale/js/ui/main.js:437 #: pretix/static/pretixpresale/js/ui/main.js:445
msgid "Time zone:" msgid "Time zone:"
msgstr "" msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:429 #: pretix/static/pretixpresale/js/ui/main.js:437
msgid "Your local time:" msgid "Your local time:"
msgstr "" msgstr ""
File diff suppressed because it is too large Load Diff

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