Compare commits

...
Author SHA1 Message Date
Richard Schreiber d97648802e remove attestation 2022-03-25 12:05:24 +01:00
Raphael Michel 645a7489df Add missing log display message for waiting list removal 2022-03-24 21:51:29 +01:00
Raphael Michel dff4bf2841 Docs: Pin jinja version 2022-03-24 17:40:42 +01:00
Raphael Michel fc1e2ca3b0 Order search: Fix duplicate query part 2022-03-24 17:22:32 +01:00
Raphael Michel 2a0748a008 Questions step: Only prefill customer name for first ticket (#2555) 2022-03-24 17:04:23 +01:00
Raphael Michel 41d3f39fc7 Add pretixPOS endpoint to device security profile 2022-03-24 11:56:59 +01:00
Michał Rokita 8e481905e2 Translations: Update Polish
Currently translated at 12.1% (563 of 4636 strings)

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

powered by weblate
2022-03-24 11:55:53 +01:00
Michał Rokita 552e130fed Translations: Update Polish
Currently translated at 11.9% (556 of 4636 strings)

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

powered by weblate
2022-03-24 11:55:53 +01:00
Ismael Menéndez Fernández f8b879c2e6 Translations: Update Galician
Currently translated at 11.3% (529 of 4648 strings)

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

powered by weblate
2022-03-24 11:55:53 +01:00
Raphael Michel 9e5403333c Add JSONField for device metadata (#2550) 2022-03-24 11:55:44 +01:00
Raphael Michel 2486c3d205 Show refund amount in refund choice screen 2022-03-23 09:15:10 +01:00
Raphael Michel ee9bf25ae1 Bank transfer: Format IBAN in email 2022-03-23 09:08:10 +01:00
Martin Gross c4d3c48837 Fix voucher redemption page markup #2 (Amend to d97b7b4fb6) 2022-03-22 14:17:27 +01:00
Raphael Michel d97b7b4fb6 Fix voucher redemption page markup (#2548) 2022-03-22 10:41:36 +01:00
Raphael Michel fd83e91174 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel 6e3b62696e Translations: Update German
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel a0b8fedaa7 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel a4961d9dfb Translations: Update German
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel 889f972768 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel 478ab633e0 Translations: Update German
Currently translated at 100.0% (4636 of 4636 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Ismael Menéndez Fernández 0e4047018e Translations: Update Galician
Currently translated at 11.3% (528 of 4633 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Anna-itk cbeaffa415 Translations: Update Danish
Currently translated at 35.6% (1653 of 4633 strings)

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

powered by weblate
2022-03-21 18:19:46 +01:00
Raphael Michel 09972b62c9 Add more words to spell-check list 2022-03-21 18:14:47 +01:00
Raphael Michel 3b2eec659d Update potypo config 2022-03-21 18:09:28 +01:00
Raphael Michel 4e6c61316c Update German spellcheck word list 2022-03-21 18:00:19 +01:00
Raphael Michel c308939f3c Add customizations to word list 2022-03-21 17:12:58 +01:00
Raphael Michel 41604ebdd9 Update po files
[CI skip]

Signed-off-by: Raphael Michel <michel@rami.io>
2022-03-21 16:59:35 +01:00
Raphael MichelandRichard Schreiber e2adf1fdb3 Layout refresh for plugin settings page (#2490)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2022-03-21 16:42:03 +01:00
Richard Schreiber 90d9ddebb5 Fix #2542 -- Validation of exporter forms (#2544) 2022-03-21 12:37:24 +01:00
Raphael Michel 684b8e4102 Accept arabic numbers from date picker (#2547) 2022-03-21 12:36:40 +01:00
Raphael Michel a83e963ea5 Variation editor: Call form_handlers() when adding new form 2022-03-21 11:47:47 +01:00
Raphael Michel c9392236f5 Datetime picker: Fix left/right arrows for rtl languages 2022-03-21 10:01:04 +01:00
Raphael Michel 57d68eaddb Update po files
[CI skip]

Signed-off-by: Raphael Michel <michel@rami.io>
2022-03-18 14:33:02 +01:00
Raphael Michel ab1e063a93 Fix plural in button label (Z#2396370) 2022-03-18 14:32:20 +01:00
Ismael Menéndez Fernández 4b76dcedc4 Translations: Update Galician
Currently translated at 11.3% (523 of 4624 strings)

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

powered by weblate
2022-03-18 14:31:48 +01:00
Maico Timmerman 55752a4319 Event cancellation: Allow allow creating manual refunds for all orders (#2526) 2022-03-18 14:05:32 +01:00
Augustin CavalierandRaphael Michel 5bde98e349 PayPal: Fail early on invalid webhook payload (#2528)
Co-authored-by: Raphael Michel <michel@rami.io>
2022-03-17 16:50:58 +01:00
Raphael Michel 1b2ca87f2d PDF editor: Check PDF file for readability on upload 2022-03-17 16:43:30 +01:00
Raphael Michel 8562c2f103 PDF editor: Limit file upload selector to PDF files 2022-03-17 16:43:30 +01:00
Raphael Michel ea0283266f PDF editor: Fix invalid data type breaking preview 2022-03-17 16:43:30 +01:00
Raphael Michel cc912b9ea7 PDF editor: Support for Ctrl+A 2022-03-17 16:43:30 +01:00
Raphael Michel ebae275a2d PDF editor: Allow multi-lingual text 2022-03-17 16:43:30 +01:00
Raphael Michel 02f8bcbe23 PDF editor: Allow combinations of placeholders 2022-03-17 16:43:30 +01:00
Raphael Michel 4ae7cc9f50 PDF editor: Allow arbitrary fields in QR codes 2022-03-17 16:43:30 +01:00
Raphael Michel c2f2e157d7 PDF editor: Add explanatory tooltip for dynamic image 2022-03-17 16:43:30 +01:00
Raphael Michel ebf0320c2c PDF editor: Add multi-page support 2022-03-17 16:43:30 +01:00
Raphael Michel b05fa89010 PDF editor: Allow button to download current background 2022-03-17 16:43:30 +01:00
Raphael Michel ab0f76c7bb Revert "PDF editor improvements (#2529)"
This reverts commit e4c1f30b9d.
2022-03-17 16:43:18 +01:00
Raphael Michel e4c1f30b9d PDF editor improvements (#2529) 2022-03-17 16:42:48 +01:00
Raphael Michel 9ffeafa6a5 Do not crash email layout preview with unknown placeholders 2022-03-17 09:41:15 +01:00
Richard SchreiberandRaphael Michel cb7e014966 Fix #2438 - Parse dates in format YYYY-MM with isoparse (#2537)
Co-authored-by: Raphael Michel <michel@rami.io>
2022-03-16 14:15:56 +01:00
Yuriko Matsunami 7b7a8e655e Translated on translate.pretix.eu (Japanese)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ja/

powered by weblate
2022-03-16 13:52:42 +01:00
Yuriko Matsunami ac46172f6b Translations: Update Japanese
Currently translated at 3.1% (147 of 4624 strings)

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

powered by weblate
2022-03-16 13:52:42 +01:00
Raphael Michel 31eda01464 Fix error in SMTP settings when not changing password 2022-03-15 16:06:11 +01:00
Raphael Michel 0adddb3084 Widget: Set allow and referrerpolicy on iframe 2022-03-15 12:26:41 +01:00
Raphael Michel 0b91f9da31 Docs: Update example in lead scanning API 2022-03-15 11:02:37 +01:00
Raphael Michel 0a7ba606c6 Add docs on lead scanning API (#2533) 2022-03-15 10:55:52 +01:00
Raphael Michel 959b076b52 Unicode-aware sorting of phone prefixes (#2523) 2022-03-14 15:24:59 +01:00
Ismael Menéndez Fernández 06b0ef906a Translations: Update Galician
Currently translated at 11.2% (522 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Emanuele Signoretta 4f1607040e Translations: Update Italian
Currently translated at 17.5% (812 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Ismael Menéndez Fernández 38a3fa23ed Translations: Update Galician
Currently translated at 11.2% (520 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Yuriko Matsunami baae16d9e7 Translated on translate.pretix.eu (Japanese)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/ja/

powered by weblate
2022-03-14 15:07:10 +01:00
Yuriko Matsunami e2d9cc10e8 Translations: Update Japanese
Currently translated at 1.0% (49 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
DJG Bayern f0f8bbb2b0 Translations: Update Japanese
Currently translated at 1.0% (49 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
DJG Bayern 8d57544ba3 Translations: Update Japanese
Currently translated at 0.7% (36 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Yuriko Matsunami 065533ee4d Translations: Update Japanese
Currently translated at 0.7% (36 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Raphael Michel fb2ad2711f Translations: Add Ukrainian 2022-03-14 15:07:10 +01:00
Anna-itk 52004e5c46 Translations: Update Danish
Currently translated at 34.8% (1610 of 4624 strings)

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

powered by weblate
2022-03-14 15:07:10 +01:00
Raphael Michel 9fcd099531 Fix phone number parsing of initial values 2022-03-14 10:30:03 +01:00
Raphael Michel d8cf3552ba Do not allow self-service cancel of pending orders if they have any payments 2022-03-10 17:02:11 +01:00
Raphael Michel cc04f66a48 Prevent broken email placeholders from stopping emails (#2525) 2022-03-10 14:06:57 +01:00
Martin Gross 86d28b3f21 Control Dashboard: Fix filter link to past events 2022-03-09 10:11:47 +01:00
Raphael Michel 07b401b7af Add docs on API of exhibitor plugin, remove deprecated docs (#2520) 2022-03-08 16:04:18 +01:00
Raphael Michel 8ff4f778bf Bump django-hierarkey to 1.1.* 2022-03-07 10:27:06 +01:00
Raphael Michel 5174d38017 Do not delete TicketLayout backgrounds long as they're referenced somewhere 2022-03-07 09:45:50 +01:00
Raphael Michel 5681ea121d API: Fix organizer exports with OAuth tokens (PRETIXEU-663) 2022-03-04 10:32:17 +01:00
Raphael Michel 4e2a3b45da Fix order split with add-ons involved (#2513) 2022-03-03 16:54:20 +01:00
Ismael Menéndez Fernández d796c399a6 Translations: Update Galician
Currently translated at 11.0% (510 of 4624 strings)

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

powered by weblate
2022-03-03 16:43:45 +01:00
MaLund13 bee5b5f1af Translated on translate.pretix.eu (Swedish)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/sv/

powered by weblate
2022-03-03 16:43:45 +01:00
MaLund13 028be3a5c3 Translations: Update Swedish
Currently translated at 21.8% (1012 of 4624 strings)

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

powered by weblate
2022-03-03 16:43:45 +01:00
Ismael Menéndez Fernández 990fd9a40c Translations: Update Galician
Currently translated at 10.7% (498 of 4624 strings)

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

powered by weblate
2022-03-03 16:43:45 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 746c9af531 Bump @rollup/plugin-babel from 5.3.0 to 5.3.1 in /src/pretix/static/npm_dir (#2506)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-03 15:44:35 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 47208afcec Bump @babel/core from 7.17.2 to 7.17.5 in /src/pretix/static/npm_dir (#2505)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-03 15:44:30 +01:00
Henry BrinkandRaphael Michel b215a0bd04 Add the .mta file extension for Volksbank's MT940 (#2512)
Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
2022-03-03 15:44:23 +01:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 6c94b62bb1 Bump rollup from 2.66.1 to 2.68.0 in /src/pretix/static/npm_dir (#2504)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-03 15:44:13 +01:00
Richard SchreiberandRaphael Michel d7a32d985b Fix -- Custom favicon not showing correctly in Safari (#Z181607) (#2511)
* remove mask-icon as it basically unused nowadays

* remove 194x194-size

favicon in 194x194 is a hack for firefox only useful when chrome-android-icon in 192x192 is specifically created for android with a drop-shadow. This is not the case with pretix-logo or even custom logos. So we can safely drop the 194x194 size.

Co-authored-by: Raphael Michel <michel@rami.io>
2022-03-03 15:36:09 +01:00
Raphael Michel fac3e7f7bd Show comment on denied order in visible log 2022-03-03 14:44:59 +01:00
Raphael Michel 8e8dce7ccf Silence another deprecation warning 2022-03-03 12:53:47 +01:00
Raphael Michel 465e11c765 Silence some deprecation warnings in dependencies on Python 3.10 2022-03-03 12:50:12 +01:00
Raphael Michel 7e6c512a76 Fix isort issue 2022-03-03 11:05:51 +01:00
Martin Gross 5d0b8c5084 Restricted Plugins: Do not require a restricted plugin to be visible. 2022-03-01 17:27:53 +01:00
Raphael Michel 6008e3d11c API: Fix organizer-level export with OAuth token (Z#2395272) 2022-03-01 16:53:48 +01:00
Raphael Michel aeeebc0b4b Add event list exporter 2022-03-01 16:11:00 +01:00
Raphael Michel a568a37f4c Fix #2496 -- Do not call installed() when cloning events (#2497) 2022-03-01 15:49:26 +01:00
Raphael MichelandRichard Schreiber b74f5508b7 Group identical add-ons in cart (#2500)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2022-03-01 15:49:16 +01:00
Raphael Michel a9b0651345 Add convenience redirect from /control/events/-/-/feature to real event (#2501) 2022-03-01 15:48:25 +01:00
Emanuele Signoretta c126445fe0 Translated on translate.pretix.eu (Italian)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/it/

powered by weblate
2022-03-01 15:47:52 +01:00
Raphael Michel f8b8d92f2c Add missing license header 2022-02-28 16:15:53 +01:00
Raphael Michel a66fdc5084 [SECURITY] Fix stored XSS in help texts 2022-02-28 16:06:47 +01:00
Raphael Michel 6d6883b343 [SECURITY] Fix stored XSS in question errors 2022-02-28 16:06:47 +01:00
Raphael Michel 482968175b [SECURITY] Prevent untrusted values from creating Excel formulas 2022-02-28 16:06:47 +01:00
Raphael Michel 5d6302d5fd Pin django-countries to 7.2 2022-02-28 13:06:22 +01:00
Raphael Michel 92fbe76327 Fix anonymizing users by setting their auth_backend 2022-02-28 12:07:24 +01:00
Raphael Michel 2fd2462ef1 Voucher bulk creation: Fix validation for duplicate in input 2022-02-25 18:12:28 +01:00
Raphael Michel 19881dff44 Bump to 4.8.0.dev0 2022-02-25 12:32:00 +01:00
174 changed files with 65474 additions and 37579 deletions
+3
View File
@@ -65,6 +65,9 @@ Example::
A comma-separated list of plugins that are not available even though they are installed.
Defaults to an empty string.
``plugins_show_meta``
Whether to show authors and versions of plugins, defaults to ``on``.
``auth_backends``
A comma-separated list of available auth backends. Defaults to ``pretix.base.auth.NativeAuthBackend``.
+2 -1
View File
@@ -99,7 +99,8 @@ following endpoint:
"hardware_brand": "Samsung",
"hardware_model": "Galaxy S",
"software_brand": "pretixdroid",
"software_version": "4.1.0"
"software_version": "4.1.0",
"info": {"arbitrary": "data"}
}
You will receive a response equivalent to the response of your initialization request.
+2
View File
@@ -43,6 +43,8 @@ Possible permissions are:
* Can view vouchers
* Can change vouchers
.. _`rest-compat`:
Compatibility
-------------
+6 -1
View File
@@ -1,6 +1,11 @@
Resources and endpoints
=======================
With a few exceptions, this only lists resources bundled in the pretix core modules.
Additional endpoints are provided by pretix plugins. Some of them are documented
at :ref:`plugin-docs`.
.. toctree::
:maxdepth: 2
@@ -33,4 +38,4 @@ Resources and endpoints
exporters
sendmail_rules
billing_invoices
billing_var
billing_var
+8 -2
View File
@@ -45,13 +45,17 @@ Attribute Type Description
name string The human-readable name of your plugin
author string Your name
version string A human-readable version code of your plugin
description string A more verbose description of what your plugin does.
description string A more verbose description of what your plugin does. May contain HTML.
category string Category of a plugin. Either one of ``"FEATURE"``, ``"PAYMENT"``,
``"INTEGRATION"``, ``"CUSTOMIZATION"``, ``"FORMAT"``, or ``"API"``,
or any other string.
picture string (optional) Path to a picture resolvable through the static file system.
featured boolean (optional) ``False`` by default, can promote a plugin if it's something many users will want, use carefully.
visible boolean (optional) ``True`` by default, can hide a plugin so it cannot be normally activated.
restricted boolean (optional) ``False`` by default, restricts a plugin such that it can only be enabled
for an event by system administrators / superusers.
experimental boolean (optional) ``False`` by default, marks a plugin as an experimental feature in the plugins list.
picture string (optional) Path to a picture resolvable through the static file system.
compatibility string Specifier for compatible pretix versions.
================== ==================== ===========================================================
@@ -74,8 +78,10 @@ A working example would be:
name = _("PayPal")
author = _("the pretix team")
version = '1.0.0'
category = 'PAYMENT
category = 'PAYMENT'
picture = 'pretix_paypal/paypal_logo.svg'
visible = True
featured = False
restricted = False
description = _("This plugin allows you to receive payments via PayPal")
compatibility = "pretix>=2.7.0"
+562
View File
@@ -0,0 +1,562 @@
Exhibitors
==========
The exhibitors plugin allows to manage exhibitors at your trade show or conference. After signing up your exhibitors
in the system, you can assign vouchers to exhibitors and give them access to the data of these vouchers. The exhibitors
module is also the basis of the pretixLEAD lead scanning application.
.. note:: On pretix Hosted, using the lead scanning feature of the exhibitors plugin can add additional costs
depending on your contract.
The plugin exposes two APIs. One (REST API) is intended for bulk-data operations from the admin side, and one
(App API) that is used by the pretixLEAD app.
REST API
---------
The REST API for exhibitors requires the usual :ref:`rest-auth`.
Resources
"""""""""
The exhibitors plugin provides a HTTP API that allows you to create new exhibitors.
The exhibitors resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal exhibitor ID in pretix
name string Exhibitor name
internal_id string Can be used for the ID in your exhibition system, your customer ID, etc. Can be ``null``. Maximum 255 characters.
contact_name string Contact person (or ``null``)
contact_name_parts object of strings Decomposition of contact name (i.e. given name, family name)
contact_email string Contact person email address (or ``null``)
booth string Booth number (or ``null``). Maximum 100 characters.
locale string Locale for communication with the exhibitor (or ``null``).
access_code string Access code for the exhibitor to access their data or use the lead scanning app (read-only).
allow_lead_scanning boolean Enables lead scanning app
allow_lead_access boolean Enables access to data gathered by the lead scanning app
allow_voucher_access boolean Enables access to data gathered by exhibitor vouchers
comment string Internal comment, not shown to exhibitor
===================================== ========================== =======================================================
You can also access the scanned leads through the API which contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
attendee_order string Order code of the order the scanned attendee belongs to
attendee_positionid integer ``positionid`` if the attendee within the order specified by ``attendee_order``
rating integer A rating of 0 to 5 stars (or ``null``)
notes string A note taken by the exhibitor after scanning
tags list of strings Additional tags selected by the exhibitor
first_upload datetime Date and time of the first upload of this lead
data list of objects Attendee data set that may be shown to the exhibitor based o
the event's configuration. Each entry contains the fields ``id``, ``label``, and ``value``.
device_name string User-defined name for the device used for scanning (or ``null``).
===================================== ========================== =======================================================
Endpoints
"""""""""
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/
Returns a list of all exhibitors configured for an event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/exhibitors/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Aperture Science",
"internal_id": null,
"contact_name": "Dr Cave Johnson",
"contact_name_parts": {
"_scheme": "salutation_title_given_family",
"family_name": "Johnson",
"given_name": "Cave",
"salutation": "",
"title": "Dr"
},
"contact_email": "johnson@as.example.org",
"booth": "A2",
"locale": "de",
"access_code": "VKHZ2FU8",
"allow_lead_scanning": true,
"allow_lead_access": true,
"allow_voucher_access": true,
"comment": ""
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer or event does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/(id)/
Returns information on one exhibitor, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/exhibitors/1/ 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
{
"id": 1,
"name": "Aperture Science",
"internal_id": null,
"contact_name": "Dr Cave Johnson",
"contact_name_parts": {
"_scheme": "salutation_title_given_family",
"family_name": "Johnson",
"given_name": "Cave",
"salutation": "",
"title": "Dr"
},
"contact_email": "johnson@as.example.org",
"booth": "A2",
"locale": "de",
"access_code": "VKHZ2FU8",
"allow_lead_scanning": true,
"allow_lead_access": true,
"allow_voucher_access": true,
"comment": ""
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the exhibitor to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/exhibitor does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/(id)/leads/
Returns a list of all scanned leads of an exhibitor.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/exhibitors/1/leads/ 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": [
{
"attendee_order": "T0E7E",
"attendee_positionid": 1,
"rating": 1,
"notes": "",
"tags": [],
"first_upload": "2021-07-06T11:03:31.414491+01:00",
"data": [
{
"id": "attendee_name",
"label": "Attendee name",
"value": "Peter",
}
]
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the exhibitor to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer or event or exhibitor does not exist **or** you have no permission to view it.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/
Create a new exhibitor.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/exhibitors/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 166
{
"name": "Aperture Science",
"internal_id": null,
"contact_name_parts": {
"_scheme": "salutation_title_given_family",
"family_name": "Johnson",
"given_name": "Cave",
"salutation": "",
"title": "Dr"
},
"contact_email": "johnson@as.example.org",
"booth": "A2",
"locale": "de",
"access_code": "VKHZ2FU8",
"allow_lead_scanning": true,
"allow_lead_access": true,
"allow_voucher_access": true,
"comment": ""
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": "Aperture Science",
"internal_id": null,
"contact_name": "Dr Cave Johnson",
"contact_name_parts": {
"_scheme": "salutation_title_given_family",
"family_name": "Johnson",
"given_name": "Cave",
"salutation": "",
"title": "Dr"
},
"contact_email": "johnson@as.example.org",
"booth": "A2",
"locale": "de",
"access_code": "VKHZ2FU8",
"allow_lead_scanning": true,
"allow_lead_access": true,
"allow_voucher_access": true,
"comment": ""
}
:param organizer: The ``slug`` field of the organizer to create new exhibitor for
:param event: The ``slug`` field of the event to create new exhibitor for
:statuscode 201: no error
:statuscode 400: The exhibitor could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create exhibitors.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/(id)/
Update an exhibitor. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/digitalcontents/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 34
{
"internal_id": "ABC"
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
{
"id": 1,
"name": "Aperture Science",
"internal_id": "ABC",
"contact_name": "Dr Cave Johnson",
"contact_name_parts": {
"_scheme": "salutation_title_given_family",
"family_name": "Johnson",
"given_name": "Cave",
"salutation": "",
"title": "Dr"
},
"contact_email": "johnson@as.example.org",
"booth": "A2",
"locale": "de",
"access_code": "VKHZ2FU8",
"allow_lead_scanning": true,
"allow_lead_access": true,
"allow_voucher_access": true,
"comment": ""
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the exhibitor to modify
:statuscode 200: no error
:statuscode 400: The exhibitor could not be modified due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/exhibitor does not exist **or** you have no permission to change it.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/exhibitors/(id)/
Delete an exhibitor.
.. warning:: This deletes all lead scan data and removes all connections to vouchers (the vouchers are not deleted).
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/exhibitors/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the exhibitor to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/exhibitor does not exist **or** you have no permission to change it
App API
-------
The App API is used for communication between the pretixLEAD app and the pretix server.
.. warning:: We consider this an internal API, it is not intended for external use. You may still use it, but
our :ref:`compatibility commitment <rest-compat>` does not apply.
Authentication
""""""""""""""
Every exhibitor has an "access code", usually consisting of 8 alphanumeric uppercase characters.
This access code is communicated to event exhibitors by the event organizers, so this is also what
exhibitors should enter into a login screen.
All API requests need to contain this access code as a header like this::
Authorization: Exhibitor ABCDE123
Exhibitor profile
"""""""""""""""""
Upon login and in regular intervals after that, the API should fetch the exhibitors profile.
This serves two purposes:
* Checking if the authorization code is actually valid
* Obtaining information that can be shown in the app
The resource consists of the following fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
name string Exhibitor name
booth string Booth number (or ``null``)
event object Object describing the event
├ name multi-lingual string Event name
├ imprint_url string URL to legal notice page. If not ``null``, a button in the app should link to this page.
├ privacy_url string URL to privacy notice page. If not ``null``, a button in the app should link to this page.
├ help_url string URL to help page. If not ``null``, a button in the app should link to this page.
├ logo_url string URL to event logo. If not ``null``, this logo may be shown in the app.
├ slug string Event short form
└ organizer string Organizer short form
notes boolean Specifies whether the exhibitor is allowed to take notes on leads
tags list of strings List of tags the exhibitor can assign to their leads
scan_types list of objects Only used for a special case, fixed value that external API consumers should ignore
===================================== ========================== =======================================================
.. http:get:: /exhibitors/api/v1/profile
**Example request:**
.. sourcecode:: http
GET /exhibitors/api/v1/profile HTTP/1.1
Authorization: Exhibitor ABCDE123
Accept: application/json, text/javascript
**Example response:**
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"name": "Aperture Science",
"booth": "A2",
"event": {
"name": {"en": "Sample conference", "de": "Beispielkonferenz"},
"slug": "bigevents",
"imprint_url": null,
"privacy_url": null,
"help_url": null,
"logo_url": null,
"organizer": "sampleconf"
},
"notes": true,
"tags": ["foo", "bar"],
"scan_types": [
{
"key": "lead",
"label": "Lead Scanning"
}
]
}
:statuscode 200: no error
:statuscode 401: Invalid authentication code
Submitting a lead
"""""""""""""""""
After a ticket/badge is scanned, it should immediately be submitted to the server
so the scan is stored and information about the person can be shown in the app. The same
code can be submitted multiple times, so it's no problem to just submit it again after the
exhibitor set a note or a rating (0-5) inside the app.
On the request, you should set the following properties:
* ``code`` with the scanned barcode
* ``notes`` with the exhibitor's notes
* ``scanned`` with the date and time of the actual scan (not the time of the upload)
* ``scan_type`` set to ``lead`` statically
* ``tags`` with the list of selected tags
* ``rating`` with the rating assigned by the exhibitor
* ``device_name`` with a user-specified name of the device used for scanning (max. 190 characters), or ``null``
If you submit ``tags`` and ``rating`` to be ``null`` and ``notes`` to be ``""``, the server
responds with the previously saved information and will not delete that information. If you
supply other values, the information saved on the server will be overridden.
The response will also contain ``tags``, ``rating``, and ``notes``. Additionally,
it will include ``attendee`` with a list of ``fields`` that can be shown to the
user. Each field has an internal ``id``, a human-readable ``label``, and a ``value`` (all strings).
Note that the ``fields`` array can contain any number of dynamic keys!
Depending on the exhibitors permission and event configuration this might be empty,
or contain lots of details. The app should dynamically show these values (read-only)
with the labels sent by the server.
The request for this looks like this:
.. http:post:: /exhibitors/api/v1/leads/
**Example request:**
.. sourcecode:: http
POST /exhibitors/api/v1/leads/ HTTP/1.1
Authorization: Exhibitor ABCDE123
Accept: application/json, text/javascript
Content-Type: application/json
{
"code": "qrcodecontent",
"notes": "Great customer, wants our newsletter",
"scanned": "2020-10-18T12:24:23.000+00:00",
"scan_type": "lead",
"tags": ["foo"],
"rating": 4,
"device_name": "DEV1"
}
**Example response:**
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"attendee": {
"fields": [
{
"id": "attendee_name",
"label": "Name",
"value": "Jon Doe"
},
{
"id": "attendee_email",
"label": "Email",
"value": "test@example.com"
}
]
},
"rating": 4,
"tags": ["foo"],
"notes": "Great customer, wants our newsletter"
}
:statuscode 200: No error, leads was not scanned for the first time
:statuscode 201: No error, leads was scanned for the first time
:statuscode 400: Invalid data submitted
:statuscode 401: Invalid authentication code
+3 -1
View File
@@ -1,3 +1,5 @@
.. _`plugin-docs`:
Plugin documentation
====================
@@ -10,13 +12,13 @@ If you want to **create** a plugin, please go to the
:maxdepth: 2
list
pretixdroid
banktransfer
ticketoutputpdf
badges
campaigns
certificates
digital
exhibitors
imported_secrets
webinar
presale-saml
+2 -2
View File
@@ -5,6 +5,6 @@ List of plugins
===============
A detailed list of plugins that are available for pretix can be found on the
`project website`_.
`pretix Marketplace`_.
.. _project website: https://pretix.eu/about/en/plugins
.. _pretix Marketplace: https://marketplace.pretix.eu
-368
View File
@@ -1,368 +0,0 @@
pretixdroid HTTP API
====================
The pretixdroid plugin provides a HTTP API that the `pretixdroid Android app`_
uses to communicate with the pretix server.
.. warning:: This API is **DEPRECATED** and will probably go away soon. It is used **only** to serve the pretixdroid
Android app. There are no backwards compatibility guarantees on this API. We will not add features that
are not required for the Android App. There is a general-purpose :ref:`rest-api` that provides all
features that you need to check in.
.. versionchanged:: 1.12
Support for check-in-time questions has been added. The new API features are fully backwards-compatible and
negotiated live, so clients which do not need this feature can ignore the change. For this reason, the API version
has not been increased and is still set to 3.
.. versionchanged:: 1.13
Support for checking in unpaid tickets has been added.
.. http:post:: /pretixdroid/api/(organizer)/(event)/redeem/
Redeems a ticket, i.e. checks the user in.
**Example request**:
.. sourcecode:: http
POST /pretixdroid/api/demoorga/democon/redeem/?key=ABCDEF HTTP/1.1
Host: demo.pretix.eu
Accept: application/json, text/javascript
Content-Type: application/x-www-form-urlencoded
secret=az9u4mymhqktrbupmwkvv6xmgds5dk3&questions_supported=true
You **must** set the parameter secret.
You **must** set the parameter ``questions_supported`` to ``true`` **if** you support asking questions
back to the app operator. You **must not** set it if you do not support this feature. In that case, questions
will just be ignored.
You **may** set the additional parameter ``datetime`` in the body containing an ISO8601-encoded
datetime of the entry attempt. If you don"t, the current date and time will be used.
You **may** set the additional parameter ``force`` to indicate that the request should be logged
regardless of previous check-ins for the same ticket. This might be useful if you made the entry decision offline.
Questions will also always be ignored in this case (i.e. supplied answers will be saved, but no error will be
thrown if they are missing or invalid).
You **may** set the additional parameter ``nonce`` with a globally unique random value to identify this
check-in. This is meant to be used to prevent duplicate check-ins when you are just retrying after a connection
failure.
You **may** set the additional parameter ``ignore_unpaid`` to indicate that the check-in should be performed even
if the order is in pending state.
If questions are supported and required, you will receive a dictionary ``questions`` containing details on the
particular questions to ask. To answer them, just re-send your redemption request with additional parameters of
the form ``answer_<question>=<answer>``, e.g. ``answer_12=24``.
**Example successful response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "ok"
"version": 3,
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"addons_text": "Parking spot",
"paid": true
}
}
**Example response with required questions**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "incomplete"
"version": 3
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"addons_text": "Parking spot",
"paid": true
},
"questions": [
{
"id": 12,
"type": "C",
"question": "Choose a shirt size",
"required": true,
"position": 2,
"items": [1],
"options": [
{
"id": 24,
"answer": "M"
},
{
"id": 25,
"answer": "L"
}
]
}
]
}
**Example error response with data**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "error",
"reason": "already_redeemed",
"version": 3,
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"addons_text": "Parking spot",
"paid": true
}
}
**Example error response without data**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "error",
"reason": "unkown_ticket",
"version": 3
}
Possible error reasons:
* ``unpaid`` - Ticket is not paid for or has been refunded
* ``already_redeemed`` - Ticket already has been redeemed
* ``product`` - Tickets with this product may not be scanned at this device
* ``unknown_ticket`` - Secret does not match a ticket in the database
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
.. http:get:: /pretixdroid/api/(organizer)/(event)/search/
Searches for a ticket.
At most 25 results will be returned. **Queries with less than 4 characters will always return an empty result set.**
**Example request**:
.. sourcecode:: http
GET /pretixdroid/api/demoorga/democon/search/?key=ABCDEF&query=Peter HTTP/1.1
Host: demo.pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"results": [
{
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCE6",
"item": "Standard ticket",
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"checkin_allowed": true,
"addons_text": "Parking spot",
"paid": true
},
...
],
"version": 3
}
:query query: Search query
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
.. http:get:: /pretixdroid/api/(organizer)/(event)/download/
Download data for all tickets.
**Example request**:
.. sourcecode:: http
GET /pretixdroid/api/demoorga/democon/download/?key=ABCDEF HTTP/1.1
Host: demo.pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"version": 3,
"results": [
{
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCE6",
"item": "Standard ticket",
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"checkin_allowed": true,
"paid": true
},
...
],
"questions": [
{
"id": 12,
"type": "C",
"question": "Choose a shirt size",
"required": true,
"position": 2,
"items": [1],
"options": [
{
"id": 24,
"answer": "M"
},
{
"id": 25,
"answer": "L"
}
]
}
]
}
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
.. http:get:: /pretixdroid/api/(organizer)/(event)/status/
Returns status information, such as the total number of tickets and the
number of performed check-ins.
**Example request**:
.. sourcecode:: http
GET /pretixdroid/api/demoorga/democon/status/?key=ABCDEF HTTP/1.1
Host: demo.pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"checkins": 17,
"total": 42,
"version": 3,
"event": {
"name": "Demo Conference",
"slug": "democon",
"date_from": "2016-12-27T17:00:00Z",
"date_to": "2016-12-30T18:00:00Z",
"timezone": "UTC",
"url": "https://demo.pretix.eu/demoorga/democon/",
"organizer": {
"name": "Demo Organizer",
"slug": "demoorga"
},
},
"items": [
{
"name": "T-Shirt",
"id": 1,
"checkins": 1,
"admission": False,
"total": 1,
"variations": [
{
"name": "Red",
"id": 1,
"checkins": 1,
"total": 12
},
{
"name": "Blue",
"id": 2,
"checkins": 4,
"total": 8
}
]
},
{
"name": "Ticket",
"id": 2,
"checkins": 15,
"admission": True,
"total": 22,
"variations": []
}
]
}
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
.. _pretixdroid Android app: https://github.com/pretix/pretixdroid
+1
View File
@@ -1,5 +1,6 @@
-e ../src/
sphinx==2.3.*
jinja2==3.0.*
sphinx-rtd-theme
sphinxcontrib-httpdomain
sphinxcontrib-images
+1
View File
@@ -103,6 +103,7 @@ prepending
preprocessor
presale
pretix
pretixLEAD
pretixSCAN
pretixdroid
pretixPOS
+1 -1
View File
@@ -19,4 +19,4 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
__version__ = "4.7.0"
__version__ = "4.8.0.dev0"
+1
View File
@@ -180,6 +180,7 @@ class PretixPosSecurityProfile(AllowListSecurityProfile):
('POST', 'plugins:pretix_posbackend:posdebuglogentry-bulk-create'),
('GET', 'plugins:pretix_posbackend:poscashier-list'),
('POST', 'plugins:pretix_posbackend:stripeterminal.token'),
('PUT', 'plugins:pretix_posbackend:file.upload'),
('GET', 'api-v1:revokedsecrets-list'),
('GET', 'api-v1:event.settings'),
('GET', 'plugins:pretix_seating:event.event'),
+4
View File
@@ -42,6 +42,7 @@ class InitializationRequestSerializer(serializers.Serializer):
hardware_model = serializers.CharField(max_length=190)
software_brand = serializers.CharField(max_length=190)
software_version = serializers.CharField(max_length=190)
info = serializers.JSONField(required=False, allow_null=True)
class UpdateRequestSerializer(serializers.Serializer):
@@ -49,6 +50,7 @@ class UpdateRequestSerializer(serializers.Serializer):
hardware_model = serializers.CharField(max_length=190)
software_brand = serializers.CharField(max_length=190)
software_version = serializers.CharField(max_length=190)
info = serializers.JSONField(required=False, allow_null=True)
class GateSerializer(serializers.ModelSerializer):
@@ -94,6 +96,7 @@ class InitializeView(APIView):
device.hardware_model = serializer.validated_data.get('hardware_model')
device.software_brand = serializer.validated_data.get('software_brand')
device.software_version = serializer.validated_data.get('software_version')
device.info = serializer.validated_data.get('info')
device.api_token = generate_api_token()
device.save()
@@ -114,6 +117,7 @@ class UpdateView(APIView):
device.hardware_model = serializer.validated_data.get('hardware_model')
device.software_brand = serializer.validated_data.get('software_brand')
device.software_version = serializer.validated_data.get('software_version')
device.info = serializer.validated_data.get('info')
device.save()
device.log_action('pretix.device.updated', data=serializer.validated_data, auth=device)
+10 -2
View File
@@ -147,7 +147,11 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
@cached_property
def exporters(self):
exporters = []
events = (self.request.auth or self.request.user).get_events_with_permission('can_view_orders', request=self.request).filter(
if isinstance(self.request.auth, (Device, TeamAPIToken)):
perm_holder = self.request.auth
else:
perm_holder = self.request.user
events = perm_holder.get_events_with_permission('can_view_orders', request=self.request).filter(
organizer=self.request.organizer
)
responses = register_multievent_data_exporters.send(self.request.organizer)
@@ -157,8 +161,12 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
return exporters
def get_serializer_kwargs(self):
if isinstance(self.request.auth, (Device, TeamAPIToken)):
perm_holder = self.request.auth
else:
perm_holder = self.request.user
return {
'events': self.request.auth.get_events_with_permission('can_view_orders', request=self.request).filter(
'events': perm_holder.get_events_with_permission('can_view_orders', request=self.request).filter(
organizer=self.request.organizer
)
}
+6 -2
View File
@@ -177,7 +177,7 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer):
op.variation,
op.subevent,
op.attendee_name,
(op.pk if op.addon_to_id else None),
op.addon_to_id,
(op.pk if op.has_addons else None)
)
)]
@@ -310,7 +310,11 @@ def get_email_context(**kwargs):
val = [val]
for v in val:
if all(rp in kwargs for rp in v.required_context):
ctx[v.identifier] = v.render(kwargs)
try:
ctx[v.identifier] = v.render(kwargs)
except:
ctx[v.identifier] = '(error)'
logger.exception(f'Failed to process email placeholder {v.identifier}.')
return ctx
+8 -23
View File
@@ -33,7 +33,6 @@
# License for the specific language governing permissions and limitations under the License.
import io
import re
import tempfile
from collections import OrderedDict, namedtuple
from decimal import Decimal
@@ -46,26 +45,13 @@ from django.conf import settings
from django.db.models import QuerySet
from django.utils.formats import localize
from django.utils.translation import gettext, gettext_lazy as _
from openpyxl import Workbook
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE, KNOWN_TYPES, Cell
from pretix.base.models import Event
from pretix.helpers.safe_openpyxl import ( # NOQA: backwards compatibility for plugins using excel_safe
SafeWorkbook, remove_invalid_excel_chars as excel_safe,
)
def excel_safe(val):
if isinstance(val, Cell):
return val
if not isinstance(val, KNOWN_TYPES):
val = str(val)
if isinstance(val, bytes):
val = val.decode("utf-8", errors="ignore")
if isinstance(val, str):
val = re.sub(ILLEGAL_CHARACTERS_RE, '', val)
return val
__ = excel_safe # just so the compatbility import above is "used" and doesn't get removed by linter
class BaseExporter:
@@ -228,7 +214,7 @@ class ListExporter(BaseExporter):
pass
def _render_xlsx(self, form_data, output_file=None):
wb = Workbook(write_only=True)
wb = SafeWorkbook(write_only=True)
ws = wb.create_sheet()
self.prepare_xlsx_sheet(ws)
try:
@@ -242,7 +228,7 @@ class ListExporter(BaseExporter):
total = line.total
continue
ws.append([
excel_safe(val) for val in line
val for val in line
])
if total:
counter += 1
@@ -347,7 +333,7 @@ class MultiSheetListExporter(ListExporter):
return self.get_filename() + '.csv', 'text/csv', output.getvalue().encode("utf-8")
def _render_xlsx(self, form_data, output_file=None):
wb = Workbook(write_only=True)
wb = SafeWorkbook(write_only=True)
n_sheets = len(self.sheets)
for i_sheet, (s, l) in enumerate(self.sheets):
ws = wb.create_sheet(str(l))
@@ -361,8 +347,7 @@ class MultiSheetListExporter(ListExporter):
total = line.total
continue
ws.append([
excel_safe(val)
for val in line
val for val in line
])
if total:
counter += 1
+1
View File
@@ -21,6 +21,7 @@
#
from .answers import * # noqa
from .dekodi import * # noqa
from .events import * # noqa
from .invoices import * # noqa
from .json import * # noqa
from .mail import * # noqa
+100
View File
@@ -0,0 +1,100 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
# This file is based on an earlier version of pretix which was released under the Apache License 2.0. The full text of
# the Apache License 2.0 can be obtained at <http://www.apache.org/licenses/LICENSE-2.0>.
#
# This file may have since been changed and any changes are released under the terms of AGPLv3 as described above. A
# full history of changes and contributors is available at <https://github.com/pretix/pretix>.
#
# This file contains Apache-licensed contributions copyrighted by: Tobias Kunze
#
# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under the License.
from django.dispatch import receiver
from django.utils.formats import date_format
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from ...control.forms.filter import get_all_payment_providers
from ..exporter import ListExporter
from ..signals import register_multievent_data_exporters
class EventDataExporter(ListExporter):
identifier = 'eventdata'
verbose_name = _('Event data')
@cached_property
def providers(self):
return dict(get_all_payment_providers())
def iterate_list(self, form_data):
header = [
_("Event name"),
_("Short form"),
_("Shop is live"),
_("Event currency"),
_("Event start time"),
_("Event end time"),
_("Admission time"),
_("Start of presale"),
_("End of presale"),
_("Location"),
_("Latitude"),
_("Longitude"),
_("Internal comment"),
]
props = list(self.organizer.meta_properties.all())
for p in props:
header.append(p.name)
yield header
for e in self.events.all():
m = e.meta_data
yield [
str(e.name),
e.slug,
_('Yes') if e.live else _('No'),
e.currency,
date_format(e.date_from, 'SHORT_DATETIME_FORMAT'),
date_format(e.date_to, 'SHORT_DATETIME_FORMAT') if e.date_to else '',
date_format(e.date_admission, 'SHORT_DATETIME_FORMAT') if e.date_admission else '',
date_format(e.presale_start, 'SHORT_DATETIME_FORMAT') if e.presale_start else '',
date_format(e.presale_end, 'SHORT_DATETIME_FORMAT') if e.presale_end else '',
str(e.location),
e.geo_lat or '',
e.geo_lon or '',
e.comment,
] + [
m.get(p.name, '') for p in props
]
def get_filename(self):
return '{}_events'.format(self.events.first().organizer.slug)
@receiver(register_multievent_data_exporters, dispatch_uid="multiexporter_eventdata")
def register_multievent_eventdata_exporter(sender, **kwargs):
return EventDataExporter
+4 -1
View File
@@ -113,10 +113,13 @@ class SettingsForm(i18nfield.forms.I18nFormMixin, HierarkeyForm):
if isinstance(f, (RelativeDateTimeField, RelativeDateField)):
f.set_event(self.obj)
def save(self):
def _unmask_secret_fields(self):
for k, v in self.cleaned_data.items():
if isinstance(self.fields.get(k), SecretKeySettingsField) and self.cleaned_data.get(k) == SECRET_REDACTED:
self.cleaned_data[k] = self.initial[k]
def save(self):
self._unmask_secret_fields()
return super().save()
def clean(self):
+18 -16
View File
@@ -41,7 +41,6 @@ from io import BytesIO
import dateutil.parser
import pycountry
import pytz
from babel import Locale
from django import forms
from django.conf import settings
from django.contrib import messages
@@ -52,7 +51,6 @@ from django.core.validators import (
)
from django.db.models import QuerySet
from django.forms import Select, widgets
from django.utils import translation
from django.utils.formats import date_format
from django.utils.html import escape
from django.utils.safestring import mark_safe
@@ -87,7 +85,9 @@ from pretix.base.templatetags.rich_text import rich_text
from pretix.control.forms import (
ExtFileField, ExtValidationMixin, SizeValidationMixin, SplitDateTimeField,
)
from pretix.helpers.countries import CachedCountries
from pretix.helpers.countries import (
CachedCountries, get_phone_prefixes_sorted_and_localized,
)
from pretix.helpers.escapejson import escapejson_attr
from pretix.helpers.i18n import get_format_without_seconds
from pretix.presale.signals import question_form_fields
@@ -264,17 +264,14 @@ class WrappedPhonePrefixSelect(Select):
def __init__(self, initial=None):
choices = [("", "---------")]
language = get_babel_locale() # changed from default implementation that used the django locale
locale = Locale(translation.to_locale(language))
for prefix, values in _COUNTRY_CODE_TO_REGION_CODE.items():
prefix = "+%d" % prefix
if initial and initial in values:
self.initial = prefix
for country_code in values:
country_name = locale.territories.get(country_code)
if country_name:
choices.append((prefix, "{} {}".format(country_name, prefix)))
super().__init__(choices=sorted(choices, key=lambda item: item[1]), attrs={'aria-label': pgettext_lazy('phonenumber', 'International area code')})
if initial:
for prefix, values in _COUNTRY_CODE_TO_REGION_CODE.items():
if initial in values:
self.initial = "+%d" % prefix
break
choices += get_phone_prefixes_sorted_and_localized()
super().__init__(choices=choices, attrs={'aria-label': pgettext_lazy('phonenumber', 'International area code')})
def render(self, name, value, *args, **kwargs):
return super().render(name, value or self.initial, *args, **kwargs)
@@ -318,7 +315,12 @@ class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget):
silently deleting data.
"""
if value:
if type(value) == PhoneNumber:
if isinstance(value, str):
try:
value = PhoneNumber.from_string(value)
except:
pass
if isinstance(value, PhoneNumber):
if value.country_code and value.national_number:
return [
"+%d" % value.country_code,
@@ -705,7 +707,7 @@ class BaseQuestionsForm(forms.Form):
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=help_text,
initial=initial.answer if initial else None,
)
elif q.type == Question.TYPE_STRING:
+30
View File
@@ -42,6 +42,24 @@ from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _
def replace_arabic_numbers(inp):
if not isinstance(inp, str):
return inp
table = {
1632: 48, # 0
1633: 49, # 1
1634: 50, # 2
1635: 51, # 3
1636: 52, # 4
1637: 53, # 5
1638: 54, # 6
1639: 55, # 7
1640: 56, # 8
1641: 57, # 9
}
return inp.translate(table)
class DatePickerWidget(forms.DateInput):
def __init__(self, attrs=None, date_format=None):
attrs = attrs or {}
@@ -62,6 +80,10 @@ class DatePickerWidget(forms.DateInput):
forms.DateInput.__init__(self, date_attrs, date_format)
def value_from_datadict(self, data, files, name):
v = super().value_from_datadict(data, files, name)
return replace_arabic_numbers(v)
class TimePickerWidget(forms.TimeInput):
def __init__(self, attrs=None, time_format=None):
@@ -83,6 +105,10 @@ class TimePickerWidget(forms.TimeInput):
forms.TimeInput.__init__(self, time_attrs, time_format)
def value_from_datadict(self, data, files, name):
v = super().value_from_datadict(data, files, name)
return replace_arabic_numbers(v)
class UploadedFileWidget(forms.ClearableFileInput):
def __init__(self, *args, **kwargs):
@@ -179,6 +205,10 @@ class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
# Skip one hierarchy level
forms.MultiWidget.__init__(self, widgets, attrs)
def value_from_datadict(self, data, files, name):
v = super().value_from_datadict(data, files, name)
return [replace_arabic_numbers(i) for i in v]
class BusinessBooleanRadio(forms.RadioSelect):
def __init__(self, require_business=False, attrs=None):
@@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-03-22 11:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0208_auto_20220214_1632'),
]
operations = [
migrations.AddField(
model_name='device',
name='info',
field=models.JSONField(null=True),
),
]
+17
View File
@@ -498,6 +498,23 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin):
| Q(id__in=self.teams.filter(**kwargs).values_list('limit_events__id', flat=True))
)
@scopes_disabled()
def get_organizers_with_any_permission(self, request=None):
"""
Returns a queryset of organizers the user has any permissions to.
:param request: The current request (optional). Required to detect staff sessions properly.
:return: Iterable of Organizers
"""
from .event import Organizer
if request and self.has_active_staff_session(request.session.session_key):
return Organizer.objects.all()
return Organizer.objects.filter(
id__in=self.teams.values_list('organizer', flat=True)
)
@scopes_disabled()
def get_organizers_with_permission(self, permission, request=None):
"""
+3
View File
@@ -156,6 +156,9 @@ class Device(LoggedModel):
null=True,
blank=False
)
info = models.JSONField(
null=True, blank=True,
)
objects = ScopedManager(organizer='organizer')
+8 -3
View File
@@ -638,12 +638,13 @@ class Order(LockModel, LoggedModel):
return False
if self.user_cancel_deadline and now() > self.user_cancel_deadline:
return False
if self.status == Order.STATUS_PENDING:
return self.event.settings.cancel_allow_user
elif self.status == Order.STATUS_PAID:
if self.status == Order.STATUS_PAID or self.payment_refund_sum > Decimal('0.00'):
if self.total == Decimal('0.00'):
return self.event.settings.cancel_allow_user
return self.event.settings.cancel_allow_user_paid
elif self.status == Order.STATUS_PENDING:
return self.event.settings.cancel_allow_user
return False
def propose_auto_refunds(self, amount: Decimal, payments: list=None):
@@ -1330,6 +1331,10 @@ class AbstractPosition(models.Model):
else:
return {}
@property
def item_and_variation(self):
return self.item, self.variation
@meta_info_data.setter
def meta_info_data(self, d):
self.meta_info = json.dumps(d)
+66 -22
View File
@@ -37,6 +37,7 @@ import hashlib
import itertools
import logging
import os
import re
import subprocess
import tempfile
import uuid
@@ -54,6 +55,7 @@ from django.utils.functional import SimpleLazyObject
from django.utils.html import conditional_escape
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from i18nfield.strings import LazyI18nString
from PyPDF2 import PdfFileReader
from pytz import timezone
from reportlab.graphics import renderPDF
@@ -202,6 +204,11 @@ DEFAULT_VARIABLES = OrderedDict((
"editor_sample": 'foo@bar.com',
"evaluate": lambda op, order, ev: op.attendee_email or (op.addon_to.attendee_email if op.addon_to else '')
}),
("pseudonymization_id", {
"label": _("Pseudonymization ID (lead scanning)"),
"editor_sample": "GG89JUJDTA",
"evaluate": lambda orderposition, order, event: orderposition.pseudonymization_id,
}),
("event_name", {
"label": _("Event name"),
"editor_sample": _("Sample event name"),
@@ -616,12 +623,14 @@ class Renderer:
preserveAspectRatio=True, anchor='n',
mask='auto')
def _draw_barcodearea(self, canvas: Canvas, op: OrderPosition, o: dict):
def _draw_barcodearea(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict):
content = o.get('content', 'secret')
if content == 'secret':
# do not use get_text_content because it uses a shortened version of secret
# and does not deal with our default value here properly
content = op.secret
elif content == 'pseudonymization_id':
content = op.pseudonymization_id
else:
content = self._get_text_content(op, order, o)
level = 'H'
if len(content) > 32:
@@ -648,20 +657,45 @@ class Renderer:
return self._get_text_content(op, order, o, True)
ev = self._get_ev(op, order)
if not o['content']:
return '(error)'
if o['content'] == 'other':
return o['text']
if o['content'] == 'other' or o['content'] == 'other_i18n':
if o['content'] == 'other_i18n':
text = str(LazyI18nString(o['text_i18n']))
else:
text = o['text']
def replace(x):
if x.group(1) not in self.variables:
return x.group(0)
if x.group(1) == 'secret':
# Do not use shortened version
return op.secret
try:
return self.variables[x.group(1)]['evaluate'](op, order, ev)
except:
logger.exception('Failed to process variable.')
return '(error)'
# We do not use str.format like in emails so we (a) can evaluate lazily and (b) can re-implement this
# 1:1 on other platforms that render PDFs through our API (libpretixprint)
return re.sub(r'\{([a-zA-Z0-9_]+)\}', replace, text)
elif o['content'].startswith('itemmeta:'):
return op.item.meta_data.get(o['content'][9:]) or ''
elif o['content'].startswith('meta:'):
return ev.meta_data.get(o['content'][5:]) or ''
elif o['content'] in self.variables:
try:
return self.variables[o['content']]['evaluate'](op, order, ev)
except:
logger.exception('Failed to process variable.')
return '(error)'
return ''
def _draw_imagearea(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict):
@@ -754,20 +788,30 @@ class Renderer:
p.drawOn(canvas, 0, -h - ad[1])
canvas.restoreState()
def draw_page(self, canvas: Canvas, order: Order, op: OrderPosition, show_page=True):
for o in self.layout:
if o['type'] == "barcodearea":
self._draw_barcodearea(canvas, op, o)
elif o['type'] == "imagearea":
self._draw_imagearea(canvas, op, order, o)
elif o['type'] == "textarea":
self._draw_textarea(canvas, op, order, o)
elif o['type'] == "poweredby":
self._draw_poweredby(canvas, op, o)
if self.bg_pdf:
canvas.setPageSize((self.bg_pdf.getPage(0).mediaBox[2], self.bg_pdf.getPage(0).mediaBox[3]))
if show_page:
canvas.showPage()
def draw_page(self, canvas: Canvas, order: Order, op: OrderPosition, show_page=True, only_page=None):
page_count = self.bg_pdf.getNumPages()
if not only_page and not show_page:
raise ValueError("only_page=None and show_page=False cannot be combined")
for page in range(page_count):
if only_page and only_page != page + 1:
continue
for o in self.layout:
if o.get('page', 1) != page + 1:
continue
if o['type'] == "barcodearea":
self._draw_barcodearea(canvas, op, order, o)
elif o['type'] == "imagearea":
self._draw_imagearea(canvas, op, order, o)
elif o['type'] == "textarea":
self._draw_textarea(canvas, op, order, o)
elif o['type'] == "poweredby":
self._draw_poweredby(canvas, op, o)
if self.bg_pdf:
canvas.setPageSize((self.bg_pdf.getPage(page).mediaBox[2], self.bg_pdf.getPage(page).mediaBox[3]))
if show_page:
canvas.showPage()
def render_background(self, buffer, title=_('Ticket')):
if settings.PDFTK:
@@ -780,7 +824,7 @@ class Renderer:
subprocess.run([
settings.PDFTK,
os.path.join(d, 'front.pdf'),
'background',
'multibackground',
os.path.join(d, 'back.pdf'),
'output',
os.path.join(d, 'out.pdf'),
@@ -794,8 +838,8 @@ class Renderer:
new_pdf = PdfFileReader(buffer)
output = PdfFileWriter()
for page in new_pdf.pages:
bg_page = copy.copy(self.bg_pdf.getPage(0))
for i, page in enumerate(new_pdf.pages):
bg_page = copy.copy(self.bg_pdf.getPage(i))
bg_page.mergePage(page)
output.addPage(bg_page)
+4 -4
View File
@@ -214,8 +214,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool,
refund_amount = o.payment_refund_sum
try:
if auto_refund:
_try_auto_refund(o.pk, manual_refund=manual_refund, allow_partial=True,
if auto_refund or manual_refund:
_try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True,
source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard,
giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions,
comment=gettext('Event canceled'))
@@ -272,8 +272,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool,
ocm.commit()
refund_amount = o.payment_refund_sum - o.total
if auto_refund:
_try_auto_refund(o.pk, manual_refund=manual_refund, allow_partial=True,
if auto_refund or manual_refund:
_try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True,
source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard,
giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions,
comment=gettext('Event canceled'))
+34 -32
View File
@@ -1527,6 +1527,8 @@ class OrderChangeManager:
self._invoice_dirty = True
self._operations.append(self.SplitOperation(position))
for a in position.addons.all():
self._operations.append(self.SplitOperation(a))
def set_addons(self, addons):
if self._operations:
@@ -2383,7 +2385,8 @@ def perform_order(self, event: Event, payment_provider: str, positions: List[str
_unset = object()
def _try_auto_refund(order, manual_refund=False, allow_partial=False, source=OrderRefund.REFUND_SOURCE_BUYER,
def _try_auto_refund(order, auto_refund=True, manual_refund=False, allow_partial=False,
source=OrderRefund.REFUND_SOURCE_BUYER,
refund_as_giftcard=False, giftcard_expires=_unset, giftcard_conditions=None, comment=None):
notify_admin = False
error = False
@@ -2393,9 +2396,9 @@ def _try_auto_refund(order, manual_refund=False, allow_partial=False, source=Ord
if refund_amount <= Decimal('0.00'):
return
can_auto_refund_sum = 0
if refund_as_giftcard:
proposals = {}
can_auto_refund = True
can_auto_refund_sum = refund_amount
with transaction.atomic():
giftcard = order.event.organizer.issued_gift_cards.create(
@@ -2435,42 +2438,41 @@ def _try_auto_refund(order, manual_refund=False, allow_partial=False, source=Ord
if r.state != OrderRefund.REFUND_STATE_DONE:
notify_admin = True
else:
elif auto_refund:
proposals = order.propose_auto_refunds(refund_amount)
can_auto_refund_sum = sum(proposals.values())
can_auto_refund = (allow_partial and can_auto_refund_sum) or can_auto_refund_sum == refund_amount
if can_auto_refund:
for p, value in proposals.items():
with transaction.atomic():
r = order.refunds.create(
payment=p,
source=source,
state=OrderRefund.REFUND_STATE_CREATED,
amount=value,
comment=comment,
provider=p.provider
)
order.log_action('pretix.event.order.refund.created', {
'local_id': r.local_id,
'provider': r.provider,
})
try:
r.payment_provider.execute_refund(r)
except PaymentException as e:
if (allow_partial and can_auto_refund_sum) or can_auto_refund_sum == refund_amount:
for p, value in proposals.items():
with transaction.atomic():
r.state = OrderRefund.REFUND_STATE_FAILED
r.save()
order.log_action('pretix.event.order.refund.failed', {
r = order.refunds.create(
payment=p,
source=source,
state=OrderRefund.REFUND_STATE_CREATED,
amount=value,
comment=comment,
provider=p.provider
)
order.log_action('pretix.event.order.refund.created', {
'local_id': r.local_id,
'provider': r.provider,
'error': str(e)
})
error = True
notify_admin = True
else:
if r.state not in (OrderRefund.REFUND_STATE_TRANSIT, OrderRefund.REFUND_STATE_DONE):
try:
r.payment_provider.execute_refund(r)
except PaymentException as e:
with transaction.atomic():
r.state = OrderRefund.REFUND_STATE_FAILED
r.save()
order.log_action('pretix.event.order.refund.failed', {
'local_id': r.local_id,
'provider': r.provider,
'error': str(e)
})
error = True
notify_admin = True
else:
if r.state not in (OrderRefund.REFUND_STATE_TRANSIT, OrderRefund.REFUND_STATE_DONE):
notify_admin = True
if refund_amount - can_auto_refund_sum > Decimal('0.00'):
if manual_refund:
-1
View File
@@ -101,7 +101,6 @@ def restricted_plugin_kwargs():
(p.module, p.name) for p in get_all_plugins(None)
if (
not p.name.startswith('.') and
getattr(p, 'visible', True) and
getattr(p, 'restricted', False) and
not hasattr(p, 'is_available') # this means you should not really use restricted and is_available
)
@@ -90,13 +90,16 @@
{% for groupkey, positions in cart %}
<tr>
<td>
{% if not groupkey.4 %} {# is addon #}
{% if not groupkey.4 %} {# is not addon #}
{{ positions|length }}x
{% endif %}
</td>
<td>
{% if groupkey.4 %} {# is addon #}
+
{% if positions|length > 1 %}
{{ positions|length }}x
{% endif %}
{% endif %}
{{ groupkey.0.name }}{% if groupkey.1 %} {{ groupkey.1.value }}{% endif %}
{% if groupkey.2 %} {# subevent #}
+3 -3
View File
@@ -58,7 +58,7 @@ class BaseQuestionsViewMixin:
def _positions_for_questions(self):
raise NotImplementedError()
def get_question_override_sets(self, position):
def get_question_override_sets(self, position, index):
return []
def question_form_kwargs(self, cr):
@@ -72,7 +72,7 @@ class BaseQuestionsViewMixin:
submitted at once.
"""
formlist = []
for cr in self._positions_for_questions:
for idx, cr in enumerate(self._positions_for_questions):
cartpos = cr if isinstance(cr, CartPosition) else None
orderpos = cr if isinstance(cr, OrderPosition) else None
@@ -96,7 +96,7 @@ class BaseQuestionsViewMixin:
))
)
override_sets = self.get_question_override_sets(cr)
override_sets = self.get_question_override_sets(cr, idx)
for overrides in override_sets:
for question_name, question_field in form.fields.items():
if hasattr(question_field, 'question'):
-1
View File
@@ -255,7 +255,6 @@ class OrderFilterForm(FilterForm):
| Q(pk__in=matching_invoices)
| Q(pk__in=matching_positions)
| Q(pk__in=matching_invoice_addresses)
| Q(pk__in=matching_invoices)
)
for recv, q in order_search_filter_q.send(sender=getattr(self, 'event', None), query=u):
mainq = mainq | q
+10 -6
View File
@@ -482,6 +482,9 @@ class OrderPositionChangeForm(forms.Form):
self.fields['tax_rule'].queryset = instance.event.tax_rules.all()
self.fields['tax_rule'].label_from_instance = self.taxrule_label_from_instance
if instance.addon_to_id:
del self.fields['operation_split']
if not instance.seat and not (
instance.item.seat_category_mappings.filter(subevent=instance.subevent).exists()
):
@@ -746,16 +749,17 @@ class EventCancelForm(forms.Form):
auto_refund = forms.BooleanField(
label=_('Automatically refund money if possible'),
initial=True,
required=False
required=False,
help_text=_('Only available for payment method that support automatic refunds.')
)
manual_refund = forms.BooleanField(
label=_('Create manual refund if the payment method does not support automatic refunds'),
widget=forms.CheckboxInput(attrs={'data-display-dependency': '#id_auto_refund'}),
label=_('Create refund in the manual refund to-do list'),
initial=True,
required=False,
help_text=_('If checked, all payments with a payment method not supporting automatic refunds will be on your '
'manual refund to-do list. Do not check if you want to refund some of the orders by offsetting '
'with different orders or issuing gift cards.')
help_text=_('Manual refunds will be created which will be listed in the manual refund to-do list. '
'When combined with the automatic refund functionally, only payments with a payment method not '
'supporting automatic refunds will be on your manual refund to-do list. Do not check if you want '
'to refund some of the orders by offsetting with different orders or issuing gift cards.')
)
refund_as_giftcard = forms.BooleanField(
label=_('Refund order value to a gift card instead instead of the original payment method'),
+6
View File
@@ -385,6 +385,12 @@ class VoucherBulkForm(VoucherForm):
if vouchers.exists():
raise ValidationError(_('A voucher with one of these codes already exists.'))
codes_seen = set()
for c in data['codes']:
if c in codes_seen:
raise ValidationError(_('The voucher code {code} appears in your list twice.').format(code=c))
codes_seen.add(c)
if data.get('send') and not all([data.get('send_subject'), data.get('send_message'), data.get('send_recipients')]):
raise ValidationError(_('If vouchers should be sent by email, subject, message and recipients need to be specified.'))
+2 -1
View File
@@ -347,7 +347,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
'pretix.event.order.placed': _('The order has been created.'),
'pretix.event.order.placed.require_approval': _('The order requires approval before it can continue to be processed.'),
'pretix.event.order.approved': _('The order has been approved.'),
'pretix.event.order.denied': _('The order has been denied.'),
'pretix.event.order.denied': _('The order has been denied (comment: "{comment}").'),
'pretix.event.order.contact.changed': _('The email address has been changed from "{old_email}" '
'to "{new_email}".'),
'pretix.event.order.contact.confirmed': _('The email address has been confirmed to be working (the user clicked on a link '
@@ -423,6 +423,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
'pretix.voucher.added': _('The voucher has been created.'),
'pretix.voucher.sent': _('The voucher has been sent to {recipient}.'),
'pretix.voucher.added.waitinglist': _('The voucher has been created and sent to a person on the waiting list.'),
'pretix.voucher.expired.waitinglist': _('The voucher has been set to expire because the recipient removed themselves from the waiting list.'),
'pretix.voucher.changed': _('The voucher has been changed.'),
'pretix.voucher.deleted': _('The voucher has been deleted.'),
'pretix.voucher.redeemed': _('The voucher has been redeemed in order {order_code}.'),
+23
View File
@@ -142,6 +142,18 @@ class PermissionMiddleware:
return redirect(reverse('control:user.settings.2fa'))
if 'event' in url.kwargs and 'organizer' in url.kwargs:
if url.kwargs['organizer'] == '-' and url.kwargs['event'] == '-':
# This is a hack that just takes the user to ANY event. It's useful to link to features in support
# or documentation.
ev = request.user.get_events_with_any_permission().order_by('-date_from').first()
if not ev:
raise Http404(_("The selected event was not found or you "
"have no permission to administrate it."))
k = dict(url.kwargs)
k['organizer'] = ev.organizer.slug
k['event'] = ev.slug
return redirect(reverse(url.view_name, kwargs=k, args=url.args))
with scope(organizer=None):
request.event = Event.objects.filter(
slug=url.kwargs['event'],
@@ -157,6 +169,17 @@ class PermissionMiddleware:
else:
request.eventpermset = request.user.get_event_permission_set(request.organizer, request.event)
elif 'organizer' in url.kwargs:
if url.kwargs['organizer'] == '-':
# This is a hack that just takes the user to ANY organizer. It's useful to link to features in support
# or documentation.
org = request.user.get_organizers_with_any_permission().first()
if not org:
raise Http404(_("The selected organizer was not found or you "
"have no permission to administrate it."))
k = dict(url.kwargs)
k['organizer'] = org.slug
return redirect(reverse(url.view_name, kwargs=k, args=url.args))
request.organizer = Organizer.objects.filter(
slug=url.kwargs['organizer'],
).first()
@@ -56,7 +56,7 @@
{% endfor %}
</div>
<p class="">
<a href="{% url "control:events" %}?ordering=date_from&status=-date_to" class="">
<a href="{% url "control:events" %}?ordering=date_from&status=date_past" class="">
{% trans "View all recent events" %}
</a>
</p>
@@ -0,0 +1,36 @@
{% load i18n %}
{% if show_meta %}
{% if plugin.author %}
<p class="meta text-muted">
{% blocktrans trimmed with a=plugin.author %}
by <em>{{ a }}</em>
{% endblocktrans %}</p>
{% endif %}
{% endif %}
<p>{{ plugin.description|safe }}</p>
{% if plugin.restricted and plugin.module not in request.event.settings.allowed_restricted_plugins %}
<p class="text-muted">
<span class="fa fa-info-circle" aria-hidden="true"></span>
{% trans "This plugin needs to be enabled by a system administrator for your account." %}
</p>
{% endif %}
{% if plugin.app.compatibility_errors %}
<div class="alert alert-warning">
{% trans "This plugin cannot be enabled for the following reasons:" %}
<ul>
{% for e in plugin.app.compatibility_errors %}
<li>{{ e }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if plugin.app.compatibility_warnings %}
<div class="alert alert-warning">
{% trans "This plugin reports the following problems:" %}
<ul>
{% for e in plugin.app.compatibility_warnings %}
<li>{{ e }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
@@ -1,8 +1,15 @@
{% extends "pretixcontrol/event/settings_base.html" %}
{% load i18n %}
{% load static %}
{% load bootstrap3 %}
{% block inside %}
<h1>{% trans "Installed plugins" %}</h1>
<h1>{% trans "Available plugins" %}</h1>
<p>
{% blocktrans trimmed %}
On this page, you can choose plugins you want to enable for your event. Plugins might bring additional
software functionality, connect your event to third-party services, or apply other forms of customizations.
{% endblocktrans %}
</p>
<form action="" method="post" class="form-horizontal form-plugins">
{% csrf_token %}
{% if "success" in request.GET %}
@@ -11,71 +18,71 @@
</div>
{% endif %}
<div class="tabbed-form">
{% for cat, catlabel, plist in plugins %}
{% for cat, catlabel, plist, has_pictures in plugins %}
<fieldset>
<legend>{{ catlabel }}</legend>
<div class="table-responsive">
<table class="table">
{% for plugin in plist %}
<tr class="{% if plugin.app.compatibility_errors %}warning{% elif plugin.module in plugins_active %}success{% else %}default{% endif %}">
<td>
<strong>{{ plugin.name }}</strong>
{% if plugin.author %}
<p class="meta text-muted">
{% blocktrans trimmed with v=plugin.version a=plugin.author %}
Version {{ v }} by <em>{{ a }}</em>
{% endblocktrans %}</p>
{% else %}
<p class="meta text-muted">
{% blocktrans trimmed with v=plugin.version a=plugin.author %}
Version {{ v }}
{% endblocktrans %}</p>
<div class="plugin-list">
{% for plugin in plist %}
<div class="plugin-container {% if plugin.featured %}featured-plugin{% endif %}">
{% if plugin.featured %}
<div class="panel panel-default">
<div class="panel-body">
{% endif %}
<div class="plugin-text">
{% if plugin.featured or plugin.experimental %}
<p class="text-muted">
{% if plugin.featured %}
<span class="fa fa-thumbs-up" aria-hidden="true"></span>
{% trans "Top recommendation" %}
{% endif %}
{% if plugin.experimental %}
<span class="fa fa-flask" aria-hidden="true"></span>
{% trans "Experimental feature" %}
{% endif %}
</p>
{% endif %}
<p>{{ plugin.description }}</p>
{% if plugin.restricted and plugin.module not in request.event.settings.allowed_restricted_plugins %}
<span class="text-muted">
{% trans "This plugin needs to be enabled by a system administrator for your account." %}
</span>
{% if plugin.picture %}
<p><img src="{% static plugin.picture %}" class="plugin-picture"></p>
{% endif %}
<h4>
{{ plugin.name }}
{% if show_meta %}
<span class="text-muted text-sm">{{ plugin.version }}</span>
{% endif %}
{% if plugin.module in plugins_active %}
<span class="label label-success">
<span class="fa fa-check" aria-hidden="true"></span>
{% trans "Active" %}
</span>
{% endif %}
</h4>
{% include "pretixcontrol/event/fragment_plugin_description.html" with plugin=plugin %}
</div>
{% if plugin.app.compatibility_errors %}
<div class="alert alert-warning">
{% trans "This plugin cannot be enabled for the following reasons:" %}
<ul>
{% for e in plugin.app.compatibility_errors %}
<li>{{ e }}</li>
{% endfor %}
</ul>
<div class="plugin-action">
<span class="text-muted">{% trans "Incompatible" %}</span>
</div>
{% elif plugin.restricted and plugin.module not in request.event.settings.allowed_restricted_plugins %}
<div class="plugin-action">
<span class="text-muted">{% trans "Not available" %}</span>
</div>
{% elif plugin.module in plugins_active %}
<div class="plugin-action flip">
<button class="btn btn-default{% if plugin.featured %} btn-lg{% endif %}" name="plugin:{{ plugin.module }}"
value="disable">{% trans "Disable" %}</button>
</div>
{% else %}
<div class="plugin-action flip">
<button class="btn btn-primary{% if plugin.featured %} btn-lg{% endif %}" name="plugin:{{ plugin.module }}"
value="enable">{% trans "Enable" %}</button>
</div>
{% endif %}
{% if plugin.app.compatibility_warnings %}
<div class="alert alert-warning">
{% trans "This plugin reports the following problems:" %}
<ul>
{% for e in plugin.app.compatibility_warnings %}
<li>{{ e }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
</td>
<td class="text-right flip" width="20%">
{% if plugin.app.compatibility_errors %}
<button class="btn disabled btn-block btn-default"
disabled="disabled">{% trans "Incompatible" %}</button>
{% elif plugin.restricted and plugin.module not in request.event.settings.allowed_restricted_plugins %}
<button class="btn disabled btn-block btn-default"
disabled="disabled">{% trans "Not available" %}</button>
{% elif plugin.module in plugins_active %}
<button class="btn btn-default btn-block" name="plugin:{{ plugin.module }}"
value="disable">{% trans "Disable" %}</button>
{% else %}
<button class="btn btn-default btn-block" name="plugin:{{ plugin.module }}"
value="enable">{% trans "Enable" %}</button>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% if plugin.featured %}
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
</fieldset>
{% endfor %}
@@ -202,10 +202,12 @@
</div>
{% bootstrap_field position.form.operation_cancel layout='inline' %}
{% bootstrap_field position.form.operation_split layout='inline' %}
{% if position.form.operation_split %}
{% bootstrap_field position.form.operation_split layout='inline' %}
{% endif %}
{% if position.addons.exists %}
<em class="text-danger">
{% trans "Removing this position will also remove all add-ons to this position." %}
{% trans "Removing or splitting this position will also remove or split all add-ons to this position." %}
</em>
{% endif %}
</div>
@@ -8,6 +8,7 @@
{% block content %}
<h1>
{% trans "Refund order" %}
<small class="text-muted">{{ full_refund|money:request.event.currency }}</small>
<a class="btn btn-link btn-lg"
href="{% url "control:event.order" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}">
{% blocktrans trimmed with order=order.code %}
@@ -11,7 +11,8 @@
{% endif %}
</h1>
{% for e in exporters %}
<details class="panel panel-default" {% if "identifier" in request.GET or "exporter" in request.POST %}open{% endif %}>
<details class="panel panel-default"
{% if request.GET.identifier == e.identifier or request.POST.exporter == e.identifier %}open{% endif %}>
<summary class="panel-heading">
<h3 class="panel-title">
{{ e.verbose_name }}
@@ -23,7 +23,7 @@
</script>
<div class="row">
<div class="col-md-9">
<div class="panel panel-default">
<div class="panel panel-default panel-pdf-editor">
<div class="panel-heading">
<div class="pull-right flip">
<div class="btn-group">
@@ -48,6 +48,8 @@
{% trans "Editor" %}
</div>
<div class="panel-body">
<ul class="nav nav-pills" id="page_nav">
</ul>
<div id="editor-canvas-area">
<canvas id="pdf-canvas"
data-pdf-url="{{ pdf }}"
@@ -193,7 +195,7 @@
<span class="btn btn-default fileinput-button background-button">
<i class="fa fa-upload"></i>
<span>{% trans "Upload custom background" %}</span>
<input id="fileupload" type="file" name="background">
<input id="fileupload" type="file" name="background" accept="application/pdf">
</span>
</div>
<div class="col-sm-12 help-inline">
@@ -204,6 +206,14 @@
{% endblocktrans %}
</p>
</div>
<div class="col-sm-12">
<p>
<a class="btn btn-default background-download-button" href="{{ pdf }}" target="_blank">
<i class="fa fa-download"></i>
<span>{% trans "Download current background" %}</span>
</a>
</p>
</div>
</div>
<div class="row control-group pdf-info">
<div class="col-sm-12">
@@ -357,9 +367,9 @@
</select>
</div>
</div>
<div class="row control-group text">
<div class="row control-group text textcontent">
<div class="col-sm-12">
<label>{% trans "Text content" %}</label><br>
<label>{% trans "Content" %}</label><br>
<select class="input-block-level form-control" id="toolbox-content">
{% for varname, var in variables.items %}
<option data-sample="{{ var.editor_sample }}" value="{{ varname }}">{{ var.label }}</option>
@@ -374,10 +384,16 @@
{% trans "Item attribute:" %} {{ p.name }}
</option>
{% endfor %}
<option value="other_i18n">{% trans "Other… (multilingual)" %}</option>
<option value="other">{% trans "Other…" %}</option>
</select>
<textarea type="text" value="" class="input-block-level form-control"
id="toolbox-content-other"></textarea>
<div class="i18n-form-group" id="toolbox-content-other-i18n">
{% for l in request.event.settings.locales %}
<textarea id="toolbox-content-other-{{ l }}" rows="3" class="input-block-level form-control" title="{{ l }}" lang="{{ l }}"></textarea>
{% endfor %}
</div>
</div>
</div>
</div>
@@ -401,13 +417,20 @@
<span class="fa fa-qrcode"></span>
{% trans "QR code for Lead Scanning" %}
</button>
<button class="btn btn-default btn-block" id="editor-add-qrcode-other"
data-content="secret"
disabled>
<span class="fa fa-qrcode"></span>
{% trans "Other QR code" %}
</button>
<button class="btn btn-default btn-block" id="editor-add-poweredby"
data-content="dark"
disabled>
<span class="fa fa-image"></span>
{% trans "pretix Logo" %}
</button>
<button class="btn btn-default btn-block" id="editor-add-image" disabled>
<button class="btn btn-default btn-block" id="editor-add-image" disabled
data-toggle="tooltip" title="{% trans "You can use this to add user-uploaded pictures from questions or pictures generated by plugins. If you want to embed a logo or other images, use a custom background instead." %}">
<span class="fa fa-image"></span>
{% trans "Dynamic image" %}
</button>
+19 -6
View File
@@ -92,6 +92,7 @@ from ...base.i18n import language
from ...base.models.items import (
Item, ItemCategory, ItemMetaProperty, Question, Quota,
)
from ...base.services.mail import TolerantDict
from ...base.settings import SETTINGS_AFFECTING_CSS, LazyI18nStringList
from ..logdisplay import OVERVIEW_BANLIST
from . import CreateView, PaginationMixin, UpdateView
@@ -327,15 +328,27 @@ class EventPlugins(EventSettingsViewMixin, EventPermissionRequiredMixin, Templat
'FORMAT': _('Output and export formats'),
'API': _('API features'),
}
plugins_grouped = groupby(
sorted(
plugins,
key=lambda p: (
str(getattr(p, 'category', _('Other'))),
(0 if getattr(p, 'featured', False) else 1),
str(p.name).lower().replace('pretix ', '')
),
),
lambda p: str(getattr(p, 'category', _('Other')))
)
plugins_grouped = [(c, list(plist)) for c, plist in plugins_grouped]
context['plugins'] = sorted([
(c, labels.get(c, c), list(plist))
(c, labels.get(c, c), plist, any(getattr(p, 'picture', None) for p in plist))
for c, plist
in groupby(
sorted(plugins, key=lambda p: str(getattr(p, 'category', _('Other')))),
lambda p: str(getattr(p, 'category', _('Other')))
)
in plugins_grouped
], key=lambda c: (order.index(c[0]), c[1]) if c[0] in order else (999, str(c[1])))
context['plugins_active'] = self.object.get_plugins()
context['show_meta'] = settings.PRETIX_PLUGINS_SHOW_META
return context
def get(self, request, *args, **kwargs):
@@ -729,7 +742,7 @@ class MailSettingsRendererPreview(MailSettingsPreview):
def get(self, request, *args, **kwargs):
v = str(request.event.settings.mail_text_order_placed)
v = v.format_map(self.placeholders('mail_text_order_placed'))
v = v.format_map(TolerantDict(self.placeholders('mail_text_order_placed')))
renderers = request.event.get_html_mail_renderers()
if request.GET.get('renderer') in renderers:
with rolledback_transaction():
+2
View File
@@ -243,6 +243,8 @@ class MailSettingsSetupView(TemplateView):
messages.success(request, _('Your changes have been saved.'))
return redirect(self.get_success_url())
else:
self.smtp_form._unmask_secret_fields()
backend = get_connection(
backend=settings.EMAIL_CUSTOM_SMTP_BACKEND,
host=self.smtp_form.cleaned_data['smtp_host'],
+3 -2
View File
@@ -265,8 +265,6 @@ class EventWizard(SafeSessionWizardView):
event.has_subevents = foundation_data['has_subevents']
event.testmode = True
form_dict['basics'].save()
event.set_active_plugins(settings.PRETIX_PLUGINS_DEFAULT.split(","), allow_restricted=settings.PRETIX_PLUGINS_DEFAULT.split(","))
event.save(update_fields=['plugins'])
event.log_action(
'pretix.event.added',
user=self.request.user,
@@ -299,6 +297,9 @@ class EventWizard(SafeSessionWizardView):
elif self.clone_from:
event.copy_data_from(self.clone_from)
else:
event.set_active_plugins(settings.PRETIX_PLUGINS_DEFAULT.split(","),
allow_restricted=settings.PRETIX_PLUGINS_DEFAULT.split(","))
event.save(update_fields=['plugins'])
event.checkin_lists.create(
name=_('Default'),
all_products=True
+4 -2
View File
@@ -1123,6 +1123,7 @@ class OrderRefundView(OrderView):
return render(self.request, 'pretixcontrol/order/refund_choose.html', {
'payments': payments,
'new_refunds': new_refunds,
'full_refund': full_refund,
'remainder': to_refund,
'order': self.order,
'comment': comment,
@@ -1760,7 +1761,7 @@ class OrderChange(OrderView):
if p.form.cleaned_data['tax_rule'] and p.form.cleaned_data['tax_rule'] != p.tax_rule:
ocm.change_tax_rule(p, p.form.cleaned_data['tax_rule'])
if p.form.cleaned_data['operation_split']:
if p.form.cleaned_data.get('operation_split'):
ocm.split(p)
if p.form.cleaned_data['operation_secret']:
@@ -2229,8 +2230,9 @@ class ExportMixin:
def exporters(self):
exporters = []
responses = register_data_exporters.send(self.request.event)
id = self.request.GET.get("identifier") or self.request.POST.get("exporter")
for ex in sorted([response(self.request.event, self.request.organizer) for r, response in responses if response], key=lambda ex: str(ex.verbose_name)):
if self.request.GET.get("identifier") and ex.identifier != self.request.GET.get("identifier"):
if id and ex.identifier != id:
continue
# Use form parse cycle to generate useful defaults
+17 -4
View File
@@ -23,6 +23,7 @@ import json
import logging
import mimetypes
from datetime import timedelta
from decimal import Decimal
from io import BytesIO
from django.conf import settings
@@ -38,7 +39,8 @@ from django.utils.crypto import get_random_string
from django.utils.timezone import now
from django.utils.translation import gettext as _
from django.views.generic import TemplateView
from PyPDF2 import PdfFileWriter
from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.utils import PdfReadError
from reportlab.lib.units import mm
from pretix.base.i18n import language
@@ -82,15 +84,15 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
return None, f
def _get_preview_position(self):
item = self.request.event.items.create(name=_("Sample product"), default_price=42.23,
item = self.request.event.items.create(name=_("Sample product"), default_price=Decimal('42.23'),
description=_("Sample product description"))
item2 = self.request.event.items.create(name=_("Sample workshop"), default_price=23.40)
item2 = self.request.event.items.create(name=_("Sample workshop"), default_price=Decimal('23.40'))
from pretix.base.models import Order
order = self.request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(),
email='sample@pretix.eu',
locale=self.request.event.settings.locale,
expires=now(), code="PREVIEW1234", total=119)
expires=now(), code="PREVIEW1234", total=Decimal('119.00'))
scheme = PERSON_NAME_SCHEMES[self.request.event.settings.name_scheme]
sample = {k: str(v) for k, v in scheme['sample'].items()}
@@ -191,6 +193,17 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView):
c.file = fileobj
c.save()
c.refresh_from_db()
try:
bg_bytes = c.file.read()
PdfFileReader(BytesIO(bg_bytes), strict=False)
except PdfReadError as e:
return JsonResponse({
"status": "error",
"error": _('Unfortunately, we were unable to process this PDF file ({reason}).').format(
reason=str(e)
)
})
return JsonResponse({
"status": "ok",
"id": c.id,
+2 -1
View File
@@ -399,7 +399,8 @@ class User2FADeviceConfirmWebAuthnView(RecentAuthenticationRequiredMixin, Templa
ukey,
self.request.user.email,
str(self.request.user),
settings.SITE_URL
settings.SITE_URL,
attestation="none"
)
ctx['jsondata'] = json.dumps(make_credential_options.registration_dict)
+1 -1
View File
@@ -166,7 +166,7 @@ class UserAnonymizeView(AdministratorPermissionRequiredMixin, RecentAuthenticati
self.object.fullname = ""
self.object.is_active = False
self.object.notifications_send = False
self.object.auth_backend = None
self.object.auth_backend = 'anonymized'
self.object.auth_backend_identifier = None
self.object.save()
for le in self.object.all_logentries.filter(action_type="pretix.user.settings.changed"):
+39 -1
View File
@@ -19,11 +19,17 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import pyuca
from babel.core import Locale
from django.core.cache import cache
from django.utils import translation
from django_countries import Countries
from django_countries.fields import CountryField
from phonenumbers.data import _COUNTRY_CODE_TO_REGION_CODE
from pretix.base.i18n import get_language_without_region
from pretix.base.i18n import get_babel_locale, get_language_without_region
_collator = pyuca.Collator()
class CachedCountries(Countries):
@@ -83,3 +89,35 @@ class FastCountryField(CountryField):
*self._check_multiple(),
*self._check_max_length_attribute(**kwargs),
]
_cached_phone_prefixes = {}
def get_phone_prefixes_sorted_and_localized():
language = get_babel_locale() # changed from default implementation that used the django locale
cache_key = "phoneprefixes:all:{}".format(language)
if cache_key in _cached_phone_prefixes:
return _cached_phone_prefixes[cache_key]
val = cache.get(cache_key)
if val:
_cached_phone_prefixes[cache_key] = val
return val
val = []
locale = Locale(translation.to_locale(language))
for prefix, values in _COUNTRY_CODE_TO_REGION_CODE.items():
prefix = "+%d" % prefix
for country_code in values:
country_name = locale.territories.get(country_code)
if country_name:
val.append((prefix, "{} {}".format(country_name, prefix)))
val = sorted(val, key=lambda item: _collator.sort_key(item[1]))
_cached_phone_prefixes[cache_key] = val
cache.set(cache_key, val, 3600 * 24 * 30)
return val
+21
View File
@@ -0,0 +1,21 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
+35
View File
@@ -0,0 +1,35 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
DATE_INPUT_FORMATS = [
"%d-%m-%Y",
"%Y-%m-%d",
"%m/%d/%Y",
"%m/%d/%y",
"%b %d %Y",
"%b %d, %Y",
"%d %b %Y",
"%d %b, %Y",
"%B %d %Y",
"%B %d, %Y",
"%d %B %Y",
"%d %B, %Y"
]
+134
View File
@@ -0,0 +1,134 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import re
from inspect import isgenerator
from openpyxl import Workbook
from openpyxl.cell.cell import (
ILLEGAL_CHARACTERS_RE, KNOWN_TYPES, TIME_TYPES, TYPE_FORMULA, TYPE_STRING,
Cell,
)
from openpyxl.compat import NUMERIC_TYPES
from openpyxl.utils import column_index_from_string
from openpyxl.utils.exceptions import ReadOnlyWorkbookException
from openpyxl.worksheet._write_only import WriteOnlyWorksheet
from openpyxl.worksheet.worksheet import Worksheet
SAFE_TYPES = NUMERIC_TYPES + TIME_TYPES + (bool, type(None))
"""
This module provides a safer version of openpyxl's `Workbook` class to generate XLSX files from
user-generated data using `WriteOnlyWorksheet` and `ws.append()`. We commonly use these methods
to output e.g. order data, which contains data from untrusted sources such as attendee names.
There are mainly two problems this solves:
- It makes sure strings starting with = are treated as text, not as a formula, as openpyxl will
otherwise assume, which can be used for remote code execution.
- It removes characters considered invalid by Excel to avoid exporter crashes.
"""
def remove_invalid_excel_chars(val):
if isinstance(val, Cell):
return val
if not isinstance(val, KNOWN_TYPES):
val = str(val)
if isinstance(val, bytes):
val = val.decode("utf-8", errors="ignore")
if isinstance(val, str):
val = re.sub(ILLEGAL_CHARACTERS_RE, '', val)
return val
def SafeCell(*args, value=None, **kwargs):
value = remove_invalid_excel_chars(value)
c = Cell(*args, value=value, **kwargs)
if c.data_type == TYPE_FORMULA:
c.data_type = TYPE_STRING
return c
class SafeAppendMixin:
def append(self, iterable):
row_idx = self._current_row + 1
if isinstance(iterable, (list, tuple, range)) or isgenerator(iterable):
for col_idx, content in enumerate(iterable, 1):
if isinstance(content, Cell):
# compatible with write-only mode
cell = content
if cell.parent and cell.parent != self:
raise ValueError("Cells cannot be copied from other worksheets")
cell.parent = self
cell.column = col_idx
cell.row = row_idx
else:
cell = SafeCell(self, row=row_idx, column=col_idx, value=remove_invalid_excel_chars(content))
self._cells[(row_idx, col_idx)] = cell
elif isinstance(iterable, dict):
for col_idx, content in iterable.items():
if isinstance(col_idx, str):
col_idx = column_index_from_string(col_idx)
cell = SafeCell(self, row=row_idx, column=col_idx, value=content)
self._cells[(row_idx, col_idx)] = cell
else:
self._invalid_row(iterable)
self._current_row = row_idx
class SafeWriteOnlyWorksheet(SafeAppendMixin, WriteOnlyWorksheet):
pass
class SafeWorksheet(SafeAppendMixin, Worksheet):
pass
class SafeWorkbook(Workbook):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self._sheets:
# monkeypatch existing sheets
for s in self._sheets:
s.append = SafeAppendMixin.append
def create_sheet(self, title=None, index=None):
if self.read_only:
raise ReadOnlyWorkbookException('Cannot create new sheet in a read-only workbook')
if self.write_only:
new_ws = SafeWriteOnlyWorksheet(parent=self, title=title)
else:
new_ws = SafeWorksheet(parent=self, title=title)
self._add_sheet(sheet=new_ws, index=index)
return new_ws
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-09-15 11:22+0000\n"
"Last-Translator: Mohamed Tawfiq <mtawfiq@wafyapp.com>\n"
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -358,56 +358,52 @@ msgstr "أضف شرطا"
msgid "minutes"
msgstr "الدقائق"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "قم بمسح QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "QR الدخول"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "لا يمكن تحميل ملف PDF الخلفية للأسباب التالية:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "مجموعة من العناصر"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "عنصر نص"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "منطقة باركود"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "منطقة صورة"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "مدعوم من pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "عنصر"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "تصميم التذكرة"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "فشلت عملية الحفظ."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "حصل خطأ أثناء رفع ملف PDF الخاص بك، يرجى المحاولة مرة أخرى."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "هل تريد أن تغادر المحرر دون حفظ التعديلات؟"
@@ -535,20 +531,20 @@ msgstr "ستسترد %(currency)%(amount)"
msgid "Please enter the amount the organizer can keep."
msgstr "الرجاء إدخال المبلغ الذي يمكن للمنظم الاحتفاظ به."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "الرجاء إدخال عدد لأحد أنواع التذاكر."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "مطلوب"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "المنطقة الزمنية:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "التوقيت المحلي:"
@@ -828,6 +824,9 @@ msgstr "نوفمبر"
msgid "December"
msgstr "ديسمبر"
#~ msgid "Lead Scan QR"
#~ msgstr "قم بمسح QR"
#~ msgid "Invalid product"
#~ msgstr "منتج غير ساري المفعول"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2020-12-19 07:00+0000\n"
"Last-Translator: albert <albert.serra.monner@gmail.com>\n"
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -343,56 +343,52 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Disseny del tiquet"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -510,22 +506,22 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Cistella expirada"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-12-06 23:00+0000\n"
"Last-Translator: Ondřej Sokol <osokol@treesoft.cz>\n"
"Language-Team: Czech <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -355,56 +355,52 @@ msgstr "Přidat podmínku"
msgid "minutes"
msgstr "minuty"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Lead Scan QR kód"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check-in QR kód"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Pozadí PDF nemohl být načten:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Skupina objektů"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Textový objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Oblast s QR kódem"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Oblast obrazu"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Poháněno společností pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Design vstupenky"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Uložení se nepodařilo."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Při nahrávání souboru PDF došlo k problému, zkuste to prosím znovu."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Opravdu chcete opustit editor bez uložení změn?"
@@ -528,20 +524,20 @@ msgstr "Dostanete %(currency)s %(amount)s zpět"
msgid "Please enter the amount the organizer can keep."
msgstr "Zadejte částku, kterou si organizátor může ponechat."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Zadejte prosím množství pro jeden z typů vstupenek."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "povinný"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Časové pásmo:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Místní čas:"
@@ -821,6 +817,9 @@ msgstr "Listopad"
msgid "December"
msgstr "Prosinec"
#~ msgid "Lead Scan QR"
#~ msgstr "Lead Scan QR kód"
#~ msgid "Invalid product"
#~ msgstr "Neplatný produkt"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-09-13 09:48+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -383,58 +383,54 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check-in QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Baggrunds-pdf'en kunne ikke hentes af følgende grund:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Gruppe af objekter"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Tekstobjekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "QR-kode-område"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "QR-kode-område"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Drevet af pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Billetdesign"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Gem fejlede."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Fejl under upload af pdf. Prøv venligt igen."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Er du sikker på at du vil forlade editoren uden at gemme dine ændringer?"
@@ -563,22 +559,22 @@ msgstr "fra %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Kurv udløbet"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Tidszone:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Din lokaltid:"
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-10-25 15:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -358,57 +358,53 @@ msgstr "Bedingung hinzufügen"
msgid "minutes"
msgstr "Minuten"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Lead-Scanning-QR-Code"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check-in-QR-Code"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Die Hintergrund-PDF-Datei konnte nicht geladen werden:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Gruppe von Objekten"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Text-Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "QR-Code-Bereich"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Bildbereich"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Event-Ticketshop von pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Ticket-Design"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Speichern fehlgeschlagen."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Es gab ein Problem beim Hochladen der PDF-Datei, bitte erneut versuchen."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Möchten Sie den Editor wirklich schließen ohne Ihre Änderungen zu speichern?"
@@ -532,20 +528,20 @@ msgstr "Sie erhalten %(currency)s %(amount)s zurück"
msgid "Please enter the amount the organizer can keep."
msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "verpflichtend"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Deine lokale Zeit:"
@@ -825,6 +821,9 @@ msgstr "November"
msgid "December"
msgstr "Dezember"
#~ msgid "Lead Scan QR"
#~ msgstr "Lead-Scanning-QR-Code"
#~ msgid "Invalid product"
#~ msgstr "Ungültiges Produkt"
+2
View File
@@ -78,6 +78,7 @@ Edge
Eingangsscan
Einlassbuchung
Einlassdatum
Einlasskontrolle
Einlassuhrzeit
email
Enterprise
@@ -252,6 +253,7 @@ Teammitglied
Teamname
Telephone
Ticketing
To
Tokengenerator
Toolbar
TODO
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-10-25 15:40+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
@@ -357,57 +357,53 @@ msgstr "Bedingung hinzufügen"
msgid "minutes"
msgstr "Minuten"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Lead-Scanning-QR-Code"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check-in-QR-Code"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Die Hintergrund-PDF-Datei konnte nicht geladen werden:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Gruppe von Objekten"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Text-Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "QR-Code-Bereich"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Bildbereich"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Event-Ticketshop von pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objekt"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Ticket-Design"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Speichern fehlgeschlagen."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Es gab ein Problem beim Hochladen der PDF-Datei, bitte erneut versuchen."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Möchtest du den Editor wirklich schließen ohne Ihre Änderungen zu speichern?"
@@ -531,20 +527,20 @@ msgstr "Du erhältst %(currency)s %(amount)s zurück"
msgid "Please enter the amount the organizer can keep."
msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Bitte trage eine Menge für eines der Produkte ein."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "verpflichtend"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Deine lokale Zeit:"
@@ -824,6 +820,9 @@ msgstr "November"
msgid "December"
msgstr "Dezember"
#~ msgid "Lead Scan QR"
#~ msgstr "Lead-Scanning-QR-Code"
#~ msgid "Invalid product"
#~ msgstr "Ungültiges Produkt"
@@ -78,6 +78,7 @@ Edge
Eingangsscan
Einlassbuchung
Einlassdatum
Einlasskontrolle
Einlassuhrzeit
email
Enterprise
@@ -252,6 +253,7 @@ Teammitglied
Teamname
Telephone
Ticketing
To
Tokengenerator
Toolbar
TODO
+1098 -1023
View File
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -342,56 +342,52 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -505,20 +501,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2019-10-03 19:00+0000\n"
"Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n"
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -390,59 +390,55 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Οδηγός σάρωσης QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Έλεγχος QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
"Το αρχείο φόντου PDF δεν ήταν δυνατό να φορτωθεί για τον ακόλουθο λόγο:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Ομάδα αντικειμένων"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Αντικείμενο κειμένου"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Περιοχή Barcode"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Περιοχή Barcode"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Υποστηρίζεται από το Pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Αντικείμενο"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Σχεδιασμός εισιτηρίων"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Η αποθήκευση απέτυχε."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Σφάλμα κατά τη μεταφόρτωση του αρχείου PDF, δοκιμάστε ξανά."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Θέλετε πραγματικά να αφήσετε τον επεξεργαστή χωρίς να αποθηκεύσετε τις "
@@ -575,22 +571,22 @@ msgstr "απο %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Το καλάθι έληξε"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
@@ -872,6 +868,9 @@ msgstr "Νοέμβριος"
msgid "December"
msgstr "Δεκέμβριος"
#~ msgid "Lead Scan QR"
#~ msgstr "Οδηγός σάρωσης QR"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-11-25 21:00+0000\n"
"Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -355,59 +355,55 @@ msgstr "Añadir condición"
msgid "minutes"
msgstr "minutos"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Escanear QR de clientes potenciales"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "QR de Chequeo"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
"El archivo PDF de fondo no ha podido ser cargado debido al siguiente motivo:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Grupo de objetos"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Objeto de texto"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Área para código de barras"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Área de imagen"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Proveído por pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objeto"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Diseño del ticket"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "El guardado falló."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Ha habido un error mientras se cargaba el archivo PDF, por favor, intente de "
"nuevo."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "¿Realmente desea salir del editor sin haber guardado sus cambios?"
@@ -529,20 +525,20 @@ msgstr "Obtienes %(currency)s %(price)s de vuelta"
msgid "Please enter the amount the organizer can keep."
msgstr "Por favor, ingrese el monto que el organizador puede quedarse."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Por favor, introduzca un valor para cada tipo de entrada."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "campo requerido"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Zona horaria:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Su hora local:"
@@ -823,6 +819,9 @@ msgstr "Noviembre"
msgid "December"
msgstr "Diciembre"
#~ msgid "Lead Scan QR"
#~ msgstr "Escanear QR de clientes potenciales"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-11-10 05:00+0000\n"
"Last-Translator: Jaakko Rinta-Filppula <jaakko@r-f.fi>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -359,58 +359,54 @@ msgstr "Lisää ehto"
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Tekstiobjekti"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Viivakoodialue"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Viivakoodialue"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Tallennus epäonnistui."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -528,22 +524,22 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Ostoskori on vanhentunut"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Aikavyöhyke:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-12-04 01:00+0000\n"
"Last-Translator: Eva-Maria Obermann <obermann@rami.io>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -383,61 +383,57 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Balayage du QR code"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Enregistrement QR code"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
"Le fichier PDF généré en arrière-plan n'a pas pu être chargé pour la raison "
"suivante :"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Groupe d'objets"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Objet texte"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Zone de code-barres"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Zone de code-barres"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Propulsé par pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objet"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Conception des billets"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "L'enregistrement a échoué."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Erreur lors du téléchargement de votre fichier PDF, veuillez réessayer."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Voulez-vous vraiment quitter l'éditeur sans sauvegarder vos modifications ?"
@@ -567,22 +563,22 @@ msgstr "de %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "SVP entrez une quantité pour un de vos types de billets."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Panier expiré"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
@@ -863,6 +859,9 @@ msgstr "Novembre"
msgid "December"
msgstr "Décembre"
#~ msgid "Lead Scan QR"
#~ msgstr "Balayage du QR code"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2022-02-22 22:00+0000\n"
"Last-Translator: Ismael Menéndez Fernández <ismael.menendez@balidea.com>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -355,57 +355,53 @@ msgstr "Engadir condición"
msgid "minutes"
msgstr "minutos"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Escanear QR de clientela potencial"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "QR de validación"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "O arquivo PDF de fondo non se puido cargar polo motivo seguinte:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Grupo de obxectos"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Obxecto de texto"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Área para código de barras"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Área de imaxe"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Desenvolto por Pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Obxecto"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Deseño do tícket"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "O gardado fallou."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Houbo un erro mentres se cargaba o arquivo PDF. Por favor, inténteo de novo."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Realmente desexa saír do editor sen gardar os cambios?"
@@ -526,20 +522,20 @@ msgstr "Obtés %(currency)s %(price)s de volta"
msgid "Please enter the amount the organizer can keep."
msgstr "Por favor, ingrese a cantidade que pode conservar o organizador."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Por favor, introduza un valor para cada tipo de entrada."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "campo requirido"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Zona horaria:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "A súa hora local:"
@@ -818,3 +814,6 @@ msgstr "Novembro"
#: pretix/static/pretixpresale/js/widget/widget.js:78
msgid "December"
msgstr "Decembro"
#~ msgid "Lead Scan QR"
#~ msgstr "Escanear QR de clientela potencial"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-09-24 13:54+0000\n"
"Last-Translator: ofirtro <ofir.tro@gmail.com>\n"
"Language-Team: Hebrew <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -346,56 +346,52 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -513,20 +509,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2020-01-24 08:00+0000\n"
"Last-Translator: Prokaj Miklós <mixolid0@gmail.com>\n"
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -383,58 +383,54 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "QR Scan"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check in QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "A PDF háttér fájl nem tölthető be a következők miatt:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "tárgy csoport"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Szöveg"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Vonalkód terület"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Vonalkód terület"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "pretix által működtetett"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "objektum"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Jegy design"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Mentés sikertelen."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Hiba a PDF fájl feltöltése közben, próbálja újra."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Biztosan ki akar lépni a szerkesztőből a változtatások mentése nélkül?"
@@ -563,22 +559,22 @@ msgstr "%(currency) %(price)-tól"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Adjon meg egy mennyiséget az egyik jegytípusból."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "A kosár lejárt"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
@@ -859,6 +855,9 @@ msgstr "November"
msgid "December"
msgstr "December"
#~ msgid "Lead Scan QR"
#~ msgstr "QR Scan"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+22 -23
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"PO-Revision-Date: 2022-02-21 08:00+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2022-02-28 23:00+0000\n"
"Last-Translator: Emanuele Signoretta <signorettae@gmail.com>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
"js/it/>\n"
@@ -355,56 +355,52 @@ msgstr "Aggiungi condizione"
msgid "minutes"
msgstr "minuti"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Scansiona QR del lead"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Check-in con QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Il file PDF di sfondo non può essere caricato per le seguenti ragioni:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Gruppo di oggetti"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Oggetto testo"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Area codice a barra"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Area immagini"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Powered by Pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Oggetto"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Design biglietto"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Salvataggio fallito."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Errore durante il caricamento del tuo file PDF, prova di nuovo."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Vuoi davvero abbandonare l'editor senza salvare le modifiche?"
@@ -522,20 +518,20 @@ msgstr "Ricevi indietro %(currency)s %(amount)s"
msgid "Please enter the amount the organizer can keep."
msgstr "Inserisci l'importo che l'organizzatore può trattenere."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Inserisci la quantità per una tipologia di biglietto."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "richiesto"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Fuso orario:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Ora locale:"
@@ -815,6 +811,9 @@ msgstr "Novembre"
msgid "December"
msgstr "Dicembre"
#~ msgid "Lead Scan QR"
#~ msgstr "Scansiona QR del lead"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+29 -34
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"PO-Revision-Date: 2022-01-19 21:00+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2022-03-15 00:00+0000\n"
"Last-Translator: Yuriko Matsunami <y.matsunami@enobyte.com>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
"js/ja/>\n"
@@ -180,7 +180,7 @@ msgstr "チケットコードのブロック/変更"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Order canceled"
msgstr "注文の取消し"
msgstr "注文がキャンセルされました"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Checked-in Tickets"
@@ -354,56 +354,52 @@ msgstr "条件を追加"
msgid "minutes"
msgstr "分"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "QRコード読み込み"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "チェックイン用QRコード"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "以下の理由によりPDFファイルの読み込みに失敗しました:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "オブジェクトグループ"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "テキストオブジェクト"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "バーコードエリア"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "画像エリア"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Pretixのイベントチケット売り場"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "オブジェクト"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "チケットのデザイン"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "保存できませんでした。"
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "PDFのアップロード中に問題が発生しました。再試行してください。"
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "変更内容を保存せずに編集を終了しますか?"
@@ -508,33 +504,31 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "カート内の商品の予約は {num} 分以内に完了します。"
#: pretix/static/pretixpresale/js/ui/main.js:144
#, fuzzy
msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "イベント開催者には%(currency)s %(amount)sが与えられます"
msgstr "催者には%(currency)s %(amount)sが与えられます"
#: pretix/static/pretixpresale/js/ui/main.js:152
#, fuzzy
msgid "You get %(currency)s %(amount)s back"
msgstr "お客様には %(currency)s %(amount)s が払い戻されます"
msgstr "%(currency)s %(amount)s が払い戻されます"
#: pretix/static/pretixpresale/js/ui/main.js:168
msgid "Please enter the amount the organizer can keep."
msgstr "イベント開催者が受け取る料金を入力してください。"
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "商品の総数を入力してください。"
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "必須"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "タイムゾーン:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "現地時間:"
@@ -600,10 +594,10 @@ msgid "Only available with a voucher"
msgstr "クーポンをお持ちの方のみ"
#: pretix/static/pretixpresale/js/widget/widget.js:29
#, fuzzy, javascript-format
#, javascript-format
msgctxt "widget"
msgid "minimum amount to order: %s"
msgstr "ご注文いただける最小値%s"
msgstr "最小注文数量%s"
#: pretix/static/pretixpresale/js/widget/widget.js:30
msgctxt "widget"
@@ -688,10 +682,9 @@ msgid "Continue"
msgstr "続ける"
#: pretix/static/pretixpresale/js/widget/widget.js:47
#, fuzzy
msgctxt "widget"
msgid "See variations"
msgstr "他の種類を見る"
msgstr "バリエーションを確認する"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgctxt "widget"
@@ -729,10 +722,9 @@ msgid "Previous week"
msgstr "前週"
#: pretix/static/pretixpresale/js/widget/widget.js:55
#, fuzzy
msgctxt "widget"
msgid "Open seat selection"
msgstr "ルームプランを開く"
msgstr "座席一覧を開く"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgctxt "widget"
@@ -814,3 +806,6 @@ msgstr "11月"
#: pretix/static/pretixpresale/js/widget/widget.js:78
msgid "December"
msgstr "12月"
#~ msgid "Lead Scan QR"
#~ msgstr "QRコード読み込み"
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-12-09 15:49+0000\n"
"Last-Translator: Ilona Zilgalve <i.zilgalve@riga-jurmala.com>\n"
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
@@ -356,57 +356,53 @@ msgstr "Pievienot nosacījumu"
msgid "minutes"
msgstr "minūtes"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "Galvenās skenēšanas QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "Reģistrācijas QR"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Fona PDF fails nevarēja ielādēties sekojoša iemesla dēļ:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Objektu grupa"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Teksta objekts"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Svītru koda lauks"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Attēla lauks"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Pretix atbalstīts"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Objekts"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Biļetes dizains"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Saglabāšana neizdevās."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
"Radusies kļūda augšupielādējot jūsu PDF failu, lūdzu, mēģiniet vēlreiz."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
"Vai jūs tiešām vēlaties iziet no rediģēšanas lauka bez veikto izmaiņu "
@@ -530,20 +526,20 @@ msgstr "Jūs saņemsiet %(valūta)s %(cena)s atpakaļ"
msgid "Please enter the amount the organizer can keep."
msgstr "Lūdzu ievadiet skaitu (summu), ko pasākuma organizators var paturēt."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
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."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "obligāts"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Laika zona:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Vietējais laiks:"
@@ -824,6 +820,9 @@ msgstr "Novembris"
msgid "December"
msgstr "Decembris"
#~ msgid "Lead Scan QR"
#~ msgstr "Galvenās skenēšanas QR"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-05-31 11:26+0000\n"
"Last-Translator: zackern <zacker@zacker.no>\n"
"Language-Team: Norwegian Bokmål <https://translate.pretix.eu/projects/pretix/"
@@ -354,56 +354,52 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -517,20 +513,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+21 -22
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-10-29 02:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -353,56 +353,52 @@ msgstr "Voorwaarde toevoegen"
msgid "minutes"
msgstr "minuten"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "QR-code voor lead-scanning"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "QR-code voor check-in"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr "Het PDF-achtergrondbestand kon niet geladen worden met als reden:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Groep van objecten"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Tekstobject"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Barcode gebied"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Afbeeldingsgebied"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Mogelijk gemaakt door pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Object"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Ticketontwerp"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Opslaan mislukt."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Probleem bij het uploaden van het PDF-bestand, probeer het opnieuw."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Wilt u de editor verlaten zonder uw wijzigingen op te slaan?"
@@ -522,20 +518,20 @@ msgstr "U krijgt %(currency)s %(amount)s terug"
msgid "Please enter the amount the organizer can keep."
msgstr "Voer het bedrag in dat de organisator mag houden."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Voer een hoeveelheid voor een van de producten in."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "verplicht"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Uw lokale tijd:"
@@ -817,6 +813,9 @@ msgstr "November"
msgid "December"
msgstr "December"
#~ msgid "Lead Scan QR"
#~ msgstr "QR-code voor lead-scanning"
#~ msgid "Invalid product"
#~ msgstr "Ongeldig product"
File diff suppressed because it is too large Load Diff
+18 -22
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -341,56 +341,52 @@ msgstr ""
msgid "minutes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
@@ -504,20 +500,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-25 10:05+0000\n"
"POT-Creation-Date: 2022-03-21 15:59+0000\n"
"PO-Revision-Date: 2021-08-05 04:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
@@ -357,57 +357,53 @@ msgstr "Voorwaarde toevoegen"
msgid "minutes"
msgstr "minuten"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr "QR-code voor lead-scanning"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr "QR-code voor check-in"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
#: pretix/static/pretixcontrol/js/ui/editor.js:376
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
"Het PDF-achtergrondbestand kon niet geladen worden om de volgende reden:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
#: pretix/static/pretixcontrol/js/ui/editor.js:615
msgid "Group of objects"
msgstr "Groep van objecten"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
#: pretix/static/pretixcontrol/js/ui/editor.js:621
msgid "Text object"
msgstr "Tekstobject"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
#: pretix/static/pretixcontrol/js/ui/editor.js:623
msgid "Barcode area"
msgstr "Barcodegebied"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#: pretix/static/pretixcontrol/js/ui/editor.js:625
msgid "Image area"
msgstr "Afbeeldingsgebied"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
#: pretix/static/pretixcontrol/js/ui/editor.js:627
msgid "Powered by pretix"
msgstr "Mogelijk gemaakt door pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
#: pretix/static/pretixcontrol/js/ui/editor.js:629
msgid "Object"
msgstr "Object"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
#: pretix/static/pretixcontrol/js/ui/editor.js:633
msgid "Ticket design"
msgstr "Kaartjesontwerp"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
#: pretix/static/pretixcontrol/js/ui/editor.js:923
msgid "Saving failed."
msgstr "Opslaan mislukt."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
#: pretix/static/pretixcontrol/js/ui/editor.js:973
#: pretix/static/pretixcontrol/js/ui/editor.js:1012
msgid "Error while uploading your PDF file, please try again."
msgstr "Probleem bij het uploaden van het PDF-bestand, probeer het opnieuw."
#: pretix/static/pretixcontrol/js/ui/editor.js:886
#: pretix/static/pretixcontrol/js/ui/editor.js:997
msgid "Do you really want to leave the editor without saving your changes?"
msgstr "Wil je de editor verlaten zonder je wijzigingen op te slaan?"
@@ -532,20 +528,20 @@ msgstr "Jij krijgt %(currency)s %(amount)s terug"
msgid "Please enter the amount the organizer can keep."
msgstr "Voer het bedrag in dat de organisator mag houden."
#: pretix/static/pretixpresale/js/ui/main.js:361
#: pretix/static/pretixpresale/js/ui/main.js:364
msgid "Please enter a quantity for one of the ticket types."
msgstr "Voer een hoeveelheid voor een van de producten in."
#: pretix/static/pretixpresale/js/ui/main.js:397
#: pretix/static/pretixpresale/js/ui/main.js:400
msgid "required"
msgstr "verplicht"
#: pretix/static/pretixpresale/js/ui/main.js:500
#: pretix/static/pretixpresale/js/ui/main.js:519
#: pretix/static/pretixpresale/js/ui/main.js:503
#: pretix/static/pretixpresale/js/ui/main.js:522
msgid "Time zone:"
msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:510
#: pretix/static/pretixpresale/js/ui/main.js:513
msgid "Your local time:"
msgstr "Je lokale tijd:"
@@ -827,6 +823,9 @@ msgstr "November"
msgid "December"
msgstr "December"
#~ msgid "Lead Scan QR"
#~ msgstr "QR-code voor lead-scanning"
#, fuzzy
#~| msgid "Check-in QR"
#~ msgid "Check-in result"
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