Compare commits

...

895 Commits

Author SHA1 Message Date
Raphael Michel
8e20b07610 Fix MySQL package 2018-05-28 10:12:47 +02:00
Raphael Michel
ffeb1e1746 Bump version to 1.15.2 2018-05-28 10:06:18 +02:00
Felix Rindt
4692b3e9d2 Fix bug in date/time question stats (#916)
Fix bug in date/time question stats
2018-05-28 10:05:30 +02:00
Raphael Michel
98ea9ae91c Fix setup.py 2018-05-28 09:59:59 +02:00
Raphael Michel
40f401b549 Upgrade kombu 2018-05-28 09:59:59 +02:00
Raphael Michel
37e279bf27 Pin celery version 2018-05-28 09:59:59 +02:00
Raphael Michel
92addff5d3 Bump version to 1.15.1 2018-05-11 14:50:44 +02:00
Felix Rindt
585578edf2 Add subevent bulk create button when no exist (#904) 2018-05-11 14:46:06 +02:00
Raphael Michel
12271047e6 Fix #903 -- Incorrect price calculation for variations 2018-05-11 14:46:06 +02:00
robbi5
8413269c32 Add badge plugin support to MANIFEST.in (#902) 2018-05-11 14:46:06 +02:00
Raphael Michel
1f01ef6e37 Do not show end time if not set 2018-05-11 14:46:06 +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
729 changed files with 210561 additions and 12387 deletions

24
.gitattributes vendored
View File

@@ -1,13 +1,17 @@
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/colorpicker/* linguist-vendored
src/static/fileupload/* linguist-vendored
src/static/charts/* linguist-vendored
src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/fabric.* linguist-vendored
src/pretix/plugins/ticketoutputpdf/static/pretixplugins/ticketoutputpdf/pdf.* 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

View File

@@ -8,6 +8,8 @@ tests:
- XDG_CACHE_HOME=/cache bash .travis.sh tests
tags:
- python3
except:
- pypi
pypi:
stage: release
script:
@@ -17,12 +19,16 @@ pypi:
- pip install -U pip wheel setuptools
- XDG_CACHE_HOME=/cache pip3 install -Ur src/requirements.txt -r src/requirements/dev.txt -r src/requirements/py34.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:
- release
- pypi
artifacts:
paths:
- src/dist/

View File

@@ -25,19 +25,27 @@ if [ "$1" == "doctests" ]; then
cd doc
make doctest
fi
if [ "$1" == "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" == "tests" ]; then
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.txt
cd src
python manage.py check
make all compress
py.test --rerun 5 tests
py.test --reruns 5 tests
fi
if [ "$1" == "tests-cov" ]; then
pip3 install -r src/requirements.txt -Ur src/requirements/dev.txt -r src/requirements/py34.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
@@ -50,7 +58,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

@@ -12,29 +12,37 @@ 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
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
env: JOB=tests-cov
- python: 3.6
env: JOB=style
- python: 3.4
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg
- python: 3.5
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_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
- 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
- python: 3.6
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
- python: 3.6
env: JOB=plugins
- python: 3.6
env: JOB=tests-cov
env: JOB=spelling
addons:
postgresql: "9.4"
apt:
packages:
- enchant
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

@@ -3,7 +3,7 @@ FROM python:3.6
RUN apt-get update && \
apt-get install -y git 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 supervisor nginx sudo \
default-libmysqlclient-dev libmemcached-dev libjpeg-dev supervisor nginx sudo \
--no-install-recommends && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \

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,6 +2,7 @@
cd /pretix/src
export DJANGO_SETTINGS_MODULE=production_settings
export DATA_DIR=/data/
export HOME=/pretix
NUM_WORKERS=10
if [ ! -d /data/logs ]; then

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."

View File

@@ -6063,3 +6063,39 @@ url('../opensans_regular_macroman/OpenSans-Regular-webfont.svg#open_sansregular'
white-space: normal;
}
}
img.screenshot, a.screenshot img {
box-shadow: 0 4px 18px 0 rgba(0,0,0,0.1), 0 6px 20px 0 rgba(0,0,0,0.09);
}
/* Changes */
.versionchanged {
background: #e7f2fa;
padding: 12px;
line-height: 24px;
margin-bottom: 24px;
-webkit-font-smoothing: antialiased;
}
.versionmodified {
background: #6ab0de;
font-weight: bold;
display: block;
color: #fff;
margin: -12px;
padding: 6px 12px;
margin-bottom: 12px;
font-family: inherit;
}
.versionmodified:before {
font-family: "FontAwesome";
display: inline-block;
font-style: normal;
font-weight: normal;
line-height: 1;
text-decoration: inherit;
content: "";
margin-right: 4px;
}
.versionchanged p:last-child {
margin-bottom: 0;
}

View File

@@ -2,6 +2,8 @@
.. _`config`:
.. spelling:: Galera
Configuration file
==================
@@ -10,7 +12,7 @@ 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. ``PREFIX_CONFIG_FILE`` environment variable
1. ``PRETIX_CONFIG_FILE`` environment variable
2. ``/etc/pretix/pretix.cfg``
3. ``~/.pretix.cfg``
4. ``pretix.cfg`` in the current working directory
@@ -45,7 +47,7 @@ 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.
@@ -60,6 +62,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
---------------
@@ -164,14 +178,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
@@ -283,4 +292,4 @@ various places like order codes, secrets in the ticket QR codes, etc. Example::
voucher_code=16
.. _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

@@ -162,7 +162,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 +239,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 +268,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

@@ -1,5 +1,7 @@
.. highlight:: ini
.. spelling:: SQL
General remarks
===============

View File

@@ -177,7 +177,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 +213,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 +276,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 +298,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

@@ -4,6 +4,8 @@ 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`:
Obtaining an API token
----------------------
@@ -13,12 +15,14 @@ or choose an existing team that has the level of permissions the token should ha
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
Authentication
--------------
@@ -40,6 +44,25 @@ like the following:
adding OAuth2 support in the future for user-level authentication. If you want
to use session authentication, be sure 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
-------------

View File

@@ -22,6 +22,10 @@ is_addon boolean If ``True``, it
defining add-ons for other products.
===================================== ========================== =======================================================
.. versionchanged:: 1.14
The operations POST, PATCH, PUT and DELETE have been added.
Endpoints
---------
@@ -44,7 +48,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -90,7 +94,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -106,3 +110,118 @@ Endpoints
: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"},
"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"},
"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"},
"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,622 @@
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.
.. 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_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"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.
: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.
**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_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"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.
:<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

@@ -25,10 +25,22 @@ presale_start datetime The date at whi
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
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.
Endpoints
---------
@@ -36,6 +48,8 @@ Endpoints
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
@@ -50,7 +64,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -69,7 +83,14 @@ Endpoints
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false
"has_subevents": false,
"meta_data": {},
"plugins": [
"pretix.plugins.banktransfer"
"pretix.plugins.stripe"
"pretix.plugins.paypal"
"pretix.plugins.ticketoutputpdf"
]
}
]
}
@@ -84,6 +105,8 @@ Endpoints
Returns information on one event, identified by its slug.
Permission required: "Can change event settings"
**Example request**:
.. sourcecode:: http
@@ -98,7 +121,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
@@ -112,7 +135,14 @@ Endpoints
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false
"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
@@ -120,3 +150,242 @@ Endpoints
: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

@@ -7,11 +7,16 @@ Resources and endpoints
organizers
events
subevents
taxrules
categories
items
item_variations
item_add-ons
questions
question_options
quotas
orders
invoices
vouchers
checkinlists
waitinglist

View File

@@ -29,9 +29,19 @@ payment_provider_text string Text to be prin
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 VAT
├ tax_value money (string) VAT amount
tax_rate decimal (string) Used VAT rate
├ 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.
===================================== ========================== =======================================================
@@ -42,6 +52,17 @@ lines list of objects The actual invo
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
---------
@@ -63,7 +84,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -80,6 +101,7 @@ Endpoints
"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",
@@ -88,9 +110,13 @@ Endpoints
"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"
}
]
}
@@ -99,7 +125,7 @@ Endpoints
: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 refering to the given invoice 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``
@@ -127,7 +153,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"number": "SAMPLECONF-00001",
@@ -139,6 +165,7 @@ Endpoints
"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",
@@ -147,9 +174,13 @@ Endpoints
"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
@@ -190,5 +221,61 @@ Endpoints
: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 vor a few
: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.

View File

@@ -27,11 +27,13 @@ free_price boolean If ``True``, cu
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).
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
@@ -49,10 +51,13 @@ min_per_order integer This product ca
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).
has_variations boolean Shows whether or not this item has variations
(read-only).
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.
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.
Can be empty. Only writable during creation,
use separate endpoint to modify this later.
├ 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
@@ -62,14 +67,36 @@ variations list of objects A list with one
├ 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
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 maxima number of add-ons that can 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``.
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
---------
@@ -92,7 +119,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -108,6 +135,7 @@ Endpoints
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
@@ -118,6 +146,7 @@ Endpoints
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"variations": [
{
@@ -177,7 +206,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -188,6 +217,7 @@ Endpoints
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
@@ -198,6 +228,7 @@ Endpoints
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"variations": [
{
@@ -226,3 +257,226 @@ Endpoints
: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"},
"default_price": "23.00",
"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,
"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"},
"default_price": "23.00",
"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": true,
"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"},
"default_price": "25.00",
"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": true,
"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.

View File

@@ -1,3 +1,5 @@
.. spelling:: checkins
Orders
======
@@ -24,23 +26,41 @@ email string The customer em
locale string The locale used for communication with this customer
datetime datetime Time of order creation
expires datetime The order will expire, if it is still pending by this time
payment_date date Date of payment receival
payment_date date Date of payment receipt
payment_provider string Payment provider used for this order
payment_fee money (string) Payment fee included in this order's total
payment_fee_tax_rate decimal (string) VAT rate applied to the payment fee
payment_fee_tax_value money (string) VAT value included in the payment fee
total money (string) Total value of this order
comment string Internal comment on this order
checkin_attention boolean If ``True``, the check-in app should show a warning
that this ticket requires special attention if a ticket
of this order is scanned.
invoice_address object Invoice address information (can be ``null``)
├ last_modified datetime Last modification date of the address
├ company string Customer company name
├ is_business boolean Business or individual customers (always ``False``
for orders created before pretix 1.7, do not rely on
it).
├ name string Customer name
├ street string Customer street
├ zipcode string Customer ZIP code
├ city string Customer city
├ country string Customer country
└ vat_id string Customer VAT ID
├ internal_reference string Customer's internal reference to be printed on the invoice
├ vat_id string Customer VAT ID
└ vat_id_validated string ``True``, if the VAT ID has been validated against the
EU VAT service and validation was successful. This only
happens in rare cases.
position list of objects List of order positions (see below)
fees list of objects List of fees included in the order total (i.e.
payment fees)
├ fee_type string Type of fee (currently ``payment``, ``passbook``,
``other``)
├ value money (string) Fee amount
├ description string Human-readable string with more details (can be empty)
├ internal_type string Internal string (i.e. ID of the payment provider),
can be empty
├ tax_rate decimal (string) VAT rate applied for this fee
├ tax_value money (string) VAT included in this fee
└ tax_rule integer The ID of the used tax rule (or ``null``)
downloads list of objects List of ticket download options for order-wise ticket
downloading. This might be a multi-page PDF or a ZIP
file of tickets for outputs that do not support
@@ -56,6 +76,27 @@ downloads list of objects List of ticket
The ``invoice_address.country`` attribute contains a two-letter country code for all new orders. For old orders,
a custom text might still be returned.
.. versionchanged:: 1.7
The attributes ``invoice_address.vat_id_validated`` and ``invoice_address.is_business`` have been added.
The attributes ``order.payment_fee``, ``order.payment_fee_tax_rate`` and ``order.payment_fee_tax_value`` have been
deprecated in favor of the new ``fees`` attribute but will still be served and removed in 1.9.
.. versionchanged:: 1.9
First write operations (``…/mark_paid/``, ``…/mark_pending/``, ``…/mark_canceled/``, ``…/mark_expired/``) have been added.
The attribute ``invoice_address.internal_reference`` has been added.
.. versionchanged:: 1.13
The field ``checkin_attention`` has been added.
.. versionchanged:: 1.15
The attributes ``order.payment_fee``, ``order.payment_fee_tax_rate``, ``order.payment_fee_tax_value`` and
``order.payment_fee_tax_rule`` have finally been removed.
.. _order-position-resource:
Order position resource
-----------------------
@@ -65,7 +106,7 @@ Order position resource
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the order positon
id integer Internal ID of the order position
code string Order code of the order the position belongs to
positionid integer Number of the position within the order
item integer ID of the purchased item
@@ -76,10 +117,12 @@ attendee_email string Specified atten
voucher integer Internal ID of the voucher used for this position (or ``null``)
tax_rate decimal (string) VAT rate applied for this position
tax_value money (string) VAT included in this position
tax_rule integer The ID of the used tax rule (or ``null``)
secret string Secret code printed on the tickets for validation
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``).
checkins list of objects List of check-ins with this ticket
├ list integer Internal ID of the check-in list
└ datetime datetime Time of check-in
downloads list of objects List of ticket download options
├ output string Ticket output provider (e.g. ``pdf``, ``passbook``)
@@ -87,13 +130,31 @@ downloads list of objects List of ticket
answers list of objects Answers to user-defined questions
├ question integer Internal ID of the answered question
├ answer string Text representation of the answer
└ options list of integers Internal IDs of selected option(s)s (only for choice types)
├ 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.7
The attribute ``tax_rule`` has been added.
.. versionchanged:: 1.11
The attribute ``checkins.list`` has been added.
.. versionchanged:: 1.14
The attributes ``answers.question_identifier`` and ``answers.option_identifiers`` have been added.
Order endpoints
---------------
.. versionchanged:: 1.15
Filtering for emails or order codes is now case-insensitive.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/
Returns a list of all orders within a given event.
@@ -112,7 +173,7 @@ Order endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -129,20 +190,22 @@ Order endpoints
"expires": "2017-12-10T10:00:00Z",
"payment_date": "2017-12-05",
"payment_provider": "banktransfer",
"payment_fee": "0.00",
"payment_fee_tax_rate": "0.00",
"payment_fee_tax_value": "0.00",
"fees": [],
"total": "23.00",
"comment": "",
"checkin_attention": false,
"invoice_address": {
"last_modified": "2017-12-01T10:00:00Z",
"is_business": True,
"company": "Sample company",
"name": "John Doe",
"street": "Test street 12",
"zipcode": "12345",
"city": "Testington",
"country": "Testikistan",
"vat_id": "EU123456789"
"internal_reference": "",
"vat_id": "EU123456789",
"vat_id_validated": False
},
"positions": [
{
@@ -157,18 +220,22 @@ Order endpoints
"voucher": null,
"tax_rate": "0.00",
"tax_value": "0.00",
"tax_rule": null,
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"checkins": [
{
"list": 44,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"question_identifier": "WY3TP9SL",
"answer": "Foo",
"option_idenfiters": [],
"options": []
}
],
@@ -221,7 +288,7 @@ Order endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"code": "ABC12",
@@ -233,20 +300,22 @@ Order endpoints
"expires": "2017-12-10T10:00:00Z",
"payment_date": "2017-12-05",
"payment_provider": "banktransfer",
"payment_fee": "0.00",
"payment_fee_tax_rate": "0.00",
"payment_fee_tax_value": "0.00",
"fees": [],
"total": "23.00",
"comment": "",
"checkin_attention": false,
"invoice_address": {
"last_modified": "2017-12-01T10:00:00Z",
"company": "Sample company",
"is_business": True,
"name": "John Doe",
"street": "Test street 12",
"zipcode": "12345",
"city": "Testington",
"country": "Testikistan",
"vat_id": "EU123456789"
"internal_reference": "",
"vat_id": "EU123456789",
"vat_id_validated": False
},
"positions": [
{
@@ -260,19 +329,23 @@ Order endpoints
"attendee_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"checkins": [
{
"list": 44,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"question_identifier": "WY3TP9SL",
"answer": "Foo",
"option_idenfiters": [],
"options": []
}
],
@@ -298,12 +371,13 @@ Order endpoints
: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 does not exist.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/download/(output)/
Download tickets for an order, identified by its order code. Depending on the chosen output, the response might
be a ZIP file, PDF file or something else. The order details response contains a list of output options for this
partictular order.
particular order.
Tickets can be only downloaded if the order is paid and if ticket downloads are active. Note that in some cases the
ticket file might not yet have been created. In that case, you will receive a status code :http:statuscode:`409` and
@@ -334,15 +408,218 @@ Order endpoints
: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
**or** downlodas are not available for this order at this time. The response content will
**or** downloads are not available for this order at this time. The response content will
contain more details.
:statuscode 409: The file is not yet ready and will now be prepared. Retry the request after waiting vor a few
:statuscode 404: The requested order or output provider does not exist.
: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)/orders/(code)/mark_paid/
Marks a pending or expired order as successfully paid.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/orders/ABC12/mark_paid/ 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
{
"code": "ABC12",
"status": "p",
...
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param code: The ``code`` field of the order to modify
:statuscode 200: no error
:statuscode 400: The order cannot be marked as paid, either because the current order status does not allow it or because no quota is left to perform the operation.
: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 does not exist.
: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)/orders/(code)/mark_canceled/
Marks a pending order as canceled.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/orders/ABC12/mark_canceled/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: text/json
{
"send_email": true
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"code": "ABC12",
"status": "c",
...
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param code: The ``code`` field of the order to modify
:statuscode 200: no error
:statuscode 400: The order cannot be marked as canceled since the current order status does not allow it.
: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 does not exist.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/mark_pending/
Marks a paid order as unpaid.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/orders/ABC12/mark_pending/ 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
{
"code": "ABC12",
"status": "n",
...
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param code: The ``code`` field of the order to modify
:statuscode 200: no error
:statuscode 400: The order cannot be marked as unpaid since the current order status does not allow it.
: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 does not exist.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/mark_expired/
Marks a unpaid order as expired.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/orders/ABC12/mark_expired/ 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
{
"code": "ABC12",
"status": "e",
...
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param code: The ``code`` field of the order to modify
:statuscode 200: no error
:statuscode 400: The order cannot be marked as expired since the current order status does not allow it.
: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 does not exist.
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/extend/
Extends the payment deadline of a pending order. If the order is already expired and quota is still
available, its state will be changed to pending.
The only required parameter of this operation is ``expires``, which should contain a date in the future.
Note that only a date is expected, not a datetime, since pretix will always set the deadline to the end of the
day in the event's timezone.
You can pass the optional parameter ``force``. If it is set to ``true``, the operation will be performed even if
it leads to an overbooked quota because the order was expired and the tickets have been sold again.
**Example request**:
.. sourcecode:: http
POST /api/v1/organizers/bigevents/events/sampleconf/orders/ABC12/extend/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
Content-Type: text/json
{
"expires": "2017-10-28",
"force": false
}
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"code": "ABC12",
"status": "n",
"expires": "2017-10-28T23:59:59Z",
...
}
:param organizer: The ``slug`` field of the organizer to modify
:param event: The ``slug`` field of the event to modify
:param code: The ``code`` field of the order to modify
:statuscode 200: no error
:statuscode 400: The order cannot be extended since the current order status does not allow it or no quota is available or the submitted date is invalid.
: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 does not exist.
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.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/
Returns a list of all order positions within a given event.
@@ -361,7 +638,7 @@ Order position endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -379,19 +656,23 @@ Order position endpoints
"attendee_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"checkins": [
{
"list": 44,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"question_identifier": "WY3TP9SL",
"answer": "Foo",
"option_idenfiters": [],
"options": []
}
],
@@ -410,16 +691,24 @@ Order position endpoints
``order__datetime``, ``positionid``, ``attendee_name``, and ``order__status``. Default:
``order__datetime,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 bollean has_checkin: If set to ``true`` or ``false``, only return positions that have or have not been
: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.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
@@ -444,7 +733,7 @@ Order position endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 23442,
@@ -457,19 +746,23 @@ Order position endpoints
"attendee_email": null,
"voucher": null,
"tax_rate": "0.00",
"tax_rule": null,
"tax_value": "0.00",
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"checkins": [
{
"list": 44,
"datetime": "2017-12-25T12:45:23Z"
}
],
"answers": [
{
"question": 12,
"question_identifier": "WY3TP9SL",
"answer": "Foo",
"option_idenfiters": [],
"options": []
}
],
@@ -487,12 +780,13 @@ Order position endpoints
: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 does not exist.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/(id)/download/(output)/
Download tickets for one order position, identified by its internal ID.
Depending on the chosen output, the response might be a ZIP file, PDF file or something else. The order details
response contains a list of output options for this partictular order position.
response contains a list of output options for this particular order position.
Tickets can be only downloaded if the order is paid and if ticket downloads are active. Also, depending on event
configuration downloads might be only unavailable for add-on products or non-admission products.
@@ -524,7 +818,8 @@ Order position endpoints
: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
**or** downlodas are not available for this order position at this time. The response content will
**or** downloads are not available for this order position at this time. The response content will
contain more details.
:statuscode 409: The file is not yet ready and will now be prepared. Retry the request after waiting vor a few
:statuscode 404: The requested order position or download provider does not exist.
:statuscode 409: The file is not yet ready and will now be prepared. Retry the request after waiting for a few
seconds.

View File

@@ -41,7 +41,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -77,7 +77,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"name": "Big Events LLC",

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: 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

@@ -1,3 +1,5 @@
.. spelling:: checkin
Questions
=========
@@ -23,19 +25,45 @@ type string The expected ty
* ``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.
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.
@@ -54,7 +82,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -68,17 +96,25 @@ Endpoints
"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"}
}
]
@@ -89,6 +125,9 @@ Endpoints
: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
@@ -113,7 +152,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -122,17 +161,25 @@ Endpoints
"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"}
}
]
@@ -144,3 +191,179 @@ Endpoints
: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

@@ -4,7 +4,7 @@ Quotas
Resource description
--------------------
Questions define how many times an item can be sold.
Quotas define how many times an item can be sold.
The quota resource contains the following public fields:
.. rst-class:: rest-resource-table
@@ -20,6 +20,10 @@ variations list of integers List of item va
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
---------
@@ -42,7 +46,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -88,7 +92,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -106,6 +110,131 @@ Endpoints
: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.
@@ -124,7 +253,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"available": true,

View File

@@ -31,8 +31,13 @@ variation_price_overrides list of objects List of variati
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.
Endpoints
---------
@@ -55,7 +60,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -78,7 +83,8 @@ Endpoints
"price": "12.00"
}
],
"variation_price_overrides": []
"variation_price_overrides": [],
"meta_data": {}
}
]
}
@@ -108,7 +114,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -126,7 +132,8 @@ Endpoints
"price": "12.00"
}
],
"variation_price_overrides": []
"variation_price_overrides": [],
"meta_data": {}
}
:param organizer: The ``slug`` field of the organizer to fetch

View File

@@ -0,0 +1,235 @@
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

@@ -44,6 +44,10 @@ subevent integer ID of the date
===================================== ========================== =======================================================
.. versionchanged:: 1.9
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
@@ -65,7 +69,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -136,7 +140,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -162,3 +166,151 @@ Endpoints
: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: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

@@ -27,6 +27,12 @@ subevent integer ID of the date
===================================== ========================== =======================================================
.. versionchanged:: 1.15
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added as well as a method to send out
vouchers.
Endpoints
---------
@@ -48,7 +54,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -102,7 +108,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -121,3 +127,161 @@ Endpoints
: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.

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,6 +13,10 @@
# 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
@@ -27,6 +31,13 @@ import django
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.
@@ -38,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']
@@ -281,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]

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.core.urlresolvers 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,35 +146,34 @@ 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
-----------------

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
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, contact_form_fields, question_form_fields, checkout_confirm_messages
:members: html_head, html_footer, footer_links, front_page_top, front_page_bottom, fee_calculation_for_cart, contact_form_fields, question_form_fields, checkout_confirm_messages, checkout_confirm_page_content
.. automodule:: pretix.presale.signals
@@ -47,20 +48,32 @@ Backend
-------
.. automodule:: pretix.control.signals
:members: nav_event, html_head, quota_detail_html, nav_topbar, nav_global, nav_organizer
:members: nav_event, html_head, quota_detail_html, nav_topbar, nav_global, nav_organizer, nav_event_settings, order_info, event_settings_widget
.. 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

@@ -11,5 +11,7 @@ Contents:
ticketoutput
payment
invoice
shredder
customview
general
quality

View File

@@ -13,7 +13,7 @@ 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 ticket outputs. Your plugin
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::

View File

@@ -102,6 +102,10 @@ The provider class
.. automethod:: order_control_refund_perform
.. automethod:: is_implicit
.. automethod:: shred_payment_info
Additional views
----------------

View File

@@ -114,6 +114,19 @@ method to make your receivers available::
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
-----
@@ -129,5 +142,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

@@ -59,7 +59,7 @@ 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

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

@@ -24,7 +24,7 @@ Coding style and quality
``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/
.. _translation: https://docs.djangoproject.com/en/1.11/topics/i18n/translation/

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

@@ -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
==========
@@ -21,7 +23,7 @@ Organizers and events
: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, get_cache, lock, get_plugins, get_mail_backend, payment_term_last, get_payment_providers, get_invoice_renderers, active_subevents, invoice_renderer, settings
: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
@@ -29,9 +31,21 @@ Organizers and events
.. autoclass:: pretix.base.models.Team
:members:
.. 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
-----

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

@@ -8,8 +8,6 @@ Developer documentation
setup
contribution/index
implementation/index
translation/index
api/index
structure
.. TODO::
Document settings objects, ItemVariation objects, form fields.

View File

@@ -20,7 +20,6 @@ Your should install the following on your system:
* Python 3.4 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``)
@@ -37,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
@@ -87,7 +86,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/2018/
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
@@ -107,7 +106,7 @@ Execute the following commands to check for code style errors::
isort -c -rc .
python manage.py check
Execute the following command to run pretix' test suite (might take a coumple of minutes)::
Execute the following command to run pretix' test suite (might take a couple of minutes)::
py.test
@@ -116,14 +115,21 @@ Execute the following command to run pretix' test suite (might take a coumple of
``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
flake8 . || exit 1
isort -q -rc -c . || exit 1
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$')
do
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 sdtyle guide.
This keeps you from accidentally creating commits violating the style guide.
Working with mails
^^^^^^^^^^^^^^^^^^
@@ -146,6 +152,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::

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

View File

@@ -0,0 +1,88 @@
Translating pretix
==================
pretix has been designed for multi-language capabilities from its start. Organizers can enter their event information
in multiple languages at the same time. However, the software interface of pretix also needs to be translated for
this to be useful.
Since we (the developers of pretix) only speak a very limited number of languages, we need help from the community
to achieve this goal. To make translating pretix easy not only for software developers, we set up a translation
platform at `translate.pretix.eu`_.
Official and inofficial languages
---------------------------------
In the pretix project, there are three types of languages:
Official languages
are translated and maintained by the core team behind pretix or as part of long-term partnerships. We are
committed to keeping these translations up-to-date with new features or changes in pretix and try to offer
support in this language.
Inofficial languages
are contributed and maintained by the Community. We ship them with pretix so you can use them, but we can not
guarantee that new or changed features in pretix will be translated in time.
Incubating languages
are currently in the process of being translated. They can not yet be selected in pretix by end users on
production installations and are only available in development mode for testing.
Please contact translate@pretix.eu if you think an incubated language should be promoted to an inofficial one or if
you are interested in a partnership to make your language official.
The current translation status of various languages is:
.. image:: https://translate.pretix.eu/widgets/pretix/-/multi-blue.svg
:target: https://translate.pretix.eu/engage/pretix/?utm_source=widget
Using our translation platform
------------------------------
If you visit `translate.pretix.eu`_ for the first time, it admittedly looks pretty bare.
.. image:: img/weblate1.png
:class: screenshot
It gets better if you create an account, which you will need to contribute translations. Click on "Register" in the
top-right corner to get started:
.. image:: img/weblate2.png
:class: screenshot
You can either create an account or choose to log in with your GitHub account, whichever you like more.
After creating and activating your account, we recommend that you change your profile and select which languages you
can translate to and which languages you understand. You can find your profile settings by clicking on your name in
the top-right corner.
.. image:: img/weblate3.png
:class: screenshot
Going back to the dashboard by clicking on the logo in the top-left corner, you can select between different lists
of translation projects. You can either filter by projects that already have a translation in your language, or you
go to the `pretix project page`_ where you can select specific components.
.. note::
If you want to translate pretix to a new language that is not yet listed here, you are very welcome to do so!
While you technically can add the language to the portal yourself, we ask you to drop us a short mail to
translate@pretix.eu so we can add it to all components at once and also make it selectable in pretix itself.
.. image:: img/weblate4.png
:class: screenshot
Once you selected a component of a language, you can start going through strings to translate. You can start of by
clicking the "Strings needing action" line in this view:
.. image:: img/weblate5.png
:class: screenshot
In the translate view, you can input your translation for a given source string. If you're unsure about your
translation, you can also just "Suggest" it or mark it as "Needs editing". If you have no idea, just "Skip". If you
scroll down, there is also a "Comments" section to discuss any questions with fellow translators or us developers.
.. image:: img/weblate6.png
:class: screenshot
.. _translate.pretix.eu: https://translate.pretix.eu
.. _pretix project page: https://translate.pretix.eu/projects/pretix/

View File

@@ -1,56 +1,10 @@
.. spelling::
Analytics
List of plugins
===============
The following plugins are shipped with pretix and are supported in the same
ways that pretix itself is:
A detailed list of plugins that are available for pretix can be found on the
`project website`_.
* Bank transfer
* PayPal
* Stripe
* Check-in lists
* pretixdroid
* Report exporter
* Send out emails
* Statistics
* PDF ticket output
The following plugins are not shipped with pretix but are maintained by the
same team. We update them regularly to make them compatible with the latest
pretix releases:
* `SEPA direct debit`_
* `Wirecard payment`_
* `Pages`_
* `Passbook/Wallet ticket output`_
* `Cartshare`_
* `Fontpack Free fonts`_
* `Mailing list subscription`_
The following closed-source plugins are available to customers of the hosted pretix.eu platform.
Please get in touch with the pretix team if you want to have them for your self-hosted
pretix installation:
* Campaign tracking
* Integration with Google Analytics and Facebook Pixel
* Integration with Slack
* Integration with MailChimp
The following plugins are from independent third-party authors, so we can make
no statements about their functionality, security, stability or compatibility:
* `esPass ticket output`_
* `IcePay integration`_
* `Average price chart`_
* `Pay in cash upon arrival`_
.. _SEPA direct debit: https://github.com/pretix/pretix-sepadebit
.. _Passbook/Wallet ticket output: https://github.com/pretix/pretix-passbook
.. _Cartshare: https://github.com/pretix/pretix-cartshare
.. _Pages: https://github.com/pretix/pretix-pages
.. _esPass ticket output: https://github.com/esPass/pretix-espass
.. _IcePay integration: https://github.com/chotee/pretix-icepay
.. _Fontpack Free fonts: https://github.com/pretix/pretix-fontpack-free
.. _Wirecard payment: https://github.com/pretix/pretix-wirecard
.. _Mailing list subscription: https://github.com/pretix/pretix-newsletter-ml
.. _Average price chart: https://github.com/rixx/pretix-avgchart
.. _Pay in cash upon arrival: https://github.com/pc-coholic/pretix-cashpayment
.. _project website: https://pretix.eu/about/en/plugins

View File

@@ -4,10 +4,21 @@ pretixdroid HTTP API
The pretixdroid plugin provides a HTTP API that the `pretixdroid Android app`_
uses to communicate with the pretix server.
.. warning:: This API is intended **only** to serve the pretixdroid Android app. There are no backwards compatibility
guarantees on this API. We will not add features that are not required for the Android App. There is a
general-purpose :ref:`rest-api` that not yet provides all features that this API provides, but will do
so in the future.
.. warning:: This API is **DEPRECATED** and will probably go away soon. It is used **only** to serve the pretixdroid
Android app. There are no backwards compatibility guarantees on this API. We will not add features that
are not required for the Android App. There is a general-purpose :ref:`rest-api` that provides all
features that you need to check in.
.. versionchanged:: 1.12
Support for check-in-time questions has been added. The new API features are fully backwards-compatible and
negotiated live, so clients which do not need this feature can ignore the change. For this reason, the API version
has not been increased and is still set to 3.
.. versionchanged:: 1.13
Support for checking in unpaid tickets has been added.
.. http:post:: /pretixdroid/api/(organizer)/(event)/redeem/
@@ -22,18 +33,33 @@ uses to communicate with the pretix server.
Accept: application/json, text/javascript
Content-Type: application/x-www-form-urlencoded
secret=az9u4mymhqktrbupmwkvv6xmgds5dk3
secret=az9u4mymhqktrbupmwkvv6xmgds5dk3&questions_supported=true
You can optionally include the additional parameter ``datetime`` in the body containing an ISO8601-encoded
datetime of the entry attempt. If you don't, the current date and time will be used.
You **must** set the parameter secret.
You can optionally include the additional parameter ``force`` to indicate that the request should be logged
You **must** set the parameter ``questions_supported`` to ``true`` **if** you support asking questions
back to the app operator. You **must not** set it if you do not support this feature. In that case, questions
will just be ignored.
You **may** set the additional parameter ``datetime`` in the body containing an ISO8601-encoded
datetime of the entry attempt. If you don"t, the current date and time will be used.
You **may** set the additional parameter ``force`` to indicate that the request should be logged
regardless of previous check-ins for the same ticket. This might be useful if you made the entry decision offline.
Questions will also always be ignored in this case (i.e. supplied answers will be saved, but no error will be
thrown if they are missing or invalid).
You can optionally include the additional parameter ``nonce`` with a globally unique random value to identify this
You **may** set the additional parameter ``nonce`` with a globally unique random value to identify this
check-in. This is meant to be used to prevent duplicate check-ins when you are just retrying after a connection
failure.
You **may** set the additional parameter ``ignore_unpaid`` to indicate that the check-in should be performed even
if the order is in pending state.
If questions are supported and required, you will receive a dictionary ``questions`` containing details on the
particular questions to ask. To answer them, just re-send your redemption request with additional parameters of
the form ``answer_<question>=<answer>``, e.g. ``answer_12=24``.
**Example successful response**:
.. sourcecode:: http
@@ -43,10 +69,68 @@ uses to communicate with the pretix server.
{
"status": "ok"
"version": 2
"version": 3,
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"paid": true
}
}
**Example error response**:
**Example response with required questions**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "incomplete"
"version": 3
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"paid": true
},
"questions": [
{
"id": 12,
"type": "C",
"question": "Choose a shirt size",
"required": true,
"position": 2,
"items": [1],
"options": [
{
"id": 24,
"answer": "M"
},
{
"id": 25,
"answer": "L"
}
]
}
]
}
**Example error response with data**:
.. sourcecode:: http
@@ -56,13 +140,40 @@ uses to communicate with the pretix server.
{
"status": "error",
"reason": "already_redeemed",
"version": 2
"version": 3,
"data": {
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
"order": "ABCDE",
"item": "Standard ticket",
"item_id": 1,
"variation": null,
"variation_id": null,
"attendee_name": "Peter Higgs",
"attention": false,
"redeemed": true,
"checkin_allowed": true,
"paid": true
}
}
**Example error response without data**:
.. sourcecode:: http
HTTP/1.1 200 OK
Content-Type: text/json
{
"status": "error",
"reason": "unkown_ticket",
"version": 3
}
Possible error reasons:
* ``unpaid`` - Ticket is not paid for or has been refunded
* ``already_redeemed`` - Ticket already has been redeemed
* ``product`` - Tickets with this product may not be scanned at this device
* ``unknown_ticket`` - Secret does not match a ticket in the database
:query key: Secret API key
@@ -99,18 +210,20 @@ uses to communicate with the pretix server.
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"checkin_allowed": true,
"paid": true
},
...
],
"version": 2
"version": 3
}
:query query: Search query
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
:query key: Secret API key
:statuscode 200: Valid request
:statuscode 404: Unknown organizer or event
:statuscode 403: Invalid authorization key
.. http:get:: /pretixdroid/api/(organizer)/(event)/download/
@@ -132,6 +245,7 @@ uses to communicate with the pretix server.
Content-Type: text/json
{
"version": 3,
"results": [
{
"secret": "az9u4mymhqktrbupmwkvv6xmgds5dk3",
@@ -140,11 +254,32 @@ uses to communicate with the pretix server.
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"checkin_allowed": true,
"paid": true
},
...
],
"version": 2
"questions": [
{
"id": 12,
"type": "C",
"question": "Choose a shirt size",
"required": true,
"position": 2,
"items": [1],
"options": [
{
"id": 24,
"answer": "M"
},
{
"id": 25,
"answer": "L"
}
]
}
]
}
:query key: Secret API key
@@ -155,7 +290,7 @@ uses to communicate with the pretix server.
.. http:get:: /pretixdroid/api/(organizer)/(event)/status/
Returns status information, such as the total number of tickets and the
number of performed checkins.
number of performed check-ins.
**Example request**:
@@ -175,7 +310,7 @@ uses to communicate with the pretix server.
{
"checkins": 17,
"total": 42,
"version": 2,
"version": 3,
"event": {
"name": "Demo Converence",
"slug": "democon",

View File

@@ -1,4 +1,8 @@
-r ../src/requirements.txt
sphinx
sphinx==1.6.*
sphinx-rtd-theme
sphinxcontrib-httpdomain
sphinxcontrib-images
sphinxcontrib-spelling
# See https://github.com/rfk/pyenchant/pull/130
git+https://github.com/raphaelm/pyenchant.git@patch-1#egg=pyenchant

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

131
doc/spelling_wordlist.txt Normal file
View File

@@ -0,0 +1,131 @@
addon
addons
anonymize
api
auditability
auth
autobuild
backend
backends
banktransfer
boolean
booleans
cancelled
casted
checkbox
checksum
config
contenttypes
contextmanager
cookiecutter
cron
cronjob
cryptographic
debian
deduplication
discoverable
django
dockerfile
durations
eu
filename
filesystem
fontawesome
frontend
frontpage
gettext
gunicorn
hardcoded
hostname
idempotency
inofficial
invalidations
iterable
Jimdo
libsass
linters
memcached
metadata
middleware
mixin
mixins
multi
multidomain
namespace
namespaced
namespaces
namespacing
natively
nginx
NotificationType
ons
optimizations
overpayment
param
percental
positionid
pre
prepend
prepended
prepending
preprocessor
presale
pretix
pretixdroid
pretixpresale
prometheus
proxied
proxying
pseudonymize
queryset
redemptions
redis
refactored
regex
renderer
renderers
reportlab
screenshot
selectable
serializers
serializers
sexualized
startup
stdout
stylesheet
subdirectories
subdirectory
subdomain
subdomains
subevent
subevents
submodule
subpath
systemd
testutils
timestamp
tuples
un
unconfigured
unix
unprefixed
untrusted
username
url
versa
versioning
viewset
viewsets
webhook
webhooks
webserver
webservice
workflow
zipcode
Datetime
Embeddable
Hierarkey
OAuth
SSL
Uptime
Yay

View File

@@ -0,0 +1,99 @@
.. _event_create:
Creating an event
=================
After you have created an organizer account, the next step is to create your event. An event is the basic object in
pretix that everything is organized around. One event corresponds to one ticket shop with all its products, quotas,
orders and settings.
To create an event, you can click the "Create a new event" tile on your dashboard or the button above the list of
events. You will then be presented with the first step of event creation:
.. thumbnail:: ../../screens/event/create_step1.png
:align: center
:class: screenshot
Here, you first need to decide for the organizer the event belongs to. You will not be able to change this
association later. This will determine default settings for the event, as well as access control to the event's
settings.
Second, you need to select the languages that the ticket shop should be available in. You can change this setting
later, but if you select it correctly now, it will automatically ask you for all descriptions in the respective
languages starting from the next step.
Last on this page, you can decide if this event represents an event series. In this cases, the event will turn into
multiple events included in once, meaning that you will get one combined ticket shop for multiple actual events. This
is useful if you have a large number of events that are very similar to each other and that should be sold together
(i.e. users should be able to buy tickets for multiple events at the same time). Those single events can differ in
available products, quotas, prices and some meta information, but most settings need to be the same for all of them.
We recommend to use this feature only if you really know that you need it and if you really run a lot of events, not if
you run e.g. a yearly conference. You can read more on this feature :ref:`here <subevents>`.
Once you set these values, you can proceed to the next step:
.. thumbnail:: ../../screens/event/create_step2.png
:align: center
:class: screenshot
In this step, you will be asked more detailed questions about your event. In particular, you can fill in the
following fields:
Name
This is the public name of your event. It should be descriptive and tell both you and the user which event you are
dealing with, but should still be concise. You probably know how your event is named already ;)
Short form
This will be used in multiple places. For example, the URL of your ticket shop will include this short form of
your event name, but it will also be the default prefix e.g. for invoice numbers. We recommend to use some natural
abbreviation of your event name, maybe together with a date, of no more than 10 characters. This is the only value
on this page that can't be changed later.
Event start time
The date and time that your event starts at. You can later configure settings to hide the time, if you don't want
to show that.
Event end time
The date and time your event ends at. You can later configure settings to hide this value completely -- or you can
just leave it empty. It's optional!
Location
This is the location of your event in a human-readable format. We will show this on the ticket shop frontpage, but
it might also be used e.g. in Wallet tickets.
Event currency
This is the currency all prices and payments in your shop will be handled in.
Sales tax rate
If you need to pay a form of sales tax (also known as VAT in many countries) on your products, you can set a tax rate
in percent here that will be used as a default later. After creating your event, you can also create multiple tax
rates or fine-tune the tax settings.
Default language
If you selected multiple supported languages in the previous step, you can now decide which one should be
displayed by default.
Start of presale
If you set this date, no ticket will be sold before this date. We normally recommend not to set this date during
event creation because it will make testing your shop harder.
End of presale
If you set this date, no ticket will be sold after this date.
If all of this is set, you can proceed to the next step. If this is your first event, there will not be a next step
and you are done! If you have already created events before, you will be asked if you want to copy settings from one
of them:
.. thumbnail:: ../../screens/event/create_step3.png
:align: center
:class: screenshot
If you do so, all products, categories, quotas and most settings of the other event will be taken over. You should
still review them if they make sense for your new event, but it could save you a lot of work. After this step, your
event is created successfully:
.. thumbnail:: ../../screens/event/create_step4.png
:align: center
:class: screenshot
You can now fine-tune all settings to your liking, publish your event and start selling tickets!

View File

@@ -0,0 +1,42 @@
Display settings
================
The settings at "Settings" → "Display" allow you to customize the appearance of your ticket shop.
.. thumbnail:: ../../screens/event/settings_display.png
:align: center
:class: screenshot
The upper part of the page contains settings that you always need to set specifically for your event. Those are
currently:
Logo image
This logo will be shown as a banner above your shop. If you set it, the event name and date will no longer be
displayed by the shop, so we suggest to include them in the image yourself. The maximal height of the image is
120 pixels and if you want to use the full width, make your image 1140 pixels wide. If the user's screen is
smaller, the logo will be scaled down automatically, so it should still be legible at smaller sizes.
Frontpage text
This text will be shown on the front page of your ticket shop, above the list of products. You can use it to explain
your product types, give more information on the event or for other general notices.
You can use :ref:`Markdown syntax <markdown-guide>` in this field.
Show variations of a product expanded by default
If this is not checked, a product with variations will be shown as one row in the show by default and will expand
into multiple rows once it is clicked on. With this box checked, the variations will be shown as multiple rows
right from the beginning.
The lower part of the page contains settings that you can **either** set on organizer-level for all your events **or**
override for this single event individually. Those are:
Primary color
This color will be used for links, buttons, and other design elements throughout your shop and emails sent to your
customers. We suggest not choosing something to light, since text in that color should be readable on a white
background and white text should be readable on a background of this color.
Font
Choose one of multiple fonts to use for your web shop.
.. note:: Both the color and font settings can take a few seconds up to a few minutes before they become active on your
shop.

154
doc/user/events/email.rst Normal file
View File

@@ -0,0 +1,154 @@
E-mail settings
===============
The settings at "Settings" → "E-mail" allow you to customize the emails that pretix sends to the participants of your
event.
.. thumbnail:: ../../screens/event/settings_email.png
:align: center
:class: screenshot
The page is separated into three parts: "E-mail settings", "E-mail content" and "SMTP settings". We will explain all
of them in detail on this page.
E-mail settings
---------------
The upper part of the page contains settings that are relevant for the generation of all e-mails alike. Those are
currently:
Subject prefix
This text will be prepended to the subject of all e-mails that are related to your event. For example, if you
set this to "dc2018" all subjects will be formatted like "[dc2018] Your payment was successful".
Sender address
All e-mails will be sent with this address in the "From" field. If you use an email address at a custom domain,
we strongly recommend to use the SMTP settings below as well, otherwise your e-mails might be detected as spam
due to the `Sender Policy Framework`_ and similar mechanisms.
Signature
This text will be appended to all e-mails in form of a signature. This might be useful e.g. to add your contact
details or any legal information that needs to be included with the e-mails.
E-mail content
--------------
The middle part of the page allows you to customize the exact texts of all e-mails sent by the system automatically.
You can click on the different boxes to expand them and see the texts.
Within the texts, you can use placeholders that will later by replaced by values depending on the event or order. Below
every text box is a list of supported placeholders, but currently the following are defined (not every placeholder
is valid in every text):
============================== ===============================================================================
Placeholder Description
============================== ===============================================================================
event The event name
total The order's total value
currency The currency used for the event (three-letter code)
payment_info Information text specific to the payment method (e.g. banking details)
url An URL pointing to the download/status page of the order
invoice_name The name field of the invoice address
invoice_company The company field of the invoice address
expire_date The order's expiration date
date The same as ``expire_date``, but in a different e-mail (for backwards
compatibility)
orders A list of orders including links to their status pages, specific to the "resend
link (requested by user)" e-mail
code In case of the waiting list, the voucher code to redeem
hours In case of the waiting list, the number of hours the voucher code is valid
============================== ===============================================================================
The different e-mails are explained in the following:
Placed Order
This e-mail is sent out to every order directly after the order has been received, except if the order total
is zero (see below). It should specify that/how the order is to be paid.
Paid Order
This e-mail is sent out as soon as the payment for an order has been received and should give the customer
more information on how to proceed, e.g. by downloading their ticket.
Free Order
This e-mail is sent out instead of "Placed Order" and "Paid Order" if the order total is zero. It therefore should
tell the same information, except asking the customer for completing their payment.
Resend link
Sent by admin
This e-mail will be sent out if you click the "Resend link" next to the e-mail address field on the order detail
page. It should include the link to the order and can be sent to users e.g. if they lost their original e-mails.
Requested by user
Customers can also request a link to all orders they created using their e-mail address themselves by filling
out a form on the website. In this case, they will receive an e-mail containing a list of all orders they created
with the respective links.
Order changed
This e-mail is sent out if you change the content of the order and choose to notify the user about it.
Payment reminder
This e-mail is sent out a certain number of days before the order's expiry date. You can specify the number of days
before the expiry date that this should happen and the e-mail will only ever be sent if you do specify such a
number. The text should ask the customer to complete the payment, tell the options on how to do so and the
consequences if no payment is received (ticket gone, depending on your other settings). You should also include
a way to contact you in case of questions.
Waiting list notification
If you enable the waiting list feature, this is the mail that will be sent out if a ticket is assigned to a person on
the waiting list. It should include the voucher that needs to be redeemed to get the free spot and tell how long
that voucher is valid and where to redeem it.
Order canceled
This e-mail is sent to a customer if their order has been canceled.
Order custom mail
You can use pretix' admin interface to directly send an e-mail with a custom text to the customer of a specific
order. In this case, this will be the default text and might save you time by not having to re-type all of it every
time.
Reminder to download tickets
If you want, you can configure an email that will be send out a number of days before your event to remind
attendees to download their tickets. The e-mail should include a link to the ticket download. This e-mail will only
ever be sent if you specify a number of days.
SMTP settings
-------------
If you want to send your e-mails via your own e-mail address, we strongly recommend to use SMTP for this purpose.
SMTP is a protocol that is used by e-mail clients to communicate with e-mail servers. Using SMTP, pretix can talk to
your e-mail service provider the same way that e.g. the e-mail app on your phone can.
Your e-mail provider will most likely have a document that tells you the settings for the various fields to fill in
here (hostname, port, username, password, encryption).
With the checkbox "Use custom SMTP server" you can turn using your SMTP server on or off completely. With the
button "Save and test custom SMTP connection", you can test if the connection and authentication to your SMTP server
succeeds, even before turning that checkbox on.
Spam issues
-----------
If you use an email address of your own domain as a sender address and do not use a custom SMTP server, it is very
likely that at least some of your emails will go to the spam folders of their recipients. We **strongly recommend**
to use your organization's SMTP server in this case, making your email really come from your organization. If you don't
want that or cannot do that, you should add the pretix application server to your SPF record.
If you are using our hosted service at pretix.eu, you can add the following to your SPF record::
include:_spf.pretix.eu
A complete record could look like this::
v=spf1 a mx include:_spf.pretix.eu ~all
Make sure to read up on the `SPF specification`_. If you want to authenticate your emails with DKIM, set up a DNS TXT
record for the subdomain ``pretix._domainkey`` with the following contents::
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXrDk6lwOWX00e2MbiiJac6huI+gnzLf9N4G1FnBv3PXq8fz3i2q1szH72OF5mAlKm3zXO4cl/uxx+lfidS1ERbX6Bn9BRstBTQUKWC4JFj8Yk9+fwT7LWehDURazLdTzfsIjJFudLLvxtOKSaOCtMhbPX05DIhziaqVCBqgz/NQIDAQAB
Then, please contact support@pretix.eu and we will enable DKIM for your domain on our mail servers.
.. _Sender Policy Framework: https://en.wikipedia.org/wiki/Sender_Policy_Framework
.. _SPF specification: http://www.openspf.org/SPF_Record_Syntax

View File

@@ -0,0 +1,96 @@
Invoice settings
================
.. spelling:: Inv
The settings at "Settings" → "Invoice" allow you to specify if and how pretix should generate invoices for your orders.
.. thumbnail:: ../../screens/event/settings_invoice.png
:align: center
:class: screenshot
In particular, you can configure the following things:
Ask for invoice address
If this checkbox is enabled, customers will be able to enter an invoice address during checkout. If you only enable
this box, the invoice address will be optional to fill in.
Require invoice address
If this checkbox is enabled, entering an invoice address will be obligatory for all customers and it will not be
able to create an order without entering an address.
Require customer name
If this checkbox is enabled, the street, city, and country fields of the invoice address will still be optional but
the name field will be obligatory.
Generate invoices
This field controls whether pretix should generate an invoice for an order. You have the following options:
No
pretix will never generate an invoice. If you want to issue invoices, you need to do it yourself based on the
collected address data.
Manually in admin panel
pretix will not create invoices automatically, but the order detail view will show a button that allows you to
manually generate one for specific orders.
Automatically on user request
pretix will not create invoices on its own, but both the panel as well as the customer view of the order will
show a button that instantly generates an invoice for the specified order.
Automatically for all created orders
pretix will automatically create an invoice every time an order is placed.
Automatically on payment
pretix will automatically create an invoice for an order, as soon as the payment for the order is received.
pretix will never generate invoices for free orders, even though it might ask for the invoice address.
Attach invoices to emails
If enabled, invoices will be attached to order confirmation e-mails if the "Generate invoices" setting is set to
"Automatically for all created orders" or to the payment confirmation e-mails if it is set to "Automatically on
payment".
Ask for VAT ID
If enabled, the invoice address form will not only ask for a postal address, but also for a VAT ID. The VAT ID will
always be an optional field.
Generate invoices with consecutive numbers
If enabled, invoices will be created with numerical invoice numbers in the order of their creation, i.e.
PREFIX-00001, PREFIX-00002, and so on. If disabled, invoice numbers will instead be generated from the order code,
i.e. PREFIX-YHASD-1. When in doubt, keep this option enabled since it might be legally required in your country,
but disabling it has the advantage that your customers can not estimate the number of tickets sold by looking at
the invoice numbers.
Invoice number prefix
This is the prefix that will be prepended to all your invoice numbers. For example, if you set this to "Inv", your
invoices will be numbered Inv00001, Inv00002, etc. If you leave this field empty, your event slug will be used,
followed by a dash, e.g. DEMOCON-00001.
Within one organizer account, events with the same number prefix will share their number range. For example, if you
set this to "Inv" for all of your events, there will be only one invoice numbered Inv00007 across all your events
and the numbers will have gaps within one event.
Show free products on invoices
If enabled, products that do not cost anything will still show up on invoices. Note that the order needs to contain
at least one non-free product in order to generate an invoice.
Show attendee names on invoices
If enabled, the attendee name will be printed on the invoice for admission tickets.
Your address
This should be set to the address of the entity issuing the invoice (read: you) and will be printed inside
the header of the invoice.
Introductory text
A free custom text that will be printed above the list of products on the invoice.
Additional text
A free custom text that will be printed below the list of products and the invoice total.
Footer
A text that will be printed in the foot line of the invoice. This could contain your contact details or legal
information on the issuing entity, e.g. registration numbers, your VAT ID, etc.
Logo image
A square image that will be printed in the invoice header, currently with a width of 2.5cm.

View File

@@ -0,0 +1,20 @@
Configuring plugins
===================
Plugins are optional parts of pretix that can be installed to extend the available functionality and that can be turned
on or off completely for every event. For your event, a number of plugins might be active already, but you can unlock
even more functionality by going to "Settings" → "Plugins" and enable more of them, if you need.
.. thumbnail:: ../../screens/event/settings_plugins.png
:align: center
:class: screenshot
For each plugin, you will find a short description as well as an Enable/Disable button. The pretix website has
`an overview`_ of available plugins and more details of them. If you are on the pretix.eu hosted service, look for
the "pretix Hosted" badge in the plugin list to learn which ones are supported there.
If you are running pretix on your own server, refer to the installation manual of your installation type to learn
how to install additional plugins (:ref:`manual <manual_plugininstall>` or :ref:`Docker <docker_plugininstall>`).
.. _an overview: https://pretix.eu/about/en/plugins

View File

@@ -0,0 +1,14 @@
Configuring an event
====================
.. toctree::
:maxdepth: 2
subevents
../payments/index
plugins
display
tickets
email
taxes
invoicing

View File

@@ -0,0 +1,111 @@
.. _subevents:
Event series
============
During creation of a new event, you can choose that you want to create this event as an event series.
By event series, we mean a group of events that are similar in their structure and that you want to
sell within a single shop. An event series consists of **dates**. Each date represents one "event"
within the series.
For example, we think good examples to use the event series feature are:
* A theater or theater group that shows the same play on five evenings.
* A band on tour that hosts the same show in different locations.
* A workshop that is given multiple times in different locations or at different times.
We **don't** think that the feature is well-suited for events like the following:
* Event series distributed over a large timescale like annual conferences. We suggest using multiple events in this
case. You can avoid having to configure everything twice since you can copy settings from an existing event during
creation of the new event.
* Multiple parts of a conference or festival (e.g. different days) if a significant number of attendees will visit
more than one of them. We suggest just using different products in this case.
When using an event series, the single dates of the series are using the same settings in most places. They can
**only** differ in the following aspects:
* They can have different date, time, and location parameters.
* They can use different text on the shop front page.
* They can have different prices for the various products.
* They always have distinct quotas, which allows you to assign different amounts of tickets or to enable or disable
some products completely.
* They can have different rules for check-in.
Therefore, if your events are likely to need more different settings, this is probably not the feature for you. The
benefits of using event series, on the other hand, are:
* You only need to set most settings once, as the multiple dates live in the same shop.
* Your customers can build mixed orders, i.e. they can order tickets for multiple dates at once.
Creating and modifying dates in the series
------------------------------------------
Click on "Dates" in the left navigation menu of your event. This page shows you the list of currently existing event
dates and allows you to create, edit, clone and delete them.
If "Dates" is missing from the navigation menu, you have insufficient permission or your event has not been set up as
an event series and you need to create a new event.
.. thumbnail:: ../../screens/event/subevent_list.png
:align: center
:class: screenshot
If you click on one of them or create a new one, you will see the following form:
.. thumbnail:: ../../screens/event/subevent_create.png
:align: center
:class: screenshot
Here, you can make changes to the following fields, most of which are optional:
Name
This is the public name of your date. It should be descriptive enough to tell the user which date to select in
a calendar.
Active
This date will only show up for customers if you check this box. In this sense, it corresponds to the "live" setting
of events.
Event start time
The date and time that this date starts at.
Event end time
The date and time this date ends at.
Location
This is the location of your date in a human-readable format. We will show this on the ticket shop frontpage, but
it might also be used e.g. in Wallet tickets.
Admission time
The admission date and time to show on the ticket shop page or on the tickets.
Frontpage text
A text to show on the front page of the ticket shop for this date.
Start of presale
If you set this, no ticket will be sold before the time you set. If you set this on event series level as well,
both dates must be in the past for the tickets to be available.
End of presale
If you set this, no ticket will be sold after the time you set. If you set this on event series level as well,
both dates must be in the future for the tickets to be available.
Quotas
As for all events, no tickets will be available unless there is a quota created for them that specifies the number
of tickets available. You can create multiple quotas that are assigned to this date directly from this interface.
Item prices
This is a table of all products configured for your shop. If you want, you can enter a new price for each one of them
in the right column to make them cheaper or more expensive for this date. If you leave a field empty, the price will
follow the product's default price.

121
doc/user/events/taxes.rst Normal file
View File

@@ -0,0 +1,121 @@
.. _taxes:
Configuring taxes
=================
In most countries, you will be required to pay some form of sales tax for your event tickets. If you don't know about
the exact rules, you should consult a professional tax consultant right now.
To implement those taxes in pretix, you can create one or multiple "tax rules". A tax rule specifies when and at what
rate should be calculated on a product price. Taxes will then be correctly displayed in the product list, order
details and on invoices.
At the time of this writing, every product can be assigned exactly one tax rule. To view and change the tax rules of
your event, go to the respective section in your event's settings:
.. thumbnail:: ../../screens/event/tax_list.png
:align: center
:class: screenshot
On this page, you can create, edit and delete your tax rules. Clicking on the name of a tax rule will take you to its
detailed settings:
.. thumbnail:: ../../screens/event/tax_detail.png
:align: center
:class: screenshot
Here, you can tune the following parameters:
Name
What is the (short) name of this tax? This is probably "VAT" in English and should be very short as it will be
displayed in lots of places.
Rate
This is the tax rate in percent.
The configured product prices include the tax amount
If this setting is enabled (the default), then a product configured to a price of 10.00 EUR will, at a tax rate of
19.00 %, be interpreted as a product with a total gross price of 10.00 EUR including 1.60 EUR taxes, leading to a
net price of 8.40 EUR. If you disable this setting, the price will be interpreted as a net price of 10.00 EUR,
leading to a total price to pay of 11.90 EUR.
Use EU reverse charge taxation rules
This enables reverse charge taxation (see section below).
Merchant country
This is probably your country of residence, but in some cases it could also be the country your event is
located in. This is the place of taxation in the sense of EU reverse charge rules (see section below).
EU reverse charge
-----------------
.. warning:: Everything contained in this section is not legal advice. Please consult a tax consultant
before making decisions. We are not responsible for the correct handling of taxes in your
ticket shop.
"Reverse charge" is a rule in European VAT legislation that specifies how taxes are paid
if you provide goods to a buyer in a different European country than you reside in yourself.
If the buyer is a VAT-paying business in their country, you charge them only the net price without
taxes and state that the buyer is responsible for paying the correct taxes themselves.
.. warning:: We firmly believe that reverse charge rules are **not applicable** for most events handled
with pretix and therefore **strongly recommend not to enable this feature** if you do not have
a specific reason to do so. The reasoning behind this is that according to article 52 of the
`VAT directive`_ (page 17), the place of supply is always the location of your event and
therefore the tax rate of the event country always has to be paid regardless of the location
of the visitor.
If you enable the reverse charge feature and specify your merchant country, then the following process
will be performed during order creation:
* The user will first be presented with the "normal" prices (net or gross, as configured).
* The user adds a product to their cart. The cart will at this point always show gross prices *with*
taxes.
* In the next step, the user can enter an invoice address. Tax will be removed from the price if one of the
following statements is true:
* The invoice address is in a non-EU country.
* The invoice address is a business address in an EU-country different from the merchant country and has a valid VAT ID.
* In the second case, a reverse charge note will be added to the invoice.
VAT IDs are validated against the EUs validation web service. Should that service be unavailable, the user
needs to pay VAT tax and reclaim the taxes at a later point in time with their government.
If you and the buyer are residing in EU countries that use different currencies, the invoice will show
the total and VAT amount also in the local currency of the buyer, if the system was able to obtain a
conversion rate from the European Central Bank's webservice within the last 7 days.
For existing orders, a change of the invoice address will not result in a change of taxes automatically.
You can trigger this manually in the backend by going to the order's detail view. There, first click
the "Check" button next to the VAT ID. Then, go to "Change products" and select the option "Recalculate
taxes" at the end of the page.
.. note:: In the invoicing settings, you should turn the setting "Ask for VAT ID" on for this to work.
.. note:: During back-and-forth modification of taxation status, unfortunately there can be rounding
errors of usually up to one cent from the intended price. This is unavoidable due to the
flexible nature in which prices are being calculated.
Custom tax rules
----------------
If you have very special requirements for the conditions in which VAT will or will not be charged, you can use the
"Custom tax rules" section instead of the options listed above. Here, you can create a set of rules consisting of
conditions (i.e. a country or a type of customer) and actions (i.e. do or do not charge VAT).
The rules will then be checked from top to bottom and the first matching rule will be used to decide if VAT will be
charged to the user.
Taxation of payment fees
------------------------
In the payment part of your event settings, you can choose the tax rule that needs to be applied for
payment method fees. This works in the same way as product prices, with the small difference that the
"configured product prices include the tax amount" settings is ignored and payment fees will always be
treated as gross values.
.. _VAT directive: http://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:32006L0112&from=EN

View File

@@ -0,0 +1,30 @@
Ticket settings
===============
At "Settings" → "Tickets", you can configure the ticket download options that will be presented to your customers:
.. thumbnail:: ../../screens/event/settings_tickets.png
:align: center
:class: screenshot
The top of this page shows a short list of options relevant for all download formats:
Use feature
This can be used to completely enable or disable ticket downloads all over your ticket shop.
Download date
If you set a date here, no ticket download will be offered before this date. If no date is set, tickets can be
downloaded immediately after the payment for an order has been received.
Offer to download tickets separately for add-on products
By default, tickets can not be downloaded for order positions which are only an add-on to other order positions. If
you enable this, this behavior will be changed and add-on products will get their own tickets as well. If disabled,
you can still print a list of chosen add-ons e.g. on the PDF tickets.
Generate tickets for non-admission products
By default, tickets will only be generated for products that are marked as admission products. Enable this option to
generate tickets for all products instead.
Below these settings, the detail settings for the various ticket file formats are offered. They differ from format to
format and only share the common "Enable" setting that can be used to turn them on. By default, pretix ships with
a PDF output plugin that you can configure through a visual design editor.

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