Compare commits

..

97 Commits

Author SHA1 Message Date
Richard Schreiber 39db3650ad fix isort 2021-12-21 10:37:53 +01:00
Richard Schreiber 81ea417e02 add short_month_day_format 2021-12-21 10:18:39 +01:00
Richard Schreiber 0bf7bba6ba Fix: WEEK_FORMAT fallback in calender week-views (#2391)
* switch to context-week_format for fallback-handling

* set week_format fallback to en instead of de

* add french WEEK_FORMAT and WEEK_DAY_FORMAT
2021-12-21 10:10:13 +01:00
Raphael Michel 7090e0bae2 Event settings: Do not specify fields as optional that are actually required 2021-12-20 19:20:48 +01:00
Raphael Michel c75cb0b8e3 Cookie consent: Fail softly if localStorage is unavailable 2021-12-20 16:11:33 +01:00
Raphael Michel 3dbf22f670 Remove django-compat from settings.py 2021-12-20 12:22:13 +01:00
Raphael Michel f26cbdc257 Bump arabic-reshaper to 2.1.3 2021-12-20 09:52:38 +01:00
Raphael Michel 6b4adccee5 Bump django-hijack to 3.1.* 2021-12-20 09:51:52 +01:00
Raphael Michel c2a8286022 Fix celery-specific issue in 9f4b834ab 2021-12-16 19:06:16 +01:00
Martin Gross 4145887a9b Web checkin: Redirect user to login if session expired (#2383)
Co-authored-by: Raphael Michel <michel@rami.io>
2021-12-16 18:35:09 +01:00
Raphael Michel 9f4b834abc Allow to attach files to order confirmation email (#2384)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2021-12-16 18:34:18 +01:00
Richard Schreiber 8fcc314f09 Add fixed scroll position when navigating calendar views (Z#177488) (#2385)
* add fixed scroll position when navigating calendar views

* change from local to sessionStorage

* add check for sessionStorage
2021-12-16 13:36:10 +01:00
Felix Rindt 94a7d02ab1 Fix event settings form considered changed even if unchanged (#1739)
Co-authored-by: Raphael Michel <michel@rami.io>
2021-12-16 11:27:18 +01:00
Raphael Michel ad2943263c Fix unnecessary override of default settings 2021-12-16 10:31:46 +01:00
Raphael Michel 5210ac3a78 Reduce confusion about customer login with event level domains (#2380) 2021-12-15 16:47:08 +01:00
Raphael Michel 0e9600a7bf Fix test isolation issue 2021-12-15 16:46:50 +01:00
ser8phin eccba09452 Add payment search page (#2335)
Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2021-12-15 16:06:43 +01:00
Richard Schreiber c8a830ecde Fix: change widget to use new date-based URLs in calendar-view (#2382) 2021-12-15 14:07:42 +01:00
Richard Schreiber aed64d16f6 Improve calendar-navigation on organizer and events page (Z#177488) (#2373)
* hide icons for calendar-types and improve layout-breakpoints in calendar top-nav

* change month-selector to one dropdown "date"and redirect old URLs to new date-based URLs

* change week calendar to one dropdown "date“ and redirect old URLs to new date-based URLs
2021-12-14 16:38:32 +01:00
Raphael Michel d16f6167f6 Fix rich_text crash on empty <a> element 2021-12-14 13:56:52 +01:00
Raphael Michel 77d59248e5 Translations: Update Galician
Currently translated at 1.3% (61 of 4565 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
Raphael Michel a0e05f8af6 Translations: Update Galician
Currently translated at 1.1% (52 of 4565 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
Raphael Michel 9b8a47c8b8 Translations: Update Galician
Currently translated at 1.1% (52 of 4565 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
Ismael Menéndez Fernández b3d692276c Translations: Update Galician
Currently translated at 1.1% (52 of 4565 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
DJG Bayern 55543e12f6 Translated on translate.pretix.eu (Japanese)
Currently translated at 7.5% (13 of 172 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
Yuriko Matsunami 1e16185c02 Translated on translate.pretix.eu (Japanese)
Currently translated at 7.5% (13 of 172 strings)

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

powered by weblate
2021-12-14 13:30:11 +01:00
Raphael Michel cd900e24bd Questions form: Do not persist values to questions hidden by dependencies 2021-12-13 15:46:58 +01:00
Raphael Michel 0dbedc07ce Fix CI dependency installation (#2376) 2021-12-13 15:24:27 +01:00
Raphael Michel f71877b7fc Badges: Fix event copy data receiver not rewriting questions 2021-12-13 14:09:38 +01:00
Martin Gross f69e270e4d Add filter for revoked devices (#2372)
Co-authored-by: Raphael Michel <michel@rami.io>
2021-12-13 12:47:43 +01:00
MrGamy 533939cae4 included missing adjective
fixes #2344
2021-12-10 19:29:45 +01:00
Ilona Zilgalve 91ec5fd78c Translated on translate.pretix.eu (Latvian)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/lv/

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve 0056fb447b Translations: Update Latvian
Currently translated at 31.1% (1421 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve 20c4d12e98 Translations: Update Russian
Currently translated at 25.1% (1147 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve e13c567e84 Translations: Update Latvian
Currently translated at 28.3% (1296 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve 9fef97a7c6 Translations: Update Russian
Currently translated at 24.9% (1139 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve e68a995376 Translations: Update Latvian
Currently translated at 27.5% (1256 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve 6abdb40ef5 Translations: Update Latvian
Currently translated at 27.4% (1252 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ilona Zilgalve 43cc06b0a1 Translations: Update Russian
Currently translated at 24.4% (1115 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Ondřej Sokol d17476cd75 Translated on translate.pretix.eu (Czech)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/cs/

powered by weblate
2021-12-09 16:54:15 +01:00
Ondřej Sokol 5c3bfd2a71 Translations: Update Czech
Currently translated at 10.5% (482 of 4565 strings)

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

powered by weblate
2021-12-09 16:54:15 +01:00
Maico Timmerman 033b8d70e7 Email: Allow to override backend for custom SMTP connections (#2368) 2021-12-09 16:49:22 +01:00
Raphael Michel bd22c2afc9 Set OrderRefund.execution_date on manual refund 2021-12-08 09:41:12 +01:00
Raphael Michel b355733f53 Allow to link directly to voucher input form 2021-12-06 18:09:38 +01:00
Raphael Michel e1f924c4ce Allow to reschedule a missed email 2021-12-06 17:36:49 +01:00
Raphael Michel 8038f4e173 Orders API: Allow to filter by subevent 2021-12-06 12:50:33 +01:00
Raphael Michel 5c55219d45 Allow to create new customers in backend (#2367) 2021-12-06 12:27:21 +01:00
Eva-Maria Obermann bfd37af467 Translated on translate.pretix.eu (French)
Currently translated at 63.3% (109 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/fr/

powered by weblate
2021-12-06 12:27:12 +01:00
Eva-Maria Obermann b2509e120c Translations: Update German
Currently translated at 100.0% (4565 of 4565 strings)

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

powered by weblate
2021-12-06 12:27:12 +01:00
ExtremeX-BB e2339acd09 Translated on translate.pretix.eu (Chinese (Simplified))
Currently translated at 68.0% (117 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/zh_Hans/

powered by weblate
2021-12-06 12:27:12 +01:00
ExtremeX-BB c15b4fa03c Translations: Update Chinese (Simplified)
Currently translated at 66.2% (3025 of 4565 strings)

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

powered by weblate
2021-12-06 12:27:12 +01:00
Ilona Zilgalve c4aa2e0484 Translations: Update Latvian
Currently translated at 27.0% (1235 of 4565 strings)

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

powered by weblate
2021-12-06 12:27:12 +01:00
Ilona Zilgalve 361eeb7159 Translations: Update Russian
Currently translated at 24.4% (1114 of 4565 strings)

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

powered by weblate
2021-12-06 12:27:12 +01:00
Raphael Michel 0109e1806f OrderChangeManager: Move invoice reissuing after payment cancellation (#2359) 2021-12-06 12:26:53 +01:00
Raphael Michel 30aadac099 Fix isort change 2021-12-03 15:02:46 +01:00
dependabot[bot] 0458f1b2dc Bump @babel/preset-env from 7.16.0 to 7.16.4 in /src/pretix/static/npm_dir (#2360)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-03 14:40:06 +01:00
dependabot[bot] e006ca3feb Bump @rollup/plugin-node-resolve from 11.2.1 to 13.0.6 in /src/pretix/static/npm_dir (#2361)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-03 14:39:27 +01:00
dependabot[bot] 1f31ee2ea1 Bump rollup from 2.59.0 to 2.60.2 in /src/pretix/static/npm_dir (#2362)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-03 14:39:02 +01:00
Richard Schreiber 2d37b0df77 Fix: Day calendar - scroll current .tick into view without window being scrolled (#2365) 2021-12-03 14:36:28 +01:00
Raphael Michel 4133e5ac4d Fix incorrect order change tests 2021-12-03 14:08:19 +01:00
Richard Schreiber 0fd3d0fe71 Fix #2363 – Email: change text-alignment from center to left (right for rtl) (#2364) 2021-12-03 13:44:06 +01:00
Raphael Michel d0685e99ad Return URL: Append error/success message to query 2021-12-03 10:30:33 +01:00
Raphael Michel c6fd5bc864 Self-service order change: Fix price constraints not actually being enforced 2021-12-03 10:04:07 +01:00
Raphael Michel 9fa935099f Email rules: Show warning when date was missed 2021-12-03 09:36:54 +01:00
Raphael Michel 83b5a325e3 Fix bug in 832235411 2021-11-30 22:52:34 +01:00
pretix translation bot 97e12c5003 Translations update from Weblate (#2356)
Co-authored-by: Raphael Michel <michel@rami.io>
2021-11-30 17:55:32 +01:00
Raphael Michel e6db8340f2 Extend German spellcheck wordlist 2021-11-30 17:52:02 +01:00
Raphael Michel 3cf9caa5d3 Add "analytics" to wordlist 2021-11-30 17:26:28 +01:00
Ilona Zilgalve 2ffd68ace7 Translated on translate.pretix.eu (Latvian)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/lv/

powered by weblate
2021-11-30 17:26:12 +01:00
Ilona Zilgalve 0231be63b4 Translations: Update Latvian
Currently translated at 27.1% (1232 of 4537 strings)

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

powered by weblate
2021-11-30 17:26:12 +01:00
Ilona Zilgalve fae8bc254e Translations: Update Russian
Currently translated at 24.5% (1113 of 4537 strings)

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

powered by weblate
2021-11-30 17:26:12 +01:00
Tonda Pavlík 1d5c700fa2 Translations: Update Czech
Currently translated at 10.4% (474 of 4537 strings)

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

powered by weblate
2021-11-30 17:26:12 +01:00
Raphael Michel e61775d5c1 Update po files
[CI skip]

Signed-off-by: Raphael Michel <michel@rami.io>
2021-11-30 17:13:43 +01:00
Raphael Michel e767c6a68d Add central cookie consent mechanism (#2330)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
2021-11-30 17:12:17 +01:00
Raphael Michel 832235411f Add subevent location to order info in emails (#2354) 2021-11-30 13:21:36 +01:00
Raphael Michel 1f0f7b752f Payment provider API: Add confirm_button_name 2021-11-29 20:54:24 +01:00
Raphael Michel 3117eceb72 Validate VAT ID when changing invoice addresses 2021-11-29 20:36:20 +01:00
Raphael Michel c1b39782fd Bump to 4.6.0.dev0 2021-11-29 15:47:08 +01:00
Raphael Michel 860cfc3227 Bump version to 4.5.0 2021-11-29 15:46:42 +01:00
pretix translation bot 45859a07dd Translations update from Weblate (#2352)
Co-authored-by: Raphael Michel <michel@rami.io>
2021-11-29 10:35:24 +01:00
dependabot[bot] 04fb8efc0d Update flake8 requirement from ==3.7.* to >=3.7,<4.1 in /src
Updates the requirements on [flake8](https://github.com/pycqa/flake8) to permit the latest version.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/3.7.0...4.0.1)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-29 09:53:14 +01:00
Raphael Michel fdb8a3720b Update po files
[CI skip]

Signed-off-by: Raphael Michel <michel@rami.io>
2021-11-29 09:28:15 +01:00
Raphael Michel 5638d68894 Raise some dependencies 2021-11-29 09:27:24 +01:00
Raphael Michel f64042280a Tighten dependency ranges 2021-11-29 09:27:24 +01:00
Angel Saiz Velasco 50060cdc8d Translations: Update Spanish
Currently translated at 66.7% (2992 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Ismael Menéndez Fernández 4499f58e3d Translated on translate.pretix.eu (Galician)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/gl/

powered by weblate
2021-11-29 09:19:44 +01:00
Ismael Menéndez Fernández 918e4a5a89 Translations: Update Galician
Currently translated at 0.7% (33 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Ismael Menéndez Fernández 15a86fd796 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (172 of 172 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/es/

powered by weblate
2021-11-29 09:19:44 +01:00
Ismael Menéndez Fernández 4126d20f1c Translations: Update Spanish
Currently translated at 66.6% (2986 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Eva-Maria Obermann ea3edf83f8 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (4483 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Eva-Maria Obermann 9a42819b56 Translations: Update German
Currently translated at 100.0% (4483 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Marco Giacopuzzi 3e4ba28700 Translated on translate.pretix.eu (Italian)
Currently translated at 100.0% (172 of 172 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Marco Giacopuzzi 9014ffcc28 Translations: Update Italian
Currently translated at 17.1% (770 of 4483 strings)

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

powered by weblate
2021-11-29 09:19:44 +01:00
Raphael Michel 48f4bcf88c Fix breaking multi-event exporters 2021-11-23 17:07:39 +01:00
Raphael Michel b7dfb3697e Widget: Fix price box not shown for free-price events with one product 2021-11-23 11:13:09 +01:00
Richard Schreiber 475a5be351 Day calendar: Fix missing current-time-bar back for all browsers (#2342) 2021-11-22 15:12:51 +01:00
Richard Schreiber 8254d8f5cc Day-Calendar: improve width of row-names (#2341) 2021-11-22 15:09:40 +01:00
174 changed files with 65699 additions and 48779 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ jobs:
restore-keys: |
${{ runner.os }}-pip-
- name: Install system dependencies
run: sudo apt update && sudo apt install gettext mysql-client
run: sudo apt update && sudo apt install gettext mariadb-client
- name: Install Python dependencies
run: pip3 install -e ".[dev]" mysqlclient psycopg2-binary
working-directory: ./src
+3 -1
View File
@@ -445,8 +445,10 @@ You can configure the maximum file size for uploading various files::
max_size_image = 12
; Max upload size for favicons in MiB, defaults to 1 MiB
max_size_favicon = 2
; Max upload size for email attachments in MiB, defaults to 10 MiB
; Max upload size for email attachments of manually sent emails in MiB, defaults to 10 MiB
max_size_email_attachment = 15
; Max upload size for email attachments of automatically sent emails in MiB, defaults to 1 MiB
max_size_email_auto_attachment = 2
; Max upload size for other files in MiB, defaults to 10 MiB
; This includes all file upload type order questions
max_size_other = 100
+2 -1
View File
@@ -97,7 +97,8 @@ For example, if you want users to be redirected to ``https://example.org/order/r
either enter ``https://example.org`` or ``https://example.org/order/``.
The user will be redirected back to your page instead of pretix' order confirmation page after the payment,
**regardless of whether it was successful or not**. Make sure you use our API to check if the payment actually
**regardless of whether it was successful or not**. We will append an ``error=…`` query parameter with an error
message, but you should not rely on that and instead make sure you use our API to check if the payment actually
worked! Your final URL could look like this::
https://test.pretix.eu/democon/3vjrh/order/NSLEZ/ujbrnsjzbq4dzhck/pay/123/?return_url=https%3A%2F%2Fexample.org%2Forder%2Freturn%3Ftx_id%3D1234
+5
View File
@@ -132,6 +132,10 @@ last_modified datetime Last modificati
The ``item`` and ``variation`` query parameters have been added.
.. versionchanged:: 4.6
The ``subevent`` query parameters has been added.
.. _order-position-resource:
@@ -433,6 +437,7 @@ List of all orders
recommend using this in combination with ``testmode=false``, since test mode orders can vanish at any time and
you will not notice it using this method.
:query datetime created_since: Only return orders that have been created since the given date.
:query integer subevent: Only return orders with a position that contains this subevent ID. *Warning:* Result will also include orders if they contain mixed subevents, and it will even return orders where the subevent is only contained in a canceled position.
:query datetime subevent_after: Only return orders that contain a ticket for a subevent taking place after the given date. This is an exclusive after, and it considers the **end** of the subevent (or its start, if the end is not set).
:query datetime subevent_before: Only return orders that contain a ticket for a subevent taking place after the given date. This is an exclusive before, and it considers the **start** of the subevent.
:query string exclude: Exclude a field from the output, e.g. ``fees`` or ``positions.downloads``. Can be used as a performance optimization. Can be passed multiple times.
+1 -1
View File
@@ -2,7 +2,7 @@ Algorithms
==========
The business logic inside pretix is full of complex algorithms making decisions based on all the hundreds of settings
and input parameters available. Some of them are documented here as graphs, either because fully understanding them is very
and input parameters available. Some of them are documented here as graphs, either because fully understanding them is very important
when working on features close to them, or because they also need to be re-implemented by client-side components like our
ticket scanning apps and we want to ensure the implementations are as similar as possible to avoid confusion.
+119
View File
@@ -0,0 +1,119 @@
.. highlight:: python
:linenothreshold: 5
.. _`cookieconsent`:
Handling cookie consent
=======================
pretix includes an optional feature to handle cookie consent explicitly to comply with EU regulations.
If your plugin sets non-essential cookies or includes a third-party service that does so, you should
integrate with this feature.
Server-side integration
-----------------------
First, you need to declare that you are using non-essential cookies by responding to the following
signal:
.. automodule:: pretix.presale.signals
:members: register_cookie_providers
You are expected to return a list of ``CookieProvider`` objects instantiated from the following class:
.. class:: pretix.presale.cookies.CookieProvider
.. py:attribute:: CookieProvider.identifier
A short and unique identifier used to distinguish this cookie provider form others (required).
.. py:attribute:: CookieProvider.provider_name
A human-readable name of the entity of feature responsible for setting the cookie (required).
.. py:attribute:: CookieProvider.usage_classes
A list of enum values from the ``pretix.presale.cookies.UsageClass`` enumeration class, such as
``UsageClass.ANALYTICS``, ``UsageClass.MARKETING``, or ``UsageClass.SOCIAL`` (required).
.. py:attribute:: CookieProvider.privacy_url
A link to a privacy policy (optional).
Here is an example of such a receiver:
.. code-block:: python
@receiver(register_cookie_providers)
def recv_cookie_providers(sender, request, **kwargs):
return [
CookieProvider(
identifier='google_analytics',
provider_name='Google Analytics',
usage_classes=[UsageClass.ANALYTICS],
)
]
JavaScript-side integration
---------------------------
The server-side integration only causes the cookie provider to show up in the cookie dialog. You still
need to care about actually enforcing the consent state.
You can access the consent state through the ``window.pretix.cookie_consent`` variable. Whenever the
value changes, a ``pretix:cookie-consent:change`` event is fired on the ``document`` object.
The variable will generally have one of the following states:
.. rst-class:: rest-resource-table
================================================================ =====================================================
State Interpretation
================================================================ =====================================================
``pretix === undefined || pretix.cookie_consent === undefined`` Your JavaScript has loaded before the cookie consent
script. Wait for the event to be fired, then try again,
do not yet set a cookie.
``pretix.cookie_consent === null`` The cookie consent mechanism has not been enabled. This
usually means that you can set cookies however you like.
``pretix.cookie_consent[identifier] === undefined`` The cookie consent mechanism is loaded, but has no data
on your cookie yet, wait for the event to be fired, do not
yet set a cookie.
``pretix.cookie_consent[identifier] === true`` The user has consented to your cookie.
``pretix.cookie_consent[identifier] === false`` The user has actively rejected your cookie.
================================================================ =====================================================
If you are integrating e.g. a tracking provider with native cookie consent support such
as Facebook's Pixel, you can integrate it like this:
.. code-block:: javascript
var consent = (window.pretix || {}).cookie_consent;
if (consent !== null && !(consent || {}).facebook) {
fbq('consent', 'revoke');
}
fbq('init', ...);
document.addEventListener('pretix:cookie-consent:change', function (e) {
fbq('consent', (e.detail || {}).facebook ? 'grant' : 'revoke');
})
If you have a JavaScript function that you only want to load if consent for a specific ``identifier``
is given, you can wrap it like this:
.. code-block:: javascript
var consent_identifier = "youridentifier";
var consent = (window.pretix || {}).cookie_consent;
if (consent === null || (consent || {})[consent_identifier] === true) {
// Cookie consent tool is either disabled or consent is given
addScriptElement(src);
return;
}
// Either cookie consent tool has not loaded yet or consent is not given
document.addEventListener('pretix:cookie-consent:change', function onChange(e) {
var consent = e.detail || {};
if (consent === null || consent[consent_identifier] === true) {
addScriptElement(src);
document.removeEventListener('pretix:cookie-consent:change', onChange);
}
})
+1
View File
@@ -17,6 +17,7 @@ Contents:
shredder
import
customview
cookieconsent
auth
general
quality
+2
View File
@@ -62,6 +62,8 @@ The provider class
.. autoattribute:: public_name
.. autoattribute:: confirm_button_name
.. autoattribute:: is_enabled
.. autoattribute:: priority
+4
View File
@@ -309,6 +309,10 @@ Currently, the following attributes are understood by pretix itself:
always be modified. Note that this is not a security feature and can easily be overridden by users, so do not rely
on this for authentication.
* If ``data-consent="…"`` is given, the cookie consent mechanism will be initialized with consent for the given cookie
providers. All other providers will be disabled, no consent dialog will be shown. This is useful if you already
asked the user for consent and don't want them to be asked again. Example: ``data-consent="facebook,google_analytics"``
Any configured pretix plugins might understand more data fields. For example, if the appropriate plugins on pretix
Hosted or pretix Enterprise are active, you can pass the following fields:
+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.5.0.dev0"
__version__ = "4.6.0.dev0"
+1
View File
@@ -94,6 +94,7 @@ with scopes_disabled():
search = django_filters.CharFilter(method='search_qs')
item = django_filters.CharFilter(field_name='all_positions', lookup_expr='item_id')
variation = django_filters.CharFilter(field_name='all_positions', lookup_expr='variation_id')
subevent = django_filters.CharFilter(field_name='all_positions', lookup_expr='subevent_id')
class Meta:
model = Order
+16 -15
View File
@@ -25,6 +25,7 @@ from datetime import timedelta
from decimal import Decimal
from itertools import groupby
from smtplib import SMTPResponseException
from typing import TypeVar
import css_inline
from django.conf import settings
@@ -49,23 +50,23 @@ from pretix.base.templatetags.rich_text import markdown_compile_email
logger = logging.getLogger('pretix.base.email')
T = TypeVar("T", bound=EmailBackend)
class CustomSMTPBackend(EmailBackend):
def test(self, from_addr):
try:
self.open()
self.connection.ehlo_or_helo_if_needed()
(code, resp) = self.connection.mail(from_addr, [])
if code != 250:
logger.warn('Error testing mail settings, code %d, resp: %s' % (code, resp))
raise SMTPResponseException(code, resp)
(code, resp) = self.connection.rcpt('testdummy@pretix.eu')
if (code != 250) and (code != 251):
logger.warn('Error testing mail settings, code %d, resp: %s' % (code, resp))
raise SMTPResponseException(code, resp)
finally:
self.close()
def test_custom_smtp_backend(backend: T, from_addr: str) -> None:
try:
backend.open()
backend.connection.ehlo_or_helo_if_needed()
(code, resp) = backend.connection.mail(from_addr, [])
if code != 250:
logger.warning('Error testing mail settings, code %d, resp: %s' % (code, resp))
raise SMTPResponseException(code, resp)
(code, resp) = backend.connection.rcpt('testdummy@pretix.eu')
if (code != 250) and (code != 251):
logger.warning('Error testing mail settings, code %d, resp: %s' % (code, resp))
raise SMTPResponseException(code, resp)
finally:
backend.close()
class BaseHTMLMailRenderer:
+21
View File
@@ -118,6 +118,27 @@ class SettingsForm(i18nfield.forms.I18nFormMixin, HierarkeyForm):
self.cleaned_data[k] = self.initial[k]
return super().save()
def clean(self):
d = super().clean()
# There is logic in HierarkeyForm.save() to only persist fields that changed. HierarkeyForm determines if
# something changed by comparing `self._s.get(name)` to `value`. This leaves an edge case open for multi-lingual
# text fields. On the very first load, the initial value in `self._s.get(name)` will be a LazyGettextProxy-based
# string. However, only some of the languages are usually visible, so even if the user does not change anything
# at all, it will be considered a changed value and stored. We do not want that, as it makes it very hard to add
# languages to an organizer/event later on. So we trick it and make sure nothing gets changed in that situation.
for name, field in self.fields.items():
if isinstance(field, i18nfield.forms.I18nFormField):
value = d.get(name)
if not value:
continue
current = self._s.get(name, as_type=type(value))
if name not in self.changed_data:
d[name] = current
return d
def get_new_filename(self, name: str) -> str:
from pretix.base.models import Event
+11 -1
View File
@@ -869,6 +869,12 @@ class BaseQuestionsForm(forms.Form):
if question_is_required(q) and not answer and answer != 0 and not field.errors:
raise ValidationError({'question_%d' % q.pk: [_('This field is required.')]})
# Strip invisible question from cleaned_data so they don't end up in the database
for q in question_cache.values():
answer = d.get('question_%d' % q.pk)
if q.dependency_question_id and not question_is_visible(q.dependency_question_id, q.dependency_values) and answer is not None:
d['question_%d' % q.pk] = None
return d
@@ -1044,7 +1050,11 @@ class BaseInvoiceAddressForm(forms.ModelForm):
self.instance.vat_id_validated = True
self.instance.vat_id = normalized_id
except VATIDFinalError as e:
raise ValidationError(e.message)
if self.all_optional:
self.instance.vat_id_validated = False
messages.warning(self.request, e.message)
else:
raise ValidationError(e.message)
except VATIDTemporaryError as e:
self.instance.vat_id_validated = False
if self.request and self.vat_warning:
+9 -8
View File
@@ -670,16 +670,17 @@ class Event(EventMixin, LoggedModel):
Returns an email server connection, either by using the system-wide connection
or by returning a custom one based on the event's settings.
"""
from pretix.base.email import CustomSMTPBackend
if self.settings.smtp_use_custom or force_custom:
return CustomSMTPBackend(host=self.settings.smtp_host,
port=self.settings.smtp_port,
username=self.settings.smtp_username,
password=self.settings.smtp_password,
use_tls=self.settings.smtp_use_tls,
use_ssl=self.settings.smtp_use_ssl,
fail_silently=False, timeout=timeout)
return get_connection(backend=settings.EMAIL_CUSTOM_SMTP_BACKEND,
host=self.settings.smtp_host,
port=self.settings.smtp_port,
username=self.settings.smtp_username,
password=self.settings.smtp_password,
use_tls=self.settings.smtp_use_tls,
use_ssl=self.settings.smtp_use_ssl,
fail_silently=False,
timeout=timeout)
else:
return get_connection(fail_silently=False)
+5 -3
View File
@@ -950,7 +950,7 @@ class Order(LockModel, LoggedModel):
context: Dict[str, Any]=None, log_entry_type: str='pretix.event.order.email.sent',
user: User=None, headers: dict=None, sender: str=None, invoices: list=None,
auth=None, attach_tickets=False, position: 'OrderPosition'=None, auto_email=True,
attach_ical=False):
attach_ical=False, attach_other_files: list=None):
"""
Sends an email to the user that placed this order. Basically, this method does two things:
@@ -994,7 +994,8 @@ class Order(LockModel, LoggedModel):
recipient, subject, template, context,
self.event, self.locale, self, headers=headers, sender=sender,
invoices=invoices, attach_tickets=attach_tickets,
position=position, auto_email=auto_email, attach_ical=attach_ical
position=position, auto_email=auto_email, attach_ical=attach_ical,
attach_other_files=attach_other_files,
)
except SendMailException:
raise
@@ -2316,7 +2317,7 @@ class OrderPosition(AbstractPosition):
def send_mail(self, subject: str, template: Union[str, LazyI18nString],
context: Dict[str, Any]=None, log_entry_type: str='pretix.event.order.email.sent',
user: User=None, headers: dict=None, sender: str=None, invoices: list=None,
auth=None, attach_tickets=False, attach_ical=False):
auth=None, attach_tickets=False, attach_ical=False, attach_other_files: list=None):
"""
Sends an email to the attendee. Basically, this method does two things:
@@ -2357,6 +2358,7 @@ class OrderPosition(AbstractPosition):
invoices=invoices,
attach_tickets=attach_tickets,
attach_ical=attach_ical,
attach_other_files=attach_other_files,
)
except SendMailException:
raise
+9 -9
View File
@@ -36,6 +36,7 @@ import string
from datetime import date, datetime, time
import pytz
from django.conf import settings
from django.core.mail import get_connection
from django.core.validators import MinLengthValidator, RegexValidator
from django.db import models
@@ -195,16 +196,15 @@ class Organizer(LoggedModel):
Returns an email server connection, either by using the system-wide connection
or by returning a custom one based on the organizer's settings.
"""
from pretix.base.email import CustomSMTPBackend
if self.settings.smtp_use_custom or force_custom:
return CustomSMTPBackend(host=self.settings.smtp_host,
port=self.settings.smtp_port,
username=self.settings.smtp_username,
password=self.settings.smtp_password,
use_tls=self.settings.smtp_use_tls,
use_ssl=self.settings.smtp_use_ssl,
fail_silently=False, timeout=timeout)
return get_connection(backend=settings.EMAIL_CUSTOM_SMTP_BACKEND,
host=self.settings.smtp_host,
port=self.settings.smtp_port,
username=self.settings.smtp_username,
password=self.settings.smtp_password,
use_tls=self.settings.smtp_use_tls,
use_ssl=self.settings.smtp_use_ssl,
fail_silently=False, timeout=timeout)
else:
return get_connection(fail_silently=False)
+9
View File
@@ -191,6 +191,15 @@ class BasePaymentProvider:
"""
return self.verbose_name
@property
def confirm_button_name(self) -> str:
"""
A label for the "confirm" button on the last page before a payment is started. This
is **not** used in the regular checkout flow, but only if the payment method is selected
for an existing order later on.
"""
return _("Pay now")
@property
def identifier(self) -> str:
"""
+5
View File
@@ -273,6 +273,11 @@ class RelativeDateTimeField(forms.MultiValueField):
minutes_before=None
))
def has_changed(self, initial, data):
if initial is None:
initial = self.widget.decompress(initial)
return super().has_changed(initial, data)
def clean(self, value):
if value[0] == 'absolute' and not value[1]:
raise ValidationError(self.error_messages['incomplete'])
+23 -2
View File
@@ -35,6 +35,7 @@
import hashlib
import inspect
import logging
import mimetypes
import os
import re
import smtplib
@@ -51,6 +52,7 @@ from bs4 import BeautifulSoup
from celery import chain
from celery.exceptions import MaxRetriesExceededError
from django.conf import settings
from django.core.files.storage import default_storage
from django.core.mail import (
EmailMultiAlternatives, SafeMIMEMultipart, get_connection,
)
@@ -73,6 +75,7 @@ from pretix.base.services.tasks import TransactionAwareTask
from pretix.base.services.tickets import get_tickets_for_order
from pretix.base.signals import email_filter, global_email_filter
from pretix.celery_app import app
from pretix.helpers.hierarkey import clean_filename
from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.presale.ical import get_ical
@@ -94,7 +97,7 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La
context: Dict[str, Any] = None, event: Event = None, locale: str = None, order: Order = None,
position: OrderPosition = None, *, headers: dict = None, sender: str = None, organizer: Organizer = None,
customer: Customer = None, invoices: Sequence = None, attach_tickets=False, auto_email=True, user=None,
attach_ical=False, attach_cached_files: Sequence = None):
attach_ical=False, attach_cached_files: Sequence = None, attach_other_files: list=None):
"""
Sends out an email to a user. The mail will be sent synchronously or asynchronously depending on the installation.
@@ -142,6 +145,8 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La
:param attach_cached_files: A list of cached file to attach to this email.
:param attach_other_files: A list of file paths on our storage to attach.
:raises MailOrderException: on obvious, immediate failures. Not raising an exception does not necessarily mean
that the email has been sent, just that it has been queued by the email backend.
"""
@@ -301,6 +306,7 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La
organizer=organizer.pk if organizer else None,
customer=customer.pk if customer else None,
attach_cached_files=[(cf.id if isinstance(cf, CachedFile) else cf) for cf in attach_cached_files] if attach_cached_files else [],
attach_other_files=attach_other_files,
)
if invoices:
@@ -338,7 +344,8 @@ class CustomEmail(EmailMultiAlternatives):
def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: str, sender: str,
event: int = None, position: int = None, headers: dict = None, bcc: List[str] = None,
invoices: List[int] = None, order: int = None, attach_tickets=False, user=None,
organizer=None, customer=None, attach_ical=False, attach_cached_files: List[int] = None) -> bool:
organizer=None, customer=None, attach_ical=False, attach_cached_files: List[int] = None,
attach_other_files: List[str] = None) -> bool:
email = CustomEmail(subject, body, sender, to=to, bcc=bcc, headers=headers)
if html is not None:
html_message = SafeMIMEMultipart(_subtype='related', encoding=settings.DEFAULT_CHARSET)
@@ -455,6 +462,20 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st
logger.exception('Could not attach invoice to email')
pass
if attach_other_files:
for fname in attach_other_files:
ftype, _ = mimetypes.guess_type(fname)
data = default_storage.open(fname).read()
try:
email.attach(
clean_filename(os.path.basename(fname)),
data,
ftype
)
except:
logger.exception('Could not attach file to email')
pass
if attach_cached_files:
for cf in CachedFile.objects.filter(id__in=attach_cached_files):
if cf.file:
+10 -4
View File
@@ -941,7 +941,10 @@ def _order_placed_email(event: Event, order: Order, pprov: BasePaymentProvider,
log_entry,
invoices=[invoice] if invoice and event.settings.invoice_email_attachment else [],
attach_tickets=True,
attach_ical=event.settings.mail_attach_ical
attach_ical=event.settings.mail_attach_ical,
attach_other_files=[a for a in [
event.settings.get('mail_attachment_new_order', as_type=str, default='')[len('file://'):]
] if a],
)
except SendMailException:
logger.exception('Order received email could not be sent')
@@ -958,7 +961,10 @@ def _order_placed_email_attendee(event: Event, order: Order, position: OrderPosi
invoices=[],
attach_tickets=True,
position=position,
attach_ical=event.settings.mail_attach_ical
attach_ical=event.settings.mail_attach_ical,
attach_other_files=[a for a in [
event.settings.get('mail_attachment_new_order', as_type=str, default='')[len('file://'):]
] if a],
)
except SendMailException:
logger.exception('Order received email could not be sent to attendee')
@@ -2317,10 +2323,10 @@ class OrderChangeManager:
except TaxRule.SaleNotAllowed:
raise OrderError(self.error_messages['tax_rule_country_blocked'])
self._recalculate_total_and_payment_fee()
if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID):
self._reissue_invoice()
self._check_paid_price_change()
self._check_paid_to_free()
if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID):
self._reissue_invoice()
self._clear_tickets_cache()
self.order.touch()
self.order.create_transactions()
+41 -1
View File
@@ -136,11 +136,15 @@ DEFAULTS = {
'type': int,
'form_class': forms.IntegerField,
'serializer_class': serializers.IntegerField,
'serializer_kwargs': dict(
min_value=1,
),
'form_kwargs': dict(
min_value=1,
required=True,
label=_("Maximum number of items per order"),
help_text=_("Add-on products will not be counted.")
)
),
},
'display_net_prices': {
'default': 'False',
@@ -440,9 +444,11 @@ DEFAULTS = {
'type': int,
'form_class': forms.IntegerField,
'serializer_class': serializers.IntegerField,
'serializer_kwargs': dict(),
'form_kwargs': dict(
label=_("Minimum length of invoice number after prefix"),
help_text=_("The part of your invoice number after your prefix will be filled up with leading zeros up to this length, e.g. INV-001 or INV-00001."),
required=True,
)
},
'invoice_numbers_consecutive': {
@@ -506,6 +512,7 @@ DEFAULTS = {
MinValueValidator(12),
MaxValueValidator(64),
],
required=True,
widget=forms.NumberInput(
attrs={
'min': '12',
@@ -520,9 +527,13 @@ DEFAULTS = {
'type': int,
'form_class': forms.IntegerField,
'serializer_class': serializers.IntegerField,
'serializer_kwargs': dict(
min_value=0,
),
'form_kwargs': dict(
min_value=0,
label=_("Reservation period"),
required=True,
help_text=_("The number of minutes the items in a user's cart are reserved for this user."),
)
},
@@ -577,6 +588,7 @@ DEFAULTS = {
'form_kwargs': dict(
label=_("Set payment term"),
widget=forms.RadioSelect,
required=True,
choices=(
('days', _("in days")),
('minutes', _("in minutes"))
@@ -1091,9 +1103,13 @@ DEFAULTS = {
'type': int,
'serializer_class': serializers.IntegerField,
'form_class': forms.IntegerField,
'serializer_kwargs': dict(
min_value=1,
),
'form_kwargs': dict(
label=_("Waiting list response time"),
min_value=1,
required=True,
help_text=_("If a ticket voucher is sent to a person on the waiting list, it has to be redeemed within this "
"number of hours until it expires and can be re-assigned to the next person on the list."),
widget=forms.NumberInput(),
@@ -1687,6 +1703,30 @@ You can change your order details and view the status of your order at
Best regards,
Your {event} team"""))
},
'mail_attachment_new_order': {
'default': None,
'type': File,
'form_class': ExtFileField,
'form_kwargs': dict(
label=_('Attachment for new orders'),
ext_whitelist=(".pdf",),
max_size=settings.FILE_UPLOAD_MAX_SIZE_EMAIL_AUTO_ATTACHMENT,
help_text=_('This file will be attached to the first email that we send for every new order. Therefore it will be '
'combined with the "Placed order", "Free order", or "Received order" texts from above. It will be sent '
'to both order contacts and attendees. You can use this e.g. to send your terms of service. Do not use '
'it to send non-public information as this file might be sent before payment is confirmed or the order '
'is approved. To avoid this vital email going to spam, you can only upload PDF files of up to {size} MB.').format(
size=settings.FILE_UPLOAD_MAX_SIZE_EMAIL_AUTO_ATTACHMENT // (1024 * 1024),
)
),
'serializer_class': UploadedFileField,
'serializer_kwargs': dict(
allowed_types=[
'application/pdf'
],
max_size=settings.FILE_UPLOAD_MAX_SIZE_EMAIL_AUTO_ATTACHMENT,
)
},
'mail_send_order_placed_attendee': {
'type': bool,
'default': 'False'
@@ -85,9 +85,6 @@
-webkit-hyphens: auto;
hyphens: auto;
}
p:last-child {
margin-bottom: 0;
}
.footer {
padding: 10px;
@@ -116,6 +113,9 @@
width: 100%;
height: auto;
}
.content {
text-align: left;
}
.content table {
width: 100%;
@@ -142,7 +142,8 @@
}
.order-button {
padding-top: 5px
padding-top: 5px;
text-align: center;
}
.order-button a.button {
font-size: 12px;
@@ -173,7 +174,7 @@
body {
direction: rtl;
}
.content table td {
.content {
text-align: right;
}
{% endif %}
@@ -1,5 +1,6 @@
{% load eventurl %}
{% load i18n %}
{% load oneline %}
{% if position %}
<div class="order-info">
@@ -107,6 +108,10 @@
{% if event.settings.show_times %}
{{ groupkey.2.date_from|date:"TIME_FORMAT" }}
{% endif %}
{% if groupkey.2.location %}
<br>
{{ groupkey.2.location|oneline }}
{% endif %}
{% endif %}
{% if groupkey.3 %} {# attendee name #}
<br>
@@ -104,9 +104,6 @@
-webkit-hyphens: auto;
hyphens: auto;
}
p:last-child {
margin-bottom: 0;
}
.footer {
padding: 10px;
@@ -136,6 +133,10 @@
display: block;
}
.content {
text-align: left;
}
.content table {
width: 100%;
}
@@ -197,7 +198,7 @@
body {
direction: rtl;
}
.content table td {
.content {
text-align: right;
}
{% endif %}
+31
View File
@@ -0,0 +1,31 @@
#
# 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/>.
#
from django import template
register = template.Library()
@register.filter
def oneline(value):
if not value:
return ''
return ', '.join([l.strip() for l in str(value).splitlines() if l and l.strip()])
+3 -1
View File
@@ -138,7 +138,7 @@ def truelink_callback(attrs, new=False):
text = re.sub(r'[^a-zA-Z0-9.\-/_ ]', '', attrs.get('_text')) # clean up link text
url = attrs.get((None, 'href'), '/')
href_url = urllib.parse.urlparse(url)
if URL_RE.match(text) and href_url.scheme not in ('tel', 'mailto'):
if (None, 'href') in attrs and URL_RE.match(text) and href_url.scheme not in ('tel', 'mailto'):
# link text looks like a url
if text.startswith('//'):
text = 'https:' + text
@@ -157,6 +157,8 @@ def abslink_callback(attrs, new=False):
Makes sure that all links will be absolute links and will be opened in a new page with no
window.opener attribute.
"""
if (None, 'href') not in attrs:
return attrs
url = attrs.get((None, 'href'), '/')
if not url.startswith('mailto:') and not url.startswith('tel:'):
attrs[None, 'href'] = urllib.parse.urljoin(settings.SITE_URL, url)
+11 -2
View File
@@ -355,20 +355,29 @@ class OrderQuestionsViewMixin(BaseQuestionsViewMixin):
override[k].pop('initial', None)
return override_sets
@cached_property
def vat_id_validation_enabled(self):
return any([p.item.tax_rule and (p.item.tax_rule.eu_reverse_charge or p.item.tax_rule.custom_rules)
for p in self.positions])
@cached_property
def invoice_form(self):
if not self.address_asked and self.request.event.settings.invoice_name_required:
f = self.invoice_name_form_class(
data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
instance=self.invoice_address, validate_vat_id=False,
instance=self.invoice_address,
validate_vat_id=False,
request=self.request,
all_optional=self.all_optional
)
elif self.address_asked:
f = self.invoice_form_class(
data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
instance=self.invoice_address, validate_vat_id=False,
instance=self.invoice_address,
validate_vat_id=self.vat_id_validation_enabled,
request=self.request,
all_optional=self.all_optional,
)
else:
+59 -23
View File
@@ -43,6 +43,7 @@ from django.core.validators import validate_email
from django.db.models import Prefetch, Q, prefetch_related_objects
from django.forms import CheckboxSelectMultiple, formset_factory
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.timezone import get_current_timezone_name
@@ -534,34 +535,39 @@ class EventSettingsForm(SettingsForm):
'og_image',
]
def _resolve_virtual_keys_input(self, data, prefix=''):
# set all dependants of virtual_keys and
# delete all virtual_fields to prevent them from being saved
for virtual_key in self.virtual_keys:
if prefix + virtual_key not in data:
continue
base_key = prefix + virtual_key.rsplit('_', 2)[0]
asked_key = base_key + '_asked'
required_key = base_key + '_required'
if data[prefix + virtual_key] == 'optional':
data[asked_key] = True
data[required_key] = False
elif data[prefix + virtual_key] == 'required':
data[asked_key] = True
data[required_key] = True
# Explicitly check for 'do_not_ask'.
# Do not overwrite as default-behaviour when no value for virtual field is transmitted!
elif data[prefix + virtual_key] == 'do_not_ask':
data[asked_key] = False
data[required_key] = False
# hierarkey.forms cannot handle non-existent keys in cleaned_data => do not delete, but set to None
if not prefix:
data[virtual_key] = None
return data
def clean(self):
data = super().clean()
settings_dict = self.event.settings.freeze()
settings_dict.update(data)
# set all dependants of virtual_keys and
# delete all virtual_fields to prevent them from being saved
for virtual_key in self.virtual_keys:
if virtual_key not in data:
continue
base_key = virtual_key.rsplit('_', 2)[0]
asked_key = base_key + '_asked'
required_key = base_key + '_required'
if data[virtual_key] == 'optional':
data[asked_key] = True
data[required_key] = False
elif data[virtual_key] == 'required':
data[asked_key] = True
data[required_key] = True
# Explicitly check for 'do_not_ask'.
# Do not overwrite as default-behaviour when no value for virtual field is transmitted!
elif data[virtual_key] == 'do_not_ask':
data[asked_key] = False
data[required_key] = False
# hierarkey.forms cannot handle non-existent keys in cleaned_data => do not delete, but set to None
data[virtual_key] = None
data = self._resolve_virtual_keys_input(data)
validate_event_settings(self.event, data)
return data
@@ -621,6 +627,35 @@ class EventSettingsForm(SettingsForm):
else:
self.initial[virtual_key] = 'do_not_ask'
@cached_property
def changed_data(self):
data = []
# We need to resolve the mapping between our "virtual" fields and the "real"fields here, otherwise
# they are detected as "changed" on every save even though they aren't.
in_data = self._resolve_virtual_keys_input(self.data.copy(), prefix=f'{self.prefix}-' if self.prefix else '')
for name, field in self.fields.items():
prefixed_name = self.add_prefix(name)
data_value = field.widget.value_from_datadict(in_data, self.files, prefixed_name)
if not field.show_hidden_initial:
# Use the BoundField's initial as this is the value passed to
# the widget.
initial_value = self[name].initial
else:
initial_prefixed_name = self.add_initial_prefix(name)
hidden_widget = field.hidden_widget()
try:
initial_value = field.to_python(hidden_widget.value_from_datadict(
self.data, self.files, initial_prefixed_name))
except ValidationError:
# Always assume data has changed if validation fails.
data.append(name)
continue
if field.has_changed(initial_value, data_value):
data.append(name)
return data
class CancelSettingsForm(SettingsForm):
auto_fields = [
@@ -837,6 +872,7 @@ class MailSettingsForm(SMTPSettingsMixin, SettingsForm):
'mail_from_name',
'mail_attach_ical',
'mail_attach_tickets',
'mail_attachment_new_order',
]
mail_sales_channel_placed_paid = forms.MultipleChoiceField(
+221
View File
@@ -811,6 +811,213 @@ class OrderSearchFilterForm(OrderFilterForm):
)
class OrderPaymentSearchFilterForm(forms.Form):
orders = {'id': 'id', 'local_id': 'local_id', 'state': 'state', 'amount': 'amount', 'order': 'order',
'created': 'created', 'payment_date': 'payment_date', 'provider': 'provider', 'info': 'info',
'fee': 'fee'}
query = forms.CharField(
label=_('Search for…'),
widget=forms.TextInput(attrs={
'placeholder': _('Search for…'),
'autofocus': 'autofocus'
}),
required=False,
)
event = forms.ModelChoiceField(
label=_('Event'),
queryset=Event.objects.none(),
required=False,
widget=Select2(
attrs={
'data-model-select2': 'event',
'data-select2-url': reverse_lazy('control:events.typeahead'),
'data-placeholder': _('All events')
}
)
)
organizer = forms.ModelChoiceField(
label=_('Organizer'),
queryset=Organizer.objects.none(),
required=False,
empty_label=_('All organizers'),
widget=Select2(
attrs={
'data-model-select2': 'generic',
'data-select2-url': reverse_lazy('control:organizers.select2'),
'data-placeholder': _('All organizers')
}
),
)
state = forms.ChoiceField(
label=_('Status'),
required=False,
choices=[('', _('All payments'))] + list(OrderPayment.PAYMENT_STATES),
)
provider = forms.ChoiceField(
label=_('Payment provider'),
choices=[
('', _('All payment providers')),
],
required=False,
)
created_from = forms.DateField(
label=_('Payment created from'),
required=False,
widget=DatePickerWidget,
)
created_until = forms.DateField(
label=_('Payment created until'),
required=False,
widget=DatePickerWidget,
)
completed_from = forms.DateField(
label=_('Paid from'),
required=False,
widget=DatePickerWidget,
)
completed_until = forms.DateField(
label=_('Paid until'),
required=False,
widget=DatePickerWidget,
)
amount = forms.CharField(
label=_('Amount'),
required=False,
widget=forms.NumberInput(attrs={
'placeholder': _('Amount'),
}),
)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
self.fields['ordering'] = forms.ChoiceField(
choices=sum([
[(a, a), ('-' + a, '-' + a)]
for a in self.orders.keys()
], []),
required=False
)
if self.request.user.has_active_staff_session(self.request.session.session_key):
self.fields['organizer'].queryset = Organizer.objects.all()
self.fields['event'].queryset = Event.objects.all()
else:
self.fields['organizer'].queryset = Organizer.objects.filter(
pk__in=self.request.user.teams.values_list('organizer', flat=True)
)
self.fields['event'].queryset = self.request.user.get_events_with_permission('can_view_orders')
self.fields['provider'].choices += get_all_payment_providers()
def filter_qs(self, qs):
fdata = self.cleaned_data
if fdata.get('created_from'):
date_start = make_aware(datetime.combine(
fdata.get('created_from'),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(created__gte=date_start)
if fdata.get('created_until'):
date_end = make_aware(datetime.combine(
fdata.get('created_until') + timedelta(days=1),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(created__lt=date_end)
if fdata.get('completed_from'):
date_start = make_aware(datetime.combine(
fdata.get('completed_from'),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(payment_date__gte=date_start)
if fdata.get('completed_until'):
date_end = make_aware(datetime.combine(
fdata.get('completed_until') + timedelta(days=1),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(payment_date__lt=date_end)
if fdata.get('event'):
qs = qs.filter(order__event=fdata.get('event'))
if fdata.get('organizer'):
qs = qs.filter(order__event__organizer=fdata.get('organizer'))
if fdata.get('state'):
qs = qs.filter(state=fdata.get('state'))
if fdata.get('provider'):
qs = qs.filter(provider=fdata.get('provider'))
if fdata.get('query'):
u = fdata.get('query')
matching_invoices = Invoice.objects.filter(
Q(invoice_no__iexact=u)
| Q(invoice_no__iexact=u.zfill(5))
| Q(full_invoice_no__iexact=u)
).values_list('order_id', flat=True)
matching_invoice_addresses = InvoiceAddress.objects.filter(
Q(
Q(name_cached__icontains=u) | Q(company__icontains=u)
)
).values_list('order_id', flat=True)
if "-" in u:
code = (Q(event__slug__icontains=u.rsplit("-", 1)[0])
& Q(code__icontains=Order.normalize_code(u.rsplit("-", 1)[1])))
else:
code = Q(code__icontains=Order.normalize_code(u))
matching_orders = Order.objects.filter(
Q(
code
| Q(email__icontains=u)
| Q(comment__icontains=u)
)
).values_list('id', flat=True)
mainq = (
Q(order__id__in=matching_invoices)
| Q(order__id__in=matching_invoice_addresses)
| Q(order__id__in=matching_orders)
)
qs = qs.filter(mainq)
if fdata.get('amount'):
amount = fdata.get('amount')
def is_decimal(value):
result = True
parts = value.split('.', maxsplit=1)
for part in parts:
result = result & part.isdecimal()
return result
if is_decimal(amount):
qs = qs.filter(amount=Decimal(amount))
if fdata.get('ordering'):
p = self.cleaned_data.get('ordering')
if p.startswith('-') and p not in self.orders:
qs = qs.order_by('-' + self.orders[p[1:]])
else:
qs = qs.order_by(self.orders[p])
else:
qs = qs.order_by('-created')
return qs
class SubEventFilterForm(FilterForm):
orders = {
'date_from': 'date_from',
@@ -2018,6 +2225,15 @@ class DeviceFilterForm(FilterForm):
],
required=False,
)
state = forms.ChoiceField(
label=_('Device status'),
choices=[
('', _('All devices')),
('active', _('Active devices')),
('revoked', _('Revoked devices'))
],
required=False
)
def __init__(self, *args, **kwargs):
request = kwargs.pop('request')
@@ -2047,6 +2263,11 @@ class DeviceFilterForm(FilterForm):
if fdata.get('gate'):
qs = qs.filter(gate=fdata['gate'])
if fdata.get('state') == 'active':
qs = qs.filter(revoked=False)
elif fdata.get('state') == 'revoked':
qs = qs.filter(revoked=True)
if fdata.get('ordering'):
qs = qs.order_by(self.get_order_by())
else:
+7
View File
@@ -565,6 +565,13 @@ class CustomerUpdateForm(forms.ModelForm):
return self.cleaned_data
class CustomerCreateForm(CustomerUpdateForm):
class Meta:
model = Customer
fields = ['identifier', 'is_active', 'name_parts', 'email', 'is_verified', 'locale']
class MembershipUpdateForm(forms.ModelForm):
class Meta:
+1 -2
View File
@@ -43,7 +43,6 @@ from django.urls import get_script_prefix, resolve, reverse
from django.utils.encoding import force_str
from django.utils.translation import gettext as _
from django_scopes import scope
from hijack.templatetags.hijack_tags import is_hijacked
from pretix.base.models import Event, Organizer
from pretix.base.models.auth import SuperuserPermissionSet, User
@@ -183,7 +182,7 @@ class AuditLogMiddleware:
def __call__(self, request):
if request.path.startswith(get_script_prefix() + 'control') and request.user.is_authenticated:
if is_hijacked(request):
if getattr(request.user, "is_hijacked", False):
hijack_history = request.session.get('hijack_history', False)
hijacker = get_object_or_404(User, pk=hijack_history[0])
ss = hijacker.get_active_staff_session(request.session.get('hijacker_session'))
+16 -2
View File
@@ -343,10 +343,24 @@ def get_global_navigation(request):
'icon': 'group',
},
{
'label': _('Order search'),
'label': _('Search'),
'url': reverse('control:search.orders'),
'active': 'search.orders' in url.url_name,
'active': False,
'icon': 'search',
'children': [
{
'label': _('Orders'),
'url': reverse('control:search.orders'),
'active': 'search.orders' in url.url_name,
'icon': 'search',
},
{
'label': _('Payments'),
'url': reverse('control:search.payments'),
'active': 'search.payments' in url.url_name,
'icon': 'search',
},
]
},
{
'label': _('User settings'),
@@ -1,6 +1,5 @@
{% load compress %}
{% load i18n %}
{% load hijack_tags %}
{% load static %}
<!DOCTYPE html>
<html{% if rtl %} dir="rtl" class="rtl"{% endif %}>
@@ -39,7 +38,7 @@
</div>
{% endfor %}
{% endif %}
{% if request|is_hijacked %}
{% if request.user.is_hijacked %}
<div class="impersonate-warning">
<span class="fa fa-user-secret"></span>
{% blocktrans with user=request.user%}You are currently working on behalf of {{ user }}.{% endblocktrans %}
@@ -1,7 +1,6 @@
{% load compress %}
{% load static %}
{% load i18n %}
{% load hijack_tags %}
{% load statici18n %}
{% load eventsignal %}
{% load eventurl %}
@@ -351,7 +350,7 @@
</ul>
</div>
{% endif %}
{% if request|is_hijacked %}
{% if request.user.is_hijacked %}
<div class="impersonate-warning">
<span class="fa fa-user-secret"></span>
{% blocktrans with user=request.user%}You are currently working on behalf of {{ user }}.{% endblocktrans %}
@@ -47,6 +47,7 @@
</fieldset>
<fieldset>
<legend>{% trans "E-mail content" %}</legend>
<h4>{% trans "Text" %}</h4>
<div class="panel-group" id="questions_group">
{% blocktrans asvar title_placed_order %}Placed order{% endblocktrans %}
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="order_placed" title=title_placed_order items="mail_text_order_placed,mail_send_order_placed_attendee,mail_text_order_placed_attendee" exclude="mail_send_order_placed_attendee" %}
@@ -81,6 +82,8 @@
{% blocktrans asvar title_require_approval %}Order approval process{% endblocktrans %}
{% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_require_approval items="mail_text_order_placed_require_approval,mail_text_order_approved,mail_text_order_approved_free,mail_text_order_denied" %}
</div>
<h4>{% trans "Attachments" %}</h4>
{% bootstrap_field form.mail_attachment_new_order layout="control" %}
</fieldset>
<fieldset>
<legend>{% trans "SMTP settings" %}</legend>
@@ -2,15 +2,23 @@
{% load i18n %}
{% load bootstrap3 %}
{% block title %}
{% blocktrans trimmed with id=customer.identifier %}
Customer #{{ id }}
{% endblocktrans %}
{% endblock %}
{% block inner %}
<h1>
{% if not customer.id %}
{% trans "New customer" %}
{% else %}
{% blocktrans trimmed with id=customer.identifier %}
Customer #{{ id }}
{% endblocktrans %}
{% endif %}
{% endblock %}
{% block inner %}
<h1>
{% if not customer.id %}
{% trans "New customer" %}
{% else %}
{% blocktrans trimmed with id=customer.identifier %}
Customer #{{ id }}
{% endblocktrans %}
{% endif %}
</h1>
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
@@ -15,6 +15,8 @@
No customer accounts have been created yet.
{% endblocktrans %}
</p>
<a href="{% url "control:organizer.customer.create" organizer=request.organizer.slug %}"
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new customer" %}</a>
</div>
{% else %}
<div class="panel panel-default">
@@ -41,6 +43,10 @@
</div>
</form>
</div>
<p>
<a href="{% url "control:organizer.customer.create" organizer=request.organizer.slug %}"
class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new customer" %}</a>
</p>
<div class="table-responsive">
<table class="table table-condensed table-hover">
<thead>
@@ -30,7 +30,7 @@
</div>
<form class="panel-body filter-form" action="" method="get">
<div class="row">
<div class="col-md-6 col-sm-6 col-xs-12">
<div class="col-md-4 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.query %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
@@ -39,6 +39,9 @@
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.software_brand %}
</div>
<div class="col-md-2 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.state %}
</div>
</div>
<div class="text-right">
<button class="btn btn-primary btn-lg" type="submit">
@@ -0,0 +1,164 @@
{% extends "pretixcontrol/base.html" %}
{% load i18n %}
{% load eventurl %}
{% load urlreplace %}
{% load money %}
{% load bootstrap3 %}
{% block title %}{% trans "Payment search" %}{% endblock %}
{% block content %}
<h1>{% trans "Payment search" %}</h1>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% trans "Filter" %}
</h3>
</div>
<form class="panel-body filter-form" action="" method="get">
<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12">
<div class="row">
<div class="col-md-6 col-sm-12 col-xs-12">
{% bootstrap_field filter_form.query %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.completed_from %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.completed_until %}
</div>
</div>
<div class="row">
<div class="col-md-3 col-sm-3 col-xs-4">
{% bootstrap_field filter_form.amount %}
</div>
<div class="col-md-5 col-sm-5 col-xs-8">
{% bootstrap_field filter_form.provider %}
</div>
<div class="col-md-4 col-sm-4 col-xs-12">
{% bootstrap_field filter_form.state %}
</div>
</div>
</div>
<div class="col-md-12 col-sm-12 col-xs-12">
<div class="row">
<div class="col-md-6 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.organizer %}
</div>
<div class="col-md-6 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.event %}
</div>
</div>
<div class="row">
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.created_from %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.created_until %}
</div>
</div>
</div>
</div>
<div class="text-right flip">
<button class="btn btn-primary btn-lg" type="submit">
<span class="fa fa-filter"></span>
{% trans "Filter" %}
</button>
</div>
</form>
</div>
<div class="table-responsive">
<table class="table table-condensed table-hover">
<thead>
<tr>
<th>
{% trans "Payment ID" %}
</th>
<th>
{% trans "Order" %}
<a href="?{% url_replace request 'ordering' '-order' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'order' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>
{% trans "Start date" %}
<a href="?{% url_replace request 'ordering' '-created' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'created' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>
{% trans "Confirmation date" %}
<a href="?{% url_replace request 'ordering' '-payment_date' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'payment_date' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>
{% trans "Payment provider" %}
<a href="?{% url_replace request 'ordering' '-provider' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'provider' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th class="text-right flip">
{% trans "Amount" %}
<a href="?{% url_replace request 'ordering' '-amount' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'amount' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th class="text-right flip">
{% trans "Status" %}
<a href="?{% url_replace request 'ordering' '-state' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'state' %}"><i class="fa fa-caret-up"></i></a>
</th>
</tr>
</thead>
<tbody>
{% for p in payments %}
<tr>
<td>{{ p.full_id }}</td>
<td>
<strong>
<a href="{% url "control:event.order" event=p.order.event.slug organizer=p.order.event.organizer.slug code=p.order.code %}">
{{ p.order.full_code }}</a>
</strong>
{% if p.order.testmode %}
<span class="label label-warning">{% trans "TEST MODE" %}</span>
{% endif %}
</td>
<td>
{% if p.migrated %}
<span class="label label-default" data-toggle="tooltip"
title="{% trans "This payment was created with an older version of pretix, therefore accurate data might not be available." %}">
{% trans "MIGRATED" %}
</span>
{% else %}
{{ p.created|date:"SHORT_DATETIME_FORMAT" }}
{% endif %}
</td>
<td>{{ p.payment_date|date:"SHORT_DATETIME_FORMAT" }}</td>
<td>{{ p.payment_provider.verbose_name }}</td>
<td class="text-right flip">{{ p.amount|money:p.order.event.currency }}</td>
<td class="text-right flip">
<span class="label label-{% if p.state == "created" or p.state == "pending" %}warning{% elif p.state == "confirmed" %}success{% else %}danger{% endif %}">
{{ p.get_state_display }}
</span>
</td>
</tr>
{% if staff_session %}
<tr>
<td colspan="1"></td>
<td colspan="6">
<a href="" class="btn btn-default btn-xs" data-expandpayment data-id="{{ p.pk }}">
<span class="fa-eye fa fa-fw"></span>
{% trans "Inspect" %}
</a>
</td>
</tr>
{% endif %}
{% empty %}
<tr>
<td colspan="7" class="text-center"><em>
{% trans "We couldn't find any payments that you have access to and that match your search query." %}
</em></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% include "pretixcontrol/pagination_huge.html" %}
{% endblock %}
+3
View File
@@ -133,6 +133,8 @@ urlpatterns = [
name='organizer.membershiptype.delete'),
re_path(r'^organizer/(?P<organizer>[^/]+)/customers$', organizer.CustomerListView.as_view(), name='organizer.customers'),
re_path(r'^organizer/(?P<organizer>[^/]+)/customers/select2$', typeahead.customer_select2, name='organizer.customers.select2'),
re_path(r'^organizer/(?P<organizer>[^/]+)/customer/add$',
organizer.CustomerCreateView.as_view(), name='organizer.customer.create'),
re_path(r'^organizer/(?P<organizer>[^/]+)/customer/(?P<customer>[^/]+)/$',
organizer.CustomerDetailView.as_view(), name='organizer.customer'),
re_path(r'^organizer/(?P<organizer>[^/]+)/customer/(?P<customer>[^/]+)/edit$',
@@ -192,6 +194,7 @@ urlpatterns = [
re_path(r'^events/typeahead/$', typeahead.event_list, name='events.typeahead'),
re_path(r'^events/typeahead/meta/$', typeahead.meta_values, name='events.meta.typeahead'),
re_path(r'^search/orders/$', search.OrderSearch.as_view(), name='search.orders'),
re_path(r'^search/payments/$', search.PaymentSearch.as_view(), name='search.payments'),
re_path(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include([
re_path(r'^$', dashboards.event_index, name='event.index'),
re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
+4 -2
View File
@@ -65,7 +65,9 @@ from i18nfield.utils import I18nJSONEncoder
from pytz import timezone
from pretix.base.channels import get_all_sales_channels
from pretix.base.email import get_available_placeholders
from pretix.base.email import (
get_available_placeholders, test_custom_smtp_backend,
)
from pretix.base.models import Event, LogEntry, Order, TaxRule, Voucher
from pretix.base.models.event import EventMetaValue
from pretix.base.services import tickets
@@ -641,7 +643,7 @@ class MailSettings(EventSettingsViewMixin, EventSettingsFormView):
if request.POST.get('test', '0').strip() == '1':
backend = self.request.event.get_mail_backend(force_custom=True, timeout=10)
try:
backend.test(self.request.event.settings.mail_from)
test_custom_smtp_backend(backend, self.request.event.settings.mail_from)
except Exception as e:
messages.warning(self.request, _('An error occurred while contacting the SMTP server: %s') % str(e))
else:
+5
View File
@@ -896,6 +896,11 @@ class OrderRefundView(OrderView):
if self.request.POST.get('manual_state') == 'done'
else OrderRefund.REFUND_STATE_CREATED
),
execution_date=(
now()
if self.request.POST.get('manual_state') == 'done'
else None
),
amount=manual_value,
comment=comment,
provider='manual'
+33 -3
View File
@@ -64,6 +64,7 @@ from django.views.generic import (
from pretix.api.models import WebHook
from pretix.base.auth import get_auth_backends
from pretix.base.channels import get_all_sales_channels
from pretix.base.email import test_custom_smtp_backend
from pretix.base.i18n import language
from pretix.base.models import (
CachedFile, Customer, Device, Gate, GiftCard, Invoice, LogEntry,
@@ -89,8 +90,8 @@ from pretix.control.forms.filter import (
)
from pretix.control.forms.orders import ExporterForm
from pretix.control.forms.organizer import (
CustomerUpdateForm, DeviceForm, EventMetaPropertyForm, GateForm,
GiftCardCreateForm, GiftCardUpdateForm, MailSettingsForm,
CustomerCreateForm, CustomerUpdateForm, DeviceForm, EventMetaPropertyForm,
GateForm, GiftCardCreateForm, GiftCardUpdateForm, MailSettingsForm,
MembershipTypeForm, MembershipUpdateForm, OrganizerDeleteForm,
OrganizerForm, OrganizerSettingsForm, OrganizerUpdateForm, TeamForm,
WebHookForm,
@@ -265,7 +266,7 @@ class OrganizerMailSettings(OrganizerSettingsFormView):
if request.POST.get('test', '0').strip() == '1':
backend = self.request.organizer.get_mail_backend(force_custom=True, timeout=10)
try:
backend.test(self.request.organizer.settings.mail_from)
test_custom_smtp_backend(backend, self.request.organizer.settings.mail_from)
except Exception as e:
messages.warning(self.request, _('An error occurred while contacting the SMTP server: %s') % str(e))
else:
@@ -1863,6 +1864,35 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
return ctx
class CustomerCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):
template_name = 'pretixcontrol/organizers/customer_edit.html'
permission = 'can_manage_customers'
context_object_name = 'customer'
form_class = CustomerCreateForm
def get_form_kwargs(self):
ctx = super().get_form_kwargs()
c = Customer(organizer=self.request.organizer)
c.assign_identifier()
ctx['instance'] = c
return ctx
def form_valid(self, form):
r = super().form_valid(form)
form.instance.log_action('pretix.customer.created', user=self.request.user, data={
k: getattr(form.instance, k)
for k in form.changed_data
})
messages.success(self.request, _('Your changes have been saved.'))
return r
def get_success_url(self):
return reverse('control:organizer.customer', kwargs={
'organizer': self.request.organizer.slug,
'customer': self.object.identifier,
})
class CustomerUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
template_name = 'pretixcontrol/organizers/customer_edit.html'
permission = 'can_manage_customers'
+74 -2
View File
@@ -25,8 +25,10 @@ from django.utils.functional import cached_property
from django.views.generic import ListView
from pretix.base.models import Order, OrderPosition
from pretix.base.models.orders import CancellationRequest
from pretix.control.forms.filter import OrderSearchFilterForm
from pretix.base.models.orders import CancellationRequest, OrderPayment
from pretix.control.forms.filter import (
OrderPaymentSearchFilterForm, OrderSearchFilterForm,
)
from pretix.control.views import LargeResultSetPaginator, PaginationMixin
@@ -136,3 +138,73 @@ class OrderSearch(PaginationMixin, ListView):
).prefetch_related(
'event', 'event__organizer'
).select_related('invoice_address')
class PaymentSearch(PaginationMixin, ListView):
model = OrderPayment
paginator_class = LargeResultSetPaginator
context_object_name = 'payments'
template_name = 'pretixcontrol/search/payments.html'
@cached_property
def filter_form(self):
return OrderPaymentSearchFilterForm(data=self.request.GET, request=self.request)
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['filter_form'] = self.filter_form
return ctx
def get_queryset(self):
qs = OrderPayment.objects.using(settings.DATABASE_REPLICA)
if not self.request.user.has_active_staff_session(self.request.session.session_key):
qs = qs.filter(
Q(order__event_id__in=self.request.user.get_events_with_permission('can_view_orders').values_list('id', flat=True))
)
if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs)
if self.filter_form.cleaned_data.get('query'):
"""
We need to work around a bug in PostgreSQL's (and likely MySQL's) query plan optimizer here.
The database lacks statistical data to predict how common our search filter is and therefore
assumes that it is cheaper to first ORDER *all* orders in the system (since we got an index on
datetime), then filter out with a full scan until OFFSET/LIMIT condition is fulfilled. If we
look for something rare (such as an email address used once within hundreds of thousands of
orders, this ends up to be pathologically slow.
For some search queries on pretix.eu, we see search times of >30s, just due to the ORDER BY and
LIMIT clause. Without them. the query runs in roughly 0.6s. This heuristical approach tries to
detect these cases and rewrite the query as a nested subquery that strongly suggests sorting
before filtering. However, since even that fails in some cases because PostgreSQL thinks it knows
better, we literally force it by evaluating the subquery explicitly. We only do this for n<=200,
to avoid memory leaks and problems with maximum parameter count on SQLite. In cases where the
search query yields lots of results, this will actually be slower since it requires two queries,
sorry.
Phew.
"""
page = self.kwargs.get(self.page_kwarg) or self.request.GET.get(self.page_kwarg) or 1
limit = self.get_paginate_by(None)
try:
offset = (int(page) - 1) * limit
except ValueError:
offset = 0
resultids = list(qs.order_by().values_list('id', flat=True)[:201])
if len(resultids) <= 200 and len(resultids) <= offset + limit:
qs = OrderPayment.objects.using(settings.DATABASE_REPLICA).filter(
id__in=resultids
)
"""
We use prefetch_related here instead of select_related for a reason, even though select_related
would be the common choice for a foreign key and doesn't require an additional database query.
The problem is, that if our results contain the same event 25 times, select_related will create
25 Django objects which will all try to pull their ownsettings cache to show the event properly,
leading to lots of unnecessary queries. Due to the way prefetch_related works differently, it
will only create one shared Django object.
"""
return qs.prefetch_related('order', 'order__event', 'order__event__organizer')
+65 -3
View File
@@ -20,9 +20,13 @@
# <https://www.gnu.org/licenses/>.
#
import json
from contextlib import contextmanager
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import (
BACKEND_SESSION_KEY, get_user_model, load_backend, login,
)
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
@@ -30,7 +34,7 @@ from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.generic import ListView, TemplateView
from hijack.helpers import login_user, release_hijack
from hijack import signals
from pretix.base.auth import get_auth_backends
from pretix.base.models import User
@@ -42,6 +46,25 @@ from pretix.control.views import CreateView, UpdateView
from pretix.control.views.user import RecentAuthenticationRequiredMixin
def get_used_backend(request):
# vendored from hijack/views.py
backend_str = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_str)
return backend
@contextmanager
def keep_session_age(session):
# vendored from hijack/views.py
try:
session_expiry = session["_session_expiry"]
except KeyError:
yield
else:
yield
session["_session_expiry"] = session_expiry
class UserListView(AdministratorPermissionRequiredMixin, ListView):
template_name = 'pretixcontrol/users/index.html'
context_object_name = 'users'
@@ -171,7 +194,28 @@ class UserImpersonateView(AdministratorPermissionRequiredMixin, RecentAuthentica
'other_email': self.object.email
})
oldkey = request.session.session_key
login_user(request, self.object)
hijacker = request.user
hijacked = self.object
hijack_history = request.session.get("hijack_history", [])
hijack_history.append(request.user._meta.pk.value_to_string(hijacker))
backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}"
with signals.no_update_last_login(), keep_session_age(request.session):
login(request, hijacked, backend=backend)
request.session["hijack_history"] = hijack_history
signals.hijack_started.send(
sender=None,
request=request,
hijacker=hijacker,
hijacked=hijacked,
)
request.session['hijacker_session'] = oldkey
return redirect(reverse('control:index'))
@@ -180,8 +224,26 @@ class UserImpersonateStopView(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
impersonated = request.user
hijs = request.session['hijacker_session']
release_hijack(request)
hijack_history = request.session.get("hijack_history", [])
hijacked = request.user
user_pk = hijack_history.pop()
hijacker = get_object_or_404(get_user_model(), pk=user_pk)
backend = get_used_backend(request)
backend = f"{backend.__module__}.{backend.__class__.__name__}"
with signals.no_update_last_login(), keep_session_age(request.session):
login(request, hijacker, backend=backend)
request.session["hijack_history"] = hijack_history
signals.hijack_ended.send(
sender=None,
request=request,
hijacker=hijacker,
hijacked=hijacked,
)
ss = request.user.get_active_staff_session(hijs)
if ss:
request.session.save()
+1
View File
@@ -39,3 +39,4 @@ SHORT_DATETIME_FORMAT = 'Y-m-d H:i'
TIME_FORMAT = 'H:i'
WEEK_FORMAT = '\\W W, o'
WEEK_DAY_FORMAT = 'D, M jS'
SHORT_MONTH_DAY_FORMAT = 'd.m.'
@@ -26,6 +26,7 @@ SHORT_DATETIME_FORMAT = 'm/d/Y P'
TIME_FORMAT = 'P'
WEEK_FORMAT = '\\W W, o'
WEEK_DAY_FORMAT = 'D, M jS'
SHORT_MONTH_DAY_FORMAT = 'm/d'
DATE_INPUT_FORMATS = [
'%m/%d/%Y',
+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/>.
#
+25
View File
@@ -0,0 +1,25 @@
#
# 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 according to https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
WEEK_FORMAT = '\\S W/o'
WEEK_DAY_FORMAT = 'D, j.n.'
+40
View File
@@ -0,0 +1,40 @@
#
# 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/>.
#
def clean_filename(fname):
"""
hierarkey.forms.SettingsForm appends a random value to every filename. However, it keeps the
extension around "twice". This leads to:
"Terms.pdf" "Terms.pdf.OybgvyAH.pdf"
In pretix Hosted, our storage layer also adds a hash of the file to the filename, so we have
"Terms.pdf" "Terms.pdf.OybgvyAH.22c0583727d5bc.pdf"
This function reverses this operation:
"Terms.pdf.OybgvyAH.22c0583727d5bc.pdf" "Terms.pdf"
"""
ext = '.' + fname.split('.')[-1]
return fname.rsplit(ext + ".", 1)[0] + ext
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -535,20 +535,20 @@ msgstr "ستسترد %(currency)%(amount)"
msgid "Please enter the amount the organizer can keep."
msgstr "الرجاء إدخال المبلغ الذي يمكن للمنظم الاحتفاظ به."
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr "الرجاء إدخال عدد لأحد أنواع التذاكر."
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "مطلوب"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "المنطقة الزمنية:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "التوقيت المحلي:"
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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-"
@@ -510,22 +510,22 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Cistella expirada"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+12 -12
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-10-18 19:00+0000\n"
"Last-Translator: Tony Pavlik <kontakt@playton.cz>\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
"cs/>\n"
"Language: cs\n"
@@ -184,7 +184,7 @@ msgstr "Objednávka zrušena"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Checked-in Tickets"
msgstr "Odbavené vstupenky"
msgstr "Vyřízené vstupenky"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Valid Tickets"
@@ -192,7 +192,7 @@ msgstr "Platné vstupenky"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Currently inside"
msgstr "Právě uvnitř"
msgstr "Aktuálně uvnitř"
#: pretix/static/lightbox/js/lightbox.js:96
msgid "close"
@@ -439,7 +439,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:417
msgid "All"
msgstr "Všechný"
msgstr "Všechny"
#: pretix/static/pretixcontrol/js/ui/main.js:418
msgid "None"
@@ -528,20 +528,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "povinný"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Časové pásmo:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Místní čas:"
@@ -683,7 +683,7 @@ msgstr "Uplatnit"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Voucher code"
msgstr "Kód voucheru"
msgstr "Kód poukázky"
#: pretix/static/pretixpresale/js/widget/widget.js:45
msgctxt "widget"
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -563,22 +563,22 @@ msgstr "fra %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Kurv udløbet"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Tidszone:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Din lokaltid:"
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -532,20 +532,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "verpflichtend"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Deine lokale Zeit:"
+2
View File
@@ -55,6 +55,7 @@ Chrome
Choice
CONFIRM
Connect
Consent
Copyleft
Cronjob
csv
@@ -253,6 +254,7 @@ Toolbar
TODO
TOTP
Trace
Tracking
Turnover
txt
überbuchen
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: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -531,20 +531,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "verpflichtend"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Zeitzone:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Deine lokale Zeit:"
@@ -55,6 +55,7 @@ Chrome
Choice
CONFIRM
Connect
Consent
Copyleft
Cronjob
csv
@@ -253,6 +254,7 @@ Toolbar
TODO
TOTP
Trace
Tracking
Turnover
txt
überbuchen
+1805 -1351
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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"
@@ -505,20 +505,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -575,22 +575,22 @@ msgstr "απο %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων."
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Το καλάθι έληξε"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+13 -20
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-09-06 09:00+0000\n"
"Last-Translator: rauxenz <noquedandireccionesdisponibles@gmail.com>\n"
"POT-Creation-Date: 2021-11-30 16:13+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-"
"js/es/>\n"
"Language: es\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.6\n"
"X-Generator: Weblate 4.8\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -195,9 +195,6 @@ msgid "Currently inside"
msgstr "Actualmente adentro"
#: pretix/static/lightbox/js/lightbox.js:96
#, fuzzy
#| msgctxt "widget"
#| msgid "Close"
msgid "close"
msgstr "Cerrar"
@@ -501,26 +498,22 @@ msgstr[0] "(una fecha más)"
msgstr[1] "({num} más fechas)"
#: pretix/static/pretixpresale/js/ui/cart.js:43
#, fuzzy
#| msgid "The items in your cart are no longer reserved for you."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr "Los elementos en su carrito de compras ya no se encuentran reservados."
msgstr ""
"Los elementos en su carrito de compras ya no se encuentran reservados. "
"Puedes seguir añadiendo más productos mientras estén disponibles."
#: pretix/static/pretixpresale/js/ui/cart.js:45
msgid "Cart expired"
msgstr "El carrito de compras ha expirado"
#: pretix/static/pretixpresale/js/ui/cart.js:50
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
"Los elementos en su carrito de compras se han reservado por un minuto."
"Los elementos en su carrito de compras se han reservado por {num} minutos."
msgstr[1] ""
"Los elementos en su carrito de compras se han reservado por {num} minutos."
@@ -536,20 +529,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "campo requerido"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Zona horaria:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Su hora local:"
File diff suppressed because it is too large Load Diff
+8 -8
View File
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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-js/fi/>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/fi/>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -528,22 +528,22 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Ostoskori on vanhentunut"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Aikavyöhyke:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+10 -10
View File
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-10-01 23:00+0000\n"
"Last-Translator: Fabian Rodriguez <magicfab@legoutdulibre.com>\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
"fr/>\n"
"Language: fr\n"
@@ -353,11 +353,11 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Event start"
msgstr ""
msgstr "Début de l'événement"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:100
msgid "Event end"
msgstr ""
msgstr "Fin de l'événement"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:101
msgid "Event admission"
@@ -567,22 +567,22 @@ msgstr "de %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Panier expiré"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+166 -141
View File
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-11-04 07:00+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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: Galician <https://translate.pretix.eu/projects/pretix/"
"pretix-js/gl/>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix-"
"js/gl/>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +32,7 @@ msgstr "Comentario:"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Placed orders"
msgstr "Ordes enviadas"
msgstr "Pedidos enviados"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
@@ -62,7 +62,7 @@ msgstr "Contactando co banco…"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
msgid "Select a check-in list"
msgstr "Seleccion unha lista de rexistro"
msgstr "Seleccione unha lista de rexistro"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
msgid "No active check-in lists found."
@@ -70,7 +70,7 @@ msgstr "Non se atoparon listas de rexistro activas."
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
msgid "Switch check-in list"
msgstr "Cambiar lista de rexistro"
msgstr "Cambiar a lista de rexistro"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
msgid "Search results"
@@ -78,7 +78,7 @@ msgstr "Resultados da procura"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34
msgid "No tickets found"
msgstr "Non se atoparon tickets"
msgstr "Non se atoparon tíckets"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:35
msgid "Result"
@@ -86,15 +86,15 @@ msgstr "Resultado"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36
msgid "This ticket requires special attention"
msgstr "Este ticket require atención especial"
msgstr "Este tícket require atención especial"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
msgid "Switch direction"
msgstr "Cambiar dirección"
msgstr "Cambiar enderezo"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
msgid "Entry"
msgstr "Ingreso"
msgstr "Acceso"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
@@ -102,7 +102,7 @@ msgstr "Saída"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"
msgstr "Escanee o ticket ou busque e presione volver…"
msgstr "Escanee o tícket ou busque e presione volver…"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:41
msgid "Load more"
@@ -136,19 +136,19 @@ msgstr "Continuar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Ticket not paid"
msgstr "Ticket pendente de pago"
msgstr "Tícket pendente de pago"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr "Este ticket aínda non se pagou ¿Desexa continuar de todos modos?"
msgstr "Este tícket aínda non se pagou. Desexa continuar de todos os xeitos?"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr "Requírese de información adicional"
msgstr "Requírese información adicional"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"
msgstr "Ticket válido"
msgstr "Entrada válida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53
msgid "Exit recorded"
@@ -156,19 +156,19 @@ msgstr "Saída rexistrada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:54
msgid "Ticket already used"
msgstr "Este ticket xa foi utilizado"
msgstr "Este tícket xa foi utilizado"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:55
msgid "Information required"
msgstr "Información requerida"
msgstr "Información requirida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
msgid "Unknown ticket"
msgstr "Non se atopou ticket"
msgstr "Tícket descoñecido"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Ticket type not allowed here"
msgstr "Tipo de ticket non permitido"
msgstr "Tipo de tícket non permitido"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
msgid "Entry not allowed"
@@ -176,11 +176,11 @@ msgstr "Entrada non permitida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket code revoked/changed"
msgstr "Código de ticket revocado/cambiado"
msgstr "Código de tícket revogado/cambiado"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Order canceled"
msgstr "Orde cancelada"
msgstr "Pedido cancelado"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Checked-in Tickets"
@@ -188,7 +188,7 @@ msgstr "Rexistro de código QR"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Valid Tickets"
msgstr "Tickets válidos"
msgstr "Tíckets válidos"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Currently inside"
@@ -204,13 +204,13 @@ msgid ""
"Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes."
msgstr ""
"A sua solicitude estase procesando. Isto pode tardar varios minutos, "
"A súa solicitude estase procesando. Isto pode tardar varios minutos, "
"dependendo do tamaño do seu evento."
#: pretix/static/pretixbase/js/asynctask.js:48
#: pretix/static/pretixbase/js/asynctask.js:124
msgid "Your request has been queued on the server and will soon be processed."
msgstr "A sua solicitude foi enviada ao servidor e será procesada en breve."
msgstr "A súa solicitude foi enviada ao servidor e será procesada en breve."
#: pretix/static/pretixbase/js/asynctask.js:54
#: pretix/static/pretixbase/js/asynctask.js:130
@@ -219,6 +219,9 @@ msgid ""
"If this takes longer than two minutes, please contact us or go back in your "
"browser and try again."
msgstr ""
"A súa solicitude chegou ao servidor pero seguimos esperando a que sexa "
"procesada. Se tarda máis de dous minutos, por favor, contacte con nós ou "
"volva á páxina anterior no seu navegador e inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:89
#: pretix/static/pretixbase/js/asynctask.js:175
@@ -232,21 +235,25 @@ msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: "
"{code}"
msgstr ""
"Agora mesmo non podemos contactar co servidor, pero seguímolo intentando. O "
"último código de erro foi: {code}"
#: pretix/static/pretixbase/js/asynctask.js:144
#: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again."
msgstr ""
msgstr "A petición levou demasiado tempo. Inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:183
#: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}"
msgstr ""
"Agora mesmo non podemos contactar co servidor. Por favor, inténteo de novo. "
"Código de erro: {code}"
#: pretix/static/pretixbase/js/asynctask.js:205
msgid "We are processing your request …"
msgstr "Estamos procesando a sua solicitude…"
msgstr "Estamos procesando a súa solicitude…"
#: pretix/static/pretixbase/js/asynctask.js:213
msgid ""
@@ -254,6 +261,9 @@ msgid ""
"than one minute, please check your internet connection and then reload this "
"page and try again."
msgstr ""
"Estamos enviando a súa solicitude ao servidor. Se este proceso tarda máis "
"dun minuto, por favor, revise a súa conexión a Internet, recargue a páxina e "
"inténteo de novo."
#: pretix/static/pretixbase/js/asynctask.js:264
#: pretix/static/pretixcontrol/js/ui/main.js:34
@@ -262,11 +272,11 @@ msgstr "Cerrar mensaxe"
#: pretix/static/pretixcontrol/js/clipboard.js:23
msgid "Copied!"
msgstr "¡Copiado!"
msgstr "Copiado!"
#: pretix/static/pretixcontrol/js/clipboard.js:29
msgid "Press Ctrl-C to copy!"
msgstr "¡Presione Control+C para copiar!"
msgstr "Presione Control+C para copiar!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:10
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:16
@@ -283,324 +293,332 @@ msgstr "está despois"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:59
msgid "Product"
msgstr "Producto"
msgstr "Produto"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:63
msgid "Product variation"
msgstr ""
msgstr "Ver variacións do produto"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:67
msgid "Current date and time"
msgstr ""
msgstr "Data e hora actual"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:71
msgid "Number of previous entries"
msgstr ""
msgstr "Número de entradas previas"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:75
msgid "Number of previous entries since midnight"
msgstr ""
msgstr "Número de entradas previas desde a medianoite"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:79
msgid "Number of days with a previous entry"
msgstr ""
msgstr "Número de días cunha entrada previa"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:97
msgid "All of the conditions below (AND)"
msgstr ""
msgstr "Todas as condicións seguintes (E)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:98
msgid "At least one of the conditions below (OR)"
msgstr ""
msgstr "Polo menos unha das seguintes condicións (OU)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Event start"
msgstr ""
msgstr "Comezo do evento"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:100
msgid "Event end"
msgstr ""
msgstr "Fin do evento"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:101
msgid "Event admission"
msgstr ""
msgstr "Admisión ao evento"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:102
msgid "custom date and time"
msgstr ""
msgstr "Seleccionar data e hora"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:103
msgid "custom time"
msgstr ""
msgstr "Seleccionar hora"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:104
msgid "Tolerance (minutes)"
msgstr ""
msgstr "Tolerancia (en minutos)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:105
msgid "Add condition"
msgstr ""
msgstr "Engadir condición"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:106
msgid "minutes"
msgstr ""
msgstr "minutos"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
msgstr ""
msgstr "Escanear QR de clientela potencial"
#: pretix/static/pretixcontrol/js/ui/editor.js:71
msgid "Check-in QR"
msgstr ""
msgstr "QR de validación"
#: pretix/static/pretixcontrol/js/ui/editor.js:313
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
msgstr "O arquivo PDF de fondo non se puido cargar polo motivo seguinte:"
#: pretix/static/pretixcontrol/js/ui/editor.js:521
msgid "Group of objects"
msgstr ""
msgstr "Grupo de obxectos"
#: pretix/static/pretixcontrol/js/ui/editor.js:527
msgid "Text object"
msgstr ""
msgstr "Obxecto de texto"
#: pretix/static/pretixcontrol/js/ui/editor.js:529
msgid "Barcode area"
msgstr ""
msgstr "Área para código de barras"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
msgid "Image area"
msgstr ""
msgstr "Área de imaxe"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
msgid "Powered by pretix"
msgstr ""
msgstr "Desenvolto por Pretix"
#: pretix/static/pretixcontrol/js/ui/editor.js:535
msgid "Object"
msgstr ""
msgstr "Obxecto"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
msgid "Ticket design"
msgstr ""
msgstr "Deseño do tícket"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
msgid "Saving failed."
msgstr ""
msgstr "O gardado fallou."
#: pretix/static/pretixcontrol/js/ui/editor.js:862
#: pretix/static/pretixcontrol/js/ui/editor.js:901
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
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
msgstr "Realmente desexa saír do editor sen gardar os cambios?"
#: pretix/static/pretixcontrol/js/ui/mail.js:19
msgid "An error has occurred."
msgstr ""
msgstr "Houbo un erro."
#: pretix/static/pretixcontrol/js/ui/mail.js:54
msgid "Generating messages …"
msgstr ""
msgstr "Xerando mensaxes…"
#: pretix/static/pretixcontrol/js/ui/main.js:70
msgid "Unknown error."
msgstr ""
msgstr "Erro descoñecido."
#: pretix/static/pretixcontrol/js/ui/main.js:271
msgid "Your color has great contrast and is very easy to read!"
msgstr ""
msgstr "A túa cor ten moito contraste e é moi doada de ler!"
#: pretix/static/pretixcontrol/js/ui/main.js:275
msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr ""
"A túa cor ten un contraste axeitado e probablemente sexa suficientemente "
"lexible!"
#: pretix/static/pretixcontrol/js/ui/main.js:279
msgid ""
"Your color has bad contrast for text on white background, please choose a "
"darker shade."
msgstr ""
"A túa cor ten mal contraste para un texto con fondo branco. Por favor, "
"escolle un ton máis escuro."
#: pretix/static/pretixcontrol/js/ui/main.js:417
msgid "All"
msgstr ""
msgstr "Todos"
#: pretix/static/pretixcontrol/js/ui/main.js:418
msgid "None"
msgstr ""
msgstr "Ningún"
#: pretix/static/pretixcontrol/js/ui/main.js:419
msgid "Search query"
msgstr ""
msgstr "Consultar unha procura"
#: pretix/static/pretixcontrol/js/ui/main.js:422
msgid "Selected only"
msgstr ""
msgstr "Soamente seleccionados"
#: pretix/static/pretixcontrol/js/ui/main.js:834
msgid "Use a different name internally"
msgstr ""
msgstr "Usar un nome diferente internamente"
#: pretix/static/pretixcontrol/js/ui/main.js:870
msgid "Click to close"
msgstr ""
msgstr "Click para cerrar"
#: pretix/static/pretixcontrol/js/ui/main.js:911
msgid "You have unsaved changes!"
msgstr ""
msgstr "Tes cambios sen gardar!"
#: pretix/static/pretixcontrol/js/ui/orderchange.js:25
msgid "Calculating default price…"
msgstr ""
msgstr "Calculando o prezo por defecto…"
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
msgstr ""
msgstr "Outros"
#: pretix/static/pretixcontrol/js/ui/question.js:82
msgid "Count"
msgstr ""
msgstr "Cantidade"
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:269
msgid "Yes"
msgstr ""
msgstr "Si"
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:269
msgid "No"
msgstr ""
msgstr "Non"
#: pretix/static/pretixcontrol/js/ui/subevent.js:111
msgid "(one more date)"
msgid_plural "({num} more dates)"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "(unha data máis)"
msgstr[1] "({num} máis datas)"
#: pretix/static/pretixpresale/js/ui/cart.js:43
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr ""
"Os artigos da túa cesta xa non están reservados para ti. Aínda podes "
"completar o teu pedido mentres estean dispoñibles."
#: pretix/static/pretixpresale/js/ui/cart.js:45
msgid "Cart expired"
msgstr ""
msgstr "O carro da compra caducou"
#: pretix/static/pretixpresale/js/ui/cart.js:50
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[0] "Os artigos da túa cesta están reservados para ti durante un minuto."
msgstr[1] ""
"Os artigos da túa cesta están reservados para ti durante {num} minutos."
#: pretix/static/pretixpresale/js/ui/main.js:144
msgid "The organizer keeps %(currency)s %(amount)s"
msgstr ""
msgstr "O organizador queda %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/ui/main.js:152
msgid "You get %(currency)s %(amount)s back"
msgstr ""
msgstr "Obtés %(currency)s %(price)s de volta"
#: pretix/static/pretixpresale/js/ui/main.js:168
msgid "Please enter the amount the organizer can keep."
msgstr ""
msgstr "Por favor, ingrese a cantidade que pode conservar o organizador."
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
msgstr "Por favor, introduza un valor para cada tipo de entrada."
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
msgstr "campo requirido"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
msgstr "Zona horaria:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
msgstr "A súa hora local:"
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
msgid "Sold out"
msgstr ""
msgstr "Esgotado"
#: pretix/static/pretixpresale/js/widget/widget.js:18
msgctxt "widget"
msgid "Buy"
msgstr ""
msgstr "Mercar"
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "Register"
msgstr ""
msgstr "Rexistrarse"
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "Reserved"
msgstr ""
msgstr "Reservado"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "FREE"
msgstr ""
msgstr "De balde"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "from %(currency)s %(price)s"
msgstr ""
msgstr "dende %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/widget/widget.js:23
msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s"
msgstr ""
msgstr "inclúe %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:24
msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s"
msgstr ""
msgstr "máis %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:25
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "impostos incluídos"
#: pretix/static/pretixpresale/js/widget/widget.js:26
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr "máis impostos"
#: pretix/static/pretixpresale/js/widget/widget.js:27
#, javascript-format
msgctxt "widget"
msgid "currently available: %s"
msgstr ""
msgstr "dispoñible actualmente: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:28
msgctxt "widget"
msgid "Only available with a voucher"
msgstr ""
msgstr "Só dispoñible mediante vale"
#: pretix/static/pretixpresale/js/widget/widget.js:29
#, javascript-format
msgctxt "widget"
msgid "minimum amount to order: %s"
msgstr ""
msgstr "cantidade mínima de pedido: %s"
#: pretix/static/pretixpresale/js/widget/widget.js:30
msgctxt "widget"
msgid "Close ticket shop"
msgstr ""
msgstr "Cerrar a tenda de tíckets"
#: pretix/static/pretixpresale/js/widget/widget.js:31
msgctxt "widget"
msgid "The ticket shop could not be loaded."
msgstr ""
msgstr "Non se puido cargar a tenda de tíckets."
#: pretix/static/pretixpresale/js/widget/widget.js:32
msgctxt "widget"
@@ -608,16 +626,19 @@ msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop "
"in a new tab to continue."
msgstr ""
"Actualmente hai moitas persoas usuarias na tenda de tíckets. Por favor, abra "
"a tenda nunha nova pestana para continuar."
#: pretix/static/pretixpresale/js/widget/widget.js:34
msgctxt "widget"
msgid "Open ticket shop"
msgstr ""
msgstr "Abrir a tenda de tíckets"
#: pretix/static/pretixpresale/js/widget/widget.js:35
msgctxt "widget"
msgid "The cart could not be created. Please try again later"
msgstr ""
"O carro de compras non se puido crear. Por favor, inténteo de novo máis tarde"
#: pretix/static/pretixpresale/js/widget/widget.js:36
msgctxt "widget"
@@ -625,11 +646,13 @@ msgid ""
"We could not create your cart, since there are currently too many users in "
"this ticket shop. Please click \"Continue\" to retry in a new tab."
msgstr ""
"Non puidemos crear o seu carro debido a que hai moitas persoas usuarias na "
"tenda. Por favor, presione \"Continuar\" para intentalo nunha nova pestana."
#: pretix/static/pretixpresale/js/widget/widget.js:38
msgctxt "widget"
msgid "Waiting list"
msgstr ""
msgstr "Lista de agarda"
#: pretix/static/pretixpresale/js/widget/widget.js:39
msgctxt "widget"
@@ -637,159 +660,161 @@ msgid ""
"You currently have an active cart for this event. If you select more "
"products, they will be added to your existing cart."
msgstr ""
"Xa ten un carro de compras activo para este evento. Se selecciona máis "
"produtos, estes engadiranse ao carro actual."
#: pretix/static/pretixpresale/js/widget/widget.js:41
msgctxt "widget"
msgid "Resume checkout"
msgstr ""
msgstr "Continuar co pagamento"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Redeem a voucher"
msgstr ""
msgstr "Trocar un vale"
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Redeem"
msgstr ""
msgstr "Trocar"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Voucher code"
msgstr ""
msgstr "Código do cupón"
#: pretix/static/pretixpresale/js/widget/widget.js:45
msgctxt "widget"
msgid "Close"
msgstr ""
msgstr "Cerrar"
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgctxt "widget"
msgid "Continue"
msgstr ""
msgstr "Continuar"
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgctxt "widget"
msgid "See variations"
msgstr ""
msgstr "Ver variacións"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgctxt "widget"
msgid "Choose a different event"
msgstr ""
msgstr "Elixir un evento distinto"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgctxt "widget"
msgid "Choose a different date"
msgstr ""
msgstr "Elixir unha data diferente"
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "Atrás"
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "Mes seguinte"
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "Mes anterior"
#: pretix/static/pretixpresale/js/widget/widget.js:53
msgctxt "widget"
msgid "Next week"
msgstr ""
msgstr "Semana seguinte"
#: pretix/static/pretixpresale/js/widget/widget.js:54
msgctxt "widget"
msgid "Previous week"
msgstr ""
msgstr "Semana anterior"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgctxt "widget"
msgid "Open seat selection"
msgstr ""
msgstr "Abrir selección de asentos"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgctxt "widget"
msgid "Load more"
msgstr ""
msgstr "Cargar máis"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "Mo"
msgstr ""
msgstr "Lu"
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "Tu"
msgstr ""
msgstr "Mar"
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "We"
msgstr ""
msgstr "Mér"
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "Th"
msgstr ""
msgstr "Xo"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "Fr"
msgstr ""
msgstr "Ve"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "Sa"
msgstr ""
msgstr "Sáb"
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "Su"
msgstr ""
msgstr "Dom"
#: pretix/static/pretixpresale/js/widget/widget.js:67
msgid "January"
msgstr ""
msgstr "Xaneiro"
#: pretix/static/pretixpresale/js/widget/widget.js:68
msgid "February"
msgstr ""
msgstr "Febreiro"
#: pretix/static/pretixpresale/js/widget/widget.js:69
msgid "March"
msgstr ""
msgstr "Marzo"
#: pretix/static/pretixpresale/js/widget/widget.js:70
msgid "April"
msgstr ""
msgstr "Abril"
#: pretix/static/pretixpresale/js/widget/widget.js:71
msgid "May"
msgstr ""
msgstr "Maio"
#: pretix/static/pretixpresale/js/widget/widget.js:72
msgid "June"
msgstr ""
msgstr "Xuño"
#: pretix/static/pretixpresale/js/widget/widget.js:73
msgid "July"
msgstr ""
msgstr "Xullo"
#: pretix/static/pretixpresale/js/widget/widget.js:74
msgid "August"
msgstr ""
msgstr "Agosto"
#: pretix/static/pretixpresale/js/widget/widget.js:75
msgid "September"
msgstr ""
msgstr "Setembro"
#: pretix/static/pretixpresale/js/widget/widget.js:76
msgid "October"
msgstr ""
msgstr "Outubro"
#: pretix/static/pretixpresale/js/widget/widget.js:77
msgid "November"
msgstr ""
msgstr "Novembro"
#: pretix/static/pretixpresale/js/widget/widget.js:78
msgid "December"
msgstr ""
msgstr "Decembro"
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -513,20 +513,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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-"
@@ -563,22 +563,22 @@ msgstr "%(currency) %(price)-tól"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "A kosár lejárt"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+13 -22
View File
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-07-19 11:57+0000\n"
"Last-Translator: dedecosta <dedecosta2@live.it>\n"
"POT-Creation-Date: 2021-11-30 16:13+0000\n"
"PO-Revision-Date: 2021-11-20 03:00+0000\n"
"Last-Translator: Marco Giacopuzzi <marco.giaco2000@gmail.com>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
"js/it/>\n"
"Language: it\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.6\n"
"X-Generator: Weblate 4.8\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -195,9 +195,6 @@ msgid "Currently inside"
msgstr "Attualmente all'interno"
#: pretix/static/lightbox/js/lightbox.js:96
#, fuzzy
#| msgctxt "widget"
#| msgid "Close"
msgid "close"
msgstr "Chiudi"
@@ -496,22 +493,18 @@ msgstr[0] "(un'altra data)"
msgstr[1] "({num} altre date)"
#: pretix/static/pretixpresale/js/ui/cart.js:43
#, fuzzy
#| msgid "The items in your cart are no longer reserved for you."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr "I prodotti nel tuo carrello non sono più disponibili."
msgstr ""
"Gli articoli nel tuo carrello non sono più riservati per te. Puoi ancora "
"completare il tuo ordine finché sono disponibili."
#: pretix/static/pretixpresale/js/ui/cart.js:45
msgid "Cart expired"
msgstr "Carrello scaduto"
#: pretix/static/pretixpresale/js/ui/cart.js:50
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Gli elementi nel tuo carrello sono riservati per 1 minuto."
@@ -529,20 +522,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "richiesto"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Fuso orario:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Ora locale:"
@@ -742,11 +735,9 @@ msgid "Open seat selection"
msgstr "Apri la selezione dei posti"
#: pretix/static/pretixpresale/js/widget/widget.js:56
#, fuzzy
#| msgid "Load more"
msgctxt "widget"
msgid "Load more"
msgstr "Carica di più"
msgstr "Mostra di più"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "Mo"
File diff suppressed because it is too large Load Diff
+31 -24
View File
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2021-10-11 15:56+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+0000\n"
"PO-Revision-Date: 2021-12-13 21:00+0000\n"
"Last-Translator: DJG Bayern <pretix2021weblate@aruki.de>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
"js/ja/>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/"
"pretix-js/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -48,8 +48,9 @@ msgid "Contacting Stripe …"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:60
#, fuzzy
msgid "Total"
msgstr ""
msgstr "合計"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:152
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:183
@@ -74,7 +75,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
msgid "Search results"
msgstr ""
msgstr "検索結果"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34
msgid "No tickets found"
@@ -85,20 +86,22 @@ msgid "Result"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36
#, fuzzy
msgid "This ticket requires special attention"
msgstr ""
msgstr "要注意チケット"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
#, fuzzy
msgid "Switch direction"
msgstr ""
msgstr "方向転換"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
msgid "Entry"
msgstr ""
msgstr "入口"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr ""
msgstr "出口"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"
@@ -110,16 +113,16 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:42
msgid "Valid"
msgstr ""
msgstr "有効"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:43
msgid "Unpaid"
msgstr ""
msgstr "未払い"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45
msgid "Canceled"
msgstr ""
msgstr "キャンセル"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Redeemed"
@@ -127,11 +130,12 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Cancel"
msgstr ""
msgstr "キャンセル"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
#, fuzzy
msgid "Continue"
msgstr ""
msgstr "次へ"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
@@ -139,16 +143,19 @@ msgid "Ticket not paid"
msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
#, fuzzy
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
msgstr "チケットの支払いが完了していません。このまま続けますか?"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
#, fuzzy
msgid "Additional information required"
msgstr ""
msgstr "追加情報が必要です"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
#, fuzzy
msgid "Valid ticket"
msgstr ""
msgstr "有効なチケット"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53
msgid "Exit recorded"
@@ -196,7 +203,7 @@ msgstr ""
#: pretix/static/lightbox/js/lightbox.js:96
msgid "close"
msgstr ""
msgstr "閉じる"
#: pretix/static/pretixbase/js/asynctask.js:43
#: pretix/static/pretixbase/js/asynctask.js:119
@@ -504,20 +511,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+95 -141
View File
@@ -7,18 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"PO-Revision-Date: 2019-11-13 06:00+0000\n"
"Last-Translator: Zane Smite <z.smite@riga-jurmala.com>\n"
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
"js/lv/>\n"
"POT-Creation-Date: 2021-11-29 08:28+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-js/lv/>\n"
"Language: lv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
"X-Generator: Weblate 3.5.1\n"
"X-Generator: Weblate 4.8\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -63,181 +63,155 @@ msgstr "Tiek veidots savienojums ar jūsu banku …"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
msgid "Select a check-in list"
msgstr ""
msgstr "Izvēlēties check-in sarakstu"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
msgid "No active check-in lists found."
msgstr ""
msgstr "Netika atrasts aktīvs check-in saraksts."
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
msgid "Switch check-in list"
msgstr ""
msgstr "Samainīt check-in sarakstu"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
msgid "Search results"
msgstr ""
msgstr "Meklēšanas rezultāti"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34
#, fuzzy
#| msgctxt "widget"
#| msgid "Close ticket shop"
msgid "No tickets found"
msgstr "Aizvērt biļešu veikalu"
msgstr "Biļetes netika atrastas"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:35
msgid "Result"
msgstr ""
msgstr "Rezultāts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36
msgid "This ticket requires special attention"
msgstr ""
msgstr "Šai biļetei jāpievērš uzmanība"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
msgid "Switch direction"
msgstr ""
msgstr "Samainīt virzienu"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
msgid "Entry"
msgstr ""
msgstr "Ieeja"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr ""
msgstr "Izeja"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"
msgstr ""
msgstr "Noskanē biļeti vai meklē un nospied atgriezties…"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:41
msgid "Load more"
msgstr ""
msgstr "Ielādēt vairāk"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:42
msgid "Valid"
msgstr ""
msgstr "Derīgs"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:43
msgid "Unpaid"
msgstr ""
msgstr "Neapmaksāts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45
msgid "Canceled"
msgstr ""
msgstr "Atcelts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
#, fuzzy
#| msgctxt "widget"
#| msgid "Redeem"
msgid "Redeemed"
msgstr "Izmantot"
msgstr "Izpirkts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Cancel"
msgstr ""
msgstr "Atcelt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
#, fuzzy
#| msgctxt "widget"
#| msgid "Continue"
msgid "Continue"
msgstr "Turpināt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Ticket not paid"
msgstr ""
msgstr "Biļete nav apmaksāta"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
msgstr "Šī biļete vēl nav apmaksāta. Vai vēlaties turpināt?"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
msgid "Additional information required"
msgstr ""
msgstr "Nepieciešama papildus informācija"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "Valid ticket"
msgstr ""
msgstr "Derīga biļete"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53
msgid "Exit recorded"
msgstr ""
msgstr "Izeja ierakstīta"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:54
msgid "Ticket already used"
msgstr ""
msgstr "Šī biļete jau ir izmantota"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:55
msgid "Information required"
msgstr ""
msgstr "Nepieciešama informācija"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
#, fuzzy
#| msgid "Unknown error."
msgid "Unknown ticket"
msgstr "Nezināma kļūda."
msgstr "Neatpazīta biļete"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Ticket type not allowed here"
msgstr ""
msgstr "Biļetes veids nav šeit derīgs"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
msgid "Entry not allowed"
msgstr ""
msgstr "Ieeja nav atļauta"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket code revoked/changed"
msgstr ""
msgstr "Biļetes kods atsaukts/izmainīts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Order canceled"
msgstr ""
msgstr "Pasūtījums ir atcelts"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
#, fuzzy
#| msgid "Check-in QR"
msgid "Checked-in Tickets"
msgstr "Reģistrācijas QR"
msgstr "Reģistrētās biļetes"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Valid Tickets"
msgstr ""
msgstr "Derīgās biļetes"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Currently inside"
msgstr ""
msgstr "Šobrīd iekšā"
#: pretix/static/lightbox/js/lightbox.js:96
#, fuzzy
#| msgctxt "widget"
#| msgid "Close"
msgid "close"
msgstr "Aizvērt"
msgstr "aizvērt"
#: pretix/static/pretixbase/js/asynctask.js:43
#: pretix/static/pretixbase/js/asynctask.js:119
#, fuzzy
#| msgid ""
#| "Your request has been queued on the server and will now be processed. "
#| "Depending on the size of your event, this might take up to a few minutes."
msgid ""
"Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes."
msgstr ""
"Jūsu pieprasījums ir ievietots rindā serverī un drīz tiks apstrādāts. "
"Atkarībā no pieprasījuma izmēra, process var aizņemt līdz dažām minūtēm."
"Jūsu pieprasījums tiek apstrādāts. Atkarībā no pasākuma lieluma, process var "
"aizņemt līdz dažām minūtēm."
#: pretix/static/pretixbase/js/asynctask.js:48
#: pretix/static/pretixbase/js/asynctask.js:124
#, fuzzy
#| msgid ""
#| "Your request has been queued on the server and will now be processed. "
#| "Depending on the size of your event, this might take up to a few minutes."
msgid "Your request has been queued on the server and will soon be processed."
msgstr ""
"Jūsu pieprasījums ir ievietots rindā serverī un drīz tiks apstrādāts. "
"Atkarībā no pieprasījuma izmēra, process var aizņemt līdz dažām minūtēm."
msgstr "Jūsu pieprasījums ir ievietots rindā serverī un drīz tiks apstrādāts."
#: pretix/static/pretixbase/js/asynctask.js:54
#: pretix/static/pretixbase/js/asynctask.js:130
@@ -267,8 +241,6 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:144
#: pretix/static/pretixcontrol/js/ui/mail.js:21
#, fuzzy
#| msgid "The request took to long. Please try again."
msgid "The request took too long. Please try again."
msgstr "Mēģinājums izpildīt pieprasījumu ir ieildzis. Lūdzu, mēģiniet vēlreiz."
@@ -310,82 +282,79 @@ msgstr "Nospiediet Ctrl-C, lai nokopētu!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:10
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:16
msgid "is one of"
msgstr ""
msgstr "ir viens no"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:22
msgid "is before"
msgstr ""
msgstr "ir pirms"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:26
msgid "is after"
msgstr ""
msgstr "ir pēc"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:59
msgid "Product"
msgstr ""
msgstr "Produkts"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:63
#, fuzzy
#| msgctxt "widget"
#| msgid "See variations"
msgid "Product variation"
msgstr "Apskatīt iespējas"
msgstr "Produkta variācija"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:67
msgid "Current date and time"
msgstr ""
msgstr "Datums un laiks"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:71
msgid "Number of previous entries"
msgstr ""
msgstr "Iepriekšējo ierakstu skaits"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:75
msgid "Number of previous entries since midnight"
msgstr ""
msgstr "Iepriekšējo pieslēgumu skaits kopš pusnakts"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:79
msgid "Number of days with a previous entry"
msgstr ""
msgstr "Dienu skaits ar iepriekšējo ierakstu"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:97
msgid "All of the conditions below (AND)"
msgstr ""
msgstr "Visi nosacījumi, kas zemāk (AND)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:98
msgid "At least one of the conditions below (OR)"
msgstr ""
msgstr "Vismaz viens nosacījums, kas zemāk (OR)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Event start"
msgstr ""
msgstr "Pasākums sākas"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:100
msgid "Event end"
msgstr ""
msgstr "Pasākums beidzas"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:101
msgid "Event admission"
msgstr ""
msgstr "Ieeja pasākumā"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:102
msgid "custom date and time"
msgstr ""
msgstr "pielāgots datums un laiks"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:103
msgid "custom time"
msgstr ""
msgstr "pielāgots laiks"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:104
msgid "Tolerance (minutes)"
msgstr ""
msgstr "Pielaide (minūtes)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:105
msgid "Add condition"
msgstr ""
msgstr "Pievienot nosacījumu"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:106
msgid "minutes"
msgstr ""
msgstr "minūtes"
#: pretix/static/pretixcontrol/js/ui/editor.js:69
msgid "Lead Scan QR"
@@ -412,10 +381,8 @@ msgid "Barcode area"
msgstr "Svītru koda lauks"
#: pretix/static/pretixcontrol/js/ui/editor.js:531
#, fuzzy
#| msgid "Barcode area"
msgid "Image area"
msgstr "Svītru koda lauks"
msgstr "Attēla lauks"
#: pretix/static/pretixcontrol/js/ui/editor.js:533
msgid "Powered by pretix"
@@ -427,7 +394,7 @@ msgstr "Objekts"
#: pretix/static/pretixcontrol/js/ui/editor.js:539
msgid "Ticket design"
msgstr "Biļešu dizains"
msgstr "Biļetes dizains"
#: pretix/static/pretixcontrol/js/ui/editor.js:813
msgid "Saving failed."
@@ -459,13 +426,13 @@ msgstr "Nezināma kļūda."
#: pretix/static/pretixcontrol/js/ui/main.js:271
msgid "Your color has great contrast and is very easy to read!"
msgstr "Izvēlētā teksta krāsa ļoti labi izceļas un ir viegli lasāma!"
msgstr "Izvēlētā teksta krāsa ļoti labi izceļas un ir viegli izlasāma!"
#: pretix/static/pretixcontrol/js/ui/main.js:275
msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr ""
"Izvēlētā teksta krāsa pietiekami izceļas un visdrīzāk būs samērā viegli "
"lasāma!"
"izlasāma!"
#: pretix/static/pretixcontrol/js/ui/main.js:279
msgid ""
@@ -485,11 +452,11 @@ msgstr "Neviens"
#: pretix/static/pretixcontrol/js/ui/main.js:419
msgid "Search query"
msgstr ""
msgstr "Meklēšanas pieprasījums"
#: pretix/static/pretixcontrol/js/ui/main.js:422
msgid "Selected only"
msgstr ""
msgstr "Tikai atzīmētos"
#: pretix/static/pretixcontrol/js/ui/main.js:834
msgid "Use a different name internally"
@@ -501,7 +468,7 @@ msgstr "Noklikšķiniet, lai aizvērtu"
#: pretix/static/pretixcontrol/js/ui/main.js:911
msgid "You have unsaved changes!"
msgstr ""
msgstr "Jums ir nesaglabātas izmaiņas!"
#: pretix/static/pretixcontrol/js/ui/orderchange.js:25
msgid "Calculating default price…"
@@ -533,64 +500,52 @@ msgstr[1] "(vēl viens datums)"
msgstr[2] "(vēl {num} datumi)"
#: pretix/static/pretixpresale/js/ui/cart.js:43
#, fuzzy
#| msgid "The items in your cart are no longer reserved for you."
msgid ""
"The items in your cart are no longer reserved for you. You can still "
"complete your order as long as theyre available."
msgstr "Jūsu grozā saglabātajām precēm rezervācijas laiks ir beidzies."
msgstr ""
"Jūsu grozā esošās preces jums vairs nav rezervētas. Jūs joprojām variet "
"pabeigt pasūtījumu, kamēr tās ir pieejamas."
#: pretix/static/pretixpresale/js/ui/cart.js:45
msgid "Cart expired"
msgstr "Pirkumu groza rezervācijas laiks ir beidzies"
#: pretix/static/pretixpresale/js/ui/cart.js:50
#, fuzzy
#| msgid "The items in your cart are reserved for you for one minute."
#| msgid_plural ""
#| "The items in your cart are reserved for you for {num} minutes."
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] "Preces jūsu grozā ir rezervētas nulle minūtes."
msgstr[1] "Preces jūsu grozā ir rezervētas uz vienu minūti."
msgstr[1] "Preces jūsu grozā ir rezervētas vienu minūti."
msgstr[2] "Preces jūsu grozā ir rezervētas uz {num} minūtēm."
#: pretix/static/pretixpresale/js/ui/main.js:144
#, fuzzy
#| msgctxt "widget"
#| msgid "from %(currency)s %(price)s"
msgid "The organizer keeps %(currency)s %(amount)s"
msgstr "no %(currency)s %(price)s"
msgstr "Pasākuma organizators patur %(valūta)s %(skaits)s"
#: pretix/static/pretixpresale/js/ui/main.js:152
#, fuzzy
#| msgctxt "widget"
#| msgid "from %(currency)s %(price)s"
msgid "You get %(currency)s %(amount)s back"
msgstr "no %(currency)s %(price)s"
msgstr "Jūs saņemsiet %(valūta)s %(cena)s atpakaļ"
#: pretix/static/pretixpresale/js/ui/main.js:168
msgid "Please enter the amount the organizer can keep."
msgstr ""
msgstr "Lūdzu ievadiet skaitu (summu), ko pasākuma organizators var paturēt."
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#, fuzzy
#| msgid "Cart expired"
#: pretix/static/pretixpresale/js/ui/main.js:375
msgid "required"
msgstr "Pirkumu groza rezervācijas laiks ir beidzies"
msgstr "obligāts"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
msgstr "Laika zona:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
msgstr "Vietējais laiks:"
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
@@ -615,7 +570,7 @@ msgstr "Rezervēts"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "FREE"
msgstr "Bezmaksas"
msgstr "BEZMAKSAS"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
@@ -625,7 +580,7 @@ msgstr "no %(currency)s %(price)s"
#: pretix/static/pretixpresale/js/widget/widget.js:23
msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s"
msgstr "iekļ. %(rate)s% %(taxname)s"
msgstr "iesk. %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:24
msgctxt "widget"
@@ -635,7 +590,7 @@ msgstr "plus %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:25
msgctxt "widget"
msgid "incl. taxes"
msgstr "iekļ. nodokļus"
msgstr "iesk. nodokļus"
#: pretix/static/pretixpresale/js/widget/widget.js:26
msgctxt "widget"
@@ -675,14 +630,13 @@ msgid ""
"There are currently a lot of users in this ticket shop. Please open the shop "
"in a new tab to continue."
msgstr ""
"Šobrīd biļešu veikalā ir pārāk daudz lietotāji. Lūdzu atveriet i-veikalu "
"jaunā lapā, lai turpinātu."
#: pretix/static/pretixpresale/js/widget/widget.js:34
#, fuzzy
#| msgctxt "widget"
#| msgid "Close ticket shop"
msgctxt "widget"
msgid "Open ticket shop"
msgstr "Aizvērt biļešu veikalu"
msgstr "Atvērt biļešu veikalu"
#: pretix/static/pretixpresale/js/widget/widget.js:35
msgctxt "widget"
@@ -696,6 +650,9 @@ msgid ""
"We could not create your cart, since there are currently too many users in "
"this ticket shop. Please click \"Continue\" to retry in a new tab."
msgstr ""
"Jūsu pirkumu grozu nebija iespējams izveidot, jo šobrīd ir pārāk daudz "
"lietotāji i-veikalā. Lūdzu nospiediet \"Turpināt\", lai mēģinātu vēlreiz "
"jaunā lapā."
#: pretix/static/pretixpresale/js/widget/widget.js:38
msgctxt "widget"
@@ -774,15 +731,12 @@ msgstr "Iepriekšējais mēnesis"
#: pretix/static/pretixpresale/js/widget/widget.js:53
msgctxt "widget"
msgid "Next week"
msgstr ""
msgstr "Nākamā nedēļa"
#: pretix/static/pretixpresale/js/widget/widget.js:54
#, fuzzy
#| msgctxt "widget"
#| msgid "Previous month"
msgctxt "widget"
msgid "Previous week"
msgstr "Iepriekšējais mēnesis"
msgstr "Iepriekšējā nedēļa"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgctxt "widget"
@@ -792,7 +746,7 @@ msgstr "Atvērt sēdvietu izvēlni"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgctxt "widget"
msgid "Load more"
msgstr ""
msgstr "Ielādēt vairāk"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "Mo"
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: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -517,20 +517,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -522,20 +522,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "verplicht"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Uw lokale tijd:"
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: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -504,20 +504,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
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: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+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/"
@@ -532,20 +532,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:335
#: pretix/static/pretixpresale/js/ui/main.js:349
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:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr "verplicht"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr "Tijdzone:"
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr "Je lokale tijd:"
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+0000\n"
"PO-Revision-Date: 2019-09-24 19:00+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
@@ -570,22 +570,22 @@ msgstr "od %(currency)s %(price)s"
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr "Proszę wybrać liczbę dla jednego z typów biletów."
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
#, fuzzy
#| msgid "Cart expired"
msgid "required"
msgstr "Koszyk wygasł"
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
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: 2021-10-29 10:10+0000\n"
"POT-Creation-Date: 2021-11-30 16:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -507,20 +507,20 @@ msgstr ""
msgid "Please enter the amount the organizer can keep."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:335
#: pretix/static/pretixpresale/js/ui/main.js:349
msgid "Please enter a quantity for one of the ticket types."
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:371
#: pretix/static/pretixpresale/js/ui/main.js:385
msgid "required"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:473
#: pretix/static/pretixpresale/js/ui/main.js:491
#: pretix/static/pretixpresale/js/ui/main.js:488
#: pretix/static/pretixpresale/js/ui/main.js:507
msgid "Time zone:"
msgstr ""
#: pretix/static/pretixpresale/js/ui/main.js:482
#: pretix/static/pretixpresale/js/ui/main.js:498
msgid "Your local time:"
msgstr ""
File diff suppressed because it is too large Load Diff

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