Compare commits

...

2058 Commits

Author SHA1 Message Date
Raphael Michel
41b56c00e5 Bump version to 2.4.0 2019-02-04 16:05:32 +01:00
Raphael Michel
cb17febf7c Add squashed migration 2019-02-04 15:48:29 +01:00
Raphael Michel
07d42a4d77 Invoice exporter: Fix missing filter on query 2019-02-04 14:47:24 +01:00
Raphael Michel
e3ebf887a4 Implement Invoice.__repr__ 2019-02-04 14:07:18 +01:00
Raphael Michel
0440187e59 Do not break on empty invoices
Sentry PRETIXEU-S8
2019-02-04 14:07:01 +01:00
Raphael Michel
dfcda0fa2c Merge pull request #1158 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-02-04 13:52:53 +01:00
Maarten van den Berg
560c0a8729 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2960 of 2960 strings)

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

powered by weblate
2019-02-04 08:45:08 +00:00
Maarten van den Berg
bc80b60b04 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2960 of 2960 strings)

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

powered by weblate
2019-02-04 08:45:08 +00:00
Maarten van den Berg
08bf3648ea Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2960 of 2960 strings)

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

powered by weblate
2019-02-04 08:45:08 +00:00
Raphael Michel
f8ee7acad6 Fix import order 2019-02-04 09:38:09 +01:00
Raphael Michel
10c86869ea Sendmail: Do not fail to show logs with status "r"
Fix sentry PRETIXEU-S3
2019-02-04 09:10:19 +01:00
Raphael Michel
9034a98df9 Remove empty translation block 2019-02-01 17:38:32 +01:00
Raphael Michel
a7142fdf55 Merge pull request #1156 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-02-01 17:38:19 +01:00
Raphael Michel
ee97c46aec Translated on translate.pretix.eu (German)
Currently translated at 99.9% (2959 of 2960 strings)

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

powered by weblate
2019-02-01 16:38:02 +00:00
Raphael Michel
7063f32f24 Translated on translate.pretix.eu (German (informal))
Currently translated at 99.9% (2959 of 2960 strings)

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

powered by weblate
2019-02-01 16:37:37 +00:00
Raphael Michel
2ec926b7c7 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-02-01 17:27:33 +01:00
Flavia Bastos
834b5a26a5 Adjust message if there's only one addon (#1147)
Relates to #1091
2019-02-01 17:26:37 +01:00
Raphael Michel
90f08d0aca Merge pull request #1146 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-02-01 17:26:00 +01:00
Alvaro Enrique Ruano
d5c2637198 Translated on translate.pretix.eu (Spanish)
Currently translated at 95.3% (2796 of 2934 strings)

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

powered by weblate
2019-02-01 16:25:27 +00:00
Raphael Michel
f517ba51bd Added translation on translate.pretix.eu (Greek) 2019-02-01 16:25:27 +00:00
Raphael Michel
d738198ec5 Added translation on translate.pretix.eu (Greek) 2019-02-01 16:25:27 +00:00
Maarten van den Berg
b1ce58d06c Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-02-01 16:25:27 +00:00
Maarten van den Berg
b26ef74128 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-02-01 16:25:27 +00:00
Maarten van den Berg
4f8c8ea917 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-02-01 16:25:27 +00:00
Maarten van den Berg
0803b049af Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-02-01 16:25:27 +00:00
Raphael Michel
97f3fbdb80 Fix legacy field name
Sentry PRETIXEU-S0
2019-02-01 17:20:48 +01:00
Raphael Michel
434b6e4729 Offer multi-sheet order report 2019-02-01 17:20:00 +01:00
Raphael Michel
f56bceb55f Remove a redundant string 2019-02-01 16:53:37 +01:00
Raphael Michel
2aa246b3d5 Allow to exclude items from ticket generation explicitly 2019-02-01 16:48:58 +01:00
Raphael Michel
f77b551aa6 Badges: Allow to disable per-product 2019-02-01 16:48:58 +01:00
Raphael Michel
c9415cba2b Allow to add a custom text above the payment choice 2019-02-01 16:48:58 +01:00
Raphael Michel
4dae224d73 Statistics: Ellipsize long product names 2019-02-01 16:48:58 +01:00
Raphael Michel
13cc57e98b Add multi-sheet export for invoices 2019-02-01 16:45:48 +01:00
Raphael Michel
6f980b82ac Sort exporters by name alphabetically 2019-01-31 18:44:12 +01:00
Raphael Michel
f32c581a9e Add MultiSheetListExporter base class 2019-01-31 18:43:42 +01:00
Thomas Schüßler
fcadfffb92 fixed a typo (#1152) 2019-01-30 14:36:20 +01:00
Raphael Michel
9e43459879 Widget: Guard against missing xhr.responseURL in Internet Explorer 2019-01-30 12:12:25 +01:00
Raphael Michel
87424c25de Logging: Automatically serialize file objects
Sentry PRETIXEU-RY
2019-01-30 10:59:00 +01:00
Raphael Michel
acdf7d62b5 Sort migrations 2019-01-30 10:17:16 +01:00
Raphael Michel
944138f7a9 Flake8 update 2019-01-30 09:31:34 +01:00
Raphael Michel
5da2eab1fb Fix deletion order 2019-01-30 09:26:01 +01:00
Raphael Michel
d680937a6c Work around flake8 issues 2019-01-30 08:59:58 +01:00
Raphael Michel
f35c2544b6 Do not attach empty files for orders without tickets 2019-01-29 17:12:38 +01:00
Raphael Michel
0285cd12f7 Optimize SQL queries in order list and order search 2019-01-29 16:45:01 +01:00
Martin Gross
03cacace57 Fix missing/redundant favicon 2019-01-28 17:57:12 +01:00
Martin Gross
6ed016e49e Define Favicons on Organizer-level 2019-01-28 17:29:39 +01:00
Raphael Michel
da8da01614 Fix #1148 -- Reduce number of cases in which we show "Reserved" 2019-01-28 10:43:52 +01:00
Raphael Michel
9a2ea6699a Fix obsolete tests 2019-01-28 09:10:18 +01:00
Raphael Michel
51a8bac9e6 Enforce type of log data 2019-01-28 09:10:18 +01:00
Raphael Michel
303ed07504 Voucher API: Never use a list in log_action(data) 2019-01-28 09:10:18 +01:00
bastardop
c7627f631f Docs: Added Debian dependency (#1149)
the libopenjp2-7-dev Packages was required during installation on raspbian
2019-01-28 08:59:49 +01:00
Raphael Michel
604c31c6e2 Bank transfer: Allow to manually accept payments of all amounts 2019-01-28 08:49:19 +01:00
Raphael Michel
c3da6731a1 Allow to delete an event with cart positions 2019-01-25 15:59:34 +01:00
Raphael Michel
6e556ab09b Fix wrong warning message 2019-01-25 13:13:45 +01:00
Raphael Michel
16622883f6 Add referer meta tag to backend 2019-01-25 11:08:56 +01:00
Raphael Michel
cce4379d3e Type-cast cancellation fee 2019-01-24 10:11:24 +01:00
Raphael Michel
5af99f4f1a Check-in: Do not ask questions that are already answered 2019-01-23 16:05:27 +01:00
Raphael Michel
9ed49888b8 Fix #1144 -- Make invoice form all-optional in backend 2019-01-23 10:27:09 +01:00
Raphael Michel
5bfb00db73 Upgrade bs4 and be compatible to latest soupsieve 2019-01-23 09:44:03 +01:00
Raphael Michel
a031d72ca9 Widget: Follow redirects 2019-01-22 18:06:56 +01:00
Raphael Michel
15a190cdf3 Widget: Remove debug output 2019-01-22 17:23:13 +01:00
Raphael Michel
d181375479 Consistent number formatting in widget 2019-01-21 10:54:30 +01:00
Raphael Michel
d8a57b0baa Conditionally show decimal places for tax rates 2019-01-21 10:53:50 +01:00
Raphael Michel
d482bc9de0 Prevent accumulation of tax rates when copying events 2019-01-21 10:43:27 +01:00
Raphael Michel
5c030796d7 Add more information to event copy choice 2019-01-21 10:37:54 +01:00
Raphael Michel
f6eb3bfb80 Remove redundant form option 2019-01-21 10:27:44 +01:00
Raphael Michel
3703fbcacf Do not allow customers to cancel checked-in orders 2019-01-21 09:09:54 +01:00
Lukas Bockstaller
cdea6eb55e Updates the dependency versions for flake 8 (#1143) 2019-01-21 08:58:26 +01:00
Maarten van den Berg
bf1e9d47d0 Fix #1111 -- Duplicate voucher warning (#1142)
Adds a new method to Voucher that selects all distinct orders containing
a position where the Voucher has been used, and changes the Voucher
detail view to use this method for the warning.
2019-01-21 08:52:31 +01:00
Raphael Michel
350df2a3cc Merge pull request #1141 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-21 08:51:21 +01:00
Maarten van den Berg
bc6915b251 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-21 05:00:28 +00:00
Maarten van den Berg
f9c7eeff9a Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-21 05:00:07 +00:00
Maarten van den Berg
247bcf0a20 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-20 06:00:09 +00:00
Maarten van den Berg
455c961fc7 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-19 21:39:08 +00:00
Maarten van den Berg
9052d4a7a9 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-19 21:13:37 +00:00
Raphael Michel
589401e8d2 Merge pull request #1140 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-18 17:38:24 +01:00
Raphael Michel
0c366a8473 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-18 16:38:00 +00:00
Raphael Michel
c9ddbd0e88 Merge pull request #1139 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-18 17:37:56 +01:00
Raphael Michel
31bf0c24f1 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-18 16:37:29 +00:00
Raphael Michel
c74386346b Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2934 of 2934 strings)

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

powered by weblate
2019-01-18 16:34:22 +00:00
Raphael Michel
725e1f019e Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-01-18 17:25:27 +01:00
Raphael Michel
06eddb2c6d Self-service refund form (#1135)
* Auto-refund

* Add missing template

* Notification for requested refund

* Model-level tests

* Add front-end tests

* Default to notify
2019-01-18 17:24:42 +01:00
Raphael Michel
80b5750756 New content for / index page 2019-01-18 17:24:28 +01:00
Raphael Michel
f37d265534 Refresh design for auth and error pages 2019-01-18 17:24:28 +01:00
Raphael Michel
7c4a1e5fb8 Merge pull request #1138 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-18 16:56:39 +01:00
sohalt
9a045c76ec Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2907 of 2907 strings)

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

powered by weblate
2019-01-18 03:06:42 +00:00
Lorhan Sohaky
447b36fdd3 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 15.9% (462 of 2907 strings)

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

powered by weblate
2019-01-16 23:00:17 +00:00
Guillaume Petit
5dbd984178 Translated on translate.pretix.eu (French)
Currently translated at 80.0% (2326 of 2907 strings)

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

powered by weblate
2019-01-16 22:00:09 +00:00
Raphael Michel
95f96f8321 Fix default public name of bank transfer 2019-01-16 08:26:56 +01:00
Raphael Michel
3933032778 Merge pull request #1136 from MacLemon/tippfehler-ausbessern
Corrected language typo.
2019-01-14 22:53:09 +01:00
Pepi Zawodsky
d0b18d9f64 Corrected language typo.
Dieser Satz kein Hilfsverb.
2019-01-14 22:41:12 +01:00
Raphael Michel
71de71ed37 PDF: Fix bug with rendering name parts 2019-01-14 11:37:58 +01:00
Raphael Michel
3438d079d5 Fix a sign error 2019-01-13 11:48:52 +01:00
Raphael Michel
e7730333c2 Show refund status to customer on order page 2019-01-12 22:33:09 +01:00
Raphael Michel
e8b9f0a3ae Frontend order view: Do not recommend download for canceled orders 2019-01-12 22:19:10 +01:00
Raphael Michel
77ebd18404 Backend order view: Show canceled fees 2019-01-12 22:18:55 +01:00
Raphael Michel
2d48198c83 Ignore database-level floating point errors 2019-01-12 22:18:36 +01:00
Raphael Michel
d103b0bb84 Weblate script: pull after push 2019-01-12 17:09:18 +01:00
Raphael Michel
01411b84e4 Merge pull request #1134 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-12 17:03:02 +01:00
Raphael Michel
b7e154d8c9 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2907 of 2907 strings)

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

powered by weblate
2019-01-12 16:02:41 +00:00
Raphael Michel
f39ac96322 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2907 of 2907 strings)

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

powered by weblate
2019-01-12 16:01:53 +00:00
Raphael Michel
74db808978 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-01-12 16:55:03 +01:00
Raphael Michel
ab72b93706 Invoice: Show number of pages next to page number 2019-01-12 16:54:37 +01:00
Raphael Michel
af5aece639 Add beneficiaries to invoice addresses 2019-01-12 16:54:37 +01:00
Raphael Michel
228ab15900 Bank transfer: Allow to set custom public name 2019-01-12 16:54:37 +01:00
Raphael Michel
66164d8202 Invoice renderer: Make it easier to change fonts 2019-01-12 16:54:37 +01:00
Raphael Michel
d5ac155914 Add is_available hook for plugin configs 2019-01-12 16:54:37 +01:00
Raphael Michel
75a966529e Merge pull request #1132 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-11 15:57:47 +01:00
Raphael Michel
28a6a6185d Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2904 of 2904 strings)

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

powered by weblate
2019-01-11 14:57:27 +00:00
Raphael Michel
07cdaa9ca9 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2904 of 2904 strings)

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

powered by weblate
2019-01-11 14:57:13 +00:00
Raphael Michel
1c6935ebd9 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-01-11 15:47:30 +01:00
Raphael Michel
60c1ea8aad Allow to keep cancellation fees (#1130)
* Allow to keep cancellation fees

* Add tests and clarifications

* Add API
2019-01-11 15:42:33 +01:00
Raphael Michel
0b8798a65c Add self-crashing test 2019-01-10 18:17:29 +01:00
Raphael Michel
a8836cbeec Remove some irregularities in 8abfbba9 2019-01-10 17:41:18 +01:00
Raphael Michel
336a34b10b Merge pull request #1131 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-10 17:24:31 +01:00
Raphael Michel
c5862cc0a0 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2901 of 2901 strings)

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

powered by weblate
2019-01-10 16:23:32 +00:00
Raphael Michel
89cdcd3781 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2901 of 2901 strings)

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

powered by weblate
2019-01-10 16:21:10 +00:00
Raphael Michel
2837cac554 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-01-10 16:57:52 +01:00
Raphael Michel
3b54556739 Remove notification type for refunded event 2019-01-10 16:57:27 +01:00
Raphael Michel
4d6d6ff737 Merge pull request #1129 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-10 16:57:10 +01:00
Maarten van den Berg
ffee31e415 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-10 15:56:44 +00:00
Raphael Michel
8abfbba9d0 Refactor cancelling positions and orders in the data model (#1088)
- [x] Data model
- [x] display in order view in backend
- [x] review all usages of OrderPositions.objects
- [x] review all usages of order.positions
- [x] review all other model usages
- [x] review plugins
- [x] plugins backwards-compatible API?
- [x] decide on way forward for REST API
- [x] need to cancel fees
- [x] tests
- [ ] plugins
  - [ ] gdpr
  - [ ] reports
- [x] docs
2019-01-10 16:52:34 +01:00
Raphael Michel
588955901c Pin oauthlib version 2019-01-09 14:19:02 +01:00
Raphael Michel
4b7bf2f27f Merge pull request #1118 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2019-01-09 12:33:18 +01:00
Raphael Michel
664957e886 Add now_date 2019-01-09 12:29:37 +01:00
Raphael Michel
f15a6d39c3 Add now_* variables to PDFs 2019-01-09 12:17:31 +01:00
Maarten van den Berg
3fd80a9a46 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-08 21:00:37 +00:00
Maarten van den Berg
2fd2716303 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-08 21:00:08 +00:00
Maarten van den Berg
37315fc380 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-08 13:00:29 +00:00
Maarten van den Berg
f96fc0744e Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-08 12:30:26 +00:00
Maarten van den Berg
5bb7883020 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-08 12:25:27 +00:00
Maarten van den Berg
3f95434922 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
08da5a8b91 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
97dc4421ea Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
26ca2ff006 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
980c359f57 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 2.9% (2 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
ff1198dec6 Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Raphael Michel
7275de94af Added translation on translate.pretix.eu (Dutch (informal)) 2019-01-07 09:21:52 +00:00
Raphael Michel
ed46f41f8c Added translation on translate.pretix.eu (Dutch (informal)) 2019-01-07 09:21:52 +00:00
Alexey Zh
1078e38890 Translated on translate.pretix.eu (Russian)
Currently translated at 16.2% (11 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
amefad
2e9bbff308 Translated on translate.pretix.eu (Italian)
Currently translated at 33.8% (23 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
13a48701fa Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Alexey Zh
ddc9c850c0 Translated on translate.pretix.eu (Russian)
Currently translated at 0.4% (13 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
amefad
fa0dae6ed6 Translated on translate.pretix.eu (Italian)
Currently translated at 2.7% (79 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
da6176a51e Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Maarten van den Berg
4ef6659551 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (68 of 68 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Alexey Zh
82624a1dc0 Added translation on translate.pretix.eu (Russian) 2019-01-07 09:21:52 +00:00
Alexey Zh
b50add260a Added translation on translate.pretix.eu (Russian) 2019-01-07 09:21:52 +00:00
Bruno Damasceno Martins
f72f97d366 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 10.4% (300 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Alexander Schwartz
ad46e9e541 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2019-01-07 09:21:52 +00:00
Raphael Michel
343dbc00be Bank transfer: Add a note on how to proceed 2019-01-07 10:21:35 +01:00
Raphael Michel
3cb94f702d Revert accidental commit part 2019-01-04 10:24:06 +01:00
Raphael Michel
ddeae224fb Log SMTP failures and retry after some error codes 2019-01-04 09:54:43 +01:00
Raphael Michel
3c57895101 Don't mark orders as pending unnecessarily 2019-01-03 09:50:56 +01:00
Raphael Michel
687c85eb58 Stripe: Full source state handling 2019-01-03 09:43:07 +01:00
Raphael Michel
90ffdbdfa3 Stripe: Allow failed payments to succeed 2019-01-03 09:37:31 +01:00
Raphael Michel
654be0db34 Stripe: Prevent race condition between ReturnView and webhook 2019-01-03 09:34:15 +01:00
Raphael Michel
82e3359b40 Allow to filter subevents by date 2019-01-02 16:59:03 +01:00
Raphael Michel
01a6861453 Always query emails case-insensitively 2019-01-02 15:12:48 +01:00
Raphael Michel
7f6cdd6241 Fix ProtectedError when deleting expired card positions 2019-01-02 15:05:30 +01:00
Raphael Michel
aad1fda31f Register nl_Informal translation 2019-01-02 10:12:17 +01:00
Raphael Michel
ad462921f0 Pin bs4 version due to regression 2019-01-02 09:58:50 +01:00
Raphael Michel
dc433f6420 Reverse on global URL config in build_absolute_uri 2019-01-02 09:24:47 +01:00
Raphael Michel
2d8b3d1c79 PayPal: Fix backwards compatibility 2019-01-02 09:20:35 +01:00
Raphael Michel
eb85fa956e Badges: Add per-position downloads 2018-12-19 12:31:44 +01:00
Raphael Michel
215514fca7 Add ticket downloads to the backend 2018-12-19 12:31:24 +01:00
Raphael Michel
3fe2dfe810 Add signal order_position_buttons 2018-12-19 12:29:52 +01:00
Raphael Michel
041d05eb66 Support product pictures for add-on products 2018-12-19 09:37:30 +01:00
Raphael Michel
d05530ddfc Explicit ordering of check-in lists 2018-12-19 09:20:44 +01:00
Raphael Michel
734e77d1a3 API: Allow to redeem ticket by secret 2018-12-18 12:23:07 +01:00
Raphael Michel
633061e203 Avoid paid orders without payment_date 2018-12-18 10:07:17 +01:00
Raphael Michel
e11ee4a427 Do not allow to delete vouchers assigned to canceled orders 2018-12-18 10:07:17 +01:00
Alvaro Enrique Ruano
1edcd47703 Support for daterange in spanish (#1125) 2018-12-17 22:32:15 +01:00
Raphael Michel
cf4b2544f2 Never create implicit payments for orders that require approval 2018-12-14 10:42:08 +01:00
Raphael Michel
04c3cffd43 Fix severe translation mistake 2018-12-12 16:42:47 +01:00
Raphael Michel
483d41c7a6 Event plugin list: Use a more useful sorting of the list 2018-12-12 16:42:47 +01:00
Martin Gross
b0c4c88d01 Fix #1119 - Proper indent and pluralisation (#1120) 2018-12-12 08:59:54 +01:00
Martin Gross
518298f71c Add media-src CSP to middleware (#1121) 2018-12-12 08:59:22 +01:00
Raphael Michel
62c2e7765b Fix wrong variable 2018-12-11 17:00:05 +01:00
Raphael Michel
2bb2a40509 Add new signal checkout_all_optional 2018-12-11 16:44:15 +01:00
Raphael Michel
49828186b0 Signals: Pretictable call order, not return order 2018-12-11 16:43:07 +01:00
Raphael Michel
c07a6cb4aa Small query optimization 2018-12-11 16:15:54 +01:00
Tobias Kunze
67ad9a0dcb Provide send_robust on EventSignals (#1116) 2018-12-11 16:15:22 +01:00
Raphael Michel
d267dfc682 Fix #785 -- Show availability in (sub)event list (#1112) 2018-12-11 13:59:49 +01:00
Raphael Michel
eed220f14a pytest-xdist is required by now 2018-12-11 12:54:30 +01:00
Raphael Michel
85289fe0d1 Fix error when marking an expired order as paid 2018-12-07 11:04:41 +01:00
Raphael Michel
6293ad34d4 Add a headline to payment provider settings 2018-12-06 10:56:40 +01:00
Raphael Michel
0dc4f61cf0 Fix a docs spelling error 2018-12-06 10:42:50 +01:00
Raphael Michel
6849e682d7 Bump verstion to 2.4.0.dev0 2018-12-06 10:17:39 +01:00
Raphael Michel
6b725a9db9 Bump version to 2.3.0 2018-12-06 10:16:55 +01:00
Raphael Michel
989ebbb444 Merge pull request #1115 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-12-05 17:13:35 +01:00
Raphael Michel
0a6efc1e0f Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2018-12-05 16:12:43 +00:00
Raphael Michel
d577a0d286 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2890 of 2890 strings)

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

powered by weblate
2018-12-05 16:11:04 +00:00
Raphael Michel
6b9b379ce2 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-12-05 17:05:14 +01:00
Raphael Michel
13234b6fd5 Merge pull request #1108 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-12-05 17:04:36 +01:00
Raphael Michel
2fa0067663 Revert "Update po files"
This reverts commit 4e37fa5778.
2018-12-05 17:04:22 +01:00
Raphael Michel
4e37fa5778 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-12-05 17:02:53 +01:00
Alexander Schwartz
bfb74448b1 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (69 of 69 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
arabestia
a255082b07 Translated on translate.pretix.eu (Spanish)
Currently translated at 97.3% (2797 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Matheus Nunes
14df35bd90 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 10.4% (300 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Alexander Schwartz
bd0ba7baa5 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Alexander Schwartz
9aa220b95b Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Alexander Schwartz
3ed4be63fe Translated on translate.pretix.eu (German (informal))
Currently translated at 100,0% (69 of 69 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Alexander Schwartz
23f4b0b62f Translated on translate.pretix.eu (German)
Currently translated at 100,0% (69 of 69 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
arabestia
4b9acb64da Translated on translate.pretix.eu (Spanish)
Currently translated at 98.6% (68 of 69 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
oocf
ebba0ee0cb Translated on translate.pretix.eu (Spanish)
Currently translated at 97.3% (2796 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
arabestia
335ce48d7e Translated on translate.pretix.eu (Spanish)
Currently translated at 97.3% (2796 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Alvaro Enrique Ruano
d9a0c8c523 Translated on translate.pretix.eu (Spanish)
Currently translated at 96.7% (2779 of 2874 strings)

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

powered by weblate
2018-12-05 15:59:59 +00:00
Raphael Michel
a297bd1944 Show that some export parameters are optional 2018-12-05 16:51:08 +01:00
Raphael Michel
953ea26984 Add a custom text to explain usage of vouchers 2018-12-05 16:50:05 +01:00
Raphael Michel
e4f80f7660 Widget: Allow to pre-fill fields in the invoice address 2018-12-05 16:45:05 +01:00
Raphael Michel
128a185957 Improve crashed test handling 2018-12-05 16:16:50 +01:00
Raphael Michel
0bdd14b47a Re-add legacy import 2018-12-05 15:13:50 +01:00
Raphael Michel
3b84b181ad PDF editor: Move questions signal out of ticket provider 2018-12-05 14:45:07 +01:00
Raphael Michel
c9b0626324 Adjust tests to new is_public default 2018-12-04 15:41:57 +01:00
Raphael Michel
dc9a82cade Fix failing tests for previous commits 2018-12-04 15:02:16 +01:00
Raphael Michel
8266733e34 Clarify is_public and turn it on by default 2018-12-04 13:49:25 +01:00
Raphael Michel
246987955b Accept localized input for all fields with localized output 2018-12-02 19:12:21 +01:00
Raphael Michel
b93e7fcb60 Fix #1067 -- Allow to manually create partial payments 2018-12-02 18:32:16 +01:00
Raphael Michel
b1cebdbd99 Fix #582 -- Improve validation of organizer domains 2018-12-02 17:45:48 +01:00
Raphael Michel
d04047abd5 Fix #1105 -- Provide URL in order split log entry 2018-12-02 17:35:31 +01:00
Raphael Michel
efca46945a Fix #953 -- Render markdown in email text previews 2018-12-02 17:11:09 +01:00
Raphael Michel
0f9755e36f Add a warning message to products that are out of timeframe 2018-12-02 16:44:21 +01:00
Raphael Michel
478d8e4116 Add export to .xlsx for lists 2018-11-30 16:10:32 +01:00
Raphael Michel
81693e042c Introduce common base class for CSV exports 2018-11-30 15:56:29 +01:00
Raphael Michel
47b7d7b36c Add separate notification category for orders that require approval 2018-11-30 15:30:35 +01:00
Raphael Michel
ba15c34ce1 Fix #1106 -- Do not send reminders to orders placed in the last two hours 2018-11-30 15:16:12 +01:00
Raphael Michel
94f2ad9325 Highlight items that are unavailable by time 2018-11-29 10:13:43 +01:00
Raphael Michel
d8070ba8a3 Fix missing ticket attachments 2018-11-29 10:01:20 +01:00
Raphael Michel
b1019672b0 Fix file format in real expor 2018-11-27 15:52:57 +01:00
Raphael Michel
631307a4d5 Even with pdftk, use PyPDF to read page size 2018-11-27 09:22:53 +01:00
Raphael Michel
180a26ee1d Fix shredder test 2018-11-26 13:44:40 +01:00
Raphael Michel
7eab1982fe Add support for PDFTK 2018-11-26 13:43:06 +01:00
Raphael Michel
ca59237ebf Use regular asynctasks for order PDF generation 2018-11-26 13:21:25 +01:00
Raphael Michel
cc92210dc2 Retry crashed tests 2018-11-26 12:09:39 +01:00
Raphael Michel
6602afdd6c Use dedicated queue for notifications 2018-11-26 12:05:16 +01:00
Raphael Michel
c7a04bc08a Add cleanup for cached tickets 2018-11-26 12:04:25 +01:00
Raphael Michel
2cc5b7f4e8 Raise error 404 on invalid month 2018-11-26 09:20:48 +01:00
Raphael Michel
453f16af03 Merge pull request #1100 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-23 16:22:00 +01:00
Raphael Michel
0f3398ae13 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-11-23 15:17:00 +00:00
Raphael Michel
f1b65c8695 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-11-23 15:17:00 +00:00
Raphael Michel
2c4c89c8c2 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-11-23 15:17:00 +00:00
Raphael Michel
4042b603b7 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2874 of 2874 strings)

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

powered by weblate
2018-11-23 15:17:00 +00:00
Alvaro Enrique Ruano
63b0288383 Translated on translate.pretix.eu (Spanish)
Currently translated at 97.5% (2792 of 2864 strings)

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

powered by weblate
2018-11-23 15:17:00 +00:00
Raphael Michel
7c01fee70b Fix incorrect return statement 2018-11-23 16:16:46 +01:00
Raphael Michel
8127c32ef5 More tolerant i18n deserializing 2018-11-23 16:15:23 +01:00
Raphael Michel
563decdfba Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-11-23 15:37:11 +01:00
Raphael Michel
a205b01d70 Add "paid" note on invoices if there is no open payment 2018-11-23 15:36:39 +01:00
Raphael Michel
b4290384e1 Add sales channels (#1103)
- [x] Data model
- [x] Enforce constraint
- [x] Filter order list
- [x] Set channel on created order
- [x] Products API
- [x] Order API
- [x] Tests
- [x] Filter reports
- [x] Resellers
- [ ] deploy plugins
  - [ ] posbackend
  - [ ] resellers
  - [ ] reports
- [x] Ticketlayouts
- [x] Support in pretixPOS
2018-11-23 15:35:09 +01:00
Raphael Michel
0f76779fb1 Fix involuntarily created invoices 2018-11-21 13:07:28 +01:00
Raphael Michel
f34c528cba Add passphrase to wordlist 2018-11-21 11:51:57 +01:00
Raphael Michel
cf01e04101 PayPal: Improve log display 2018-11-21 11:24:44 +01:00
Martin Gross
a3a63def55 Fix #369 -- Connect with PayPal (#1084)
* Connect with PayPal

* PayPal connect code-review fixes

* PayPal Connect: Global Env selection; Fix for payee-dict

* Fix missing PayPal Connect indicator for Endpoint

* Fix backwards compatibility
2018-11-21 11:14:33 +01:00
Raphael Michel
a3489eea04 PayPal: Properly detect pending sales 2018-11-21 11:14:03 +01:00
Raphael Michel
c6cb98c30a Add documentation on development and enterprise installs 2018-11-21 09:40:44 +01:00
Alvaro Enrique Ruano
332c58c82f Improve docker cache utilization on image construction (#1099)
To provide better use of Docker cache during image build by installing from PIP before creating the layer with the source code (the PIP installations are less probable to change than the rest of the source code, so this layer will not be recreated with all the source code changes)

This was previously discussed in #1094
2018-11-21 09:27:43 +01:00
Raphael Michel
beb0ded6dc Allow to pass user data to the widget (#1095)
- [x] Logic
- [x] Tests
- [x] Docs
- [x] find a way to integrate with tracking
2018-11-20 17:55:37 +01:00
Raphael Michel
b49b2035bd Cancel payments if the pending price of the order changes 2018-11-20 17:41:33 +01:00
Raphael Michel
106c8d373d Fix #1098 -- order search with dash in event slug 2018-11-20 14:33:41 +01:00
Raphael Michel
aee44a3284 Fix marking an overpaid order as paid manually 2018-11-20 10:39:48 +01:00
Raphael Michel
d4c1fcf838 Merge pull request #1087 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-20 10:39:26 +01:00
Alvaro Enrique Ruano
832f57c9d7 Translated on translate.pretix.eu (Spanish)
Currently translated at 97.4% (2790 of 2864 strings)

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

powered by weblate
2018-11-20 09:36:17 +00:00
Mikkel Ricky
ac2a9b207d Translated on translate.pretix.eu (Danish)
Currently translated at 57.4% (1645 of 2864 strings)

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

powered by weblate
2018-11-20 09:36:17 +00:00
Maarten van den Berg
f1e5d60a14 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2864 of 2864 strings)

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

powered by weblate
2018-11-20 09:36:17 +00:00
Maarten van den Berg
7b1a1dc754 Translated on translate.pretix.eu (Dutch)
Currently translated at 99.7% (2854 of 2864 strings)

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

powered by weblate
2018-11-20 09:36:17 +00:00
Raphael Michel
c93f804992 Fix #1080 -- Deal with gaps in the invoice database (#1086) 2018-11-20 10:36:13 +01:00
Alvaro Enrique Ruano
1cba4b1d45 Dockerfile improvements for better readability (#1094) 2018-11-20 10:24:53 +01:00
Raphael Michel
22369a5559 Fix CI problems with SQLite (#1076)
* Try to re-enable tests on Py3.5

* Add newer SQLite3
2018-11-19 17:57:50 +01:00
Raphael Michel
a8223ad354 Fix missing return statement 2018-11-19 17:12:48 +01:00
Raphael Michel
c9d3cf7cac Fix exceptions in previous commit 2018-11-19 11:03:54 +01:00
Raphael Michel
bbdbc94f6e Redirect case-insensitive versions of event/organizer slugs 2018-11-19 10:22:40 +01:00
Raphael Michel
5c8d9c4dca Fix incorrect feedback on invite form 2018-11-16 14:13:44 +01:00
Raphael Michel
546ff6e42f Variations: Show a price range on the front page 2018-11-14 15:43:21 +01:00
Raphael Michel
7b7d45ce2e Fix Dutch date format 2018-11-14 15:43:15 +01:00
Raphael Michel
be3ca7c561 Sort cart positions by reasonable values 2018-11-14 15:36:50 +01:00
Raphael Michel
abdb6e2d52 Add "Event date" to PDF editors 2018-11-14 14:39:20 +01:00
Raphael Michel
138ddcdcd7 CSV-export improvements (include voucher, allow semicolon) 2018-11-14 10:02:28 +01:00
Raphael Michel
8ffc6550da Do not allow orders with unavailable items to be completed 2018-11-13 17:55:56 +01:00
Raphael Michel
0734715bab Only warn about bad-contrasat colors 2018-11-13 15:53:18 +01:00
Raphael Michel
7528bfb10b Fix tests for color saving 2018-11-13 14:15:52 +01:00
Raphael Michel
2798fb3468 Avoid setting name_parts to None 2018-11-13 12:59:12 +01:00
Raphael Michel
4e6f4716ec Allow to configure accent colors 2018-11-13 12:56:52 +01:00
Raphael Michel
e523a4e610 Allow to manually generate invoices like in c131ad8c 2018-11-12 13:08:12 +01:00
Raphael Michel
31cec76809 Generate invoice after expired order is extended 2018-11-12 13:08:12 +01:00
Raphael Michel
fdfd9f9275 Fix cart cleanup 2018-11-12 13:08:12 +01:00
oocf
b658c73c19 Removed permissions page from events settings (#1063)
* Removed old configuration for events settings

* Urls file to remove permissions file

* Removing not needed test

* Removing test in permissions
2018-11-12 12:23:40 +01:00
Raphael Michel
ebd3e6f31a Fix TypeError in typeahead 2018-11-12 12:17:49 +01:00
Raphael Michel
ccec114653 Merge pull request #1085 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-12 11:41:06 +01:00
Raphael Michel
f0716dc482 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2864 of 2864 strings)

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

powered by weblate
2018-11-12 10:40:47 +00:00
Raphael Michel
513778b2c4 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2864 of 2864 strings)

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

powered by weblate
2018-11-12 10:34:26 +00:00
Raphael Michel
742e403ae2 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-11-12 11:31:32 +01:00
Raphael Michel
09a9d610f8 Make navigation structure more approachable to new users (#1083)
* Move event selector to sidebar

* Unify navigation

* Fix confusing icons
2018-11-12 11:30:36 +01:00
Raphael Michel
b9534f23f5 Delete add-ons explicitly 2018-11-12 11:11:33 +01:00
Raphael Michel
b053f61001 Delete add-on positions explicitly 2018-11-12 11:11:33 +01:00
Felix Rindt
21042f2111 Fix #1071 -- Make payments and invoice address full width panels (#1072)
Solve #1071.

I'm not happy about how the invoice address panel is really wide now.
2018-11-12 10:38:22 +01:00
Raphael Michel
e953474138 Fix a few models.CASCADE 2018-11-11 16:23:37 +01:00
Tobias Kunze
0d438ad07c Remove outline when clicking on checkout progress (#1082) 2018-11-10 14:48:37 +01:00
Raphael Michel
e285b7cff0 Bump version to release 2.3.0.dev0 2018-11-09 16:45:43 +01:00
Raphael Michel
2bb2f30e66 Bump version to 2.2.0 2018-11-09 16:43:59 +01:00
Raphael Michel
9a8d23f582 Banktransfer: use proper formatting for IBANs 2018-11-09 16:42:43 +01:00
Raphael Michel
f37d12e056 Merge pull request #1079 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-09 16:26:35 +01:00
Maarten van den Berg
334ffc0be7 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2855 of 2855 strings)

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

powered by weblate
2018-11-09 14:18:13 +00:00
Maarten van den Berg
03f0da4ee6 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (66 of 66 strings)

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

powered by weblate
2018-11-09 14:18:13 +00:00
Raphael Michel
fbbd6eebc0 Refuse to update on old MySQL 2018-11-09 15:17:58 +01:00
Raphael Michel
584ced87db Add /me API endpoint 2018-11-09 11:34:40 +01:00
Raphael Michel
901953d988 Add a Retry-After to 409 responses 2018-11-09 11:13:24 +01:00
Raphael Michel
8c34a47138 Voucher API: Bulk creation 2018-11-09 10:50:21 +01:00
Raphael Michel
0fe3db634c Voucher API: Reduce number of event locks 2018-11-09 10:46:27 +01:00
Raphael Michel
d8d838fc4f Add note on celery-requirement for webhook retrials 2018-11-09 10:45:25 +01:00
Raphael Michel
9b94a1b3b2 Add documentation on rate limits 2018-11-09 10:00:55 +01:00
Raphael Michel
479abc1a65 Add missing screenshots to docs 2018-11-08 17:00:18 +01:00
Raphael Michel
1a17ba13ca Link to documentation 2018-11-08 16:57:30 +01:00
Raphael Michel
371c42b738 Merge pull request #1077 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-08 16:57:18 +01:00
Raphael Michel
ed85394845 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2855 of 2855 strings)

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

powered by weblate
2018-11-08 15:56:22 +00:00
Raphael Michel
a9a684a456 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (66 of 66 strings)

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

powered by weblate
2018-11-08 15:55:48 +00:00
Raphael Michel
d7d7792a4a Translated on translate.pretix.eu (German)
Currently translated at 100.0% (66 of 66 strings)

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

powered by weblate
2018-11-08 15:55:48 +00:00
Raphael Michel
c09587f5d3 Translated on translate.pretix.eu (German)
Currently translated at 99.8% (2848 of 2855 strings)

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

powered by weblate
2018-11-08 15:55:48 +00:00
Raphael Michel
23f719381c Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2855 of 2855 strings)

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

powered by weblate
2018-11-08 15:55:48 +00:00
Raphael Michel
d74d39d6e9 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (66 of 66 strings)

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

powered by weblate
2018-11-08 15:55:48 +00:00
Raphael Michel
5f2cf8d3ef Add documentation on webhooks 2018-11-08 16:53:25 +01:00
Raphael Michel
1843799345 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-11-08 16:40:19 +01:00
Raphael Michel
bd838b3b7c Fix #1074 -- More specific messages during asynctasks 2018-11-08 16:38:12 +01:00
Raphael Michel
c2d03f5e6b Fix #526 -- Add a webhook system (#1073)
- [x] Data model
- [x] UI
- [x] Fire hooks
- [x] Unit tests
- [x] Display logs
- [x] API to modify hooks
- [x] Documentation
- [x] More hooks!
2018-11-08 16:38:05 +01:00
Raphael Michel
74e8e73877 Stop testing against Py3.5 2018-11-08 15:44:56 +01:00
Raphael Michel
8830dc8f78 Fix tests for checkin list 2018-11-08 12:04:51 +01:00
Raphael Michel
ac877a7c0d Use 3 SQLite workers 2018-11-08 11:34:02 +01:00
Raphael Michel
0a442e712b Add company to checkin list 2018-11-08 11:01:29 +01:00
Raphael Michel
4477f8001e Adjust test for previous commit 2018-11-07 11:53:13 +01:00
Raphael Michel
152b94428f Make Item.allow_delete() more consistent 2018-11-07 11:19:23 +01:00
Raphael Michel
5390b0b191 API: Allow to sort orders by modification date 2018-11-07 10:29:41 +01:00
Raphael Michel
97de8cea08 Allow cart creation without attendee name 2018-11-06 18:16:54 +01:00
Raphael Michel
cd465c1aad Fix not passing an attendee name in the API 2018-11-06 17:42:18 +01:00
Raphael Michel
449dea41a8 Fix order list export 2018-11-06 14:57:35 +01:00
Raphael Michel
0b1a6e4745 Fix symmetry 2018-11-06 14:57:22 +01:00
Tobias Kunze
e49061e28c Don't check voucher quotas if they bypass quotas (#1070) 2018-11-06 11:01:05 +01:00
Raphael Michel
18cb29b425 Show date in event picker 2018-11-05 22:45:33 +01:00
Raphael Michel
994ff23719 Fix quick event switcher on mobile 2018-11-05 22:24:26 +01:00
Raphael Michel
15d077df6e Add explanation tooltips to invoice regeneration buttons 2018-11-05 21:46:16 +01:00
Raphael Michel
b490aa7f5d Add scheme to sample names 2018-11-05 21:35:44 +01:00
Raphael Michel
ca6b3badde Fix reference to removed field 2018-11-05 21:20:17 +01:00
Raphael Michel
1f200271af Allow rich text in question help texts 2018-11-05 18:07:15 +01:00
Raphael Michel
894a60d016 Merge pull request #1069 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-05 16:56:15 +01:00
Raphael Michel
4a2219134b Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2825 of 2825 strings)

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

powered by weblate
2018-11-05 15:55:43 +00:00
Raphael Michel
7d38fc5c03 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2825 of 2825 strings)

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

powered by weblate
2018-11-05 15:50:02 +00:00
Raphael Michel
ef5de187b9 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2825 of 2825 strings)

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

powered by weblate
2018-11-05 15:46:16 +00:00
Raphael Michel
a1c424266b Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-11-05 16:36:29 +01:00
Raphael Michel
557b4b7b6f Merge pull request #1060 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-11-05 16:36:02 +01:00
oocf
98be21253d Translated on translate.pretix.eu (Spanish)
Currently translated at 98.4% (2750 of 2794 strings)

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

powered by weblate
2018-11-05 15:24:40 +00:00
Maarten van den Berg
e5a04ada94 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2794 of 2794 strings)

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

powered by weblate
2018-11-05 15:24:40 +00:00
Maarten van den Berg
9b8b3090e6 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2794 of 2794 strings)

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

powered by weblate
2018-11-05 15:24:40 +00:00
Raphael Michel
e622c3948d Fix buggy migration 2018-11-05 16:24:30 +01:00
Raphael Michel
94be46ffdb Fix #978 -- Allow to split names (#1049)
- [x] attendee names
- [x] Invoice address names
- [x] Data migration
- [x] API serializers
  - [x] orderposition
  - [x] cartposition
  - [x] invoiceaddress
  - [x] checkinlistposition
- [x] position API search
- [x] invoice API search
- [x] business/individual required toggle
- [x] Split columns in CSV exports
- [x] ticket editor
- [x] shredder
- [x] ticket/invoice sample data
- [x] order search
- [x] Handle changed naming scheme
- [x] tests
- [x] make use in:
  - [x] Boabee
  - [x] Certificate download order
  - [x] Badge download order
  - [x] Ticket download order
- [x] Document new MySQL requirement
- [x] Plugins
2018-11-05 15:43:21 +01:00
Raphael Michel
7039374588 Allow to anonymize users 2018-11-05 11:11:43 +01:00
Raphael Michel
0a5347c08b Allow to delete organizers 2018-11-05 11:11:43 +01:00
Raphael Michel
87f3318431 Merge pull request #1006 from pretix/empty_vouchers
Allow to show all vouchers with empty tags
2018-11-05 10:35:22 +01:00
Tobias Kunze
2557a8e4ec Allow to show all vouchers with empty tags 2018-11-05 10:34:25 +01:00
Raphael Michel
aff7094cb0 Fix #1021 -- Bugs in SMTP test 2018-11-05 10:19:29 +01:00
Raphael Michel
5a29b4bf70 Allow to choose French and Spanish 2018-10-31 15:38:38 +01:00
Raphael Michel
e618183b49 Merge pull request #1059 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-10-31 15:38:01 +01:00
Raphael Michel
a18236b12d Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-31 14:34:07 +00:00
Raphael Michel
b5da4e89a6 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2794 of 2794 strings)

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

powered by weblate
2018-10-31 14:33:21 +00:00
Raphael Michel
1da2737427 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2794 of 2794 strings)

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

powered by weblate
2018-10-31 14:30:18 +00:00
Raphael Michel
032fdadc3c Translated on translate.pretix.eu (German)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-31 14:26:13 +00:00
Raphael Michel
8ae3ff3fe6 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-10-31 15:21:52 +01:00
Raphael Michel
b8669503fa Only allow restricting payment countries if invoice address is obligatory 2018-10-31 15:21:26 +01:00
Raphael Michel
863165caaa Gracefully handle PayPal exceptions 2018-10-31 15:21:26 +01:00
Raphael Michel
b885f30789 Update from Weblate. (#1039) 2018-10-31 15:18:40 +01:00
Mattias de Hollander
461b62bd51 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Maarten van den Berg
23776db3b6 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Arnaud Vergnet
19e91a6c7c Translated on translate.pretix.eu (French)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Samir C. Costa
6f40325d3f Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Samir C. Costa
1987bff4b1 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 100,0% (65 of 65 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Maarten van den Berg
5aa0d55d47 Translated on translate.pretix.eu (Dutch)
Currently translated at 99.0% (2746 of 2773 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Raphael Michel
a28196e930 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Raphael Michel
c55387819d Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-31 09:43:05 +00:00
Raphael Michel
c8cc527aee OrderChangeManager: Do not mark order pending when adjusting price to actual payment 2018-10-31 10:42:44 +01:00
Raphael Michel
a39b207ad5 Mark manual payment failed if nothing happened 2018-10-31 10:33:23 +01:00
Raphael Michel
ea63b50f2e Bank transfer: consider payments valid even without quota 2018-10-31 10:31:40 +01:00
Raphael Michel
b101251aa4 Log confirmed payments that could not mark the order as paid 2018-10-31 10:31:21 +01:00
Raphael Michel
c9ba72ebc5 Fix a typo 2018-10-31 10:27:14 +01:00
Raphael Michel
4a1c3088a9 Locking in OrderChangeManager caused unexpected problems 2018-10-31 10:04:53 +01:00
Raphael Michel
a480ca1142 Add reverse charge flag to invoices 2018-10-30 10:57:29 +01:00
Tobias Kunze
a928fbfafe Config files (#1057)
* Move coveragerc to setup.cfg

* Move pytest.ini to setup.cfg

Closes #1027
2018-10-30 10:12:17 +01:00
Tobias Kunze
3bf3ff1ee2 Allow empty plugin responses (#1056)
While plugin developers are supposed to return an empty dictionary, it's
conceivable that they might just put in a `return` if their field is not
needed, and pretix being generous about this would be cool.
2018-10-30 10:11:39 +01:00
Raphael Michel
9647cc6cf2 Add more favicons for browser shortcuts 2018-10-30 10:05:48 +01:00
Raphael Michel
df2d8925ed Prevent some race conditions 2018-10-29 17:27:12 +01:00
Raphael Michel
7a945daefc Fix #957 -- Integrate BezahlCode and GiroCode 2018-10-29 12:57:26 +01:00
Raphael Michel
409e77cf2f Stop pinning setuptools 2018-10-29 12:42:07 +01:00
Raphael Michel
552f99a63b Read PDF backgrounds with strict=False 2018-10-29 11:41:26 +01:00
Raphael Michel
0842311451 PDF renderer: Do not break on wrong poweredby-styles 2018-10-29 11:41:26 +01:00
Raphael Michel
4d4b498636 Resolve bug in event copy signals of pdf output and badges 2018-10-29 11:41:26 +01:00
Raphael Michel
d08cc12240 Do not break on short VAT IDs 2018-10-29 11:41:26 +01:00
Raphael Michel
237442872e Reliably delete addons when deleting cart positions 2018-10-29 11:41:25 +01:00
Raphael Michel
16983826fb Allow to store structured invoice addresses 2018-10-24 01:37:18 +02:00
Raphael Michel
e60ff6b777 Allow to store strucutred SEPA bank transfer details 2018-10-24 00:21:33 +02:00
Raphael Michel
3a0ef3760c Make logging for payment changes consistent with OrderPayment handling 2018-10-22 22:28:42 +02:00
Raphael Michel
bc0bc78219 Try to fix invoice export 2018-10-22 06:23:09 +02:00
Tobias Kunze
d3137505a1 Don't offer to check empty VAT ID (#1044) 2018-10-17 01:50:24 +02:00
Flavia Bastos
a2acd336eb Fix #970 -- invoice info consistency (#1043)
resolves: Issue #970
2018-10-17 01:50:00 +02:00
Raphael Michel
6e4750336b Fix test case for previous commit 2018-10-12 11:44:46 +02:00
Raphael Michel
ddefeeaf02 Waiting list should send things out even if waiting list is disabled 2018-10-12 10:45:33 +02:00
Raphael Michel
250e0a930d Prevent huge invoice files if a JPEG logo is used 2018-10-09 10:56:11 +02:00
Tobias Kunze
51c6d60760 Use http_date instead of cookie_date (#1042)
http_date is deprecated as of Django 2.1
2018-10-09 10:50:25 +02:00
Raphael Michel
db513b21f8 Fix Apple Pay verification for organizer domains 2018-10-09 09:22:12 +02:00
Raphael Michel
ab336678ce Allow to change slug in admin sessions 2018-10-09 09:19:36 +02:00
Raphael Michel
3eea4d6945 Show suebvent in addons view 2018-10-08 12:17:30 +02:00
Raphael Michel
d091d3fd17 Show subevent in questions form 2018-10-08 11:20:15 +02:00
Raphael Michel
fc71f484ad Fix urlconf definition 2018-10-05 10:41:35 +02:00
Raphael Michel
bd772bf900 Never fail to send an email because of missing attachments 2018-10-05 09:33:40 +02:00
Raphael Michel
14db654681 Fix Apple Pay for custom domains 2018-10-05 09:31:23 +02:00
Raphael Michel
a85b96ea89 Allow plugins to have organizer_patterns 2018-10-05 09:31:14 +02:00
Raphael Michel
c2b5e876bc Bump version to 2.2.0.dev0 2018-10-04 11:35:00 +02:00
Raphael Michel
91c02dc0b3 Bump version to 2.1.0 2018-10-04 11:33:09 +02:00
Raphael Michel
f78ec830b5 Fix pretix-stripe.js 2018-10-03 17:31:06 +02:00
Raphael Michel
9f0e508ab3 Do not require meta_noindex 2018-10-03 12:52:37 +02:00
Raphael Michel
4ca50d750b Merge pull request #1037 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-10-03 12:44:14 +02:00
Raphael Michel
07c1b1b7f3 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-03 10:43:50 +00:00
Raphael Michel
3e95dd52cf Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-03 10:43:35 +00:00
Raphael Michel
80ef2f6b0e Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2773 of 2773 strings)

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

powered by weblate
2018-10-03 10:38:42 +00:00
Raphael Michel
53a8cda310 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-10-03 12:25:02 +02:00
Raphael Michel
63de49104c Merge pull request #1016 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-10-03 12:24:28 +02:00
Maarten van den Berg
8aa80bcb84 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2727 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
oocf
95115a7c5e Translated on translate.pretix.eu (Spanish)
Currently translated at 99.9% (2725 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
oocf
ce2967fd02 Translated on translate.pretix.eu (Spanish)
Currently translated at 99.9% (2725 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
oocf
399fb87d20 Translated on translate.pretix.eu (Spanish)
Currently translated at 99.7% (2719 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
oocf
c4bd5ac5df Translated on translate.pretix.eu (Spanish)
Currently translated at 99.7% (2719 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
Maarten van den Berg
123c2d6c02 Translated on translate.pretix.eu (Dutch)
Currently translated at 99.4% (2711 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
Maarten van den Berg
6954e9c984 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
Yunus Fırat Pişkin
fc573e4e48 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (2727 of 2727 strings)

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

powered by weblate
2018-10-03 10:15:55 +00:00
Raphael Michel
0dbcfdc5ac Allow to enable ticket downloads for pending orders 2018-10-03 12:15:43 +02:00
Raphael Michel
4b8d4b4792 Allow to bulk-delete vouchers 2018-10-03 11:32:55 +02:00
Raphael Michel
d798da33ef Add option to add robots=noindex meta tag 2018-10-03 11:15:59 +02:00
Raphael Michel
d99517c8d1 Fix #917 -- Attach tickets to emails (#1034) 2018-10-03 11:06:50 +02:00
Raphael Michel
0787adcb8e Fix AttributeError in paypal module 2018-10-02 17:12:26 +02:00
Raphael Michel
f848561d25 Expose log details for admins 2018-10-01 14:13:44 +02:00
Raphael Michel
efbddc2486 Log failed payments 2018-10-01 13:48:47 +02:00
Raphael Michel
e6a138d8f2 Bank transfer: Use correct attribute 2018-10-01 13:05:17 +02:00
Raphael Michel
5b7a578307 Improve display of stripe transaction data 2018-10-01 12:47:36 +02:00
Raphael Michel
737738de93 Fix control display of bank transfers 2018-10-01 12:43:12 +02:00
Raphael Michel
eb3951ce13 Fix waiting list action view without return value 2018-10-01 12:43:12 +02:00
Raphael Michel
c2b7d9a257 Fix transaction handling in invite form 2018-09-30 14:07:14 +02:00
Raphael Michel
4738aa2771 Fix contextual table styles 2018-09-30 13:11:33 +02:00
Raphael Michel
29ac0af55e Improve Device.__str__ method 2018-09-28 16:33:15 +02:00
Raphael Michel
96bc64c456 Do not break invoices if order has no locale 2018-09-27 17:15:49 +02:00
Raphael Michel
0369deb72d Fix permission for access to root event resource 2018-09-27 10:01:57 +02:00
Raphael Michel
6e53990845 Make last commit more resilient 2018-09-25 18:20:40 +02:00
Raphael Michel
feb262644e Orders API: Reduce query load imposed by ?pdf_data=true by multiple orders of magnitude 2018-09-25 17:39:58 +02:00
Raphael Michel
abd679820f Merge pull request #1017 from pretix/deviceauth
Authentication scheme for devices
2018-09-25 14:36:23 +02:00
Raphael Michel
cd3ce848d1 Document permissions 2018-09-25 12:30:15 +02:00
Raphael Michel
63ba393c12 Proper permission handling and testing 2018-09-25 12:29:05 +02:00
Raphael Michel
23fdf8c457 Add compatibility note 2018-09-25 12:12:33 +02:00
Raphael Michel
304ad4e3db Restrict list of events 2018-09-25 10:54:36 +02:00
Raphael Michel
ec58ab07b6 Add tests for control 2018-09-25 10:28:07 +02:00
Raphael Michel
1ba4047b1b API-level tests 2018-09-25 10:28:07 +02:00
Raphael Michel
0bab8adc41 Add documentation on auth 2018-09-25 10:28:07 +02:00
Raphael Michel
17e09c601e Revoke + Logging 2018-09-25 10:28:07 +02:00
Raphael Michel
1aca5fb6ff Fix wrong action parameter 2018-09-25 10:28:07 +02:00
Raphael Michel
7860d690fa Add endpoints to update, roll and revoke devices 2018-09-25 10:28:07 +02:00
Raphael Michel
6d01c99d38 Auth mechanism 2018-09-25 10:28:07 +02:00
Raphael Michel
ddb645aeea Creating device objects 2018-09-25 10:28:07 +02:00
Raphael Michel
f08e4b41c4 Data model 2018-09-25 10:28:07 +02:00
Raphael Michel
1e23624955 Fix #1032 -- Workaround for markdown version 2018-09-24 14:07:11 +02:00
Raphael Michel
ee951a7448 API: Add subevent list on organizer level 2018-09-24 12:59:44 +02:00
Raphael Michel
9935ba370d Event list API: Do not show events without any access permissions 2018-09-24 12:44:45 +02:00
Raphael Michel
e815cce143 Event list API: Add filters 2018-09-24 12:36:12 +02:00
Raphael Michel
cea1032180 SplitDateTimeField: Adjust placeholders to actual locale 2018-09-21 16:54:22 +02:00
Raphael Michel
5695e1d9c8 SplitDateTimeField: Consider field empty if only a time is given 2018-09-21 16:54:22 +02:00
Raphael Michel
fd317afd01 Improve accessibility of payment selection 2018-09-21 16:54:22 +02:00
Raphael Michel
ccddd2a96f Activate passbook by default if installed 2018-09-21 16:54:22 +02:00
Raphael Michel
513d3034d8 Remove deprecated template part 2018-09-20 21:12:49 +02:00
Raphael Michel
51495187fa Merge pull request #1028 from chrko/error_pages_html
Fix outside of body script element
2018-09-20 10:08:11 +02:00
Christian Kohlstedde
2bd53f7b9f Fix outside of body script element
Signed-off-by: Christian Kohlstedde <christian@kohlsted.de>
2018-09-20 10:00:55 +02:00
Raphael Michel
06d9c48ed4 Allow to restrict payment methods by invoice address country 2018-09-19 16:10:40 +02:00
Raphael Michel
1155d18b7f Show waiting list options even when waiting list is disabled 2018-09-19 15:44:17 +02:00
Raphael Michel
6e14592c78 Delete check-ins when deleting a check-in list 2018-09-19 15:41:49 +02:00
Raphael Michel
55feaf2d2c Invoices: Your reference → Customer reference 2018-09-19 15:40:50 +02:00
Raphael Michel
c487036c8b Fix bug in thumbnail generation of small images 2018-09-19 15:38:12 +02:00
Raphael Michel
853ebf8c70 Fix Sphinx warnings 2018-09-19 14:00:01 +02:00
Raphael Michel
1c695c1cf9 Remove unused resource from docs 2018-09-19 13:59:15 +02:00
Raphael Michel
bd5687d169 Remove lock when paying a pending order 2018-09-17 13:04:49 +02:00
Raphael Michel
b384f71b64 Fail silently if attachment could not be found 2018-09-13 12:58:08 +02:00
Raphael Michel
10dd5278e7 Fix bug in previous commit 2018-09-13 12:32:07 +02:00
Raphael Michel
befa6527e4 Attach invoice to order approval email 2018-09-13 12:19:30 +02:00
Raphael Michel
00497630cb Merge pull request #1015 from thegcat/patch-1
Correct typo
2018-09-12 08:38:56 +02:00
Felix Schäfer
95cd457de1 Correct typo
The Header is `Content-Type` not `Content`.
2018-09-11 22:11:48 +02:00
Raphael Michel
7518c9e3e0 Do not install python34.txt on release CI 2018-09-11 18:24:00 +02:00
Raphael Michel
6a999835e2 Bump version 2018-09-11 18:23:10 +02:00
Raphael Michel
41d099c1be Bump version 2018-09-11 18:16:50 +02:00
Raphael Michel
ff306ce2c5 Fix isort 2018-09-11 18:07:27 +02:00
Raphael Michel
c7abc82055 Add squashed migrations 2018-09-11 17:18:20 +02:00
Raphael Michel
041d91dd3c Merge pull request #1013 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-09-11 17:18:13 +02:00
Raphael Michel
387f56ed9b Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2727 of 2727 strings)

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

powered by weblate
2018-09-11 14:59:05 +00:00
Raphael Michel
3181323c1f Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2727 of 2727 strings)

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

powered by weblate
2018-09-11 14:58:17 +00:00
Raphael Michel
ecf84150c1 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-09-11 16:43:17 +02:00
Raphael Michel
5b5025c776 Allow to manually revert check-ins on a check-in list 2018-09-11 15:21:22 +02:00
Raphael Michel
e47dd3058b Adjust tests to error messages 2018-09-11 09:02:08 +02:00
Raphael Michel
71f1dcd475 Fix #1009 -- Fix missing file include in MANIFEST.in 2018-09-11 08:58:32 +02:00
Raphael Michel
941856932c Documentation improvements 2018-09-11 08:58:14 +02:00
Raphael Michel
c51fde52e7 Merge pull request #1008 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-09-10 18:16:00 +02:00
Raphael Michel
c5362e3bde Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2724 of 2724 strings)

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

powered by weblate
2018-09-10 16:15:30 +00:00
Raphael Michel
a113703451 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2724 of 2724 strings)

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

powered by weblate
2018-09-10 16:14:40 +00:00
Raphael Michel
55ecb918e9 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-09-10 18:04:58 +02:00
Raphael Michel
3a870e2f8b Merge pull request #1004 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-09-10 18:04:20 +02:00
oocf
734231a4f1 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
oocf
223d6b29f4 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
oocf
4f41ec0a97 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
oocf
347a53297d Translated on translate.pretix.eu (Spanish)
Currently translated at 99.7% (2712 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
oocf
820766abcb Translated on translate.pretix.eu (Spanish)
Currently translated at 23.5% (640 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
oocf
4974fa1fed Translated on translate.pretix.eu (Spanish)
Currently translated at 17.2% (468 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Yunus Fırat Pişkin
7e829fa204 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Yunus Fırat Pişkin
f6c7caa48d Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (65 of 65 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Yunus Fırat Pişkin
0dd9d252fd Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Yunus Fırat Pişkin
39f67a241c Translated on translate.pretix.eu (Turkish)
Currently translated at 96.4% (2623 of 2720 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Yunus Fırat Pişkin
5706b08366 Translated on translate.pretix.eu (Turkish)
Currently translated at 96.9% (63 of 65 strings)

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

powered by weblate
2018-09-10 16:00:42 +00:00
Raphael Michel
81de9695e2 Add a more specific message on locked vouchers 2018-09-10 17:54:54 +02:00
Raphael Michel
589fb25fe3 Warn about variations without quota 2018-09-10 17:44:50 +02:00
Raphael Michel
61e5c6b468 Fix bug editing addon products 2018-09-10 17:40:56 +02:00
Raphael Michel
087ceb3687 Fix waiting list widgets with infinite quotas 2018-09-04 13:59:40 +02:00
Raphael Michel
0a2cd208b2 Fix invalid tests 2018-09-03 16:55:04 +02:00
Raphael Michel
678a936897 Fix #999 -- Clarify definition of overpaid 2018-09-03 16:30:23 +02:00
Raphael Michel
7c72ca089b Do not allow to mark an order as unpaid 2018-09-03 15:41:18 +02:00
Raphael Michel
21530f315f Properly restrict refunds to full payment amount 2018-09-03 15:41:05 +02:00
Raphael Michel
7274905a92 Ensure correct order of refund log 2018-09-03 15:25:28 +02:00
Raphael Michel
6c5cff6162 Stripe: Do not duplicate refunds of migrated payments 2018-09-03 15:20:05 +02:00
Raphael Michel
cf6b6c129a Stripe: Store refund details 2018-09-03 15:19:56 +02:00
Raphael Michel
74491d16ae Fix a resolver error 2018-09-02 19:54:36 +02:00
Raphael Michel
c1ab6e4eb4 Merge pull request #1003 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-09-02 16:28:17 +02:00
Raphael Michel
18c9ae235a Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-02 14:27:44 +00:00
Raphael Michel
5c69d5fb88 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2720 of 2720 strings)

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

powered by weblate
2018-09-02 14:26:06 +00:00
Raphael Michel
90f0bda879 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-09-02 15:50:07 +02:00
Martin Gross
1b5c4a21bb Show download-provider specific icons where defined 2018-09-02 15:49:35 +02:00
Raphael Michel
08ee37112f Merge pull request #995 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-09-02 15:48:48 +02:00
Yunus Fırat Pişkin
cfbc88d3d6 Translated on translate.pretix.eu (Turkish)
Currently translated at 92.8% (2517 of 2712 strings)

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

powered by weblate
2018-09-02 13:46:46 +00:00
Raphael Michel
79f5529a5a Translated on translate.pretix.eu (Turkish)
Currently translated at 92.8% (2517 of 2712 strings)

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

powered by weblate
2018-09-02 13:46:36 +00:00
Yunus Fırat Pişkin
11ed0abd18 Translated on translate.pretix.eu (Turkish)
Currently translated at 92.8% (2517 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
01830d9910 Translated on translate.pretix.eu (Turkish)
Currently translated at 92.0% (2495 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
0f573805f2 Translated on translate.pretix.eu (Turkish)
Currently translated at 85.2% (2310 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
93b1d81a48 Translated on translate.pretix.eu (Turkish)
Currently translated at 83.8% (2274 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
e28d13b910 Translated on translate.pretix.eu (Turkish)
Currently translated at 81.6% (2212 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
8731e343c4 Translated on translate.pretix.eu (Turkish)
Currently translated at 75.6% (2051 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
605eca8cd7 Translated on translate.pretix.eu (Spanish)
Currently translated at 17.1% (464 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
5a8ddf5e4a Translated on translate.pretix.eu (Spanish)
Currently translated at 16.2% (438 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
f6d5d575fc Translated on translate.pretix.eu (Turkish)
Currently translated at 73.3% (1989 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
d5c344e3ac Translated on translate.pretix.eu (Turkish)
Currently translated at 71.6% (1941 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
18ba326cea Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
1a1473d3ba Translated on translate.pretix.eu (Spanish)
Currently translated at 14.9% (403 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Dimas 3r1ck Rivas
72804a09ec Translated on translate.pretix.eu (Spanish)
Currently translated at 13.0% (353 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
c1ce0a514c Translated on translate.pretix.eu (Spanish)
Currently translated at 13.0% (353 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
bd479312b5 Translated on translate.pretix.eu (Spanish)
Currently translated at 12.9% (350 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
469da540d2 Translated on translate.pretix.eu (Spanish)
Currently translated at 9.2% (250 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
69edaa974f Translated on translate.pretix.eu (Spanish)
Currently translated at 6.6% (178 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
oocf
ff56963040 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
266aeaef50 Translated on translate.pretix.eu (Turkish)
Currently translated at 66.9% (1813 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
fc660cfb1f Translated on translate.pretix.eu (Turkish)
Currently translated at 66.4% (1801 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Maarten van den Berg
27d343bdea Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Maarten van den Berg
a04b0da54a Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2712 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Maarten van den Berg
b15a6bfa98 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Maarten van den Berg
dcc638c12f Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2712 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
84ea96a5ad Translated on translate.pretix.eu (Turkish)
Currently translated at 66.0% (1789 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
ae1bf85740 Translated on translate.pretix.eu (Turkish)
Currently translated at 98.4% (63 of 64 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Yunus Fırat Pişkin
1612d713c9 Translated on translate.pretix.eu (Turkish)
Currently translated at 56.0% (1519 of 2712 strings)

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

powered by weblate
2018-09-02 13:25:51 +00:00
Raphael Michel
6a4a8af731 Improve cookie detection and handling 2018-09-02 15:25:33 +02:00
Raphael Michel
e18375ca6d Avoid conflict in saving objects 2018-08-31 14:05:25 +02:00
Raphael Michel
e537e4538a Fix limits for manual payment 2018-08-31 13:06:13 +02:00
Raphael Michel
1ae97f5477 API: Allow to filter order positions by voucher 2018-08-31 12:53:37 +02:00
Raphael Michel
cc0083c6e5 Allow to search by voucher in check-in list 2018-08-31 12:50:50 +02:00
Raphael Michel
43e6ed2da9 Check-in list PDF: Deal with very long questions and answers 2018-08-31 12:35:28 +02:00
Raphael Michel
27bb3a948b Fix descending sorting of subevents 2018-08-31 12:22:31 +02:00
Raphael Michel
7c155d307b Return 404 for invalid check-in list ID 2018-08-31 12:16:15 +02:00
Raphael Michel
d789beddd0 Fix ValueError on change of payment method
Fixes Sentry issue PRETIXEU-KX
2018-08-31 11:15:59 +02:00
Raphael Michel
f790148ad3 Statistics: Fix AttributeError with subevents 2018-08-31 11:05:17 +02:00
Lukas Bockstaller
a643abe293 Prevent email enumeration (#1000)
Here is my attempt to prevent user enumeration. 
I've made the following changes:

**Application:**
- replaces success and failure messages in the form with two (with/without redis) information messages 
- adds logging for attempted password resets of unknown users
- adds logging for failing emails

**Tests:**
- test_unknown asserts a redirect instead of a ok
- adds test_email_reset_twice_redis to assert the correct logging of a twice reset email 
- adds a FakeRedis class similiar to the one implemented in test_metrics.py. I could refactor them into the testutils folder if prefered. 

Please excuse the commit mess. I am currently fighting with my tooling.
2018-08-31 10:28:39 +02:00
Raphael Michel
099b08f009 Move redis depencency to production.txt 2018-08-31 09:16:01 +02:00
Raphael Michel
35ddf6790e Add mark_refunded parameter to refund creation 2018-08-21 15:48:22 +02:00
Raphael Michel
6502fdb1f5 Allow to switch to admin mode on 404 and 403 page 2018-08-21 15:13:00 +02:00
Raphael Michel
b5cd3bf0af Do not send paid email for free orders 2018-08-21 11:03:56 +02:00
Felix Rindt
8183648902 Rename module async to tasks (#994)
Fixes #993
2018-08-21 10:53:40 +02:00
Raphael Michel
0e1159b01e Allow to disable plugins system-wide 2018-08-19 15:12:58 +02:00
Raphael Michel
625ef3da8a Round decimal on dashboard 2018-08-19 15:09:59 +02:00
Raphael Michel
10c7d9a6e1 Statistics: Prevent issues with async script loading 2018-08-17 11:12:19 +02:00
Raphael Michel
85952ce6b7 Widget: Put overlay directly in <body> to avoid z-index problems 2018-08-17 11:02:44 +02:00
Raphael Michel
bf9ce68d8b Fix test for free to paid 2018-08-17 09:18:05 +02:00
Raphael Michel
08c5992447 OrderChangeManager: Allow free→paid 2018-08-17 09:16:48 +02:00
Raphael Michel
dfc7f7c827 Widget: Pass cart IDs around in some more places 2018-08-16 18:40:21 +02:00
Raphael Michel
efdbbc6098 Do not pass signature in plaintext to renderer 2018-08-16 13:48:37 +02:00
Raphael Michel
185cf90d4c Fix the readthedocs build 2018-08-16 12:04:07 +02:00
Raphael Michel
4db4790270 Custom HTML email renderers and new email style (#991)
* Custom HTML email renderers

* Move inline_css call

* Small fixes

* New HTML mail style for pretix

* Thumbs

* Inlinestyle for notifications

* Documentation

* Set line-height
2018-08-16 12:01:23 +02:00
Raphael Michel
be3b890e2f PayPal error handling 2018-08-16 09:36:16 +02:00
Raphael Michel
4536f96493 Only mark apple pay domains as stored in live mode 2018-08-15 14:14:35 +02:00
Raphael Michel
a598c3e7a8 Stripe: Catch exceptions when filling countries 2018-08-15 11:25:47 +02:00
Raphael Michel
d9f5ee9d76 Stripe: Smoother animation 2018-08-15 09:55:39 +02:00
Martin Gross
a4ced609cd Stripe: ApplePay/Payment Request Button (#988)
As discussed, this is a WIP for integrating Stripe's Payment Request Buttons (with also includes the ApplePay-Button on iOS-devices).

Todos:
- [x] Payment Request Button is still displayed, even when a card has already been tokenized (when going back in the order-flow)
- [x] The domains used need to be verified using the Stripe API to enable ApplePay: https://stripe.com/docs/stripe-js/elements/payment-request-button#verifying-your-domain-with-apple-pay
- [x] Migration: Get the account-country for existing Stripe Connect users
- [x] Migration: Verify the domains using the above mentioned API for existing users
- [x] Converting the chargeable amount is not right for non-decimal currencies like JPY

Other considerations:
- On iOS-devices using Safari (probably also on MacBooks, etc. - not tested), the [regular payment request button](https://user-images.githubusercontent.com/157270/38515749-f53f8392-3be9-11e8-8917-61ef78dd354a.png) is automatically replaced with a [buy with Apple Pay button](https://docs-assets.developer.apple.com/published/094d0eb90e/988c36a8-a43c-4ff9-85ef-beda16c4b7c9.png).
- On all other platforms, the generic payment request button is displayed. Even if the device supports a specific payment provider like Google Pay, Microsoft Wallet, Samsung Pay, etc., the generic button will first offer the cards saved within the webbrowser in addition to the other payment methods. Only upon selecting the specific payment provider like GPay, the corresponding payment flow is started.
- Right now, the rendering of the payment button is completely in the hands of Stripe. Once pretix takes on the task of doing this, we should try to detect if the browser supports well known payment methods like GPay in addition to the browser-saved cards. If that's the case, we should add the corresponding marks onto the "Pay Now"-Button (like [this](https://developers.google.com/pay/api/images/brand-guidelines/google-pay-mark.png), [this](https://assets.pcmag.com/media/images/490984-samsung-pay.png?width=1600&height=900), or [this](https://www.firstffcu.com/images/MS-Wallet_stacked_rgb_grey.png)), so the customer can identify the purpose of the button easier.

- [x] Also, all of this is still based against the pretix 1.x codebase ;-)
2018-08-15 09:22:31 +02:00
Raphael Michel
673a4e6805 Fix locale-dependent test 2018-08-14 18:48:13 +02:00
Raphael Michel
d017ccfbd4 Merge pull request #987 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-08-14 18:10:02 +02:00
Raphael Michel
1f52ed2e83 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2712 of 2712 strings)

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

powered by weblate
2018-08-14 16:08:34 +00:00
Raphael Michel
08e83f616c Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2712 of 2712 strings)

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

powered by weblate
2018-08-14 15:57:40 +00:00
Raphael Michel
51edc4652e Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2712 of 2712 strings)

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

powered by weblate
2018-08-14 15:51:19 +00:00
Raphael Michel
a3c6f38642 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2674 of 2674 strings)

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

powered by weblate
2018-08-14 15:13:17 +00:00
Raphael Michel
a1db53f50b Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-14 17:13:11 +02:00
Raphael Michel
9e1046fde3 Merge pull request #989 from pretix/approvals
Require approval for orders of specific products
2018-08-14 17:12:32 +02:00
Raphael Michel
17173f72e0 Fix incorrect sum calculation 2018-08-14 14:16:14 +02:00
Raphael Michel
f60a99c357 Tests 2018-08-14 11:31:41 +02:00
Raphael Michel
1d763f1bc9 Widget: Fix voucher code argument 2018-08-14 11:11:46 +02:00
Raphael Michel
248b94c296 Approvals 2018-08-14 10:46:55 +02:00
Raphael Michel
f52447ff58 Model field 2018-08-14 10:46:32 +02:00
Raphael Michel
0cbacbb959 Fix checking in something that is checked in multiple times 2018-08-14 08:56:53 +02:00
Raphael Michel
a01edecaef Fix incorrect test 2018-08-13 18:10:43 +02:00
Raphael Michel
779756f1ab API: Allow to delete order positions 2018-08-13 18:09:10 +02:00
Raphael Michel
723fedc066 Widget button: Fall back to front page if no items are specified 2018-08-13 14:35:13 +02:00
Raphael Michel
a83bb23540 Widget: Allow to disable voucher input 2018-08-13 14:31:57 +02:00
Raphael Michel
5d68a5133e Add pseudonymization_id filter to API 2018-08-13 08:55:57 +02:00
Raphael Michel
8ca629151d Order list exporter: Fix payment date and format localization 2018-08-12 19:52:20 +02:00
Raphael Michel
693965af28 Add signal html_page_start 2018-08-11 12:52:46 +02:00
Raphael Michel
e645a350f2 Stripe: Support for pretix.eu 2018-08-11 12:31:44 +02:00
Raphael Michel
85e9808550 Fix quirk in data-display-dependency 2018-08-11 10:48:48 +02:00
Raphael Michel
0ce1c4565e Merge pull request #986 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-08-11 10:20:55 +02:00
Raphael Michel
478964ad30 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-08-11 08:20:11 +00:00
Raphael Michel
74a04e3b35 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2674 of 2674 strings)

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

powered by weblate
2018-08-11 08:18:49 +00:00
Raphael Michel
a48992ed9d Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2674 of 2674 strings)

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

powered by weblate
2018-08-11 08:18:10 +00:00
Raphael Michel
9a6ea8c9bb Translated on translate.pretix.eu (German)
Currently translated at 100.0% (64 of 64 strings)

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

powered by weblate
2018-08-11 08:17:39 +00:00
Raphael Michel
51b05cb128 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-11 10:14:23 +02:00
Raphael Michel
de33d6d44c Check-in list PDF: Proper word wrapping 2018-08-10 16:43:27 +02:00
Raphael Michel
3d5cc98df5 Add option to require company name 2018-08-10 16:05:20 +02:00
Raphael Michel
13f3b54393 Refactor order overview and hide empty fees section 2018-08-09 18:04:58 +02:00
Raphael Michel
f17f7b2272 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-09 17:24:04 +02:00
Raphael Michel
f61dc7197a Widget: Reload information after closing the iFrame 2018-08-09 16:08:41 +02:00
Raphael Michel
0534508bc3 Widget: Redirect to front page if a cart already exists 2018-08-09 16:08:41 +02:00
Raphael Michel
446c7ffd6a Widget: Fix opening voucher redemption page in widget 2018-08-09 16:08:41 +02:00
Raphael Michel
79e6216669 Widget: Clear CTA in active-cart message 2018-08-09 16:08:41 +02:00
Raphael Michel
5047e48de5 Check-in list export: Default to question answers of parent 2018-08-08 16:59:46 +02:00
Raphael Michel
bd48112bf9 Refs #710 -- Remove monkeypatch for django-hijack 2018-08-08 09:24:52 +02:00
Raphael Michel
5dc100d900 Move dangerous order clause 2018-08-08 09:00:44 +02:00
Raphael Michel
9f2ecb67d4 Do not use copy to copy models 2018-08-07 16:53:09 +02:00
Raphael Michel
5e4f45826e Merge pull request #983 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-08-07 15:58:43 +02:00
Raphael Michel
be6ff21184 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2672 of 2672 strings)

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

powered by weblate
2018-08-07 13:58:10 +00:00
Raphael Michel
5c660fbe7f Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2672 of 2672 strings)

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

powered by weblate
2018-08-07 13:57:25 +00:00
Raphael Michel
108718f275 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (63 of 63 strings)

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

powered by weblate
2018-08-07 13:48:54 +00:00
Raphael Michel
ab53a0b403 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (63 of 63 strings)

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

powered by weblate
2018-08-07 13:48:04 +00:00
Raphael Michel
49b815bc98 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-07 15:45:52 +02:00
Raphael Michel
c702814203 Do not use deepcopy on models 2018-08-07 15:45:22 +02:00
Raphael Michel
0c0172a0b6 Fix inconsistent checks in order offsetting 2018-08-07 15:45:22 +02:00
Tobias Kunze
a8266c22f6 Make fields disabled if presale is over 2018-08-07 14:48:29 +02:00
Tobias Kunze
532c7fbc8f Add helpful title text to numeric inputs 2018-08-07 14:48:29 +02:00
Tobias Kunze
23ed381859 Center free price input for consistency
Looks better in Firefox, too
2018-08-07 14:48:29 +02:00
Raphael Michel
1ad11b0c58 Global Banner message: Only show Read more if appropriate 2018-08-07 12:39:14 +02:00
Raphael Michel
18cca916a0 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-07 12:36:37 +02:00
Raphael Michel
97012082de Fix #972 -- Clarify sum in quota detail 2018-08-07 12:34:35 +02:00
Raphael Michel
423810cf61 Use a defaultdict for log rendering 2018-08-07 12:19:00 +02:00
Raphael Michel
a5159ce8e1 Do not show zeros in order overview 2018-08-07 11:37:14 +02:00
Raphael Michel
4dd3952c19 Fix waiting list tests 2018-08-07 11:36:19 +02:00
Raphael Michel
1e26b5c5f1 Add test case for working list priority 2018-08-07 10:56:48 +02:00
Raphael Michel
67897dfcc0 Fix #406 -- Allow moving waiting list entries to the top or bottom 2018-08-07 10:53:07 +02:00
Raphael Michel
0100604798 Allow to download waiting list 2018-08-07 10:38:26 +02:00
Raphael Michel
47afe01721 Improve waiting list filters 2018-08-07 10:28:37 +02:00
Raphael Michel
a2e12b795f Event settings: Fix custom widget 2018-08-07 10:09:34 +02:00
Raphael Michel
806ab3438e Fix rebuild command 2018-08-06 16:28:54 +02:00
Raphael Michel
f4be90fdd0 Fix overpaid queries 2018-08-06 16:16:19 +02:00
Raphael Michel
dd46767ee3 Merge pull request #981 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-08-06 16:12:52 +02:00
Raphael Michel
a2c712e5b3 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2656 of 2656 strings)

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

powered by weblate
2018-08-06 14:10:01 +00:00
Raphael Michel
35f3a0077a Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2656 of 2656 strings)

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

powered by weblate
2018-08-06 14:09:46 +00:00
Raphael Michel
bc4195942a Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2656 of 2656 strings)

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

powered by weblate
2018-08-06 13:19:08 +00:00
Raphael Michel
03baca2ed7 Translated on translate.pretix.eu (German)
Currently translated at 96.4% (2560 of 2656 strings)

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

powered by weblate
2018-08-06 12:28:50 +00:00
Raphael Michel
54a9c31a1a Fix setup.py management calls 2018-08-06 14:28:38 +02:00
Raphael Michel
db5073223d Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-08-06 12:49:09 +02:00
Raphael Michel
afd766999c Upgrade to Django 2.1 (#710)
* Upgrade to Django 2.0

* more models

* i18n foo

* Update setup.py

* Fix Sentry exception PRETIXEU-JC

* Enforce slug uniqueness

* Import sorting

* Upgrade to Django 2.1

* Travis config

* Try to fix PostgreSQL failure

* Smaller test matrix

* staticfiles→static

* Include request in all authenticate() calls
2018-08-06 12:48:46 +02:00
Raphael Michel
0637490216 Merge pull request #969 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-08-06 12:48:15 +02:00
TRIXHosting
6a3ba87b22 Translated on translate.pretix.eu (Spanish)
Currently translated at 3.3% (84 of 2563 strings)

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

powered by weblate
2018-08-06 10:24:41 +00:00
Muhammad Hewedy
20b287da52 Translated on translate.pretix.eu (Arabic)
Currently translated at 0.2% (5 of 2563 strings)

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

powered by weblate
2018-08-06 10:24:41 +00:00
Raphael Michel
18a378976b Fix #571 -- Partial payments and refunds 2018-08-06 12:24:36 +02:00
Raphael Michel
8e7af49206 Merge pull request #980 from johan12345/widget-default1
Widget: set default number to 1 if there is only one product
2018-08-05 16:38:47 +02:00
Raphael Michel
edeab082d4 Merge migration for compatibility with backport 2018-08-05 16:36:42 +02:00
Raphael Michel
7b76baaacf Backport a migration 2018-08-05 16:36:13 +02:00
Raphael Michel
053365cb67 Create a new migration for last commit 2018-08-05 16:32:18 +02:00
Raphael Michel
8301120a95 Delete old and unused settings entries 2018-08-05 16:27:30 +02:00
Raphael Michel
f15f0a6226 Update widget.js 2018-08-05 12:53:42 +02:00
Raphael Michel
0cfcadf5fa Fix test cases 2018-08-05 12:52:00 +02:00
Johan von Forstner
435c4acba6 Widget: set default number to 1 if there is only one product 2018-08-03 10:19:20 +02:00
Raphael Michel
edb913855d Add a CSS class to slug widgets 2018-07-29 15:39:31 +02:00
Raphael Michel
24739e1638 Hide waiting list vouchers in voucher list 2018-07-29 15:39:31 +02:00
Raphael Michel
54b906addb Force migration order 2018-07-23 15:04:21 +02:00
Raphael Michel
4a7a8df8a4 Small refactoring on ClassicInvoiceRenderer 2018-07-21 12:34:46 +02:00
Raphael Michel
f1dd62c936 Enable language tr 2018-07-20 11:07:43 +02:00
Raphael Michel
80cc7b0d64 Merge pull request #965 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-07-19 16:46:07 +02:00
Raphael Michel
eb4fbf3c0b Translated on translate.pretix.eu (French)
Currently translated at 94.3% (2416 of 2563 strings)

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

powered by weblate
2018-07-19 14:45:44 +00:00
Raphael Michel
c1cf1206fc Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (1464 of 1464 strings)

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

powered by weblate
2018-07-19 14:45:33 +00:00
Yunus Fırat Pişkin
efebc02d24 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (1464 of 1464 strings)

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

powered by weblate
2018-07-19 14:10:45 +00:00
Raphael Michel
21dca8c17f Merge pull request #961 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-07-19 16:10:41 +02:00
Yunus Fırat Pişkin
4eb9839f77 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (1464 of 1464 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
3b7906ea04 Translated on translate.pretix.eu (Turkish)
Currently translated at 99.0% (1449 of 1464 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
9d17858500 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
d5ceb5f465 Translated on translate.pretix.eu (Turkish)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
7dd2a0bbb4 Translated on translate.pretix.eu (Turkish)
Currently translated at 68.0% (996 of 1464 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
13284fb3b9 Translated on translate.pretix.eu (Turkish)
Currently translated at 58.1% (36 of 62 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Yunus Fırat Pişkin
f42c5ec0ce Translated on translate.pretix.eu (Turkish)
Currently translated at 27.1% (397 of 1464 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Maarten van den Berg
6b269839cb Translated on translate.pretix.eu (Dutch)
Currently translated at 99.5% (2549 of 2563 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Raphael Michel
2eb3e0a278 Added translation on translate.pretix.eu (Turkish) 2018-07-19 08:07:53 +00:00
Raphael Michel
183a437678 Added translation on translate.pretix.eu (Turkish) 2018-07-19 08:07:53 +00:00
Claude
116b8171f8 Translated on translate.pretix.eu (French)
Currently translated at 94.3% (2416 of 2563 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Claude
c8c723bf4a Translated on translate.pretix.eu (French)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Claude
d01cf018ce Translated on translate.pretix.eu (French)
Currently translated at 91.1% (2335 of 2563 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Claude
c701ab0776 Translated on translate.pretix.eu (French)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Claude
180269d6b0 Translated on translate.pretix.eu (French)
Currently translated at 83.1% (2130 of 2563 strings)

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

powered by weblate
2018-07-19 08:07:53 +00:00
Raphael Michel
645c604fd4 Fix TypeError in price_too_high detection 2018-07-19 10:07:35 +02:00
Raphael Michel
de210db90d Fix error condition in event cloning 2018-07-19 09:44:53 +02:00
Raphael Michel
beddf1c772 Fix event meta deletion 2018-07-19 09:43:40 +02:00
Raphael Michel
75e618ee4a Throw cart error for price_too_high 2018-07-19 09:41:14 +02:00
Raphael Michel
d2a3ba182b Fix KeyError when accessing settings for disabled payment provider 2018-07-19 09:32:08 +02:00
Raphael Michel
427f78b14d OrderCreateSerializer: Do not crash on optional fields missing 2018-07-19 09:27:36 +02:00
Raphael Michel
febcf237ca Prevent a KeyError during form validation 2018-07-19 09:27:17 +02:00
Raphael Michel
5e158c3bd7 Prevent a KeyError with invalid add-on configuration 2018-07-19 09:27:17 +02:00
Raphael Michel
b4c9c86ba6 Prevent ValueError with invalid state of relative date 2018-07-19 09:27:17 +02:00
Raphael Michel
7c00853f5d Fix field that was accidentally required 2018-07-13 18:19:40 +02:00
Raphael Michel
a0fcb116f5 Bank transfer: Option to remove hyphen from reference 2018-07-13 16:39:55 +02:00
Raphael Michel
e46b33544d Fix race condition in formset validation 2018-07-11 14:57:31 +02:00
Raphael Michel
6b9c3ad4e7 PDF Layout: Make pretix logo a layout element, not a background element 2018-07-10 13:24:27 +02:00
Raphael Michel
dc12b9a197 Bump version to 2.0.0.dev0 2018-07-08 16:31:34 +02:00
Raphael Michel
d473f56c3a Bump version to 1.17.0 2018-07-08 16:26:39 +02:00
Raphael Michel
4138ab3d7d Merge pull request #960 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-07-08 16:07:15 +02:00
Raphael Michel
e18d1a451d Translated on translate.pretix.eu (Spanish)
Currently translated at 3.0% (76 of 2563 strings)

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

powered by weblate
2018-07-08 14:06:56 +00:00
Raphael Michel
a3048cd393 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2563 of 2563 strings)

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

powered by weblate
2018-07-08 14:03:51 +00:00
Raphael Michel
dd8fdc6c0a Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2563 of 2563 strings)

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

powered by weblate
2018-07-08 14:03:05 +00:00
Raphael Michel
9099e4b709 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2563 of 2563 strings)

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

powered by weblate
2018-07-08 14:01:16 +00:00
Raphael Michel
52b176b9eb Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-07-08 15:49:10 +02:00
Raphael Michel
69fd70787c Fix a missing request parameter for a permissions check 2018-07-08 15:48:48 +02:00
Raphael Michel
ff37aea9c8 Update from Weblate. (#949) 2018-07-08 15:48:36 +02:00
Dimas 3r1ck Rivas
85f73977bf Translated on translate.pretix.eu (Spanish)
Currently translated at 2.9% (76 of 2542 strings)

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

powered by weblate
2018-06-25 10:53:51 +00:00
Pernille Thorsen
2c04ed48c2 Translated on translate.pretix.eu (Danish)
Currently translated at 65.9% (1676 of 2542 strings)

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

powered by weblate
2018-06-25 10:53:51 +00:00
Pernille Thorsen
1228754280 Translated on translate.pretix.eu (Danish)
Currently translated at 65.8% (1674 of 2542 strings)

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

powered by weblate
2018-06-25 10:53:51 +00:00
Raphael Michel
a43ee054ad Fix logging of file upload questions 2018-06-25 12:53:45 +02:00
Raphael Michel
83bc714739 Widget: Hide "FREE" if there is only one priced item 2018-06-25 12:53:45 +02:00
Raphael Michel
a08390c84a Use device width for width calculation of widget 2018-06-25 12:53:45 +02:00
Raphael Michel
8b6eacecfe Add X-Robots-Tag to redirect responses 2018-06-25 12:53:45 +02:00
Raphael Michel
fb96787697 Fix #765 -- Include P3P header 2018-06-25 12:53:45 +02:00
Raphael Michel
9cff77be62 Add blacklist to git hook recommendatio 2018-06-24 16:14:58 +02:00
Raphael Michel
0d1643da66 Add manual payments 2018-06-24 16:14:29 +02:00
Raphael Michel
5e7027647a Add bcc option for event emails 2018-06-22 13:28:54 +02:00
Raphael Michel
28f6f09e8f Upgrade py.test version 2018-06-19 18:19:59 +02:00
Raphael Michel
332af5d21b Fix #815 -- Add configurable minimum/maximum amount for payment methods 2018-06-19 18:00:33 +02:00
Tobias Kunze
e187005130 Strip [] in mail subject prefix (#950) 2018-06-19 12:46:08 +02:00
Raphael Michel
0357386f7c Hide some links when printing 2018-06-15 17:48:30 +02:00
Raphael Michel
47f8e5b8c6 API: FIll meta info 2018-06-15 12:04:40 +02:00
Raphael Michel
e95c9d73a1 Badges: Sort by last name 2018-06-14 16:23:55 +02:00
Raphael Michel
b7174070fe Check-in list export: Excel dialect 2018-06-14 16:19:05 +02:00
Raphael Michel
dd06a7b62c Sync setup.py with requirements.txt 2018-06-13 11:09:18 +02:00
Raphael Michel
ff9d480b6e Orders API: Improve validation errors 2018-06-13 11:08:54 +02:00
Raphael Michel
229ad9108b Fix ticket exporter 2018-06-12 15:50:03 +02:00
Raphael Michel
0e332d291a Fix locale of download reminder email 2018-06-11 15:32:08 +02:00
Raphael Michel
180904cdc2 Fix KeyError 2018-06-11 14:29:29 +02:00
Raphael Michel
0e83f7d807 Add documentation on cart endpoints 2018-06-11 14:29:22 +02:00
Raphael Michel
5d7931fcaf API: CartPositions (#948) 2018-06-11 13:18:37 +02:00
Raphael Michel
2e906b0bf5 Always inlude mail addresses in check-in list CSV 2018-06-10 15:21:18 +02:00
Raphael Michel
33ae6f12de Fix links in item descriptions 2018-06-10 15:11:19 +02:00
Raphael Michel
f302c2e154 Fix log entries from deleted plugins 2018-06-10 14:50:08 +02:00
Raphael Michel
3ee2492382 Bump version to 1.17.0.dev0 2018-06-07 18:04:26 +02:00
Raphael Michel
4caed50018 Bump version to 1.16.0 2018-06-07 18:03:54 +02:00
Raphael Michel
aadb19a792 Merge pull request #943 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-06-07 17:48:13 +02:00
Maarten van den Berg
9f8211a873 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2542 of 2542 strings)

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

powered by weblate
2018-06-07 15:19:52 +00:00
Raphael Michel
d45fc05e5d Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2542 of 2542 strings)

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

powered by weblate
2018-06-07 12:29:20 +00:00
Raphael Michel
955a3a054e Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2542 of 2542 strings)

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

powered by weblate
2018-06-07 12:29:20 +00:00
Raphael Michel
60f265a5fa Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2524 of 2524 strings)

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

powered by weblate
2018-06-07 12:29:20 +00:00
Raphael Michel
a2d82a1a7b Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2524 of 2524 strings)

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

powered by weblate
2018-06-07 12:29:20 +00:00
Raphael Michel
0875d728e8 Fix PDF renderer without invoice address 2018-06-07 14:29:04 +02:00
Raphael Michel
f3cf6b8b38 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-06-06 16:14:22 +02:00
pretix translation bot
e4465cffb0 Update from Weblate. (#939) 2018-06-06 16:12:00 +02:00
Raphael Michel
ca35d714dc Translate errors for addon selection 2018-06-06 15:51:22 +02:00
Raphael Michel
c06e7348c4 Fix language of cancellation email subject 2018-06-06 15:33:31 +02:00
Raphael Michel
60ac8a6ebd Fix #935 -- Text weight 2018-06-06 15:32:01 +02:00
Raphael Michel
e3450baeb3 Fix #549 -- Multiple PDF ticket layouts (#938)
- [x] Data model
- [x] CRUD
- [x] Editor
- [x] Migration from old settings
- [x] Clone files when copying events
  - [x] badges?
- [x] Actual ticket output
- [x] Default layout on event creation
- [x] Link well from ticketing settings
- [x] Tests
- [x] Shipping plugin
  - [x] Migration
  - [x] Settings
  - [x] Create default
- [x] API
2018-06-06 15:27:55 +02:00
Raphael Michel
72661623f3 Fix #940 -- Quota caching error 2018-06-06 12:41:55 +02:00
Raphael Michel
b4d97d9432 Add signal for new OAuth applications 2018-06-05 15:47:13 +02:00
Raphael Michel
b40100f78b Merge pull request #937 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-06-05 15:44:53 +02:00
Maarten van den Berg
a343d2b42c Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-06-05 13:42:24 +00:00
Maarten van den Berg
d3d7e54cff Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2524 of 2524 strings)

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

powered by weblate
2018-06-05 13:39:02 +00:00
Raphael Michel
6535bc3d5e Translated on translate.pretix.eu (German)
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-06-05 13:05:08 +00:00
Raphael Michel
f966fc8d84 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (62 of 62 strings)

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

powered by weblate
2018-06-05 13:04:52 +00:00
Raphael Michel
8a20bbd943 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2524 of 2524 strings)

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

powered by weblate
2018-06-05 13:03:07 +00:00
Raphael Michel
cd0f6d85ba Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2524 of 2524 strings)

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

powered by weblate
2018-06-05 12:55:06 +00:00
Raphael Michel
d51edbb3bb Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-06-05 14:13:46 +02:00
Raphael Michel
553e475cfb Merge pull request #930 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-06-05 14:12:44 +02:00
wallber azevedo pinheiro
b9367446d9 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 10.9% (270 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
wallber azevedo pinheiro
82d9fccec8 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
anonymous
cbbcfb7a3a Translated on translate.pretix.eu (Danish)
Currently translated at 67.8% (1676 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Pernille Thorsen
1f862b27c1 Translated on translate.pretix.eu (Danish)
Currently translated at 67.8% (1675 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Lorenzo Peña
883b03349e Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Lorenzo Peña
f740a6ba61 Translated on translate.pretix.eu (Spanish)
Currently translated at 2.9% (73 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Lorenzo Peña
fb3e761a37 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Sebastian Wallroth
3c7411328d Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2470 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Jochem van Kessel
9c2bfdfead Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2470 of 2470 strings)

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

powered by weblate
2018-06-05 11:59:36 +00:00
Raphael Michel
4f3bd1ff4a Fix local dictionary 2018-06-05 13:59:27 +02:00
Raphael Michel
69d10489b8 Implement OAuth2 provider (#927)
- [x] Application management
  - [x] Link
  - [ ] Tests
- [x] Authorize flow
  - [x] Tests
- [x] Refresh token handling
  - [x] Tests
- [x] Revocation endpoint
  - [x] Tests
  - [x] Mitigate: https://github.com/jazzband/django-oauth-toolkit/issues/585
- [x] API authenticator / permission driver
  - [x] Test
- [x] Enforce organizer restriction
  - [x] Tests
- [x] Enforce scope restriction
  - [x] Tests
- [x] Show current applications to user
  - [x] Revoke
  - [x] Tests
- [x] Log new authorizations
  - [x] notify user
- [x] Ensure other grant types are not available
- [x] Documentation
- [x] check if revoking access toking, then refreshing gets rid of organizer constraint
- [x] Show logentry foo
2018-06-05 12:58:04 +02:00
Raphael Michel
df031b2222 Whitelist "pdf" in docs 2018-06-05 12:26:39 +02:00
Raphael Michel
850b9e5e3d Fix oversight in a95a208e 2018-06-05 11:27:31 +02:00
Raphael Michel
a95a208e1b API: Optional pdf_data field 2018-06-04 18:40:38 +02:00
Raphael Michel
50ff3628f7 Add success hook for settings form 2018-06-04 17:59:11 +02:00
Raphael Michel
14d203055b ChunkBasedFileResponse: Support Content-Length 2018-06-03 21:59:30 +02:00
Raphael Michel
4628e28592 Limit resolution of logo in PDF invoices 2018-06-02 12:37:15 +02:00
Raphael Michel
7fb3d13733 Use file.chunks() on large cached files 2018-06-02 12:16:44 +02:00
Raphael Michel
11ff81f852 Fix 85420602 and add tests 2018-06-01 13:40:08 +02:00
Raphael Michel
0f5af4b990 Automatically shorten event name on invoice 2018-06-01 13:32:47 +02:00
Raphael Michel
85420602e8 Fix #54 -- Allow the admin to force accept payments 2018-06-01 13:25:07 +02:00
Raphael Michel
6ccf55b601 Fix settings form validation 2018-06-01 13:21:13 +02:00
Raphael Michel
42c9e21d04 Refs #654 -- API call to mark order as refunded 2018-06-01 10:38:34 +02:00
Raphael Michel
3030c300f2 Fix order change form with required field 2018-05-31 12:57:06 +02:00
Raphael Michel
48b969f3c3 Refs #928 -- Show ticket secret in order change form 2018-05-31 12:57:06 +02:00
Raphael Michel
bbb78aa5e6 Refs #928 -- Allow to regenerate secrets of specific tickets 2018-05-31 12:57:06 +02:00
Raphael Michel
31380bbef2 Fix #928 -- Allow searching for ticket secrets 2018-05-31 12:57:06 +02:00
Mason Mohkami
479a7d9162 Fix #357 -- Implement go to for vouchers (#849)
* Add Go input for vouchers on the vouchers list page (#357)

* Final fixes
2018-05-31 12:43:32 +02:00
Felix Rindt
6fe02f156a Fix #898 -- Add setting to configure subevent ordering on frontpage (#906)
Fixes #898.
2018-05-31 12:28:44 +02:00
Raphael Michel
c4ed210fed Fix #932 -- Fix celery dependency 2018-05-30 11:35:11 +02:00
Raphael Michel
ae686fab38 Set payment_date for paid orders created via API 2018-05-30 11:34:59 +02:00
Raphael Michel
8edca9ed5d Fix missing attribute in docs 2018-05-30 11:34:23 +02:00
Raphael Michel
05bafd0db5 Enable Dutch 2018-05-29 10:39:45 +02:00
pretix translation bot
341d699240 Update from Weblate. (#912) 2018-05-29 10:13:51 +02:00
Raphael Michel
552093d962 Extend wordlist 2018-05-28 18:20:35 +02:00
Raphael Michel
eb6063cc2d Add QR codes for pseudonymization ID 2018-05-28 17:02:56 +02:00
Raphael Michel
550ff4ff18 Ref #66 -- Fix more crashes related to disabled payment providers 2018-05-28 16:49:28 +02:00
Raphael Michel
5383a8b77c Fix custom taxation without invoice addresses 2018-05-28 16:23:34 +02:00
Raphael Michel
86117091fe Refs #66 -- Fix crash when payment provider plugin is disabled 2018-05-28 16:17:32 +02:00
Raphael Michel
b113028a5f Fix exception in CSV import 2018-05-28 16:17:32 +02:00
Raphael Michel
60a3f21857 Fix error in voucher CSV export 2018-05-28 16:17:32 +02:00
Felix Rindt
65a2ea3935 Fix #922 -- make widget compat mode not required (#926)
Fixes #922
2018-05-28 15:03:42 +02:00
Raphael Michel
6ecddfc6c0 Automatically re-render PDF for files lost due to bug 2018-05-28 11:44:15 +02:00
Raphael Michel
d65d48db48 Fix accidental deletion of invoices 2018-05-28 11:44:15 +02:00
Felix Rindt
f509b26800 Mark product change panel titles for translation (#918) 2018-05-28 10:54:35 +02:00
Raphael Michel
43fb6fe6e5 Fix MySQL package 2018-05-28 08:27:06 +02:00
Raphael Michel
9d2d8684b6 Fix widget test 2018-05-27 12:03:06 +02:00
Jakob Schnell
1689925508 Fix #707 -- Setup automated spell-checking for translations (#896)
This will:
  * set up potypo
  * add wordlists, edgecases and phrases
  * fix english typos across the codebase
  * fix german typos and translation
2018-05-27 11:59:10 +02:00
Raphael Michel
4d249553bf Fix setup.py 2018-05-26 13:44:56 +02:00
Raphael Michel
43ea1044cd Upgrade kombu 2018-05-26 13:08:56 +02:00
Raphael Michel
cc4a301dc1 Pin celery version 2018-05-26 12:55:58 +02:00
Felix Rindt
ab67eea36e Fix bug in date/time question stats (#916)
Fix bug in date/time question stats
2018-05-18 22:51:11 +02:00
Raphael Michel
fa326eba6f Introduce original price (#905)
* Introduce original price

* Rebase and styling

* Widget
2018-05-18 22:48:38 +02:00
Raphael Michel
c30ebdf287 Fix test on PostgreSQL 2018-05-18 13:56:37 +02:00
Raphael Michel
835bcb7207 Add add-ons to pretixdroid API 2018-05-18 12:15:32 +02:00
Raphael Michel
777424ad18 Remove debugging output 2018-05-18 11:54:42 +02:00
Raphael Michel
4985e7e96d Fix X-Page-Generated for paginated results 2018-05-18 11:31:37 +02:00
Raphael Michel
ca1e64ec10 Fix typos 2018-05-17 20:27:26 +02:00
Raphael Michel
26029508c6 Implement Last-Modified for a number of API resources 2018-05-17 16:09:08 +02:00
Raphael Michel
118259a96b Add permission test for creating orders 2018-05-16 12:23:17 +02:00
Raphael Michel
35e8dcf2bc Fix #599 -- Add API to create orders (#911)
* [WIP] Fix #599 -- Add API to create orders

* Add more validation logic

* Add docs and some validation

* Fix test on MySQl

* Validation is fun, let's do more of it!

* Fix live_issues
2018-05-16 12:14:31 +02:00
Mikkel Ricky
359a5d01e6 Fix #908 -- Fix display of ticket download message (#910) 2018-05-14 14:34:50 +02:00
Raphael Michel
1c2acbb57f Add last_modified property to orders (#907) 2018-05-14 11:09:26 +02:00
Raphael Michel
01a702c529 Fix typo 2018-05-13 18:19:10 +02:00
Raphael Michel
1ee584c5a1 Fix #903 -- Incorrect price calculation for variations 2018-05-11 14:33:23 +02:00
Raphael Michel
fc10bd7749 Merge branch 'master' of github.com:pretix/pretix 2018-05-11 14:28:14 +02:00
Raphael Michel
f2568092a7 Fix order overview error 2018-05-11 14:27:51 +02:00
Felix Rindt
6b5d5a6334 Add subevent bulk create button when no exist (#904) 2018-05-11 14:19:59 +02:00
Raphael Michel
195ed57025 Voucher redemption: Markup improvements 2018-05-11 13:59:06 +02:00
Raphael Michel
008b4a134b Allow to require invoice name only 2018-05-11 12:58:14 +02:00
robbi5
1b9bfb5b62 Add badge plugin support to MANIFEST.in (#902) 2018-05-11 12:54:05 +02:00
Raphael Michel
edeaa1333b Fix #473 -- Internal name for categories and products (#900)
* Fix #473 -- Internal name for categories and products

* fix pdf renderer
2018-05-11 12:53:25 +02:00
Raphael Michel
e678b52a7e Open addon panels by default 2018-05-10 23:30:46 +02:00
Raphael Michel
b549db58e4 Fix a test case 2018-05-10 12:58:11 +02:00
Raphael Michel
c14059f66a Merge pull request #901 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-05-10 12:14:55 +02:00
Raphael Michel
11f69daaec Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2470 of 2470 strings)

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

powered by weblate
2018-05-10 10:14:28 +00:00
Raphael Michel
c0120c0f17 Translated on translate.pretix.eu (German (informal))
Currently translated at 99.8% (2467 of 2470 strings)

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

powered by weblate
2018-05-10 10:14:11 +00:00
Raphael Michel
c1a5f9adf1 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2470 of 2470 strings)

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

powered by weblate
2018-05-10 10:13:13 +00:00
Raphael Michel
5087f27546 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2470 of 2470 strings)

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

powered by weblate
2018-05-10 10:11:57 +00:00
Raphael Michel
efbff9e217 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-05-10 12:07:44 +02:00
Raphael Michel
20ea83ae93 Merge pull request #892 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-05-10 12:07:20 +02:00
Raphael Michel
05daeb561c Use <details> und <summary> instead of panel-collapse 2018-05-10 12:04:29 +02:00
Raphael Michel
bfff001752 Use <details> and <summary> for variations 2018-05-10 11:14:13 +02:00
Raphael Michel
c3a45a1584 Do not show end time if not set 2018-05-10 10:24:12 +02:00
Raphael Michel
b09a92a264 More accessibility improvements 2018-05-10 10:24:12 +02:00
Raphael Michel
44a792583c Specifically warn about some shredders 2018-05-10 10:24:12 +02:00
Raphael Michel
71c8267dea Improve screenreader accessibility 2018-05-10 10:24:12 +02:00
Mikkel Ricky
b6688f56b5 Translated on translate.pretix.eu (Danish)
Currently translated at 67.8% (1666 of 2454 strings)

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

powered by weblate
2018-05-09 14:07:44 +00:00
Raphael Michel
f703164098 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2454 of 2454 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Pernille Thorsen
6a6b27e905 Translated on translate.pretix.eu (Danish)
Currently translated at 67.8% (1666 of 2454 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Pieter Roziers
731a46c612 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten Visscher
92a8078322 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten van den Berg
ba2d77f0bb Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Pieter Roziers
3d21c15281 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten van den Berg
cb4b20c057 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten van den Berg
2af2767699 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
etiontdn
e4bb19b98a Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 9.6% (237 of 2454 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten Visscher
7e784c9509 Translated on translate.pretix.eu (Dutch)
Currently translated at 39.9% (957 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten van den Berg
3dd27797dc Translated on translate.pretix.eu (Dutch)
Currently translated at 39.7% (951 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Maarten van den Berg
5e059272dc Translated on translate.pretix.eu (Dutch)
Currently translated at 39.5% (947 of 2393 strings)

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

powered by weblate
2018-05-09 09:13:41 +00:00
Raphael Michel
0a9aeca3bc Bulk deletion for subevents 2018-05-09 11:13:34 +02:00
Raphael Michel
11d42e0f93 Fix failing test case 2018-05-09 11:13:34 +02:00
Raphael Michel
85d8658037 Merge pull request #897 from felixrindt/emailhelptext
Presale: change email field help text
2018-05-09 10:59:38 +02:00
Raphael Michel
dfa29950ef Fix #899 -- Docker container: Set gunicorn workers to two times the CPU count 2018-05-09 10:57:59 +02:00
Raphael Michel
b7366a8704 Allow to filter subevent list by weekday 2018-05-09 09:59:39 +02:00
Felix Rindt
57416103c3 change email help text 2018-05-07 11:35:08 +02:00
Raphael Michel
72bd3731de Fix iTunes URL 2018-05-07 09:10:21 +02:00
Raphael Michel
9fab20ca6c Log confirm message consent 2018-05-04 15:31:56 +02:00
Raphael Michel
8b4453f32d Add help text to can_change_organizer_settings 2018-05-04 15:31:43 +02:00
Raphael Michel
f4b77e6b03 Discourage long event short forms 2018-05-04 10:58:19 +02:00
Raphael Michel
c3da2fca9b Fix placeholder for event deletion password (#893)
fix placeholder for event deletion password
2018-05-03 11:25:31 +02:00
luto
c0d68c5740 fix placeholder for event deletion password 2018-05-03 11:22:50 +02:00
Raphael Michel
5398564aec Bump version to 1.16.0.dev0 2018-05-03 09:56:51 +02:00
Raphael Michel
904dc80aab Bump version to 1.15.0 2018-05-03 09:56:08 +02:00
Raphael Michel
516de20148 Merge pull request #891 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-05-02 17:39:22 +02:00
Raphael Michel
be088709af Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2454 of 2454 strings)

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

powered by weblate
2018-05-02 15:38:48 +00:00
Maarten van den Berg
fd4f5057b3 Translated on translate.pretix.eu (Dutch)
Currently translated at 39.4% (944 of 2393 strings)

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

powered by weblate
2018-05-02 15:38:48 +00:00
Raphael Michel
686d5e8b03 Merge pull request #890 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-05-02 17:38:40 +02:00
Raphael Michel
c371ff5504 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2454 of 2454 strings)

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

powered by weblate
2018-05-02 15:37:10 +00:00
Raphael Michel
9862dca4aa Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2454 of 2454 strings)

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

powered by weblate
2018-05-02 15:15:30 +00:00
Maarten van den Berg
716321b37b Translated on translate.pretix.eu (Dutch)
Currently translated at 39.0% (934 of 2393 strings)

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

powered by weblate
2018-05-02 14:01:36 +00:00
Raphael Michel
b3ed8bad9c Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-05-02 16:01:29 +02:00
Raphael Michel
0a170f5c29 Docs: Fix inconsistency 2018-05-02 16:00:54 +02:00
Raphael Michel
ec0fba7913 Merge pull request #880 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-05-02 16:00:48 +02:00
Maarten van den Berg
2630c2baf1 Translated on translate.pretix.eu (Dutch)
Currently translated at 38.9% (932 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Maarten van den Berg
a01865b19b Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
00f6115a93 Translated on translate.pretix.eu (Danish)
Currently translated at 69.6% (1666 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Maarten Visscher
a466202bac Translated on translate.pretix.eu (Dutch)
Currently translated at 37.3% (893 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Maarten Visscher
bb12ef24f8 Translated on translate.pretix.eu (Dutch)
Currently translated at 37.1% (888 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Maarten Visscher
c862c6de0f Translated on translate.pretix.eu (German)
Currently translated at 99.9% (2392 of 2393 strings)

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

powered by weblate

fix https://github.com/pretix/pretix/issues/879
2018-05-02 14:00:11 +00:00
Maarten Visscher
a1cb3ec8d5 Translated on translate.pretix.eu (French)
Currently translated at 86.9% (2081 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Maarten Visscher
187d4cd02d Translated on translate.pretix.eu (Dutch)
Currently translated at 35.7% (855 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
20a0f9b026 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Mikkel Ricky
f9c0ed6ad4 Translated on translate.pretix.eu (Danish)
Currently translated at 69.5% (1665 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
27652e7191 Translated on translate.pretix.eu (Danish)
Currently translated at 69.5% (1665 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
828665cb29 Translated on translate.pretix.eu (Danish)
Currently translated at 69.2% (1658 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Mikkel Ricky
fa784c83bf Translated on translate.pretix.eu (Danish)
Currently translated at 69.1% (1655 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
2d83176892 Translated on translate.pretix.eu (Danish)
Currently translated at 69.1% (1654 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
776758c7e8 Translated on translate.pretix.eu (Danish)
Currently translated at 68.9% (1650 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Mikkel Ricky
d72afe9b92 Translated on translate.pretix.eu (Danish)
Currently translated at 68.7% (1645 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
dee61b5499 Translated on translate.pretix.eu (Danish)
Currently translated at 68.7% (1644 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Mikkel Ricky
9f73d0a7fb Translated on translate.pretix.eu (Danish)
Currently translated at 68.6% (1643 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Pernille Thorsen
bc804c9e56 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Felix Rindt
35f450aee7 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate

refs https://github.com/pretix/pretix/issues/879
2018-05-02 14:00:11 +00:00
Felix Rindt
5803b4ca27 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-05-02 14:00:11 +00:00
Raphael Michel
7bccd62a4f Fix #678 -- Data shredders for personally identifiable information (#817)
* Add data shredders for PII

* First working shredder

* Add more shredders

* Add new shredders and download confirmation

* tmp

* PayPal, Stripe, banktransfer

* Add icon to logs

* Untested payment log shredders

* Add waiting list shredder

* First tests

* Add tests for shredders

* Improve templats, link to shredder

* Test payment info shredders

* More tests

* Documentation

* Fix enabled flag in payment provider overview

* Fix minor issues
2018-05-02 15:59:59 +02:00
Raphael Michel
335838f2b2 Fix typo in class name 2018-05-02 13:28:32 +02:00
Raphael Michel
204d8cc7eb Fix git hook 2018-05-02 10:34:50 +02:00
Raphael Michel
61f5d4b172 Docs: Change git hook to only look in changed files 2018-05-02 09:56:33 +02:00
Raphael Michel
3d829c6ce8 Fix tests for paypal webhook 2018-05-02 09:51:44 +02:00
Raphael Michel
5d9852b72c Fix paypal webhook receiver 2018-05-01 19:20:07 +02:00
Raphael Michel
f561ece9d1 Fix #887 -- Absolute URL for images in widget 2018-04-30 10:27:24 +02:00
Raphael Michel
66eabd3bd6 Fix PlaceholderValidator to catch placehodlers with invalid characters 2018-04-29 14:29:40 +02:00
Raphael Michel
b2f92acbf6 Refs #654 -- API: Writable invoice operations (#886)
* Invoices

* Update invoices.rst
2018-04-29 14:29:03 +02:00
Raphael Michel
6f30ecb365 Refs #654 -- Writable API methods for waiting list entries (#885)
* Refs #654 -- Writable API methods for waiting list entries

* Update test_waitinglist.py
2018-04-29 14:28:32 +02:00
Raphael Michel
32a89d3895 Stripe: Fix another statement error 2018-04-27 12:19:48 +02:00
Raphael Michel
97bf958b74 Allow to re-auth by using the U2F token 2018-04-26 20:24:03 +02:00
Raphael Michel
30f8afca85 Fix logout on reauth page 2018-04-26 19:31:14 +02:00
Raphael Michel
ed88a8e3e3 Bump version to 1.15.0.dev0 (very late) 2018-04-26 14:17:51 +02:00
Raphael Michel
421f690f42 Add test for cascading of cart item removal 2018-04-26 14:14:00 +02:00
Raphael Michel
a330e8afb2 Fix incorrect button CSS usage 2018-04-26 09:11:56 +02:00
Raphael Michel
d8e5c9f033 API: Fix insufficient permission check 2018-04-26 09:11:33 +02:00
Raphael Michel
209646e012 Remove color scheme test pages 2018-04-25 18:28:32 +02:00
Raphael Michel
7d518df13c Limit all stripe statement_descriptors to 22 characters 2018-04-25 18:17:37 +02:00
Raphael Michel
ca603f41db New color scheme and UI design 2018-04-25 17:13:20 +02:00
Ture Gjørup
7bb18f6fad Refs #654 -- API: Writable event endpoints (#756)
* MKBDIGI-185: Added update/create to events

* MKBDIGI-185: Added validation for 'slug, 'live' on event endpoint

* MKBDIGI-185: Code formatting

* MKBDIGI-185: Added 'plugins' to 'event' endpoint

* MKBDIGI-185: Merge migrations

* MKBDIGI-185: Cleaned up static methods

* EBILL-5: Added delete endpoint for event

* EBILL-5: Merge migrations

* EBILL-5: Fixed imports

* EBILL-5: Changed plugins to only list plugins enabled for the event

* EBILL-5: Added clone event endpoint

* EBILL-5: Removed permissions check API test for events

* EBILL-5: Merged master, updated migrations

* EBILL-5: Updated api permissions check for CRUD on events

* EBILL-5: Removed 'unique_together' constraint on event model

* EBILL-5: Removed call to changed static methods in test

* EBILL-5: Changed Event 'has_paid_things'  to a property for consistency

* EBILL-5: Fixed created response code in documentation

* EBILL-6: Documentation fixes

* EBILL-6: Fixed typo

* EBILL-6: Fixed permissions

* EBILL-6: Added note on copying settings to documentation

* EBILL-6: Created model method for deleting sub objects on event before delete

* EBILL-6: Fixed typo

* EBILL-6: Re-added meta_data as read-only

* EBILL-6: Fixed permissions test

* EBILL-6: Added plugins issues check before live. Moved issues property from form to Event model.

* EBILL-6: Upped version number in documentation

* Add write support for MetaDataField

* EBILL-6: Expanded documentation for the clone endpoint, made behaviour of 'is_public' similar to 'plugins' for consistency

* EBILL-6: Re-added EventCRUDPermission

* EBILL-16: Updated documentation with permission model for the API

* EBILL-16: Added 'has_subevents' validation to ensure it cannot be changed once event is created.

* EBILL-16: Fixed event clone not differentiating between "not set" and "deliberately set to False"

* EBILL-16: Fixed event live validation

* EBILL-16: Added logging of live activated/deactivated

* EBILL-16: Fixed create event bug when no 'meta_data' supplied

* EBILL-16: Typo fixed

* EBILL-16: Added log display for "event created"

* EBILL-16: Enabling a plugin now calls 'installed' if applicable and log entries are added

* EBILL-16: Updated tests for events

* Do not allow enabling restricted plugins via the API

* Remove unused code
2018-04-25 17:13:09 +02:00
Raphael Michel
1a0e2031d2 Add check-in capabilities to official RESTful API (#884)
* Add check-in capabilities to official RESTful API

* Add deprecation note
2018-04-25 16:02:07 +02:00
Raphael Michel
4f83d69205 Remove migration code for legacy session data 2018-04-25 13:23:11 +02:00
Raphael Michel
cfafd90f15 API: Remove deprecated fields on order resource 2018-04-25 13:22:21 +02:00
Raphael Michel
a94f416b3c Refactor check-in logic into core 2018-04-25 13:22:06 +02:00
Raphael Michel
fd47e2de29 Add more entropy to cart IDs and bind them to session IDs 2018-04-25 08:50:15 +02:00
Raphael Michel
abbc403f73 Stripe: Fix Bancontact payments 2018-04-25 08:46:33 +02:00
Raphael Michel
b41c536865 API: Add status view to checkin list resource 2018-04-24 19:08:15 +02:00
Raphael Michel
bee7314dd7 API: Add filters to questions view 2018-04-24 18:33:57 +02:00
Raphael Michel
d25407e3b4 API: Add fuzzy search to order positions API 2018-04-24 18:27:18 +02:00
Raphael Michel
ad697369ef API: Add list and case-insensitive filters to order(positions) resource 2018-04-24 18:25:51 +02:00
Raphael Michel
edbdb17a2f Fix #850 -- Admission time should be allowed to be before event start 2018-04-24 17:46:58 +02:00
Felix Rindt
9d2e2a1ea2 Fix #881 -- dont redirect tel scheme (#883) 2018-04-24 17:20:47 +02:00
Tobias Kunze
6df0597c5e Fix #881 -- Allow tel: links in markdown (#882)
Closes #881
2018-04-24 16:22:53 +02:00
Raphael Michel
093eb28463 Badges: Respect admin sessions 2018-04-23 18:29:50 +02:00
Raphael Michel
7d0c279f5b Merge pull request #876 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-23 12:04:06 +02:00
Raphael Michel
d98a6a09bb Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-04-23 10:03:43 +00:00
Raphael Michel
02cf7b9d66 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2393 of 2393 strings)

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

powered by weblate
2018-04-23 10:01:36 +00:00
Raphael Michel
9253b783dd Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-04-23 11:53:38 +02:00
Raphael Michel
2ed82be809 Merge pull request #875 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-23 11:53:15 +02:00
Raphael Michel
1c1499dec8 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2369 of 2369 strings)

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

powered by weblate
2018-04-23 09:52:13 +00:00
Raphael Michel
f7f151d2a9 Fix #767 -- Allow to obtain the list of orders for a question answer 2018-04-23 11:51:28 +02:00
Raphael Michel
13f29ee3ce Fix file upload when mdoifying questions in backend 2018-04-23 11:23:01 +02:00
Raphael Michel
ce68f52ca0 Add badge printing capabilities (#868)
Add badge printing capabilities
2018-04-22 12:02:51 +02:00
Raphael Michel
33172767a6 Add subevent information to invoices 2018-04-20 12:22:39 +02:00
Raphael Michel
649b3839d2 Merge pull request #874 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-19 18:17:08 +02:00
Raphael Michel
666fb4c194 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-04-19 16:16:06 +00:00
Raphael Michel
9301497a4a Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2369 of 2369 strings)

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

powered by weblate
2018-04-19 16:15:49 +00:00
Raphael Michel
6956e21caf Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-04-19 16:15:13 +00:00
Raphael Michel
71dec5746e Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2369 of 2369 strings)

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

powered by weblate
2018-04-19 16:14:27 +00:00
Raphael Michel
0ea8f4c259 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-04-19 18:10:27 +02:00
Raphael Michel
8602814dc3 Merge pull request #869 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-19 18:09:31 +02:00
Raphael Michel
20e60edbc6 Added translation on translate.pretix.eu (Czech) 2018-04-19 16:09:02 +00:00
Raphael Michel
88f59ad1eb Added translation on translate.pretix.eu (Czech) 2018-04-19 16:09:02 +00:00
Mikkel Ricky
668a899260 Translated on translate.pretix.eu (Danish)
Currently translated at 69.0% (1635 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
Maarten Visscher
75ae85a5d4 Translated on translate.pretix.eu (Dutch)
Currently translated at 35.3% (836 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
Maarten van den Berg
abc1b4e1b2 Translated on translate.pretix.eu (Dutch)
Currently translated at 34.7% (822 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
Maarten Visscher
fa194f0cef Translated on translate.pretix.eu (Dutch)
Currently translated at 34.6% (821 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
Maarten van den Berg
b3fbd89456 Translated on translate.pretix.eu (Dutch)
Currently translated at 34.6% (820 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
N Eliseo S Carranza
5334a4cbe0 Translated on translate.pretix.eu (Spanish)
Currently translated at 0.2% (7 of 2368 strings)

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

powered by weblate
2018-04-19 16:09:02 +00:00
Raphael Michel
8f2adf0a50 Preselect product if only one is selectable 2018-04-19 18:06:57 +02:00
Raphael Michel
62dfd7cef0 Change link text of footer backlinks 2018-04-19 12:50:33 +02:00
Raphael Michel
a8321e8cd3 Fix invalid voucher form submission 2018-04-19 10:23:54 +02:00
Felix Rindt
0119552336 move footer to container (#872) 2018-04-19 10:06:03 +02:00
Jakob Schnell
033abc64c8 fix translation documentation link (#873) 2018-04-19 10:05:14 +02:00
Raphael Michel
ef8014bc6d Fix initial value in voucher form 2018-04-18 15:50:41 +02:00
Raphael Michel
96a880b5ae Warn more strongly about Stripe Sofort 2018-04-18 14:39:35 +02:00
Raphael Michel
bfedcde978 Fix #852 -- Stripe: Set statement_descriptor on all payment methods 2018-04-18 14:36:43 +02:00
Tobias Kunze
badad70984 Remove duplicate robots.txt line (#870) 2018-04-17 10:20:26 +02:00
Raphael Michel
7611188535 Localize date-based subevent search 2018-04-16 17:19:17 +02:00
Raphael Michel
31f2cc1fdc Fix LOGIN_URL setting 2018-04-16 15:26:38 +02:00
Raphael Michel
187e646fa0 Fix tests and style for last commit 2018-04-13 10:21:49 +02:00
Raphael Michel
b2721db8e0 Refs #634 -- Re-allow deleting the last subevent and fix UI crashes 2018-04-13 10:14:54 +02:00
Raphael Michel
fd9f521c60 Merge pull request #866 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-13 10:01:43 +02:00
Raphael Michel
edd6fbe35f Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2368 of 2368 strings)

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

powered by weblate
2018-04-13 08:00:45 +00:00
Raphael Michel
839c9c9884 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2368 of 2368 strings)

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

powered by weblate
2018-04-13 07:59:35 +00:00
Raphael Michel
3a1fe992d6 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-04-13 09:56:03 +02:00
Raphael Michel
9899f6d1f8 Merge pull request #865 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-13 09:53:47 +02:00
Mikkel Ricky
446a464b3d Translated on translate.pretix.eu (Danish)
Currently translated at 69.0% (1632 of 2362 strings)

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

powered by weblate
2018-04-12 15:31:54 +00:00
Raphael Michel
6a347799c7 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2362 of 2362 strings)

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

powered by weblate
2018-04-12 15:31:54 +00:00
Raphael Michel
2dae89e41c Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2362 of 2362 strings)

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

powered by weblate
2018-04-12 15:31:54 +00:00
Raphael Michel
e8119ba80d Merge branch 'master' of github.com:pretix/pretix 2018-04-12 17:29:49 +02:00
Raphael Michel
a5ecad8fae Fix required field 2018-04-12 17:29:40 +02:00
Raphael Michel
1708a4c831 Fix error for reseller module 2018-04-12 15:04:29 +02:00
Raphael Michel
a237078b68 Optional link back to organizer page 2018-04-12 13:58:10 +02:00
Raphael Michel
4ef63d026e Stripe and PayPal: Issue warning on payments for paid orders 2018-04-12 12:55:15 +02:00
Raphael Michel
b8ae3cdd3f Improve sample for event_end 2018-04-12 12:46:24 +02:00
Raphael Michel
46d855ce0f Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-04-12 12:42:06 +02:00
Raphael Michel
a3306bbb5a Update from Weblate. (#856)
Update from Weblate.
2018-04-12 12:41:42 +02:00
Claude
1428a5e7e2 Translated on translate.pretix.eu (French)
Currently translated at 88.3% (2083 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:14 +00:00
Maarten van den Berg
427940b3be Translated on translate.pretix.eu (Dutch)
Currently translated at 33.7% (795 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Pieter Roziers
7a3e7dc631 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.3% (716 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Mikkel Ricky
b38bb40a5d Translated on translate.pretix.eu (Danish)
Currently translated at 69.0% (1627 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Pieter Roziers
b2e1e2e89a Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Mikkel Ricky
02fcc42395 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (60 of 60 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Ture Gjørup
3accc406a7 Translated on translate.pretix.eu (Danish)
Currently translated at 68.0% (1604 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Mikkel Ricky
1c238b7ce4 Translated on translate.pretix.eu (Danish)
Currently translated at 68.0% (1603 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Raphael Michel
45770173c4 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2357 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Raphael Michel
3e5f6abdad Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2357 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Raphael Michel
4117c6127e Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2357 of 2357 strings)

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

powered by weblate
2018-04-12 10:41:13 +00:00
Raphael Michel
aae1fad7ab Add event end time as a ticket PDF variable 2018-04-12 12:33:14 +02:00
Raphael Michel
ada65b5ce2 Add order locale to CSV order export 2018-04-12 12:29:59 +02:00
Raphael Michel
14c0c65e17 Fix double shown email address in confirm view 2018-04-12 12:25:04 +02:00
Raphael Michel
0201aa9bd1 Fix signal documentation 2018-04-12 12:24:32 +02:00
Raphael Michel
dca530f2f2 Fix #860 -- Workaround for SQLite 3.23.0 2018-04-12 10:30:04 +02:00
Raphael Michel
c9f9668e52 PayPal: Fix support for CLP 2018-04-11 13:03:01 +02:00
Raphael Michel
4f636b7cfb Fix wrong attribute usage in SubEventBulkCreate 2018-04-10 18:32:16 +02:00
Raphael Michel
34a04c0059 Fix #860 -- Compatibility with SQLite 3.23.0 2018-04-10 12:21:39 +02:00
Raphael Michel
00ee58d3fd Refs #860 -- Do not create objets in setUpTestData that are later mutated 2018-04-10 11:23:08 +02:00
Jan Felix Wiebe
ecb3c4f4f3 Fix #861 -- Add event name to admin notification email (#862) 2018-04-10 09:36:29 +02:00
Raphael Michel
9dace592c0 Refs #787 -- Activate 2FA after adding a device by default 2018-04-09 18:48:00 +02:00
Raphael Michel
5d73221b06 Add more flexibility to ReportLabMixin 2018-04-09 14:53:19 +02:00
Raphael Michel
d50958c9ee Not sure why this works locally 2018-04-09 10:58:28 +02:00
Raphael Michel
52bb005792 Fix all wrong static URLs 2018-04-09 10:44:51 +02:00
Raphael Michel
3121aa7164 Fix incorrect worker URL 2018-04-09 10:12:14 +02:00
Raphael Michel
87c54f07c6 Move PDF editor out of plugin and into core 2018-04-09 09:40:18 +02:00
Raphael Michel
f1d4a686b1 Add a default ordering for quotas 2018-04-08 19:14:38 +02:00
Raphael Michel
56ac037128 Fix incorrect ticket PDF placeholders 2018-04-08 16:31:44 +02:00
Raphael Michel
e977045d5f Clear cart session if all products are removed manually 2018-04-06 10:06:11 +02:00
Raphael Michel
3301b106ab Add fee type "gift card" 2018-04-06 10:06:04 +02:00
Raphael Michel
e645f55191 Hide Enable button for restricted plugins without staff session 2018-04-05 16:20:20 +02:00
Raphael Michel
278d25c803 Thumbnails: Fix PNG alpha 2018-04-05 09:28:31 +02:00
Raphael Michel
ac14154b5d Bump version to 1.14.0 2018-04-04 15:21:47 +02:00
Raphael Michel
3352e743f7 Merge pull request #855 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-04-04 14:12:41 +02:00
Raphael Michel
79d8c17aaa Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2357 of 2357 strings)

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

powered by weblate
2018-04-04 11:18:13 +00:00
Raphael Michel
ef7ce21ff3 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2357 of 2357 strings)

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

powered by weblate
2018-04-04 11:11:15 +00:00
Raphael Michel
a8bcc6206f Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-04-04 13:02:33 +02:00
Raphael Michel
ddfeafc5e2 Update from Weblate. (#841)
Update from Weblate.
2018-04-04 13:00:56 +02:00
Raphael Michel
85cdd40102 Added translation on translate.pretix.eu (Spanish) 2018-04-04 11:00:10 +00:00
Raphael Michel
d412d8536c Added translation on translate.pretix.eu (Flemish) 2018-04-04 11:00:10 +00:00
Raphael Michel
bf1a314076 Added translation on translate.pretix.eu (Italian) 2018-04-04 11:00:10 +00:00
Raphael Michel
e2b2ff7f6f Added translation on translate.pretix.eu (Spanish) 2018-04-04 11:00:10 +00:00
Raphael Michel
a589c9aa69 Added translation on translate.pretix.eu (Flemish) 2018-04-04 11:00:10 +00:00
Raphael Michel
d5b05e391a Added translation on translate.pretix.eu (Italian) 2018-04-04 11:00:10 +00:00
Nicolas Pettiaux
dc7a20280f Translated on translate.pretix.eu (French)
Currently translated at 91.0% (2083 of 2288 strings)

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

powered by weblate
2018-04-04 11:00:10 +00:00
Raphael Michel
d36fc45c99 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate
2018-04-04 11:00:10 +00:00
Raphael Michel
990d92e569 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate
2018-04-04 11:00:10 +00:00
Raphael Michel
7d4ef4f9a1 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate
2018-04-04 11:00:10 +00:00
Raphael Michel
7baabcef96 Require correct permission for refunds in all cases 2018-04-04 12:52:36 +02:00
Raphael Michel
ded15ecc3f Add Jimdo to word list 2018-04-04 11:01:34 +02:00
Raphael Michel
0ad3ec444c Widget: Add a compatibility mode for Jimdo 2018-04-04 10:07:26 +02:00
Raphael Michel
7939503a11 Bulk creation for event series dates (#848)
* copy-from things

* Some frontend

* rrule UI

* .

* Fixes

* UI improvements

* First test

* Tests
2018-04-03 18:21:27 +02:00
Raphael Michel
8564f93706 Refs #782 -- Reference subevent in check in list selection 2018-04-03 17:07:40 +02:00
Raphael Michel
f3e550d003 Voucher form: do not require subevent 2018-04-03 13:43:26 +02:00
Raphael Michel
6c525b5dcd Subevent selector: Use for extending orders 2018-04-03 12:19:25 +02:00
Raphael Michel
bb10d25561 Fix #782 -- Select2 widget for item selection for vouchers 2018-04-03 12:10:34 +02:00
Raphael Michel
7ec5adb6b4 Fix #782 -- Select2 widget for check-in lists 2018-04-03 11:57:12 +02:00
Raphael Michel
ffb73d61fc Subevent selector: Allow to search by date 2018-04-03 11:23:49 +02:00
Raphael Michel
3ee6c34d08 Quick setup: Fix validation problems 2018-03-29 22:54:34 +02:00
Raphael Michel
2c26ccbc72 Fix AttributeError in orders API when questions are in use 2018-03-29 18:20:26 +02:00
Raphael Michel
cfbde151fa Fix relative date calculation around DST dates 2018-03-29 16:46:34 +02:00
Raphael Michel
e278978ad9 Enlarge field size of Item.picture 2018-03-28 14:17:52 +02:00
Raphael Michel
a284e0c2f7 Add auditable superuser mode (#824)
* Remove is_superuser everywhere

* Session handling

* List of sessions, relative timeout

* Absolute timeout

* Optionally pseudo-force audit comments

* Fix failing tests

* Add tests

* Add docs

* Rebsae migration

* Typos

* Fix tests
2018-03-28 14:16:58 +02:00
Raphael Michel
558c920181 Stripe: Business name detection 2018-03-28 13:34:51 +02:00
Tobias Kunze
7622fe9fc5 Fix broken link (#845) 2018-03-28 09:44:44 +02:00
Tobias Kunze
b32aec682c Add linkcheck ignores (#843) 2018-03-28 09:33:25 +02:00
Tobias Kunze
d54d25a432 Follow redirects in documentation urls (#842) 2018-03-28 08:44:47 +02:00
Raphael Michel
ba19bdb90a Fix quick setup in combination with subevents 2018-03-27 14:31:41 +02:00
Raphael Michel
58d10fac84 Stripe Connect error handling 2018-03-27 11:55:56 +02:00
Raphael Michel
eecc1def2a Stripe Connect: Add note to documentation 2018-03-26 23:50:23 +02:00
Raphael Michel
f75fbc3744 Stripe connect: Fix issues with test keys 2018-03-26 23:36:11 +02:00
Raphael Michel
07750c1f8c Fix #805 -- Handling of 3D secure payments 2018-03-26 23:22:30 +02:00
Raphael Michel
9ae0d9b0a1 Fix bug with Stripe 3DS 2018-03-26 23:16:06 +02:00
Raphael Michel
c9f5828eb9 Stripe: Support for restricted keys 2018-03-26 23:02:23 +02:00
pretix translation bot
35a6a1883c Update from Weblate. (#840)
* Translated on translate.pretix.eu (German)

Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate

* Translated on translate.pretix.eu (German (informal))

Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate

* Translated on translate.pretix.eu (German (informal))

Currently translated at 100.0% (2288 of 2288 strings)

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

powered by weblate
2018-03-26 22:50:54 +02:00
Raphael Michel
080c48327e Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-03-26 22:16:37 +02:00
Raphael Michel
28506538a3 Add quick-start assistant for new users (#833)
* First draft for quick-setup

* Add payment

* Fix stripe w/o connect

* cols

* Add tests
2018-03-26 20:52:24 +02:00
Raphael Michel
d578dedd0c Merge pull request #839 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-03-26 15:16:48 +02:00
Raphael Michel
c7aa105517 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2260 of 2260 strings)

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

powered by weblate
2018-03-26 13:16:28 +00:00
Raphael Michel
3c140c3e4d Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2260 of 2260 strings)

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

powered by weblate
2018-03-26 13:16:12 +00:00
Raphael Michel
8d94b67aaa Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2260 of 2260 strings)

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

powered by weblate
2018-03-26 13:12:48 +00:00
Raphael Michel
887cca109f Run localegen 2018-03-26 14:50:07 +02:00
Raphael Michel
239061b688 Merge pull request #823 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-03-26 13:42:36 +02:00
Raphael Michel
6d067428e0 Translated on translate.pretix.eu (German)
Currently translated at 99.2% (2243 of 2260 strings)

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

powered by weblate
2018-03-26 11:42:00 +00:00
Raphael Michel
b11f13181e Translated on translate.pretix.eu (German (informal))
Currently translated at 98.9% (2237 of 2260 strings)

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

powered by weblate
2018-03-26 11:41:41 +00:00
Raphael Michel
e52b8e9a13 Translated on translate.pretix.eu (German)
Currently translated at 99.9% (2238 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Felix Rindt
aa567ab078 Translated on translate.pretix.eu (German)
Currently translated at 99.8% (2237 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Felix Rindt
50daf49cf0 Translated on translate.pretix.eu (German)
Currently translated at 99.6% (2233 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Claude
a49fb65fac Translated on translate.pretix.eu (French)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Claude
adfd1e614d Translated on translate.pretix.eu (French)
Currently translated at 93.2% (2089 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Claude
a3eef04342 Translated on translate.pretix.eu (French)
Currently translated at 93.2% (2089 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Claude
cf5e660951 Translated on translate.pretix.eu (French)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-26 13:33:17 +02:00
Claude
671d6acfff Translated on translate.pretix.eu (French)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Claude
125e759120 Translated on translate.pretix.eu (French)
Currently translated at 93.2% (2089 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Mikkel Ricky
e81832e48f Translated on translate.pretix.eu (Danish)
Currently translated at 70.1% (1572 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Ture Gjørup
0b17da3b87 Translated on translate.pretix.eu (Danish)
Currently translated at 70.0% (1568 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Maarten van den Berg
8379902adb Translated on translate.pretix.eu (Dutch)
Currently translated at 31.7% (711 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Ture Gjørup
00c4ffc154 Translated on translate.pretix.eu (Danish)
Currently translated at 68.3% (1530 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
anonymous
3473337e7d Translated on translate.pretix.eu (French)
Currently translated at 0.1% (4 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
OMar
4493178693 Translated on translate.pretix.eu (Arabic)
Currently translated at 0.1% (1 of 2240 strings)

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

powered by weblate
2018-03-26 13:33:16 +02:00
Raphael Michel
40452dcefe Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-03-26 13:13:54 +02:00
Raphael Michel
082afadb5b Backend UX: Use actual tax rates for invoice preview 2018-03-26 10:21:41 +02:00
Raphael Michel
9ca61f9ef5 Remove left-over print statements from debugging 2018-03-26 10:21:14 +02:00
Raphael Michel
28a628ec93 Backend UX: Hide advanced tax rule settings 2018-03-26 10:15:36 +02:00
Raphael Michel
12b5e21314 Tax rule validation: Fix use of incorrect exception 2018-03-26 10:15:12 +02:00
Raphael Michel
95aaccb35e Backend UX: Reorder warning 2018-03-26 10:07:26 +02:00
Felix Rindt
ac053b00e8 Add order expired notification (#838) 2018-03-26 10:06:05 +02:00
Raphael Michel
938c7df28a Fix #103 -- Implement Stripe Connect (#836)
* ...

* Upgrade Stripe API client

* Implement account choice

* Add disconnect and fix tests
2018-03-26 10:05:34 +02:00
Raphael Michel
6e22ea178b Fix Stripe being shown as disabled 2018-03-24 18:18:28 +01:00
Raphael Michel
253f336509 Add free_price field when copying products 2018-03-24 18:18:28 +01:00
Raphael Michel
3a7e0da80b Backend UX: Restructure payment settings 2018-03-24 18:18:28 +01:00
Felix Rindt
073860cd5b Refs #828 -- Presale: change order thankyou text (#832) 2018-03-22 18:34:59 +01:00
Raphael Michel
18be4db320 Widget: More resilient file handling 2018-03-21 09:55:59 +01:00
Raphael Michel
5cbcbe6d7e Thumbnail: Fix CMYK images 2018-03-21 09:55:38 +01:00
Raphael Michel
1ef3f83e46 Improve thumbnail quality 2018-03-20 17:14:29 +01:00
Raphael Michel
6ab0a839b1 Fix accidental push of wrong MEDIA_URL default 2018-03-20 17:13:48 +01:00
Raphael Michel
e329753939 Add a FAQ section on check-outs 2018-03-20 16:11:05 +01:00
Raphael Michel
843751b53f Revert accidental push of test settings (yes, the password has been changed) 2018-03-20 14:23:18 +01:00
Raphael Michel
1f083a52eb Increase maximum filename size of FileFields 2018-03-20 13:21:20 +01:00
Raphael Michel
879eb6ee9f Widget: fix broken iframe detection 2018-03-20 12:27:56 +01:00
Raphael Michel
2db1e6b596 Stripe: Open payment gateways in new window when shown in widget 2018-03-20 12:27:17 +01:00
Raphael Michel
94f5ba7d1a Remove print statement 2018-03-20 11:59:25 +01:00
Raphael Michel
e7458f3032 Add custom thumbnailer 2018-03-20 11:55:46 +01:00
Raphael Michel
840cee206a Compatibility with an external file storage separated in pub/ and priv/ 2018-03-20 11:55:46 +01:00
Raphael Michel
511cdbbfe2 Add correct flag for pt-br 2018-03-18 18:09:16 +01:00
Raphael Michel
35f1999b3a Allow organizers to modify answers to check-in questions 2018-03-17 22:10:43 +01:00
Raphael Michel
3f55c694b8 Do not require invoice address name if invoice address is not required 2018-03-17 22:10:16 +01:00
Raphael Michel
6df0147fe9 Remove unused method 2018-03-16 15:27:02 +01:00
Raphael Michel
5e3b4b126e Make voucher lookups case-insensitive 2018-03-16 15:27:02 +01:00
Ture Gjørup
b564fe8a0d Refs #654 -- API: Writable category endpoints (#818)
* EBILL-5: Added POST, PATCH, PUT and DELETE for categories

* EBILL-5: Fixed item category not removed on category delete
2018-03-16 14:50:22 +01:00
Raphael Michel
1dc3a7202a Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-03-16 12:32:28 +01:00
Raphael Michel
cfa01d3c15 Use "their" instead of "his" 2018-03-16 12:31:17 +01:00
Raphael Michel
c4cac468ff Merge pull request #809 from pretix-translations/weblate-pretix-pretix
Update from Weblate.
2018-03-16 12:25:18 +01:00
Raphael Michel
a034bf9710 Merge branch 'master' into weblate-pretix-pretix 2018-03-16 12:24:04 +01:00
Raphael Michel
0336b0a15c Do not allow duplicate slugs in a case-insensitive way 2018-03-15 13:42:33 +01:00
Felix Rindt
94a2cfe7fc Fix doc typo 2018-03-14 17:13:29 +01:00
Felix Rindt
d22d0fdab5 include internal comment in order search 2018-03-14 17:13:18 +01:00
Jan-Frederik Rieckers
6f9f47bfe3 Fixes #798 (in a very basic way) 2018-03-14 17:12:57 +01:00
Raphael Michel
b2402cdd39 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-03-13 09:44:09 +01:00
Ture Gjørup
289e1ee315 Translated on translate.pretix.eu (Danish)
Currently translated at 68.3% (1520 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Matheus Nunes
c1d1cbda70 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 98.3% (58 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
17bac3714d Translated on translate.pretix.eu (Dutch)
Currently translated at 98.3% (58 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Ture Gjørup
9699fb8894 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Matheus Nunes
16809c0136 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 10.0% (224 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Raphael Michel
e0408510b8 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (2234 of 2234 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Felix Rindt
14782c184f Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2234 of 2234 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Claude
527f5c5ae6 Translated on translate.pretix.eu (French)
Currently translated at 0.1% (3 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
b9aa4f1482 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.3% (676 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
5ea6234cfb Translated on translate.pretix.eu (Dutch)
Currently translated at 30.3% (675 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
d056e1de1e Translated on translate.pretix.eu (Dutch)
Currently translated at 30.3% (675 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
2feb0246ff Translated on translate.pretix.eu (Dutch)
Currently translated at 30.2% (673 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
f4be045f08 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.2% (672 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
a42ca225e3 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.1% (671 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
5fb1bed9d2 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.1% (671 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
c0c903d81a Translated on translate.pretix.eu (Dutch)
Currently translated at 30.1% (670 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
60b56d61ed Translated on translate.pretix.eu (Dutch)
Currently translated at 30.0% (669 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
fe1f334e2e Translated on translate.pretix.eu (Dutch)
Currently translated at 30.0% (669 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
fe4d70a9f9 Translated on translate.pretix.eu (Dutch)
Currently translated at 30.0% (668 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
93fded58f0 Translated on translate.pretix.eu (Dutch)
Currently translated at 29.9% (667 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
9a7b8ca27d Translated on translate.pretix.eu (Dutch)
Currently translated at 29.9% (665 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
aa7d75fae4 Translated on translate.pretix.eu (Dutch)
Currently translated at 29.7% (662 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
be345ffcc1 Translated on translate.pretix.eu (Dutch)
Currently translated at 29.7% (661 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
b3589312f8 Translated on translate.pretix.eu (Dutch)
Currently translated at 28.8% (642 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
08bd45d07e Translated on translate.pretix.eu (Dutch)
Currently translated at 28.8% (642 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten van den Berg
9af60c4192 Translated on translate.pretix.eu (Dutch)
Currently translated at 28.5% (635 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
6c48a94ab3 Translated on translate.pretix.eu (Dutch)
Currently translated at 96.6% (57 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Mikkel Ricky
2897be7a10 Translated on translate.pretix.eu (Danish)
Currently translated at 68.2% (1518 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Mikkel Ricky
69c0b04be6 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Raphael Michel
837e309781 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (2234 of 2234 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
anonymous
dca369ba30 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 98.3% (58 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Matheus Nunes
b49d66aa68 Translated on translate.pretix.eu (Portuguese (Brazil))
Currently translated at 47.4% (28 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Mikkel Ricky
4ce8c82244 Translated on translate.pretix.eu (Danish)
Currently translated at 100.0% (59 of 59 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Mikkel Ricky
ab9a530403 Translated on translate.pretix.eu (Danish)
Currently translated at 68.1% (1516 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:43 +00:00
Maarten Visscher
f9d91178b7 Translated on translate.pretix.eu (Dutch)
Currently translated at 98.3% (58 of 59 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Maarten Visscher
d0b8232a36 Translated on translate.pretix.eu (Dutch)
Currently translated at 16.9% (10 of 59 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Maarten Visscher
8f21e2368f Translated on translate.pretix.eu (Dutch)
Currently translated at 27.3% (609 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Claude
87ec1a9fc5 Translated on translate.pretix.eu (French)
Currently translated at 0.0% (0 of 59 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Claude
cb1dcab37d Translated on translate.pretix.eu (French)
Currently translated at 0.0% (0 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Maarten Visscher
91980277e1 Translated on translate.pretix.eu (Dutch)
Currently translated at 27.1% (604 of 2224 strings)

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

powered by weblate
2018-03-13 08:43:42 +00:00
Raphael Michel
c18b259b27 Widget: Work around a scrolling quirk in Chrome 2018-03-13 09:42:39 +01:00
Raphael Michel
dffc82781b Add writable questions API methods 2018-03-13 09:09:50 +01:00
Raphael Michel
aef77965e7 Fix PATCH method for items 2018-03-13 09:09:50 +01:00
Raphael Michel
f21da0cc2b Add identifier field to questions 2018-03-13 09:09:50 +01:00
Raphael Michel
234e0ee764 Fix typo 2018-03-12 13:04:56 +01:00
Raphael Michel
4262bb801e Travis: Do not build weblate branches 2018-03-12 12:13:42 +01:00
Raphael Michel
093941f8ba Another sphinx doc fix 2018-03-11 14:44:08 +01:00
Raphael Michel
1cb1c35e2a Documentation syntax 2018-03-11 14:36:52 +01:00
Raphael Michel
432535e238 Add SPF and DKIM note to documentation 2018-03-11 14:31:48 +01:00
Raphael Michel
b40dc9d96d Fix hard-coded date format 2018-03-11 09:21:45 +01:00
Raphael Michel
cb12e1208b Fix failing middleware test 2018-03-10 15:17:54 +01:00
Raphael Michel
b8225bd206 Stop creating an empty session on first request 2018-03-10 14:19:28 +01:00
Raphael Michel
880c22eef9 Prevent cart ID creation in widget 2018-03-10 14:18:40 +01:00
Raphael Michel
b379c8380d Do not create cart ID for every shop page visitor 2018-03-10 14:07:40 +01:00
Raphael Michel
6a61a113b0 Add selectable to word list 2018-03-08 16:30:39 +01:00
Raphael Michel
4373eae1fe Fix danish flag for real 2018-03-08 15:22:10 +01:00
Raphael Michel
d12e4305bd Add helper script for Weblate 2018-03-08 15:22:10 +01:00
pretix translation bot
7c8a45fd4c Update from Weblate. (#804)
* Added translation on translate.pretix.eu (Danish)

* Added translation on translate.pretix.eu (French)

* Added translation on translate.pretix.eu (Dutch)

* Added translation on translate.pretix.eu (Portuguese (Brazil))

* Added translation on translate.pretix.eu (Arabic)

* Added translation on translate.pretix.eu (Danish)

* Added translation on translate.pretix.eu (Dutch)

* Added translation on translate.pretix.eu (French)

* Added translation on translate.pretix.eu (Portuguese (Brazil))

* Added translation on translate.pretix.eu (Arabic)

* Translated on translate.pretix.eu (German)

Currently translated at 100.0% (2234 of 2234 strings)

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

powered by weblate

* Translated on translate.pretix.eu (German (informal))

Currently translated at 100.0% (2234 of 2234 strings)

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

powered by weblate
2018-03-08 15:12:05 +01:00
Raphael Michel
c28f8f763a Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2018-03-08 14:55:27 +01:00
Raphael Michel
096de6cddf Fix flag for the Danish language 2018-03-08 14:50:22 +01:00
Raphael Michel
ad52476159 Fix typo in default settings text 2018-03-08 14:49:26 +01:00
Raphael Michel
e3d11ab681 Fix spelling mistakes 2018-03-08 14:25:00 +01:00
Raphael Michel
162f37e00f Support for inofficial languages 2018-03-08 13:19:57 +01:00
Raphael Michel
d879634810 Add documentation on the translation process 2018-03-08 12:18:33 +01:00
Raphael Michel
4634f853f1 Documentation spellcheck: Compatibility with enchant2 2018-03-08 10:49:04 +01:00
Raphael Michel
ae861f080b Add global banner message 2018-03-07 15:28:03 +01:00
Raphael Michel
d058721243 Sendmail plugin: Move to background process 2018-03-07 14:48:17 +01:00
Raphael Michel
9fdef5eb5d Show date range of event series in list of events 2018-03-07 12:09:01 +01:00
Raphael Michel
b4488bf1e7 Allow admin to create invoice if invoice setting is set to "all orders" 2018-03-07 10:36:33 +01:00
Raphael Michel
fa6d6b5438 Show "continue" instead of "checkout" also if order is free 2018-03-07 10:35:37 +01:00
Raphael Michel
02f53a55cc Contact form data was only saved to session if invoice addresses where active 2018-03-07 10:35:37 +01:00
Felix Rindt
fdf0b6263a Fix doc typo (#802) 2018-03-07 09:20:21 +01:00
Raphael Michel
59fa5112fc Prepare for using weblate 2018-03-06 18:25:46 +01:00
Raphael Michel
a8033248ae Fix issue with fees without tax rules 2018-03-06 15:33:54 +01:00
Raphael Michel
9a6f299b41 Commit POT files 2018-03-06 11:31:17 +01:00
Raphael Michel
2f1ee93e86 Install psycopg2-binary 2018-03-06 10:01:45 +01:00
Raphael Michel
34fa5d6bfc Allow customer to manually generate invoices if order is older than invoice setting 2018-03-06 09:48:36 +01:00
Raphael Michel
357f728043 pretixdroid: Online search should include name of parent position 2018-03-05 12:33:26 +01:00
Raphael Michel
9522ee93dc Bump version to 1.14.0.dev0 2018-03-03 21:39:06 +01:00
Raphael Michel
c68b6116a2 Bump version to 1.13.0 2018-03-03 21:38:07 +01:00
Raphael Michel
f0db879c9c Update docs and German translation 2018-03-03 21:16:17 +01:00
Felix Rindt
07d8a3d765 Fix #774 -- Make question options sortable (#786)
* add position field

* add question option sorting logic
* add meta class to question option for sorting
* regenerate migration
* add template content and view mechanics

* Rename migration after rebase & update dependency
2018-03-03 20:36:30 +01:00
Raphael Michel
e35e264d81 Improve voucher redemption filter (#792) 2018-03-03 11:58:59 +01:00
Raphael Michel
d537e6a869 Order confirmation: Add e-mail to contact information box 2018-03-03 11:56:33 +01:00
Leonardo
d4dd1861a9 Fix #740 -- Date picker: Fix line height for decade span (#761)
* Fix line height for decade span

* Move to own file
2018-03-03 11:31:23 +01:00
Mohit Jindal
3019a31fbb Fix #735 -- Display of event series on public organizer page (#753) 2018-03-03 11:24:07 +01:00
Raphael Michel
303b9912ff Add „button“ operation mode of the widget (#778) 2018-03-03 11:20:41 +01:00
Raphael Michel
0259b2e5b9 Update paypal documentation 2018-03-02 22:55:37 +01:00
Raphael Michel
5c7e8029f4 Fix incorrect test case 2018-03-02 22:05:56 +01:00
Raphael Michel
08e3fd3141 Fix spelling 2018-03-02 21:54:36 +01:00
Raphael Michel
30123fd6ff Add currency property to subevent 2018-03-02 21:54:08 +01:00
Raphael Michel
3955299983 Catch VAT WebServiceError 2018-03-01 09:21:21 +01:00
Raphael Michel
b5d0df3ca7 Fix determination of VAT ID validation 2018-03-01 09:19:04 +01:00
Raphael Michel
22c65da9d1 Fix invalid use of money_filter 2018-03-01 09:17:59 +01:00
Raphael Michel
578c1ecfaf Add support for custom taxation rules 2018-02-28 23:03:25 +01:00
Raphael Michel
d8d00a7e26 Add total argument to fee calculation signals 2018-02-28 21:03:38 +01:00
Raphael Michel
37f0f7a138 Add service fees as a first-level fee type 2018-02-27 22:39:07 +01:00
Raphael Michel
f61e9367ec Update German translation 2018-02-26 10:51:44 +01:00
Raphael Michel
3c3e59e932 Refs #99 -- Improve support for currencies with less than 2 decimal places (#783)
* Refs #99 -- Fix stripe support for zero-decimal currencies

* Add new money formatting method

* Force decimal places in many places

* Locale-aware currency rendering

* Fix currencies in more places

* More currency fixes
2018-02-26 10:46:07 +01:00
Raphael Michel
29e22a0c6c Fix check-in of unpaid orders in web check-in list 2018-02-26 10:42:58 +01:00
Raphael Michel
0d1f424425 Improve performance of voucher bulk creation 2018-02-26 10:42:58 +01:00
Tim Freund
1c01e23867 Name presale index + unit test for URL names (#784)
* Name the default URL

If metrics collection is enabled, the index page of the site will fail
to load: without a name, the metrics middleware throws a TypeError.

* Test for names on all URLs

This test passes if all URLs have names. Without names, URLs will cause
the optional metrics middleware to throw a TypeError.
2018-02-26 10:17:42 +01:00
Felix Rindt
f763a8694b Fix #779: add form field for unpaid option of checkin lists in subevent detail view (#781)
* add form field for unpaid option of checkin lists in subevent detail view

* change order of include_pending field

* also change the order in new check in lists
2018-02-26 10:17:28 +01:00
Raphael Michel
675b853b29 Remove organizer property from ICalendar files as we used it not as it is intended to be used. 2018-02-23 10:51:32 +01:00
Raphael Michel
2434bf14d5 Add checkin_attetion field to Order model 2018-02-22 13:25:26 +01:00
Felix Rindt
70fbbfe2a0 Refs #757: show voucher input for subevents only if subevent is selected (#777)
* show voucher input for subevents only if subevent is selected

* move logic to python
2018-02-22 09:44:53 +01:00
Raphael Michel
e096898a05 Update German translation 2018-02-21 16:17:06 +01:00
Raphael Michel
3fbccf3f64 Allow check-in lists to include unpaid orders 2018-02-21 16:17:06 +01:00
Raphael Michel
36585395f1 Voucher list: add more filters 2018-02-21 16:17:06 +01:00
Felix Rindt
e4b0a1613f Refs #754 -- check item tax_rule is not none (#776) 2018-02-21 12:51:50 +01:00
Raphael Michel
1192e474c5 Prevent duplicate All/None links 2018-02-20 10:20:24 +01:00
Raphael Michel
e48ea99e48 Fix datetime in check-in list on MySQL 2018-02-20 10:19:55 +01:00
Raphael Michel
072f2a0ee9 Pin sessions to the user agent in use 2018-02-19 13:02:55 +01:00
Tim Freund
aecb536a34 Use config.getboolean to get metrics enabled value (#770)
Given the following configuration:

[metrics]
enabled=False

Using config.get results in a METRICS_ENABLED value that always
evaluates to True. This PR switches to config.getboolean so that metrics
can be disabled without deleting the configuration values.
2018-02-18 17:40:13 +01:00
Tim Freund
a68686cb06 Docs: Fix link to the Celery configuration documentation (#771) 2018-02-18 17:39:51 +01:00
Tim Freund
ba8cf3e01e Replace PREFIX_CONFIG_FILE with PRETIX_CONFIG_FILE (#769)
The code looks for PRETIX_CONFIG_FILE in src/pretix/settings.py.
This change updates the documentation to match.
2018-02-18 17:39:34 +01:00
Raphael Michel
b0c5189c4b Fix timezone for footer of printed exports 2018-02-14 11:50:24 +01:00
Raphael Michel
d44eb67dec Allow http: forms during testing 2018-02-14 11:50:10 +01:00
Raphael Michel
58d36b08e2 Pin Sphinx version 2018-02-14 11:49:50 +01:00
Raphael Michel
98906731e3 Move plugin list to website 2018-02-14 11:49:44 +01:00
Raphael Michel
035a4b0928 Add next parameter to logout view 2018-02-14 11:49:16 +01:00
Raphael Michel
85fbe666ea Order modification page: Make cancel button more useful 2018-02-12 12:38:30 +01:00
Tobias Kunze
741d0bc686 Put event slugs in export filenames (#768) 2018-02-12 12:30:13 +01:00
Raphael Michel
ded539ce7a Ignore event end date for subevents 2018-02-07 13:51:22 +01:00
Raphael Michel
c53fd25d1c Use a consistant CSS compression method 2018-02-05 13:48:47 +01:00
Raphael Michel
da32621c55 Add "is_implicit" attribute to payment providers 2018-02-04 23:14:18 +01:00
Raphael Michel
4ccf33af03 Add support for orders without email addresses 2018-02-04 22:42:41 +01:00
Raphael Michel
a5af7a70f3 Add support for iframeResizer 2018-02-04 22:42:04 +01:00
Raphael Michel
16ab0d29d6 Add request argument to contact_form_fields signal 2018-02-04 22:15:58 +01:00
Raphael Michel
05ad9022c0 Always use full width when used in an iframe 2018-02-04 22:02:54 +01:00
Raphael Michel
fef211b220 Change typeahead.css and morris.css to scss files 2018-02-04 21:06:44 +01:00
Raphael Michel
6aee1ee41f Stip HTML from text in PDFs except for <br>, make <br> not break things 2018-02-04 19:45:00 +01:00
Raphael Michel
bab7f9b1f3 Notification view: use select2 event selection 2018-02-04 19:09:22 +01:00
Raphael Michel
340e7afd06 Fix bug that lead to notifications being sent for all events 2018-02-04 18:53:56 +01:00
Raphael Michel
cb83c9cff2 Add a short system check before publishing packages 2018-02-04 18:33:50 +01:00
Raphael Michel
911a8fed06 Fix waiting list test 2018-02-04 18:28:29 +01:00
Raphael Michel
eb8b43fe36 Add missing __init__.py file 2018-02-04 18:27:45 +01:00
Raphael Michel
2a15dc57d8 Waiting list: Do not send out for disabled events 2018-02-04 14:24:53 +01:00
Raphael Michel
67678e35bb Disable shop and waiting list after end of event 2018-02-04 14:14:49 +01:00
Raphael Michel
2f00db8081 Bump version to 1.13.0.dev0 2018-02-03 17:00:40 +01:00
Raphael Michel
38fc826053 Bump version to 1.12.0 2018-02-03 16:59:30 +01:00
Raphael Michel
300578a44b Update German translation 2018-02-03 16:57:04 +01:00
Raphael Michel
dc2bcdcfbc Log impersonation actions 2018-02-03 16:50:53 +01:00
Raphael Michel
7e18e89012 Next try 2018-02-03 16:33:12 +01:00
Raphael Michel
24f47722c0 Fix careless mistake in 15dc6285 2018-02-03 16:02:56 +01:00
Raphael Michel
04b679a4a7 Fix question form handling of type H 2018-02-03 15:41:56 +01:00
Raphael Michel
f6713008aa Apparently, isort reverted their change 2018-02-03 15:01:01 +01:00
Raphael Michel
15dc62855b Fix check-in list export on non-SQLite databases 2018-02-03 14:08:03 +01:00
Raphael Michel
4ed3df2b08 Voucher list: Refactor to use filter form 2018-02-02 15:20:26 +01:00
Raphael Michel
8a3eaae29c Fix ValueError introduced in e12caf18 2018-02-02 15:07:53 +01:00
Raphael Michel
22edc016dd Add source code comment 2018-02-02 14:54:05 +01:00
Raphael Michel
5205daae6d Add check-in date column to check-in list CSV exporter 2018-02-02 14:44:14 +01:00
Raphael Michel
7ea79ebe56 Fix issue in question answer formatting 2018-02-02 14:44:05 +01:00
Raphael Michel
3bfa8bd81e Fix localization and timezone issue in widget 2018-02-02 14:43:51 +01:00
Raphael Michel
39abf63698 Additional fixes 2018-02-02 10:16:23 +01:00
Raphael Michel
f68a6d1119 Fix redirect assertions 2018-02-01 18:13:59 +01:00
Raphael Michel
1a1a02d080 Compliance with new isort version 2018-02-01 16:38:22 +01:00
Raphael Michel
dacffc5f90 Fix careless mistake 2018-02-01 16:31:27 +01:00
Raphael Michel
f2068b2663 Update German translation 2018-02-01 16:28:15 +01:00
Raphael Michel
989282ffbe Refs #765 -- Display warning if cookies are blocked 2018-02-01 16:28:15 +01:00
Raphael Michel
e469b2e6ad Add white logo to repository 2018-02-01 16:28:15 +01:00
Ture Gjørup
8eaada992f Refs #654 -- API: Writable item endpoints (#676)
* MKBDIGI-184: Basic create added for API items endpoint

* MKBDIGI-184: Starting endpoint for GET /api/v1/organizers/(organizer)/events/(event)/items/(id)/variations/

* MKBDIGI-184: endpoint for GET /api/v1/organizers/(organizer)/events/(event)/items/(id)/variations/

* MKBDIGI-184: Completed endpoint for variations

* MKBDIGI-184: Added endpoint for addons

* MKBDIGI-184: Added Item validation

* MKBDIGI-184: Added check for order/cart positions on item variation destroy.

* MKBDIGI-184: Fixed check for order/cart positions on item variation destroy.

* MKBDIGI-184: Updated tests, validation for addons

* MKBDIGI-184: Documentation feedback corrections

* MKBDIGI-184: Added documentation for item add-ons

* MKBDIGI-184: Code formatting fixes

* MKBDIGI-184: Feedback fixes

* MKBDIGI-184: Updated tests for delete item

* MKBDIGI-184: Cleaned up tests

* MKBDIGI-184: Added additional test URLs

* MKBDIGI-184: Documentation fixes

* MKBDIGI-184: Fixed read-only fields/Documentation

* MKBDIGI-184: Documentation fixes

* MKBDIGI-184: Added helper for dict merge for 3.4 compatibility

* MKBDIGI-184: Validation updates

* MKBDIGI-184: Fixed permissions test error. Changed to HTTP 404 for POST to addons endpoint

* MKBDIGI-184: Implemented nested variations and add-ons for POST on the item endpoint.
2018-02-01 15:43:51 +01:00
Raphael Michel
f5dba45fa0 Fix invalid queryset 2018-02-01 15:37:34 +01:00
Raphael Michel
e72b5893c4 Minor compatibility refactoring 2018-01-31 18:46:07 +01:00
Raphael Michel
e78a176e9f CSP: Remove nonce
The nonce wasn't relied on because it broke Safari and having it in
there forbids unsafe-inline, which breaks charts.
2018-01-31 18:45:25 +01:00
Raphael Michel
8143999803 Small improvements to user list 2018-01-29 13:25:33 +01:00
Raphael Michel
219c2c94e8 Update German translation 2018-01-29 12:42:51 +01:00
Raphael Michel
37f612801f Fix #762 -- Add a note on the deletion constraints of events 2018-01-29 12:25:11 +01:00
Raphael Michel
0b12b7aa89 Refs #678 -- Allow deletion of events that do not have any orders 2018-01-29 12:25:11 +01:00
Raphael Michel
14da25bd9e Allow administrators to impersonate other users 2018-01-29 12:25:11 +01:00
Raphael Michel
3a713541a2 User management UI for system administrators 2018-01-29 12:25:11 +01:00
Raphael Michel
c7a547a875 Fix encoding of error messages 2018-01-29 10:41:52 +01:00
Raphael Michel
e12caf186c Use Select2 for subevent and other long selections (#763)
* Use Select2 for subevent and other long selections

* Minor correction
2018-01-26 16:47:33 +01:00
Raphael Michel
1ee6e31538 Fix #190 and #472 -- Change of questions within pretix control 2018-01-26 12:43:47 +01:00
Raphael Michel
083c94403b Fix #400 -- Automatically create cancellations for invoices on expiry (#760) 2018-01-26 09:09:04 +01:00
Raphael Michel
67121decbf Copy some frontend styles to the backend 2018-01-24 19:13:57 +01:00
Felix Rindt
fcd6bb1084 Fix register exporter signal name in doc (#759)
The signal is defined at 
353dce789d/src/pretix/base/signals.py (L143)
and ends with an s.
2018-01-24 17:48:25 +01:00
Raphael Michel
a81a4b895a Fix waiting list processing with infinite-size quotas 2018-01-24 15:04:23 +01:00
Raphael Michel
c50c5177b8 Widget checkout: Fixed links to modify order details
Thanks @codingjoe for reporting!
2018-01-24 13:18:31 +01:00
Raphael Michel
30eefe57ef Add word to typo whitelist 2018-01-23 15:02:15 +01:00
Raphael Michel
ce33cce5a9 Update German translation 2018-01-22 22:59:00 +01:00
Raphael Michel
d0dfde382c Questions at check-in time (#745)
Questions at check-in time
2018-01-22 22:55:54 +01:00
Raphael Michel
7fb2d0526e Updated German translation 2018-01-22 22:54:35 +01:00
Raphael Michel
fb34467cba Invoice renderer: Add quantity column 2018-01-22 22:54:35 +01:00
Raphael Michel
7e62cddb97 PDF ticket output: Add item category variable 2018-01-22 22:54:35 +01:00
Felix Rindt
78b31149b5 Fix #751 -- calculate payment fees in OrderChangeManager (#752)
* check for payment method instead of order total

* incorporate payment fee diff in totaldiff at oder change

* use fee from model and the correct order total

* add error handling

* do not change paid orders

* OrderChangedManager can only be committed once

* remove prints of stripe secrets

* add tests

* an OrderChangeManager must not be committed multiple times
* A pending free order stays pending after being changed

* comments on paid_to_free logic
2018-01-22 12:53:46 +01:00
Raphael Michel
817038563f Detect more invalid placeholder specs 2018-01-22 09:02:57 +01:00
Felix Rindt
56ca2305bd Payment Docs: Fix arrow and link to pretix website (#755) 2018-01-19 11:07:13 +01:00
Felix Rindt
fc7bafe3d9 Fix italics underscores in markdown doc (Fix #748) (#750)
let's just get this out of the way ^^ There are more important issues...
2018-01-17 12:15:14 +01:00
Felix Rindt
d622f38e1d Fix #747 -- Logging of download reminders (#749)
Fix #747 -- Logging of download reminders
2018-01-17 12:15:00 +01:00
Felix Rindt
139810c8a5 fix typo in docstring (#746) 2018-01-16 12:36:29 +01:00
Raphael Michel
f8cc332ed7 Use "cancel" method instead of "refund" for free orders (#743)
* Use "cancel" method instead of "refund" for free orders

* Adjust API
2018-01-15 21:46:16 +01:00
Mohit Jindal
db24bd4d78 Fix #674 -- Assigning bank transactions with a dash in the event slug (#744) 2018-01-15 14:10:53 +01:00
Raphael Michel
d056013296 Fix failing test on CI 2018-01-15 13:06:24 +01:00
Raphael Michel
7e647f7085 Fix logic bug 2018-01-15 12:38:12 +01:00
Raphael Michel
322068b5e0 Update German translation 2018-01-15 11:34:48 +01:00
Raphael Michel
96247d5fa0 Shorter and more useful global dashboard 2018-01-15 11:32:30 +01:00
Raphael Michel
6b7338aff0 Improve performance of global order search 2018-01-15 10:55:26 +01:00
Raphael Michel
59d85cc218 Query optimization experiments 2018-01-14 21:15:42 +01:00
Raphael Michel
7f90fdedf1 Update German translation 2018-01-14 18:32:52 +01:00
Raphael Michel
7723c956bc Do not disable migrations on Travis 2018-01-14 18:23:51 +01:00
Raphael Michel
d0c10a8f72 Fix broken squashed migration 2018-01-14 18:22:45 +01:00
Raphael Michel
c56dd52bd6 Invoices: Hide all tax-related info if there are no taxes involved (#742) 2018-01-14 18:04:06 +01:00
Raphael Michel
a7374f5bbd Code style fixes 2018-01-14 15:17:16 +01:00
Felix Rindt
251d62f3c4 Fix #732 -- Add date and time question types (#732)
* [WIP] add date/time question type

* Date/time questions python classes, types and form handling

* use own timepicker

* Fix argument naming

* Add css and js for datetimepickers

* remove not needed str call

* seperate splitdatetime widget template and fix date/time questions

* change date placeholder to dec 31

* do not show seconds in presale time pickers

* improve codestyle

* add new question types to api doc

* add test

* expand test to datetime question

* add new questiontypes to changelog

remove duplicate parens

* remove timezone from time only question answers

* improve codestyle

* Fix date and time formatting in control question overview
2018-01-14 14:29:38 +01:00
Raphael Michel
b8c041d0d6 Fix #712 -- by default show answers by paid and pending orders 2018-01-14 14:21:26 +01:00
Aiman Parvaiz
dd42037f21 Fix #634 -- Do not allow deleting the last date of an event series (#675)
* Checking for the last date in the event series before deleting a date. Last date in a event series should never be delted.

* Adding check to ensure that last date in a event series is not deleted. Editing unit test around deleting subevent to assert on alert-danger

* Increasing the scope of test_delete. We are now creating 2 subevents and testing deleting one and ensuring that the last one is not deleted

* Fixing alert text. Removing a redundant if condition for checking subevent count

* Adding assert for second event to ensure its not deleted

* Minor fixes and rebase
2018-01-14 13:54:22 +01:00
Raphael Michel
50575d45c1 Fix failing mail tests 2018-01-10 23:04:57 +01:00
Raphael Michel
7268c7fb70 Waiting list: Fix availability calculation 2018-01-10 22:00:07 +01:00
Raphael Michel
83572960d5 Clear combined ticket cache after order information change 2018-01-09 00:03:48 +01:00
Raphael Michel
39f22fa314 Set event name as sender name in emails
(thanks @luto for the suggestion)
2018-01-08 16:16:44 +01:00
Tobias Kunze
69ab5d8c2e Fix typo in 2FA view (#739) 2018-01-08 13:49:46 +01:00
Raphael Michel
58111465bc Widget: Number input field should always have english decimal separator 2018-01-07 19:35:19 +01:00
Raphael Michel
697e56962a Bump to 1.12.0.dev0 2018-01-06 23:42:17 +01:00
Raphael Michel
7d6c45f689 Bump to 1.11.0 2018-01-06 23:41:13 +01:00
Raphael Michel
faa34c9230 Squash pretixdroid migrations 2018-01-06 22:59:31 +01:00
Raphael Michel
8a64c1815a Update German translation 2018-01-06 22:59:31 +01:00
Raphael Michel
f65f166ea6 Generalize pretixdroid settings UI 2018-01-06 22:59:31 +01:00
Dominik Weitz
f054e700a2 Update development documentation, change demo URL (#736)
When using the test data generation script, the demo conference no longer has the URL ``/bigevents/2018``, but is now moved to ``/bigevents/2019`` . This confused me in the beginning.
2018-01-04 15:32:14 +01:00
Raphael Michel
ff8b9e4e1a Invoice download: Properly handle serialized dates 2018-01-02 00:10:36 +01:00
Raphael Michel
ed47e94a70 Invoice exporter: Allow to filter by date and payment method 2018-01-01 22:59:25 +01:00
Raphael Michel
93090f3481 Waiting list view: Ignore invalid GET parameters 2018-01-01 22:42:18 +01:00
Raphael Michel
fa211574a2 Fix celery serialization issues 2018-01-01 22:41:16 +01:00
Raphael Michel
9a18eda404 Delete all check-ins when deleting a check-in list 2018-01-01 17:27:57 +01:00
Raphael Michel
fd3e941472 Follow-up fix for a6af7a90 2018-01-01 15:09:50 +01:00
Raphael Michel
ad03980c2b Fix #729 -- Properly invalidate ticket cache of split orders 2018-01-01 00:26:27 +01:00
Raphael Michel
a6af7a90cb Compatibility with pytest-rerunfailures 4.0 2018-01-01 00:22:22 +01:00
Felix
ba170632a5 Fix #731 -- Display negative payment method fees correctly 2018-01-01 00:21:27 +01:00
Raphael Michel
f8c536afd3 Docs: Ticketing settings 2018-01-01 00:12:45 +01:00
Raphael Michel
53b75e1ca2 Docs: Invoice settings 2018-01-01 00:12:45 +01:00
Raphael Michel
a632b08664 Docs: E-mail settings 2018-01-01 00:12:45 +01:00
Raphael Michel
954b7f6d9e Display event selection within iframes 2017-12-22 13:39:20 +01:00
Jakob Schnell
8c0fb90420 Fix #708 -- Standardize use of check-in (#711)
* standardize use of check-in

* split on occurrence of "checkin_*"

Instead of skipping when encountering "checkin_*", we now split and only
pass the second part to the spell-checker. This fixes the aforementioned
problem.

* fix spelling issue with checkins
2017-12-21 14:28:33 +01:00
Jarkor
5d697a3189 Fixing Typo (#725)
* fixing typo

* fixing typo
2017-12-21 00:11:53 +01:00
Raphael Michel
2c04a4daec API: Adjust test to new reality 2017-12-20 16:29:05 +01:00
Raphael Michel
f3c1296105 API endpoint for positions on a check-in list 2017-12-20 15:08:14 +01:00
Jakob Schnell
50c3f025e2 remove alert since mail-typo-checking is disabled (#723) 2017-12-19 18:12:53 +01:00
Raphael Michel
9b4a3bcbef Fix voucher filter 2017-12-19 10:53:23 +01:00
Raphael Michel
d8486e8f90 Fix missing logdisplay message 2017-12-19 10:53:23 +01:00
Raphael Michel
fc731c3f58 Fix untranslated form fields 2017-12-18 20:51:31 +01:00
Raphael Michel
a62fbd54d4 Remove typocheck, it has to many false positives 2017-12-18 20:51:31 +01:00
Tobias Kunze
f81a7a397a Prepend slug to exported filenames (#719) 2017-12-18 09:12:13 +01:00
Raphael Michel
8543cb7ece Sync setup.py with requirements.txt 2017-12-16 18:17:42 +01:00
Raphael Michel
5015c9d8f3 Force upgrade to celery 4.1 2017-12-16 17:32:21 +01:00
Raphael Michel
2b4dede658 Really import the actual task 2017-12-15 14:34:31 +01:00
Raphael Michel
d2b15ae679 Fix missing task import 2017-12-15 14:07:43 +01:00
Raphael Michel
5ece8fd2f7 Update German translation 2017-12-15 13:44:06 +01:00
Raphael Michel
128203800c Implement notifications for admin users (#700)
* First stab at notification settings

* Add "global" setting for notification levels

* Trigger notification task

* Get users with permission for event

* Actually send notification emails

* More notifications

* Allow to turn off notifications

* Link in email to pause all notifications

* Add NotificationType to wordlist

* Add notification tests

* Add documentation

* Rebase fixes
2017-12-14 22:06:08 +01:00
Raphael Michel
f0a1397eea Fix line in docker service file 2017-12-14 18:05:18 +01:00
Raphael Michel
ef42055de1 Increase test startup time by disabling migrations during tests 2017-12-14 11:04:50 +01:00
Raphael Michel
15aff6030c Fix annotated check-in list query 2017-12-13 23:20:44 +01:00
Raphael Michel
215a28fac5 Sendmail plugin: Allow to filter users by product 2017-12-13 17:50:38 +01:00
Raphael Michel
e9e155201f Refs #705 -- Further try to workaround reportlab issue 2017-12-13 12:11:07 +01:00
Raphael Michel
21a457cadd Banktransfer: Show transfer details for refunded payments 2017-12-12 18:32:41 +01:00
Raphael Michel
8e7eab636f Fix a bug leading to loss of answers for addon-related questions 2017-12-11 21:38:42 +01:00
Raphael Michel
d7ce46c14a Update German translation 2017-12-11 21:26:42 +01:00
Raphael Michel
ee7f8940d0 Checkout UX: Fix missing border 2017-12-11 21:01:45 +01:00
Raphael Michel
cf1883a039 Add celery queue "background" 2017-12-11 16:56:28 +01:00
Raphael Michel
7ec614a691 Allow filtering the voucher list for checked-in tickets 2017-12-11 16:07:24 +01:00
Raphael Michel
e4fc49769f Backend UX: Allow searching for order code in check-in list 2017-12-11 16:07:24 +01:00
Raphael Michel
d97df9cddd Checkout UX: Do not show minutes with decimal places in the countdown 2017-12-11 16:07:24 +01:00
Raphael Michel
33a254ce92 Checkout UX: Place "Empty cart" button below "Checkout" button on mobile
Thanks to @breunigs for the suggestion
2017-12-11 16:07:24 +01:00
Raphael Michel
3ec0366c21 Checkout UX: Open number keyboard on iOS
Thanks to @breunigs for the suggestion
2017-12-11 16:07:24 +01:00
Raphael Michel
759db2d20e Checkout UX: Disable user zooming for iOS users
Thanks to @breunigs for suggesting
2017-12-11 16:07:24 +01:00
Raphael Michel
8f7c6521a9 Checkout UX: Going back to editing the invoice address opens accordion accordingly
Thanks @breunigs for the suggestion
2017-12-11 16:07:24 +01:00
Raphael Michel
725a7f21c4 Checkout UX: Make whole panel head clickable in payment method selection
Thanks @breunigs for the suggestion
2017-12-11 16:07:24 +01:00
Raphael Michel
e24611fde9 Checkout UX: Change select-one questions to select boxes (thanks @rixx) 2017-12-11 16:07:24 +01:00
Raphael Michel
7a077095ee Fix #403 -- Show successful payment on invoice (see #706) 2017-12-11 16:07:24 +01:00
Raphael Michel
fade09ca8f Add custom celery routing (#698) 2017-12-11 16:07:19 +01:00
Jakob Schnell
9ab39904e8 Implement automatic spell-check for docs (#688)
* [WIP] Implement automatic spell-check for docs

fixes #663

The only thing unclear to me so far is how the output of `make spelling`
should be checked - is there a possibility to check for a file (i.e.
`_build/spelling/output.txt`) to be empty, and report a failed build
otherwise?

* fix typo in requirements.txt

* add enchant library

* travis should report errors, order spelling wordlist

* change travis.yml to easier troubleshoot build issues

* fixed more typos, added more words

* add more words, fix more typos

* added more words

* added more words

* revert changes to .travis.yml
2017-12-11 11:41:59 +01:00
Raphael Michel
fb5fa57fd6 Fix reverse ordering of lists 2017-12-09 19:54:39 +01:00
Raphael Michel
9e84e78215 Pagination improvements, allow to select page size 2017-12-09 19:54:39 +01:00
Raphael Michel
f5bf2ac4ca Show date on event dashboard 2017-12-09 19:54:39 +01:00
Raphael Michel
c50a8e7740 Fix #702 -- Fix U2F support in Firefox 57 2017-12-09 18:38:12 +01:00
Tobias Kunze
3ece911018 Fix typo (#703) 2017-12-09 15:21:07 +01:00
Raphael Michel
1011b67f0a Fix markup in emails: Consistently allow <pre> in markdown content 2017-12-07 18:33:33 +01:00
Raphael Michel
497679284a Bank CSV import: Allow dealing with files of more than a few hundred lines during first import 2017-12-07 18:29:08 +01:00
Raphael Michel
263df3ac4d Bump release to 1.11.0.dev0 2017-12-05 18:55:25 +01:00
Raphael Michel
c751a180a4 Bump version 2017-12-05 18:51:40 +01:00
Raphael Michel
3ee6a0cf6f German translation: Consistent casing of Check-in 2017-12-04 20:58:59 +01:00
Raphael Michel
0c23f36e36 pretixdroid: Search should also return unpaid tickets 2017-12-04 20:35:50 +01:00
Raphael Michel
40b84fd676 Docker: Workaround for bug in reportlab 3.4.0 2017-12-04 20:35:32 +01:00
Raphael Michel
e5e1d3b8e5 Fix German translation file 2017-12-04 18:39:22 +01:00
Jakob Schnell
9bba225157 Add mention of CoC in README.md (#696)
* mention CoC in README.md

According to the discussion in #689, the Code of Conduct gets directly
referenced in the README-file, instead of linking to the
CODE_OF_CONDUCT-file

* undo whitespace-change
2017-12-04 18:24:18 +01:00
Raphael Michel
196c615f53 Update German translation 2017-12-04 18:21:24 +01:00
Raphael Michel
353dce789d Fix #515 -- Add check-in lists (#693)
* Data model and migration

* Some backwards compatibility

* CRUD for checkin lists

* Show and perform checkins

* Correct numbers in table and dashboard widget

* event creation and cloning

* Allow to link specific exports and pass options per query

* Play with the CSV export

* PDF export

* Collapse exports by default

* Improve PDF exporter

* Addon stuff

* Subevent stuff, pretixdroid tests

* pretixdroid tests

* Add CRUD API

* Test compatibility

* Fix test

* DB-independent sorting behavior

* Add CRUD and coyp tests

* Re-enable pretixdroid plugin

* pretixdroid config

* Tests & fixes
2017-12-04 18:12:23 +01:00
Raphael Michel
f1be7ed69d API docs: Add version change for quotas 2017-12-04 16:50:19 +01:00
Raphael Michel
37146c1e10 Dashboards: Link tiles with subevent 2017-12-04 16:24:42 +01:00
Raphael Michel
feba94547a Dashboard and product list: Respect availability dates of products 2017-12-04 16:24:07 +01:00
Raphael Michel
1b82b64a0a PDF ticket output: Fix TypeError on 'content': null 2017-12-04 15:48:21 +01:00
Raphael Michel
0f8cd31e0a Fixed incorrect typo-check suggestion
Thanks @freakboy3742 for reporting
see https://twitter.com/freakboy3742/status/936764146074316801
2017-12-04 15:40:06 +01:00
Raphael Michel
c351a5cf72 Ticket preview: Locale and invoice address 2017-12-04 13:56:02 +01:00
Raphael Michel
98a58779ad Consistent markdown parsing, docs on markdown and display settings 2017-12-03 15:19:15 +01:00
Raphael Michel
1aef721794 User documentation: More information on payments 2017-12-01 11:19:14 +01:00
Raphael Michel
7373d958a5 User documentation: subevents 2017-12-01 10:26:43 +01:00
Raphael Michel
37fdbf25ff User docs: Add FAQ and domain pages 2017-11-30 12:16:17 +01:00
Jakob Schnell
1580709c97 Fix #689 -- Add CODE_OF_CONDUCT.md (#695)
fixes #689
2017-11-30 12:01:24 +01:00
Raphael Michel
c7f1f67ee9 Widget: Fix incorrect duplicate formatting of float, loosing precision 2017-11-30 07:52:17 +01:00
Raphael Michel
8d90c9e03a Add icon columns to product overview 2017-11-26 14:19:02 +01:00
Raphael Michel
40818ae853 GitLab config 2017-11-25 19:18:40 +01:00
Raphael Michel
364ea9ca29 [SECURITY] Respect session timeout in API 2017-11-25 19:18:40 +01:00
Raphael Michel
f6b1bd9fe8 [SECURITY] Fix handling of session timeouts 2017-11-25 19:18:40 +01:00
Raphael Michel
30c7319811 Remvoe obsolete code 2017-11-25 19:18:40 +01:00
Jakob Schnell
41fbf362fa fix typos in doc signal (#687) 2017-11-25 14:31:09 +01:00
Raphael Michel
e8867d0fbc Allow searching organizes by name 2017-11-25 14:27:35 +01:00
Raphael Michel
3bf8aad127 Update German translation 2017-11-24 17:06:16 +01:00
Raphael Michel
fb5354c3cd Fix AttributeError in redemption view 2017-11-24 10:04:04 +01:00
Raphael Michel
a62105fa28 Stripe Elements: Fix incorrect JavaScript and display loading indicator 2017-11-24 09:42:26 +01:00
Raphael Michel
65592dc42d Checkout step Questions: Automatically focus first field 2017-11-24 09:35:47 +01:00
Raphael Michel
3a345c0d7f Stripe webhook: Schedule retry on lock timeout 2017-11-24 09:32:41 +01:00
Raphael Michel
3da11e615f Fix TypeError when accessing a product list without a subevent 2017-11-24 09:29:05 +01:00
Raphael Michel
3eb87a878a Fix invoice API test after addition of attendee names 2017-11-24 09:28:31 +01:00
Raphael Michel
91ed869dba Correctly assign positions of newly created products 2017-11-23 20:55:36 +01:00
Raphael Michel
bd5d0093ef Allow adding question answers to ticket layouts 2017-11-23 20:55:03 +01:00
Raphael Michel
bd7ba09f10 Ticket PDF editor: Correct save button handling in Firefox 2017-11-23 18:52:42 +01:00
Raphael Michel
851b6a837f Add attendee names to invoices 2017-11-23 18:44:41 +01:00
Raphael Michel
d8064d1567 Add email_filter signal 2017-11-23 18:15:41 +01:00
Raphael Michel
046edd5a86 PDF ticket editor: Adjust CSS for very small papers 2017-11-22 14:57:15 +01:00
Raphael Michel
8d8eb5d13b Enforce step order of event creation wizard 2017-11-22 12:09:52 +01:00
Raphael Michel
2a3adb135b Fix position of "Optional" label on small screens 2017-11-22 12:09:52 +01:00
Raphael Michel
b0c4c62668 Expose product mapping in event_copy_data signal 2017-11-22 12:09:52 +01:00
ari-s
a08cb3b8e4 fix "typo" Referrer-Options -> Referrer-Options (#685)
this header was probably meant - at least it's the one that's actually used in the wild.
2017-11-20 08:29:23 +01:00
Raphael Michel
943d61dee9 Update German translation 2017-11-16 22:26:26 +01:00
Raphael Michel
d22427f578 Implement progress indicator during checkout (#677)
* Implement progress indicator during checkout

* Do not extend bars to the edge

* Wording

* Add a bit more margin
2017-11-16 21:24:55 +01:00
Ture Gjørup
e4167380b9 API: Write methods for quotas (#657)
* MKBDIGI-183: Added quotas API write methods

* MKBDIGI-183: Fixed code formatting

* MKBDIGI-183: Added test for permission requirements

* MKBDIGI-183: Documentation corrections

* MKBDIGI-183: Removed redundant create/update locks

* MKBDIGI-183: Added quota validation to check that items and variations corresponds to each other

* MKBDIGI-183: Added quota validation to check that item belong to the same event as the endpoint

* MKBDIGI-183: Added subevent validation to check that subevent belong to the same event as the endpoint

* MKBDIGI-183: Added subevent validation to check that subevent is null for non-series events

* MKBDIGI-183: Changed validation error text

* MKBDIGI-183: Added logging for subevents

* MKBDIGI-183: Fixed code formatting

* MKBDIGI-183: Fixed validation error in API test

* MKBDIGI-183: Fixed documentation errors

* MKBDIGI-183: Fixed typos in validation messages

* MKBDIGI-183: Refactored validation loop vars check

* MKBDIGI-183: Updated error strings in test assersions

* MKBDIGI-183: Fixed logging for API quota update to account changing subevents
2017-11-16 18:39:10 +01:00
Jakob Schnell
445afcc50c fix english typo (#684) 2017-11-16 18:18:58 +01:00
Jakob Schnell
e0e37d9a2d fix german typo (#683) 2017-11-16 18:18:37 +01:00
Raphael Michel
d94faae5af Add subevent to bulk voucher form 2017-11-15 14:53:46 +01:00
Tobias Kunze
e7f38abd77 Use rel="noopener" with target="_blank". (#682)
Required reading: https://mathiasbynens.github.io/rel-noopener/
2017-11-13 18:52:15 +01:00
Raphael Michel
01585877d7 Fix retrying Stripe checkout payments 2017-11-11 22:38:49 +01:00
Raphael Michel
8baa800e30 Fix incorrect encoding of bank account in emails 2017-11-11 22:23:38 +01:00
Raphael Michel
84b2c24f9f Fix language of dates on PDF tickets 2017-11-11 22:13:28 +01:00
Raphael Michel
3fc8ccf8be Add additional voucher test case 2017-11-11 22:09:03 +01:00
Raphael Michel
b294f1a854 Update German translation 2017-11-11 22:07:55 +01:00
Raphael Michel
06725441a1 Fix localization of payment reminder email 2017-11-11 22:00:43 +01:00
Raphael Michel
aa40a27558 Make event slug helptext more accurate 2017-11-11 21:50:30 +01:00
Raphael Michel
f5958a7ff2 Fix TypeError 2017-11-07 18:18:57 +01:00
Raphael Michel
f3221e6e76 Allow attaching invoices to emails 2017-11-07 17:53:28 +01:00
Raphael Michel
7649fa11d3 Fix logging language of expiry mails 2017-11-06 17:18:26 +01:00
Tobias Kunze
98aa70c9ce Remove minor typos in documentation (#673) 2017-11-05 12:54:05 +01:00
Raphael Michel
a3be5c9616 Fix typo in documentation 2017-11-04 20:52:30 +01:00
Raphael Michel
decc8b9141 Fix TypeError on retrying stripe sofort payments 2017-11-04 15:03:43 +01:00
Raphael Michel
1c7df4d9f7 Manually merge changes from #672 (thanks @koebi!) 2017-11-04 11:29:02 +01:00
Jakob Schnell
b94f307379 Fix typos in informal german translation (#671)
Critical points here are the gendering change of "Studenten" into
"Studierende" and "Studentenausweis" into "Studierendenausweis".
2017-11-04 11:23:30 +01:00
Raphael Michel
33d9e35667 Fix typos (thanks @koebi) 2017-11-04 11:18:57 +01:00
Raphael Michel
ad9a3e01de Bump release to dev 2017-11-03 12:33:50 +01:00
Raphael Michel
2cc6d03a8b Bump release 2017-11-03 12:32:56 +01:00
Raphael Michel
6785979fbc Create squash migration 2017-11-03 12:05:46 +01:00
Raphael Michel
23958b3d03 Update translation 2017-11-03 12:00:44 +01:00
Jakob Schnell
831e31ea9d occured -> occurred (#660)
* Fix duplicate source string

* occured -> occurred

All resources I could find listed this as misspelled, but I wasn't too
sure…
Also, it should be checked if all changes to the .po-files are respected
in the corresponding src-files.
2017-11-03 11:46:35 +01:00
Raphael Michel
66483b6ae8 Fix duplicate source string 2017-11-03 11:41:16 +01:00
Jakob Schnell
4614d04be4 Correct english typos (#662)
* Check that vouchers selected via API are for the correct event

* Choose different subject for reminder mails if auto-expiry is off

* correct english typos

As with PR #660, it should be checked whether the changes to the
.po-files are respected in the corresponding src-files.
2017-11-03 11:40:52 +01:00
Raphael Michel
1285e9aa69 Widget: Open waiting list only in iframe if iframe is enabled 2017-11-01 22:46:31 +01:00
Raphael Michel
d108cec685 Add new missing signal to documentation 2017-11-01 22:29:58 +01:00
Ben Hagan
764b9dda7e Fix #489 -- Handle Vouchers With Unavailable Items (#659)
* Fix #489 -- Handle Vouchers With Unavailable Items

* Add regression test
2017-11-01 22:05:10 +01:00
Raphael Michel
82d289cfcf Partially revert 26781001 2017-11-01 21:50:47 +01:00
Raphael Michel
184c91cfbc Catch PaymentException on paypal return view 2017-11-01 21:28:19 +01:00
Raphael Michel
10103b58f0 Synchronize cart countdown with server time 2017-11-01 20:46:37 +01:00
Raphael Michel
2678100149 Fix color assignments on error page 2017-11-01 19:53:39 +01:00
Raphael Michel
09a9dfe591 Add signal pretix.control.signals.event_settings_widget 2017-11-01 19:53:17 +01:00
Raphael Michel
af3e8d5515 Allow simultaneous addition and removal of order positions 2017-11-01 18:01:13 +01:00
Raphael Michel
1b72eca5ec Fix icon SVG file to resemble current logo 2017-11-01 17:49:43 +01:00
Raphael Michel
df5968660b correct typos in informal german translation 2017-11-01 10:00:08 +01:00
Jakob Schnell
eb04e1dcee correct typos in formal german translation (#661)
I think the only "critical" fix here is the change from "Zahlmethoden"
to "Zahlungsmethoden", but that is the word used in the rest of the
translations, so I figured it should be changed here as well.
2017-11-01 09:59:47 +01:00
Ben Hagan
7dff5001b0 Fix #641 -- Show buttons on 'c' or 'r' orders (#658)
Changes template to show "View order as user" and "View email history"
buttons on orders in refunded or cancelled status in control backend.
2017-10-31 09:41:45 +01:00
Raphael Michel
ca93673c10 Update translation 2017-10-30 23:58:36 +01:00
Raphael Michel
71a4664d1f Fix #339 -- Allow to split orders (#341)
* Fix #339 -- Allow to split orders

* Add tests for split orders

* Add notificatiosn to both users

* Improve logdisplay
2017-10-30 23:15:53 +01:00
Raphael Michel
429f30fca7 Make it optional to notify user on order change 2017-10-30 21:36:14 +01:00
Ben Hagan
5376ce4bdb Fix #611 -- Fix overflow in payment information (#656)
Small style change that fixes long word overflow in .panel-body elements
in admin interface.
2017-10-30 12:02:35 +01:00
Raphael Michel
96b57994d9 Make raw config file data accessible to plugins 2017-10-29 16:11:54 +01:00
Raphael Michel
d1971cdcae Clarify docstring 2017-10-29 00:55:42 +02:00
Raphael Michel
65116563fd Add docs on session handling 2017-10-29 00:50:09 +02:00
Raphael Michel
d811e42095 Widget: Fix session handling issue 2017-10-29 00:21:51 +02:00
Raphael Michel
2a7e185d2e Update translation 2017-10-28 23:17:49 +02:00
Jakob Schnell
1a894d71b8 Fix #630 -- manual check-in of attendees (#642)
* [WIP] manual check-in of attendees

This enables manual check-in of attendees.  The post-code was heavily
copied from the APIRedeemView of the pretixdroid, thus so far this seems
to be working, but I have a few questions:

The checkin-Objects generated by the pretixdroid-app have a nonce.
Should the checkin object generated here have a nonce, too?

Should the result of the check-in be noted in any other way than by the
change of the status?

* addressed review comments

* implement unit test for manual checkin

* fix style-issues

* Slight layout change

* Log who did the manual check-in

* Improve unit test to check the result of the action
2017-10-28 23:16:22 +02:00
Raphael Michel
9213a40219 Widget: docs and i18n 2017-10-28 23:02:54 +02:00
Raphael Michel
bf8a6ebbf8 Fix incorrect hardcoded URL 2017-10-28 22:14:44 +02:00
Raphael Michel
2bcb0b0ac1 Add event meta filter to organizer page 2017-10-28 21:54:30 +02:00
Raphael Michel
9767243a6d Fix #277 -- Embeddable shop (#622)
* Vendor vue.js

* Refactor item_group_by_category to support vouchers

* Widget: Show product list

* Widget: free prices

* Widget: pictures and loading indicator

* Widget: First iframe steps

* Widget: Do not rerender iframe

* Widget: Error handling

* Improve widget

* Widget: localization tech

* Fix invoice style

* Voucher attribute and waiting list

* Add some iframe chrome

* First step to namespaced carts

* More isolation steps

* More cart isolation things

* More cart isolation things

* Mobile stuff

* Show cart on checkout pages

* PayPal and Stripe support

* Enable downloads

* Locale handling

* change text "save URL to this exact page"

* Widget: voucher redemption

* Widget: CSS

* CSS: Responsive

* Widget: CSS improvements

* Widget: Add embedding code generator

* Widget: Error messages and SSL check

* First tests

* Widget: tests

* Don't use IDs in widgets

* Widget: static files caching
2017-10-28 21:54:27 +02:00
Raphael Michel
df7fbe5a66 Add missing parameter to API permission test 2017-10-27 13:33:18 +02:00
Raphael Michel
c16dd0c9b6 Refs #654 -- API: Status operations on orders resource (#640)
* API: Write operations on orders resource

* Add order API endpoint /extend/
2017-10-27 13:31:31 +02:00
Raphael Michel
f5c47424f3 Update translations 2017-10-27 00:59:50 +02:00
Jakob Schnell
6207662ca5 Fix #647 -- Add translation for export forms (#652) 2017-10-27 00:51:49 +02:00
Raphael Michel
d63cc80507 Fix quota handling to allow for "add-on swapping" 2017-10-27 00:49:56 +02:00
Raphael Michel
b857157c7b Add field internal_reference to invoice addresses 2017-10-27 00:49:56 +02:00
Raphael Michel
2b8d12f987 Show selected add-ons in questions step 2017-10-27 00:49:56 +02:00
Raphael Michel
28682c7c33 Defined order of positions in addons form 2017-10-27 00:49:56 +02:00
Raphael Michel
fe61e4f3e2 updatestyles should also update organizer styles 2017-10-27 00:49:56 +02:00
Raphael Michel
7916e81745 Fix incorrect test 2017-10-24 18:42:50 +02:00
Raphael Michel
4e6fb7799a Fix order retry issue 2017-10-24 18:35:57 +02:00
Raphael Michel
03dd0e530e Lock event during automatic waiting list assignment 2017-10-24 12:48:38 +02:00
Raphael Michel
cb6f6247fd Marking orders as paid now ignores waiting list 2017-10-24 12:48:38 +02:00
Raphael Michel
c33fc7630e Conformity with latest flake8 version 2017-10-24 12:48:38 +02:00
domke
2910160af9 Change of wording of log display (#649)
* Changed the wording for some order history items

* Harmonized use of the words 'changed' and modified' for log displayy
2017-10-23 09:02:31 +02:00
Sean Perkins
3b2247de39 Fix #643 -- Language in history text (#644) 2017-10-19 23:46:41 +02:00
Tobias Kunze
60212dcbcc Do not log unchanged email addresses (#646) 2017-10-19 22:03:12 +02:00
Raphael Michel
1b8b12cbc3 Fix test_event_custom_domain_cache_clear 2017-10-18 14:28:49 +02:00
Raphael Michel
e57ab7f030 Allow filtering by payment provider in order search 2017-10-18 13:53:11 +02:00
Raphael Michel
2f13fa79ba Update translation 2017-10-18 13:15:55 +02:00
Raphael Michel
c616c8ce29 Show paid tickets instead of available quota in event list 2017-10-18 13:05:25 +02:00
Raphael Michel
0f2b56adb4 Cache quotas on frontpage shortly under very high load 2017-10-18 10:27:57 +02:00
Raphael Michel
a2ba0f8b9f Implement NamespacedCache.get_or_set, reduce default caching time 2017-10-18 10:27:57 +02:00
Raphael Michel
c6a7b52e34 Reduce number of redundant SQL queries 2017-10-18 10:27:57 +02:00
Raphael Michel
64b67e5396 Reduce number of calls to domain cache 2017-10-18 10:27:57 +02:00
Raphael Michel
ab2084692d Cache organizer instance by domain 2017-10-18 10:27:57 +02:00
Raphael Michel
03133dc1fd Cache access to cache object 2017-10-18 10:27:57 +02:00
Raphael Michel
7e1e259897 Fix wrong field selection in new query 2017-10-17 13:13:37 +02:00
Raphael Michel
6720c0e993 Show assigned products in list of questions 2017-10-17 11:41:29 +02:00
Raphael Michel
53bb2b2945 Use scrolling multiple choice widget in more places 2017-10-17 11:40:17 +02:00
Raphael Michel
a2c5ce5ebc Hand-optimize some queries 2017-10-16 18:03:20 +02:00
Raphael Michel
b4928f662a Add frontend support for long multiple choice widgets 2017-10-13 15:57:42 +02:00
Raphael Michel
b9b509ad9b Fix typo in translation 2017-10-13 15:57:23 +02:00
Raphael Michel
d93ad8044a Add method User.get_events_with_permission 2017-10-13 15:56:40 +02:00
Raphael Michel
9d14e8113f Remove duplicate model field 2017-10-13 15:56:18 +02:00
Raphael Michel
84d1d758c1 Re-add option to set user timezone 2017-10-13 15:55:58 +02:00
Raphael Michel
cbfd722c92 Fix #635 -- Visually indicate optional and required fields (#638) 2017-10-12 16:00:49 +02:00
Raphael Michel
be6496e569 API: Writeable methods for vouchers (#639) 2017-10-12 14:09:44 +02:00
Raphael Michel
de086a2b07 API: Fix test for deleting tax rules 2017-10-11 10:56:07 +02:00
Raphael Michel
3f8df0f036 Fix AttributeError in LogEntry 2017-10-11 09:50:01 +02:00
Raphael Michel
b2c49aa786 Fix incorrect MIME type in API docs 2017-10-11 00:11:36 +02:00
Raphael Michel
a0e7bd3996 API: Add write operations to taxrules resource 2017-10-11 00:09:53 +02:00
Raphael Michel
e06be9ee25 API: Writable serializer for LazyI18nString 2017-10-11 00:08:35 +02:00
Raphael Michel
07473f854e Add api_token field to log entries 2017-10-11 00:07:47 +02:00
Raphael Michel
f342e46f53 API: Require can_change_items for more endpoints 2017-10-10 22:58:32 +02:00
Raphael Michel
d3a287dcdf Add missing convenience imports 2017-10-10 19:19:49 +02:00
Raphael Michel
ce2101a8e1 Fix tests that suddenly broke 2017-10-10 18:34:54 +02:00
Raphael Michel
2d456a6dc4 Fix confusing connection between date and time pickers 2017-10-10 18:10:50 +02:00
Raphael Michel
a3e0e14cef Do not count waiting list when creating blocking vouchers 2017-10-10 12:47:06 +02:00
Raphael Michel
bbade75061 Add option to ignore quota when extending expired orders 2017-10-10 12:40:18 +02:00
Raphael Michel
645e82fb04 Fix display of wrong email address in order confirmation 2017-10-09 16:39:13 +02:00
Raphael Michel
3245b05c5f Add todo note for code removal 2017-10-07 20:47:39 +02:00
Raphael Michel
61ef81832d Bump version to 1.9.0.dev0 2017-10-07 20:39:12 +02:00
Raphael Michel
7dea6fc1b7 Bump version number 2017-10-07 20:38:12 +02:00
Raphael Michel
bd306e9400 Best-effort backwards compatibility of isolated cart IDs 2017-10-07 20:37:12 +02:00
Raphael Michel
3e686211e1 Update translations 2017-10-07 18:42:02 +02:00
Raphael Michel
6d1b4b0a39 Re-order travis matrix for better productivity 2017-10-07 18:16:36 +02:00
Sanket Dasgupta
58938fc07c Fix #531 -- Make placeholders replace in subject (#594)
Placeholders in subject were not being replaced because there was
no `.format()` called on the subject.

This commit creates a context dict that is used for both the body
and the subject. It is then replaced using `.format_map()`

Fixes https://github.com/pretix/pretix/issues/531
2017-10-07 18:16:13 +02:00
Raphael Michel
96dd4e02f3 Add tests for style generation and propagated settings 2017-10-07 18:13:06 +02:00
Raphael Michel
411c537438 UI for settings propagation 2017-10-07 18:13:06 +02:00
Raphael Michel
bbd112280a Propagate setting and add organizer display settings page 2017-10-07 18:13:06 +02:00
Marvin Sipp
28d074366e added organizer color field 2017-10-07 18:13:06 +02:00
Haroon Sheikh
11d76656de Fix #538 -- Remove pyvenv from docs (#633) 2017-10-07 16:50:14 +02:00
Raphael Michel
1c96bc31d5 Re-calculate quotas for all events with recent logs 2017-10-06 11:43:08 +02:00
Raphael Michel
0030064f55 Form UX: Better label in sendmail form 2017-10-06 11:23:21 +02:00
Raphael Michel
4726f5c136 Fix i18n for confirm_text 2017-10-06 11:14:42 +02:00
Raphael Michel
c7fafedc51 Checkout UX: Pre-select payment provider if there is only one 2017-10-06 11:08:00 +02:00
Raphael Michel
3eeb70ae36 Form UX: Add more helpful placeholders 2017-10-06 11:05:24 +02:00
Raphael Michel
29b1a3dca3 Do not send navigation singals for authentication pages 2017-10-06 10:35:24 +02:00
Raphael Michel
caf844b5fb Fix wrong signal name in documentation 2017-10-05 11:55:09 +02:00
Raphael Michel
6b7bdf8c4f Item creation UX: Clearer placeholders, defaults 2017-10-05 10:47:46 +02:00
Raphael Michel
aad433a3bc Welcome wizard UX: Use primary color for button 2017-10-05 10:32:14 +02:00
Raphael Michel
3f1bb56826 Event creation UX: Show clearer that the event is now created 2017-10-05 10:31:25 +02:00
Raphael Michel
b2b3add616 Form UX: Display units for more number inputs 2017-10-05 10:21:00 +02:00
Raphael Michel
2d484d4a8e Event creation UX: Label changes 2017-10-05 10:20:00 +02:00
Raphael Michel
2f252f19c9 Form UX: Use splitted date/time widgets 2017-10-05 10:17:17 +02:00
Raphael Michel
a27f372785 Event creation UX: Pre-choose organizer if there is only one 2017-10-05 08:01:22 +02:00
Raphael Michel
f074e642ec Display quotas in event list 2017-10-04 11:25:51 +02:00
Raphael Michel
217ed905d4 Contract columns in event list table 2017-10-04 10:12:46 +02:00
Raphael Michel
b920efc955 Add database cache for quotas 2017-10-04 09:45:37 +02:00
Raphael Michel
330fadbea9 Fix wrong execution order 2017-10-04 09:43:14 +02:00
Raphael Michel
50c595e3d6 Fix migration error (unique app configuragion keys) 2017-10-02 17:40:31 +02:00
Raphael Michel
26f258c6cf Isolate cart sessions 2017-10-02 17:00:35 +02:00
Raphael Michel
f15a72e59d Fix mail_text_download_reminder email preview 2017-10-02 15:44:32 +02:00
Raphael Michel
8accaae6b1 New signal: allow_ticket_download 2017-10-02 15:07:23 +02:00
Raphael Michel
d4259501af Remove legacy ordering code 2017-10-02 14:59:01 +02:00
Jakob Schnell
fd5d5ae98e Fix #628 -- Sorting of filtered order list (#631)
* fix sorting of filtered order list

fixes #628

* implement comments on pr
2017-10-02 14:55:02 +02:00
Raphael Michel
457901ff82 Fix flake8 error 2017-10-01 17:43:51 +02:00
Raphael Michel
e201be1c65 Clarify payment fee / shipping fee relation 2017-09-29 17:08:04 +02:00
Raphael Michel
acde14372d PDF editor: Change default text 2017-09-29 17:01:13 +02:00
Raphael Michel
79988a2325 New signal order_fee_type_name 2017-09-29 16:54:27 +02:00
Raphael Michel
784f6e703c CSP: Exclude PDF editor (just doesn't work in FF) 2017-09-28 18:44:12 +02:00
Raphael Michel
29b157f287 CSP: Add reporting endpoint 2017-09-28 18:43:45 +02:00
Raphael Michel
c030bd35ca Make PDF ticket cover more extensible 2017-09-27 18:32:50 +02:00
Raphael Michel
06fe076ce2 Add request argument to pretix.control.signals.order_info 2017-09-27 18:19:47 +02:00
Raphael Michel
ae6cba067c Fix issue created in 1f889be0 2017-09-27 14:40:15 +02:00
Raphael Michel
72ae19a95d Update translation 2017-09-27 13:24:03 +02:00
Raphael Michel
1f889be07a Refactor and add signal layout_text_variables 2017-09-27 13:15:18 +02:00
Raphael Michel
39061b659a PDF Editor: More extensible implementation 2017-09-26 13:05:51 +02:00
Raphael Michel
d38f29ac7c Add signal pretix.control.signals.order_info 2017-09-26 11:47:46 +02:00
Raphael Michel
1a8e67f4de Allow clicking on typeahead results 2017-09-25 22:03:25 +02:00
Raphael Michel
8265c302ad Fix missing required=False 2017-09-25 13:33:41 +02:00
Raphael Michel
110d7c6acf Allow to enter a custom text that needs to be confirmed during checkout 2017-09-25 12:48:31 +02:00
Tobias Kunze
244b767f8f Allow markdown rendering in transaction comments. (#621)
This commit allows transaction comments to display newlines and URLs in
a useful way, helping when additional data (such as a reference to a
ticket system or a longer discussion) is required.
This PR also prevents pretix from having to bring its own chat system ;)
2017-09-25 12:25:32 +03:00
Raphael Michel
f40950efc9 Adjust to newer sentry version 2017-09-25 10:46:47 +02:00
Raphael Michel
0e0534c273 Fix incorrect timezones on event dashboard 2017-09-25 10:25:22 +02:00
Raphael Michel
9b3ea3656f PDF Output: Prevent subsequent exception on permission errors 2017-09-25 10:22:09 +02:00
Raphael Michel
62b2a367ff PDF Output: Fix AttributeError with undefined used meta data 2017-09-25 10:20:46 +02:00
Raphael Michel
ab9dd32902 Add font-src to default CSP header 2017-09-25 10:19:36 +02:00
Raphael Michel
43fc498297 Prevent some pages from search indexing 2017-09-25 10:04:37 +02:00
Raphael Michel
ef3eee7873 ContactForm: Prevent TypeError during validation 2017-09-25 09:38:35 +02:00
Raphael Michel
9f0deea9dd Rich text: Do not rewrite mailto: URLs 2017-09-25 09:37:17 +02:00
Abhiraj Hinge
e3798600ed Fixed typo in Concepts.rst (#624) 2017-09-14 16:16:56 +03:00
Raphael Michel
00834cd5e0 Fix test_checkoutflow 2017-09-13 18:29:08 +02:00
Raphael Michel
ed35c4f74e Add new signal logentry_object_link 2017-09-13 17:36:13 +02:00
Raphael Michel
9cd3e2d494 Require payment even if total consists only of fees 2017-09-13 16:42:00 +02:00
Raphael Michel
3345f48986 nav_event_settings should be an EventPluginSignal 2017-09-13 16:21:14 +02:00
Raphael Michel
b611d63975 ModelRelativeDateTimeField: Deal with None values 2017-09-13 16:20:54 +02:00
Raphael Michel
fb3866aa1a Fix TypError in PDF preview 2017-09-13 14:59:19 +02:00
Raphael Michel
a9f131b645 Make PDF download more prominent 2017-09-12 19:06:02 +02:00
Raphael Michel
e5728662c5 Allow to extend expired order even if waiting list entries exist 2017-09-12 18:50:13 +02:00
Raphael Michel
94a97fb0fd Fix broken toggling script 2017-09-09 11:09:03 +02:00
Raphael Michel
b5bea6fe7a Do not disable core modules' URLs 2017-09-08 17:50:50 +02:00
Raphael Michel
fb9d677d76 CSP: Allow blob: URLs for images in PDFs 2017-09-07 23:29:21 +02:00
Raphael Michel
7c4fc7bd0d New signals: fee_calculation_for_cart, order_fee_calculation 2017-09-07 18:59:21 +02:00
Raphael Michel
de992cecf3 New signal checkout_confirm_page_content 2017-09-07 18:15:36 +02:00
Raphael Michel
cd94549606 Fix export of answered files with binary content 2017-09-07 12:38:39 +02:00
Raphael Michel
214a6eb5ce Database field for RelativeDateTime 2017-09-06 11:25:12 +02:00
Raphael Michel
db5f0aa02d Fix #156 -- Plug-in settings navigation hook 2017-09-06 09:31:33 +02:00
Raphael Michel
ba48ab3659 Re-do squashed migration 2017-09-05 15:34:40 +02:00
Raphael Michel
d1538e07d3 Bump version 2017-09-05 12:47:10 +02:00
Raphael Michel
fe0c033b2d Bump version 2017-09-05 12:46:08 +02:00
Raphael Michel
2e58dca048 Order overview: Deterministic ordering of fees 2017-09-05 12:45:25 +02:00
Raphael Michel
d38ab8a439 Correctly set OrderFee type for new orders 2017-09-05 12:32:39 +02:00
Raphael Michel
acd7b9ba8c Squash migrations 2017-09-05 12:32:20 +02:00
Raphael Michel
56f72b225c Improve pretixdroid UI 2017-09-05 12:10:33 +02:00
Raphael Michel
8bfaf7425a Update translation 2017-09-05 11:48:01 +02:00
Raphael Michel
77a8726a03 Fix #615 -- Incorrect defaults for email texts 2017-09-05 11:46:33 +02:00
luto
119fea3379 Fix #619 -- Check format of stripe API keys in settings (#620)
* stripe tests: add settings URL to fixture, as it will be needed later

* Fix #619 -- Stripe: add basic validation for secret and publishable keys
2017-09-05 10:26:03 +03:00
Raphael Michel
e54e0d6511 New concept for fee handling (#610)
* New concept for fee handling

* More usages

* Remove all usages, make all tests pass

* API changes

* Small fixes

* Fix order of invoice lines

* Rebase migration
2017-09-05 10:11:26 +03:00
Raphael Michel
a2a88cfafa Fix tests after meta-data merge 2017-09-04 22:09:30 +02:00
Raphael Michel
5ff53d08ed Fix #586 -- Fix folded subnavigation in order detail view 2017-09-04 21:13:54 +02:00
Raphael Michel
0ddda4a668 Fix #617 -- Purge ticket cache after ticket settings/layout changes 2017-09-04 21:09:08 +02:00
Raphael Michel
d3a76e9f2f Fix #614 -- Warning message if ticket output is active but no provider 2017-09-04 21:03:17 +02:00
Raphael Michel
ea7ec2b5fc Fix #585 -- Creating invoices for refunded orders 2017-09-04 20:36:19 +02:00
Raphael Michel
b9b4ccb180 Change order of user docs pages 2017-09-04 20:13:38 +02:00
Raphael Michel
2f15d410fe Add optional timeouts for backend sessions 2017-09-04 19:50:32 +02:00
Raphael Michel
88f5af3e77 Add event meta-data 2017-09-04 19:50:32 +02:00
Martin Gross
454ca27c54 Fix #613 -- Minor typo in last change date (#616)
* Fix #556 - Max. redemptions instead of amount of vouchers

* Update Translation for Dashboard-Tile

* Fix #613 - Minor typo in last change date
2017-09-04 10:42:21 +03:00
Raphael Michel
f536cb3536 Fix grammar error 2017-08-30 18:30:59 +02:00
Raphael Michel
e6ba7379eb Display free tickets as "FREE" instead of "0.00" 2017-08-30 18:24:25 +02:00
Raphael Michel
f6b01b6e02 Improve margin arount product picture 2017-08-30 18:24:25 +02:00
Raphael Michel
ce27f8e89c Fix product list in template 2017-08-30 18:24:25 +02:00
Raphael Michel
a52635f940 Fix typo 2017-08-30 18:24:25 +02:00
Martin Gross
b608125545 Fix Dashboard-Tile Translation (number of orders) (#612)
* Fix #556 - Max. redemptions instead of amount of vouchers

* Update Translation for Dashboard-Tile
2017-08-30 15:47:03 +03:00
Raphael Michel
631cded0d6 New pretixdroid configuration system 2017-08-29 23:19:02 +02:00
Raphael Michel
43b5140754 New handling of plugin URLs (#609) 2017-08-29 10:01:50 +03:00
Raphael Michel
557a05135e Allow connect-src to media domain 2017-08-28 09:19:42 +02:00
Tobias Kunze
618416d0d2 Update translation, closes #604 (#608) 2017-08-27 10:45:13 +03:00
Tobias Preuss
9a4ee3db69 Improve reading flow. (#603) 2017-08-27 10:41:55 +03:00
Raphael Michel
999dde3fa4 Fix exception in pretixdroid API 2017-08-25 16:32:12 +02:00
Raphael Michel
1171cce550 Predictable order of question forms 2017-08-25 16:23:16 +02:00
Raphael Michel
77e13338ad Fix inconsistencies in pretixdroid API views 2017-08-25 16:22:53 +02:00
Raphael Michel
fd35b5ea72 Add "attention" flag to products 2017-08-25 15:14:54 +02:00
Raphael Michel
f98f25fb6b Improve MT940 import 2017-08-25 14:51:25 +02:00
Raphael Michel
511a49041f Add item and variation ID to pretixdroid API 2017-08-25 13:01:05 +02:00
Raphael Michel
74be5cfe96 Fix test (again) 2017-08-24 21:31:27 +02:00
Raphael Michel
1f54b36ece Fix failing test of calendar page 2017-08-24 19:32:12 +02:00
Raphael Michel
d12b77b572 Remove unneeded space 2017-08-24 18:32:31 +02:00
Raphael Michel
4928234785 Banktransfer: Allow mt940 files to have the .sta extension 2017-08-24 18:13:26 +02:00
Raphael Michel
208e3c9933 Update translation 2017-08-24 18:11:47 +02:00
Raphael Michel
d697381d8b List and calendar for all organizers 2017-08-24 17:13:22 +02:00
Raphael Michel
cd6b1a2327 Allow subevent filtering in dashboard 2017-08-24 16:12:50 +02:00
Raphael Michel
ff21380099 Improve typeahead on dashboard page 2017-08-24 14:21:30 +02:00
Raphael Michel
a773531003 Statistics: Add subevent selection 2017-08-24 12:53:59 +02:00
Raphael Michel
23ecd43885 Better dashboard layout 2017-08-24 12:36:48 +02:00
Raphael Michel
3415bf5cd3 Event list: Correct handling of event series 2017-08-24 10:44:22 +02:00
Raphael Michel
45b9f1190f Case insensitivity when validating repreated email addresses 2017-08-24 10:19:11 +02:00
Raphael Michel
ef1b09671a pretixdroid: Let attendee_name fall back to invoice address name 2017-08-24 10:17:32 +02:00
Raphael Michel
ee282af53e Add invoice address fields to ticket PDF editor 2017-08-24 09:53:31 +02:00
Raphael Michel
455a95d46c Add column ordering to more lists 2017-08-24 09:36:24 +02:00
Raphael Michel
76666b0d22 Update and fix trove classifiers 2017-08-23 17:47:13 +02:00
Raphael Michel
45fd43682a Docs: Add missing RST file 2017-08-23 15:13:20 +02:00
Raphael Michel
fd801e3323 Delete cache in migration 2017-08-23 15:09:47 +02:00
Raphael Michel
429c6ebb1b Fix TaxRule.__str__ 2017-08-23 15:07:01 +02:00
Raphael Michel
ea2f24fe23 Fix problem in migration 2017-08-23 14:49:08 +02:00
Raphael Michel
db4a2cfaac Docs: Add missing screenshots 2017-08-23 14:22:08 +02:00
Raphael Michel
583223f454 Update translation 2017-08-23 14:21:47 +02:00
Raphael Michel
f9fcc16f54 Do not rely on CSP nonce support (breaks safari) 2017-08-23 13:36:35 +02:00
Raphael Michel
50ca6ee63d Support custom fonts 2017-08-23 13:35:47 +02:00
Raphael Michel
56338be13e Tax rules and reverse charge (#559)
Tax rules and reverse charge
2017-08-23 13:13:16 +03:00
Raphael Michel
b9ec5ea83c Documentation on event creation 2017-08-23 10:15:51 +02:00
Raphael Michel
389585c47a Fix translation errors 2017-08-22 12:35:39 +02:00
Raphael Michel
e9583087eb Fix logic of multi downloads 2017-08-22 10:55:32 +02:00
Raphael Michel
57e2090d70 Fix date display in event list 2017-08-22 10:10:10 +02:00
Raphael Michel
5fbf26b8cb Make additional font styles optional 2017-08-22 10:09:46 +02:00
Raphael Michel
447c728557 [SECURITY] Rewrite all links in rich texts 2017-08-21 15:14:45 +02:00
Raphael Michel
a3ca4c81ae [SECURITY] Fix XSS vulnerability in typeahead.js 2017-08-21 15:14:45 +02:00
Raphael Michel
fb398a5520 [SECURITY] Fix XSS vulnerability in Lightbox caption 2017-08-21 15:14:45 +02:00
Raphael Michel
9a9bb92f91 [SECURITY] Support custom media URLs in CSP middleware 2017-08-21 15:14:45 +02:00
Raphael Michel
e23a5c24d6 [SECURITY] Add warning for download of unsafe files 2017-08-21 15:14:45 +02:00
Raphael Michel
1a42a54d98 [SECURITY] Tokens for downloading answer attachments 2017-08-21 15:14:45 +02:00
Raphael Michel
5c91352bae [SECURITY] Do not allow SVG files for logos 2017-08-21 15:14:45 +02:00
Raphael Michel
3428ea2f18 [SECURITY] Fix XSS injection vulnerabilities in question answers, event, quota and product names 2017-08-21 15:14:45 +02:00
Raphael Michel
24e5d337a6 [SECURITY] Update to morris.js master to fix a XSS vulnerability 2017-08-21 15:14:44 +02:00
Raphael Michel
a2c1413036 [SECURITY] Use defusedcsv for exports 2017-08-21 15:14:44 +02:00
Tobias Kunze
bab092f04b Do not override the Reply-To header (#597) 2017-08-20 13:50:48 +03:00
Tobias Kunze
2bf4e6c5c6 Fix import of celery app in documentation (#596) 2017-08-20 12:41:37 +03:00
Raphael Michel
584add97a3 Fix counting bug for global order search 2017-08-11 12:42:47 +02:00
Raphael Michel
57143a434e Add new signal voucher_form_validation 2017-08-10 17:06:16 +02:00
Raphael Michel
e31bd7600c Add bcc to mail_send 2017-08-09 16:22:14 +02:00
Raphael Michel
f02ec8b24b Improve Stripe.js loading 2017-08-09 13:56:52 +02:00
Raphael Michel
b8704f980f Only validate form of the selected payment 2017-08-09 13:56:52 +02:00
Raphael Michel
3accf74687 Fix KeyError in form submission 2017-08-09 13:56:52 +02:00
Tobias Kunze
a213ca746c Only mention an order in the mail if one is associated (#592) 2017-08-09 10:42:52 +02:00
Raphael Michel
349e306d38 Fix #576 yet again 2017-08-08 23:08:34 +02:00
Raphael Michel
ca1b1032eb Allow mails without HTML 2017-08-08 22:28:27 +02:00
Raphael Michel
a6c9fb0f8b Fix #576 again 2017-08-08 22:24:53 +02:00
Raphael Michel
c8230c55ee Update translation 2017-08-08 21:06:54 +02:00
Raphael Michel
55f77613d4 Fix #576 -- linebreaks in bank details in HTML mails 2017-08-08 20:37:01 +02:00
Raphael Michel
c9a1ff45c7 Fix import order 2017-08-07 19:31:20 +02:00
Raphael Michel
c209f66d49 Fix #590 -- Combined Ticket-PDFs are not invalidated when rotating secrets 2017-08-07 18:34:04 +02:00
Raphael Michel
3efa02eb81 Fixes to the download reminder 2017-08-07 17:10:04 +02:00
Raphael Michel
8506f66236 Show if team members have 2FA enabled 2017-08-07 16:15:32 +02:00
Sanket Dasgupta
cb2826f171 Fix #293 -- Add ticket downloading reminder (#567)
Closes https://github.com/pretix/pretix/issues/293
2017-08-07 16:15:27 +02:00
Raphael Michel
0990c9cc3d Fix AttributeError in voucher creation 2017-08-07 14:12:16 +02:00
Raphael Michel
4aa9594a61 Fix voucher redemption problem with subevents 2017-08-07 14:09:12 +02:00
Raphael Michel
ed208cf433 Optimize OrderFilterForm query 2017-08-07 14:04:16 +02:00
Raphael Michel
428faeb756 Add a minimal length for voucher codes 2017-08-07 12:11:48 +02:00
Raphael Michel
e858edd85c Do not allow vouchers to create negative prices 2017-08-07 12:11:48 +02:00
Raphael Michel
e4ab27a292 Fix missing file 2017-08-01 21:02:15 +02:00
Raphael Michel
eece5793d6 Fix travis after bbed8e5f 2017-08-01 20:43:28 +02:00
Nicole Klünder
3df737a94f fix missing space in german translation (#587) 2017-08-01 20:39:39 +02:00
Nicole Klünder
0e4c414c2e fix wrong stripe version in setup.py (#588) 2017-08-01 20:39:25 +02:00
Raphael Michel
326304db54 Fix #583 -- Wrongly documented option 2017-07-31 23:00:48 +02:00
Raphael Michel
c8e54524a3 Only use SQLite config during tests if it exists 2017-07-31 21:36:46 +02:00
Raphael Michel
d671060a47 Add sphinxcontrib-images to doc dependencies 2017-07-31 21:14:00 +02:00
Raphael Michel
93dab76da2 Complete docs page 2017-07-31 21:12:30 +02:00
Nicole Klünder
bbed8e5fae throw exception if PRETIX_CONFIG_FILE can not be opened (#581)
If the environment variable PRETIX_CONFIG_FILE is set but the file can not be read because it does not exists or permission is denied, pretix just runs with default settings. When setting up a new installation this can be confusing and difficult to debug.

I think it is safe to assume that someone who sets PRETIX_CONFIG_FILE aims to point it at a readable file, so raising with a more understandable exception is expected or at least helpful. Otherwise, the user will usually get a DisallowedHost exception because the [pretix]url config variable is not set which is not as helpful.
2017-07-31 18:33:16 +02:00
Raphael Michel
e16f8fc7e9 Add some user documentation 2017-07-31 18:31:20 +02:00
Raphael Michel
86f17094bb Hide quota options when creating a product with variations 2017-07-31 13:52:50 +02:00
Raphael Michel
b1b49758b1 Fix reversal bug 2017-07-31 12:54:57 +02:00
Raphael Michel
4790665759 bump version 2017-07-31 12:54:57 +02:00
Tobias Kunze
8ede492cba Add optional help_text to Question objects. Closes #574. (#579) 2017-07-31 10:54:57 +02:00
Raphael Michel
5f607cc034 Bump version 2017-07-30 20:36:45 +02:00
Raphael Michel
3b9f508be9 Create squash migration 2017-07-30 20:11:23 +02:00
Raphael Michel
89e381b7ea Update translations 2017-07-30 19:44:11 +02:00
Tobias Kunze
57869b2145 Wording fixes (#577) 2017-07-30 19:29:17 +02:00
Raphael Michel
46976900d7 Add documentation on mail methods 2017-07-27 15:47:22 +02:00
Raphael Michel
a1535da117 Subevent creation: Layout issue 2017-07-27 15:18:25 +02:00
Raphael Michel
f43d782b5c Hide quota options during product creation for event series 2017-07-27 15:14:28 +02:00
Daniel
5c443e2f93 Ref #569 -- Include other email to history (#570)
Log all other order-specified emails and include them into
email history.
2017-07-27 15:09:06 +02:00
Raphael Michel
54f01f63f7 Update translation 2017-07-27 11:53:14 +02:00
Raphael Michel
c64b4473e4 Add organizer_info_text 2017-07-27 11:43:35 +02:00
Raphael Michel
d413a37c1f Translation improvements 2017-07-27 11:21:28 +02:00
Raphael Michel
202fb12008 Order payment providers by name 2017-07-27 11:17:29 +02:00
Raphael Michel
59dea63870 Add product description to ticket editor 2017-07-27 10:13:55 +02:00
Raphael Michel
9a18f2b553 Small JS improvements 2017-07-26 13:41:53 +02:00
Clint
4293ec3805 Fix #475 -- add to existing quota / add new quota from product form (#562)
* added fields and logic for adding quota in creation of product

* added section for selecting quota option

* logic for hiding quota selections when needed

* fixed logic for quota selection

* formatting, removed print statements

* styling

* tests for adding quotas in product form

* cleaned up

* added divs

* reworked to include translatable text, readable values for quota options

* quota_add_existing form assignment to str(q.pk)

* made changes for radio buttons, added in sliding animation

* moved string constants for quota options, changed quota options to RadioSelect from Select
2017-07-26 13:41:23 +02:00
Raphael Michel
f3b616e495 Add exporter to output all tickets 2017-07-26 13:18:35 +02:00
Raphael Michel
003ea24990 Fix Stripe test 2017-07-25 16:52:37 +02:00
Raphael Michel
92d4566a54 Make stripe refund call optional, add request parameter to order_control_refund_render 2017-07-25 16:11:42 +02:00
Raphael Michel
70a933edc1 Hide min_per_order=1 2017-07-24 09:54:33 +02:00
Raphael Michel
d2d77f28aa Fix wrongly displayed download buttons 2017-07-24 09:14:54 +02:00
Raphael Michel
39179971c5 Fix stripe tests 2017-07-23 13:33:43 +02:00
Raphael Michel
c06f36e8c2 Do not render time before JS locale file is loaded 2017-07-23 13:06:07 +02:00
Raphael Michel
1d2d9d8b99 PayPal: Event-independent webhooks 2017-07-23 12:38:41 +02:00
Raphael Michel
5f529817ef Stripe: Event-independent webhooks 2017-07-23 12:22:48 +02:00
Raphael Michel
7c91bc2f37 Respect primary browser language 2017-07-20 11:31:34 +02:00
Raphael Michel
ef022f5a6d Add new dependencies to setup.py 2017-07-19 17:42:07 +02:00
Raphael Michel
54ce00c8b9 Update translation 2017-07-19 14:17:23 +02:00
Raphael Michel
baabbfb1ea Check for required invoice information in other steps 2017-07-19 14:10:04 +02:00
Raphael Michel
28e676ac9a Allow to only require the name in the invoice address 2017-07-19 14:07:18 +02:00
Raphael Michel
21fac9ec7a Auto-toggle form fields for business/individual customers 2017-07-19 12:26:50 +02:00
Raphael Michel
335955820b Fix a counting bug 2017-07-19 12:10:35 +02:00
Raphael Michel
d2b0e7209f Use a choice field for invoice address countries 2017-07-19 12:08:18 +02:00
Johan von Forstner
f8ed21c819 Fix #130 -- Mark required question fields at checkout (#564)
* Fix #130: Mark required question fields at checkout

* Add legend
2017-07-19 11:02:07 +02:00
Tobias Kunze
9c2143effe Clarify mail subject prefix. (#520) 2017-07-19 10:42:34 +02:00
Raphael Michel
8a3fa6aff6 Show category descriptions if redeeming a voucher 2017-07-18 16:47:18 +02:00
Daniel
7e304bb231 Fix #565 -- OrderList ordering request handling (#566)
Fix missed out ordering get request handling.
2017-07-18 16:16:51 +02:00
Raphael Michel
99d614289e Link order from change pages, compat for old logs 2017-07-18 11:46:21 +02:00
Daniel
b90894c20f Fix #543 -- Allow send mail from order (#550)
- Add send email directly for order
- Add email history (from mass and custom) to each specific order
2017-07-18 11:45:30 +02:00
Johan von Forstner
921834c917 Fix os.chown call on Windows (#563) 2017-07-18 11:42:30 +02:00
Raphael Michel
83df4451e6 Fix #491 -- Search order by invoice number 2017-07-18 11:14:51 +02:00
Raphael Michel
2ad9e1bb43 Change API to accomodate for invoice numbers 2017-07-18 10:37:32 +02:00
Raphael Michel
c9990e5ca4 Update translation 2017-07-18 10:04:24 +02:00
Raphael Michel
c95e61db09 Add new external plugins to list 2017-07-17 23:32:41 +02:00
Raphael Michel
7bb12ff0ec Configurable invoice prefixes 2017-07-17 23:03:20 +02:00
Raphael Michel
670bfa18de Slug widget 2017-07-17 20:54:39 +02:00
Raphael Michel
130f619b05 Fix raven integration 2017-07-17 20:29:56 +02:00
Raphael Michel
f900c842cb Improve "copy from above" 2017-07-17 16:12:33 +02:00
Tobias Kunze
c2844a8f35 Add custom_header block to <head> (#561) 2017-07-17 14:52:20 +02:00
Raphael Michel
a864dabbaf Refs #552 -- Expand all panels that contain validation errors 2017-07-17 12:49:45 +02:00
Daniel
02786f4801 Fix #552 -- Add icon to expansible panels (#560)
* Ref #552 -- Add icon to expansible panels

Offer informative feedback to user by showing icons to indicate
expansible panels.

* Fix wrongly removed JavaScript line
2017-07-17 12:29:47 +02:00
Raphael Michel
5a4fe266c6 Fix usage of wrong settings key 2017-07-16 22:17:02 +02:00
Raphael Michel
b30a4db0b8 Update translation 2017-07-16 20:15:48 +02:00
Raphael Michel
2e76e07764 Show end date on front page 2017-07-16 20:11:59 +02:00
Raphael Michel
1be92f5078 Really fix 2050c0b7 issue 2017-07-16 19:37:18 +02:00
Raphael Michel
8afff29cd4 Make microdata XSS-safe and subevent-aware 2017-07-16 17:52:08 +02:00
Raphael Michel
9c6090a355 Fix translation sytax error 2017-07-16 17:49:31 +02:00
Joepriesto
27b73227ed Fix #30 -- Event microdata information (#546)
* Addition of all basics required for microdata

Microdata for event added to the head of the base event html template.

* Fixed flake8 errors & included settings checks

Fixed the flake8 too many blank line errors and changed the date and time section to refer to settings before including the time and/or the date_to.

* Typo in last commit

Fixed typo in last commit

* Fixed bracket mistake and flake8 error

Fixed tab between { and % in template tag. Removed extra lines. Removed unnecessary str() call.
Corrected binary & to [and] operator.

* Added testing for microdata

Testing added to the presale.test_event tests to cover the 4 branches and basic microdata functionality.
2017-07-16 17:42:46 +02:00
Raphael Michel
9582f8380f Fix translation syntax 2017-07-16 17:31:35 +02:00
Raphael Michel
bfeac7e70b Fix bogus translation 2017-07-16 17:21:07 +02:00
Raphael Michel
2050c0b7a8 Fix TypeError 2017-07-16 17:05:46 +02:00
Raphael Michel
144f9bed69 Fix URL in iCal test 2017-07-15 16:38:14 +02:00
Raphael Michel
f2b642d944 Fix iCal URL 2017-07-14 18:26:18 +02:00
Raphael Michel
bcdc75953e Add SubEvent.frontpage_text 2017-07-14 18:14:24 +02:00
Raphael Michel
1fabe5a7cf Disable button "add to cart" with no selection 2017-07-14 18:10:49 +02:00
Raphael Michel
fe9a4b7aa3 Allow word wrapping inside .dl-horizontal dt 2017-07-14 18:10:18 +02:00
Raphael Michel
56735dc1c6 Make PDF ticket output subevent-compatible 2017-07-14 18:09:48 +02:00
Raphael Michel
42287b92f1 Allow ticket output methods to opt-out from ZIP generation 2017-07-14 17:32:16 +02:00
Raphael Michel
7d9e642f24 Useful default date for admission field 2017-07-14 17:21:41 +02:00
Raphael Michel
b20e10585f Include Event.is_public in Event.copy_data_from 2017-07-14 17:11:52 +02:00
Raphael Michel
8438b211a6 Fix iCal test failing due to new UID format 2017-07-14 14:55:08 +02:00
Raphael Michel
f94314afec Generate organizer-level iCal files 2017-07-14 14:25:05 +02:00
Martin Gross
4584d23434 Fix #556 - Max. redemptions instead of amount of vouchers (#558) 2017-07-14 12:11:34 +02:00
Raphael Michel
2791501781 Fix #557 -- Drop unused CSS file 2017-07-14 12:11:20 +02:00
Raphael Michel
6ea798e55b Allow to exclude free products from invoices 2017-07-14 12:11:20 +02:00
Martin Gross
0ab6ac569e Fix #553 -- Order by position first in order_overview (#554) 2017-07-14 10:22:26 +02:00
Raphael Michel
f91d7352a4 Fix AttributeError in test 2017-07-13 22:04:34 +02:00
Raphael Michel
d644b8fe01 Fix detection of core modules after ae910eb7 2017-07-13 20:33:08 +02:00
Raphael Michel
5a8042cc10 Fix relative dates in payment method availability field 2017-07-13 17:37:07 +02:00
Raphael Michel
ae910eb731 Fix EventPluginSignal to recognize Django apps with custom app labels 2017-07-12 19:14:28 +02:00
Raphael Michel
c1158c3175 Allow to mark add-ons as "included" in price 2017-07-12 18:42:09 +02:00
Raphael Michel
79562e7ad9 Add logdisplay for charge.pending 2017-07-12 18:02:56 +02:00
Raphael Michel
e3388bea96 Fix Stripe webhooks 2017-07-12 17:37:05 +02:00
Daniel
a3b4a7ef1d Fix #516 -- Prevent gaps in plugin list (#551)
Use flexbox to fix misalignment when column height is imbalanced.
2017-07-12 17:30:01 +02:00
Raphael Michel
947b06cd61 Update translation 2017-07-12 17:20:09 +02:00
Raphael Michel
a3f3561f02 Fix import in stripe tests 2017-07-12 16:56:01 +02:00
Raphael Michel
48095d38be Fix #407 -- Integrate more Stripe payment methods 2017-07-12 16:42:44 +02:00
Raphael Michel
1c6858653a Avoid relative URLs in stripe plugin 2017-07-11 22:53:15 +02:00
Raphael Michel
648797325e Allow to copy across events with and w/o subevents 2017-07-11 22:45:41 +02:00
Raphael Michel
af3fa88d67 Typos and translation 2017-07-11 18:47:39 +02:00
Raphael Michel
8123effa65 Add sub-events and relative date settings (#503)
* Data model

* little crud

* SubEventItemForm etc

* Drop SubEventItem.active, quota editor

* Fix failing tests

* First frontend stuff

* Addons form stuff

* Quota calculation

* net price display on EventIndex

* Add tests, solve some bugs

* Correct quota selection in more places, consolidate pricing logic

* Fix failing quota tests

* Fix TypeError

* Add tests for checkout

* Fixed a bug in QuotaForm

* Prevent immutable cart if a quota was removed from an item

* Add tests for pricing

* Handle waiting list

* Filter in check-in list

* Fixed import lost in rebase

* Fix waiting list widget

* Voucher management

* Voucher redemption

* Fix broken tests

* Add subevents to OrderChangeManager

* Create a subevent during event creation

* Fix bulk voucher creation

* Introduce subevent.active

* Copy from for subevents

* Show active in list

* ICal download for subevents

* Check start and end of presale

* Failing tests / show cart logic

* Test

* Rebase migrations

* REST API integration of sub-events

* Integrate quota calculation into the traditional quota form

* Make subevent argument to add_position optional

* Log-display foo

* pretixdroid and subevents

* Filter by subevent

* Add more tests

* Some mor tests

* Rebase fixes

* More tests

* Relative dates

* Restrict selection in relative datetime widgets

* Filter subevent list

* Re-label has_subevents

* Rebase fixes, subevents in calendar view

* Performance and caching issues

* Refactor calendar templates

* Permission tests

* Calendar fixes and month selection

* subevent selection

* Rename subevents to dates

* Add tests for calendar views
2017-07-11 13:56:00 +02:00
Raphael Michel
554800c06f Add 3DS support to Stripe plugin 2017-07-10 21:36:59 +02:00
Raphael Michel
687ce29366 Fix #547 -- Switch to Stripe Elements 2017-07-10 20:00:03 +02:00
Raphael Michel
c70301572c Fix bug in invoice rendering 2017-07-10 14:43:37 +02:00
Raphael Michel
714f58e2c5 Update translation 2017-07-10 14:29:53 +02:00
Raphael Michel
9bf9dca88a Invoice exporter: open in binary mode 2017-07-10 14:25:26 +02:00
Daniel
0663f25208 Fix #541 -- Allow delete waitinglist entries (#544)
Add new action "delete" for each waiting list entries
2017-07-09 15:19:30 +02:00
Raphael Michel
275d162b81 List of events: Optional calendar view 2017-07-08 22:50:48 +02:00
Raphael Michel
675956a7c4 Update translations 2017-07-07 11:37:09 +02:00
Raphael Michel
cf1602c0af Add short form to event list 2017-07-07 11:32:53 +02:00
Raphael Michel
35979ed332 Add internal comment to events 2017-07-07 11:31:33 +02:00
Raphael Michel
6e65ae5306 Swappable invoice renderers 2017-07-07 11:16:07 +02:00
Raphael Michel
95e716b8ce Improve help texts 2017-07-07 10:11:39 +02:00
Raphael Michel
554284ac67 Link new plugins 2017-07-06 18:07:03 +02:00
Raphael Michel
fa6102bbad Allow to override sender for mail 2017-07-06 18:06:07 +02:00
Raphael Michel
f28d5f19a7 Ignore spaces in bank transfer references 2017-07-06 17:39:32 +02:00
Raphael Michel
34d59c7741 Add "Go to shop" in mobile view 2017-07-06 17:36:01 +02:00
Raphael Michel
21d432a3ca Make cancel notifications optional 2017-07-06 12:04:35 +02:00
Daniel
d444935140 Fix #391 -- Send email on cancelled order (#540)
Send a notification email to user when
order is cancelled.
2017-07-06 11:59:48 +02:00
Raphael Michel
9de9d96e35 Do not expose "Deutsch (Du)" in name-local 2017-07-06 09:26:26 +02:00
Michele Fattoruso
5932558ca2 Fix #300 - Feature/remove flag as language (#542)
* don't use flags to indicate languages #300

* cleaned code

* removed the filter and moved the logic to context.py

* cleaned code

* show the text in the local language

* cleaned code

* changed loop for list comprehension

* fix indentation

* ordered import
2017-07-06 09:13:57 +02:00
Raphael Michel
7b22adb72e Allow to manually generate invoice if invoice mode is "on payment" 2017-07-05 13:34:07 +02:00
Raphael Michel
0db5d062be Add a file upload type to questions (#534)
* Initial stuff

* More features
2017-07-03 14:22:31 +02:00
Sanket Dasgupta
678d510e29 config.rst: Include environment variable in list of paths (#539)
Closes https://github.com/pretix/pretix/issues/528
2017-07-03 12:52:36 +02:00
Raphael Michel
1fc3307d22 Add signal question_form_fields 2017-07-02 19:45:26 +02:00
Raphael Michel
45c17ba949 Fix syntax error in setup.py 2017-07-02 18:57:55 +02:00
Raphael Michel
15bd1d9006 Fix missing dependencies in setup.py 2017-07-02 18:44:25 +02:00
Tydon K
b4715f0931 Fix #517 -- Changed navpills to navtabs in email template editor (#533)
* Changed navpills to navtabs in email template editor

* Issue 517 - Added border radius to email template tabs and removed excess bottom margin.
2017-07-02 17:51:41 +02:00
Raphael Michel
6f24a2a88c Fix import in unit test 2017-07-02 17:36:12 +02:00
Raphael Michel
fcbecf895a Bump version to 1.6.0.dev0 2017-07-02 17:32:02 +02:00
Raphael Michel
5abe8a109c Bump release to 1.5.0 2017-07-02 17:29:55 +02:00
Raphael Michel
ee6d0af795 Update translations 2017-07-02 17:26:32 +02:00
Raphael Michel
0dc82b6a28 Add answers to REST API 2017-07-02 16:34:55 +02:00
Raphael Michel
a530eda9fc Add CSRF_TRUSTED_ORIGINS to settings.py 2017-06-30 11:55:59 +02:00
Raphael Michel
3fa39798e5 Fix test failures 2017-06-29 18:03:16 +02:00
Raphael Michel
b7f8832633 Fix test_order_list 2017-06-29 12:11:20 +02:00
Raphael Michel
2add8d671a Unify all calls to register_payment_providers 2017-06-29 12:09:48 +02:00
Raphael Michel
d5d1fcf331 Add PaymentProvider.public_name 2017-06-29 11:44:27 +02:00
Raphael Michel
9007501d81 Collappse payment provider settings by default 2017-06-29 11:40:17 +02:00
Raphael Michel
fc12a8f549 Relabel button. 2017-06-28 18:57:50 +02:00
Raphael Michel
86f03b3399 Fix #532: Ticket editor, moving element groups 2017-06-28 18:55:33 +02:00
Raphael Michel
80ad0e7f68 PDF editor: share source code 2017-06-28 18:36:45 +02:00
Raphael Michel
ea970be6f2 Allow to generate random slugs 2017-06-28 18:20:06 +02:00
Raphael Michel
4bd0b96a2d Order list of events descending 2017-06-28 17:59:07 +02:00
Raphael Michel
c7f0436ec0 Filter list of events 2017-06-28 17:57:15 +02:00
Raphael Michel
ecc788fd79 Invoice name in order list 2017-06-28 17:37:53 +02:00
Raphael Michel
8ea9d5685d Use FilterForm for list of orders 2017-06-28 17:28:30 +02:00
Raphael Michel
c2bd2f0672 Add filters to the order search 2017-06-28 12:52:48 +02:00
Raphael Michel
424b7964b4 Move some links to their own templates 2017-06-27 18:22:27 +02:00
Raphael Michel
98394fdc63 Fix test failing on MySQL 2017-06-27 16:56:10 +02:00
Raphael Michel
625e90518e Add banktransfer API 2017-06-27 12:31:56 +02:00
Raphael Michel
d446191cf4 Organizer-level bank import 2017-06-27 12:31:45 +02:00
Raphael Michel
ea2557274f Show "create team" button to everyone who can 2017-06-27 08:58:54 +02:00
Raphael Michel
1bcca566ab Remove SVG from supported files for invoice generation 2017-06-26 19:15:13 +02:00
Raphael Michel
cf365635ef Correct pluralization for addon help texts 2017-06-26 17:29:39 +02:00
Raphael Michel
df6a93da5f Update translation 2017-06-26 17:08:52 +02:00
Raphael Michel
433512a256 Optionally ask for email addresses twice 2017-06-26 17:06:20 +02:00
Raphael Michel
e0fe78b82e Fix typocheck problem 2017-06-26 17:00:16 +02:00
Raphael Michel
d3a84690f2 Add QuotaListExporter 2017-06-26 16:50:16 +02:00
Raphael Michel
3df4b4dc57 Update translations 2017-06-22 16:24:29 +02:00
Raphael Michel
b2801f3a40 EU legislation note 2017-06-22 15:53:30 +02:00
Raphael Michel
e1bdfd7e4e Allow headlines with markdown 2017-06-22 15:53:30 +02:00
Tydon K
5584c12d0a Fixed typo in Helptext (#530) 2017-06-22 10:35:56 +02:00
Raphael Michel
91bd02157c Avoid word wrap inside event date 2017-06-21 15:44:42 +02:00
Raphael Michel
02d2b88a54 Extend validator blacklist 2017-06-19 17:47:13 +02:00
Raphael Michel
6ae5c5e6ce Fix tests failing after last commit 2017-06-19 16:17:08 +02:00
Raphael Michel
123d2f6120 Allow to add positions to an existing order 2017-06-19 15:22:57 +02:00
Raphael Michel
3ada10c3f4 Fix broken ReST markup 2017-06-19 13:58:45 +02:00
Raphael Michel
b21a928028 Add API endpoint for Quota.availability 2017-06-19 13:57:58 +02:00
Raphael Michel
374cf08086 Mention offending item in QuotaExceededException message 2017-06-19 13:23:37 +02:00
Raphael Michel
15a85bb873 Commit style docs 2017-06-19 12:02:12 +02:00
Raphael Michel
4b12678fa4 Various docs improvements 2017-06-19 12:01:00 +02:00
Raphael Michel
b2d4bea1d0 Refs #314 -- Read-only REST API (#513)
* initial commit

* API auth

* Hierarchical URLs

* Add session auth

* Strong hierarchy

* Add filters

* Add i18n fields, questions

* More viewsets and serializers

* Ticket download

* Add OrderPosition serializer

* View-level permissions

* More tests

* More tests

* Add basic API docs

* Add REST API to docs frontpage

* Tests for order endpoints

* Add invoice tests

* Voucher and waitinglist tests

* Doc draft

* order docs

* Docs on all viewsets

* Disable DRF docs, style sphinx, style browsable API

* Fix tests

* deprecated imports

* Test foo

* Attendee names

* Fix migration problems

* Remove browsable API, plugin integration

* Doc fixes
2017-06-19 11:16:04 +02:00
Tobias Kunze
6df3a7d4b5 Order vouchers by code by default (#525) 2017-06-18 18:31:54 +02:00
Raphael Michel
6964bf7c8a Revert accidental deletion of translations 2017-06-18 18:31:09 +02:00
Tobias Kunze
965424799d Highlight voucher nav element when in detail view (#524) 2017-06-18 18:31:02 +02:00
Tobias Kunze
f7de2ead40 Allow to pass prefix to generate_code, too (#523) 2017-06-18 18:30:38 +02:00
Tobias Kunze
260ba19e44 Typo fix and translation update (#519) 2017-06-18 18:22:57 +02:00
Raphael Michel
5caff5d28e Remove validation error on valid input 2017-06-16 23:21:49 +02:00
Tobias Kunze
8fa490c938 Allow to add a prefix when generating voucher codes (#518) 2017-06-16 23:21:23 +02:00
Raphael Michel
8e3cc0df0c Fix readthedocs CSS issue 2017-06-16 22:37:51 +02:00
Raphael Michel
1a5a4cf72d Fix sphinx-related problems 2017-06-16 22:29:19 +02:00
Raphael Michel
6c5b7bbed0 Custom docs front page 2017-06-16 22:16:45 +02:00
Raphael Michel
f9eee6a864 Add custom Sphinx theme 2017-06-16 22:16:45 +02:00
Raphael Michel
4ad0fe5653 Voucher form validation order 2017-06-12 12:50:06 +02:00
Raphael Michel
a02823ca38 Add global order search 2017-06-05 20:50:06 +02:00
Raphael Michel
513f8e66f5 Display full name in event typeahead 2017-06-05 19:37:40 +02:00
Raphael Michel
0cecc168b6 Autocompletion in event selection 2017-06-05 19:28:52 +02:00
Raphael Michel
6f7281b0f5 Add organizer domain 2017-06-05 18:07:18 +02:00
Raphael Michel
c7022bd285 Truncate name of current event 2017-06-05 17:51:21 +02:00
Raphael Michel
e89e3d2e1b Fix Go to shop button for non-live events with subdomain 2017-06-02 17:58:44 +02:00
noelroy
574fb6804f Fix #445 - Added go to shop button (#512) 2017-06-02 17:48:11 +02:00
AV-room
caf75fafdf Fix #454 -- Email field is now required on user settings page (#511) 2017-06-02 17:42:42 +02:00
Raphael Michel
bc74fb63d1 Base Dockerfile on python:3.6 2017-06-01 22:28:24 +02:00
Raphael Michel
b576a87d61 mark mimetypes as stdlib 2017-06-01 16:20:52 +02:00
Raphael Michel
6e81d8acec isort show diff 2017-06-01 15:44:11 +02:00
Raphael Michel
c67a53d156 Travis: Check style on 3.6 2017-06-01 14:54:52 +02:00
Raphael Michel
bf5ea81b40 Ignore style in tests, change import order 2017-06-01 13:28:11 +02:00
Raphael Michel
1261b8670f Bump version to 1.5.0.dev0 2017-06-01 13:00:37 +02:00
Raphael Michel
17dad33f8b Bump version to 1.4.0 2017-06-01 12:57:29 +02:00
Raphael Michel
1d5c160e1d Document contact_form_fields 2017-06-01 12:57:11 +02:00
Raphael Michel
f04b7fa365 Update translations 2017-06-01 12:56:53 +02:00
Raphael Michel
fa011fbdce Update django-redis 2017-05-31 07:51:16 +02:00
Raphael Michel
759c5374d9 Fix chardet pinning in setup.py 2017-05-30 19:22:28 +02:00
Raphael Michel
f631acdf18 Force chardet update 2017-05-30 19:12:44 +02:00
Raphael Michel
b2dfd8ab11 Bankimport: Force re-annotation for badly parsed files 2017-05-30 18:43:53 +02:00
Raphael Michel
43f4803da7 Fix name being used instead of email in CSV files 2017-05-30 18:00:21 +02:00
Raphael Michel
019d8220b8 Fix wrong text with banktransfer orders manually marked as paid 2017-05-30 17:57:50 +02:00
Raphael Michel
b946010bdb Add event date range to ticket editor 2017-05-30 17:18:03 +02:00
Raphael Michel
c3097b12c3 Fix typo 2017-05-30 17:14:17 +02:00
Raphael Michel
12a53710c3 Fix test_csvparser case that changed with newer chardet 2017-05-27 14:28:39 +02:00
Raphael Michel
983326e610 Stop pinning chardet/setuptools versions 2017-05-27 12:50:18 +02:00
Claudio Luck
b4eb707b38 bump required mt940 to v4.7 2017-05-27 11:59:21 +02:00
Claudio Luck
e44f34f0a9 mt940: also consider non-SWIFT field NS 2017-05-27 11:59:21 +02:00
Claudio Luck
3c762adbf4 mt940: payer is not always available 2017-05-27 11:59:21 +02:00
Raphael Michel
ebabd20d09 [Django 1.11] Refs #481 -- Explicit sorting of NULLs 2017-05-26 09:44:11 +02:00
Raphael Michel
8694e1901a [Django 1.11] Port AddOnVariationField 2017-05-26 09:44:11 +02:00
Tobias Kunze
0f2875e89a [Django 1.11] Upgrade to Django 1.11 2017-05-26 09:44:11 +02:00
Raphael Michel
74d9921be1 Fix error 500 during building error 400 responses 2017-05-26 09:37:48 +02:00
Tobias Kunze
41e56adfdb Make checkin lists available by default (#508) 2017-05-25 16:47:09 +02:00
Raphael Michel
4ff1d302d9 Fix missing argument 2017-05-25 14:55:04 +02:00
Raphael Michel
d6e213d51a Disable inline pdfs again due to Safari issues 2017-05-25 14:43:31 +02:00
Raphael Michel
2a4deeba55 List commercial plugins 2017-05-24 14:34:20 +02:00
Raphael Michel
24b1d2afcb Disable CssAbsoluteFilter 2017-05-24 14:34:20 +02:00
Leah Oswald
5cea3d824a Fix some typos in the backup and monitoring documentation (#506)
* fix missing word typo in backup and monitoring documentation

* fix another typo in backup and monitoring documentation
2017-05-24 13:40:12 +02:00
Raphael Michel
78a8a7d744 Add Order.meta_info_data 2017-05-23 12:38:00 +02:00
Raphael Michel
a3bf85754a Add signal contact_form_fields 2017-05-23 11:43:05 +02:00
Raphael Michel
006b6fd5e8 Add support for image icons in navigation 2017-05-23 11:42:42 +02:00
Raphael Michel
8ff2c42070 Fix order changing with zero-priced products 2017-05-22 21:13:05 +02:00
Raphael Michel
c5d18c6884 Clear settings cache after migration 2017-05-22 14:17:52 +02:00
Heok Hong Low
48b3621f1e Fix #499 -- Refactor paymentinfo to payment_info (#501)
* Refactor paymentinfo to payment_info, resolve #499

* Fix calling of object attribute on tuple

* Minor update to setup documentation

* Do not use short words for typochecks

* Text clarification

* Refactor paymentinfo to payment_info, resolve #499

* Include data migration for existing event settings, resolve #499
2017-05-22 14:06:19 +02:00
Raphael Michel
fb716eb498 Add add-ons to ticket editor 2017-05-22 14:04:14 +02:00
Tobias Kunze
5d8e294350 Fix typo 2017-05-22 09:25:15 +02:00
Raphael Michel
8a96d8c24e Text clarification 2017-05-21 10:47:12 +02:00
Raphael Michel
6396d2f922 Do not use short words for typochecks 2017-05-21 10:47:12 +02:00
lhhong
ed7e90451b Minor update to setup documentation 2017-05-21 10:29:56 +02:00
lhhong
f5990dd5c4 Fix calling of object attribute on tuple 2017-05-21 10:26:58 +02:00
Knuth
f29f615aec added a missing string and translation for it 2017-05-18 11:57:36 +02:00
Raphael Michel
f1300badb8 Bump version 2017-05-18 11:17:06 +02:00
Raphael Michel
88a1cddb23 Add release config for GitLab CI 2017-05-18 09:50:51 +02:00
Raphael Michel
d53fbc52d1 Fix #322 -- Do not use ManifestStaticFileStorage during testing 2017-05-17 18:20:13 +02:00
Raphael Michel
ec9511c17a Smaller documentation updates 2017-05-17 18:19:28 +02:00
Raphael Michel
3f2bb3beae Add date to the metadata section 2017-05-17 18:06:19 +02:00
Raphael Michel
c8b96696b0 Update/fix German translation 2017-05-17 18:06:19 +02:00
Raphael Michel
0bb6b53ebc Change client-side TIME_FORMAT for locale en as well 2017-05-17 18:06:19 +02:00
Raphael Michel
7400c2373b Remove debugging output 2017-05-17 18:06:19 +02:00
Knuth
635329f102 added missing spaces in DE and DE_informal 2017-05-17 17:05:49 +02:00
scabux
b5a2123d1c Added configurable text for organizer page (#494) 2017-05-17 15:53:30 +02:00
Raphael Michel
396c558b25 Fix critical bug in item creation 2017-05-17 15:47:35 +02:00
Ian Williams
60e178d821 Fix #443 -- Show private key in 2FA wizard (#490)
* Syncing fork to upstream (#1)

Sync master with master of pretix/pretix@300f8f6

* Automatically sort new products to the end

* Drop "squash your commits" from the dev guide

* Add variation descriptions and allow to order addons

* Link to Django's runserver options in dev docs

* Allow <br> tags in rich text

* Copy from event: deal with deleted items

* Make validate_cart useful together with addons

* Fix collapsing panels in the addon choice step

* Button text change if addons are present

* Update translations

* Squash migrations and bump version

* Ticket PDFs: Do not hide attendee name if code is hidden

* Add a user guide on payments

* Link PayPal and Stripe documentation in the respective forms

* Hide payment fees if they are all equal to 0.00

* Refs #39 -- New concept of "teams" (#478)

* New models

* CRUD UI

* UI for adding/removing team members

* Log display for teams

* Fix invitations, move frontend

* Drop old models (incomplete)

* Drop more old stuff

* Drop even more old stuff

* Fix tests

* Fix permission test

* flake8 fix

* Add tests fore the new code

* Rebase migrations

* Fix typo in method name

* Update translations

* Force ordering of events on dashboard

* Fix typos in events

* Prepare the pretixdroid API for an async mode in the app

* Pretixdroid tests: Ignore microseconds (chopped by mysql)

* pretixdroid API: Add related lookups

* Add idempotenty nonces to pretixdroid API

* pretixdroid: force-accepting unpaids and time display

* Marked webfonts as binary files (#487)

Webfonts now listed as binary in `.gitattributes`.
Works on pretix/pretix#486

* Fix #456 -- Allow products to be excluded from ticket-generation (#483)

* Added non-admission setting to event

`ticket_download_nonadm` now setting in storage. Still need logic for
order page/PDF generation.
Works on pretix/pretix#456.

* Download button considers `ticket_download_nonadm`

Modified Django tags to look at item admission attribute and
`ticket_download_nonadm` setting.
Works on pretix/pretix#456.

* Ticket output for non-admission disabled

PDFs/etc. will only be permitted/generated for items with the
`admission` attribute, or if the `ticket_download_nonadm` event setting
is true. Applies to single and whole-order ticket downloads.
Works on pretix/pretix#456.

* Fixed product exclusion in PDF output

Forgot PDF output was a plugin, now includes same check as base
`BaseTicketOutput.generate_order`.
Works on pretix/pretix#456

* Mail signature (#485)

* added signature field -- no function yet

* added mail signature feature

* fixed style issue

* fixed problem with signature default

* added unit test for mail signatures

* added unit test for mail signatures

* [WIP] Fix #447 -- Sendmail plugin: Create new mail based on an old one (#476)

* send old email content to the new one

* error key event

* test commit

* query bad ID

* query bad ID

* query bad ID

* query bad ID

* Update pretixdroid API version

* Refs #447 -- Extend copying old mails to subject and receipients

* Fixed bugs and added test for date range rendering (#488)

* fixed bug for same dates, added unit check for daterange

* fixed local language override in unit test

* Fix #297 -- pretixdroid: Show metrics in the control panel (#481)

* add checkin status page

add dashboard widget
add checkin page under orders

* modify checkin logic

added new fields in checkin page
added filter items

* add tests for checkins & minor improvement

* support addin_product & noadm setting logic

* remove name ordering check test case

* Fix #379 -- Add logo to event organizers (#431)

* [WIP] Add logo to event organizers.

* Fix indentation issues.

* Refactor code

Refactor code

Refactor code

* Add new migration

* Take files into account for organizer sform (settings form)

* Fix grammer

* Make bootstrap form errors specific to each fieldset

* Display logo on organizer's page

* Fix PR issues

Fix PR issues

Fix PR issues

* Reorder imports

* Remove conflicting migration

* Fix rebase conflict

* Fix #41 -- Drag-and-drop ticket editor

Undo/redo

Useful toolbox

Font selection

Add text content

Use hex for colors

JS-side dump and load

Save

Load layout, proper undo/redo

First steps to Python rendering

More PDF rendering

Copy and paste

Buttons for keyboard actions

Splash Screen

Block unbeforeunload in dirty state

Remove debugging output

Preview

Upload new PDFs via the editor

Fix bugs during PDF reload, link in settings form

New default ticket

Add OpenSans BI

Custom fonts, fix tests

* Added bootstrap-colorpicker

* Allow inline PDF display in CSP header

* Add fontpack to list of plugins

* Update German translation

* Add ticketoutputpdf's assets to MANIFEST.i

* Fix migration of old ticket styles

* Fix iCal download URL

* Multi-line location field, new field for admission time

* Admission date and time in editor

* Remove icon from "add to calendar"

* Try to fix PDF display problems in Safari

* Proxy cachedfiles that are used as editor previews

* Check Event.presale_is_running in more places

* Fix CSS generation with an empty color field

* Fix missing placeholders and reformat the sendmail view

* Fix bug that lead to wrong payment amount when switching payment method to PayPal later

* Update translation

* Revert "Syncing fork to upstream (#1)"

This reverts commit 847d409a00.
Merged wrong, my bad.

* Formatted OTP secret

New variable `secretGrouped` in `2fa_confirm_totp.html`, user-friendly
version of OTP secret (split every 4 characters).
Works on pretix/pretix#443.

* Adds manual secret entry OTP setup screen

`secretGrouped` exposed in user-friendly fashion. Includes short
instructions, copy-to-clipboard button, and js to hide instructions
unless user clicks on "Can't scan the barcode?" link.
Works on pretix/pretix#443.

* Minor indentation issuer

Fixed indentation issue (L40).
Works on pretix/pretix#443.

* Minor spacing issues

L265 of `user.py` failing flake8 tests, minor spacing fixes.

* Fixes indentation in `2fa_confirm_totp.html`

Per https://github.com/pretix/pretix/pull/490#discussion_r116165041,
fixes an issue with indentation.
Works on pretix/pretix#443, member of pretix/pretix#490.

* Removed `aria-*` attributes

Per https://github.com/pretix/pretix/pull/490#discussion_r116165115,
removes `aria` attributes from sub-tutorial.
Works on pretix/pretix#443, member of pretix/pretix#490.

* Pretix capitalization issue

Per https://github.com/pretix/pretix/pull/490#discussion_r116165193,
fixes an issue with capitalization of pretix.
Works on pretix/pretix#443, member of pretix/pretix#490.
2017-05-17 09:31:28 +02:00
Raphael Michel
7769aaccea Fix #492 -- Force deterministic ordering of some signals 2017-05-15 13:09:23 +02:00
Raphael Michel
5ff6d0b014 Auto-detect common typos in email addresses 2017-05-15 11:33:18 +02:00
Raphael Michel
7d9a1b5e0c Update translation 2017-05-11 12:15:23 +02:00
Raphael Michel
127086a50e Fix bug that lead to wrong payment amount when switching payment method to PayPal later 2017-05-10 19:12:55 +02:00
Raphael Michel
90d14c004f Fix missing placeholders and reformat the sendmail view 2017-05-10 15:14:23 +02:00
Raphael Michel
8c457c057e Fix CSS generation with an empty color field 2017-05-10 15:09:07 +02:00
Raphael Michel
36215a989a Check Event.presale_is_running in more places 2017-05-10 15:04:01 +02:00
Raphael Michel
74259bd4c6 Proxy cachedfiles that are used as editor previews 2017-05-10 15:02:54 +02:00
Raphael Michel
4561b7dce2 Try to fix PDF display problems in Safari 2017-05-10 15:02:28 +02:00
Raphael Michel
89d6166dbe Remove icon from "add to calendar" 2017-05-10 13:28:07 +02:00
Raphael Michel
f451977a04 Admission date and time in editor 2017-05-10 13:16:39 +02:00
Raphael Michel
aac05727ed Multi-line location field, new field for admission time 2017-05-10 12:58:57 +02:00
Raphael Michel
c9ae65a9a8 Fix iCal download URL 2017-05-10 12:57:59 +02:00
Raphael Michel
f4a9dbb546 Fix migration of old ticket styles 2017-05-09 17:23:17 +02:00
Raphael Michel
3eec791584 Add ticketoutputpdf's assets to MANIFEST.i 2017-05-09 11:55:25 +02:00
Raphael Michel
57473da182 Update German translation 2017-05-09 11:21:42 +02:00
Raphael Michel
fd90752a12 Add fontpack to list of plugins 2017-05-09 11:10:10 +02:00
Raphael Michel
0d3f5e0c32 Fix #41 -- Drag-and-drop ticket editor
Undo/redo

Useful toolbox

Font selection

Add text content

Use hex for colors

JS-side dump and load

Save

Load layout, proper undo/redo

First steps to Python rendering

More PDF rendering

Copy and paste

Buttons for keyboard actions

Splash Screen

Block unbeforeunload in dirty state

Remove debugging output

Preview

Upload new PDFs via the editor

Fix bugs during PDF reload, link in settings form

New default ticket

Add OpenSans BI

Custom fonts, fix tests
2017-05-09 11:10:10 +02:00
Raphael Michel
c98b0aac90 Added bootstrap-colorpicker 2017-05-09 11:10:10 +02:00
Raphael Michel
3de85975d6 Allow inline PDF display in CSP header 2017-05-09 11:10:10 +02:00
Bolutife Lawrence
962cdef69a Fix #379 -- Add logo to event organizers (#431)
* [WIP] Add logo to event organizers.

* Fix indentation issues.

* Refactor code

Refactor code

Refactor code

* Add new migration

* Take files into account for organizer sform (settings form)

* Fix grammer

* Make bootstrap form errors specific to each fieldset

* Display logo on organizer's page

* Fix PR issues

Fix PR issues

Fix PR issues

* Reorder imports

* Remove conflicting migration

* Fix rebase conflict
2017-05-08 17:46:35 +02:00
jlwt90
b301d20488 Fix #297 -- pretixdroid: Show metrics in the control panel (#481)
* add checkin status page

add dashboard widget
add checkin page under orders

* modify checkin logic

added new fields in checkin page
added filter items

* add tests for checkins & minor improvement

* support addin_product & noadm setting logic

* remove name ordering check test case
2017-05-08 17:31:37 +02:00
scabux
1b2895b0ca Fixed bugs and added test for date range rendering (#488)
* fixed bug for same dates, added unit check for daterange

* fixed local language override in unit test
2017-05-07 10:40:36 +02:00
Raphael Michel
d6943bb1dd Refs #447 -- Extend copying old mails to subject and receipients 2017-05-06 15:13:53 +02:00
Raphael Michel
51d74503ae Update pretixdroid API version 2017-05-06 14:40:28 +02:00
asv-hungvt
5eac3cf9cf [WIP] Fix #447 -- Sendmail plugin: Create new mail based on an old one (#476)
* send old email content to the new one

* error key event

* test commit

* query bad ID

* query bad ID

* query bad ID

* query bad ID
2017-05-06 14:39:48 +02:00
scabux
27d6f24c3c Mail signature (#485)
* added signature field -- no function yet

* added mail signature feature

* fixed style issue

* fixed problem with signature default

* added unit test for mail signatures

* added unit test for mail signatures
2017-05-06 11:12:38 +02:00
Ian Williams
d929b163db Fix #456 -- Allow products to be excluded from ticket-generation (#483)
* Added non-admission setting to event

`ticket_download_nonadm` now setting in storage. Still need logic for
order page/PDF generation.
Works on pretix/pretix#456.

* Download button considers `ticket_download_nonadm`

Modified Django tags to look at item admission attribute and
`ticket_download_nonadm` setting.
Works on pretix/pretix#456.

* Ticket output for non-admission disabled

PDFs/etc. will only be permitted/generated for items with the
`admission` attribute, or if the `ticket_download_nonadm` event setting
is true. Applies to single and whole-order ticket downloads.
Works on pretix/pretix#456.

* Fixed product exclusion in PDF output

Forgot PDF output was a plugin, now includes same check as base
`BaseTicketOutput.generate_order`.
Works on pretix/pretix#456
2017-05-06 11:11:11 +02:00
Ian Williams
571b3fbfa8 Marked webfonts as binary files (#487)
Webfonts now listed as binary in `.gitattributes`.
Works on pretix/pretix#486
2017-05-06 10:50:47 +02:00
Raphael Michel
db05f8eaa3 pretixdroid: force-accepting unpaids and time display 2017-05-04 11:57:29 +02:00
Raphael Michel
d8eba81efc Add idempotenty nonces to pretixdroid API 2017-05-04 09:32:36 +02:00
Raphael Michel
429ef67bbf pretixdroid API: Add related lookups 2017-05-03 19:17:37 +02:00
Raphael Michel
e5d9e69e3e Pretixdroid tests: Ignore microseconds (chopped by mysql) 2017-05-03 18:51:16 +02:00
Raphael Michel
dc32bdc474 Prepare the pretixdroid API for an async mode in the app 2017-05-03 18:06:32 +02:00
Raphael Michel
c45b709d54 Fix typos in events 2017-05-03 18:04:41 +02:00
Raphael Michel
e1be084d98 Force ordering of events on dashboard 2017-05-03 18:02:10 +02:00
Raphael Michel
20b8aafe11 Update translations 2017-05-03 17:23:44 +02:00
Raphael Michel
c719adf235 Fix typo in method name 2017-05-03 17:11:55 +02:00
Raphael Michel
d08a0bdb00 Refs #39 -- New concept of "teams" (#478)
* New models

* CRUD UI

* UI for adding/removing team members

* Log display for teams

* Fix invitations, move frontend

* Drop old models (incomplete)

* Drop more old stuff

* Drop even more old stuff

* Fix tests

* Fix permission test

* flake8 fix

* Add tests fore the new code

* Rebase migrations
2017-05-03 16:55:37 +02:00
Raphael Michel
8294391ebc Hide payment fees if they are all equal to 0.00 2017-05-02 19:12:42 +02:00
Raphael Michel
394c206133 Link PayPal and Stripe documentation in the respective forms 2017-05-02 19:07:19 +02:00
Raphael Michel
2fcd561ff7 Add a user guide on payments 2017-05-02 18:59:18 +02:00
Raphael Michel
f95b77fd7a Ticket PDFs: Do not hide attendee name if code is hidden 2017-05-02 17:07:09 +02:00
1112 changed files with 469399 additions and 16869 deletions

30
.gitattributes vendored
View File

@@ -1,6 +1,24 @@
src/static/fontawesome/* linguist-vendored
src/static/lightbox/* linguist-vendored
src/static/typeahead/* linguist-vendored
src/static/moment/* linguist-vendored
src/static/datetimepicker/* linguist-vendored
src/static/charts/* linguist-vendored
src/pretix/static/fontawesome/* linguist-vendored
src/pretix/static/lightbox/* linguist-vendored
src/pretix/static/typeahead/* linguist-vendored
src/pretix/static/moment/* linguist-vendored
src/pretix/static/datetimepicker/* linguist-vendored
src/pretix/static/colorpicker/* linguist-vendored
src/pretix/static/fileupload/* linguist-vendored
src/pretix/static/vuejs/* linguist-vendored
src/pretix/static/select2/* linguist-vendored
src/pretix/static/charts/* linguist-vendored
src/pretix/static/rrule/* linguist-vendored
src/pretix/static/iframeresizer/* linguist-vendored
src/pretix/static/pdfjs/* linguist-vendored
src/pretix/static/fabric/* linguist-vendored
# Denote all files that are truly binary and should not be modified.
*.eot binary
*.otf binary
*.ttf binary
*.woff binary
*.zip binary
*.png binary
*.gif binary
*.jpg binary

View File

@@ -2,11 +2,37 @@ before_script:
tests:
stage: test
script:
- virtualenv-3.4 env
- virtualenv env
- source env/bin/activate
- pip install -U pip wheel setuptools
- XDG_CACHE_HOME=/cache bash .travis.sh style
- XDG_CACHE_HOME=/cache bash .travis.sh tests
- XDG_CACHE_HOME=/cache bash .travis.sh doctests
tags:
- python3
except:
- pypi
pypi:
stage: release
script:
- cp /keys/.pypirc ~/.pypirc
- virtualenv env
- source env/bin/activate
- pip install -U pip wheel setuptools
- XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements.txt -r src/requirements/dev.txt
- cd src
- python setup.py sdist
- pip install dist/pretix-*.tar.gz
- python -m pretix migrate
- python -m pretix check
- python setup.py sdist upload
- python setup.py bdist_wheel upload
tags:
- python3
only:
- pypi
artifacts:
paths:
- src/dist/
stages:
- test
- build
- release

View File

@@ -1,2 +1 @@
-r src/requirements/py34.txt
-r doc/requirements.txt

View File

@@ -11,36 +11,48 @@ fi
if [ "$PRETIX_CONFIG_FILE" == "tests/travis_postgres.cfg" ]; then
psql -c 'create database travis_ci_test;' -U postgres
pip3 install -Ur src/requirements/postgres.txt
fi
if [ "$1" == "style" ]; then
XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements.txt -r src/requirements/dev.txt -r src/requirements/py34.txt
XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements.txt -r src/requirements/dev.txt
cd src
flake8 .
isort -c -rc .
isort -c -rc -df .
fi
if [ "$1" == "doctests" ]; then
XDG_CACHE_HOME=/cache pip3 install -Ur doc/requirements.txt -r src/requirements/py34.txt
XDG_CACHE_HOME=/cache pip3 install -Ur doc/requirements.txt
cd doc
make doctest
fi
if [ "$1" == "doc-spelling" ]; then
XDG_CACHE_HOME=/cache pip3 install -Ur doc/requirements.txt
cd doc
make spelling
if [ -s _build/spelling/output.txt ]; then
exit 1
fi
fi
if [ "$1" == "translation-spelling" ]; then
XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements/dev.txt
cd src
potypo
fi
if [ "$1" == "tests" ]; then
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.txt
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt
cd src
python manage.py check
make all compress
py.test --rerun 5 tests
py.test --reruns 5 -n 3 tests
fi
if [ "$1" == "tests-cov" ]; then
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.txt
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt
cd src
python manage.py check
make all compress
coverage run -m py.test --rerun 5 tests && codecov
coverage run -m py.test --reruns 5 tests && codecov
fi
if [ "$1" == "plugins" ]; then
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.txt
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt
cd src
python setup.py develop
make all compress
@@ -50,7 +62,7 @@ if [ "$1" == "plugins" ]; then
cd pretix-cartshare
python setup.py develop
make
py.test --rerun 5 tests
py.test --reruns 5 tests
popd
fi

View File

@@ -1,7 +1,7 @@
language: python
sudo: false
install:
- pip install -U pip wheel setuptools==28.6.1
- pip install -U pip wheel setuptools
script:
- bash .travis.sh $JOB
cache:
@@ -12,29 +12,35 @@ services:
- postgresql
matrix:
include:
- python: 3.4
env: JOB=tests PRETIX_CONFIG_FILE=tests/sqlite.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/sqlite.cfg
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/sqlite.cfg
- python: 3.4
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg
- python: 3.4
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
env: JOB=tests-cov PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.4
env: JOB=style
- python: 3.4
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.6
env: JOB=plugins
- python: 3.4
env: JOB=tests-cov
- python: 3.6
env: JOB=doc-spelling
- python: 3.6
env: JOB=translation-spelling
addons:
postgresql: "9.4"
mariadb: '10.3'
apt:
packages:
- enchant
- myspell-de-de
- aspell-en
- sqlite3
sources:
- travis-ci/sqlite3
branches:
except:
- /^weblate-.*/

5
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,5 @@
Code of Conduct
===============
We have a [Code of Conduct](https://docs.pretix.eu/en/latest/development/contribution/codeofconduct.html)
in place that applies to all project contributions, including issues, pull requests, etc.

View File

@@ -1,12 +1,26 @@
FROM debian:jessie
FROM python:3.6
RUN apt-get update && \
apt-get install -y python3 git python3-pip \
libxml2-dev libxslt1-dev python-dev python-virtualenv locales libffi-dev \
build-essential python3-dev zlib1g-dev libssl-dev gettext \
libpq-dev libmysqlclient-dev libmemcached-dev libjpeg-dev \
aqbanking-tools supervisor nginx sudo \
--no-install-recommends && \
apt-get install -y --no-install-recommends \
build-essential \
default-libmysqlclient-dev \
gettext \
git \
libffi-dev \
libjpeg-dev \
libmemcached-dev \
libpq-dev \
libssl-dev \
libxml2-dev \
libxslt1-dev \
locales \
nginx \
python-dev \
python-virtualenv \
python3-dev \
sudo \
supervisor \
zlib1g-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
dpkg-reconfigure locales && \
@@ -21,6 +35,22 @@ RUN apt-get update && \
ENV LC_ALL=C.UTF-8 \
DJANGO_SETTINGS_MODULE=production_settings
# To copy only the requirements files needed to install from PIP
COPY src/requirements /pretix/src/requirements
COPY src/requirements.txt /pretix/src
RUN pip3 install -U \
pip \
setuptools \
wheel && \
cd /pretix/src && \
pip3 install \
-r requirements.txt \
-r requirements/memcached.txt \
-r requirements/mysql.txt \
-r requirements/redis.txt \
gunicorn && \
rm -rf ~/.cache/pip
COPY deployment/docker/pretix.bash /usr/local/bin/pretix
COPY deployment/docker/supervisord.conf /etc/supervisord.conf
COPY deployment/docker/nginx.conf /etc/nginx/nginx.conf
@@ -29,12 +59,8 @@ COPY src /pretix/src
RUN chmod +x /usr/local/bin/pretix && \
rm /etc/nginx/sites-enabled/default && \
pip3 install -U pip wheel setuptools && \
cd /pretix/src && \
rm -f pretix.cfg && \
pip3 install -r requirements.txt -r requirements/mysql.txt -r requirements/postgres.txt \
-r requirements/memcached.txt -r requirements/redis.txt \
-r requirements/py34.txt gunicorn && \
mkdir -p data && \
chown -R pretixuser:pretixuser /pretix /data data && \
sudo -u pretixuser make production

View File

@@ -40,6 +40,14 @@ Contributing
If you want to contribute to pretix, please read the `developer documentation`_
in our documentation. If you have any further questions, please do not hesitate to ask!
.. image:: https://translate.pretix.eu/widgets/pretix/-/pretix/multi-blue.svg
:target: https://translate.pretix.eu/engage/pretix/
Code of Conduct
---------------
We have a `Code of Conduct`_ in place that applies to all project contributions,
including issues, pull requests, etc.
License
-------
The code in this repository is published under the terms of the Apache License.
@@ -50,5 +58,6 @@ AUTHORS file for a list of all the awesome folks who contributed to this project
.. _installation guide: https://docs.pretix.eu/en/latest/admin/installation/index.html
.. _developer documentation: https://docs.pretix.eu/en/latest/development/index.html
.. _Code of Conduct: https://docs.pretix.eu/en/latest/development/contribution/codeofconduct.html
.. _pretix.eu: https://pretix.eu
.. _blog: https://pretix.eu/about/en/blog/

View File

@@ -2,7 +2,8 @@
cd /pretix/src
export DJANGO_SETTINGS_MODULE=production_settings
export DATA_DIR=/data/
NUM_WORKERS=10
export HOME=/pretix
export NUM_WORKERS=$((2 * $(nproc --all)))
if [ ! -d /data/logs ]; then
mkdir /data/logs;

View File

@@ -23,6 +23,7 @@ autostart=true
autorestart=true
priority=5
user=pretixuser
environment=HOME=/pretix
[program:pretixtask]
command=/usr/local/bin/pretix taskworker

View File

@@ -175,3 +175,9 @@ pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
spelling:
$(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling
@echo
@echo "Spelling check finished, look at the results in " \
"$(BUILDDIR)/spelling/output.txt."

160
doc/_templates/index.html vendored Normal file
View File

@@ -0,0 +1,160 @@
{% extends "layout.html" %}
{% set title = 'Overview' %}
{% block body %}
<h1>Welcome to pretix' documentation!</h1>
<p>
We work hard to make this website contain all information that you need to use, run, understand, and improve
pretix. Of course, this documentation will never be perfect or complete, but if there is anything unclear
or anything specific that you miss here, that's a bug and we'd be happy if you'd
<a href="https://github.com/pretix/pretix/issues/new">let us know</a>.
</p>
<h2>Documentation structure</h2>
<div class="sectionbox">
<div class="icon">
<a href="user/index.html">
<span class="fa fa-user fa-fw"></span>
</a>
</div>
<div class="text">
<a href="user/index.html">
<strong>User Guide</strong>
</a>
<p>Go here to find information on how to configure and use pretix as an event organizer.</p>
</div>
</div>
<div class="sectionbox">
<div class="icon">
<a href="admin/index.html">
<span class="fa fa-server fa-fw"></span>
</a>
</div>
<div class="text">
<a href="admin/index.html">
<strong>Administrator docs</strong>
</a>
<p>Find out how to install pretix on your own server and how to maintain an installation of pretix.</p>
</div>
</div>
<div class="clearfix"></div>
<div class="sectionbox">
<div class="icon">
<a href="api/index.html">
<span class="fa fa-plug fa-fw"></span>
</a>
</div>
<div class="text">
<a href="api/index.html">
<strong>REST API</strong>
</a>
<p>
Documentation and reference of the RESTful API exposed by pretix for interaction with external
components.
</p>
</div>
</div>
<div class="sectionbox">
<div class="icon">
<a href="development/index.html">
<span class="fa fa-wrench fa-fw"></span>
</a>
</div>
<div class="text">
<a href="development/index.html">
<strong>Developer docs</strong>
</a>
<p>Get information on how to contribute to pretix itself and how to build plugins that interact with
pretix.</p>
</div>
</div>
<div class="clearfix"></div>
<div class="sectionbox">
<div class="icon">
<a href="plugins/index.html">
<span class="fa fa-puzzle-piece fa-fw"></span>
</a>
</div>
<div class="text">
<a href="plugins/index.html">
<strong>Plugin docs</strong>
</a>
<p>Documentation and details on plugins that ship with pretix or are officially supported.</p>
</div>
</div>
<div class="sectionbox">
<div class="icon">
<a href="contents.html">
<span class="fa fa-list fa-fw"></span>
</a>
</div>
<div class="text">
<a href="contents.html">
<strong>Table of contents</strong>
</a>
<p>Detailled overview of everything contained in this documentation.</p>
</div>
</div>
<div class="clearfix"></div>
<h2>Useful links</h2>
<div class="sectionbox">
<div class="icon">
<a href="https://pretix.eu" target="_blank">
<span class="fa fa-globe fa-fw"></span>
</a>
</div>
<div class="text">
<a href="https://pretix.eu" target="_blank">
<strong>Project website</strong>
</a>
<p>pretix.eu is the central entry-point to the pretix project and also the home of the commercial hosting
service available.</p>
</div>
</div>
<div class="sectionbox">
<div class="icon">
<a href="https://github.com/pretix/pretix" target="_blank">
<span class="fa fa-github fa-fw"></span>
</a>
</div>
<div class="text">
<a href="https://github.com/pretix/pretix" target="_blank">
<strong>GitHub repository</strong>
</a>
<p>Our main source code repository contains all code that is part of pretix as well as some plugins and the
source for this documentation.</p>
</div>
</div>
<div class="clearfix"></div>
<div class="sectionbox">
<div class="icon">
<a href="https://pretix.eu/about/en/blog/" target="_blank">
<span class="fa fa-newspaper-o fa-fw"></span>
</a>
</div>
<div class="text">
<a href="https://pretix.eu/about/en/blog/" target="_blank">
<strong>Project blog</strong>
</a>
<p>This important information source contains all release notes for all stable releases of pretix as well as
general news on pretix as a project.</p>
</div>
</div>
<div class="sectionbox">
<div class="icon">
<a href="https://twitter.com/pretixeu" target="_blank">
<span class="fa fa-twitter fa-fw"></span>
</a>
</div>
<div class="text">
<a href="https://twitter.com/pretixeu" target="_blank">
<strong>Twitter</strong>
</a>
<p>Keep in touch and stay up to date by following our project account on Twitter.</p>
</div>
</div>
<div class="clearfix"></div>
{% endblock %}

16
doc/_themes/pretix_theme/__init__.py vendored Normal file
View File

@@ -0,0 +1,16 @@
"""pretix sphinx theme.
Based on sphinx-rtd-theme
Based on https://github.com/ryan-roemer/sphinx-bootstrap-theme.
"""
import os
__version__ = '0.1.0'
__version_full__ = __version__
def get_html_theme_path():
"""Return list of HTML theme paths."""
cur_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
return cur_dir

View File

@@ -0,0 +1,82 @@
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
{% if page_source_suffix %}
{% set suffix = page_source_suffix %}
{% else %}
{% set suffix = source_suffix %}
{% endif %}
{% if meta is defined and meta is not none %}
{% set check_meta = True %}
{% else %}
{% set check_meta = False %}
{% endif %}
{% if check_meta and 'github_url' in meta %}
{% set display_github = True %}
{% endif %}
{% if check_meta and 'bitbucket_url' in meta %}
{% set display_bitbucket = True %}
{% endif %}
{% if check_meta and 'gitlab_url' in meta %}
{% set display_gitlab = True %}
{% endif %}
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
{% block breadcrumbs %}
<li><a href="{{ pathto(master_doc) }}">{{ _('Docs') }}</a> &raquo;</li>
{% for doc in parents %}
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
{% endfor %}
<li>{{ title }}</li>
{% endblock %}
{% block breadcrumbs_aside %}
<li class="wy-breadcrumbs-aside">
{% if pagename != "search" %}
{% if display_github %}
{% if check_meta and 'github_url' in meta %}
<!-- User defined GitHub URL -->
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
{% else %}
<a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
{% endif %}
{% elif display_bitbucket %}
{% if check_meta and 'bitbucket_url' in meta %}
<!-- User defined Bitbucket URL -->
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
{% else %}
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
{% endif %}
{% elif display_gitlab %}
{% if check_meta and 'gitlab_url' in meta %}
<!-- User defined GitLab URL -->
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
{% else %}
<a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/blob/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
{% endif %}
{% elif show_source and source_url_prefix %}
<a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a>
{% elif show_source and has_source and sourcename %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
{% endif %}
{% endif %}
</li>
{% endblock %}
</ul>
{% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
<div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation">
{% if next %}
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
{% endif %}
{% if prev %}
<a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
{% endif %}
</div>
{% endif %}
<hr/>
</div>

52
doc/_themes/pretix_theme/footer.html vendored Normal file
View File

@@ -0,0 +1,52 @@
<footer>
{% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
{% if next %}
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
{% endif %}
{% if prev %}
<a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
{% endif %}
</div>
{% endif %}
<hr/>
<div role="contentinfo">
<p>
{%- if show_copyright %}
{%- if hasdoc('copyright') %}
{% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
{% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if build_id and build_url %}
{% trans build_url=build_url, build_id=build_id %}
<span class="build">
Build
<a href="{{ build_url }}">{{ build_id }}</a>.
</span>
{% endtrans %}
{%- elif commit %}
{% trans commit=commit %}
<span class="commit">
Revision <code>{{ commit }}</code>.
</span>
{% endtrans %}
{%- elif last_updated %}
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %}
</p>
</div>
{%- if show_sphinx %}
<small>{% trans %}Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a theme that is based on a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>{% endtrans %}.</small>
{%- endif %}
{%- block extrafooter %} {% endblock %}
</footer>

211
doc/_themes/pretix_theme/layout.html vendored Normal file
View File

@@ -0,0 +1,211 @@
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
{%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
{%- set titlesuffix = "" %}
{%- endif %}
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
{{ metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{% endblock %}
{# FAVICON #}
{% if favicon %}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
{% endif %}
{# CANONICAL URL #}
{% if theme_canonical_url %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{% endif %}
{# CSS #}
{# OPENSEARCH #}
{% if not embedded %}
{% if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{% endif %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
{% for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
{% for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}"
href="{{ pathto('about') }}"/>
{%- endif %}
{%- if hasdoc('genindex') %}
<link rel="index" title="{{ _('Index') }}"
href="{{ pathto('genindex') }}"/>
{%- endif %}
{%- if hasdoc('search') %}
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}"/>
{%- endif %}
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}"/>
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}"/>
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}"/>
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
{%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
{# Keep modernizr in head - http://modernizr.com/docs/#installing #}
<script src="{{ pathto('_static/js/modernizr.min.js', 1) }}"></script>
</head>
<body class="wy-body-for-nav" role="document">
{% block extrabody %} {% endblock %}
<div class="wy-grid-for-nav">
{# SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
{% block sidebartitle %}
{% if logo and theme_logo_only %}
<a href="{{ pathto('index') }}">
{% else %}
<a href="{{ pathto('index') }}" class="icon icon-home"> {{ project }}
{% endif %}
{% if logo %}
{# Not strictly valid HTML, but it's the only way to display/scale it properly, without weird scripting or heaps of work #}
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" />
{% endif %}
</a>
{% include "searchbox.html" %}
{% endblock %}
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
{% block menu %}
{#
The singlehtml builder doesn't handle this toctree call when the
toctree is empty. Skip building this for now.
#}
{% if 'singlehtml' not in builder %}
{% set global_toc = toctree(maxdepth=theme_navigation_depth|int, collapse=theme_collapse_navigation, includehidden=True) %}
{% endif %}
{% if global_toc %}
{{ global_toc }}
{% else %}
<!-- Local TOC -->
<div class="local-toc">{{ toc }}</div>
{% endif %}
{% endblock %}
</div>
{% if theme_display_version %}
{%- set nav_version = version %}
{% if READTHEDOCS and current_version %}
{%- set nav_version = current_version %}
{% endif %}
{% if nav_version %}
<div class="version">
{{ nav_version }}
</div>
{% endif %}
{% endif %}
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
{% block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto('index') }}">{{ project }}</a>
{% endblock %}
</nav>
{# PAGE CONTENT #}
<div class="wy-nav-content">
<div class="rst-content">
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
{% block body %}{% endblock %}
</div>
<div class="articleComments">
{% block comments %}{% endblock %}
</div>
</div>
{% include "footer.html" %}
</div>
</div>
</section>
</div>
{% include "versions.html" %}
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }},
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{% endif %}
{# STICKY NAVIGATION #}
{% if theme_sticky_navigation %}
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
{% endif %}
{%- block footer %} {% endblock %}
</body>
</html>

209
doc/_themes/pretix_theme/layout_old.html vendored Normal file
View File

@@ -0,0 +1,209 @@
{#
basic/layout.html
~~~~~~~~~~~~~~~~~
Master layout template for Sphinx themes.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- block doctype -%}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{%- endblock %}
{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
(sidebars != []) %}
{%- set url_root = pathto('', 1) %}
{# XXX necessary? #}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
{%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
{%- set titlesuffix = "" %}
{%- endif %}
{%- macro relbar() %}
<div class="related">
<h3>{{ _('Navigation') }}</h3>
<ul>
{%- for rellink in rellinks %}
<li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
<a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
{{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
{%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
{%- endfor %}
{%- block rootrellink %}
<li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
{%- endblock %}
{%- for parent in parents %}
<li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
{%- endfor %}
{%- block relbaritems %} {% endblock %}
</ul>
</div>
{%- endmacro %}
{%- macro sidebar() %}
{%- if render_sidebar %}
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
{%- block sidebarlogo %}
{%- if logo %}
<p class="logo"><a href="{{ pathto(master_doc) }}">
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
</a></p>
{%- endif %}
{%- endblock %}
{%- if sidebars != None %}
{#- new style sidebar: explicitly include/exclude templates #}
{%- for sidebartemplate in sidebars %}
{%- include sidebartemplate %}
{%- endfor %}
{%- else %}
{#- old style sidebars: using blocks -- should be deprecated #}
{%- block sidebartoc %}
{%- include "localtoc.html" %}
{%- endblock %}
{%- block sidebarrel %}
{%- include "relations.html" %}
{%- endblock %}
{%- block sidebarsourcelink %}
{%- include "sourcelink.html" %}
{%- endblock %}
{%- if customsidebar %}
{%- include customsidebar %}
{%- endif %}
{%- block sidebarsearch %}
{%- include "searchbox.html" %}
{%- endblock %}
{%- endif %}
</div>
</div>
{%- endif %}
{%- endmacro %}
{%- macro script() %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '{{ url_root }}',
VERSION: '{{ release|e }}',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }},
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{%- endmacro %}
{%- macro css() %}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
{%- for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{%- endfor %}
{%- endmacro %}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
{{ metatags }}
{%- block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{%- endblock %}
{{ css() }}
{%- if not embedded %}
{{ script() }}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{%- endif %}
{%- if favicon %}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
{%- endif %}
{%- if theme_canonical_url %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif %}
{%- endif %}
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
{%- endif %}
{%- if hasdoc('genindex') %}
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
{%- endif %}
{%- if hasdoc('search') %}
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
{%- endif %}
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
{%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
</head>
<body>
{%- block header %}{% endblock %}
{%- block relbar1 %}{{ relbar() }}{% endblock %}
{%- block content %}
{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
<div class="document">
{%- block document %}
<div class="documentwrapper">
{%- if render_sidebar %}
<div class="bodywrapper">
{%- endif %}
<div class="body">
{% block body %} {% endblock %}
</div>
{%- if render_sidebar %}
</div>
{%- endif %}
</div>
{%- endblock %}
{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
<div class="clearer"></div>
</div>
{%- endblock %}
{%- block relbar2 %}{{ relbar() }}{% endblock %}
{%- block footer %}
<div class="footer">
{%- if show_copyright %}
{%- if hasdoc('copyright') %}
{% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
{% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if last_updated %}
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %}
{%- if show_sphinx %}
{% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
{%- endif %}
</div>
<p>asdf asdf asdf asdf 22</p>
{%- endblock %}
</body>
</html>

50
doc/_themes/pretix_theme/search.html vendored Normal file
View File

@@ -0,0 +1,50 @@
{#
basic/search.html
~~~~~~~~~~~~~~~~~
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block footer %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
{% trans %}Please activate JavaScript to enable the search
functionality.{% endtrans %}
</p>
</div>
</noscript>
{% if search_performed %}
<h2>{{ _('Search Results') }}</h2>
{% if not search_results %}
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
{% endif %}
{% endif %}
<div id="search-results">
{% if search_results %}
<ul>
{% for href, caption, context in search_results %}
<li>
<a href="{{ pathto(item.href) }}">{{ caption }}</a>
<p class="context">{{ context|e }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endblock %}

View File

@@ -0,0 +1,9 @@
{%- if builder != 'singlehtml' %}
<div role="search">
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="{{ _('Search docs') }}" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
{%- endif %}

View File

@@ -0,0 +1,2 @@
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}
/*# sourceMappingURL=badge_only.css.map */

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,169 @@
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"sphinx-rtd-theme":[function(require,module,exports){
var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');
// Sphinx theme nav state
function ThemeNav () {
var nav = {
navBar: null,
win: null,
winScroll: false,
winResize: false,
linkScroll: false,
winPosition: 0,
winHeight: null,
docHeight: null,
isRunning: false
};
nav.enable = function () {
var self = this;
if (!self.isRunning) {
self.isRunning = true;
jQuery(function ($) {
self.init($);
self.reset();
self.win.on('hashchange', self.reset);
// Set scroll monitor
self.win.on('scroll', function () {
if (!self.linkScroll) {
self.winScroll = true;
}
});
setInterval(function () { if (self.winScroll) self.onScroll(); }, 25);
// Set resize monitor
self.win.on('resize', function () {
self.winResize = true;
});
setInterval(function () { if (self.winResize) self.onResize(); }, 25);
self.onResize();
});
};
};
nav.init = function ($) {
var doc = $(document),
self = this;
this.navBar = $('div.wy-side-scroll:first');
this.win = $(window);
// Set up javascript UX bits
$(document)
// Shift nav in mobile when clicking the menu.
.on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
})
// Nav menu link click operations
.on('click', ".wy-menu-vertical .current ul li a", function() {
var target = $(this);
// Close menu when you click a link.
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
// Handle dynamic display of l3 and l4 nav lists
self.toggleCurrent(target);
self.hashChange();
})
.on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
})
// Make tables responsive
$("table.docutils:not(.field-list)")
.wrap("<div class='wy-table-responsive'></div>");
// Add expand links to all parents of nested ul
$('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {
var link = $(this);
expand = $('<span class="toctree-expand"></span>');
expand.on('click', function (ev) {
self.toggleCurrent(link);
ev.stopPropagation();
return false;
});
link.prepend(expand);
});
};
nav.reset = function () {
// Get anchor from URL and open up nested nav
var anchor = encodeURI(window.location.hash);
if (anchor) {
try {
var link = $('.wy-menu-vertical')
.find('[href="' + anchor + '"]');
// If we didn't find a link, it may be because we clicked on
// something that is not in the sidebar (eg: when using
// sphinxcontrib.httpdomain it generates headerlinks but those
// aren't picked up and placed in the toctree). So let's find
// the closest header in the document and try with that one.
if (link.length === 0) {
var doc_link = $('.document a[href="' + anchor + '"]');
var closest_section = doc_link.closest('div.section');
// Try again with the closest section entry.
link = $('.wy-menu-vertical')
.find('[href="#' + closest_section.attr("id") + '"]');
}
$('.wy-menu-vertical li.toctree-l1 li.current')
.removeClass('current');
link.closest('li.toctree-l2').addClass('current');
link.closest('li.toctree-l3').addClass('current');
link.closest('li.toctree-l4').addClass('current');
}
catch (err) {
console.log("Error expanding nav for anchor", err);
}
}
};
nav.onScroll = function () {
this.winScroll = false;
var newWinPosition = this.win.scrollTop(),
winBottom = newWinPosition + this.winHeight,
navPosition = this.navBar.scrollTop(),
newNavPosition = navPosition + (newWinPosition - this.winPosition);
if (newWinPosition < 0 || winBottom > this.docHeight) {
return;
}
this.navBar.scrollTop(newNavPosition);
this.winPosition = newWinPosition;
};
nav.onResize = function () {
this.winResize = false;
this.winHeight = this.win.height();
this.docHeight = $(document).height();
};
nav.hashChange = function () {
this.linkScroll = true;
this.win.one('hashchange', function () {
this.linkScroll = false;
});
};
nav.toggleCurrent = function (elem) {
var parent_li = elem.closest('li');
parent_li.siblings('li.current').removeClass('current');
parent_li.siblings().find('li.current').removeClass('current');
parent_li.find('> ul li.current').removeClass('current');
parent_li.toggleClass('current');
}
return nav;
};
module.exports.ThemeNav = ThemeNav();
if (typeof(window) != 'undefined') {
window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav };
}
},{"jquery":"jquery"}]},{},["sphinx-rtd-theme"]);

14
doc/_themes/pretix_theme/theme.conf vendored Normal file
View File

@@ -0,0 +1,14 @@
[theme]
inherit = basic
stylesheet = css/pretix.css
[options]
typekit_id = hiw1hhg
analytics_id =
sticky_navigation = False
logo_only =
collapse_navigation = False
display_version = True
navigation_depth = 4
prev_next_buttons_location = bottom
canonical_url =

37
doc/_themes/pretix_theme/versions.html vendored Normal file
View File

@@ -0,0 +1,37 @@
{% if READTHEDOCS %}
{# Add rst-badge after rst-versions for small badge style. #}
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span>
v: {{ current_version }}
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<dl>
<dt>{{ _('Versions') }}</dt>
{% for slug, url in versions %}
<dd><a href="{{ url }}">{{ slug }}</a></dd>
{% endfor %}
</dl>
<dl>
<dt>{{ _('Downloads') }}</dt>
{% for type, url in downloads %}
<dd><a href="{{ url }}">{{ type }}</a></dd>
{% endfor %}
</dl>
<dl>
<dt>{{ _('On Read the Docs') }}</dt>
<dd>
<a href="//{{ PRODUCTION_DOMAIN }}/projects/{{ slug }}/?fromdocs={{ slug }}">{{ _('Project Home') }}</a>
</dd>
<dd>
<a href="//{{ PRODUCTION_DOMAIN }}/builds/{{ slug }}/?fromdocs={{ slug }}">{{ _('Builds') }}</a>
</dd>
</dl>
<hr/>
{% trans %}Free document hosting provided by <a href="http://www.readthedocs.org">Read the Docs</a>.{% endtrans %}
</div>
</div>
{% endif %}

View File

@@ -2,6 +2,8 @@
.. _`config`:
.. spelling:: Galera
Configuration file
==================
@@ -10,9 +12,10 @@ at the following locations. It will try to read the file from the specified path
the following order. The file that is found *last* will override the settings from
the files found before.
1. ``/etc/pretix/pretix.cfg``
2. ``~/.pretix.cfg``
3. ``pretix.cfg`` in the current working directory
1. ``PRETIX_CONFIG_FILE`` environment variable
2. ``/etc/pretix/pretix.cfg``
3. ``~/.pretix.cfg``
4. ``pretix.cfg`` in the current working directory
The file is expected to be in the INI format as specified in the `Python documentation`_.
@@ -44,12 +47,16 @@ Example::
``datadir``
The local path to a data directory that will be used for storing user uploads and similar
data. Defaults to thea value of the environment variable ``DATA_DIR`` or ``data``.
data. Defaults to the value of the environment variable ``DATA_DIR`` or ``data``.
``plugins_default``
A comma-separated list of plugins that are enabled by default for all new events.
Defaults to ``pretix.plugins.sendmail,pretix.plugins.statistics``.
``plugins_exclude``
A comma-separated list of plugins that are not available even though they are installed.
Defaults to an empty string.
``cookie_domain``
The cookie domain to be set. Defaults to ``None``.
@@ -59,6 +66,18 @@ Example::
``password_reset``
Enables or disables password reset. Defaults to ``on``.
``long_sessions``
Enables or disables the "keep me logged in" button. Defaults to ``on``.
``ecb_rates``
By default, pretix periodically downloads a XML file from the European Central Bank to retrieve exchange rates
that are used to print tax amounts in the customer currency on invoices for some currencies. Set to ``off`` to
disable this feature. Defaults to ``on``.
``audit_comments``
Enables or disables nagging staff users for leaving comments on their sessions for auditability.
Defaults to ``off``.
Locale settings
---------------
@@ -163,14 +182,9 @@ Django settings
Example::
[django]
hosts=localhost
secret=j1kjps5a5&4ilpn912s7a1!e2h!duz^i3&idu@_907s$wrz@x-
debug=off
``hosts``
Comma-separated list of allowed host names for this installation.
Default: ``localhost``
``secret``
The secret to be used by Django for signing and verification purposes. If this
setting is not provided, pretix will generate a random secret on the first start
@@ -281,5 +295,13 @@ various places like order codes, secrets in the ticket QR codes, etc. Example::
; Voucher code needs to be < 255 characters, default is 16
voucher_code=16
External tools
--------------
pretix can make use of some external tools if they are installed. Currently, they are all optional. Example::
[tools]
pdftk=/usr/bin/pdftk
.. _Python documentation: https://docs.python.org/3/library/configparser.html?highlight=configparser#supported-ini-file-structure
.. _Celery documentation: http://docs.celeryproject.org/en/latest/configuration.html
.. _Celery documentation: http://docs.celeryproject.org/en/latest/userguide/configuration.html

View File

@@ -1,10 +1,10 @@
.. _`admindocs`:
Administrator documentation
===========================
This documentation is for everyone who wants to install pretix on a server.
Contents:
.. toctree::
:maxdepth: 2

View File

@@ -0,0 +1,37 @@
.. highlight:: none
Installing a development version
================================
If you want to use a feature of pretix that is not yet contained in the last monthly release, you can also
install a development version with pretix.
.. warning:: When in production, we strongly recommend only installing released versions. Development versions might
be broken, incompatible to plugins, or in rare cases incompatible to upgrade later on.
Manual installation
-------------------
You can use ``pip`` to update pretix directly to the development branch. Then, upgrade as usual::
$ source /var/pretix/venv/bin/activate
(venv)$ pip3 install -U "git+https://github.com/pretix/pretix.git#egg=pretix&subdirectory=src"
(venv)$ python -m pretix migrate
(venv)$ python -m pretix rebuild
(venv)$ python -m pretix updatestyles
# systemctl restart pretix-web pretix-worker
Docker installation
-------------------
To use the latest development version with Docker, first pull it from Docker Hub::
$ docker pull pretix/standalone:latest
Then change your ``/etc/systemd/system/pretix.service`` file to use the ``:latest`` tag instead of ``:stable`` as well
and upgrade as usual::
$ systemctl restart pretix.service
$ docker exec -it pretix.service pretix upgrade

View File

@@ -26,7 +26,7 @@ installation guides):
* `Docker`_
* A SMTP server to send out mails, e.g. `Postfix`_ on your machine or some third-party server you have credentials for
* A HTTP reverse proxy, e.g. `nginx`_ or Apache to allow HTTPS connections
* A `MySQL`_ or `PostgreSQL`_ database server
* A `PostgreSQL`_, `MySQL`_ 5.7+, or MariaDB 10.2.7+ database server
* A `redis`_ server
We also recommend that you use a firewall, although this is not a pretix-specific recommendation. If you're new to
@@ -36,6 +36,9 @@ Linux and firewalls, we recommend that you start with `ufw`_.
SSL certificates can be obtained for free these days. We also *do not* provide support for HTTP-only
installations except for evaluation purposes.
.. warning:: We recommend **PostgreSQL**. If you go for MySQL, make sure you run **MySQL 5.7 or newer** or
**MariaDB 10.2.7 or newer**.
On this guide
-------------
@@ -58,7 +61,7 @@ Next, we need a database and a database user. We can create these with any kind
our database's shell, e.g. for MySQL::
$ mysql -u root -p
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
mysql> GRANT ALL PRIVILEGES ON pretix.* TO pretix@'localhost' IDENTIFIED BY '*********';
mysql> FLUSH PRIVILEGES;
@@ -162,7 +165,7 @@ named ``/etc/systemd/system/pretix.service`` with the following content::
-v /etc/pretix:/etc/pretix \
-v /var/run/redis:/var/run/redis \
-v /var/run/mysqld:/var/run/mysqld \
pretix/standalone all
pretix/standalone:stable all
ExecStop=/usr/bin/docker stop %n
[Install]
@@ -239,6 +242,8 @@ Restarting the service can take a few seconds, especially if the update requires
Replace ``stable`` above with a specific version number like ``1.0`` or with ``latest`` for the development
version, if you want to.
.. _`docker_plugininstall`:
Install a plugin
----------------
@@ -266,8 +271,8 @@ to re-build your custom image after you pulled ``pretix/standalone`` if you want
.. _pretix.eu: https://pretix.eu/
.. _MySQL: https://dev.mysql.com/doc/refman/5.7/en/linux-installation-apt-repo.html
.. _PostgreSQL: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-9-4-on-debian-8
.. _redis: http://blog.programster.org/debian-8-install-redis-server/
.. _redis: https://blog.programster.org/debian-8-install-redis-server/
.. _ufw: https://en.wikipedia.org/wiki/Uncomplicated_Firewall
.. _redis website: http://redis.io/topics/security
.. _redis website: https://redis.io/topics/security
.. _redis in docker: https://hub.docker.com/r/_/redis/
.. _strong encryption settings: https://mozilla.github.io/server-side-tls/ssl-config-generator/

View File

@@ -0,0 +1,84 @@
.. highlight:: none
Installing pretix Enterprise plugins
====================================
If you want to use a feature of pretix that is part of our commercial offering pretix Enterprise, you need to follow
some extra steps. Installation works similar to normal pretix plugins, but involves a few extra steps.
Buying the license
------------------
To obtain a license, please get in touch at sales@pretix.eu. Please let us know how many tickets you roughly intend
to sell per year and how many servers you want to use the plugin on. We recommend having a look at our `price list`_
first.
Manual installation
-------------------
First, generate an SSH key for the system user that you install pretix as. In our tutorial, that would be the user
``pretix``. Choose an empty passphrase::
# su pretix
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/pretix/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/pretix/.ssh/id_rsa.
Your public key has been saved in /var/pretix/.ssh/id_rsa.pub.
Next, send the content of the *public* key to your sales representative at pretix::
$ cat /var/pretix/.ssh/id_rsa.pub
ssh-rsa AAAAB3N...744HZawHlD pretix@foo
After we configured your key in our system, you can install the plugin directly using ``pip`` from the URL we told
you, for example::
$ source /var/pretix/venv/bin/activate
(venv)$ pip3 install -U "git+ssh://git@code.rami.io:10022/pretix/pretix-slack.git@stable#egg=pretix-slack"
(venv)$ python -m pretix migrate
(venv)$ python -m pretix rebuild
# systemctl restart pretix-web pretix-worker
Docker installation
-------------------
To install a plugin, you need to build your own docker image. To do so, create a new directory to work in. As a first
step, generate a new SSH key in that directory to use for authentication with us::
$ cd /home/me/mypretixdocker
$ ssh-keygen -N "" -f id_pretix_enterprise
Next, send the content of the *public* key to your sales representative at pretix::
$ cat id_pretix_enterprise.pub
ssh-rsa AAAAB3N...744HZawHlD pretix@foo
After we configured your key in our system, you can add a ``Dockerfile`` in your directory that includes the newly
generated key and installs the plugin from the URL we told you::
FROM pretix/standalone:stable
USER root
COPY id_pretix_enterprise /root/.ssh/id_rsa
COPY id_pretix_enterprise.pub /root/.ssh/id_rsa.pub
RUN chmod -R 0600 /root/.ssh && \
mkdir -p /etc/ssh && \
ssh-keyscan -t rsa -p 10022 code.rami.io >> /root/.ssh/known_hosts && \
echo StrictHostKeyChecking=no >> /root/.ssh/config && \
pip3 install -Ue "git+ssh://git@code.rami.io:10022/pretix/pretix-slack.git@stable#egg=pretix-slack" && \
cd /pretix/src && \
sudo -u pretixuser make production
USER pretixuser
Then, build the image for docker::
$ docker build -t mypretix
You can now use that image ``mypretix`` instead of ``pretix/standalone:stable`` in your ``/etc/systemd/system/pretix.service``
service file. Be sure to re-build your custom image after you pulled ``pretix/standalone`` if you want to perform an
update to a new version of pretix.
.. _price list: https://pretix.eu/about/en/pricing

View File

@@ -1,5 +1,7 @@
.. highlight:: ini
.. spelling:: SQL
General remarks
===============
@@ -19,6 +21,9 @@ To use pretix, you will need the following things:
.. warning:: Do not ever use SQLite in production. It will break.
.. warning:: We recommend **PostgreSQL**. If you go for MySQL, make sure you run **MySQL 5.7 or newer** or
**MariaDB 10.2.7 or newer**.
* A **reverse proxy**. pretix needs to deliver some static content to your users (e.g. CSS, images, ...). While pretix
is capable of doing this, having this handled by a proper web server like **nginx** or **Apache** will be much
faster. Also, you need a proxying web server in front to provide SSL encryption.

View File

@@ -10,3 +10,5 @@ for your needs.
general
docker_smallscale
manual_smallscale
dev_version
enterprise

View File

@@ -23,7 +23,7 @@ installation guides):
* A SMTP server to send out mails, e.g. `Postfix`_ on your machine or some third-party server you have credentials for
* A HTTP reverse proxy, e.g. `nginx`_ or Apache to allow HTTPS connections
* A `MySQL`_ or `PostgreSQL`_ database server
* A `PostgreSQL`_, `MySQL`_ 5.7+, or MariaDB 10.2.7+ database server
* A `redis`_ server
We also recommend that you use a firewall, although this is not a pretix-specific recommendation. If you're new to
@@ -33,6 +33,9 @@ Linux and firewalls, we recommend that you start with `ufw`_.
SSL certificates can be obtained for free these days. We also *do not* provide support for HTTP-only
installations except for evaluation purposes.
.. warning:: We recommend **PostgreSQL**. If you go for MySQL, make sure you run **MySQL 5.7 or newer** or
**MariaDB 10.2.7 or newer**.
Unix user
---------
@@ -50,7 +53,7 @@ Having the database server installed, we still need a database and a database us
of database managing tool or directly on our database's shell, e.g. for MySQL::
$ mysql -u root -p
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
mysql> GRANT ALL PRIVILEGES ON pretix.* TO pretix@'localhost' IDENTIFIED BY '*********';
mysql> FLUSH PRIVILEGES;
@@ -61,7 +64,7 @@ To build and run pretix, you will need the following debian packages::
# apt-get install git build-essential python-dev python-virtualenv python3 python3-pip \
python3-dev libxml2-dev libxslt1-dev libffi-dev zlib1g-dev libssl-dev \
gettext libpq-dev libmysqlclient-dev libjpeg-dev
gettext libpq-dev libmysqlclient-dev libjpeg-dev libopenjp2-7-dev
Config file
-----------
@@ -121,8 +124,7 @@ command if you're running PostgreSQL::
(venv)$ pip3 install "pretix[mysql]" gunicorn
If you are running Python 3.4, you also need to ``pip3 install typing``. This is not required on 3.5 or newer.
You can find out your Python version using ``python -V``.
Note that you need Python 3.5 or newer. You can find out your Python version using ``python -V``.
We also need to create a data directory::
@@ -177,7 +179,7 @@ For background tasks we need a second service ``/etc/systemd/system/pretix-worke
[Install]
WantedBy=multi-user.target
You can now run the following comamnds to enable and start the services::
You can now run the following commands to enable and start the services::
# systemctl daemon-reload
# systemctl enable pretix-web pretix-worker
@@ -213,7 +215,7 @@ The following snippet is an example on how to configure a nginx proxy for pretix
ssl_certificate /path/to/cert.chain.pem;
ssl_certificate_key /path/to/key.pem;
add_header Referrer-Options same-origin;
add_header Referrer-Policy same-origin;
add_header X-Content-Type-Options nosniff;
location / {
@@ -276,6 +278,8 @@ To upgrade to a new pretix release, pull the latest code changes and run the fol
# systemctl restart pretix-web pretix-worker
.. _`manual_plugininstall`:
Install a plugin
----------------
@@ -296,6 +300,6 @@ example::
.. _pretix.eu: https://pretix.eu/
.. _MySQL: https://dev.mysql.com/doc/refman/5.7/en/linux-installation-apt-repo.html
.. _PostgreSQL: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-9-4-on-debian-8
.. _redis: http://blog.programster.org/debian-8-install-redis-server/
.. _redis: https://blog.programster.org/debian-8-install-redis-server/
.. _ufw: https://en.wikipedia.org/wiki/Uncomplicated_Firewall
.. _strong encryption settings: https://mozilla.github.io/server-side-tls/ssl-config-generator/

View File

@@ -51,7 +51,7 @@ If there is a problem, a status code in the ``5xx`` range will be returned.
Performance monitoring
----------------------
If you to generate detailled performance statistics of your pretix installation, there is an
If you want to generate detailed performance statistics of your pretix installation, there is an
endpoint at ``https://pretix.mydomain.com/metrics`` (no slash at the end) which returns a
number of values in the text format understood by monitoring tools like Prometheus_. This data
is only collected and exposed if you enable it in the :ref:`metrics-settings` section of your

9
doc/api/auth.rst Normal file
View File

@@ -0,0 +1,9 @@
Authentication
==============
.. toctree::
:maxdepth: 2
tokenauth
oauth
deviceauth

137
doc/api/deviceauth.rst Normal file
View File

@@ -0,0 +1,137 @@
.. _`rest-deviceauth`:
Device authentication
=====================
Initializing a new device
-------------------------
Users can create new devices in the "Device" section of their organizer settings. When creating
a new device, users can specify a list of events the device is allowed to access. After a new
device is created, users will be presented initialization instructions, consisting of an URL
and an initialization token. They will also be shown as a QR code with the following contents::
{"handshake_version": 1, "url": "https://pretix.eu", "token": "kpp4jn8g2ynzonp6"}
Your application should be able to scan a QR code of this type, or allow to enter the URL and the
initialization token manually. The handshake version is not used for manual initialization. When a
QR code is scanned with a higher handshake version than you support, you should reject the request
and prompt the user to update the client application.
After your application received the token, you need to call the initialization endpoint to obtain
a proper API token. At this point, you need to identify the name and version of your application,
as well as the type of underlying hardware. Example:
.. sourcecode:: http
POST /api/v1/device/initialize HTTP/1.1
Host: pretix.eu
Content-Type: application/json
{
"token": "kpp4jn8g2ynzonp6",
"hardware_brand": "Samsung",
"hardware_model": "Galaxy S",
"software_brand": "pretixdroid",
"software_version": "4.0.0"
}
Every initialization token can only be used once. On success, you will receive a response containing
information on your device as well as your API token:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: application/json
{
"organizer": "foo",
"device_id": 5,
"unique_serial": "HHZ9LW9JWP390VFZ",
"api_token": "1kcsh572fonm3hawalrncam4l1gktr2rzx25a22l8g9hx108o9oi0rztpcvwnfnd",
"name": "Bar"
}
Please make sure that you store this ``api_token`` value. We also recommend storing your device ID, your assigned
``unique_serial``, and the ``organizer`` you have access to, but that's up to you.
In case of an error, the response will look like this:
.. sourcecode:: http
HTTP/1.1 400 Bad Request
Content-Type: application/json
{"token":["This initialization token has already been used."]}
Performing API requests
-----------------------
You need to include the API token with every request to pretix' API in the ``Authorization`` header
like the following:
.. sourcecode:: http
:emphasize-lines: 3
GET /api/v1/organizers/ HTTP/1.1
Host: pretix.eu
Authorization: Device 1kcsh572fonm3hawalrncam4l1gktr2rzx25a22l8g9hx108o9oi0rztpcvwnfnd
Updating the software version
-----------------------------
If your application is updated, we ask you to tell the server about the new version in use. You can do this at the
following endpoint:
.. sourcecode:: http
POST /api/v1/device/update HTTP/1.1
Host: pretix.eu
Content-Type: application/json
Authorization: Device 1kcsh572fonm3hawalrncam4l1gktr2rzx25a22l8g9hx108o9oi0rztpcvwnfnd
{
"hardware_brand": "Samsung",
"hardware_model": "Galaxy S",
"software_brand": "pretixdroid",
"software_version": "4.1.0"
}
Creating a new API key
----------------------
If you think your API key might have leaked or just want to be extra cautious, the API allows you to create a new key.
The old API key will be invalid immediately. A request for a new key looks like this:
.. sourcecode:: http
POST /api/v1/device/roll HTTP/1.1
Host: pretix.eu
Authorization: Device 1kcsh572fonm3hawalrncam4l1gktr2rzx25a22l8g9hx108o9oi0rztpcvwnfnd
The response will look like the response to the initialization request.
Removing a device
-----------------
If you want implement a way to to deprovision a device in your software, you can call the ``revoke`` endpoint to
invalidate your API key. There is no way to reverse this operation.
.. sourcecode:: http
POST /api/v1/device/revoke HTTP/1.1
Host: pretix.eu
Authorization: Device 1kcsh572fonm3hawalrncam4l1gktr2rzx25a22l8g9hx108o9oi0rztpcvwnfnd
This can also be done by the user through the web interface.
Permissions
-----------
Device authentication is currently hardcoded to grant the following permissions:
* View event meta data and products etc.
* View and change orders
Devices cannot change events or products and cannot access vouchers.

184
doc/api/fundamentals.rst Normal file
View File

@@ -0,0 +1,184 @@
Basic concepts
==============
This page describes basic concepts and definition that you need to know to interact
with pretix' REST API, such as authentication, pagination and similar definitions.
.. _`rest-auth`:
Authentication
--------------
To access the API, you need to present valid authentication credentials. pretix currently
supports the following authorization schemes:
* :ref:`rest-tokenauth`: This is the simplest way and recommended for server-side applications
that interact with pretix without user interaction.
* :ref:`rest-oauth`: This is the recommended way to use if you write a third-party application
that users can connect with their pretix account. It provides the best user experience, but
requires user interaction and slightly more implementation effort.
* :ref:`rest-deviceauth`: This is the recommended way if you build apps or hardware devices that can
connect to pretix, e.g. for processing check-ins or to sell tickets offline. It provides a way
to uniquely identify devices and allows for a quick configuration flow inside your software.
* Authentication using browser sessions: This is used by the pretix web interface and it is *not*
officially supported for use by third-party applications. It might change or be removed at any
time without prior notice. If you use it, you need to comply with Django's `CSRF policies`_.
Permissions
-----------
The API follows pretix team based permissions model. Each organizer can have several teams
each with it's own set of permissions. Each team can have any number of API keys attached.
To access a given endpoint the team the API key belongs to needs to have the corresponding
permission for the organizer/event being accessed.
Possible permissions are:
* Can create events
* Can change event settings
* Can change product settings
* Can view orders
* Can change orders
* Can view vouchers
* Can change vouchers
Compatibility
-------------
We currently see pretix' API as a beta-stage feature. We therefore do not give any guarantees
for compatibility between feature releases of pretix (such as 1.5 and 1.6). However, as always,
we try not to break things when we don't need to. Any backwards-incompatible changes will be
prominently noted in the release notes.
We treat the following types of changes as *backwards-compatible* so we ask you to make sure
that your clients can deal with them properly:
* Support of new API endpoints
* Support of new HTTP methods for a given API endpoint
* Support of new query parameters for a given API endpoint
* New fields contained in API responses
We treat the following types of changes as *backwards-incompatible*:
* Type changes of fields in API responses
* New required input fields for an API endpoint
* New required type for input fields of an API endpoint
* Removal of endpoints, API methods or fields
Pagination
----------
Most lists of objects returned by pretix' API will be paginated. The response will take
the form of:
.. sourcecode:: javascript
{
"count": 117,
"next": "https://pretix.eu/api/v1/organizers/?page=2",
"previous": null,
"results": [],
}
As you can see, the response contains the total number of results in the field ``count``.
The fields ``next`` and ``previous`` contain links to the next and previous page of results,
respectively, or ``null`` if there is no such page. You can use those URLs to retrieve the
respective page.
The field ``results`` contains a list of objects representing the first results. For most
objects, every page contains 50 results.
Conditional fetching
--------------------
If you pull object lists from pretix' APIs regularly, we ask you to implement conditional fetching
to avoid unnecessary data traffic. This is not supported on all resources and we currently implement
two different mechanisms for different resources, which is necessary because we can only obtain best
efficiency for resources that do not support deletion operations.
Object-level conditional fetching
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The :ref:`rest-orders` resource list contains an HTTP header called ``X-Page-Generated`` containing the
current time on the server in ISO 8601 format. On your next request, you can pass this header
(as is, without any modifications necessary) as the ``modified_since`` query parameter and you will receive
a list containing only objects that have changed in the time since your last request.
List-level conditional fetching
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If modification checks are not possible with this granularity, you can instead check for the full list.
In this case, the list of objects may contain a regular HTTP header ``Last-Modified`` with the date of the
last modification to any item of that resource. You can then pass this date back in your next request in the
``If-Modified-Since`` header. If the any object has changed in the meantime, you will receive back a full list
(if something it missing, this means the object has been deleted). If nothing happened, we'll send back a
``304 Not Modified`` return code.
This is currently implemented on the following resources:
* :ref:`rest-categories`
* :ref:`rest-items`
* :ref:`rest-questions`
* :ref:`rest-quotas`
* :ref:`rest-subevents`
* :ref:`rest-taxrules`
Errors
------
Error responses (of type 400-499) are returned in one of the following forms, depending on
the type of error. General errors look like:
.. sourcecode:: http
HTTP/1.1 405 Method Not Allowed
Content-Type: application/json
Content-Length: 42
{"detail": "Method 'DELETE' not allowed."}
Field specific input errors include the name of the offending fields as keys in the response:
.. sourcecode:: http
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 94
{"amount": ["A valid integer is required."], "description": ["This field may not be blank."]}
If you see errors of type ``429 Too Many Requests``, you should read our documentation on :ref:`rest-ratelimit`.
Data types
----------
All structured API responses are returned in JSON format using standard JSON data types such
as integers, floating point numbers, strings, lists, objects and booleans. Most fields can
be ``null`` as well.
The following table shows some data types that have no native JSON representation and how
we serialize them to JSON.
===================== ============================ ===================================
Internal pretix type JSON representation Examples
===================== ============================ ===================================
Datetime String in ISO 8601 format ``"2017-12-27T10:00:00Z"``
with timezone (normally UTC) ``"2017-12-27T10:00:00.596934Z"``,
``"2017-12-27T10:00:00+02:00"``
Date String in ISO 8601 format ``2017-12-27``
Multi-lingual string Object of strings ``{"en": "red", "de": "rot", "de_Informal": "rot"}``
Money String with decimal number ``"23.42"``
Currency String with ISO 4217 code ``"EUR"``, ``"USD"``
===================== ============================ ===================================
Query parameters
^^^^^^^^^^^^^^^^
Most list endpoints allow a filtering of the results using query parameters. In this case, booleans should be passed
as the string values ``true`` and ``false``.
If the ``ordering`` parameter is documented for a resource, you can use it to sort the result set by one of the allowed
fields. Prepend a ``-`` to the field name to reverse the sort order.
.. _CSRF policies: https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax

BIN
doc/api/img/token_form.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

20
doc/api/index.rst Normal file
View File

@@ -0,0 +1,20 @@
.. _`rest-api`:
REST API
========
This part of the documentation contains information about the REST-style API
exposed by pretix since version 1.5 that can be used by third-party programs
to interact with pretix and its data structures.
Currently, the API provides mostly read-only capabilities, but it will be extended
in functionality over time.
.. toctree::
:maxdepth: 2
fundamentals
auth
resources/index
ratelimit
webhooks

207
doc/api/oauth.rst Normal file
View File

@@ -0,0 +1,207 @@
.. _`rest-oauth`:
OAuth authentication / "Connect with pretix"
============================================
In addition to static tokens, pretix supports `OAuth2`_-based authentication starting with
pretix 1.16. This allows you to put a "Connect with pretix" button into your website or tool
that allows the user to easily set up a connection between the two systems.
If you haven't worked with OAuth before, have a look at the `OAuth2 Simplified`_ tutorial.
Registering an application
--------------------------
To use OAuth, you need to register your application with the pretix instance you want to connect to.
In order to do this, log in to your pretix account and go to your user settings. Click on "Authorized applications"
first and then on "Manage your own apps". From there, you can "Create a new application".
You should fill in a descriptive name of your application that allows users to recognize who you are. You also need to
give a list of fully-qualified URLs that users will be redirected to after a successful authorization. After you pressed
"Save", you will be presented with a client ID and a client secret. Please note them down and treat the client secret
like a password; it should not become available to your users.
Obtaining an authorization grant
--------------------------------
To authorize a new user, link or redirect them to the ``authorize`` endpoint, passing your client ID as a query
parameter. Additionally, you can pass a scope (currently either ``read``, ``write``, or ``read write``)
and an URL the user should be redirected to after successful or failed authorization. You also need to pass the
``response_type`` parameter with a value of ``code``. Example::
https://pretix.eu/api/v1/oauth/authorize?client_id=lsLi0hNL0vk53mEdYjNJxHUn1PcO1R6wVg81dLNT&response_type=code&scope=read+write&redirect_uri=https://pretalx.com
To prevent CSRF attacks, you can also optionally pass a ``state`` parameter with a random string. Later, when
redirecting back to your application, we will pass the same ``state`` parameter back to you, so you can compare if they
match.
After the user granted or denied access, they will be redirected back either to the ``redirect_url`` you passed in the
query or to the first redirect URL configured in your application settings.
On successful registration, we will append the query parameter ``code`` to the URL containing an authorization code.
For example, we might redirect the user to this URL::
https://pretalx.com/?code=eYBBf8gmeD4E01HLoj0XflqO4Lg3Cw&state=e3KCh9mfx07qxU4bRpXk
You will need this ``code`` parameter to perform the next step.
On a failed registration, a query string like ``?error=access_denied`` will be appended to the redirection URL.
.. note:: In this step, the user is allowed to restrict your access to certain organizer accounts. If you try to
re-authenticate the user later, the user might be instantly redirected back to you if authorization is already
given and would therefore be unable to review their organizer restriction settings. You can append the
``approval_prompt=force`` query parameter if you want to make sure the user actively needs to confirm the
authorization.
Getting an access token
-----------------------
Using the ``code`` value you obtained above and your client ID, you can now request an access token that actually gives
access to the API. The ``token`` endpoint expects you to authenticate using `HTTP Basic authentication`_ using your client
ID as a username and your client secret as a password. You are also required to again supply the same ``redirect_uri``
parameter that you used for the authorization.
.. http:get:: /api/v1/oauth/token
Request a new access token
**Example request**:
.. sourcecode:: http
POST /api/v1/oauth/token HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Authorization: Basic bHNMaTBoTkwwdms1M21FZFlqTkp4SFVuMVBjTzFSNndWZzgxZExOVDplSmpzZVA0UjJMN0hMcjBiS0p1b3BmbnJtT2cyY3NDeTdYaFVVZ0FoalhUU0NhZHhRTjk3cVNvMkpPaXlWTFpQOEozaTVQd1FVdFIwNUNycG5ac2Z0bXJjdmNTbkZ1SkFmb2ZsUTdZUDRpSjZNTWFYTHIwQ0FpNlhIRFJjV1Awcg==
grant_type=authorization_code&code=eYBBf8gmeD4E01HLoj0XflqO4Lg3Cw&redirect_uri=https://pretalx.com
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"access_token": "i3ytqTSRWsKp16fqjekHXa4tdM4qNC",
"expires_in": 86400,
"token_type": "Bearer",
"scope": "read write",
"refresh_token": "XBK0r8z4A4TTeR9LyMUyU2AM5rqpXp"
}
:statuscode 200: no error
:statuscode 401: Authentication failure
As you can see, you receive two types of tokens: One "access token", and one "refresh token". The access token is valid
for a day and can be used to actually access the API. The refresh token does not have an expiration date and can be used
to obtain a new access_token after a day, so you should make sure to store the access token safely if you need long-term
access.
Using the API with an access token
----------------------------------
You can supply a valid access token as a ``Bearer``-type token in the ``Authorization`` header to get API access.
.. sourcecode:: http
:emphasize-lines: 3
GET /api/v1/organizers/ HTTP/1.1
Host: pretix.eu
Authorization: Bearer i3ytqTSRWsKp16fqjekHXa4tdM4qNC
Refreshing an access token
--------------------------
You can obtain a new access token using your refresh token any time. This can be done using the same ``token`` endpoint
used to obtain the first access token above, but with a different set of parameters:
.. sourcecode:: http
POST /api/v1/oauth/token HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Authorization: Basic bHNMaTBoTkwwdms1M21FZFlqTkp4SFVuMVBjTzFSNndWZzgxZExOVDplSmpzZVA0UjJMN0hMcjBiS0p1b3BmbnJtT2cyY3NDeTdYaFVVZ0FoalhUU0NhZHhRTjk3cVNvMkpPaXlWTFpQOEozaTVQd1FVdFIwNUNycG5ac2Z0bXJjdmNTbkZ1SkFmb2ZsUTdZUDRpSjZNTWFYTHIwQ0FpNlhIRFJjV1Awcg==
grant_type=refresh_token&refresh_token=XBK0r8z4A4TTeR9LyMUyU2AM5rqpXp
The previous access token will instantly become invalid.
Revoking a token
----------------
If you don't need a token any more or if you believe it may have been compromised, you can use the ``revoke_token``
endpoint to revoke it.
.. http:get:: /api/v1/oauth/revoke_token
Revoke an access or refresh token. If you revoke an access token, you can still create a new one using the refresh token. If you
revoke a refresh token, the connected access token will also be revoked.
**Example request**:
.. sourcecode:: http
POST /api/v1/oauth/revoke_token HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Authorization: Basic bHNMaTBoTkwwdms1M21FZFlqTkp4SFVuMVBjTzFSNndWZzgxZExOVDplSmpzZVA0UjJMN0hMcjBiS0p1b3BmbnJtT2cyY3NDeTdYaFVVZ0FoalhUU0NhZHhRTjk3cVNvMkpPaXlWTFpQOEozaTVQd1FVdFIwNUNycG5ac2Z0bXJjdmNTbkZ1SkFmb2ZsUTdZUDRpSjZNTWFYTHIwQ0FpNlhIRFJjV1Awcg==
token=XBK0r8z4A4TTeR9LyMUyU2AM5rqpXp
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
:statuscode 200: no error
:statuscode 401: Authentication failure
If you want to revoke your client secret, you can generate a new one in the list of your managed applications in the
pretix user interface.
Fetching the user profile
-------------------------
If you need the user's meta data, you can fetch it here:
.. http:get:: /api/v1/me
Returns the profile of the authenticated user
**Example request**:
.. sourcecode:: http
GET /api/v1/me HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Authorization: Bearer i3ytqTSRWsKp16fqjekHXa4tdM4qNC
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
email: "admin@localhost",
fullname: "John Doe",
locale: "de",
timezone: "Europe/Berlin"
}
:statuscode 200: no error
:statuscode 401: Authentication failure
.. _OAuth2: https://en.wikipedia.org/wiki/OAuth
.. _OAuth2 Simplified: https://aaronparecki.com/oauth-2-simplified/
.. _HTTP Basic authentication: https://en.wikipedia.org/wiki/Basic_access_authentication

31
doc/api/ratelimit.rst Normal file
View File

@@ -0,0 +1,31 @@
.. _`rest-ratelimit`:
Rate limiting
=============
.. note:: This page only applies to the pretix Hosted service at pretix.eu. APIs of custom pretix installations do not
enforce any rate limiting by default.
All authenticated requests to pretix' API are rate limited. If you exceed the limits, you will receive a response
with HTTP status code ``429 Too Many Requests``. This response will have a ``Retry-After`` header, containing the number
of seconds you are supposed to wait until you try again. We expect that all API clients respect this. If you continue
to burst requests after a ``429`` status code, we might get in touch with you or, in extreme cases, disable your API
access.
Currently, the following rate limits apply:
.. rst-class:: rest-resource-table
===================================== =================================================================================
Authentication method Rate limit
===================================== =================================================================================
:ref:`rest-deviceauth` 360 requests per minute per device
:ref:`rest-tokenauth` 360 requests per minute per organizer account
:ref:`rest-oauth` 360 requests per minute per combination of accessed organizer and OAuth application
Session authentication *Not an officially supported authentication method for external access*
===================================== =================================================================================
If you require a higher rate limit, please get in touch at support@pretix.eu and tell us about your use case, we are
sure we can work something out.

264
doc/api/resources/carts.rst Normal file
View File

@@ -0,0 +1,264 @@
.. _rest-carts:
Cart positions
==============
The API provides limited access to the cart position data model. This API currently only allows creating and deleting
cart positions to reserve quota.
Cart position resource
----------------------
The cart position resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the cart position
cart_id string Identifier of the cart this belongs to. Needs to end
in "@api" for API-created positions.
datetime datetime Time of creation
expires datetime The cart position will expire at this time and no longer block quota
item integer ID of the item
variation integer ID of the variation (or ``null``)
price money (string) Price of this position
attendee_name string Specified attendee name for this position (or ``null``)
attendee_name_parts object of strings Composition of attendee name (i.e. first name, last name, …)
attendee_email string Specified attendee email address for this position (or ``null``)
voucher integer Internal ID of the voucher used for this position (or ``null``)
addon_to integer Internal ID of the position this position is an add-on for (or ``null``)
subevent integer ID of the date inside an event series this position belongs to (or ``null``).
answers list of objects Answers to user-defined questions
├ question integer Internal ID of the answered question
├ answer string Text representation of the answer
├ question_identifier string The question's ``identifier`` field
├ options list of integers Internal IDs of selected option(s)s (only for choice types)
└ option_identifiers list of strings The ``identifier`` fields of the selected option(s)s
===================================== ========================== =======================================================
.. versionchanged:: 1.17
This resource has been added.
Cart position endpoints
-----------------------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/cartpositions/
Returns a list of API-created cart positions.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/cartpositions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
X-Page-Generated: 2017-12-01T10:00:00Z
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"cart_id": "XwokV8FojQviD9jhtDzKvHFdlLRNMhlfo3cNjGbuK6MUTQDT@api",
"item": 1,
"variation": null,
"price": "23.00",
"attendee_name": null,
"attendee_name_parts": {},
"attendee_email": null,
"voucher": null,
"addon_to": null,
"subevent": null,
"datetime": "2018-06-11T10:00:00Z",
"expires": "2018-06-11T10:00:00Z",
"includes_tax": true,
"answers": []
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/cartpositions/(id)/
Returns information on one cart position, identified by its internal ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/cartpositions/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"cart_id": "XwokV8FojQviD9jhtDzKvHFdlLRNMhlfo3cNjGbuK6MUTQDT@api",
"item": 1,
"variation": null,
"price": "23.00",
"attendee_name": null,
"attendee_name_parts": {},
"attendee_email": null,
"voucher": null,
"addon_to": null,
"subevent": null,
"datetime": "2018-06-11T10:00:00Z",
"expires": "2018-06-11T10:00:00Z",
"includes_tax": true,
"answers": []
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the position to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 404: The requested cart position does not exist.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/cartpositions/
Creates a new cart position.
.. warning:: This endpoint is considered **experimental**. It might change at any time without prior notice.
.. warning::
This endpoint is intended for advanced users. It is not designed to be used to build your own shop frontend.
There is a lot that it does not or can not do, and you will need to be careful using it.
It allows to bypass many of the restrictions imposed when creating a cart through the
regular shop.
Specifically, this endpoint currently
* does not validate if products are only to be sold in a specific time frame
* does not validate if the event's ticket sales are already over or haven't started
* does not support add-on products at the moment
* does not check or calculate prices but believes any prices you send
* does not support the redemption of vouchers
* does not prevent you from buying items that can only be bought with a voucher
* does not support file upload questions
You can supply the following fields of the resource:
* ``cart_id`` (optional, needs to end in ``@api``)
* ``item``
* ``variation`` (optional)
* ``price``
* ``attendee_name`` **or** ``attendee_name_parts`` (optional)
* ``attendee_email`` (optional)
* ``subevent`` (optional)
* ``expires`` (optional)
* ``includes_tax`` (optional)
* ``answers``
* ``question``
* ``answer``
* ``options``
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/cartpositions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"item": 1,
"variation": null,
"price": "23.00",
"attendee_name_parts": {
"given_name": "Peter",
"family_name": "Miller"
},
"attendee_email": null,
"answers": [
{
"question": 1,
"answer": "23",
"options": []
}
],
"subevent": null
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
(Full cart position resource, see above.)
:param organizer: The ``slug`` field of the organizer of the event to create a position for
:param event: The ``slug`` field of the event to create a position for
:statuscode 201: no error
:statuscode 400: The item could not be created due to invalid submitted data or lack of quota.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this
order.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/cartpositions/(id)/
Deletes a cart position, identified by its internal ID.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/cartpositions/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
Content-Type: application/json
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the position to delete
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 404: The requested cart position does not exist.

View File

@@ -0,0 +1,239 @@
.. _`rest-categories`:
Item categories
===============
Resource description
--------------------
Categories provide grouping for items (better known as products).
The category resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the category
name multi-lingual string The category's visible name
internal_name string An optional name that is only used in the backend
description multi-lingual string A public description (might include markdown, can
be ``null``)
position integer An integer, used for sorting the categories
is_addon boolean If ``True``, items within this category are not on sale
on their own but the category provides a source for
defining add-ons for other products.
===================================== ========================== =======================================================
.. versionchanged:: 1.14
The operations POST, PATCH, PUT and DELETE have been added.
.. versionchanged:: 1.16
The field ``internal_name`` has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/categories/
Returns a list of all categories within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/categories/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "Tickets"},
"internal_name": "",
"description": {"en": "Tickets are what you need to get in."},
"position": 1,
"is_addon": false
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean is_addon: If set to ``true`` or ``false``, only categories with this value for the field ``is_addon`` will be
returned.
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
Default: ``position``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/categories/(id)/
Returns information on one category, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/categories/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Tickets"},
"internal_name": "",
"description": {"en": "Tickets are what you need to get in."},
"position": 1,
"is_addon": false
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the category to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/categories/
Creates a new category
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/categories/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"name": {"en": "Tickets"},
"internal_name": "",
"description": {"en": "Tickets are what you need to get in."},
"position": 1,
"is_addon": false
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Tickets"},
"internal_name": "",
"description": {"en": "Tickets are what you need to get in."},
"position": 1,
"is_addon": false
}
:param organizer: The ``slug`` field of the organizer of the event to create a category for
:param event: The ``slug`` field of the event to create a category for
:statuscode 201: no error
:statuscode 400: The category could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/categories/(id)/
Update a category. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/categories/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"is_addon": true
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Tickets"},
"internal_name": "",
"description": {"en": "Tickets are what you need to get in."},
"position": 1,
"is_addon": true
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the category to modify
:statuscode 200: no error
:statuscode 400: The category could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/category/(id)/
Delete a category.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/categories/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the category to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,640 @@
Check-in lists
==============
Resource description
--------------------
You can create check-in lists that you can use e.g. at the entrance of your event to track who is coming and if they
actually bought a ticket.
You can create multiple check-in lists to separate multiple parts of your event, for example if you have separate
entries for multiple ticket types. Different check-in lists are completely independent: If a ticket shows up on two
lists, it is valid once on every list. This might be useful if you run a festival with festival passes that allow
access to every or multiple performances as well as tickets only valid for single performances.
The check-in list resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the check-in list
name string The internal name of the check-in list
all_products boolean If ``true``, the check-in lists contains tickets of all products in this event. The ``limit_products`` field is ignored in this case.
limit_products list of integers List of item IDs to include in this list.
subevent integer ID of the date inside an event series this list belongs to (or ``null``).
position_count integer Number of tickets that match this list (read-only).
checkin_count integer Number of check-ins performed on this list (read-only).
include_pending boolean If ``true``, the check-in list also contains tickets from orders in pending state.
===================================== ========================== =======================================================
.. versionchanged:: 1.10
This resource has been added.
.. versionchanged:: 1.11
The ``positions`` endpoints have been added.
.. versionchanged:: 1.13
The ``include_pending`` field has been added.
Endpoints
---------
.. versionchanged:: 1.15
The ``../status/`` detail endpoint has been added.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/
Returns a list of all check-in lists within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/checkinlists/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Default list",
"checkin_count": 123,
"position_count": 456,
"all_products": true,
"limit_products": [],
"include_pending": false,
"subevent": null
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query integer subevent: Only return check-in lists of the sub-event with the given ID
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(id)/
Returns information on one check-in list, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": "Default list",
"checkin_count": 123,
"position_count": 456,
"all_products": true,
"limit_products": [],
"include_pending": false,
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the check-in list to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(id)/status/
Returns detailed status information on a check-in list, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/status/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"checkin_count": 17,
"position_count": 42,
"event": {
"name": "Demo Converence",
},
"items": [
{
"name": "T-Shirt",
"id": 1,
"checkin_count": 1,
"admission": False,
"position_count": 1,
"variations": [
{
"value": "Red",
"id": 1,
"checkin_count": 1,
"position_count": 12
},
{
"value": "Blue",
"id": 2,
"checkin_count": 4,
"position_count": 8
}
]
},
{
"name": "Ticket",
"id": 2,
"checkin_count": 15,
"admission": True,
"position_count": 22,
"variations": []
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the check-in list to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/
Creates a new check-in list.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/checkinlists/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"name": "VIP entry",
"all_products": false,
"limit_products": [1, 2],
"subevent": null
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 2,
"name": "VIP entry",
"checkin_count": 0,
"position_count": 0,
"all_products": false,
"limit_products": [1, 2],
"include_pending": false,
"subevent": null
}
:param organizer: The ``slug`` field of the organizer of the event/item to create a list for
:param event: The ``slug`` field of the event to create a list for
:statuscode 201: no error
:statuscode 400: The list could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(id)/
Update a check-in list. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field and the ``checkin_count`` and ``position_count``
fields.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"name": "Backstage",
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 2,
"name": "Backstage",
"checkin_count": 23,
"position_count": 42,
"all_products": false,
"limit_products": [1, 2],
"include_pending": false,
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the list to modify
:statuscode 200: no error
:statuscode 400: The list could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/checkinlist/(id)/
Delete a check-in list. Note that this also deletes the information on all check-ins performed via this list.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/checkinlist/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the check-in list to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.
Order position endpoints
------------------------
.. versionchanged:: 1.15
The order positions endpoint has been extended by the filter queries ``item__in``, ``variation__in``,
``order__status__in``, ``subevent__in``, ``addon_to__in``, and ``search``. The search for attendee names and order
codes is now case-insensitive.
The ``.../redeem/`` endpoint has been added.
.. versionchanged:: 2.0
The order positions endpoint has been extended by the filter queries ``voucher`` and ``voucher__code``.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(list)/positions/
Returns a list of all order positions within a given event. The result is the same as
the :ref:`order-position-resource`, with one important difference: the ``checkins`` value will only include
check-ins for the selected list.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/positions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 23442,
"order": "ABC12",
"positionid": 1,
"item": 1345,
"variation": null,
"price": "23.00",
"attendee_name": "Peter",
"attendee_name_parts": {
"full_name": "Peter",
},
"attendee_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"pseudonymization_id": "MQLJvANO3B",
"checkins": [
{
"list": 1,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"answer": "Foo",
"options": []
}
],
"downloads": [
{
"output": "pdf",
"url": "https://pretix.eu/api/v1/organizers/bigevents/events/sampleconf/orderpositions/23442/download/pdf/"
}
]
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``order__code``,
``order__datetime``, ``positionid``, ``attendee_name``, ``last_checked_in`` and ``order__email``. Default:
``attendee_name,positionid``
:query string order: Only return positions of the order with the given order code
:query string search: Fuzzy search matching the attendee name, order code, invoice address name as well as to the beginning of the secret.
:query integer item: Only return positions with the purchased item matching the given ID.
:query integer item__in: Only return positions with the purchased item matching one of the given comma-separated IDs.
:query integer variation: Only return positions with the purchased item variation matching the given ID.
:query integer variation__in: Only return positions with one of the purchased item variation matching the given
comma-separated IDs.
:query string attendee_name: Only return positions with the given value in the attendee_name field. Also, add-on
products positions are shown if they refer to an attendee with the given name.
:query string secret: Only return positions with the given ticket secret.
:query string order__status: Only return positions with the given order status.
:query string order__status__in: Only return positions with one the given comma-separated order status.
:query boolean has_checkin: If set to ``true`` or ``false``, only return positions that have or have not been
checked in already.
:query integer subevent: Only return positions of the sub-event with the given ID
:query integer subevent__in: Only return positions of one of the sub-events with the given comma-separated IDs
:query integer addon_to: Only return positions that are add-ons to the position with the given ID.
:query integer addon_to__in: Only return positions that are add-ons to one of the positions with the given
comma-separated IDs.
:query string voucher: Only return positions with a specific voucher.
:query string voucher__code: Only return positions with a specific voucher code.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param list: The ID of the check-in list to look for
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 404: The requested check-in list does not exist.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(list)/positions/(id)/
Returns information on one order position, identified by its internal ID.
The result format is the same as the :ref:`order-position-resource`, with one important difference: the
``checkins`` value will only include check-ins for the selected list.
**Instead of an ID, you can also use the ``secret`` field as the lookup parameter.**
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/positions/23442/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 23442,
"order": "ABC12",
"positionid": 1,
"item": 1345,
"variation": null,
"price": "23.00",
"attendee_name": "Peter",
"attendee_name_parts": {
"full_name": "Peter",
},
"attendee_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"pseudonymization_id": "MQLJvANO3B",
"checkins": [
{
"list": 1,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"answer": "Foo",
"options": []
}
],
"downloads": [
{
"output": "pdf",
"url": "https://pretix.eu/api/v1/organizers/bigevents/events/sampleconf/orderpositions/23442/download/pdf/"
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param list: The ID of the check-in list to look for
:param id: The ``id`` field of the order position to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 404: The requested order position or check-in list does not exist.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/checkinlists/(list)/positions/(id)/redeem/
Tries to redeem an order position, identified by its internal ID, i.e. checks the attendee in. This endpoint
accepts a number of optional requests in the body.
**Instead of an ID, you can also use the ``secret`` field as the lookup parameter.**
:<json boolean questions_supported: When this parameter is set to ``true``, handling of questions is supported. If
you do not implement question handling in your user interface, you **must**
set this to ``false``. In that case, questions will just be ignored. Defaults
to ``true``.
:<json datetime datetime: Specifies the datetime of the check-in. If not supplied, the current time will be used.
:<json boolean force: Specifies that the check-in should succeed regardless of previous check-ins or required
questions that have not been filled. Defaults to ``false``.
:<json boolean ignore_unpaid: Specifies that the check-in should succeed even if the order is in pending state.
Defaults to ``false``.
:<json string nonce: You can set this parameter to a unique random value to identify this check-in. If you're sending
this request twice with the same nonce, the second request will also succeed but will always
create only one check-in object even when the previous request was successful as well. This
allows for a certain level of idempotency and enables you to re-try after a connection failure.
:<json object answers: If questions are supported/required, you may/must supply a mapping of question IDs to their
respective answers. The answers should always be strings. In case of (multiple-)choice-type
answers, the string should contain the (comma-separated) IDs of the selected options.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/checkinlists/1/positions/234/redeem/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
{
"force": false,
"ignore_unpaid": false,
"nonce": "Pvrk50vUzQd0DhdpNRL4I4OcXsvg70uA",
"datetime": null,
"questions_supported": true,
"answers": {
"4": "XS"
}
}
**Example successful response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"status": "ok"
}
**Example response with required questions**:
.. sourcecode:: http
HTTP/1.1 400 Bad Request
Content-Type: text/json
{
"status": "incomplete"
"questions": [
{
"id": 1,
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 1,
"identifier": "WY3TP9SL",
"ask_during_checkin": true,
"options": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 0,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 1,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 2,
"answer": {"en": "L"}
}
]
}
]
}
**Example error response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "error",
"reason": "unpaid",
}
Possible error reasons:
* ``unpaid`` - Ticket is not paid for or has been refunded
* ``already_redeemed`` - Ticket already has been redeemed
* ``product`` - Tickets with this product may not be scanned at this device
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param list: The ID of the check-in list to look for
:param id: The ``id`` field of the order position to fetch
:statuscode 201: no error
:statuscode 400: Invalid or incomplete request, see above
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 404: The requested order position or check-in list does not exist.

View File

@@ -0,0 +1,401 @@
Events
======
Resource description
--------------------
The event resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
name multi-lingual string The event's full name
slug string A short form of the name, used e.g. in URLs.
live boolean If ``true``, the event ticket shop is publicly
available.
currency string The currency this event is handled in.
date_from datetime The event's start date
date_to datetime The event's end date (or ``null``)
date_admission datetime The event's admission date (or ``null``)
is_public boolean If ``true``, the event shows up in places like the
organizer's public list of events
presale_start datetime The date at which the ticket shop opens (or ``null``)
presale_end datetime The date at which the ticket shop closes (or ``null``)
location multi-lingual string The event location (or ``null``)
has_subevents boolean ``True`` if the event series feature is active for this
event. Cannot change after event is created.
meta_data dict Values set for organizer-specific meta data parameters.
plugins list A list of package names of the enabled plugins for this
event.
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The ``meta_data`` field has been added.
.. versionchanged:: 1.15
The ``plugins`` field has been added.
The operations POST, PATCH, PUT and DELETE have been added.
.. versionchanged:: 2.1
Filters have been added to the list of events.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/
Returns a list of all events within a given organizer the authenticated user/token has access to.
Permission required: "Can change event settings"
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": null,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.banktransfer"
"pretix.plugins.stripe"
"pretix.plugins.paypal"
"pretix.plugins.ticketoutputpdf"
]
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:query is_public: If set to ``true``/``false``, only events with a matching value of ``is_public`` are returned.
:query live: If set to ``true``/``false``, only events with a matching value of ``live`` are returned.
:query has_subevents: If set to ``true``/``false``, only events with a matching value of ``has_subevents`` are returned.
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned. Event series are never (always) returned.
:query is_past: If set to ``true`` (``false``), only events that are over are (not) returned. Event series are never (always) returned.
:query ends_after: If set to a date and time, only events that happen during of after the given time are returned. Event series are never returned.
:param organizer: The ``slug`` field of a valid organizer
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/
Returns information on one event, identified by its slug.
Permission required: "Can change event settings"
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.banktransfer"
"pretix.plugins.stripe"
"pretix.plugins.paypal"
"pretix.plugins.ticketoutputpdf"
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.
.. http:post:: /api/v1/organizers/(organizer)/events/
Creates a new event
Please note that events cannot be created as 'live' using this endpoint. Quotas and payment must be added to the
event before sales can go live.
Permission required: "Can create events"
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.stripe",
"pretix.plugins.paypal"
]
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.stripe",
"pretix.plugins.paypal"
]
}
:param organizer: The ``slug`` field of the organizer of the event to create.
:statuscode 201: no error
:statuscode 400: The event could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to create this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/clone/
Creates a new event with properties as set in the request body. The properties that are copied are: 'is_public',
settings, plugin settings, items, variations, add-ons, quotas, categories, tax rules, questions.
If the 'plugins' and/or 'is_public' fields are present in the post body this will determine their value. Otherwise
their value will be copied from the existing event.
Please note that you can only copy from events under the same organizer.
Permission required: "Can create events"
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/clone/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.stripe",
"pretix.plugins.paypal"
]
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.stripe",
"pretix.plugins.paypal"
]
}
:param organizer: The ``slug`` field of the organizer of the event to create.
:param event: The ``slug`` field of the event to copy settings and items from.
:statuscode 201: no error
:statuscode 400: The event could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/
Updates an event
Permission required: "Can change event settings"
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"plugins": [
"pretix.plugins.banktransfer",
"pretix.plugins.stripe",
"pretix.plugins.paypal",
"pretix.plugins.pretixdroid"
]
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
"slug": "sampleconf",
"live": false,
"currency": "EUR",
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"is_public": false,
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.banktransfer",
"pretix.plugins.stripe",
"pretix.plugins.paypal",
"pretix.plugins.pretixdroid"
]
}
:param organizer: The ``slug`` field of the organizer of the event to update
:param event: The ``slug`` field of the event to update
:statuscode 201: no error
:statuscode 400: The event could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/
Delete an event. Note that events with orders cannot be deleted to ensure data integrity.
Permission required: "Can change event settings"
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,24 @@
Resources and endpoints
=======================
.. toctree::
:maxdepth: 2
organizers
events
subevents
taxrules
categories
items
item_variations
item_add-ons
questions
question_options
quotas
orders
invoices
vouchers
checkinlists
waitinglist
carts
webhooks

View File

@@ -0,0 +1,281 @@
Invoices
========
Resource description
--------------------
The invoice resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
number string Invoice number (with prefix)
order string Order code of the order this invoice belongs to
is_cancellation boolean ``True``, if this invoice is the cancellation of a
different invoice.
invoice_from string Sender address
invoice_to string Receiver address
date date Invoice date
refers string Invoice number of an invoice this invoice refers to
(for example a cancellation refers to the invoice it
cancels) or ``null``.
locale string Invoice locale
introductory_text string Text to be printed above the product list
additional_text string Text to be printed below the product list
payment_provider_text string Text to be printed below the product list with
payment information
footer_text string Text to be printed in the page footer area
lines list of objects The actual invoice contents
├ description string Text representing the invoice line (e.g. product name)
├ gross_value money (string) Price including taxes
├ tax_value money (string) Tax amount included
├ tax_name string Name of used tax rate (e.g. "VAT")
└ tax_rate decimal (string) Used tax rate
foreign_currency_display string If the invoice should also show the total and tax
amount in a different currency, this contains the
currency code (``null`` otherwise).
foreign_currency_rate decimal (string) If ``foreign_currency_rate`` is set and the system
knows the exchange rate to the event currency at
invoicing time, it is stored here.
foreign_currency_rate_date date If ``foreign_currency_rate`` is set, this signifies the
date at which the currency rate was obtained.
internal_reference string Customer's reference to be printed on the invoice.
===================================== ========================== =======================================================
.. versionchanged:: 1.6
The attribute ``invoice_no`` has been dropped in favor of ``number`` which includes the number including the prefix,
since the prefix can now vary. Also, invoices now need to be identified by their ``number`` instead of the raw
number.
.. versionchanged:: 1.7
The attributes ``lines.tax_name``, ``foreign_currency_display``, ``foreign_currency_rate``, and
``foreign_currency_rate_date`` have been added.
.. versionchanged:: 1.9
The attribute ``internal_reference`` has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/
Returns a list of all invoices within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"number": "SAMPLECONF-00001",
"order": "ABC12",
"is_cancellation": false,
"invoice_from": "Big Events LLC\nDemo street 12\nDemo town",
"invoice_to": "Sample company\nJohn Doe\nTest street 12\n12345 Testington\nTestikistan\nVAT ID: EU123456789",
"date": "2017-12-01",
"refers": null,
"locale": "en",
"introductory_text": "thank you for your purchase of the following items:",
"internal_reference": "",
"additional_text": "We are looking forward to see you on our conference!",
"payment_provider_text": "Please transfer the money to our account ABC…",
"footer_text": "Big Events LLC - Registration No. 123456 - VAT ID: EU0987654321",
"lines": [
{
"description": "Budget Ticket",
"gross_value": "23.00",
"tax_value": "0.00",
"tax_name": "VAT",
"tax_rate": "0.00"
}
],
"foreign_currency_display": "PLN",
"foreign_currency_rate": "4.2408",
"foreign_currency_rate_date": "2017-07-24"
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean is_cancellation: If set to ``true`` or ``false``, only invoices with this value for the field
``is_cancellation`` will be returned.
:query string order: If set, only invoices belonging to the order with the given order code will be returned.
:query string refers: If set, only invoices referring to the given invoice will be returned.
:query string locale: If set, only invoices with the given locale will be returned.
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``date`` and
``nr`` (equals to ``number``). Default: ``nr``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/(number)/
Returns information on one invoice, identified by its invoice number.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/SAMPLECONF-00001/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"number": "SAMPLECONF-00001",
"order": "ABC12",
"is_cancellation": false,
"invoice_from": "Big Events LLC\nDemo street 12\nDemo town",
"invoice_to": "Sample company\nJohn Doe\nTest street 12\n12345 Testington\nTestikistan\nVAT ID: EU123456789",
"date": "2017-12-01",
"refers": null,
"locale": "en",
"introductory_text": "thank you for your purchase of the following items:",
"internal_reference": "",
"additional_text": "We are looking forward to see you on our conference!",
"payment_provider_text": "Please transfer the money to our account ABC…",
"footer_text": "Big Events LLC - Registration No. 123456 - VAT ID: EU0987654321",
"lines": [
{
"description": "Budget Ticket",
"gross_value": "23.00",
"tax_value": "0.00",
"tax_name": "VAT",
"tax_rate": "0.00"
}
],
"foreign_currency_display": "PLN",
"foreign_currency_rate": "4.2408",
"foreign_currency_rate_date": "2017-07-24"
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param invoice_no: The ``invoice_no`` field of the invoice to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/(invoice_no)/download/
Download an invoice in PDF format.
Note that in some cases the PDF file might not yet have been created. In that case, you will receive a status
code :http:statuscode:`409` and you are expected to retry the request after a short period of waiting.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/00001/download/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/pdf
...
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param invoice_no: The ``invoice_no`` field of the invoice to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
:statuscode 409: The file is not yet ready and will now be prepared. Retry the request after waiting for a few
seconds.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/invoices/(invoice_no)/reissue/
Cancels the invoice and creates a new one.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/00001/reissue/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
Content-Type: application/pdf
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param invoice_no: The ``invoice_no`` field of the invoice to reissue
:statuscode 200: no error
:statuscode 400: The invoice has already been canceled
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/invoices/(invoice_no)/regenerate/
Re-generates the invoice from order data.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/00001/regenerate/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
Content-Type: application/pdf
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param invoice_no: The ``invoice_no`` field of the invoice to regenerate
:statuscode 200: no error
:statuscode 400: The invoice has already been canceled
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.

View File

@@ -0,0 +1,246 @@
Item add-ons
============
Resource description
--------------------
With add-ons, you can specify products that can be bought as an addition to this specific product. For example, if you
host a conference with a base conference ticket and a number of workshops, you could define the workshops as add-ons to
the conference ticket. With this configuration, the workshops cannot be bought on their own but only in combination with
a conference ticket. You can here specify categories of products that can be used as add-ons to this product. You can
also specify the minimum and maximum number of add-ons of the given category that can or need to be chosen. The user can
buy every add-on from the category at most once. If an add-on product has multiple variations, only one of them can be
bought.
The add-ons resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the add-on
addon_category integer Internal ID of the item category the add-on can be
chosen from.
min_count integer The minimal number of add-ons that need to be chosen.
max_count integer The maximal number of add-ons that can be chosen.
position integer An integer, used for sorting
price_included boolean Adding this add-on to the item is free
===================================== ========================== =======================================================
.. versionchanged:: 1.12
This resource has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/addons/
Returns a list of all add-ons for a given item.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/11/addons/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 3,
"addon_category": 1,
"min_count": 0,
"max_count": 10,
"position": 0,
"price_included": true
},
{
"id": 4,
"addon_category": 2,
"min_count": 0,
"max_count": 10,
"position": 1,
"price_included": true
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param item: The ``id`` field of the item to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/item does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/addons/(id)/
Returns information on one add-on, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/1/addons/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 3,
"addon_category": 1,
"min_count": 0,
"max_count": 10,
"position": 1,
"price_included": true
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param item: The ``id`` field of the item to fetch
:param id: The ``id`` field of the add-on to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/bigevents/events/sampleconf/items/1/addons/
Creates a new add-on
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/(organizer)/events/(event)/items/(item)/addons/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"addon_category": 1,
"min_count": 0,
"max_count": 10,
"position": 1,
"price_included": true
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 3,
"addon_category": 1,
"min_count": 0,
"max_count": 10,
"position": 1,
"price_included": true
}
:param organizer: The ``slug`` field of the organizer of the event/item to create a add-on for
:param event: The ``slug`` field of the event to create a add-on for
:param item: The ``id`` field of the item to create a add-on for
:statuscode 201: no error
:statuscode 400: The add-on could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/addon/(id)/
Update an add-on. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/items/1/addons/3/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"min_count": 0,
"max_count": 10,
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 3,
"addon_category": 1,
"min_count": 0,
"max_count": 10,
"position": 1,
"price_included": true
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param item: The ``id`` field of the item to modify
:param id: The ``id`` field of the add-on to modify
:statuscode 200: no error
:statuscode 400: The add-on could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/addons/(id)/
Delete an add-on.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/items/1/addons/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to modify
:param id: The ``id`` field of the add-on to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,258 @@
Item variations
===============
Resource description
--------------------
Variations of items can be use for products (items) that are available in different sizes, colors or other variations
of the same product.
The variations resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the variation
default_price money (string) The price set directly for this variation or ``null``
price money (string) The price used for this variation. This is either the
same as ``default_price`` if that value is set or equal
to the item's ``default_price`` (read-only).
active boolean If ``False``, this variation will not be sold or shown.
description multi-lingual string A public description of the variation. May contain
Markdown syntax or can be ``null``.
position integer An integer, used for sorting
===================================== ========================== =======================================================
.. versionchanged:: 1.12
This resource has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/variations/
Returns a list of all variations for a given item.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/11/variations/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"value": {
"en": "S"
},
"active": true,
"description": {
"en": "Test2"
},
"position": 0,
"default_price": "223.00",
"price": 223.0
},
{
"id": 3,
"value": {
"en": "L"
},
"active": true,
"description": {},
"position": 1,
"default_price": null,
"price": 15.0
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean active: If set to ``true`` or ``false``, only items with this value for the field ``active`` will be
returned.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param item: The ``id`` field of the item to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/item does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/variations/(id)/
Returns information on one variation, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/1/variations/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 3,
"value": {
"en": "Student"
},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param item: The ``id`` field of the item to fetch
:param id: The ``id`` field of the variation to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/variations/
Creates a new variation
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/items/1/variations/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"value": {"en": "Student"},
"default_price": "10.00",
"active": true,
"description": null,
"position": 0
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
}
:param organizer: The ``slug`` field of the organizer of the event/item to create a variation for
:param event: The ``slug`` field of the event to create a variation for
:param item: The ``id`` field of the item to create a variation for
:statuscode 201: no error
:statuscode 400: The variation could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/variations/(id)/
Update a variation. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` and the ``price`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/items/1/variations/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"active": false,
"position": 1
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": false,
"description": null,
"position": 1
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to modify
:param id: The ``id`` field of the variation to modify
:statuscode 200: no error
:statuscode 400: The variation could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/variations/(id)/
Delete a variation.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/items/1/variations/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to modify
:param id: The ``id`` field of the variation to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

540
doc/api/resources/items.rst Normal file
View File

@@ -0,0 +1,540 @@
.. _rest-items:
Items
=====
Resource description
--------------------
Items (better known as products) are the things that can be sold using pretix.
The item resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the item
name multi-lingual string The item's visible name
internal_name string An optional name that is only used in the backend
default_price money (string) The item price that is applied if the price is not
overwritten by variations or other options.
category integer The ID of the category this item belongs to
(or ``null``).
active boolean If ``False``, the item is hidden from all public lists
and will not be sold.
description multi-lingual string A public description of the item. May contain Markdown
syntax or can be ``null``.
free_price boolean If ``True``, customers can change the price at which
they buy the product (however, the price can't be set
lower than the price defined by ``default_price`` or
otherwise).
tax_rate decimal (string) The VAT rate to be applied for this item.
tax_rule integer The internal ID of the applied tax rule (or ``null``).
admission boolean ``True`` for items that grant admission to the event
(such as primary tickets) and ``False`` for others
(such as add-ons or merchandise).
position integer An integer, used for sorting
picture string A product picture to be displayed in the shop
(read-only).
sales_channels list of strings Sales channels this product is available on, such as
``"web"`` or ``"resellers"``. Defaults to ``["web"]``.
available_from datetime The first date time at which this item can be bought
(or ``null``).
available_until datetime The last date time at which this item can be bought
(or ``null``).
require_voucher boolean If ``True``, this item can only be bought using a
voucher that is specifically assigned to this item.
hide_without_voucher boolean If ``True``, this item is only shown during the voucher
redemption process, but not in the normal shop
frontend.
allow_cancel boolean If ``False``, customers cannot cancel orders containing
this item.
min_per_order integer This product can only be bought if it is included at
least this many times in the order (or ``null`` for no
limitation).
max_per_order integer This product can only be bought if it is included at
most this many times in the order (or ``null`` for no
limitation).
checkin_attention boolean If ``True``, the check-in app should show a warning
that this ticket requires special attention if such
a product is being scanned.
original_price money (string) An original price, shown for comparison, not used
for price calculations.
require_approval boolean If ``True``, orders with this product will need to be
approved by the event organizer before they can be
paid.
generate_tickets boolean If ``False``, tickets are never generated for this
product, regardless of other settings. If ``True``,
tickets are generated even if this is a
non-admission or add-on product, regardless of event
settings. If this is ``null``, regular ticketing
rules apply.
has_variations boolean Shows whether or not this item has variations.
variations list of objects A list with one object for each variation of this item.
Can be empty. Only writable during creation,
use separate endpoint to modify this later.
├ id integer Internal ID of the variation
├ value multi-lingual string The "name" of the variation
├ default_price money (string) The price set directly for this variation or ``null``
├ price money (string) The price used for this variation. This is either the
same as ``default_price`` if that value is set or equal
to the item's ``default_price``.
├ active boolean If ``False``, this variation will not be sold or shown.
├ description multi-lingual string A public description of the variation. May contain
Markdown syntax or can be ``null``.
└ position integer An integer, used for sorting
addons list of objects Definition of add-ons that can be chosen for this item.
Only writable during creation,
use separate endpoint to modify this later.
├ addon_category integer Internal ID of the item category the add-on can be
chosen from.
├ min_count integer The minimal number of add-ons that need to be chosen.
├ max_count integer The maximal number of add-ons that can be chosen.
└ position integer An integer, used for sorting
└ price_included boolean Adding this add-on to the item is free
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The attribute ``tax_rule`` has been added. ``tax_rate`` is kept for compatibility. The attribute
``checkin_attention`` has been added.
.. versionchanged:: 1.12
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
The attribute ``price_included`` has been added to ``addons``.
.. versionchanged:: 1.16
The ``internal_name`` and ``original_price`` fields have been added.
.. versionchanged:: 2.0
The field ``require_approval`` has been added.
.. versionchanged:: 2.3
The ``sales_channels`` attribute has been added.
.. versionchanged:: 2.4
The ``generate_tickets`` attribute has been added.
Notes
-----
Please note that an item either always has variations or never has. Once created with variations the item can never
change to an item without and vice versa. To create an item with variations ensure that you POST an item with at least
one variation.
Also note that ``variations`` and ``addons`` are only supported on ``POST``. To update/delete variations and add-ons please
use the dedicated nested endpoints. By design this endpoint does not support ``PATCH`` and ``PUT`` with nested
``variations`` and/or ``addons``.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/
Returns a list of all items within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "Standard ticket"},
"internal_name": "",
"sales_channels": ["web"],
"default_price": "23.00",
"original_price": null,
"category": null,
"active": true,
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
"available_from": null,
"available_until": null,
"require_voucher": false,
"hide_without_voucher": false,
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"generate_tickets": null,
"require_approval": false,
"variations": [
{
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
},
{
"value": {"en": "Regular"},
"default_price": null,
"price": "23.00",
"active": true,
"description": null,
"position": 1
}
],
"addons": []
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean active: If set to ``true`` or ``false``, only items with this value for the field ``active`` will be
returned.
:query integer category: If set to the ID of a category, only items within that category will be returned.
:query boolean admission: If set to ``true`` or ``false``, only items with this value for the field ``admission``
will be returned.
:query string tax_rate: If set to a decimal value, only items with this tax rate will be returned.
:query boolean free_price: If set to ``true`` or ``false``, only items with this value for the field ``free_price``
will be returned.
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
Default: ``position``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/
Returns information on one item, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/items/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Standard ticket"},
"internal_name": "",
"sales_channels": ["web"],
"default_price": "23.00",
"original_price": null,
"category": null,
"active": true,
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
"available_from": null,
"available_until": null,
"require_voucher": false,
"hide_without_voucher": false,
"allow_cancel": true,
"generate_tickets": null,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"require_approval": false,
"variations": [
{
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
},
{
"value": {"en": "Regular"},
"default_price": null,
"price": "23.00",
"active": true,
"description": null,
"position": 1
}
],
"addons": []
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the item to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/items/
Creates a new item
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/items/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"id": 1,
"name": {"en": "Standard ticket"},
"internal_name": "",
"sales_channels": ["web"],
"default_price": "23.00",
"original_price": null,
"category": null,
"active": true,
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
"available_from": null,
"available_until": null,
"require_voucher": false,
"hide_without_voucher": false,
"allow_cancel": true,
"generate_tickets": null,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"require_approval": false,
"variations": [
{
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
},
{
"value": {"en": "Regular"},
"default_price": null,
"price": "23.00",
"active": true,
"description": null,
"position": 1
}
],
"addons": []
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Standard ticket"},
"internal_name": "",
"sales_channels": ["web"],
"default_price": "23.00",
"original_price": null,
"category": null,
"active": true,
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
"available_from": null,
"available_until": null,
"require_voucher": false,
"hide_without_voucher": false,
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"generate_tickets": null,
"checkin_attention": false,
"has_variations": true,
"require_approval": false,
"variations": [
{
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
},
{
"value": {"en": "Regular"},
"default_price": null,
"price": "23.00",
"active": true,
"description": null,
"position": 1
}
],
"addons": []
}
:param organizer: The ``slug`` field of the organizer of the event to create an item for
:param event: The ``slug`` field of the event to create an item for
:statuscode 201: no error
:statuscode 400: The item could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/
Update an item. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``has_variations``, ``variations`` and the ``addon`` field. If
you need to update/delete variations or add-ons please use the nested dedicated endpoints.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/items/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"name": {"en": "Ticket"},
"default_price": "25.00"
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "Ticket"},
"internal_name": "",
"sales_channels": ["web"],
"default_price": "25.00",
"original_price": null,
"category": null,
"active": true,
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
"available_from": null,
"available_until": null,
"require_voucher": false,
"hide_without_voucher": false,
"generate_tickets": null,
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": true,
"require_approval": false,
"variations": [
{
"value": {"en": "Student"},
"default_price": "10.00",
"price": "10.00",
"active": true,
"description": null,
"position": 0
},
{
"value": {"en": "Regular"},
"default_price": null,
"price": "23.00",
"active": true,
"description": null,
"position": 1
}
],
"addons": []
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to modify
:statuscode 200: no error
:statuscode 400: The item could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/
Delete an item.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/items/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

1764
doc/api/resources/orders.rst Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,90 @@
Organizers
==========
Resource description
--------------------
An organizers is an entity running any number of events. In pretix, every event belongs to one
organizer and various settings, such as teams and permissions, are managed on organizer level.
The organizer resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
name string The organizer's full name, i.e. the name of an
organization or company.
slug string A short form of the name, used e.g. in URLs.
===================================== ========================== =======================================================
Endpoints
---------
.. http:get:: /api/v1/organizers/
Returns a list of all organizers the authenticated user/token has access to.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"name": "Big Events LLC",
"slug": "Big Events",
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:statuscode 200: no error
:statuscode 401: Authentication failure
.. http:get:: /api/v1/organizers/(organizer)/
Returns information on one organizer account, identified by its slug.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"name": "Big Events LLC",
"slug": "Big Events",
}
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.

View File

@@ -0,0 +1,233 @@
Question options
================
Resource description
--------------------
Questions of type "choice" or "multiple choice" can have different options attached.
The options resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the option
position integer An integer, used for sorting
identifier string An arbitrary string that can be used for matching with
other sources.
answer multi-lingual string The displayed value of this option
===================================== ========================== =======================================================
.. versionchanged:: 1.12
This resource has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/questions/(question)/options/
Returns a list of all options for a given question.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/questions/11/options/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 2,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 3,
"answer": {"en": "L"}
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean active: If set to ``true`` or ``false``, only questions with this value for the field ``active`` will be
returned.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param question: The ``id`` field of the question to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/question does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/questions/(question)/options/(id)/
Returns information on one option, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/questions/1/options/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param question: The ``id`` field of the question to fetch
:param id: The ``id`` field of the option to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/questions/(question)/options/
Creates a new option
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/questions/1/options/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
{
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
}
:param organizer: The ``slug`` field of the organizer of the event/question to create a option for
:param event: The ``slug`` field of the event to create a option for
:param question: The ``id`` field of the question to create a option for
:statuscode 201: no error
:statuscode 400: The option could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/questions/(question)/options/(id)/
Update an option. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/questions/1/options/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"position": 3
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the question to modify
:param id: The ``id`` field of the option to modify
:statuscode 200: no error
:statuscode 400: The option could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/questions/(id)/options/(id)/
Delete an option.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/questions/1/options/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the question to modify
:param id: The ``id`` field of the option to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,371 @@
.. spelling:: checkin
.. _rest-questions:
Questions
=========
Resource description
--------------------
Questions define additional fields that need to be filled out by customers during checkout.
The question resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the question
question multi-lingual string The field label shown to the customer
type string The expected type of answer. Valid options:
* ``N`` number
* ``S`` one-line string
* ``T`` multi-line string
* ``B`` boolean
* ``C`` choice from a list
* ``M`` multiple choice from a list
* ``F`` file upload
* ``D`` date
* ``H`` time
* ``W`` date and time
required boolean If ``True``, the question needs to be filled out.
position integer An integer, used for sorting
items list of integers List of item IDs this question is assigned to.
identifier string An arbitrary string that can be used for matching with
other sources.
ask_during_checkin boolean If ``True``, this question will not be asked while
buying the ticket, but will show up when redeeming
the ticket instead.
options list of objects In case of question type ``C`` or ``M``, this lists the
available objects. Only writable during creation,
use separate endpoint to modify this later.
├ id integer Internal ID of the option
├ position integer An integer, used for sorting
├ identifier string An arbitrary string that can be used for matching with
other sources.
└ answer multi-lingual string The displayed value of this option
===================================== ========================== =======================================================
.. versionchanged:: 1.12
The values ``D``, ``H``, and ``W`` for the field ``type`` are now allowed and the ``ask_during_checkin`` field has
been added.
.. versionchanged:: 1.14
Write methods have been added. The attribute ``identifier`` has been added to both the resource itself and the
options resource. The ``position`` attribute has been added to the options resource.
Endpoints
---------
.. versionchanged:: 1.15
The questions endpoint has been extended by the filter queries ``ask_during_checkin``, ``requred``, and
``identifier``.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/questions/
Returns a list of all questions within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/questions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 1,
"identifier": "WY3TP9SL",
"ask_during_checkin": false,
"options": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 0,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 1,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 2,
"answer": {"en": "L"}
}
]
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
Default: ``position``
:query string identifier: Only return questions with the given identifier string
:query boolean ask_during_checkin: Only return questions that are or are not to be asked during check-in
:query boolean required: Only return questions that are or are not required to fill in
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/questions/(id)/
Returns information on one question, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/questions/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 1,
"identifier": "WY3TP9SL",
"ask_during_checkin": false,
"options": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 2,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 3,
"answer": {"en": "L"}
}
]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the question to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/questions/
Creates a new question
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/questions/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 1,
"ask_during_checkin": false,
"options": [
{
"answer": {"en": "S"}
},
{
"answer": {"en": "M"}
},
{
"answer": {"en": "L"}
}
]
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 1,
"identifier": "WY3TP9SL",
"ask_during_checkin": false,
"options": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 2,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 3,
"answer": {"en": "L"}
}
]
}
:param organizer: The ``slug`` field of the organizer of the event to create an item for
:param event: The ``slug`` field of the event to create an item for
:statuscode 201: no error
:statuscode 400: The item could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/questions/(id)/
Update a question. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``options`` field. If
you need to update/delete options please use the nested dedicated endpoints.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/items/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"position": 2
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"question": {"en": "T-Shirt size"},
"type": "C",
"required": false,
"items": [1, 2],
"position": 2,
"identifier": "WY3TP9SL",
"ask_during_checkin": false,
"options": [
{
"id": 1,
"identifier": "LVETRWVU",
"position": 1,
"answer": {"en": "S"}
},
{
"id": 2,
"identifier": "DFEMJWMJ",
"position": 2,
"answer": {"en": "M"}
},
{
"id": 3,
"identifier": "W9AH7RDE",
"position": 3,
"answer": {"en": "L"}
}
]
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the question to modify
:statuscode 200: no error
:statuscode 400: The item could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/questions/(id)/
Delete a question.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/items/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the item to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,278 @@
.. _rest-quotas:
Quotas
======
Resource description
--------------------
Quotas define how many times an item can be sold.
The quota resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the quota
name string The internal name of the quota
size integer The size of the quota or ``null`` for unlimited
items list of integers List of item IDs this quota acts on.
variations list of integers List of item variation IDs this quota acts on.
subevent integer ID of the date inside an event series this quota belongs to (or ``null``).
===================================== ========================== =======================================================
.. versionchanged:: 1.10
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/quotas/
Returns a list of all quotas within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/quotas/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7],
"subevent": null
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
Default: ``position``
:query integer subevent: Only return quotas of the sub-event with the given ID
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/quotas/(id)/
Returns information on one quota, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/quotas/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7],
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the quota to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/quotas/
Creates a new quota
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/quotas/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7],
"subevent": null
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7],
"subevent": null
}
:param organizer: The ``slug`` field of the organizer of the event/item to create a quota for
:param event: The ``slug`` field of the event to create a quota for
:statuscode 201: no error
:statuscode 400: The quota could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/quotas/(id)/
Update a quota. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/quotas/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"name": "New Ticket Quota",
"size": 100,
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 2,
"name": "New Ticket Quota",
"size": 100,
"items": [
1,
2
],
"variations": [
1,
2
],
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the quota rule to modify
:statuscode 200: no error
:statuscode 400: The quota could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/quota/(id)/
Delete a quota. Note that if you delete a quota the items the quota acts on might no longer be available for sale.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/quotas/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the quotas to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/quotas/(id)/availability/
Returns availability information on one quota, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/quotas/1/availability/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"available": true,
"available_number": 419,
"total_size": 1000,
"pending_orders": 25,
"paid_orders": 423,
"cart_positions": 7,
"blocking_vouchers": 126,
"waiting_list": 0
}
Note that ``total_size`` and ``available_number`` are ``null`` in case of unlimited quotas.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the quota to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.

View File

@@ -0,0 +1,217 @@
.. _rest-subevents:
Event series dates / Sub-events
===============================
Resource description
--------------------
Events can represent whole event series if the ``has_subevents`` property of the event is active.
In this case, many other resources are additionally connected to an event date (also called sub-event).
The sub-event resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the sub-event
name multi-lingual string The sub-event's full name
event string The slug of the parent event
active boolean If ``true``, the sub-event ticket shop is publicly
available.
date_from datetime The sub-event's start date
date_to datetime The sub-event's end date (or ``null``)
date_admission datetime The sub-event's admission date (or ``null``)
presale_start datetime The sub-date at which the ticket shop opens (or ``null``)
presale_end datetime The sub-date at which the ticket shop closes (or ``null``)
location multi-lingual string The sub-event location (or ``null``)
item_price_overrides list of objects List of items for which this sub-event overrides the
default price
├ item integer The internal item ID
└ price money (string) The price or ``null`` for the default price
variation_price_overrides list of objects List of variations for which this sub-event overrides
the default price
├ variation integer The internal variation ID
└ price money (string) The price or ``null`` for the default price
meta_data dict Values set for organizer-specific meta data parameters.
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The ``meta_data`` field has been added.
.. versionchanged:: 2.1
The ``event`` field has been added, together with filters on the list of dates and an organizer-level list.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
Returns a list of all sub-events of an event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "First Sample Conference"},
"event": "sampleconf",
"active": false,
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"presale_start": null,
"presale_end": null,
"location": null,
"item_price_overrides": [
{
"item": 2,
"price": "12.00"
}
],
"variation_price_overrides": [],
"meta_data": {}
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
:query is_past: If set to ``true`` (``false``), only events that are over are (not) returned.
:query ends_after: If set to a date and time, only events that happen during of after the given time are returned.
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/(id)/
Returns information on one sub-event, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "First Sample Conference"},
"event": "sampleconf",
"active": false,
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"presale_start": null,
"presale_end": null,
"location": null,
"item_price_overrides": [
{
"item": 2,
"price": "12.00"
}
],
"variation_price_overrides": [],
"meta_data": {}
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``slug`` field of the sub-event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/subevents/
Returns a list of all sub-events of any event series you have access to within an organizer account.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/subevents/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "First Sample Conference"},
"event": "sampleconf",
"active": false,
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"presale_start": null,
"presale_end": null,
"location": null,
"item_price_overrides": [
{
"item": 2,
"price": "12.00"
}
],
"variation_price_overrides": [],
"meta_data": {}
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:query active: If set to ``true``/``false``, only events with a matching value of ``active`` are returned.
:query event__live: If set to ``true``/``false``, only events with a matching value of ``live`` on the parent event are returned.
:query is_future: If set to ``true`` (``false``), only events that happen currently or in the future are (not) returned.
:query is_past: If set to ``true`` (``false``), only events that are over are (not) returned.
:query ends_after: If set to a date and time, only events that happen during of after the given time are returned.
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.

View File

@@ -0,0 +1,237 @@
.. _rest-taxrules:
Tax rules
=========
Resource description
--------------------
Tax rules specify how tax should be calculated for specific products. Custom taxation rule sets are currently to
available via the API.
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the tax rule
name multi-lingual string The tax rules' name
rate decimal (string) Tax rate in percent
price_includes_tax boolean If ``true`` (default), tax is assumed to be included in
the specified product price
eu_reverse_charge boolean If ``true``, EU reverse charge rules are applied
home_country string Merchant country (required for reverse charge), can be
``null`` or empty string
===================================== ========================== =======================================================
.. versionchanged:: 1.7
This resource has been added.
.. versionchanged:: 1.9
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/taxrules/
Returns a list of all tax rules configured for an event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/taxrules/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "VAT"},
"rate": "19.00",
"price_includes_tax": true,
"eu_reverse_charge": false,
"home_country": "DE"
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/taxrules/(id)/
Returns information on one tax rule, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/taxrules/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "VAT"},
"rate": "19.00",
"price_includes_tax": true,
"eu_reverse_charge": false,
"home_country": "DE"
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the tax rule to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/rule does not exist **or** you have no permission to view it.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/taxrules/
Create a new tax rule.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/taxrules/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 166
{
"name": {"en": "VAT"},
"rate": "19.00",
"price_includes_tax": true,
"eu_reverse_charge": false,
"home_country": "DE"
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "VAT"},
"rate": "19.00",
"price_includes_tax": true,
"eu_reverse_charge": false,
"home_country": "DE"
}
:param organizer: The ``slug`` field of the organizer to create a tax rule for
:param event: The ``slug`` field of the event to create a tax rule for
:statuscode 201: no error
:statuscode 400: The tax rule could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create tax rules.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/taxrules/(id)/
Update a tax rule. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/taxrules/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 34
{
"rate": "20.00",
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
{
"id": 1,
"name": {"en": "VAT"},
"rate": "20.00",
"price_includes_tax": true,
"eu_reverse_charge": false,
"home_country": "DE"
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the tax rule to modify
:statuscode 200: no error
:statuscode 400: The tax rule could not be modified due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/rule does not exist **or** you have no permission to change it.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/taxrules/(id)/
Delete a tax rule. Note that tax rules can only be deleted if they are not in use for any products, settings
or orders. If you cannot delete a tax rule, this method will return a ``403`` status code and you can only
discontinue using it everywhere else.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/taxrules/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the tax rule to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event/rule does not exist **or** you have no permission to change it **or** this tax rule cannot be deleted since it is currently in use.

View File

@@ -0,0 +1,386 @@
Vouchers
========
Resource description
--------------------
The voucher resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the voucher
code string The voucher code that is required to redeem the voucher
max_usages integer The maximum number of times this voucher can be
redeemed (default: 1).
redeemed integer The number of times this voucher already has been
redeemed.
valid_until datetime The voucher expiration date (or ``null``).
block_quota boolean If ``True``, quota is blocked for this voucher.
allow_ignore_quota boolean If ``True``, this voucher can be redeemed even if a
product is sold out and even if quota is not blocked
for this voucher.
price_mode string Determines how this voucher affects product prices.
Possible values:
* ``none`` No effect on price
* ``set`` The product price is set to the given ``value``
* ``subtract`` The product price is determined by the original price *minus* the given ``value``
* ``percent`` The product price is determined by the original price reduced by the percentage given in ``value``
value decimal (string) The value (see ``price_mode``)
item integer An ID of an item this voucher is restricted to (or ``null``)
variation integer An ID of a variation this voucher is restricted to (or ``null``)
quota integer An ID of a quota this voucher is restricted to (or
``null``). This is an exclusive alternative to
``item`` and ``variation``: A voucher can be
attached either to a specific product or to all
products within one quota or it can be available
for all items without restriction.
tag string A string that is used for grouping vouchers
comment string An internal comment on the voucher
subevent integer ID of the date inside an event series this voucher belongs to (or ``null``).
===================================== ========================== =======================================================
.. versionchanged:: 1.9
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/vouchers/
Returns a list of all vouchers within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/vouchers/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"redeemed": 0,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string code: Only show the voucher with the given voucher code.
:query integer max_usages: Only show vouchers with the given maximal number of usages.
:query integer redeemed: Only show vouchers with the given number of redemptions. Note that this doesn't tell you if
the voucher can still be redeemed, as this also depends on ``max_usages``. See the
``active`` query parameter as well.
:query boolean block_quota: If set to ``true`` or ``false``, only vouchers with this value in the field
``block_quota`` will be shown.
:query boolean allow_ignore_quota: If set to ``true`` or ``false``, only vouchers with this value in the field
``allow_ignore_quota`` will be shown.
:query string price_mode: If set, only vouchers with this value in the field ``price_mode`` will be shown (see
above).
:query string value: If set, only vouchers with this value in the field ``value`` will be shown.
:query integer item: If set, only vouchers attached to the item with the given ID will be shown.
:query integer variation: If set, only vouchers attached to the variation with the given ID will be shown.
:query integer quota: If set, only vouchers attached to the quota with the given ID will be shown.
:query string tag: If set, only vouchers with the given tag will be shown.
:query integer subevent: Only return vouchers of the sub-event with the given ID
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id``, ``code``,
``max_usages``, ``valid_until``, and ``value``. Default: ``id``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/vouchers/(id)/
Returns information on one voucher, identified by its internal ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/vouchers/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"redeemed": 0,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the voucher to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/vouchers/
Create a new voucher.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/vouchers/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 408
{
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"redeemed": 0,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to create a voucher for
:param event: The ``slug`` field of the event to create a voucher for
:statuscode 201: no error
:statuscode 400: The voucher could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
:statuscode 409: The server was unable to acquire a lock and could not process your request. You can try again after a short waiting period.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/vouchers/batch_create/
Creates multiple new vouchers atomically.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/vouchers/batch_create/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 408
[
{
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
},
{
"code": "ASDKLJCYXCASDASD",
"max_usages": 1,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "12.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
},
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
[
{
"id": 1,
"code": "43K6LKM37FBVR2YG",
}, …
}
:param organizer: The ``slug`` field of the organizer to create a vouchers for
:param event: The ``slug`` field of the event to create a vouchers for
:statuscode 201: no error
:statuscode 400: The vouchers could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource.
:statuscode 409: The server was unable to acquire a lock and could not process your request. You can try again after a short waiting period.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/vouchers/(id)/
Update a voucher. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` and ``redeemed`` fields.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/vouchers/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 408
{
"price_mode": "set",
"value": "24.00"
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"code": "43K6LKM37FBVR2YG",
"max_usages": 1,
"redeemed": 0,
"valid_until": null,
"block_quota": false,
"allow_ignore_quota": false,
"price_mode": "set",
"value": "24.00",
"item": 1,
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": "",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the voucher to modify
:statuscode 200: no error
:statuscode 400: The voucher could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource.
:statuscode 409: The server was unable to acquire a lock and could not process your request. You can try again after a short waiting period.
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/vouchers/(id)/
Delete a voucher. Note that you cannot delete a voucher if it already has been redeemed.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/vouchers/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the voucher to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource.

View File

@@ -0,0 +1,287 @@
Waiting list entries
====================
Resource description
--------------------
The waiting list entry resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the waiting list entry
created datetime Creation date of the waiting list entry
email string Email address of the user on the waiting list
voucher integer Internal ID of the voucher sent to this user. If
this field is set, the user has been sent a voucher
and is no longer waiting. If it is ``null``, the
user is still waiting.
item integer An ID of an item the user is waiting to be available
again
variation integer An ID of a variation the user is waiting to be
available again (or ``null``)
locale string Locale of the waiting user
subevent integer ID of the date inside an event series this entry belongs to (or ``null``).
===================================== ========================== =======================================================
.. versionchanged:: 1.15
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added as well as a method to send out
vouchers.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/
Returns a list of all waiting list entries within a given event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"created": "2017-12-01T10:00:00Z",
"email": "waiting@example.org",
"voucher": null,
"item": 2,
"variation": null,
"locale": "en",
"subevent": null
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string email: Only show waiting list entries created with the given email address.
:query string locale: Only show waiting list entries created with the given locale.
:query boolean has_voucher: If set to ``true`` or ``false``, only waiting list entries are returned that have or
have not been sent a voucher.
:query integer item: If set, only entries of users waiting for the item with the given ID will be shown.
:query integer variation: If set, only entries of users waiting for the variation with the given ID will be shown.
:query integer subevent: Only return entries of the sub-event with the given ID
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id``, ``created``,
``email``, ``item``. Default: ``created``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/(id)/
Returns information on one waiting list entry, identified by its internal ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"created": "2017-12-01T10:00:00Z",
"email": "waiting@example.org",
"voucher": null,
"item": 2,
"variation": null,
"locale": "en",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``id`` field of the waiting list entry to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/
Create a new entry.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 408
{
"email": "waiting@example.org",
"item": 3,
"variation": null,
"locale": "de",
"subevent": null
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 1,
"created": "2017-12-01T10:00:00Z",
"email": "waiting@example.org",
"voucher": null,
"item": 3,
"variation": null,
"locale": "de",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to create an entry for
:param event: The ``slug`` field of the event to create an entry for
:statuscode 201: no error
:statuscode 400: The voucher could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this
resource **or** entries cannot be created for this item at this time.
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/(id)/
Update an entry. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id``, ``voucher`` and ``created`` fields. You can only change
an entry as long as no ``voucher`` is set.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 408
{
"item": 4
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"created": "2017-12-01T10:00:00Z",
"email": "waiting@example.org",
"voucher": null,
"item": 4,
"variation": null,
"locale": "de",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the entry to modify
:statuscode 200: no error
:statuscode 400: The entry could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this
resource **or** entries cannot be created for this item at this time **or** this entry already
has a voucher assigned
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/(id)/send_voucher/
Manually sends a voucher to someone on the waiting list
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/1/send_voucher/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 0
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the entry to modify
:statuscode 204: no error
:statuscode 400: The voucher could not be sent out, see body for details (e.g. voucher has already been sent or
item is not available).
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to do this
.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/waitinglistentries/(id)/
Delete an entry. Note that you cannot delete an entry once it is assigned a voucher.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/events/sampleconf/waitinglistentries/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param id: The ``id`` field of the entry to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this
resource **or** this entry already has a voucher assigned.

View File

@@ -0,0 +1,242 @@
.. _`rest-webhooks`:
Webhooks
========
.. note:: This page is about how to modify webhook settings themselves through the REST API. If you just want to know
how webhooks work, go here: :ref:`webhooks`
Resource description
--------------------
The webhook resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the webhook
enabled boolean If ``False``, this webhook will not receive any notifications
target_url string The URL to call
all_events boolean If ``True``, this webhook will receive notifications
on all events of this organizer
limit_events list of strings If ``all_events`` is ``False``, this is a list of
event slugs this webhook is active for
action_types list of strings A list of action type filters that limit the
notifications sent to this webhook. See below for
valid values
===================================== ========================== =======================================================
The following values for ``action_types`` are valid with pretix core:
* ``pretix.event.order.placed``
* ``pretix.event.order.paid``
* ``pretix.event.order.canceled``
* ``pretix.event.order.expired``
* ``pretix.event.order.modified``
* ``pretix.event.order.contact.changed``
* ``pretix.event.order.changed.*``
* ``pretix.event.order.refund.created.externally``
* ``pretix.event.order.approved``
* ``pretix.event.order.denied``
* ``pretix.event.checkin``
* ``pretix.event.checkin.reverted``
Installed plugins might register more valid values.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/webhooks/
Returns a list of all webhooks within a given organizer.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/webhooks/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"enabled": true,
"target_url": "https://httpstat.us/200",
"all_events": false,
"limit_events": ["democon"],
"action_types": ["pretix.event.order.modified", "pretix.event.order.changed.*"]
}
]
}
:query integer page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/webhooks/(id)/
Returns information on one webhook, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/webhooks/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 2,
"enabled": true,
"target_url": "https://httpstat.us/200",
"all_events": false,
"limit_events": ["democon"],
"action_types": ["pretix.event.order.modified", "pretix.event.order.changed.*"]
}
:param organizer: The ``slug`` field of the organizer to fetch
:param id: The ``id`` field of the webhook to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view this resource.
.. http:post:: /api/v1/organizers/(organizer)/webhooks/
Creates a new webhook
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/webhooks/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content: application/json
{
"enabled": true,
"target_url": "https://httpstat.us/200",
"all_events": false,
"limit_events": ["democon"],
"action_types": ["pretix.event.order.modified", "pretix.event.order.changed.*"]
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 201 Created
Vary: Accept
Content-Type: application/json
{
"id": 3,
"enabled": true,
"target_url": "https://httpstat.us/200",
"all_events": false,
"limit_events": ["democon"],
"action_types": ["pretix.event.order.modified", "pretix.event.order.changed.*"]
}
:param organizer: The ``slug`` field of the organizer to create a webhook for
:statuscode 201: no error
:statuscode 400: The webhook could not be created due to invalid submitted data.
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to create this resource.
.. http:patch:: /api/v1/organizers/(organizer)/webhooks/(id)/
Update a webhook. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of
the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you
want to change.
You can change all fields of the resource except the ``id`` field.
**Example request**:
.. sourcecode:: http
PATCH /api/v1/organizers/bigevents/webhooks/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: application/json
Content-Length: 94
{
"enabled": false
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"enabled": false,
"target_url": "https://httpstat.us/200",
"all_events": false,
"limit_events": ["democon"],
"action_types": ["pretix.event.order.modified", "pretix.event.order.changed.*"]
}
:param organizer: The ``slug`` field of the organizer to modify
:param id: The ``id`` field of the webhook to modify
:statuscode 200: no error
:statuscode 400: The webhook could not be modified due to invalid submitted data
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to change this resource.
.. http:delete:: /api/v1/organizers/(organizer)/webhook/(id)/
Delete a webhook. Currently, this will not delete but just disable the webhook.
**Example request**:
.. sourcecode:: http
DELETE /api/v1/organizers/bigevents/webhooks/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 204 No Content
Vary: Accept
:param organizer: The ``slug`` field of the organizer to modify
:param id: The ``id`` field of the webhook to delete
:statuscode 204: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to delete this resource.

36
doc/api/tokenauth.rst Normal file
View File

@@ -0,0 +1,36 @@
.. _`rest-tokenauth`:
Token-based authentication
==========================
Obtaining an API token
----------------------
To authenticate your API requests with Tokens, you need to obtain a team-level API token.
You can create a token in the pretix web interface on the level of organizer teams. Create
a new team or choose an existing team that has the level of permissions the token should
have and create a new token using the form below the list of team members:
.. image:: img/token_form.png
:class: screenshot
You can enter a description for the token to distinguish from other tokens later on.
Once you click "Add", you will be provided with an API token in the success message.
Copy this token, as you won't be able to retrieve it again.
.. image:: img/token_success.png
:class: screenshot
Using an API token
------------------
You need to include the API token with every request to pretix' API in the ``Authorization`` header
like the following:
.. sourcecode:: http
:emphasize-lines: 3
GET /api/v1/organizers/ HTTP/1.1
Host: pretix.eu
Authorization: Token e1l6gq2ye72thbwkacj7jbri7a7tvxe614ojv8ybureain92ocub46t5gab5966k

108
doc/api/webhooks.rst Normal file
View File

@@ -0,0 +1,108 @@
.. _`webhooks`:
Webhooks
========
pretix can send webhook calls to notify your application of any changes that happen inside pretix. This is especially
useful for everything triggered by an actual user, such as a new ticket sale or the arrival of a payment.
You can register any number of webhook URLs that pretix will notify any time one of the supported events occurs inside
your organizer account. A great example use case of webhooks would be to add the buyer to your mailing list every time
a new order comes in.
Configuring webhooks
--------------------
You can find the list of your active webhooks in the "Webhook" section of your organizer account:
.. thumbnail:: ../screens/organizer/webhook_list.png
:align: center
:class: screenshot
Click "Create webhook" if you want to add a new URL. You will then be able to enter the URL pretix shall call for
notifications. You need to select any number of notification types that you want to receive and you can optionally
filter the events you want to receive notifications for.
.. thumbnail:: ../screens/organizer/webhook_edit.png
:align: center
:class: screenshot
You can also configure webhooks :ref:`through the API itself <rest-webhooks>`.
Receiving webhooks
------------------
Creating a webhook endpoint on your server is no different from creating any other page on your website. If your
website is written in PHP, you might just create a new ``.php`` file on your server; if you use a web framework like
Symfony or Django, you would just create a new route with the desired URL.
We will call your URL with a HTTP ``POST`` request with a ``JSON`` body. In PHP, you can parse this like this::
$input = @file_get_contents('php://input');
$event_json = json_decode($input);
// Do something with $event_json
In Django, you would create a view like this::
def my_webhook_view(request):
event_json = json.loads(request.body)
# Do something with event_json
return HttpResponse(status=200)
More samples for the language of your choice are easy to find online.
The exact body of the request varies by notification type, but for the main types included with pretix core, such as
those related to changes of an order, it will look like this::
{
"notification_id": 123455,
"organizer": "acmecorp",
"event": "democon",
"code": "ABC23",
"action": "pretix.event.order.placed"
}
Notifications regarding a check-in will contain more details like ``orderposition_id``
and ``checkin_list``.
.. warning:: You should not trust data supplied to your webhook, but only use it as a trigger to fetch updated data.
Anyone could send data there if they guess the correct URL and you won't be able to tell. Therefore, we
only include the minimum amount of data necessary for you to fetch the changed objects from our
:ref:`rest-api` in an authenticated way.
If you want to further prevent others from accessing your webhook URL, you can also use `Basic authentication`_ and
supply the URL to us in the format of ``https://username:password@domain.com/path/``.
We recommend that you use HTTPS for your webhook URL and might require it in the future. If HTTPS is used, we require
that a valid certificate is in use.
.. note:: If you use a web framework that makes use of automatic CSRF protection, this protection might prevent us
from calling your webhook URL. In this case, we recommend that you turn of CSRF protection selectively
for that route. In Django, you can do this by putting the ``@csrf_exempt`` decorator on your view. In
Rails, you can pass an ``except`` parameter to ``protect_from_forgery``.
Responding to a webhook
-----------------------
If you successfully received a webhook call, your endpoint should return a HTTP status code between ``200`` and ``299``.
If any other status code is returned, we will assume you did not receive the call. This does mean that any redirection
or ``304 Not Modified`` response will be treated as a failure. pretix will not follow any ``301`` or ``302`` redirect
headers and pretix will ignore all other information in your response headers or body.
If we do not receive a status code in the range of ``200`` and ``299``, pretix will retry to deliver for up to three
days with an exponential back off. Therefore, we recommend that you implement your endpoint in a way where calling it
multiple times for the same event due to a perceived error does not do any harm.
There is only one exception: If status code ``410 Gone`` is returned, we will assume the
endpoint does not exist any more and automatically disable the webhook.
.. note:: If you use a self-hosted version of pretix (i.e. not our SaaS offering at pretix.eu) and you did not
configure a background task queue, failed webhooks will not be retried.
Debugging webhooks
------------------
If you want to debug your webhooks, you can view a log of all sent notifications and the responses of your server for
30 days right next to your configuration.
.. _Basic authentication: https://en.wikipedia.org/wiki/Basic_access_authentication

11
doc/checkin_filter.py Normal file
View File

@@ -0,0 +1,11 @@
from enchant.tokenize import get_tokenizer, Filter, unit_tokenize
class CheckinFilter(Filter):
""" If a word looks like checkin_count, it refers to a so-called variable in
the code, and is treated as being spelled right."""
def _split(self, word):
if word[:8] == "checkin_":
return unit_tokenize(word[8:])
return unit_tokenize(word)

View File

@@ -13,18 +13,31 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
from docutils.parsers.rst.directives.admonitions import BaseAdmonition
from sphinx.util import compat
compat.make_admonition = BaseAdmonition # See https://github.com/spinus/sphinxcontrib-images/issues/41
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
from datetime import date
sys.path.insert(0, os.path.abspath('../src'))
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pretix.settings")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pretix.testutils.settings")
django.setup()
try:
import enchant
HAS_PYENCHANT = True
except:
HAS_PYENCHANT = False
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -36,10 +49,12 @@ django.setup()
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinxcontrib.httpdomain',
'sphinxcontrib.images',
]
if HAS_PYENCHANT:
extensions.append('sphinxcontrib.spelling')
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -51,20 +66,21 @@ source_suffix = '.rst'
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
master_doc = 'contents'
# General information about the project.
project = 'pretix'
copyright = '2014-2016, Raphael Michel'
copyright = '2014-{}, Raphael Michel'.format(date.today().year)
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.0.0'
from pretix import __version__
version = '.'.join(__version__.split('.')[:2])
# The full version, including alpha/beta/rc tags.
release = '0.0.0'
release = __version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -114,7 +130,9 @@ pygments_style = 'sphinx'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
html_theme_options = {
'logo_only': True,
}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
@@ -128,7 +146,7 @@ pygments_style = 'sphinx'
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
html_logo = 'images/logo-white.svg'
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
@@ -138,7 +156,11 @@ pygments_style = 'sphinx'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_static_path = [
'_static',
os.path.abspath('../src/pretix/static/fonts/'),
os.path.abspath('../src/pretix/static/fontawesome/fonts/'),
]
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
@@ -158,7 +180,9 @@ html_static_path = ['_static']
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
html_additional_pages = {
'index': 'index.html'
}
# If false, no module index is generated.
html_domain_indices = False
@@ -170,7 +194,7 @@ html_use_index = False
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
@@ -189,11 +213,8 @@ html_use_index = False
# Output file base name for HTML help builder.
htmlhelp_basename = 'pretixdoc'
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd: # only import and set the theme if we're building docs locally
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
html_theme = 'pretix_theme'
html_theme_path = [os.path.abspath('_themes')]
# -- Options for LaTeX output ---------------------------------------------
@@ -213,7 +234,7 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'pretix.tex', 'pretix Documentation',
('contents', 'pretix.tex', 'pretix Documentation',
'Raphael Michel', 'manual'),
]
@@ -273,3 +294,31 @@ texinfo_documents = [
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
images_config = {
'default_image_width': '250px'
}
linkcheck_ignore = [
r'http://localhost.*', r'.*yourdomain.*', r'https://en.wikipedia.org', 'https://pretix.eu/',
]
# -- Options for Spelling output ------------------------------------------
if HAS_PYENCHANT:
# String specifying the language, as understood by PyEnchant and enchant.
# Defaults to en_US for US English.
spelling_lang = 'en_US'
# String specifying a file containing a list of words known to be spelled
# correctly but that do not appear in the language dictionary selected by
# spelling_lang. The file should contain one word per line.
spelling_word_list_filename='spelling_wordlist.txt'
# Boolean controlling whether suggestions for misspelled words are printed.
# Defaults to False.
spelling_show_suggestions=True
# List of filter classes to be added to the tokenizer that produces words to be checked.
from checkin_filter import CheckinFilter
spelling_filters=[CheckinFilter]

12
doc/contents.rst Normal file
View File

@@ -0,0 +1,12 @@
Table of contents
=================
.. toctree::
:maxdepth: 3
user/index
admin/index
api/index
development/index
plugins/index

View File

@@ -25,7 +25,7 @@ If you want to add a custom view to the control area of an event, just register
views.admin_view, name='backend'),
]
It is required that your URL paramaters are called ``organizer`` and ``event``. If you want to
It is required that your URL parameters are called ``organizer`` and ``event``. If you want to
install a view on organizer level, you can leave out the ``event``.
You can then implement the view as you would normally do. Our middleware will automatically
@@ -60,7 +60,85 @@ your views::
def admin_view(request, organizer, event):
...
Similarly, there is ``organizer_permission_required`` and ``OrganizerPermissionRequiredMixin``.
Similarly, there is ``organizer_permission_required`` and ``OrganizerPermissionRequiredMixin``. In case of
event-related views, there is also a signal that allows you to add the view to the event navigation like this::
from django.urls import resolve, reverse
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from pretix.control.signals import nav_event
@receiver(nav_event, dispatch_uid='friends_tickets_nav')
def navbar_info(sender, request, **kwargs):
url = resolve(request.path_info)
if not request.user.has_event_permission(request.organizer, request.event, 'can_change_vouchers'):
return []
return [{
'label': _('My plugin view'),
'icon': 'heart',
'url': reverse('plugins:myplugin:index', kwargs={
'event': request.event.slug,
'organizer': request.organizer.slug,
}),
'active': url.namespace == 'plugins:myplugin' and url.url_name == 'review',
}]
Event settings view
-------------------
A special case of a control panel view is a view hooked into the event settings page. For this case, there is a
special navigation signal::
@receiver(nav_event_settings, dispatch_uid='friends_tickets_nav_settings')
def navbar_settings(sender, request, **kwargs):
url = resolve(request.path_info)
return [{
'label': _('My settings'),
'url': reverse('plugins:myplugin:settings', kwargs={
'event': request.event.slug,
'organizer': request.organizer.slug,
}),
'active': url.namespace == 'plugins:myplugin' and url.url_name == 'settings',
}]
Also, your view should inherit from ``EventSettingsViewMixin`` and your template from ``pretixcontrol/event/settings_base.html``
for good integration. If you just want to display a form, you could do it like the following::
class MySettingsView(EventSettingsViewMixin, EventSettingsFormView):
model = Event
permission = 'can_change_settings'
form_class = MySettingsForm
template_name = 'my_plugin/settings.html'
def get_success_url(self, **kwargs):
return reverse('plugins:myplugin:settings', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
})
With this template::
{% extends "pretixcontrol/event/settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block title %} {% trans "Friends Tickets Settings" %} {% endblock %}
{% block inside %}
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
<fieldset>
<legend>{% trans "Friends Tickets Settings" %}</legend>
{% bootstrap_form form layout="horizontal" %}
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %}
Frontend views
--------------
@@ -68,31 +146,79 @@ Frontend views
Including a custom view into the participant-facing frontend is a little bit different as there is
no path prefix like ``control/``.
First, define your URL in your ``urls.py``, but this time in the ``event_patterns`` section::
First, define your URL in your ``urls.py``, but this time in the ``event_patterns`` section and wrapped by
``event_url``::
from django.conf.urls import url
from pretix.multidomain import event_url
from . import views
event_patterns = [
url(r'^mypluginname/', views.frontend_view, name='frontend'),
event_url(r'^mypluginname/', views.frontend_view, name='frontend'),
]
You can then implement a view as you would normally do, but you need to apply a decorator to your
view if you want pretix's default behavior::
from pretix.presale.utils import event_view
@event_view
def some_event_view(request, *args, **kwargs):
...
This decorator will check the URL arguments for their ``event`` and ``organizer`` parameters and
correctly ensure that:
You can then implement a view as you would normally do. It will be automatically ensured that:
* The requested event exists
* The requested event is activated (can be overridden by decorating with ``@event_view(require_live=False)``)
* The requested event is active (you can disable this check using ``event_url(…, require_live=True)``)
* The event is accessed via the domain it should be accessed
* The ``request.event`` attribute contains the correct ``Event`` object
* The ``request.organizer`` attribute contains the correct ``Organizer`` object
* Your plugin is enabled
* The locale is set correctly
.. versionchanged:: 1.7
The ``event_url()`` wrapper has been added in 1.7 to replace the former ``@event_view`` decorator. The
``event_url()`` wrapper is optional and using ``url()`` still works, but you will not be able to set the
``require_live`` setting any more via the decorator. The ``@event_view`` decorator is now deprecated and
does nothing.
REST API viewsets
-----------------
Our REST API is built upon `Django REST Framework`_ (DRF). DRF has two important concepts that are different from
standard Django request handling: There are `ViewSets`_ to group related views in a single class and `Routers`_ to
automatically build URL configurations from them.
To integrate a custom viewset with pretix' REST API, you can just register with one of our routers within the
``urls.py`` module of your plugin::
from pretix.api.urls import event_router, router, orga_router
router.register('global_viewset', MyViewSet)
orga_router.register('orga_level_viewset', MyViewSet)
event_router.register('event_level_viewset', MyViewSet)
Routes registered with ``router`` are inserted into the global API space at ``/api/v1/``. Routes registered with
``orga_router`` will be included at ``/api/v1/organizers/(organizer)/`` and routes registered with ``event_router``
will be included at ``/api/v1/organizers/(organizer)/events/(event)/``.
In case of ``orga_router`` and ``event_router``, permission checking is done for you similarly as with custom views
in the control panel. However, you need to make sure on your own only to return the correct subset of data! ``request
.event`` and ``request.organizer`` are available as usual.
To require a special permission like ``can_view_orders``, you do not need to inherit from a special ViewSet base
class, you can just set the ``permission`` attribute on your viewset::
class MyViewSet(ModelViewSet):
permission = 'can_view_orders'
...
If you want to check the permission only for some methods of your viewset, you have to do it yourself. Note here that
API authentications can be done via user sessions or API tokens and you should therefore check something like the
following::
perm_holder = (request.auth if isinstance(request.auth, TeamAPIToken) else request.user)
if perm_holder.has_event_permission(request.event.organizer, request.event, 'can_view_orders'):
...
.. warning:: It is important that you do this in the ``yourplugin.urls`` module, otherwise pretix will not find your
routes early enough during system startup.
.. _Django REST Framework: http://www.django-rest-framework.org/
.. _ViewSets: http://www.django-rest-framework.org/api-guide/viewsets/
.. _Routers: http://www.django-rest-framework.org/api-guide/routers/

View File

@@ -0,0 +1,109 @@
.. highlight:: python
:linenothreshold: 5
Writing an HTML e-mail renderer plugin
======================================
An email renderer class controls how the HTML part of e-mails sent by pretix is built.
The creation of such a plugin is very similar to creating an export output.
Please read :ref:`Creating a plugin <pluginsetup>` first, if you haven't already.
Output registration
-------------------
The email HTML renderer API does not make a lot of usage from signals, however, it
does use a signal to get a list of all available email renderers. Your plugin
should listen for this signal and return the subclass of ``pretix.base.email.BaseHTMLMailRenderer``
that we'll provide in this plugin::
from django.dispatch import receiver
from pretix.base.signals import register_html_mail_renderers
@receiver(register_html_mail_renderers, dispatch_uid="renderer_custom")
def register_mail_renderers(sender, **kwargs):
from .email import MyMailRenderer
return MyMailRenderer
The renderer class
------------------
.. class:: pretix.base.email.BaseHTMLMailRenderer
The central object of each email renderer is the subclass of ``BaseHTMLMailRenderer``.
.. py:attribute:: BaseHTMLMailRenderer.event
The default constructor sets this property to the event we are currently
working for.
.. autoattribute:: identifier
This is an abstract attribute, you **must** override this!
.. autoattribute:: verbose_name
This is an abstract attribute, you **must** override this!
.. autoattribute:: thumbnail_filename
This is an abstract attribute, you **must** override this!
.. autoattribute:: is_available
.. automethod:: render
This is an abstract method, you **must** implement this!
Helper class for template-base renderers
----------------------------------------
The email renderer that ships with pretix is based on Django templates to generate HTML.
In case you also want to render emails based on a template, we provided a ready-made base
class ``TemplateBasedMailRenderer`` that you can re-use to perform the following steps:
* Convert the body text and the signature to HTML using our markdown renderer
* Render the template
* Call `inlinestyler`_ to convert all ``<style>`` style sheets to inline ``style=""``
attributes for better compatibility
To use it, you just need to implement some variables::
class ClassicMailRenderer(TemplateBasedMailRenderer):
verbose_name = _('pretix default')
identifier = 'classic'
thumbnail_filename = 'pretixbase/email/thumb.png'
template_name = 'pretixbase/email/plainwrapper.html'
The template is passed the following context variables:
``site``
Name of the pretix installation (``settings.PRETIX_INSTANCE_NAME``)
``site_url``
Root URL of the pretix installation (``settings.SITE_URL``)
``body``
The body as markdown (render with ``{{ body|safe }}``)
``subject``
The email subject
``color``
The primary color of the event
``event``
The ``Event`` object
``signature`` (optional, only if configured)
The body as markdown (render with ``{{ signature|safe }}``)
``order`` (optional, only if applicable)
The ``Order`` object
.. _inlinestyler: https://pypi.org/project/inlinestyler/

View File

@@ -21,10 +21,10 @@ that we'll provide in this plugin::
from django.dispatch import receiver
from pretix.base.signals import register_data_exporter
from pretix.base.signals import register_data_exporters
@receiver(register_data_exporter, dispatch_uid="exporter_myexporter")
@receiver(register_data_exporters, dispatch_uid="exporter_myexporter")
def register_data_exporter(sender, **kwargs):
from .exporter import MyExporter
return MyExporter

View File

@@ -11,7 +11,8 @@ Core
----
.. automodule:: pretix.base.signals
:members: periodic_task, event_live_issues, event_copy_data
:members: periodic_task, event_live_issues, event_copy_data, email_filter, register_notification_types,
item_copy_data, register_sales_channels
Order events
""""""""""""
@@ -19,13 +20,13 @@ Order events
There are multiple signals that will be sent out in the ordering cycle:
.. automodule:: pretix.base.signals
:members: validate_cart, order_paid, order_placed
:members: validate_cart, order_fee_calculation, order_paid, order_placed, order_fee_type_name, allow_ticket_download
Frontend
--------
.. automodule:: pretix.presale.signals
:members: html_head, html_footer, footer_links, front_page_top, front_page_bottom, checkout_confirm_messages
:members: html_head, html_footer, footer_link, front_page_top, front_page_bottom, fee_calculation_for_cart, contact_form_fields, question_form_fields, checkout_confirm_messages, checkout_confirm_page_content, checkout_all_optional
.. automodule:: pretix.presale.signals
@@ -47,20 +48,33 @@ Backend
-------
.. automodule:: pretix.control.signals
:members: nav_event, html_head, quota_detail_html, nav_topbar, nav_global, nav_organizer
:members: nav_event, html_head, html_page_start, quota_detail_html, nav_topbar, nav_global, nav_organizer, nav_event_settings,
order_info, event_settings_widget, oauth_application_registered, order_position_buttons
.. automodule:: pretix.base.signals
:members: logentry_display, requiredaction_display
:members: logentry_display, logentry_object_link, requiredaction_display
Vouchers
""""""""
.. automodule:: pretix.control.signals
:members: voucher_form_class, voucher_form_html
:members: item_forms
Vouchers
""""""""
.. automodule:: pretix.control.signals
:members: voucher_form_class, voucher_form_html, voucher_form_validation
Dashboards
""""""""""
.. automodule:: pretix.control.signals
:members: event_dashboard_widgets, user_dashboard_widgets
Ticket designs
""""""""""""""
.. automodule:: pretix.base.signals
:members: layout_text_variables

View File

@@ -1,5 +1,5 @@
Plugin hooks
============
Plugin development
==================
Contents:
@@ -10,5 +10,10 @@ Contents:
exporter
ticketoutput
payment
payment_2.0
email
invoice
shredder
customview
general
quality

View File

@@ -0,0 +1,95 @@
.. highlight:: python
:linenothreshold: 5
Writing an invoice renderer plugin
==================================
An invoice renderer controls how invoice files are built.
The creation of such a plugin is very similar to creating an export output.
Please read :ref:`Creating a plugin <pluginsetup>` first, if you haven't already.
Output registration
-------------------
The invoice renderer API does not make a lot of usage from signals, however, it
does use a signal to get a list of all available invoice renderers. Your plugin
should listen for this signal and return the subclass of ``pretix.base.invoice.BaseInvoiceRenderer``
that we'll provide in this plugin::
from django.dispatch import receiver
from pretix.base.signals import register_invoice_renderers
@receiver(register_invoice_renderers, dispatch_uid="output_custom")
def register_invoice_renderers(sender, **kwargs):
from .invoice import MyInvoiceRenderer
return MyInvoiceRenderer
The renderer class
------------------
.. class:: pretix.base.invoice.BaseInvoiceRenderer
The central object of each invoice renderer is the subclass of ``BaseInvoiceRenderer``.
.. py:attribute:: BaseInvoiceRenderer.event
The default constructor sets this property to the event we are currently
working for.
.. autoattribute:: identifier
This is an abstract attribute, you **must** override this!
.. autoattribute:: verbose_name
This is an abstract attribute, you **must** override this!
.. automethod:: generate
Helper class for reportlab-base renderers
-----------------------------------------
All PDF rendering that ships with pretix is based on reportlab. We recommend to read the
`reportlab User Guide`_ to understand all the concepts used here.
If you want to implement a renderer that also uses report lab, this helper class might be
convenient to you:
.. class:: pretix.base.invoice.BaseReportlabInvoiceRenderer
.. py:attribute:: BaseReportlabInvoiceRenderer.pagesize
.. py:attribute:: BaseReportlabInvoiceRenderer.left_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.right_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.top_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.bottom_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.doc_template_class
.. py:attribute:: BaseReportlabInvoiceRenderer.invoice
.. automethod:: _init
.. automethod:: _get_stylesheet
.. automethod:: _register_fonts
.. automethod:: _on_first_page
.. automethod:: _on_other_page
.. automethod:: _get_first_page_frames
.. automethod:: _get_other_page_frames
.. automethod:: _build_doc
.. _reportlab User Guide: https://www.reportlab.com/docs/reportlab-userguide.pdf

View File

@@ -9,6 +9,10 @@ is very similar to creating an export output.
Please read :ref:`Creating a plugin <pluginsetup>` first, if you haven't already.
.. warning:: We changed our payment provider API a lot in pretix 2.x. Our documentation page on :ref:`payment2.0`
might be insightful even if you do not have a payment provider to port, as it outlines the rationale
behind the current design.
Provider registration
---------------------
@@ -31,7 +35,7 @@ that the plugin will provide::
The provider class
------------------
.. class:: pretix.base.payment.BasePaymentProvider
.. py:class:: pretix.base.payment.BasePaymentProvider
The central object of each payment provider is the subclass of ``BasePaymentProvider``.
@@ -54,53 +58,61 @@ The provider class
This is an abstract attribute, you **must** override this!
.. autoattribute:: is_enabled
.. autoattribute:: public_name
.. automethod:: calculate_fee
.. autoattribute:: is_enabled
.. autoattribute:: settings_form_fields
.. automethod:: settings_form_clean
.. automethod:: settings_content_render
.. automethod:: render_invoice_text
.. automethod:: is_allowed
.. automethod:: payment_form_render
.. automethod:: payment_form
.. automethod:: is_allowed
.. autoattribute:: payment_form_fields
.. automethod:: checkout_prepare
.. automethod:: payment_is_valid_session
.. automethod:: checkout_prepare
.. automethod:: checkout_confirm_render
This is an abstract method, you **must** override this!
.. automethod:: payment_perform
.. automethod:: execute_payment
.. automethod:: calculate_fee
.. automethod:: order_pending_mail_render
.. automethod:: order_pending_render
.. automethod:: payment_pending_render
This is an abstract method, you **must** override this!
.. autoattribute:: abort_pending_allowed
.. automethod:: render_invoice_text
.. automethod:: order_change_allowed
.. automethod:: order_can_retry
.. automethod:: payment_prepare
.. automethod:: order_prepare
.. automethod:: payment_control_render
.. automethod:: order_paid_render
.. automethod:: payment_refund_supported
.. automethod:: order_control_render
.. automethod:: payment_partial_refund_supported
.. automethod:: order_control_refund_render
.. automethod:: execute_refund
.. automethod:: order_control_refund_perform
.. automethod:: shred_payment_info
.. autoattribute:: is_implicit
.. autoattribute:: is_meta
Additional views

View File

@@ -0,0 +1,129 @@
.. highlight:: python
:linenothreshold: 5
.. _`payment2.0`:
Porting a payment provider from pretix 1.x to pretix 2.x
========================================================
In pretix 2.x, we changed large parts of the payment provider API. This documentation details the changes we made
and shows you how you can make an existing pretix 1.x payment provider compatible with pretix 2.x
Conceptual overview
-------------------
In pretix 1.x, an order was always directly connected to a payment provider for the full life of an order. As long as
an order was unpaid, this could still be changed in some cases, but once an order was paid, no changes to the payment
provider were possible any more. Additionally, the internal state of orders allowed orders only to be fully paid or
not paid at all. This leads to a couple of consequences:
* Payment-related functions (like "execute payment" or "do a refund") always operated on full orders.
* Changing the total of an order was basically impossible once an order was paid, since there was no concept of
partial payments or partial refunds.
* Payment provider plugins needed to take complicated steps to detect cases that require human intervention, like e.g.
* An order has expired, no quota is left to revive it, but a payment has been received
* A payment has been received for a canceled order
* A payment has been received for an order that has already been paid with a different payment method
* An external payment service notified us of a refund/dispute
We noticed that we copied and repeated large portions of code in all our official payment provider plugins, just
to deal with some of these cases.
* Sometimes, there is the need to mark an order as refunded within pretix, without automatically triggering a refund
with an external API. Every payment method needed to implement a user interface for this independently.
* If a refund was not possible automatically, there was no way user to track which payments actually have been refunded
manually and which are still left to do.
* When the payment with one payment provider failed and the user changed to a different payment provider, all
information about the first payment was lost from the order object and could only be retrieved from order log data,
which also made it hard to design a data shredder API to get rid of this data.
In pretix 2.x, we introduced two new models, :py:class:`OrderPayment <pretix.base.models.OrderPayment>` and
:py:class:`OrderRefund <pretix.base.models.OrderRefund>`. Each instance of these is connected to an order and
represents one single attempt to pay or refund a specific amount of money. Each one of these has an individual state,
can individually fail or succeed, and carries an amount variable that can differ from the order total.
This has the following advantages:
* The system can now detect orders that are over- or underpaid, independent of the payment providers in use.
* Therefore, we can now allow partial payments, partial refunds, and changing paid orders, and automatically detect
the cases listed above and notify the user.
Payment providers now interact with those payment and refund objects more than with orders.
Your to-do list
---------------
Payment processing
""""""""""""""""""
* The method ``BasePaymentProvider.order_pending_render`` has been removed and replaced by a new
``BasePaymentProvider.payment_pending_render(request, payment)`` method that is passed an ``OrderPayment``
object instead of an ``Order``.
* The method ``BasePaymentProvider.payment_form_render`` now receives a new ``total`` parameter.
* The method ``BasePaymentProvider.payment_perform`` has been removed and replaced by a new method
``BasePaymentProvider.execute_payment(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* The function ``pretix.base.services.mark_order_paid`` has been removed, instead call ``payment.confirm()``
on a pending ``OrderPayment`` object. If no further payments are required for this order, this will also
mark the order as paid automatically. Note that ``payment.confirm()`` can still throw a ``QuotaExceededException``,
however it will still mark the payment as complete (not the order!), so you should catch this exception and
inform the user, but not abort the transaction.
* A new property ``BasePaymentProvider.abort_pending_allowed`` has been introduced. Only if set, the user will
be able to retry a payment or switch the payment method when the order currently has a payment object in
state ``"pending"``. This replaces ``BasePaymentProvider.order_can_retry``, which no longer exists.
* The methods ``BasePaymentProvider.retry_prepare`` and ``BasePaymentProvider.order_prepare`` have both been
replaced by a new method ``BasePaymentProvider.payment_prepare(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``. **Keep in mind that this payment object might have an amount property that
differs from the order total, if the order is already partially paid.**
* The method ``BasePaymentProvider.order_paid_render`` has been removed.
* The method ``BasePaymentProvider.order_control_render`` has been removed and replaced by a new method
``BasePaymentProvider.payment_control_render(request, payment)`` that is passed an ``OrderPayment``
object instead of an ``Order``.
* There's no need to manually deal with excess payments or duplicate payments anymore, just setting the ``OrderPayment``
methods to the correct state will do the job.
Creating refunds
""""""""""""""""
* The methods ``BasePaymentProvider.order_control_refund_render`` and ``BasePaymentProvider.order_control_refund_perform``
have been removed.
* Two new boolean methods ``BasePaymentProvider.payment_refund_supported(payment)`` and ``BasePaymentProvider.payment_partial_refund_supported(payment)``
have been introduced. They should be set to return ``True`` if and only if the payment API allows to *automatically*
transfer the money back to the customer.
* A new method ``BasePaymentProvider.execute_refund(refund)`` has been introduced. This method is called using a
``OrderRefund`` object in ``"created"`` state and is expected to transfer the money back and confirm success with
calling ``refund.done()``. This will only ever be called if either ``BasePaymentProvider.payment_refund_supported(payment)``
or ``BasePaymentProvider.payment_partial_refund_supported(payment)`` return ``True``.
Processing external refunds
"""""""""""""""""""""""""""
* If e.g. a webhook API notifies you that a payment has been disputed or refunded with the external API, you are
expected to call ``OrderPayment.create_external_refund(self, amount, execution_date, info='{}')`` on this payment.
This will create and return an appropriate ``OrderRefund`` object and send out a notification. However, it will not
mark the order as refunded, but will ask the event organizer for a decision.
Data shredders
""""""""""""""
* The method ``BasePaymentProvider.shred_payment_info`` is no longer passed an order, but instead **either**
an ``OrderPayment`` **or** an ``OrderRefund``.

View File

@@ -1,8 +1,10 @@
.. highlight:: python
:linenothreshold: 5
Plugin basics
=============
.. _`pluginsetup`:
Creating a plugin
=================
It is possible to extend pretix with custom Python code using the official plugin
API. Every plugin has to be implemented as an independent Django 'app' living
@@ -14,10 +16,15 @@ The communication between pretix and the plugins happens mostly using Django's
``pretix.control`` and ``pretix.presale`` expose a number of signals which are documented
on the next pages.
.. _`pluginsetup`:
To create a new plugin, create a new python package which must be a valid `Django app`_
and must contain plugin metadata, as described below.
There is some boilerplate that you will need for every plugin to get started. To save your
time, we created a `cookiecutter`_ template that you can use like this::
$ pip install cookiecutter
$ cookiecutter https://github.com/pretix/pretix-plugin-cookiecutter
This will ask you some questions and then create a project folder for your plugin.
The following pages go into detail about the several types of plugins currently
supported. While these instructions don't assume that you know a lot about pretix,
@@ -30,35 +37,29 @@ Plugin metadata
The plugin metadata lives inside a ``PretixPluginMeta`` class inside your app's
configuration class. The metadata class must define the following attributes:
``name`` (``str``):
The human-readable name of your plugin
.. rst-class:: rest-resource-table
``author`` (``str``):
Your name
``version`` (``str``):
A human-readable version code of your plugin
``description`` (``str``):
A more verbose description of what your plugin does.
``visible`` (``bool``):
``True`` by default, can hide a plugin so it cannot be normally activated.
``restricted`` (``bool``):
``False`` by default, restricts a plugin such that it can only be enabled for an event
by system administrators / superusers.
================== ==================== ===========================================================
Attribute Type Description
================== ==================== ===========================================================
name string The human-readable name of your plugin
author string Your name
version string A human-readable version code of your plugin
description string A more verbose description of what your plugin does.
visible boolean (optional) ``True`` by default, can hide a plugin so it cannot be normally activated.
restricted boolean (optional) ``False`` by default, restricts a plugin such that it can only be enabled
for an event by system administrators / superusers.
================== ==================== ===========================================================
A working example would be::
# file: pretix/plugins/timerestriction/__init__.py
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _
class PaypalApp(AppConfig):
name = 'pretix.plugins.paypal'
verbose_name = _("Stripe")
name = 'pretix_paypal'
verbose_name = _("PayPal")
class PretixPluginMeta:
name = _("PayPal")
@@ -69,8 +70,7 @@ A working example would be::
description = _("This plugin allows you to receive payments via PayPal")
default_app_config = 'pretix.plugins.paypal.PaypalApp'
default_app_config = 'pretix_paypal.PaypalApp'
The ``AppConfig`` class may implement a property ``compatiblity_errors``, that checks
whether the pretix installation meets all requirements of the plugin. If so,
@@ -79,6 +79,9 @@ human-readable error messages. We recommend using the ``django.utils.functional.
decorator, as it might get called a lot. You can also implement ``compatibility_warnings``,
those will be displayed but not block the plugin execution.
The ``AppConfig`` class may implement a method ``is_available(event)`` that checks if a plugin
is available for a specific event. If not, it will not be shown in the plugin list of that event.
Plugin registration
-------------------
@@ -87,11 +90,10 @@ make use of the `entry point`_ feature of setuptools. To register a plugin that
in a separate python package, your ``setup.py`` should contain something like this::
setup(
args...,
entry_points="""
[pretix.plugin]
sampleplugin=sampleplugin:PretixPluginMeta
pretix_paypal=pretix_paypal:PretixPluginMeta
"""
)
@@ -109,12 +111,25 @@ pages. We suggest that you put your signal receivers into a ``signals`` submodul
of your plugin. You should extend your ``AppConfig`` (see above) by the following
method to make your receivers available::
class TimeRestrictionApp(AppConfig):
class PaypalApp(AppConfig):
def ready(self):
from . import signals # NOQA
You can optionally specify code that is executed when your plugin is activated for an event
in the ``installed`` method::
class PaypalApp(AppConfig):
def installed(self, event):
pass # Your code here
Note that ``installed`` will *not* be called if the plugin in indirectly activated for an event
because the event is created with settings copied from another event.
Views
-----
@@ -130,4 +145,5 @@ your Django app label.
.. _Django app: https://docs.djangoproject.com/en/1.7/ref/applications/
.. _signal dispatcher: https://docs.djangoproject.com/en/1.7/topics/signals/
.. _namespace packages: http://legacy.python.org/dev/peps/pep-0420/
.. _entry point: https://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins
.. _entry point: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#locating-plugins
.. _cookiecutter: https://cookiecutter.readthedocs.io/en/latest/

View File

@@ -0,0 +1,125 @@
.. highlight:: python
:linenothreshold: 5
.. _`pluginquality`:
Plugin quality checklist
========================
If you want to write a high-quality pretix plugin, this is a list of things you should check before
you publish it. This is also a list of things that we check, if we consider installing an externally
developed plugin on our hosted infrastructure.
A. Meta
-------
#. The plugin is clearly licensed under an appropriate license.
#. The plugin has an unambiguous name, description, and author metadata.
#. The plugin has a clear versioning scheme and the latest version of the plugin is kept compatible to the latest
stable version of pretix.
#. The plugin is properly packaged using standard Python packaging tools.
#. The plugin correctly declares its external dependencies.
#. A contact address is provided in case of security issues.
B. Isolation
------------
#. If any signal receivers use the `dispatch_uid`_ feature, the UIDs are prefixed by the plugin's name and do not
clash with other plugins.
#. If any templates or static files are shipped, they are located in subdirectories with the name of the plugin and do
not clash with other plugins or core files.
#. Any keys stored to the settings store are prefixed with the plugin's name and do not clash with other plugins or
core.
#. Any keys stored to the user session are prefixed with the plugin's name and do not clash with other plugins or
core.
#. Any registered URLs are unlikely to clash with other plugins or future core URLs.
C. Security
-----------
#. All important actions are logged to the :ref:`shared log storage <logging>` and a signal receiver is registered to
provide a human-readable representation of the log entry.
#. All views require appropriate permissions and use the ``event_urls`` mechanism if appropriate.
:ref:`Read more <customview>`
#. Any session data for customers is stored in the cart session system if appropriate.
#. If the plugin is a payment provider:
#. No credit card numbers may be stored within pretix.
#. A notification/webhook system is implemented to notify pretix of any refunds.
#. If such a webhook system is implemented, contents of incoming webhooks are either verified using a cryptographic
signature or are not being trusted and all data is fetched from an API instead.
D. Privacy
----------
#. No personal data is stored that is not required for the plugin's functionality.
#. For any personal data that is saved to the database, an appropriate :ref:`data shredder <shredder>` is provided
that offers the data for download and then removes it from the database (including log entries).
E. Internationalization
-----------------------
#. All user-facing strings in templates, Python code, and templates are wrapped in `gettext calls`_.
#. No languages, time zones, date formats, or time formats are hardcoded.
#. Installing the plugin automatically compiles ``.po`` files to ``.mo`` files. This is fulfilled automatically if
you use the ``setup.py`` file form our plugin cookiecutter.
F. Functionality
----------------
#. If the plugin adds any database models or relationships from the settings storage to database models, it registers
a receiver to the :py:attr:`pretix.base.signals.event_copy_data` or :py:attr:`pretix.base.signals.item_copy_data`
signals.
#. If the plugin is a payment provider:
#. A webhook-like system is implemented if payment confirmations are not sent instantly.
#. Refunds are implemented, if possible.
#. In case of overpayment or external refunds, a "required action" is created to notify the event organizer.
#. If the plugin adds steps to the checkout process, it has been tested in combination with the pretix widget.
G. Code quality
---------------
#. `isort`_ and `flake8`_ are used to ensure consistent code styling.
#. Unit tests are provided for important pieces of business logic.
#. Functional tests are provided for important interface parts.
#. Tests are provided to check that permission checks are working.
#. Continuous Integration is set up to check that tests are passing and styling is consistent.
H. Specific to pretix.eu
------------------------
#. pretix.eu integrates the data stored by this plugin with its data report features.
#. pretix.eu integrates this plugin in its generated privacy statements, if necessary.
.. _isort: https://www.google.de/search?q=isort&oq=isort&aqs=chrome..69i57j0j69i59j69i60l2j69i59.599j0j4&sourceid=chrome&ie=UTF-8
.. _flake8: http://flake8.pycqa.org/en/latest/
.. _gettext calls: https://docs.djangoproject.com/en/2.0/topics/i18n/translation/
.. _dispatch_uid: https://docs.djangoproject.com/en/2.0/topics/signals/#django.dispatch.Signal.connect

View File

@@ -0,0 +1,94 @@
.. highlight:: python
:linenothreshold: 5
.. _`shredder`:
Writing a data shredder
=======================
If your plugin adds the ability to store personal data within pretix, you should also implement a "data shredder"
to anonymize or pseudonymize the data later.
Shredder registration
---------------------
The data shredder API does not make a lot of usage from signals, however, it
does use a signal to get a list of all available data shredders. Your plugin
should listen for this signal and return the subclass of ``pretix.base.shredder.BaseDataShredder``
that we'll provide in this plugin:
.. sourcecode:: python
from django.dispatch import receiver
from pretix.base.signals import register_data_shredders
@receiver(register_data_shredders, dispatch_uid="custom_data_shredders")
def register_shredder(sender, **kwargs):
return [
PluginDataShredder,
]
The shredder class
------------------
.. class:: pretix.base.shredder.BaseDataShredder
The central object of each invoice renderer is the subclass of ``BaseInvoiceRenderer``.
.. py:attribute:: BaseInvoiceRenderer.event
The default constructor sets this property to the event we are currently
working for.
.. autoattribute:: identifier
This is an abstract attribute, you **must** override this!
.. autoattribute:: verbose_name
This is an abstract attribute, you **must** override this!
.. autoattribute:: description
This is an abstract attribute, you **must** override this!
.. automethod:: generate_files
.. automethod:: shred_data
Example
-------
For example, the core data shredder responsible for removing invoice address information including their history
looks like this:
.. sourcecode:: python
class InvoiceAddressShredder(BaseDataShredder):
verbose_name = _('Invoice addresses')
identifier = 'invoice_addresses'
description = _('This will remove all invoice addresses from orders, '
'as well as logged changes to them.')
def generate_files(self) -> List[Tuple[str, str, str]]:
yield 'invoice-addresses.json', 'application/json', json.dumps({
ia.order.code: InvoiceAdddressSerializer(ia).data
for ia in InvoiceAddress.objects.filter(order__event=self.event)
}, indent=4)
@transaction.atomic
def shred_data(self):
InvoiceAddress.objects.filter(order__event=self.event).delete()
for le in self.event.logentry_set.filter(action_type="pretix.event.order.modified"):
d = le.parsed_data
if 'invoice_data' in d and not isinstance(d['invoice_data'], bool):
for field in d['invoice_data']:
if d['invoice_data'][field]:
d['invoice_data'][field] = ''
le.data = json.dumps(d)
le.shredded = True
le.save(update_fields=['data', 'shredded'])

View File

@@ -58,6 +58,8 @@ The output class
.. autoattribute:: is_enabled
.. autoattribute:: multi_download_enabled
.. autoattribute:: settings_form_fields
.. automethod:: settings_content_render

View File

@@ -1,18 +1,16 @@
Implementation concepts
=======================
Basic terminology
-----------------
Concepts and Terminology
========================
The components
^^^^^^^^^^^^^^
The project pretix is split into several components. The main three of them are:
The project pretix is split into several components. The main components are:
**base**
This is the foundation below all other components. It is primarily
responsible for the data structures and database communication. It also hosts
several utilities which are used by multiple other components.
several utilities which are used by multiple other components and important parts of
the business logic.
**control**
This is the web-based backend software which allows organizers to
@@ -20,7 +18,13 @@ The project pretix is split into several components. The main three of them are:
**presale**
This is the ticket-shop itself, containing all of the parts visible to the
end user.
end user. Also called "frontend" in parts of this documentation.
**api**
A RESTful API exposed to integrate with third-party software.
**plugins**
A set of pretix plugins that ship bundled with pretix.
Users and events
^^^^^^^^^^^^^^^^
@@ -55,12 +59,13 @@ If an item is assigned to multiple quotas, it can only be bought if *all of them
If multiple items are assigned to the same quota, the quota will be counted as sold out as soon as the
*sum* of the two items exceeds the quota limit.
The availability of a quota is currently calculated by substracting the following numbers from the quota
The availability of a quota is currently calculated by subtracting the following numbers from the quota
limit:
* The number of orders placed for an item that are either already paid or within their granted payment period
* The number of non-expired items currently in the shopping cart of users
* The number of vouchers defined as "quota blocking" (see blow)
* The number of people on the waiting list
The quota system tries very hard to be as friendly as possible to your event attendees while still making sure
your limit is never exceeded. For example, when the payment period of an order expires without the order being

View File

@@ -77,6 +77,6 @@ Attribution
-----------
This Code of Conduct is adapted from the `Contributor Covenant`_, version 1.4,
available at http://contributor-covenant.org/version/1/4/
available at https://www.contributor-covenant.org/version/1/4/
.. _Contributor Covenant: http://contributor-covenant.org
.. _Contributor Covenant: https://www.contributor-covenant.org

View File

@@ -9,7 +9,8 @@ constructive and friendly feedback on your changes.
First of all, you'll need pretix running locally on your machine. Head over to :ref:`devsetup` to learn how to do this.
If you run into any problems on your way, please do not hesitate to ask us anytime!
Please note that we have a :ref:`coc` in place that applies to all communication around the project.
Please note that we bound ourselves to a :ref:`coc` that applies to all communication around the project. You can be
assured that we will not tolerate any form of harassment.
Sending a patch
---------------

View File

@@ -1,5 +1,5 @@
Contribution guide
==================
Contributing to pretix
======================
.. toctree::
:maxdepth: 2

View File

@@ -1,39 +1,33 @@
Coding style
============
Coding style and quality
========================
Python code
-----------
* Basically, we want all python code to follow the `PEP 8`_ standard. There are a few exceptions where
we see things differently or just aren't that strict. The ``setup.cfg`` file in the project's source
folder contains definitions that allow `flake8`_ to check for violations automatically. See :ref:`checksandtests`
for more information. Use four spaces for indentation.
* Basically: Follow `PEP 8`_.
* We sort our imports by a certain schema, but you don't have to do this by hand. Again, ``setup.cfg`` contains
some definitions that allow the command ``isort -rc <directory>`` to automatically sort the imports in your source
files.
Use `flake8`_ to check for conformance problems. The project includes a setup.cfg file
with a default configuration for flake8 that excludes migrations and other non-relevant
code parts. It also silences a few checks, e.g. ``N802`` (function names should be lowercase)
and increases the maximum line length to more than 79 characters. **However** you should
still name all your functions lowercase [#f1]_ and keep your lines short when possible.
* For templates and models, please take a look at the `Django Coding Style`_. We like Django's `class-based views`_ and
kindly ask you to use them where appropriate.
* Our build server will reject all code violating other flake8 checks than the following:
* Please remember to always mark all strings ever displayed to any user for `translation`_.
* E123: closing bracket does not match indentation of opening brackets line
* F403: ``from module import *`` used; unable to detect undefined names
* F401: module imported but unused
* N802: function names should be lowercase
* We expect all new code to come with proper tests. When writing new tests, please write them using `pytest-style`_
test functions and raw ``assert`` statements. Use `fixtures`_ to prevent repetitive code. Some old parts of pretix'
test suite are in the style of Python's unit test module. If you extend those files, you might continue in this style,
but please use pytest style for any new test files.
So please make sure that you *always* follow all other rules and break these rules *only when
it makes sense*.
* Use ``isort -rc pretix`` in the source directory to order your imports.
* Indent your code with four spaces.
* For templates and models, follow the `Django Coding Style`_.
* Use Django's class-based views
* Always mark all strings ever displayed to any user for translation.
* Please keep the first line of your commit messages short. When referencing an issue, please phrase it like
``Fix #123 -- Problems with order creation`` or ``Refs #123 -- Fix this part of that bug``.
.. _PEP 8: http://legacy.python.org/dev/peps/pep-0008/
.. _PEP 8: https://legacy.python.org/dev/peps/pep-0008/
.. _flake8: https://pypi.python.org/pypi/flake8
.. _Django Coding Style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/
.. [#f1] But Python's very own ``unittest`` module forces us to use ``setUp`` as a method name...
.. _translation: https://docs.djangoproject.com/en/1.11/topics/i18n/translation/
.. _class-based views: https://docs.djangoproject.com/en/1.11/topics/class-based-views/
.. _pytest-style: https://docs.pytest.org/en/latest/assert.html
.. _fixtures: https://docs.pytest.org/en/latest/fixture.html

View File

@@ -14,7 +14,7 @@ Implementing a task
A common pattern for implementing asynchronous tasks can be seen a lot in ``pretix.base.services``
and looks like this::
from pretix.celery import app
from pretix.celery_app import app
@app.task
def my_task(argument1, argument2):

View File

@@ -2,6 +2,9 @@ Sending Email
=============
pretix allows event organizers to configure how they want to send emails to their users in multiple ways.
Therefore, all emails should be sent through the following function:
Therefore, all emails should be sent through the following function.
If the email you send is related to an order, you should also take a look at the
:py:meth:`~pretix.base.models.Order.send_mail` of the order model.
.. autofunction:: pretix.base.services.mail.mail

View File

@@ -16,4 +16,5 @@ Contents:
settings
background
email
permissions
logging

View File

@@ -1,9 +1,11 @@
Logging
=======
Logging and notifications
=========================
As pretix is handling monetary transactions, we are very careful to make it possible to review all changes
in the system that lead to the current state.
.. _`logging`:
Logging changes
---------------
@@ -19,7 +21,7 @@ To actually log an action, you can just call the ``log_action`` method on your o
order.log_action('pretix.event.order.canceled', user=user, data={})
The positional ``action`` argument should represent the type of action and should be globally unique, we
recomment do prefix it with your packagename, e.g. ``paypal.payment.rejected``. The ``user`` argument is
recommend to prefix it with your package name, e.g. ``paypal.payment.rejected``. The ``user`` argument is
optional and may contain the user who performed the action. The optional ``data`` argument can contain
additional information about this action.
@@ -81,6 +83,61 @@ implementation could look like::
if logentry.action_type in plains:
return plains[logentry.action_type]
Sending notifications
---------------------
If you think that the logged information might be important or urgent enough to send out a notification to interested
organizers. In this case, you should listen for the :py:attr:`pretix.base.signals.register_notification_types` signal
to register a notification type::
@receiver(register_notification_types)
def register_my_notification_types(sender, **kwargs):
return [MyNotificationType(sender)]
Note that this event is different than other events send out by pretix: ``sender`` may be an event or ``None``. The
latter case is required to let the user define global notification preferences for all events.
You also need to implement a custom class that specifies how notifications should be handled for your notification type.
You should subclass the base ``NotificationType`` class and implement all its members:
.. autoclass:: pretix.base.notifications.NotificationType
:members: action_type, verbose_name, required_permission, build_notification
A simple implementation could look like this::
class MyNotificationType(NotificationType):
required_permission = "can_view_orders"
action_type = "pretix.event.order.paid"
verbose_name = _("Order has been paid")
def build_notification(self, logentry: LogEntry):
order = logentry.content_object
order_url = build_absolute_uri(
'control:event.order',
kwargs={
'organizer': logentry.event.organizer.slug,
'event': logentry.event.slug,
'code': order.code
}
)
n = Notification(
event=logentry.event,
title=_('Order {code} has been marked as paid').format(code=order.code),
url=order_url
)
n.add_attribute(_('Order code'), order.code)
n.add_action(_('View order details'), order_url)
return n
As you can see, the relevant code is in the ``build_notification`` method that is supposed to create a ``Notification``
method that has a title, description, URL, attributes, and actions. The full definition of ``Notification`` is the
following:
.. autoclass:: pretix.base.notifications.Notification
:members: add_action, add_attribute
Logging technical information
-----------------------------

View File

@@ -1,6 +1,8 @@
.. highlight:: python
:linenothreshold: 5
.. spelling:: answ contrib
Data model
==========
@@ -20,18 +22,30 @@ Organizers and events
.. autoclass:: pretix.base.models.Organizer
:members:
.. autoclass:: pretix.base.models.OrganizerPermission
:members:
.. autoclass:: pretix.base.models.Event
:members: get_date_from_display, get_time_from_display, get_date_to_display, get_date_range_display, presale_has_ended, presale_is_running, cache, lock, get_plugins, get_mail_backend, payment_term_last, get_payment_providers, get_invoice_renderers, active_subevents, invoice_renderer, settings
.. autoclass:: pretix.base.models.SubEvent
:members: get_date_from_display, get_time_from_display, get_date_to_display, get_date_range_display, presale_has_ended, presale_is_running
.. autoclass:: pretix.base.models.Team
:members:
.. autoclass:: pretix.base.models.EventPermission
.. autoclass:: pretix.base.models.TeamAPIToken
:members:
.. autoclass:: pretix.base.models.RequiredAction
:members:
.. autoclass:: pretix.base.models.EventMetaProperty
:members:
.. autoclass:: pretix.base.models.EventMetaValue
:members:
.. autoclass:: pretix.base.models.SubEventMetaValue
:members:
Items
-----
@@ -45,6 +59,15 @@ Items
.. autoclass:: pretix.base.models.ItemVariation
:members:
.. autoclass:: pretix.base.models.SubEventItem
:members:
.. autoclass:: pretix.base.models.SubEventItemVariation
:members:
.. autoclass:: pretix.base.models.ItemAddOn
:members:
.. autoclass:: pretix.base.models.Question
:members:
@@ -63,11 +86,20 @@ Carts and Orders
.. autoclass:: pretix.base.models.OrderPosition
:members:
.. autoclass:: pretix.base.models.OrderFee
:members:
.. autoclass:: pretix.base.models.OrderPayment
:members:
.. autoclass:: pretix.base.models.OrderRefund
:members:
.. autoclass:: pretix.base.models.CartPosition
:members:
.. autoclass:: pretix.base.models.QuestionAnswer
:members:
:members:
.. autoclass:: pretix.base.models.Checkin
:members:
@@ -92,5 +124,3 @@ Vouchers
.. autoclass:: pretix.base.models.Voucher
:members:
.. _cleanerversion: https://github.com/swisscom/cleanerversion

View File

@@ -0,0 +1,194 @@
Permissions
===========
pretix uses a fine-grained permission system to control who is allowed to control what parts of the system.
The central concept here is the concept of *Teams*. You can read more on `configuring teams and permissions <user-teams>`_
and the :class:`pretix.base.models.Team` model in the respective parts of the documentation. The basic digest is:
An organizer account can have any number of teams, and any number of users can be part of a team. A team can be
assigned a set of permissions and connected to some or all of the events of the organizer.
A second way to access pretix is via the REST API, which allows authentication via tokens that are bound to a team,
but not to a user. You can read more at :class:`pretix.base.models.TeamAPIToken`. This page will show you how to
work with permissions in plugins and within the pretix code base.
Requiring permissions for a view
--------------------------------
pretix provides a number of useful mixins and decorators that allow you to specify that a user needs a certain
permission level to access a view::
from pretix.control.permissions import (
OrganizerPermissionRequiredMixin, organizer_permission_required
)
class MyOrgaView(OrganizerPermissionRequiredMixin, View):
permission = 'can_change_organizer_settings'
# Only users with the permission ``can_change_organizer_settings`` on
# this organizer can access this
class MyOtherOrgaView(OrganizerPermissionRequiredMixin, View):
permission = None
# Only users with *any* permission on this organizer can access this
@organizer_permission_required('can_change_organizer_settings')
def my_orga_view(request, organizer, **kwargs):
# Only users with the permission ``can_change_organizer_settings`` on
# this organizer can access this
@organizer_permission_required()
def my_other_orga_view(request, organizer, **kwargs):
# Only users with *any* permission on this organizer can access this
Of course, the same is available on event level::
from pretix.control.permissions import (
EventPermissionRequiredMixin, event_permission_required
)
class MyEventView(EventPermissionRequiredMixin, View):
permission = 'can_change_event_settings'
# Only users with the permission ``can_change_event_settings`` on
# this event can access this
class MyOtherEventView(EventPermissionRequiredMixin, View):
permission = None
# Only users with *any* permission on this event can access this
@event_permission_required('can_change_event_settings')
def my_event_view(request, organizer, **kwargs):
# Only users with the permission ``can_change_event_settings`` on
# this event can access this
@event_permission_required()
def my_other_event_view(request, organizer, **kwargs):
# Only users with *any* permission on this event can access this
You can also require that this view is only accessible by system administrators with an active "admin session"
(see below for what this means)::
from pretix.control.permissions import (
AdministratorPermissionRequiredMixin, administrator_permission_required
)
class MyGlobalView(AdministratorPermissionRequiredMixin, View):
# ...
@administrator_permission_required
def my_global_view(request, organizer, **kwargs):
# ...
In rare cases it might also be useful to expose a feature only to people who have a staff account but do not
necessarily have an active admin session::
from pretix.control.permissions import (
StaffMemberRequiredMixin, staff_member_required
)
class MyGlobalView(StaffMemberRequiredMixin, View):
# ...
@staff_member_required
def my_global_view(request, organizer, **kwargs):
# ...
Requiring permissions in the REST API
-------------------------------------
When creating your own ``viewset`` using Django REST framework, you just need to set the ``permission`` attribute
and pretix will check it automatically for you::
class MyModelViewSet(viewsets.ReadOnlyModelViewSet):
permission = 'can_view_orders'
Checking permission in code
---------------------------
If you need to work with permissions manually, there are a couple of useful helper methods on the :class:`pretix.base.models.Event`,
:class:`pretix.base.models.User` and :class:`pretix.base.models.TeamAPIToken` classes. Here's a quick overview.
Return all users that are in any team that is connected to this event::
>>> event.get_users_with_any_permission()
<QuerySet: …>
Return all users that are in a team with a specific permission for this event::
>>> event.get_users_with_permission('can_change_event_settings')
<QuerySet: …>
Determine if a user has a certain permission for a specific event::
>>> user.has_event_permission(organizer, event, 'can_change_event_settings', request=request)
True
Determine if a user has any permission for a specific event::
>>> user.has_event_permission(organizer, event, request=request)
True
In the two previous commands, the ``request`` argument is optional, but required to support staff sessions (see below).
The same method exists for organizer-level permissions::
>>> user.has_organizer_permission(organizer, 'can_change_event_settings', request=request)
True
Sometimes, it might be more useful to get the set of permissions at once::
>>> user.get_event_permission_set(organizer, event)
{'can_change_event_settings', 'can_view_orders', 'can_change_orders'}
>>> user.get_organizer_permission_set(organizer, event)
{'can_change_organizer_settings', 'can_create_events'}
Within a view on the ``/control`` subpath, the results of these two methods are already available in the
``request.eventpermset`` and ``request.orgapermset`` properties. This makes it convenient to query them in templates::
{% if "can_change_orders" in request.eventpermset %}
{% endif %}
You can also do the reverse to get any events a user has access to::
>>> user.get_events_with_permission('can_change_event_settings', request=request)
<QuerySet: …>
>>> user.get_events_with_any_permission(request=request)
<QuerySet: …>
Most of these methods work identically on :class:`pretix.base.models.TeamAPIToken`.
Staff sessions
--------------
.. versionchanged:: 1.14
In 1.14, the ``User.is_superuser`` attribute has been deprecated and statically set to return ``False``. Staff
sessions have been newly introduced.
System administrators of a pretix instance are identified by the ``is_staff`` attribute on the user model. By default,
the regular permission rules apply for users with ``is_staff = True``. The only difference is that such users can
temporarily turn on "staff mode" via a button in the user interface that grants them **all permissions** as long as
staff mode is active. You can check if a user is in staff mode using their session key:
>>> user.has_active_staff_session(request.session.session_key)
False
Staff mode has a hard time limit and during staff mode, a middleware will log all requests made by that user. Later,
the user is able to also save a message to comment on what they did in their administrative session. This feature is
intended to help compliance with data protection rules as imposed e.g. by GDPR.

View File

@@ -35,7 +35,7 @@ Forms
-----
Hierarkey also provides a base class for forms that allow the modification of settings. pretix contains a
subclass that also adds suport for internationalized fields:
subclass that also adds support for internationalized fields:
.. autoclass:: pretix.base.forms.SettingsForm
@@ -65,4 +65,4 @@ Plugins can add custom hardcoded defaults in the following way::
Make sure that you include this code in a module that is imported at app loading time.
.. _django-hierarkey: https://github.com/raphaelm/django-hierarkey
.. _documentation: https://django-hierarkey.readthedocs.io/en/latest/
.. _documentation: https://django-hierarkey.readthedocs.io/en/latest/

View File

@@ -67,7 +67,7 @@ available as ``plugins:sendmail:send``.
Generating a URL for the frontend is a complicated task, because you need to know whether the event's
organizer uses a custom URL or not and then generate the URL with a different domain and different
arguments based on this information. pretix provides some helpers to make this easier. The first helper
is a python method that emulates a behaviour similar to ``reverse``:
is a python method that emulates a behavior similar to ``reverse``:
.. autofunction:: pretix.multidomain.urlreverse.eventreverse
@@ -82,5 +82,5 @@ Implementation details
----------------------
There are some other caveats when using a design like this, e.g. you have to care about cookie domains
and referer verification yourself. If you want to see how we built this, look into the ``pretix/multidomain/``
and referrer verification yourself. If you want to see how we built this, look into the ``pretix/multidomain/``
sub-tree.

View File

@@ -1,17 +1,13 @@
Developer documentation
=======================
Contents:
.. toctree::
:maxdepth: 2
concepts
setup
structure
contribution/index
implementation/index
translation/index
api/index
.. TODO::
Document settings objects, ItemVariation objects, form fields.
structure

View File

@@ -1,7 +1,11 @@
.. _`devsetup`:
The development setup
=====================
Development setup
=================
This tutorial helps you to get started hacking with pretix on your own computer. You need this to
be able to contribute to pretix, but it might also be helpful if you want to write your own plugins.
If you want to install pretix on a server for actual usage, go to the :ref:`admindocs` instead.
Obtain a copy of the source code
--------------------------------
@@ -12,9 +16,10 @@ You can just clone our git repository::
External Dependencies
---------------------
* Python 3.4 or newer
Your should install the following on your system:
* Python 3.5 or newer
* ``pip`` for Python 3 (Debian package: ``python3-pip``)
* ``pyvenv`` for Python 3 (Debian package: ``python3-venv``)
* ``python-dev`` for Python 3 (Debian package: ``python3-dev``)
* ``libffi`` (Debian package: ``libffi-dev``)
* ``libssl`` (Debian package: ``libssl-dev``)
@@ -31,7 +36,7 @@ Please execute ``python -V`` or ``python3 -V`` to make sure you have Python 3.4
execute ``pip3 -V`` to check. Then use Python's internal tools to create a virtual
environment and activate it for your current session::
pyvenv env
python3 -m venv env
source env/bin/activate
You should now see a ``(env)`` prepended to your shell prompt. You have to do this
@@ -40,7 +45,7 @@ automatically). If you are working on Ubuntu or Debian, we strongly recommend up
your pip and setuptools installation inside the virtual environment, otherwise some of
the dependencies might fail::
pip3 install -U pip setuptools==28.6.1
pip3 install -U pip setuptools
Working with the code
---------------------
@@ -49,10 +54,6 @@ The first thing you need are all the main application's dependencies::
cd src/
pip3 install -r requirements.txt -r requirements/dev.txt
If you are working with Python 3.4, you will also need (you can skip this for Python 3.5)::
pip3 install -r requirements/py34.txt
Next, you need to copy the SCSS files from the source folder to the STATIC_ROOT directory::
python manage.py collectstatic --noinput
@@ -81,7 +82,7 @@ and head to http://localhost:8000/
As we did not implement an overall front page yet, you need to go directly to
http://localhost:8000/control/ for the admin view or, if you imported the test
data as suggested above, to the event page at http://localhost:8000/bigevents/2017/
data as suggested above, to the event page at http://localhost:8000/bigevents/2019/
.. note:: If you want the development server to listen on a different interface or
port (for example because you develop on `pretixdroid`_), you can check
@@ -91,11 +92,18 @@ data as suggested above, to the event page at http://localhost:8000/bigevents/20
Code checks and unit tests
^^^^^^^^^^^^^^^^^^^^^^^^^^
Before you check in your code into git, always run the static checkers and unit tests::
Before you check in your code into git, always run static checkers and linters. If any of these commands fail,
your pull request will not be merged into pretix. If you have trouble figuring out *why* they fail, create your
pull request nevertheless and ask us for help, we are happy to assist you.
Execute the following commands to check for code style errors::
flake8 .
isort -c -rc .
python manage.py check
Execute the following command to run pretix' test suite (might take a couple of minutes)::
py.test
.. note:: If you have multiple CPU cores and want to speed up the test suite, you can install the python
@@ -103,14 +111,24 @@ Before you check in your code into git, always run the static checkers and unit
``NUM`` being the number of threads you want to use.
It is a good idea to put this command into your git hook ``.git/hooks/pre-commit``,
for example::
for example, to check for any errors in any staged files when committing::
#!/bin/sh
#!/bin/bash
cd $GIT_DIR/../src
source ../env/bin/activate
flake8 --ignore=E123,E128,F403,F401,N802,W503 .
export GIT_WORK_TREE=../
export GIT_DIR=../.git
source ../env/bin/activate # Adjust to however you activate your virtual environment
for file in $(git diff --cached --name-only | grep -E '\.py$' | grep -Ev "migrations|mt940\.py|pretix/settings\.py|make_testdata\.py|testutils/settings\.py|tests/settings\.py|pretix/base/models/__init__\.py")
do
echo $file
git show ":$file" | flake8 - --stdin-display-name="$file" || exit 1 # we only want to lint the staged changes, not any un-staged changes
git show ":$file" | isort -df --check-only - | grep ERROR && exit 1 || true
done
This keeps you from accidentally creating commits violating the style guide.
Working with mails
^^^^^^^^^^^^^^^^^^
If you want to test anything regarding emails in your development setup, we recommend
@@ -132,6 +150,10 @@ and update the ``*.po`` files accordingly::
make localegen
However, most of the time you don't need to care about this. Just create your pull request
with functionality and English strings only, and we'll push the new translation strings
to our translation platform after the merge.
To actually see pretix in your language, you have to compile the ``*.po`` files to their
optimized binary ``*.mo`` counterparts::
@@ -151,8 +173,14 @@ To build the documentation, run the following command from the ``doc/`` director
make html
You will now find the generated documentation in the ``doc/_build/html/`` subdirectory.
You will now find the generated documentation in the ``doc/_build/html/`` subdirectory. If you work
with the documentation a lot, you might find it useful to use sphinx-autobuild::
pip3 install sphinx-autobuild
sphinx-autobuild . _build/html -p 8081
Then, go to http://localhost:8081 for a version of the documentation that automatically re-builds
whenever you change a source file.
.. _Django's documentation: https://docs.djangoproject.com/en/1.11/ref/django-admin/#runserver
.. _pretixdroid: https://github.com/pretix/pretixdroid

View File

@@ -1,13 +1,10 @@
Project structure
=================
Python source code
------------------
Directory structure
===================
All the source code lives in ``src/``, which has several subdirectories.
pretix/
This directory contains nearly all source code.
This directory contains nearly all source code that belongs to pretix.
base/
This is the Django app containing all the models and methods which are
@@ -19,57 +16,31 @@ pretix/
presale/
This is the Django app containing the front end for users buying tickets.
api/
This is the Django app containing all views and serializers for pretix'
:ref:`rest-api`.
helpers/
Helpers contain a very few modules providing workarounds for low-level flaws in
Django or installed 3rd-party packages.
locale/
Contains translation file for pretix
multidomain/
Additional code implementing our customized :ref:`URL handling <urlconf>`.
static/
Contains all static files (CSS, JavaScript, images)
static/
Contains all static files (CSS/SASS, JavaScript, images) of pretix' core
We use libsass as a preprocessor for CSS. Our own sass code is built in the same
step as Bootstrap and FontAwesome, so their mixins etc. are fully available.
testutils/
Contains helper methods that are useful to write the test suite for pretix or test
suites for pretix plugins.
tests/
This is the root directory for all test codes. It includes subdirectories ``base``,
``control``, ``presale``, ``helpers`` and ``plugins`` to mirror the structure of the
``pretix`` source code as well as ``testdummy``, which is a pretix plugin used during
This is the root directory for all test codes. It includes subdirectories ``api``, ``base``,
``control``, ``presale``, ``helpers`, ``multidomain`` and ``plugins`` to mirror the structure
of the pretix source code as well as ``testdummy``, which is a pretix plugin used during
testing.
Language files
--------------
The language files live in ``locale/*/LC_MESSAGES/``.
Static files
------------
Sass source code
^^^^^^^^^^^^^^^^
We use libsass as a preprocessor for CSS. Our own sass code is built in the same
step as Bootstrap and FontAwesome, so their mixins etc. are fully available.
pretix.control
pretixcontrol has two main SCSS files, ``pretix/control/static/pretixcontrol/scss/main.scss`` and
``pretix/control/static/pretixcontrol/scss/auth.scss``, importing everything else.
pretix.presale
pretixpresale has one main SCSS files, ``pretix/control/static/pretix/presale/scss/main.scss``,
importing everything else.
3rd-party assets
^^^^^^^^^^^^^^^^
Bootstrap
Bootstrap lives vendored at ``static/bootstrap/``
Font Awesome
Font Awesome lives vendored at ``static/fontawesome/``
jQuery
jQuery lives as a single JavaScript file in ``static/jquery/js/``
jQuery plugin: Django formsets
Our own modified version of `django-formset-js`_ is available as an independent
django app and installed via ``pip``.
.. _django-formset-js: https://github.com/pretix/django-formset-js

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

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