Compare commits

..

473 Commits

Author SHA1 Message Date
Raphael Michel
ae485a77d6 Bump version number 2017-12-16 18:17:08 +01:00
Raphael Michel
29e17d2284 Force upgrade to celery 4.1 2017-12-16 17:37:37 +01:00
Raphael Michel
6b95aca3f7 Fix line in docker service file 2017-12-16 17:37:30 +01:00
Raphael Michel
f227319f29 Fix annotated check-in list query 2017-12-16 17:37:25 +01:00
Raphael Michel
e63b85ccd6 Refs #705 -- Further try to workaround reportlab issue 2017-12-16 17:37:01 +01:00
Raphael Michel
bf3398e5f6 Fix a bug leading to loss of answers for addon-related questions 2017-12-16 17:36:47 +01:00
Raphael Michel
765d98464e Fix reverse ordering of lists 2017-12-16 17:36:34 +01:00
Raphael Michel
66bdf9ab79 Fix #702 -- Fix U2F support in Firefox 57 2017-12-16 17:36:27 +01:00
Raphael Michel
da830ef0a4 Fix markup in emails: Consistently allow <pre> in markdown content 2017-12-16 17:35:03 +01:00
Raphael Michel
c751a180a4 Bump version 2017-12-05 18:51:40 +01:00
Raphael Michel
3ee6a0cf6f German translation: Consistent casing of Check-in 2017-12-04 20:58:59 +01:00
Raphael Michel
0c23f36e36 pretixdroid: Search should also return unpaid tickets 2017-12-04 20:35:50 +01:00
Raphael Michel
40b84fd676 Docker: Workaround for bug in reportlab 3.4.0 2017-12-04 20:35:32 +01:00
Raphael Michel
e5e1d3b8e5 Fix German translation file 2017-12-04 18:39:22 +01:00
Jakob Schnell
9bba225157 Add mention of CoC in README.md (#696)
* mention CoC in README.md

According to the discussion in #689, the Code of Conduct gets directly
referenced in the README-file, instead of linking to the
CODE_OF_CONDUCT-file

* undo whitespace-change
2017-12-04 18:24:18 +01:00
Raphael Michel
196c615f53 Update German translation 2017-12-04 18:21:24 +01:00
Raphael Michel
353dce789d Fix #515 -- Add check-in lists (#693)
* Data model and migration

* Some backwards compatibility

* CRUD for checkin lists

* Show and perform checkins

* Correct numbers in table and dashboard widget

* event creation and cloning

* Allow to link specific exports and pass options per query

* Play with the CSV export

* PDF export

* Collapse exports by default

* Improve PDF exporter

* Addon stuff

* Subevent stuff, pretixdroid tests

* pretixdroid tests

* Add CRUD API

* Test compatibility

* Fix test

* DB-independent sorting behavior

* Add CRUD and coyp tests

* Re-enable pretixdroid plugin

* pretixdroid config

* Tests & fixes
2017-12-04 18:12:23 +01:00
Raphael Michel
f1be7ed69d API docs: Add version change for quotas 2017-12-04 16:50:19 +01:00
Raphael Michel
37146c1e10 Dashboards: Link tiles with subevent 2017-12-04 16:24:42 +01:00
Raphael Michel
feba94547a Dashboard and product list: Respect availability dates of products 2017-12-04 16:24:07 +01:00
Raphael Michel
1b82b64a0a PDF ticket output: Fix TypeError on 'content': null 2017-12-04 15:48:21 +01:00
Raphael Michel
0f8cd31e0a Fixed incorrect typo-check suggestion
Thanks @freakboy3742 for reporting
see https://twitter.com/freakboy3742/status/936764146074316801
2017-12-04 15:40:06 +01:00
Raphael Michel
c351a5cf72 Ticket preview: Locale and invoice address 2017-12-04 13:56:02 +01:00
Raphael Michel
98a58779ad Consistent markdown parsing, docs on markdown and display settings 2017-12-03 15:19:15 +01:00
Raphael Michel
1aef721794 User documentation: More information on payments 2017-12-01 11:19:14 +01:00
Raphael Michel
7373d958a5 User documentation: subevents 2017-12-01 10:26:43 +01:00
Raphael Michel
37fdbf25ff User docs: Add FAQ and domain pages 2017-11-30 12:16:17 +01:00
Jakob Schnell
1580709c97 Fix #689 -- Add CODE_OF_CONDUCT.md (#695)
fixes #689
2017-11-30 12:01:24 +01:00
Raphael Michel
c7f1f67ee9 Widget: Fix incorrect duplicate formatting of float, loosing precision 2017-11-30 07:52:17 +01:00
Raphael Michel
8d90c9e03a Add icon columns to product overview 2017-11-26 14:19:02 +01:00
Raphael Michel
40818ae853 GitLab config 2017-11-25 19:18:40 +01:00
Raphael Michel
364ea9ca29 [SECURITY] Respect session timeout in API 2017-11-25 19:18:40 +01:00
Raphael Michel
f6b1bd9fe8 [SECURITY] Fix handling of session timeouts 2017-11-25 19:18:40 +01:00
Raphael Michel
30c7319811 Remvoe obsolete code 2017-11-25 19:18:40 +01:00
Jakob Schnell
41fbf362fa fix typos in doc signal (#687) 2017-11-25 14:31:09 +01:00
Raphael Michel
e8867d0fbc Allow searching organizes by name 2017-11-25 14:27:35 +01:00
Raphael Michel
3bf8aad127 Update German translation 2017-11-24 17:06:16 +01:00
Raphael Michel
fb5354c3cd Fix AttributeError in redemption view 2017-11-24 10:04:04 +01:00
Raphael Michel
a62105fa28 Stripe Elements: Fix incorrect JavaScript and display loading indicator 2017-11-24 09:42:26 +01:00
Raphael Michel
65592dc42d Checkout step Questions: Automatically focus first field 2017-11-24 09:35:47 +01:00
Raphael Michel
3a345c0d7f Stripe webhook: Schedule retry on lock timeout 2017-11-24 09:32:41 +01:00
Raphael Michel
3da11e615f Fix TypeError when accessing a product list without a subevent 2017-11-24 09:29:05 +01:00
Raphael Michel
3eb87a878a Fix invoice API test after addition of attendee names 2017-11-24 09:28:31 +01:00
Raphael Michel
91ed869dba Correctly assign positions of newly created products 2017-11-23 20:55:36 +01:00
Raphael Michel
bd5d0093ef Allow adding question answers to ticket layouts 2017-11-23 20:55:03 +01:00
Raphael Michel
bd7ba09f10 Ticket PDF editor: Correct save button handling in Firefox 2017-11-23 18:52:42 +01:00
Raphael Michel
851b6a837f Add attendee names to invoices 2017-11-23 18:44:41 +01:00
Raphael Michel
d8064d1567 Add email_filter signal 2017-11-23 18:15:41 +01:00
Raphael Michel
046edd5a86 PDF ticket editor: Adjust CSS for very small papers 2017-11-22 14:57:15 +01:00
Raphael Michel
8d8eb5d13b Enforce step order of event creation wizard 2017-11-22 12:09:52 +01:00
Raphael Michel
2a3adb135b Fix position of "Optional" label on small screens 2017-11-22 12:09:52 +01:00
Raphael Michel
b0c4c62668 Expose product mapping in event_copy_data signal 2017-11-22 12:09:52 +01:00
ari-s
a08cb3b8e4 fix "typo" Referrer-Options -> Referrer-Options (#685)
this header was probably meant - at least it's the one that's actually used in the wild.
2017-11-20 08:29:23 +01:00
Raphael Michel
943d61dee9 Update German translation 2017-11-16 22:26:26 +01:00
Raphael Michel
d22427f578 Implement progress indicator during checkout (#677)
* Implement progress indicator during checkout

* Do not extend bars to the edge

* Wording

* Add a bit more margin
2017-11-16 21:24:55 +01:00
Ture Gjørup
e4167380b9 API: Write methods for quotas (#657)
* MKBDIGI-183: Added quotas API write methods

* MKBDIGI-183: Fixed code formatting

* MKBDIGI-183: Added test for permission requirements

* MKBDIGI-183: Documentation corrections

* MKBDIGI-183: Removed redundant create/update locks

* MKBDIGI-183: Added quota validation to check that items and variations corresponds to each other

* MKBDIGI-183: Added quota validation to check that item belong to the same event as the endpoint

* MKBDIGI-183: Added subevent validation to check that subevent belong to the same event as the endpoint

* MKBDIGI-183: Added subevent validation to check that subevent is null for non-series events

* MKBDIGI-183: Changed validation error text

* MKBDIGI-183: Added logging for subevents

* MKBDIGI-183: Fixed code formatting

* MKBDIGI-183: Fixed validation error in API test

* MKBDIGI-183: Fixed documentation errors

* MKBDIGI-183: Fixed typos in validation messages

* MKBDIGI-183: Refactored validation loop vars check

* MKBDIGI-183: Updated error strings in test assersions

* MKBDIGI-183: Fixed logging for API quota update to account changing subevents
2017-11-16 18:39:10 +01:00
Jakob Schnell
445afcc50c fix english typo (#684) 2017-11-16 18:18:58 +01:00
Jakob Schnell
e0e37d9a2d fix german typo (#683) 2017-11-16 18:18:37 +01:00
Raphael Michel
d94faae5af Add subevent to bulk voucher form 2017-11-15 14:53:46 +01:00
Tobias Kunze
e7f38abd77 Use rel="noopener" with target="_blank". (#682)
Required reading: https://mathiasbynens.github.io/rel-noopener/
2017-11-13 18:52:15 +01:00
Raphael Michel
01585877d7 Fix retrying Stripe checkout payments 2017-11-11 22:38:49 +01:00
Raphael Michel
8baa800e30 Fix incorrect encoding of bank account in emails 2017-11-11 22:23:38 +01:00
Raphael Michel
84b2c24f9f Fix language of dates on PDF tickets 2017-11-11 22:13:28 +01:00
Raphael Michel
3fc8ccf8be Add additional voucher test case 2017-11-11 22:09:03 +01:00
Raphael Michel
b294f1a854 Update German translation 2017-11-11 22:07:55 +01:00
Raphael Michel
06725441a1 Fix localization of payment reminder email 2017-11-11 22:00:43 +01:00
Raphael Michel
aa40a27558 Make event slug helptext more accurate 2017-11-11 21:50:30 +01:00
Raphael Michel
f5958a7ff2 Fix TypeError 2017-11-07 18:18:57 +01:00
Raphael Michel
f3221e6e76 Allow attaching invoices to emails 2017-11-07 17:53:28 +01:00
Raphael Michel
7649fa11d3 Fix logging language of expiry mails 2017-11-06 17:18:26 +01:00
Tobias Kunze
98aa70c9ce Remove minor typos in documentation (#673) 2017-11-05 12:54:05 +01:00
Raphael Michel
a3be5c9616 Fix typo in documentation 2017-11-04 20:52:30 +01:00
Raphael Michel
decc8b9141 Fix TypeError on retrying stripe sofort payments 2017-11-04 15:03:43 +01:00
Raphael Michel
1c7df4d9f7 Manually merge changes from #672 (thanks @koebi!) 2017-11-04 11:29:02 +01:00
Jakob Schnell
b94f307379 Fix typos in informal german translation (#671)
Critical points here are the gendering change of "Studenten" into
"Studierende" and "Studentenausweis" into "Studierendenausweis".
2017-11-04 11:23:30 +01:00
Raphael Michel
33d9e35667 Fix typos (thanks @koebi) 2017-11-04 11:18:57 +01:00
Raphael Michel
ad9a3e01de Bump release to dev 2017-11-03 12:33:50 +01:00
Raphael Michel
2cc6d03a8b Bump release 2017-11-03 12:32:56 +01:00
Raphael Michel
6785979fbc Create squash migration 2017-11-03 12:05:46 +01:00
Raphael Michel
23958b3d03 Update translation 2017-11-03 12:00:44 +01:00
Jakob Schnell
831e31ea9d occured -> occurred (#660)
* Fix duplicate source string

* occured -> occurred

All resources I could find listed this as misspelled, but I wasn't too
sure…
Also, it should be checked if all changes to the .po-files are respected
in the corresponding src-files.
2017-11-03 11:46:35 +01:00
Raphael Michel
66483b6ae8 Fix duplicate source string 2017-11-03 11:41:16 +01:00
Jakob Schnell
4614d04be4 Correct english typos (#662)
* Check that vouchers selected via API are for the correct event

* Choose different subject for reminder mails if auto-expiry is off

* correct english typos

As with PR #660, it should be checked whether the changes to the
.po-files are respected in the corresponding src-files.
2017-11-03 11:40:52 +01:00
Raphael Michel
1285e9aa69 Widget: Open waiting list only in iframe if iframe is enabled 2017-11-01 22:46:31 +01:00
Raphael Michel
d108cec685 Add new missing signal to documentation 2017-11-01 22:29:58 +01:00
Ben Hagan
764b9dda7e Fix #489 -- Handle Vouchers With Unavailable Items (#659)
* Fix #489 -- Handle Vouchers With Unavailable Items

* Add regression test
2017-11-01 22:05:10 +01:00
Raphael Michel
82d289cfcf Partially revert 26781001 2017-11-01 21:50:47 +01:00
Raphael Michel
184c91cfbc Catch PaymentException on paypal return view 2017-11-01 21:28:19 +01:00
Raphael Michel
10103b58f0 Synchronize cart countdown with server time 2017-11-01 20:46:37 +01:00
Raphael Michel
2678100149 Fix color assignments on error page 2017-11-01 19:53:39 +01:00
Raphael Michel
09a9dfe591 Add signal pretix.control.signals.event_settings_widget 2017-11-01 19:53:17 +01:00
Raphael Michel
af3e8d5515 Allow simultaneous addition and removal of order positions 2017-11-01 18:01:13 +01:00
Raphael Michel
1b72eca5ec Fix icon SVG file to resemble current logo 2017-11-01 17:49:43 +01:00
Raphael Michel
df5968660b correct typos in informal german translation 2017-11-01 10:00:08 +01:00
Jakob Schnell
eb04e1dcee correct typos in formal german translation (#661)
I think the only "critical" fix here is the change from "Zahlmethoden"
to "Zahlungsmethoden", but that is the word used in the rest of the
translations, so I figured it should be changed here as well.
2017-11-01 09:59:47 +01:00
Ben Hagan
7dff5001b0 Fix #641 -- Show buttons on 'c' or 'r' orders (#658)
Changes template to show "View order as user" and "View email history"
buttons on orders in refunded or cancelled status in control backend.
2017-10-31 09:41:45 +01:00
Raphael Michel
ca93673c10 Update translation 2017-10-30 23:58:36 +01:00
Raphael Michel
71a4664d1f Fix #339 -- Allow to split orders (#341)
* Fix #339 -- Allow to split orders

* Add tests for split orders

* Add notificatiosn to both users

* Improve logdisplay
2017-10-30 23:15:53 +01:00
Raphael Michel
429f30fca7 Make it optional to notify user on order change 2017-10-30 21:36:14 +01:00
Ben Hagan
5376ce4bdb Fix #611 -- Fix overflow in payment information (#656)
Small style change that fixes long word overflow in .panel-body elements
in admin interface.
2017-10-30 12:02:35 +01:00
Raphael Michel
96b57994d9 Make raw config file data accessible to plugins 2017-10-29 16:11:54 +01:00
Raphael Michel
d1971cdcae Clarify docstring 2017-10-29 00:55:42 +02:00
Raphael Michel
65116563fd Add docs on session handling 2017-10-29 00:50:09 +02:00
Raphael Michel
d811e42095 Widget: Fix session handling issue 2017-10-29 00:21:51 +02:00
Raphael Michel
2a7e185d2e Update translation 2017-10-28 23:17:49 +02:00
Jakob Schnell
1a894d71b8 Fix #630 -- manual check-in of attendees (#642)
* [WIP] manual check-in of attendees

This enables manual check-in of attendees.  The post-code was heavily
copied from the APIRedeemView of the pretixdroid, thus so far this seems
to be working, but I have a few questions:

The checkin-Objects generated by the pretixdroid-app have a nonce.
Should the checkin object generated here have a nonce, too?

Should the result of the check-in be noted in any other way than by the
change of the status?

* addressed review comments

* implement unit test for manual checkin

* fix style-issues

* Slight layout change

* Log who did the manual check-in

* Improve unit test to check the result of the action
2017-10-28 23:16:22 +02:00
Raphael Michel
9213a40219 Widget: docs and i18n 2017-10-28 23:02:54 +02:00
Raphael Michel
bf8a6ebbf8 Fix incorrect hardcoded URL 2017-10-28 22:14:44 +02:00
Raphael Michel
2bcb0b0ac1 Add event meta filter to organizer page 2017-10-28 21:54:30 +02:00
Raphael Michel
9767243a6d Fix #277 -- Embeddable shop (#622)
* Vendor vue.js

* Refactor item_group_by_category to support vouchers

* Widget: Show product list

* Widget: free prices

* Widget: pictures and loading indicator

* Widget: First iframe steps

* Widget: Do not rerender iframe

* Widget: Error handling

* Improve widget

* Widget: localization tech

* Fix invoice style

* Voucher attribute and waiting list

* Add some iframe chrome

* First step to namespaced carts

* More isolation steps

* More cart isolation things

* More cart isolation things

* Mobile stuff

* Show cart on checkout pages

* PayPal and Stripe support

* Enable downloads

* Locale handling

* change text "save URL to this exact page"

* Widget: voucher redemption

* Widget: CSS

* CSS: Responsive

* Widget: CSS improvements

* Widget: Add embedding code generator

* Widget: Error messages and SSL check

* First tests

* Widget: tests

* Don't use IDs in widgets

* Widget: static files caching
2017-10-28 21:54:27 +02:00
Raphael Michel
df7fbe5a66 Add missing parameter to API permission test 2017-10-27 13:33:18 +02:00
Raphael Michel
c16dd0c9b6 Refs #654 -- API: Status operations on orders resource (#640)
* API: Write operations on orders resource

* Add order API endpoint /extend/
2017-10-27 13:31:31 +02:00
Raphael Michel
f5c47424f3 Update translations 2017-10-27 00:59:50 +02:00
Jakob Schnell
6207662ca5 Fix #647 -- Add translation for export forms (#652) 2017-10-27 00:51:49 +02:00
Raphael Michel
d63cc80507 Fix quota handling to allow for "add-on swapping" 2017-10-27 00:49:56 +02:00
Raphael Michel
b857157c7b Add field internal_reference to invoice addresses 2017-10-27 00:49:56 +02:00
Raphael Michel
2b8d12f987 Show selected add-ons in questions step 2017-10-27 00:49:56 +02:00
Raphael Michel
28682c7c33 Defined order of positions in addons form 2017-10-27 00:49:56 +02:00
Raphael Michel
fe61e4f3e2 updatestyles should also update organizer styles 2017-10-27 00:49:56 +02:00
Raphael Michel
7916e81745 Fix incorrect test 2017-10-24 18:42:50 +02:00
Raphael Michel
4e6fb7799a Fix order retry issue 2017-10-24 18:35:57 +02:00
Raphael Michel
03dd0e530e Lock event during automatic waiting list assignment 2017-10-24 12:48:38 +02:00
Raphael Michel
cb6f6247fd Marking orders as paid now ignores waiting list 2017-10-24 12:48:38 +02:00
Raphael Michel
c33fc7630e Conformity with latest flake8 version 2017-10-24 12:48:38 +02:00
domke
2910160af9 Change of wording of log display (#649)
* Changed the wording for some order history items

* Harmonized use of the words 'changed' and modified' for log displayy
2017-10-23 09:02:31 +02:00
Sean Perkins
3b2247de39 Fix #643 -- Language in history text (#644) 2017-10-19 23:46:41 +02:00
Tobias Kunze
60212dcbcc Do not log unchanged email addresses (#646) 2017-10-19 22:03:12 +02:00
Raphael Michel
1b8b12cbc3 Fix test_event_custom_domain_cache_clear 2017-10-18 14:28:49 +02:00
Raphael Michel
e57ab7f030 Allow filtering by payment provider in order search 2017-10-18 13:53:11 +02:00
Raphael Michel
2f13fa79ba Update translation 2017-10-18 13:15:55 +02:00
Raphael Michel
c616c8ce29 Show paid tickets instead of available quota in event list 2017-10-18 13:05:25 +02:00
Raphael Michel
0f2b56adb4 Cache quotas on frontpage shortly under very high load 2017-10-18 10:27:57 +02:00
Raphael Michel
a2ba0f8b9f Implement NamespacedCache.get_or_set, reduce default caching time 2017-10-18 10:27:57 +02:00
Raphael Michel
c6a7b52e34 Reduce number of redundant SQL queries 2017-10-18 10:27:57 +02:00
Raphael Michel
64b67e5396 Reduce number of calls to domain cache 2017-10-18 10:27:57 +02:00
Raphael Michel
ab2084692d Cache organizer instance by domain 2017-10-18 10:27:57 +02:00
Raphael Michel
03133dc1fd Cache access to cache object 2017-10-18 10:27:57 +02:00
Raphael Michel
7e1e259897 Fix wrong field selection in new query 2017-10-17 13:13:37 +02:00
Raphael Michel
6720c0e993 Show assigned products in list of questions 2017-10-17 11:41:29 +02:00
Raphael Michel
53bb2b2945 Use scrolling multiple choice widget in more places 2017-10-17 11:40:17 +02:00
Raphael Michel
a2c5ce5ebc Hand-optimize some queries 2017-10-16 18:03:20 +02:00
Raphael Michel
b4928f662a Add frontend support for long multiple choice widgets 2017-10-13 15:57:42 +02:00
Raphael Michel
b9b509ad9b Fix typo in translation 2017-10-13 15:57:23 +02:00
Raphael Michel
d93ad8044a Add method User.get_events_with_permission 2017-10-13 15:56:40 +02:00
Raphael Michel
9d14e8113f Remove duplicate model field 2017-10-13 15:56:18 +02:00
Raphael Michel
84d1d758c1 Re-add option to set user timezone 2017-10-13 15:55:58 +02:00
Raphael Michel
cbfd722c92 Fix #635 -- Visually indicate optional and required fields (#638) 2017-10-12 16:00:49 +02:00
Raphael Michel
be6496e569 API: Writeable methods for vouchers (#639) 2017-10-12 14:09:44 +02:00
Raphael Michel
de086a2b07 API: Fix test for deleting tax rules 2017-10-11 10:56:07 +02:00
Raphael Michel
3f8df0f036 Fix AttributeError in LogEntry 2017-10-11 09:50:01 +02:00
Raphael Michel
b2c49aa786 Fix incorrect MIME type in API docs 2017-10-11 00:11:36 +02:00
Raphael Michel
a0e7bd3996 API: Add write operations to taxrules resource 2017-10-11 00:09:53 +02:00
Raphael Michel
e06be9ee25 API: Writable serializer for LazyI18nString 2017-10-11 00:08:35 +02:00
Raphael Michel
07473f854e Add api_token field to log entries 2017-10-11 00:07:47 +02:00
Raphael Michel
f342e46f53 API: Require can_change_items for more endpoints 2017-10-10 22:58:32 +02:00
Raphael Michel
d3a287dcdf Add missing convenience imports 2017-10-10 19:19:49 +02:00
Raphael Michel
ce2101a8e1 Fix tests that suddenly broke 2017-10-10 18:34:54 +02:00
Raphael Michel
2d456a6dc4 Fix confusing connection between date and time pickers 2017-10-10 18:10:50 +02:00
Raphael Michel
a3e0e14cef Do not count waiting list when creating blocking vouchers 2017-10-10 12:47:06 +02:00
Raphael Michel
bbade75061 Add option to ignore quota when extending expired orders 2017-10-10 12:40:18 +02:00
Raphael Michel
645e82fb04 Fix display of wrong email address in order confirmation 2017-10-09 16:39:13 +02:00
Raphael Michel
3245b05c5f Add todo note for code removal 2017-10-07 20:47:39 +02:00
Raphael Michel
61ef81832d Bump version to 1.9.0.dev0 2017-10-07 20:39:12 +02:00
Raphael Michel
7dea6fc1b7 Bump version number 2017-10-07 20:38:12 +02:00
Raphael Michel
bd306e9400 Best-effort backwards compatibility of isolated cart IDs 2017-10-07 20:37:12 +02:00
Raphael Michel
3e686211e1 Update translations 2017-10-07 18:42:02 +02:00
Raphael Michel
6d1b4b0a39 Re-order travis matrix for better productivity 2017-10-07 18:16:36 +02:00
Sanket Dasgupta
58938fc07c Fix #531 -- Make placeholders replace in subject (#594)
Placeholders in subject were not being replaced because there was
no `.format()` called on the subject.

This commit creates a context dict that is used for both the body
and the subject. It is then replaced using `.format_map()`

Fixes https://github.com/pretix/pretix/issues/531
2017-10-07 18:16:13 +02:00
Raphael Michel
96dd4e02f3 Add tests for style generation and propagated settings 2017-10-07 18:13:06 +02:00
Raphael Michel
411c537438 UI for settings propagation 2017-10-07 18:13:06 +02:00
Raphael Michel
bbd112280a Propagate setting and add organizer display settings page 2017-10-07 18:13:06 +02:00
Marvin Sipp
28d074366e added organizer color field 2017-10-07 18:13:06 +02:00
Haroon Sheikh
11d76656de Fix #538 -- Remove pyvenv from docs (#633) 2017-10-07 16:50:14 +02:00
Raphael Michel
1c96bc31d5 Re-calculate quotas for all events with recent logs 2017-10-06 11:43:08 +02:00
Raphael Michel
0030064f55 Form UX: Better label in sendmail form 2017-10-06 11:23:21 +02:00
Raphael Michel
4726f5c136 Fix i18n for confirm_text 2017-10-06 11:14:42 +02:00
Raphael Michel
c7fafedc51 Checkout UX: Pre-select payment provider if there is only one 2017-10-06 11:08:00 +02:00
Raphael Michel
3eeb70ae36 Form UX: Add more helpful placeholders 2017-10-06 11:05:24 +02:00
Raphael Michel
29b1a3dca3 Do not send navigation singals for authentication pages 2017-10-06 10:35:24 +02:00
Raphael Michel
caf844b5fb Fix wrong signal name in documentation 2017-10-05 11:55:09 +02:00
Raphael Michel
6b7bdf8c4f Item creation UX: Clearer placeholders, defaults 2017-10-05 10:47:46 +02:00
Raphael Michel
aad433a3bc Welcome wizard UX: Use primary color for button 2017-10-05 10:32:14 +02:00
Raphael Michel
3f1bb56826 Event creation UX: Show clearer that the event is now created 2017-10-05 10:31:25 +02:00
Raphael Michel
b2b3add616 Form UX: Display units for more number inputs 2017-10-05 10:21:00 +02:00
Raphael Michel
2d484d4a8e Event creation UX: Label changes 2017-10-05 10:20:00 +02:00
Raphael Michel
2f252f19c9 Form UX: Use splitted date/time widgets 2017-10-05 10:17:17 +02:00
Raphael Michel
a27f372785 Event creation UX: Pre-choose organizer if there is only one 2017-10-05 08:01:22 +02:00
Raphael Michel
f074e642ec Display quotas in event list 2017-10-04 11:25:51 +02:00
Raphael Michel
217ed905d4 Contract columns in event list table 2017-10-04 10:12:46 +02:00
Raphael Michel
b920efc955 Add database cache for quotas 2017-10-04 09:45:37 +02:00
Raphael Michel
330fadbea9 Fix wrong execution order 2017-10-04 09:43:14 +02:00
Raphael Michel
50c595e3d6 Fix migration error (unique app configuragion keys) 2017-10-02 17:40:31 +02:00
Raphael Michel
26f258c6cf Isolate cart sessions 2017-10-02 17:00:35 +02:00
Raphael Michel
f15a72e59d Fix mail_text_download_reminder email preview 2017-10-02 15:44:32 +02:00
Raphael Michel
8accaae6b1 New signal: allow_ticket_download 2017-10-02 15:07:23 +02:00
Raphael Michel
d4259501af Remove legacy ordering code 2017-10-02 14:59:01 +02:00
Jakob Schnell
fd5d5ae98e Fix #628 -- Sorting of filtered order list (#631)
* fix sorting of filtered order list

fixes #628

* implement comments on pr
2017-10-02 14:55:02 +02:00
Raphael Michel
457901ff82 Fix flake8 error 2017-10-01 17:43:51 +02:00
Raphael Michel
e201be1c65 Clarify payment fee / shipping fee relation 2017-09-29 17:08:04 +02:00
Raphael Michel
acde14372d PDF editor: Change default text 2017-09-29 17:01:13 +02:00
Raphael Michel
79988a2325 New signal order_fee_type_name 2017-09-29 16:54:27 +02:00
Raphael Michel
784f6e703c CSP: Exclude PDF editor (just doesn't work in FF) 2017-09-28 18:44:12 +02:00
Raphael Michel
29b157f287 CSP: Add reporting endpoint 2017-09-28 18:43:45 +02:00
Raphael Michel
c030bd35ca Make PDF ticket cover more extensible 2017-09-27 18:32:50 +02:00
Raphael Michel
06fe076ce2 Add request argument to pretix.control.signals.order_info 2017-09-27 18:19:47 +02:00
Raphael Michel
ae6cba067c Fix issue created in 1f889be0 2017-09-27 14:40:15 +02:00
Raphael Michel
72ae19a95d Update translation 2017-09-27 13:24:03 +02:00
Raphael Michel
1f889be07a Refactor and add signal layout_text_variables 2017-09-27 13:15:18 +02:00
Raphael Michel
39061b659a PDF Editor: More extensible implementation 2017-09-26 13:05:51 +02:00
Raphael Michel
d38f29ac7c Add signal pretix.control.signals.order_info 2017-09-26 11:47:46 +02:00
Raphael Michel
1a8e67f4de Allow clicking on typeahead results 2017-09-25 22:03:25 +02:00
Raphael Michel
8265c302ad Fix missing required=False 2017-09-25 13:33:41 +02:00
Raphael Michel
110d7c6acf Allow to enter a custom text that needs to be confirmed during checkout 2017-09-25 12:48:31 +02:00
Tobias Kunze
244b767f8f Allow markdown rendering in transaction comments. (#621)
This commit allows transaction comments to display newlines and URLs in
a useful way, helping when additional data (such as a reference to a
ticket system or a longer discussion) is required.
This PR also prevents pretix from having to bring its own chat system ;)
2017-09-25 12:25:32 +03:00
Raphael Michel
f40950efc9 Adjust to newer sentry version 2017-09-25 10:46:47 +02:00
Raphael Michel
0e0534c273 Fix incorrect timezones on event dashboard 2017-09-25 10:25:22 +02:00
Raphael Michel
9b3ea3656f PDF Output: Prevent subsequent exception on permission errors 2017-09-25 10:22:09 +02:00
Raphael Michel
62b2a367ff PDF Output: Fix AttributeError with undefined used meta data 2017-09-25 10:20:46 +02:00
Raphael Michel
ab9dd32902 Add font-src to default CSP header 2017-09-25 10:19:36 +02:00
Raphael Michel
43fc498297 Prevent some pages from search indexing 2017-09-25 10:04:37 +02:00
Raphael Michel
ef3eee7873 ContactForm: Prevent TypeError during validation 2017-09-25 09:38:35 +02:00
Raphael Michel
9f0deea9dd Rich text: Do not rewrite mailto: URLs 2017-09-25 09:37:17 +02:00
Abhiraj Hinge
e3798600ed Fixed typo in Concepts.rst (#624) 2017-09-14 16:16:56 +03:00
Raphael Michel
00834cd5e0 Fix test_checkoutflow 2017-09-13 18:29:08 +02:00
Raphael Michel
ed35c4f74e Add new signal logentry_object_link 2017-09-13 17:36:13 +02:00
Raphael Michel
9cd3e2d494 Require payment even if total consists only of fees 2017-09-13 16:42:00 +02:00
Raphael Michel
3345f48986 nav_event_settings should be an EventPluginSignal 2017-09-13 16:21:14 +02:00
Raphael Michel
b611d63975 ModelRelativeDateTimeField: Deal with None values 2017-09-13 16:20:54 +02:00
Raphael Michel
fb3866aa1a Fix TypError in PDF preview 2017-09-13 14:59:19 +02:00
Raphael Michel
a9f131b645 Make PDF download more prominent 2017-09-12 19:06:02 +02:00
Raphael Michel
e5728662c5 Allow to extend expired order even if waiting list entries exist 2017-09-12 18:50:13 +02:00
Raphael Michel
94a97fb0fd Fix broken toggling script 2017-09-09 11:09:03 +02:00
Raphael Michel
b5bea6fe7a Do not disable core modules' URLs 2017-09-08 17:50:50 +02:00
Raphael Michel
fb9d677d76 CSP: Allow blob: URLs for images in PDFs 2017-09-07 23:29:21 +02:00
Raphael Michel
7c4fc7bd0d New signals: fee_calculation_for_cart, order_fee_calculation 2017-09-07 18:59:21 +02:00
Raphael Michel
de992cecf3 New signal checkout_confirm_page_content 2017-09-07 18:15:36 +02:00
Raphael Michel
cd94549606 Fix export of answered files with binary content 2017-09-07 12:38:39 +02:00
Raphael Michel
214a6eb5ce Database field for RelativeDateTime 2017-09-06 11:25:12 +02:00
Raphael Michel
db5f0aa02d Fix #156 -- Plug-in settings navigation hook 2017-09-06 09:31:33 +02:00
Raphael Michel
ba48ab3659 Re-do squashed migration 2017-09-05 15:34:40 +02:00
Raphael Michel
d1538e07d3 Bump version 2017-09-05 12:47:10 +02:00
Raphael Michel
fe0c033b2d Bump version 2017-09-05 12:46:08 +02:00
Raphael Michel
2e58dca048 Order overview: Deterministic ordering of fees 2017-09-05 12:45:25 +02:00
Raphael Michel
d38ab8a439 Correctly set OrderFee type for new orders 2017-09-05 12:32:39 +02:00
Raphael Michel
acd7b9ba8c Squash migrations 2017-09-05 12:32:20 +02:00
Raphael Michel
56f72b225c Improve pretixdroid UI 2017-09-05 12:10:33 +02:00
Raphael Michel
8bfaf7425a Update translation 2017-09-05 11:48:01 +02:00
Raphael Michel
77a8726a03 Fix #615 -- Incorrect defaults for email texts 2017-09-05 11:46:33 +02:00
luto
119fea3379 Fix #619 -- Check format of stripe API keys in settings (#620)
* stripe tests: add settings URL to fixture, as it will be needed later

* Fix #619 -- Stripe: add basic validation for secret and publishable keys
2017-09-05 10:26:03 +03:00
Raphael Michel
e54e0d6511 New concept for fee handling (#610)
* New concept for fee handling

* More usages

* Remove all usages, make all tests pass

* API changes

* Small fixes

* Fix order of invoice lines

* Rebase migration
2017-09-05 10:11:26 +03:00
Raphael Michel
a2a88cfafa Fix tests after meta-data merge 2017-09-04 22:09:30 +02:00
Raphael Michel
5ff53d08ed Fix #586 -- Fix folded subnavigation in order detail view 2017-09-04 21:13:54 +02:00
Raphael Michel
0ddda4a668 Fix #617 -- Purge ticket cache after ticket settings/layout changes 2017-09-04 21:09:08 +02:00
Raphael Michel
d3a76e9f2f Fix #614 -- Warning message if ticket output is active but no provider 2017-09-04 21:03:17 +02:00
Raphael Michel
ea7ec2b5fc Fix #585 -- Creating invoices for refunded orders 2017-09-04 20:36:19 +02:00
Raphael Michel
b9b4ccb180 Change order of user docs pages 2017-09-04 20:13:38 +02:00
Raphael Michel
2f15d410fe Add optional timeouts for backend sessions 2017-09-04 19:50:32 +02:00
Raphael Michel
88f5af3e77 Add event meta-data 2017-09-04 19:50:32 +02:00
Martin Gross
454ca27c54 Fix #613 -- Minor typo in last change date (#616)
* Fix #556 - Max. redemptions instead of amount of vouchers

* Update Translation for Dashboard-Tile

* Fix #613 - Minor typo in last change date
2017-09-04 10:42:21 +03:00
Raphael Michel
f536cb3536 Fix grammar error 2017-08-30 18:30:59 +02:00
Raphael Michel
e6ba7379eb Display free tickets as "FREE" instead of "0.00" 2017-08-30 18:24:25 +02:00
Raphael Michel
f6b01b6e02 Improve margin arount product picture 2017-08-30 18:24:25 +02:00
Raphael Michel
ce27f8e89c Fix product list in template 2017-08-30 18:24:25 +02:00
Raphael Michel
a52635f940 Fix typo 2017-08-30 18:24:25 +02:00
Martin Gross
b608125545 Fix Dashboard-Tile Translation (number of orders) (#612)
* Fix #556 - Max. redemptions instead of amount of vouchers

* Update Translation for Dashboard-Tile
2017-08-30 15:47:03 +03:00
Raphael Michel
631cded0d6 New pretixdroid configuration system 2017-08-29 23:19:02 +02:00
Raphael Michel
43b5140754 New handling of plugin URLs (#609) 2017-08-29 10:01:50 +03:00
Raphael Michel
557a05135e Allow connect-src to media domain 2017-08-28 09:19:42 +02:00
Tobias Kunze
618416d0d2 Update translation, closes #604 (#608) 2017-08-27 10:45:13 +03:00
Tobias Preuss
9a4ee3db69 Improve reading flow. (#603) 2017-08-27 10:41:55 +03:00
Raphael Michel
999dde3fa4 Fix exception in pretixdroid API 2017-08-25 16:32:12 +02:00
Raphael Michel
1171cce550 Predictable order of question forms 2017-08-25 16:23:16 +02:00
Raphael Michel
77e13338ad Fix inconsistencies in pretixdroid API views 2017-08-25 16:22:53 +02:00
Raphael Michel
fd35b5ea72 Add "attention" flag to products 2017-08-25 15:14:54 +02:00
Raphael Michel
f98f25fb6b Improve MT940 import 2017-08-25 14:51:25 +02:00
Raphael Michel
511a49041f Add item and variation ID to pretixdroid API 2017-08-25 13:01:05 +02:00
Raphael Michel
74be5cfe96 Fix test (again) 2017-08-24 21:31:27 +02:00
Raphael Michel
1f54b36ece Fix failing test of calendar page 2017-08-24 19:32:12 +02:00
Raphael Michel
d12b77b572 Remove unneeded space 2017-08-24 18:32:31 +02:00
Raphael Michel
4928234785 Banktransfer: Allow mt940 files to have the .sta extension 2017-08-24 18:13:26 +02:00
Raphael Michel
208e3c9933 Update translation 2017-08-24 18:11:47 +02:00
Raphael Michel
d697381d8b List and calendar for all organizers 2017-08-24 17:13:22 +02:00
Raphael Michel
cd6b1a2327 Allow subevent filtering in dashboard 2017-08-24 16:12:50 +02:00
Raphael Michel
ff21380099 Improve typeahead on dashboard page 2017-08-24 14:21:30 +02:00
Raphael Michel
a773531003 Statistics: Add subevent selection 2017-08-24 12:53:59 +02:00
Raphael Michel
23ecd43885 Better dashboard layout 2017-08-24 12:36:48 +02:00
Raphael Michel
3415bf5cd3 Event list: Correct handling of event series 2017-08-24 10:44:22 +02:00
Raphael Michel
45b9f1190f Case insensitivity when validating repreated email addresses 2017-08-24 10:19:11 +02:00
Raphael Michel
ef1b09671a pretixdroid: Let attendee_name fall back to invoice address name 2017-08-24 10:17:32 +02:00
Raphael Michel
ee282af53e Add invoice address fields to ticket PDF editor 2017-08-24 09:53:31 +02:00
Raphael Michel
455a95d46c Add column ordering to more lists 2017-08-24 09:36:24 +02:00
Raphael Michel
76666b0d22 Update and fix trove classifiers 2017-08-23 17:47:13 +02:00
Raphael Michel
45fd43682a Docs: Add missing RST file 2017-08-23 15:13:20 +02:00
Raphael Michel
fd801e3323 Delete cache in migration 2017-08-23 15:09:47 +02:00
Raphael Michel
429c6ebb1b Fix TaxRule.__str__ 2017-08-23 15:07:01 +02:00
Raphael Michel
ea2f24fe23 Fix problem in migration 2017-08-23 14:49:08 +02:00
Raphael Michel
db4a2cfaac Docs: Add missing screenshots 2017-08-23 14:22:08 +02:00
Raphael Michel
583223f454 Update translation 2017-08-23 14:21:47 +02:00
Raphael Michel
f9fcc16f54 Do not rely on CSP nonce support (breaks safari) 2017-08-23 13:36:35 +02:00
Raphael Michel
50ca6ee63d Support custom fonts 2017-08-23 13:35:47 +02:00
Raphael Michel
56338be13e Tax rules and reverse charge (#559)
Tax rules and reverse charge
2017-08-23 13:13:16 +03:00
Raphael Michel
b9ec5ea83c Documentation on event creation 2017-08-23 10:15:51 +02:00
Raphael Michel
389585c47a Fix translation errors 2017-08-22 12:35:39 +02:00
Raphael Michel
e9583087eb Fix logic of multi downloads 2017-08-22 10:55:32 +02:00
Raphael Michel
57e2090d70 Fix date display in event list 2017-08-22 10:10:10 +02:00
Raphael Michel
5fbf26b8cb Make additional font styles optional 2017-08-22 10:09:46 +02:00
Raphael Michel
447c728557 [SECURITY] Rewrite all links in rich texts 2017-08-21 15:14:45 +02:00
Raphael Michel
a3ca4c81ae [SECURITY] Fix XSS vulnerability in typeahead.js 2017-08-21 15:14:45 +02:00
Raphael Michel
fb398a5520 [SECURITY] Fix XSS vulnerability in Lightbox caption 2017-08-21 15:14:45 +02:00
Raphael Michel
9a9bb92f91 [SECURITY] Support custom media URLs in CSP middleware 2017-08-21 15:14:45 +02:00
Raphael Michel
e23a5c24d6 [SECURITY] Add warning for download of unsafe files 2017-08-21 15:14:45 +02:00
Raphael Michel
1a42a54d98 [SECURITY] Tokens for downloading answer attachments 2017-08-21 15:14:45 +02:00
Raphael Michel
5c91352bae [SECURITY] Do not allow SVG files for logos 2017-08-21 15:14:45 +02:00
Raphael Michel
3428ea2f18 [SECURITY] Fix XSS injection vulnerabilities in question answers, event, quota and product names 2017-08-21 15:14:45 +02:00
Raphael Michel
24e5d337a6 [SECURITY] Update to morris.js master to fix a XSS vulnerability 2017-08-21 15:14:44 +02:00
Raphael Michel
a2c1413036 [SECURITY] Use defusedcsv for exports 2017-08-21 15:14:44 +02:00
Tobias Kunze
bab092f04b Do not override the Reply-To header (#597) 2017-08-20 13:50:48 +03:00
Tobias Kunze
2bf4e6c5c6 Fix import of celery app in documentation (#596) 2017-08-20 12:41:37 +03:00
Raphael Michel
584add97a3 Fix counting bug for global order search 2017-08-11 12:42:47 +02:00
Raphael Michel
57143a434e Add new signal voucher_form_validation 2017-08-10 17:06:16 +02:00
Raphael Michel
e31bd7600c Add bcc to mail_send 2017-08-09 16:22:14 +02:00
Raphael Michel
f02ec8b24b Improve Stripe.js loading 2017-08-09 13:56:52 +02:00
Raphael Michel
b8704f980f Only validate form of the selected payment 2017-08-09 13:56:52 +02:00
Raphael Michel
3accf74687 Fix KeyError in form submission 2017-08-09 13:56:52 +02:00
Tobias Kunze
a213ca746c Only mention an order in the mail if one is associated (#592) 2017-08-09 10:42:52 +02:00
Raphael Michel
349e306d38 Fix #576 yet again 2017-08-08 23:08:34 +02:00
Raphael Michel
ca1b1032eb Allow mails without HTML 2017-08-08 22:28:27 +02:00
Raphael Michel
a6c9fb0f8b Fix #576 again 2017-08-08 22:24:53 +02:00
Raphael Michel
c8230c55ee Update translation 2017-08-08 21:06:54 +02:00
Raphael Michel
55f77613d4 Fix #576 -- linebreaks in bank details in HTML mails 2017-08-08 20:37:01 +02:00
Raphael Michel
c9a1ff45c7 Fix import order 2017-08-07 19:31:20 +02:00
Raphael Michel
c209f66d49 Fix #590 -- Combined Ticket-PDFs are not invalidated when rotating secrets 2017-08-07 18:34:04 +02:00
Raphael Michel
3efa02eb81 Fixes to the download reminder 2017-08-07 17:10:04 +02:00
Raphael Michel
8506f66236 Show if team members have 2FA enabled 2017-08-07 16:15:32 +02:00
Sanket Dasgupta
cb2826f171 Fix #293 -- Add ticket downloading reminder (#567)
Closes https://github.com/pretix/pretix/issues/293
2017-08-07 16:15:27 +02:00
Raphael Michel
0990c9cc3d Fix AttributeError in voucher creation 2017-08-07 14:12:16 +02:00
Raphael Michel
4aa9594a61 Fix voucher redemption problem with subevents 2017-08-07 14:09:12 +02:00
Raphael Michel
ed208cf433 Optimize OrderFilterForm query 2017-08-07 14:04:16 +02:00
Raphael Michel
428faeb756 Add a minimal length for voucher codes 2017-08-07 12:11:48 +02:00
Raphael Michel
e858edd85c Do not allow vouchers to create negative prices 2017-08-07 12:11:48 +02:00
Raphael Michel
e4ab27a292 Fix missing file 2017-08-01 21:02:15 +02:00
Raphael Michel
eece5793d6 Fix travis after bbed8e5f 2017-08-01 20:43:28 +02:00
Nicole Klünder
3df737a94f fix missing space in german translation (#587) 2017-08-01 20:39:39 +02:00
Nicole Klünder
0e4c414c2e fix wrong stripe version in setup.py (#588) 2017-08-01 20:39:25 +02:00
Raphael Michel
326304db54 Fix #583 -- Wrongly documented option 2017-07-31 23:00:48 +02:00
Raphael Michel
c8e54524a3 Only use SQLite config during tests if it exists 2017-07-31 21:36:46 +02:00
Raphael Michel
d671060a47 Add sphinxcontrib-images to doc dependencies 2017-07-31 21:14:00 +02:00
Raphael Michel
93dab76da2 Complete docs page 2017-07-31 21:12:30 +02:00
Nicole Klünder
bbed8e5fae throw exception if PRETIX_CONFIG_FILE can not be opened (#581)
If the environment variable PRETIX_CONFIG_FILE is set but the file can not be read because it does not exists or permission is denied, pretix just runs with default settings. When setting up a new installation this can be confusing and difficult to debug.

I think it is safe to assume that someone who sets PRETIX_CONFIG_FILE aims to point it at a readable file, so raising with a more understandable exception is expected or at least helpful. Otherwise, the user will usually get a DisallowedHost exception because the [pretix]url config variable is not set which is not as helpful.
2017-07-31 18:33:16 +02:00
Raphael Michel
e16f8fc7e9 Add some user documentation 2017-07-31 18:31:20 +02:00
Raphael Michel
86f17094bb Hide quota options when creating a product with variations 2017-07-31 13:52:50 +02:00
Raphael Michel
b1b49758b1 Fix reversal bug 2017-07-31 12:54:57 +02:00
Raphael Michel
4790665759 bump version 2017-07-31 12:54:57 +02:00
Tobias Kunze
8ede492cba Add optional help_text to Question objects. Closes #574. (#579) 2017-07-31 10:54:57 +02:00
Raphael Michel
5f607cc034 Bump version 2017-07-30 20:36:45 +02:00
Raphael Michel
3b9f508be9 Create squash migration 2017-07-30 20:11:23 +02:00
Raphael Michel
89e381b7ea Update translations 2017-07-30 19:44:11 +02:00
Tobias Kunze
57869b2145 Wording fixes (#577) 2017-07-30 19:29:17 +02:00
Raphael Michel
46976900d7 Add documentation on mail methods 2017-07-27 15:47:22 +02:00
Raphael Michel
a1535da117 Subevent creation: Layout issue 2017-07-27 15:18:25 +02:00
Raphael Michel
f43d782b5c Hide quota options during product creation for event series 2017-07-27 15:14:28 +02:00
Daniel
5c443e2f93 Ref #569 -- Include other email to history (#570)
Log all other order-specified emails and include them into
email history.
2017-07-27 15:09:06 +02:00
Raphael Michel
54f01f63f7 Update translation 2017-07-27 11:53:14 +02:00
Raphael Michel
c64b4473e4 Add organizer_info_text 2017-07-27 11:43:35 +02:00
Raphael Michel
d413a37c1f Translation improvements 2017-07-27 11:21:28 +02:00
Raphael Michel
202fb12008 Order payment providers by name 2017-07-27 11:17:29 +02:00
Raphael Michel
59dea63870 Add product description to ticket editor 2017-07-27 10:13:55 +02:00
Raphael Michel
9a18f2b553 Small JS improvements 2017-07-26 13:41:53 +02:00
Clint
4293ec3805 Fix #475 -- add to existing quota / add new quota from product form (#562)
* added fields and logic for adding quota in creation of product

* added section for selecting quota option

* logic for hiding quota selections when needed

* fixed logic for quota selection

* formatting, removed print statements

* styling

* tests for adding quotas in product form

* cleaned up

* added divs

* reworked to include translatable text, readable values for quota options

* quota_add_existing form assignment to str(q.pk)

* made changes for radio buttons, added in sliding animation

* moved string constants for quota options, changed quota options to RadioSelect from Select
2017-07-26 13:41:23 +02:00
Raphael Michel
f3b616e495 Add exporter to output all tickets 2017-07-26 13:18:35 +02:00
Raphael Michel
003ea24990 Fix Stripe test 2017-07-25 16:52:37 +02:00
Raphael Michel
92d4566a54 Make stripe refund call optional, add request parameter to order_control_refund_render 2017-07-25 16:11:42 +02:00
Raphael Michel
70a933edc1 Hide min_per_order=1 2017-07-24 09:54:33 +02:00
Raphael Michel
d2d77f28aa Fix wrongly displayed download buttons 2017-07-24 09:14:54 +02:00
Raphael Michel
39179971c5 Fix stripe tests 2017-07-23 13:33:43 +02:00
Raphael Michel
c06f36e8c2 Do not render time before JS locale file is loaded 2017-07-23 13:06:07 +02:00
Raphael Michel
1d2d9d8b99 PayPal: Event-independent webhooks 2017-07-23 12:38:41 +02:00
Raphael Michel
5f529817ef Stripe: Event-independent webhooks 2017-07-23 12:22:48 +02:00
Raphael Michel
7c91bc2f37 Respect primary browser language 2017-07-20 11:31:34 +02:00
Raphael Michel
ef022f5a6d Add new dependencies to setup.py 2017-07-19 17:42:07 +02:00
Raphael Michel
54ce00c8b9 Update translation 2017-07-19 14:17:23 +02:00
Raphael Michel
baabbfb1ea Check for required invoice information in other steps 2017-07-19 14:10:04 +02:00
Raphael Michel
28e676ac9a Allow to only require the name in the invoice address 2017-07-19 14:07:18 +02:00
Raphael Michel
21fac9ec7a Auto-toggle form fields for business/individual customers 2017-07-19 12:26:50 +02:00
Raphael Michel
335955820b Fix a counting bug 2017-07-19 12:10:35 +02:00
Raphael Michel
d2b0e7209f Use a choice field for invoice address countries 2017-07-19 12:08:18 +02:00
Johan von Forstner
f8ed21c819 Fix #130 -- Mark required question fields at checkout (#564)
* Fix #130: Mark required question fields at checkout

* Add legend
2017-07-19 11:02:07 +02:00
Tobias Kunze
9c2143effe Clarify mail subject prefix. (#520) 2017-07-19 10:42:34 +02:00
Raphael Michel
8a3fa6aff6 Show category descriptions if redeeming a voucher 2017-07-18 16:47:18 +02:00
Daniel
7e304bb231 Fix #565 -- OrderList ordering request handling (#566)
Fix missed out ordering get request handling.
2017-07-18 16:16:51 +02:00
Raphael Michel
99d614289e Link order from change pages, compat for old logs 2017-07-18 11:46:21 +02:00
Daniel
b90894c20f Fix #543 -- Allow send mail from order (#550)
- Add send email directly for order
- Add email history (from mass and custom) to each specific order
2017-07-18 11:45:30 +02:00
Johan von Forstner
921834c917 Fix os.chown call on Windows (#563) 2017-07-18 11:42:30 +02:00
Raphael Michel
83df4451e6 Fix #491 -- Search order by invoice number 2017-07-18 11:14:51 +02:00
Raphael Michel
2ad9e1bb43 Change API to accomodate for invoice numbers 2017-07-18 10:37:32 +02:00
Raphael Michel
c9990e5ca4 Update translation 2017-07-18 10:04:24 +02:00
Raphael Michel
c95e61db09 Add new external plugins to list 2017-07-17 23:32:41 +02:00
Raphael Michel
7bb12ff0ec Configurable invoice prefixes 2017-07-17 23:03:20 +02:00
Raphael Michel
670bfa18de Slug widget 2017-07-17 20:54:39 +02:00
Raphael Michel
130f619b05 Fix raven integration 2017-07-17 20:29:56 +02:00
Raphael Michel
f900c842cb Improve "copy from above" 2017-07-17 16:12:33 +02:00
Tobias Kunze
c2844a8f35 Add custom_header block to <head> (#561) 2017-07-17 14:52:20 +02:00
Raphael Michel
a864dabbaf Refs #552 -- Expand all panels that contain validation errors 2017-07-17 12:49:45 +02:00
Daniel
02786f4801 Fix #552 -- Add icon to expansible panels (#560)
* Ref #552 -- Add icon to expansible panels

Offer informative feedback to user by showing icons to indicate
expansible panels.

* Fix wrongly removed JavaScript line
2017-07-17 12:29:47 +02:00
Raphael Michel
5a4fe266c6 Fix usage of wrong settings key 2017-07-16 22:17:02 +02:00
Raphael Michel
b30a4db0b8 Update translation 2017-07-16 20:15:48 +02:00
Raphael Michel
2e76e07764 Show end date on front page 2017-07-16 20:11:59 +02:00
Raphael Michel
1be92f5078 Really fix 2050c0b7 issue 2017-07-16 19:37:18 +02:00
Raphael Michel
8afff29cd4 Make microdata XSS-safe and subevent-aware 2017-07-16 17:52:08 +02:00
Raphael Michel
9c6090a355 Fix translation sytax error 2017-07-16 17:49:31 +02:00
Joepriesto
27b73227ed Fix #30 -- Event microdata information (#546)
* Addition of all basics required for microdata

Microdata for event added to the head of the base event html template.

* Fixed flake8 errors & included settings checks

Fixed the flake8 too many blank line errors and changed the date and time section to refer to settings before including the time and/or the date_to.

* Typo in last commit

Fixed typo in last commit

* Fixed bracket mistake and flake8 error

Fixed tab between { and % in template tag. Removed extra lines. Removed unnecessary str() call.
Corrected binary & to [and] operator.

* Added testing for microdata

Testing added to the presale.test_event tests to cover the 4 branches and basic microdata functionality.
2017-07-16 17:42:46 +02:00
Raphael Michel
9582f8380f Fix translation syntax 2017-07-16 17:31:35 +02:00
Raphael Michel
bfeac7e70b Fix bogus translation 2017-07-16 17:21:07 +02:00
Raphael Michel
2050c0b7a8 Fix TypeError 2017-07-16 17:05:46 +02:00
Raphael Michel
144f9bed69 Fix URL in iCal test 2017-07-15 16:38:14 +02:00
Raphael Michel
f2b642d944 Fix iCal URL 2017-07-14 18:26:18 +02:00
Raphael Michel
bcdc75953e Add SubEvent.frontpage_text 2017-07-14 18:14:24 +02:00
Raphael Michel
1fabe5a7cf Disable button "add to cart" with no selection 2017-07-14 18:10:49 +02:00
Raphael Michel
fe9a4b7aa3 Allow word wrapping inside .dl-horizontal dt 2017-07-14 18:10:18 +02:00
Raphael Michel
56735dc1c6 Make PDF ticket output subevent-compatible 2017-07-14 18:09:48 +02:00
Raphael Michel
42287b92f1 Allow ticket output methods to opt-out from ZIP generation 2017-07-14 17:32:16 +02:00
Raphael Michel
7d9e642f24 Useful default date for admission field 2017-07-14 17:21:41 +02:00
Raphael Michel
b20e10585f Include Event.is_public in Event.copy_data_from 2017-07-14 17:11:52 +02:00
Raphael Michel
8438b211a6 Fix iCal test failing due to new UID format 2017-07-14 14:55:08 +02:00
Raphael Michel
f94314afec Generate organizer-level iCal files 2017-07-14 14:25:05 +02:00
Martin Gross
4584d23434 Fix #556 - Max. redemptions instead of amount of vouchers (#558) 2017-07-14 12:11:34 +02:00
Raphael Michel
2791501781 Fix #557 -- Drop unused CSS file 2017-07-14 12:11:20 +02:00
Raphael Michel
6ea798e55b Allow to exclude free products from invoices 2017-07-14 12:11:20 +02:00
Martin Gross
0ab6ac569e Fix #553 -- Order by position first in order_overview (#554) 2017-07-14 10:22:26 +02:00
Raphael Michel
f91d7352a4 Fix AttributeError in test 2017-07-13 22:04:34 +02:00
Raphael Michel
d644b8fe01 Fix detection of core modules after ae910eb7 2017-07-13 20:33:08 +02:00
Raphael Michel
5a8042cc10 Fix relative dates in payment method availability field 2017-07-13 17:37:07 +02:00
Raphael Michel
ae910eb731 Fix EventPluginSignal to recognize Django apps with custom app labels 2017-07-12 19:14:28 +02:00
Raphael Michel
c1158c3175 Allow to mark add-ons as "included" in price 2017-07-12 18:42:09 +02:00
Raphael Michel
79562e7ad9 Add logdisplay for charge.pending 2017-07-12 18:02:56 +02:00
Raphael Michel
e3388bea96 Fix Stripe webhooks 2017-07-12 17:37:05 +02:00
Daniel
a3b4a7ef1d Fix #516 -- Prevent gaps in plugin list (#551)
Use flexbox to fix misalignment when column height is imbalanced.
2017-07-12 17:30:01 +02:00
Raphael Michel
947b06cd61 Update translation 2017-07-12 17:20:09 +02:00
Raphael Michel
a3f3561f02 Fix import in stripe tests 2017-07-12 16:56:01 +02:00
Raphael Michel
48095d38be Fix #407 -- Integrate more Stripe payment methods 2017-07-12 16:42:44 +02:00
Raphael Michel
1c6858653a Avoid relative URLs in stripe plugin 2017-07-11 22:53:15 +02:00
Raphael Michel
648797325e Allow to copy across events with and w/o subevents 2017-07-11 22:45:41 +02:00
Raphael Michel
af3fa88d67 Typos and translation 2017-07-11 18:47:39 +02:00
Raphael Michel
8123effa65 Add sub-events and relative date settings (#503)
* Data model

* little crud

* SubEventItemForm etc

* Drop SubEventItem.active, quota editor

* Fix failing tests

* First frontend stuff

* Addons form stuff

* Quota calculation

* net price display on EventIndex

* Add tests, solve some bugs

* Correct quota selection in more places, consolidate pricing logic

* Fix failing quota tests

* Fix TypeError

* Add tests for checkout

* Fixed a bug in QuotaForm

* Prevent immutable cart if a quota was removed from an item

* Add tests for pricing

* Handle waiting list

* Filter in check-in list

* Fixed import lost in rebase

* Fix waiting list widget

* Voucher management

* Voucher redemption

* Fix broken tests

* Add subevents to OrderChangeManager

* Create a subevent during event creation

* Fix bulk voucher creation

* Introduce subevent.active

* Copy from for subevents

* Show active in list

* ICal download for subevents

* Check start and end of presale

* Failing tests / show cart logic

* Test

* Rebase migrations

* REST API integration of sub-events

* Integrate quota calculation into the traditional quota form

* Make subevent argument to add_position optional

* Log-display foo

* pretixdroid and subevents

* Filter by subevent

* Add more tests

* Some mor tests

* Rebase fixes

* More tests

* Relative dates

* Restrict selection in relative datetime widgets

* Filter subevent list

* Re-label has_subevents

* Rebase fixes, subevents in calendar view

* Performance and caching issues

* Refactor calendar templates

* Permission tests

* Calendar fixes and month selection

* subevent selection

* Rename subevents to dates

* Add tests for calendar views
2017-07-11 13:56:00 +02:00
Raphael Michel
554800c06f Add 3DS support to Stripe plugin 2017-07-10 21:36:59 +02:00
Raphael Michel
687ce29366 Fix #547 -- Switch to Stripe Elements 2017-07-10 20:00:03 +02:00
Raphael Michel
c70301572c Fix bug in invoice rendering 2017-07-10 14:43:37 +02:00
Raphael Michel
714f58e2c5 Update translation 2017-07-10 14:29:53 +02:00
Raphael Michel
9bf9dca88a Invoice exporter: open in binary mode 2017-07-10 14:25:26 +02:00
Daniel
0663f25208 Fix #541 -- Allow delete waitinglist entries (#544)
Add new action "delete" for each waiting list entries
2017-07-09 15:19:30 +02:00
Raphael Michel
275d162b81 List of events: Optional calendar view 2017-07-08 22:50:48 +02:00
Raphael Michel
675956a7c4 Update translations 2017-07-07 11:37:09 +02:00
Raphael Michel
cf1602c0af Add short form to event list 2017-07-07 11:32:53 +02:00
Raphael Michel
35979ed332 Add internal comment to events 2017-07-07 11:31:33 +02:00
Raphael Michel
6e65ae5306 Swappable invoice renderers 2017-07-07 11:16:07 +02:00
Raphael Michel
95e716b8ce Improve help texts 2017-07-07 10:11:39 +02:00
Raphael Michel
554284ac67 Link new plugins 2017-07-06 18:07:03 +02:00
Raphael Michel
fa6102bbad Allow to override sender for mail 2017-07-06 18:06:07 +02:00
Raphael Michel
f28d5f19a7 Ignore spaces in bank transfer references 2017-07-06 17:39:32 +02:00
Raphael Michel
34d59c7741 Add "Go to shop" in mobile view 2017-07-06 17:36:01 +02:00
Raphael Michel
21d432a3ca Make cancel notifications optional 2017-07-06 12:04:35 +02:00
Daniel
d444935140 Fix #391 -- Send email on cancelled order (#540)
Send a notification email to user when
order is cancelled.
2017-07-06 11:59:48 +02:00
Raphael Michel
9de9d96e35 Do not expose "Deutsch (Du)" in name-local 2017-07-06 09:26:26 +02:00
Michele Fattoruso
5932558ca2 Fix #300 - Feature/remove flag as language (#542)
* don't use flags to indicate languages #300

* cleaned code

* removed the filter and moved the logic to context.py

* cleaned code

* show the text in the local language

* cleaned code

* changed loop for list comprehension

* fix indentation

* ordered import
2017-07-06 09:13:57 +02:00
Raphael Michel
7b22adb72e Allow to manually generate invoice if invoice mode is "on payment" 2017-07-05 13:34:07 +02:00
Raphael Michel
0db5d062be Add a file upload type to questions (#534)
* Initial stuff

* More features
2017-07-03 14:22:31 +02:00
Sanket Dasgupta
678d510e29 config.rst: Include environment variable in list of paths (#539)
Closes https://github.com/pretix/pretix/issues/528
2017-07-03 12:52:36 +02:00
Raphael Michel
1fc3307d22 Add signal question_form_fields 2017-07-02 19:45:26 +02:00
Raphael Michel
45c17ba949 Fix syntax error in setup.py 2017-07-02 18:57:55 +02:00
Raphael Michel
15bd1d9006 Fix missing dependencies in setup.py 2017-07-02 18:44:25 +02:00
Tydon K
b4715f0931 Fix #517 -- Changed navpills to navtabs in email template editor (#533)
* Changed navpills to navtabs in email template editor

* Issue 517 - Added border radius to email template tabs and removed excess bottom margin.
2017-07-02 17:51:41 +02:00
Raphael Michel
6f24a2a88c Fix import in unit test 2017-07-02 17:36:12 +02:00
Raphael Michel
fcbecf895a Bump version to 1.6.0.dev0 2017-07-02 17:32:02 +02:00
505 changed files with 52369 additions and 9815 deletions

1
.gitattributes vendored
View File

@@ -5,6 +5,7 @@ src/static/moment/* linguist-vendored
src/static/datetimepicker/* linguist-vendored
src/static/colorpicker/* linguist-vendored
src/static/fileupload/* linguist-vendored
src/static/vuejs/* 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

View File

@@ -8,6 +8,8 @@ tests:
- XDG_CACHE_HOME=/cache bash .travis.sh tests
tags:
- python3
except:
- pypi
pypi:
stage: release
script:
@@ -22,7 +24,7 @@ pypi:
tags:
- python3
only:
- release
- pypi
artifacts:
paths:
- src/dist/

View File

@@ -12,29 +12,29 @@ 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
- 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=style
- python: 3.6
env: JOB=plugins
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg
- python: 3.6
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
addons:
postgresql: "9.4"

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

@@ -40,6 +40,11 @@ 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!
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 +55,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

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

@@ -10,9 +10,10 @@ at the following locations. It will try to read the file from the specified path
the following order. The file that is found *last* will override the settings from
the files found before.
1. ``/etc/pretix/pretix.cfg``
2. ``~/.pretix.cfg``
3. ``pretix.cfg`` in the current working directory
1. ``PREFIX_CONFIG_FILE`` environment variable
2. ``/etc/pretix/pretix.cfg``
3. ``~/.pretix.cfg``
4. ``pretix.cfg`` in the current working directory
The file is expected to be in the INI format as specified in the `Python documentation`_.
@@ -59,6 +60,14 @@ 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``.
Locale settings
---------------
@@ -163,14 +172,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

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

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

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

View File

@@ -44,7 +44,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -90,7 +90,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,

View File

@@ -0,0 +1,238 @@
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).
===================================== ========================== =======================================================
.. versionchanged:: 1.10
This resource has been added.
Endpoints
---------
.. 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": [],
"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": [],
"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: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],
"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 resetted 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],
"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 checkins 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.

View File

@@ -24,8 +24,14 @@ is_public boolean If ``true``, th
presale_start datetime The date at which the ticket shop opens (or ``null``)
presale_end datetime The date at which the ticket shop closes (or ``null``)
location multi-lingual string The event location (or ``null``)
has_subevents boolean ``True`` if the event series feature is active for this
event
meta_data dict Values set for organizer-specific meta data parameters.
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The ``meta_data`` field has been added.
Endpoints
---------
@@ -48,7 +54,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -67,6 +73,8 @@ Endpoints
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {}
}
]
}
@@ -95,7 +103,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"name": {"en": "Sample Conference"},
@@ -109,6 +117,8 @@ Endpoints
"presale_start": null,
"presale_end": null,
"location": null,
"has_subevents": false,
"meta_data": {}
}
:param organizer: The ``slug`` field of the organizer to fetch

View File

@@ -6,6 +6,8 @@ Resources and endpoints
organizers
events
subevents
taxrules
categories
items
questions
@@ -13,4 +15,5 @@ Resources and endpoints
orders
invoices
vouchers
checkinlists
waitinglist

View File

@@ -11,7 +11,7 @@ The invoice resource contains the following public fields:
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
invoice_no string Invoice number (without prefix)
number string Invoice number (with prefix)
order string Order code of the order this invoice belongs to
is_cancellation boolean ``True``, if this invoice is the cancellation of a
different invoice.
@@ -29,12 +29,40 @@ 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.
===================================== ========================== =======================================================
.. versionchanged:: 1.6
The attribute ``invoice_no`` has been dropped in favor of ``number`` which includes the number including the prefix,
since the prefix can now vary. Also, invoices now need to be identified by their ``number`` instead of the raw
number.
.. versionchanged:: 1.7
The attributes ``lines.tax_name``, ``foreign_currency_display``, ``foreign_currency_rate``, and
``foreign_currency_rate_date`` have been added.
.. versionchanged:: 1.9
The attribute ``internal_reference`` has been added.
Endpoints
---------
@@ -56,7 +84,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -64,7 +92,7 @@ Endpoints
"previous": null,
"results": [
{
"invoice_no": "00001",
"number": "SAMPLECONF-00001",
"order": "ABC12",
"is_cancellation": false,
"invoice_from": "Big Events LLC\nDemo street 12\nDemo town",
@@ -73,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",
@@ -81,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"
}
]
}
@@ -92,17 +125,17 @@ 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
``invoice_no``. Default: ``invoice_no``
``nr`` (equals to ``number``). Default: ``nr``
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/(invoice_no)/
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/invoices/(number)/
Returns information on one invoice, identified by its invoice number.
@@ -110,7 +143,7 @@ Endpoints
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/00001/ HTTP/1.1
GET /api/v1/organizers/bigevents/events/sampleconf/invoices/SAMPLECONF-00001/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
@@ -120,10 +153,10 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"invoice_no": "00001",
"number": "SAMPLECONF-00001",
"order": "ABC12",
"is_cancellation": false,
"invoice_from": "Big Events LLC\nDemo street 12\nDemo town",
@@ -132,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",
@@ -140,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

View File

@@ -27,6 +27,7 @@ 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).
@@ -49,6 +50,9 @@ 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).
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
(read-only).
variations list of objects A list with one object for each variation of this item.
@@ -70,6 +74,11 @@ addons list of objects Definition of a
└ position integer An integer, used for sorting
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The attribute ``tax_rule`` has been added. ``tax_rate`` is kept for compatibility. The attribute
``checkin_attention`` has been added.
Endpoints
---------
@@ -92,7 +101,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -108,6 +117,7 @@ Endpoints
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
@@ -118,6 +128,7 @@ Endpoints
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"variations": [
{
@@ -177,7 +188,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -188,6 +199,7 @@ Endpoints
"description": null,
"free_price": false,
"tax_rate": "0.00",
"tax_rule": 1,
"admission": false,
"position": 0,
"picture": null,
@@ -198,6 +210,7 @@ Endpoints
"allow_cancel": true,
"min_per_order": null,
"max_per_order": null,
"checkin_attention": false,
"has_variations": false,
"variations": [
{

View File

@@ -24,23 +24,42 @@ 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
payment_fee_tax_rate decimal (string) Tax rate applied to the payment fee
payment_fee_tax_value money (string) Tax value included in the payment fee
payment_fee_tax_rule integer The ID of the used tax rule (or ``null``)
total money (string) Total value of this order
comment string Internal comment on this order
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
@@ -50,6 +69,23 @@ downloads list of objects List of ticket
└ url string Download URL
===================================== ========================== =======================================================
.. versionchanged:: 1.6
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 favour 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.
Order position resource
-----------------------
@@ -58,7 +94,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
@@ -69,8 +105,10 @@ 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
└ datetime datetime Time of check-in
downloads list of objects List of ticket download options
@@ -82,6 +120,10 @@ answers list of objects Answers to user
└ options list of integers Internal IDs of selected option(s)s (only for choice types)
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The attribute ``tax_rule`` has been added.
Order endpoints
---------------
@@ -104,7 +146,7 @@ Order endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -121,20 +163,21 @@ 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": "",
"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": [
{
@@ -149,8 +192,10 @@ Order endpoints
"voucher": null,
"tax_rate": "0.00",
"tax_value": "0.00",
"tax_rule": null,
"secret": "z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
"addon_to": null,
"subevent": null,
"checkins": [
{
"datetime": "2017-12-25T12:45:23Z"
@@ -212,7 +257,7 @@ Order endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"code": "ABC12",
@@ -224,20 +269,21 @@ 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": "",
"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": [
{
@@ -251,9 +297,11 @@ 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": [
{
"datetime": "2017-12-25T12:45:23Z"
@@ -288,6 +336,7 @@ 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)/
@@ -324,11 +373,208 @@ 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
------------------------
@@ -351,7 +597,7 @@ Order position endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -369,9 +615,11 @@ 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": [
{
"datetime": "2017-12-25T12:45:23Z"
@@ -407,6 +655,7 @@ Order position endpoints
: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
checked in already.
:query integer subevent: Only return positions of the sub-event with the given ID
:query integer addon_to: Only return positions that are add-ons to the position with the given ID.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
@@ -432,7 +681,7 @@ Order position endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 23442,
@@ -445,9 +694,11 @@ 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": [
{
"datetime": "2017-12-25T12:45:23Z"
@@ -474,12 +725,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.
@@ -511,7 +763,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

@@ -22,6 +22,7 @@ type string The expected ty
* ``B`` boolean
* ``C`` choice from a list
* ``M`` multiple choice from a list
* ``F`` file upload
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.
@@ -53,7 +54,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -112,7 +113,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,

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
@@ -17,8 +17,13 @@ name string The internal na
size integer The size of the quota or ``null`` for unlimited
items list of integers List of item IDs this quota acts on.
variations list of integers List of item variation IDs this quota acts on.
subevent integer ID of the date inside an event series this quota belongs to (or ``null``).
===================================== ========================== =======================================================
.. versionchanged:: 1.10
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
@@ -41,7 +46,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -53,7 +58,8 @@ Endpoints
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7]
"variations": [1, 4, 5, 7],
"subevent": null
}
]
}
@@ -61,6 +67,7 @@ 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 integer subevent: Only return quotas of the sub-event with the given ID
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
@@ -85,14 +92,15 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7]
"variations": [1, 4, 5, 7],
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
@@ -102,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 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": "Ticket Quota",
"size": 200,
"items": [1, 2],
"variations": [1, 4, 5, 7],
"subevent": null
}
:param organizer: The ``slug`` field of the organizer 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 resetted 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.
@@ -120,7 +253,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"available": true,

View File

@@ -0,0 +1,144 @@
Event series dates / Sub-events
===============================
Resource description
--------------------
Events can represent whole event series if the ``has_subevents`` property of the event is active.
In this case, many other resources are additionally connected to an event date (also called sub-event).
The sub-event resource contains the following public fields:
.. rst-class:: rest-resource-table
===================================== ========================== =======================================================
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the sub-event
name multi-lingual string The sub-event's full name
active boolean If ``true``, the sub-event ticket shop is publicly
available.
date_from datetime The sub-event's start date
date_to datetime The sub-event's end date (or ``null``)
date_admission datetime The sub-event's admission date (or ``null``)
presale_start datetime The sub-date at which the ticket shop opens (or ``null``)
presale_end datetime The sub-date at which the ticket shop closes (or ``null``)
location multi-lingual string The sub-event location (or ``null``)
item_price_overrides list of objects List of items for which this sub-event overrides the
default price
├ item integer The internal item ID
└ price money (string) The price or ``null`` for the default price
variation_price_overrides list of objects List of variations for which this sub-event overrides
the default price
├ variation integer The internal variation ID
└ price money (string) The price or ``null`` for the default price
meta_data dict Values set for organizer-specific meta data parameters.
===================================== ========================== =======================================================
.. versionchanged:: 1.7
The ``meta_data`` field has been added.
Endpoints
---------
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
Returns a list of all sub-events of an event.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": {"en": "First Sample Conference"},
"active": false,
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"presale_start": null,
"presale_end": null,
"location": null,
"item_price_overrides": [
{
"item": 2,
"price": "12.00"
}
],
"variation_price_overrides": [],
"meta_data": {}
}
]
}
:query page: The page number in case of a multi-page result set, default is 1
:param organizer: The ``slug`` field of a valid organizer
:param event: The ``slug`` field of the event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/(id)/
Returns information on one sub-event, identified by its ID.
**Example request**:
.. sourcecode:: http
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/1/ HTTP/1.1
Host: pretix.eu
Accept: application/json, text/javascript
**Example response**:
.. sourcecode:: http
HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/json
{
"id": 1,
"name": {"en": "First Sample Conference"},
"active": false,
"date_from": "2017-12-27T10:00:00Z",
"date_to": null,
"date_admission": null,
"presale_start": null,
"presale_end": null,
"location": null,
"item_price_overrides": [
{
"item": 2,
"price": "12.00"
}
],
"variation_price_overrides": [],
"meta_data": {}
}
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:param id: The ``slug`` field of the sub-event to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.

View File

@@ -0,0 +1,234 @@
Tax rules
=========
Resource description
--------------------
Tax rules specify how tax should be calculated for specific products.
.. 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

@@ -40,9 +40,14 @@ quota integer An ID of a quot
for all items without restriction.
tag string A string that is used for grouping vouchers
comment string An internal comment on the voucher
subevent integer ID of the date inside an event series this voucher belongs to (or ``null``).
===================================== ========================== =======================================================
.. versionchanged:: 1.9
The write operations ``POST``, ``PATCH``, ``PUT``, and ``DELETE`` have been added.
Endpoints
---------
@@ -64,7 +69,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -85,7 +90,8 @@ Endpoints
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": ""
"comment": "",
"subevent": null
}
]
}
@@ -107,6 +113,7 @@ Endpoints
:query integer variation: If set, only vouchers attached to the variation with the given ID will be shown.
:query integer quota: If set, only vouchers attached to the quota with the given ID will be shown.
:query string tag: If set, only vouchers with the given tag will be shown.
:query integer subevent: Only return vouchers of the sub-event with the given ID
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id``, ``code``,
``max_usages``, ``valid_until``, and ``value``. Default: ``id``
:param organizer: The ``slug`` field of the organizer to fetch
@@ -133,7 +140,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -149,7 +156,8 @@ Endpoints
"variation": null,
"quota": null,
"tag": "testvoucher",
"comment": ""
"comment": "",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch
@@ -158,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

@@ -23,6 +23,7 @@ item integer An ID of an ite
variation integer An ID of a variation the user is waiting to be
available again (or ``null``)
locale string Locale of the waiting user
subevent integer ID of the date inside an event series this entry belongs to (or ``null``).
===================================== ========================== =======================================================
@@ -47,7 +48,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"count": 1,
@@ -61,7 +62,8 @@ Endpoints
"voucher": null,
"item": 2,
"variation": null,
"locale": "en"
"locale": "en",
"subevent": null
}
]
}
@@ -73,6 +75,7 @@ Endpoints
have not been sent a voucher.
:query integer item: If set, only entries of users waiting for the item with the given ID will be shown.
:query integer variation: If set, only entries of users waiting for the variation with the given ID will be shown.
:query integer subevent: Only return entries of the sub-event with the given ID
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id``, ``created``,
``email``, ``item``. Default: ``created``
:param organizer: The ``slug`` field of the organizer to fetch
@@ -99,7 +102,7 @@ Endpoints
HTTP/1.1 200 OK
Vary: Accept
Content-Type: text/javascript
Content-Type: application/json
{
"id": 1,
@@ -108,7 +111,8 @@ Endpoints
"voucher": null,
"item": 2,
"variation": null,
"locale": "en"
"locale": "en",
"subevent": null
}
:param organizer: The ``slug`` field of the organizer to fetch

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
@@ -38,9 +42,9 @@ django.setup()
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinxcontrib.httpdomain',
'sphinxcontrib.images',
]
# Add any paths that contain templates here, relative to this directory.
@@ -281,3 +285,8 @@ 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'
}

View File

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

@@ -11,7 +11,7 @@ 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
Order events
""""""""""""
@@ -19,13 +19,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, 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 +47,26 @@ 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: 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.plugins.ticketoutputpdf.signals
:members: layout_text_variables

View File

@@ -10,5 +10,6 @@ Contents:
exporter
ticketoutput
payment
invoice
customview
general

View File

@@ -0,0 +1,95 @@
.. highlight:: python
:linenothreshold: 5
Writing an invoice renderer plugin
==================================
An invoice renderer controls how invoice files are built.
The creation of such a plugin is very similar to creating an export output.
Please read :ref:`Creating a plugin <pluginsetup>` first, if you haven't already.
Output registration
-------------------
The invoice renderer API does not make a lot of usage from signals, however, it
does use a signal to get a list of all available ticket outputs. Your plugin
should listen for this signal and return the subclass of ``pretix.base.invoice.BaseInvoiceRenderer``
that we'll provide in this plugin::
from django.dispatch import receiver
from pretix.base.signals import register_invoice_renderers
@receiver(register_invoice_renderers, dispatch_uid="output_custom")
def register_infoice_renderers(sender, **kwargs):
from .invoice import MyInvoiceRenderer
return MyInvoiceRenderer
The renderer class
------------------
.. class:: pretix.base.invoice.BaseInvoiceRenderer
The central object of each invoice renderer is the subclass of ``BaseInvoiceRenderer``.
.. py:attribute:: BaseInvoiceRenderer.event
The default constructor sets this property to the event we are currently
working for.
.. autoattribute:: identifier
This is an abstract attribute, you **must** override this!
.. autoattribute:: verbose_name
This is an abstract attribute, you **must** override this!
.. automethod:: generate
Helper class for reportlab-base renderers
-----------------------------------------
All PDF rendering that ships with pretix is based on reportlab. We recommend to read the
`reportlab User Guide`_ to understand all the concepts used here.
If you want to implement a renderer that also uses report lab, this helper class might be
convenient to you:
.. class:: pretix.base.invoice.BaseReportlabInvoiceRenderer
.. py:attribute:: BaseReportlabInvoiceRenderer.pagesize
.. py:attribute:: BaseReportlabInvoiceRenderer.left_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.right_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.top_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.bottom_margin
.. py:attribute:: BaseReportlabInvoiceRenderer.doc_template_class
.. py:attribute:: BaseReportlabInvoiceRenderer.invoice
.. automethod:: _init
.. automethod:: _get_stylesheet
.. automethod:: _register_fonts
.. automethod:: _on_first_page
.. automethod:: _on_other_page
.. automethod:: _get_first_page_frames
.. automethod:: _get_other_page_frames
.. automethod:: _build_doc
.. _reportlab User Guide: https://www.reportlab.com/docs/reportlab-userguide.pdf

View File

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

View File

@@ -58,6 +58,8 @@ The output class
.. autoattribute:: is_enabled
.. autoattribute:: multi_download_enabled
.. autoattribute:: settings_form_fields
.. automethod:: settings_content_render

View File

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

@@ -14,7 +14,7 @@ Implementing a task
A common pattern for implementing asynchronous tasks can be seen a lot in ``pretix.base.services``
and looks like this::
from pretix.celery import app
from pretix.celery_app import app
@app.task
def my_task(argument1, argument2):

View File

@@ -2,6 +2,9 @@ Sending Email
=============
pretix allows event organizers to configure how they want to send emails to their users in multiple ways.
Therefore, all emails should be sent through the following function:
Therefore, all emails should be sent through the following function.
If the email you send is related to an order, you should also take a look at the
:py:meth:`~pretix.base.models.Order.send_mail` of the order model.
.. autofunction:: pretix.base.services.mail.mail

View File

@@ -21,7 +21,10 @@ Organizers and events
:members:
.. autoclass:: pretix.base.models.Event
:members:
:members: get_date_from_display, get_time_from_display, get_date_to_display, get_date_range_display, presale_has_ended, presale_is_running, cache, lock, get_plugins, get_mail_backend, payment_term_last, get_payment_providers, get_invoice_renderers, active_subevents, invoice_renderer, settings
.. autoclass:: pretix.base.models.SubEvent
:members: get_date_from_display, get_time_from_display, get_date_to_display, get_date_range_display, presale_has_ended, presale_is_running
.. autoclass:: pretix.base.models.Team
:members:
@@ -29,6 +32,15 @@ Organizers and events
.. 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
-----
@@ -42,6 +54,15 @@ Items
.. autoclass:: pretix.base.models.ItemVariation
:members:
.. autoclass:: pretix.base.models.SubEventItem
:members:
.. autoclass:: pretix.base.models.SubEventItemVariation
:members:
.. autoclass:: pretix.base.models.ItemAddOn
:members:
.. autoclass:: pretix.base.models.Question
:members:

View File

@@ -10,6 +10,3 @@ Developer documentation
implementation/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

View File

@@ -19,10 +19,12 @@ 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
@@ -34,10 +36,12 @@ pretix installation:
* Integration with MailChimp
The following plugins are from independent third-party authors, so we can make
no statements about their stability or compatibility:
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
@@ -46,3 +50,7 @@ no statements about their stability or compatibility:
.. _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

View File

@@ -99,6 +99,7 @@ uses to communicate with the pretix server.
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"paid": true
},
...
@@ -107,10 +108,10 @@ uses to communicate with the pretix server.
}
: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/
@@ -140,6 +141,7 @@ uses to communicate with the pretix server.
"variation": null,
"attendee_name": "Peter Higgs",
"redeemed": false,
"attention": false,
"paid": true
},
...

View File

@@ -2,3 +2,4 @@
sphinx
sphinx-rtd-theme
sphinxcontrib-httpdomain
sphinxcontrib-images

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

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 procede to the next step:
.. thumbnail:: ../../screens/event/create_step2.png
:align: center
:class: screenshot
In this step, you will be asked more detailled 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 legigible 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.

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,11 @@
Configuring an event
====================
.. toctree::
:maxdepth: 2
subevents
../payments/index
plugins
display
taxes

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

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

@@ -0,0 +1,111 @@
.. _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
detailled 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.
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

104
doc/user/events/widget.rst Normal file
View File

@@ -0,0 +1,104 @@
Embeddable Widget
=================
If you want to show your ticket shop on your event website or blog, you can use our JavaScript widget. This way,
users will not need to leave your site to buy their ticket in most cases. The widget will still open a new tab
for the checkout if the user is on a mobile device.
To obtain the correct HTML code for embedding your event into your website, we recommend that you go to the "Widget"
tab of your event's settings. You can specify some optional settings there (for example the language of the widget)
and then click "Generate widget code".
.. thumbnail:: ../../screens/event/widget_form.png
:align: center
:class: screenshot
You will obtain two code snippets that look *roughly* like the following. The first should be embedded into the
``<head>`` part of your website, if possible. If this inconvenient, you can put it in the ``<body>`` part as well::
<link rel="stylesheet" type="text/css" href="https://pretix.eu/demo/democon/widget/v1.css">
<script type="text/javascript" src="https://pretix.eu/widget/v1.en.js" async></script>
The second snippet should be embedded at the position where the widget should show up::
<pretix-widget event="https://pretix.eu/demo/democon/"></pretix-widget>
<noscript>
<div class="pretix-widget">
<div class="pretix-widget-info-message">
JavaScript is disabled in your browser. To access our ticket shop without JavaScript,
please <a target="_blank" href="https://pretix.eu/demo/democon/">click here</a>.
</div>
</div>
</noscript>
.. note::
You can of course embed multiple widgets of multiple events on your page. In this case, please add the first
snippet only *once* and the second snippets once *for each event*.
Example
-------
Your embedded widget could look like the following:
.. raw:: html
<link rel="stylesheet" type="text/css" href="https://pretix.eu/demo/democon/widget/v1.css">
<script type="text/javascript" src="https://pretix.eu/widget/v1.en.js" async></script>
<pretix-widget event="https://pretix.eu/demo/democon/"></pretix-widget>
<noscript>
<div class="pretix-widget">
<div class="pretix-widget-info-message">
JavaScript is disabled in your browser. To access our ticket shop without javascript, please <a target="_blank" href="https://pretix.eu/demo/democon/">click here</a>.
</div>
</div>
</noscript>
Styling
-------
If you want, you can customize the appearance of the widget to fit your website with CSS. If you inspect the rendered
HTML of the widget with your browser's developer tools, you will see that nearly every element has a custom class
and all classes are prefixed with ``pretix-widget``. You can override the styles as much as you want to and if
you want to go all custom, you don't even need to use the stylesheet provided by us at all.
SSL
---
Since buying a ticket normally involves entering sensitive data, we strongly suggest that you use SSL/HTTPS for the page
that includes the widget. Initiatives like `Let's Encrypt`_ allow you to obtain a SSL certificat free of charge.
All data transferred to pretix will be made over SSL, even if using the widget on a non-SSL site. However, without
using SSL for your site, a man-in-the-middle attacker could potentially alter the widget in dangerous ways. Moreover,
using SSL is becoming standard practice and your customers might want expect see the secure lock icon in their browser
granted to SSL-enabled web pages.
By default, the checkout process will open in a new tab in your customer's browsers if you don't use SSL for your
website. If you confident to have a good reason for not using SSL, you can override this behaviour with the
``skip-ssl-check`` attribute::
<pretix-widget event="https://pretix.eu/demo/democon/" skip-ssl-check></pretix-widget>
Pre-selecting a voucher
-----------------------
You can pre-select a voucher for the widget with the ``voucher`` attribute::
<pretix-widget event="https://pretix.eu/demo/democon/" voucher="ABCDE123456"></pretix-widget>
This way, the widget will only show products that can be bought with the voucher and prices according to the
voucher's settings.
.. raw:: html
<pretix-widget event="https://pretix.eu/demo/democon/" voucher="ABCDE123456"></pretix-widget>
<noscript>
<div class="pretix-widget">
<div class="pretix-widget-info-message">
JavaScript is disabled in your browser. To access our ticket shop without javascript, please <a target="_blank" href="https://pretix.eu/demo/democon/">click here</a>.
</div>
</div>
</noscript>
.. _Let's Encrypt: https://letsencrypt.org/

51
doc/user/faq.rst Normal file
View File

@@ -0,0 +1,51 @@
FAQ and Troubleshooting
=======================
How can I test my shop before taking it live?
---------------------------------------------
There are multiple ways to do this.
First, you could just create some orders in your real shop and cancel/refund them later. If you don't want to process
real payments for the tests, you can either use a "manual" payment method like bank transfer and just mark the orders
as paid with the button in the backend, or if you want to use e.g. Stripe, you can configure pretix to use your keys
for the Stripe test sytem and use their test credit cars. Read our :ref:`Stripe documentation <stripe>` for more
information.
Second, you could create a separate event, just for testing. In the last step of the :ref:`event creation process <event_create>`,
you can specify that you want to copy all settings from your real event, so you don't have to do all of it twice.
We are planning to add a dedicated test mode in a later version of pretix.
If you are using the hosted service at pretix.eu and want to get rid of the test orders completely, contact us at
support@pretix.eu and we can remove them for you. Please note that we only are able to do that *before* you have
received any real orders (i.e. taken the shop public). We won't charge any fees for test orders or test events.
How do I delete an event?
-------------------------
It is currently not possible to delete events, you can just disable the shop by clicking the first square on your event
dashboard. Events can't be deleted as they most likely contain information on financial transactions which legally
needs to be kept on record for multiple years in most countries.
If you are using the hosted service at pretix.eu and want to get rid of an event that you only used for testing, contact
us at support@pretix.eu and we can remove it for you.
Why doesn't my product show up in the ticket shop?
--------------------------------------------------
If you created a product and it doesn't show up, please follow the following steps to find out why:
1. Check if the product's "active" checkbox is enabled.
2. Check if the product is in a category that has the "Products in this category are add-on products" checkbox enabled.
If this is the case, the product won't show up on the shop front page, but only in the first step of checkout when
a product in the cart allows to add add-on products from this category.
3. Check if the product's "Available from" or "Available until" settings restrict it to a date range.
4. Check if the product's checkbox "This product will only be shown if a voucher matching the product is redeemed." is
enabled. If this is the case, the product will only be shown if the customer redeems a voucher that *directly* matches
to this product. It will not be shown if the voucher only is configured to match a quota that contains the product.
5. Check that a quota exists that contains this product. If your product has variations, check that at least one
variation is contained in a quota. If your event is an event series, make sure that the product is contained in a
quota that is assigned to the series date that you access the shop for.
6. If the sale period has not started yet or is already over, check the "Show items outside presale period" setting of
your event.

View File

@@ -1,7 +1,15 @@
User Guide
==========
This section of our documentation is dedicated to show you the way around pretix if you are an event organizer
wanting to use pretix to sell tickets.
.. toctree::
:maxdepth: 2
payments/index
organizers/index
events/create
events/settings
events/widget
faq
markdown

166
doc/user/markdown.rst Normal file
View File

@@ -0,0 +1,166 @@
.. _markdown-guide:
Markdown Guide
==============
What is markdown?
-----------------
In many places of your shop, like frontpage texts, product descriptions and email texts, you can use
`Markdown`_ to create links, bold text, and other formatted content. Markdown is a good middle-ground
since it is way easier to learn than languages like HTML but allows all basic formatting options required
for text in those places.
Formatting rules
----------------
Simple text formatting
""""""""""""""""""""""
To set a text in italics, you can put it in asterisks or underscores. For example,
.. code-block:: markdown
Please *really* pay your _ticket_.
will become:
Please *really* pay your _ticket_.
If you set double asterisks or underscores, the text will be printed in bold. For example,
.. code-block:: markdown
This is **important**.
will become:
This is **important**.
You can also display, for example:
.. code-block:: markdown
Input this `exactly like this`.
You will get:
Input this ``exactly like this``.
Links
"""""
You can create a link by just pasting it in, e.g.
.. code-block:: markdown
Check this on https://en.wikipedia.org
will become:
Check this on https://en.wikipedia.org
However, if you want to control the text of the link, you can put the text of the link in ``[]`` brackets and the
link target in ``()`` parentheses, like this:
.. code-block:: markdown
Check this on [Wikipedia](https://en.wikipedia.org).
This will yield:
Check this on `Wikipedia`_
All links created with pretix Markdown syntax will open in a new tab.
Lists
"""""
You can create un-numbered lists by prepending the lines with asterisks.
.. code-block:: markdown
* First item
* Second item with a text that is too long to
fit in a line
* Third item
will become:
* First item
* Second item with a text that is too long to
fit in a line
* Third item
You can also use numbers as list items
.. code-block:: markdown
1. Red
2. Green
3. Blue
to get
1. Red
2. Green
3. Blue
Headlines
"""""""""
To create a headline, prepend it with ``#`` for the main headline, ``##`` for a headline of the second level,
and so on. For example:
.. code-block:: markdown
# Headline 1
## Headline 2
### Headline 3
#### Headline 4
##### Headline 5
###### Headline 6
We do not recommend using headlines of the first level, as pretix will already set the name of your event as a level-1
headline of the page and HTML pages should have only one headline on the first level.
You can also use
.. code-block:: markdown
*****
to create a horizontal line, like the following:
.. raw:: html
<hr>
Using HTML
----------
You can also directly embed HTML code, if you want, although we recommend
using Markdown, as it enables e.g. people using text-based email clients
to get a better plain text representation of your text. Note however, that for
security reasons you can only use the following HTML elements::
a, abbr, acronym, b, br, code, div, em, h1, h2,
h3, h4, h5, h6, hr, i, li, ol, p, pre, span, strong,
table, tbody, td, thead, tr, ul
Additionally, only the following attributes are allowed on them::
<a href="…" title="…">
<abbr title="…">
<acronym title="…">
<table width="…">
<td width="…" align="…">
<div class="…">
<p class="…">
<span class="…">
All other elements and attributes will be stripped during parsing.
.. _Markdown: https://en.wikipedia.org/wiki/Markdown
.. _Wikipedia: https://en.wikipedia.org

View File

@@ -0,0 +1,43 @@
Organizer account
=================
The basis of all your operations within pretix is your organizer account. It represents an entity that is running
events, for example a company, yourself or any other institution.
Every event belongs to one organizer account and events within the same organizer account are assumed to belong together
in some sense, whereas events in different organizer accounts are completely isolated.
If you want to use the hosted pretix service, you can create an organizer account on our `Get started`_ page. Otherwise,
ask your pretix administrator for access to an organizer account.
You can find out all organizer accounts you have access to by going to your global dashboard (click on the pretix logo
in the top-left corner) and then select "Organizers" from the navigation bar on the left side. Then, choose one of the
organizer accounts presented, if there are multiple of them:
.. thumbnail:: ../../screens/organizer/list.png
:align: center
:class: screenshot
This overview shows you all event that belong to the organizer and you have access to:
.. thumbnail:: ../../screens/organizer/event_list.png
:align: center
:class: screenshot
With the "Edit" button at the top, next to the organizer account name, you can modify properties of the organizer
account such as its name and display settings for the public profile page of the organizer account:
.. thumbnail:: ../../screens/organizer/edit.png
:align: center
:class: screenshot
.. tip::
The profile page will be shown as ``https://pretix.eu/slug/`` where ``slug`` is to be replaced by the short form of
the organizer name that you entered during account creation and ``pretix.eu`` is to be replaced by your
installation's domain name if you are not using our hosted service.
Instead, you can also use a custom domain for the profile page and your events, for example
``https://tickets.example.com/`` if ``example.com`` is a domain that you own. Head to :ref:`custom_domain` to learn
more.
.. _Get started: https://pretix.eu/about/en/setup

View File

@@ -0,0 +1,54 @@
.. _custom_domain:
Using a custom domain
=====================
By default, event shops built with pretix are accessible at ``https://<domain>/<organizer>/<event>/``, where
``<domain>`` is ``pretix.eu`` if you are using our hosted service and ``<organizer>`` and ``<event>`` are the short
form versions of your organizer account name and event name, respectively.
However, you are also able to use a custom domain for your ticket shops! If you work for "Awesome Party Corporation"
and your website is ``awesomepartycorp.com``, you might want to sell your tickets at ``tickets.awesomepartycorp.com``
and with pretix, you can do this. On this page, you find out the necessary steps to take.
With the pretix.eu hosted service
---------------------------------
Step 1: DNS Configuration
#########################
Go to the website of the provider you registered your domain name with. Look for the "DNS" settings page in their
interface. Unfortunately, we can't tell you exactly how that is named and how it looks, since it is different for every
domain provider.
Use this interface to add a new subdomain record, e.g. ``tickets`` of the type ``CNAME`` (might also be called "alias").
The value of the record should be ``www.pretix.eu``.
Step 2: Wait for the DNS entry to propagate
###########################################
Submit your changes and wait a bit, it can regularly take up to three hours for DNS changes to propagate to the caches
of all DNS servers. You can try checking by accessing your new subdomain, ``http://tickets.awesomepartycorp.com``.
If DNS was changed successfully, you should see a SSL certificate error. If you ignore the error and access the page
anyways, you should get a pretix-themed error page with the headline "Unknown domain".
Step 3: Tell us
###############
Write an email to support@pretix.eu, naming your new domain and your organizer account. We will then generate a SSL
certificate for you (for free!) and configure the domain.
With a custom pretix installation
---------------------------------
If you installed pretix on a server yourself, you can also use separate domains for separate organizers.
First of all, configure your webserver or reverse proxy to pass requests to the new domain to pretix as well.
Then, go to the organizer account in pretix and click the "Edit" button. Enter the new domain in the "Custom Domain"
field, then you're done!
.. thumbnail:: ../../screens/organizer/edit_sysadmin.png
:align: center
:class: screenshot
Note that this field only shows up if you are logged in as a system administrator of your pretix installation.

View File

@@ -0,0 +1,9 @@
Organizer accounts and teams
============================
.. toctree::
:maxdepth: 2
account
teams
domain

View File

@@ -0,0 +1,65 @@
Teams
=====
We don't expect you to work on your events all by yourself and therefore, pretix comes with ways to invite your fellow
team members to access your pretix organizer account. To manage teams, click on the "Teams" link on your organizer
settings page (see above how to find it). This shows you a list of teams that should contain at least one team already:
.. thumbnail:: ../../screens/organizer/team_list.png
:align: center
:class: screenshot
If you click on a team name, you get to a page that shows you the current members of the team:
.. thumbnail:: ../../screens/organizer/team_detail.png
:align: center
:class: screenshot
You see that there is a list of pretix user accounts (i.e. email addresses), who are part of the team. To add a user to
the team, just enter their email address in the text box next to the "Add" button. If the user already has an account
in the pretix system they will instantly get access to the team. Otherwise, they will be sent an email with an invitation
link that can be used to create an account. This account will then instantly have access to the team. Users can be part
of as many teams as you want.
In the section below, you can also create access tokens for our :ref:`rest-api`. You can read more on this topic in the
section :ref:`rest-auth` of the API documentation.
Next to the team name, you again see a button called "Edit" that allows you to modify the permissions of the team.
Permissions separate into two areas:
* **Organizer permissions** allow actions on the level of an organizer account, in particular:
* Can create events To create a new event under this organizer account, users need to have this permission
* Can change teams and permissions This permission is required to perform the kind of action you are doing right now.
Anyone with this permission can assign arbitrary other permissions to themselves, so this is the most powerful
permission there is to give.
* Can change organizer settings This permission is required to perform changes to the settings of the organizer
account, e.g. its name or display settings.
* **Event permissions** allow actions on the level of an event. You can give the team access to all events of the
organizer (including future ones that are not yet created) or just a selected set of events. The specific permissions to choose from are:
* Can change event settings This permission gives access to most areas of the control panel that are not controlled
by one of the other event permissions, especially those that are related to setting up and configuring the event.
* Can change product settings This permission allows to create and modify products and objects that are closely
related to products, such as product categories, quotas, and questions.
* Can view orders This permission allows viewing the list of orders and allindividual order details, but not
changing anything about it. This also includes the various exports offered.
* Can change orders This permission allows all actions that involve changing an order, such as changing the products
in an order, marking an order as paid or refunden, importing banking data, etc. This only works properly if the
same users also have the "Can view orders" permission.
* Can view vouchers This permission allows viewing the list of vouchers including the voucher codes themselves and
their redemption status.
* Can change vouchers This permission allows to create and modify vouchers in all their details. It only works
properly if the same users also have the "Can view vouchers" permission.
.. thumbnail:: ../../screens/organizer/team_edit.png
:align: center
:class: screenshot

View File

@@ -3,7 +3,7 @@
Bank transfer
=============
To accept payments with bank transfer, you only need to fill one important field in pretix' settings: In "Bank
To accept payments with bank transfer, you only need to fill out one important field in pretix' settings: In "Bank
account details" you should specify everything one needs to know to transfer money to you, e.g. your IBAN and BIC,
the name of your bank and for international transfers, preferably also your address and the bank's address.
@@ -17,6 +17,7 @@ The easiest way to import payment data is to download a CSV file from your onlin
export of some sort. You can go to "Import bank data" in pretix to upload a new file:
.. image:: img/bank1.png
:class: screenshot
If you upload a file for the first time, pretix will not know what information is contained in which column as every
bank builds completely different CSV files. Therefore, pretix will ask you for that information. It will show you the
@@ -29,3 +30,9 @@ many orders could be processed correctly and how many could not. You can then go
transfers from your bank statement that are not yet matched to an order. Using the input field and the buttons on the
left of each transaction, you can manually enter an order code to match it to or just discard it from the list, e.g.
if the transaction is not related to the event at all.
.. tip:: If you aren't afraid of getting a bit more technical and your bank supports the HBCI/FinTS protocol (as most
German banks do), you can use `pretix-banktool`_ to fully automate this process.
.. _pretix-banktool: https://github.com/pretix/pretix-banktool

View File

@@ -1,3 +1,5 @@
.. _payment-fees:
Payment method fees
===================
@@ -18,6 +20,9 @@ might also decide to go for option one to make it easier for customers who don't
legislation might already be in place or become relevant from January 2018 the latest. This is not
legal advice. If in doubt, consult a lawyer or refrain from charging payment fees.
If you go for the first option (as you should in the EU), you can just leave the payment fee fields in pretix' settings
empty.
If you go for the second option, you can configure pretix to charge the payment method fees to your user. You can
define both an absolute fee as well as a percental fee based on the order total. If you do so, there are two
different ways in which pretix can calculate the fee. Normally, it is fine to just go with the default setting, but

View File

@@ -1,9 +1,10 @@
Accepting payments
==================
Payment settings
================
.. toctree::
:maxdepth: 2
settings
overview
fees
paypal

View File

@@ -10,25 +10,8 @@ Payment methods are built as pretix plugins. For this reason, you might first ne
If you host pretix on your own server, you might need to install a plugin first for some of the payment methods listed
on this page as well as for additional ones.
:ref:`stripe`
Stripe is a US-based company that offers you an easy way to accept credit card payments from all over the world.
To accept payments with Stripe, you need to have a Stripe merchant account that is easy to create. Click on the link
above to get more details about the Stripe integration into pretix.
:ref:`paypal`
If you want to accept online payments via PayPal, you can do so using pretix. You will need a PayPal merchant
account and it is a little bit complicated to obtain the required technical details, but we've got you covered.
Click on the link above to learn more.
:ref:`banktransfer`
Classical IBAN wire transfers are a common payment method in central Europe that has the large benefit that it
often does not cause any additional fees. However, it requires you to invest some more effort as you need to
check your bank account for incoming payments regularly. We provide some tools to make this easier for you.
SEPA debit
In some Europen countries, a very popular online payment method is SEPA direct debit. If you want to offer this
option in your pretix ticket shop, we provide a convenient plugin that allows users to enter their SEPA bank
account details and issue a SEPA mandate. You will then need to regularly download a SEPA XML file from pretix
and upload it to your bank's interface to actually perform the debits.
To get an overview of the officially supported payment methods and their pros and cons, head to the `pretix website`_.
On these pages, you get more information on how to configure :ref:`stripe`, :ref:`paypal`, and :ref:`banktransfer`.
.. _pretix website: https://pretix.eu/about/en/payments

View File

@@ -8,41 +8,49 @@ PayPal account, you can create one on `paypal.com`_.
If you look into pretix' settings, you are required to fill in two keys:
.. image:: img/paypal_pretix.png
:class: screenshot
Unfortunately, it is not straightforward how to get those keys from PayPal's website. In order to do so, you
need to go to `developer.paypal.com`_ to link the account to your pretix event.
Click on "Log In" in the top-right corner and log in with your PayPal account.
.. image:: img/paypal2.png
:class: screenshot
Then, click on "Dashboard" in the top-right corner.
.. image:: img/paypal3.png
:class: screenshot
In the dashboard, scroll down until you see the headline "REST API Apps". Click "Create App".
.. image:: img/paypal4.png
:class: screenshot
Enter any name for the application that helps you to identify it later. Then confirm with "Create App".
.. image:: img/paypal5.png
:class: screenshot
On the next page, before you do anything else, switch the mode on the right to "Live" to get the correct keys.
Then, copy the "Client ID" and the "Secret" and enter them into the appropriate fields in the payment settings in
pretix.
.. image:: img/paypal6.png
:class: screenshot
Finally, we need to create a webhook. The webhook tells PayPal to notify pretix e.g. if a payment gets cancelled so
pretix can cancel the ticket as well. If you have multiple events connected to your PayPal account, you need multiple
webhooks. To create one, scroll a bit down and click "Add Webhook".
.. image:: img/paypal7.png
:class: screenshot
Then, enter the webhook URL that you find on the pretix settings page. It should look similar to the one in the
screenshot but contain your event name. Tick the box "All events" and save.
.. image:: img/paypal8.png
:class: screenshot
That's it, you are ready to go!

View File

@@ -0,0 +1,65 @@
General settings
================
At "Settings" → "Pages", you can configure every aspect related to the payments you want to accept. The upper part
of the page shows a number of general settings that affect all payment methods:
.. thumbnail:: ../../screens/event/settings_payment.png
:align: center
:class: screenshot
In particular, these are:
Payment term in days
If a order has been created, it is supposed to be paid within this number of days. Of course, some payment mehtods
(like credit card) succeed immediately in most cases, but others don't (like bank transfer) and even credit card
payments might fail and you might want to give the customer a chance to try another credit card before losing their
ticket. Therefore, we recommend setting a few days here. If you are accepting bank transfers, we wouldn't recommend
less than 10 days.
Last date of payments
There is probably no use for payments received after your event, so you can set a date that the payment deadline of
a new order will never exceed. This has precendence over the number of days configured above, so if I create an order
two days before the configured last date of payments, my payment term will only be two days, not ten. If you have
payment methods that always require some time (like bank transfer), you will later be able to selectively disable them
once the event comes closer.
Only end payment terms on weekdays
If you check this box, the payment term calculated by the number of days configured above will never end on a Saturday
or a Sunday. If it technically would do so, the term is extended to the next Monday. Note that this currently does not
take into account national or bank holidays in your country.
Automatically expire unpaid orders
If you check this box, orders will automatically go into "expired" state if the payment term is over and no payment
has been received. This means that the tickets will no longer be reserved for the customer and someone else can buy
them from the shop again. If you do not check this box, tickets do not become available again automatically, but you
can mark orders as expired manually.
Accept late payments
If you check this box, incoming payments will accepted even if the order is in "expired" state -- as long as there
still is sufficient quota available and the last date of payments is not yet over. We recommend to check this in most
cases.
Tax rule for payment fees
If you pass on the payment method fees to your customers, you will most likely also need to pay sales tax on those
fees. Here, you can configure the tax rate. Read :ref:`taxes` for more information.
Below, you can configure the details of the various payment methods. You can find information on their different settings
on the next pages of this documentation, but there are a few things most of them have in common:
Enable payment method
Check this box to allow customers to use this method. At least one method needs to be active to process non-free orders.
Additional fee (absolute and percentage), Calculate the fee from the total value including the fee
These fields allow you to pass fees on to your customers instead of paying them yourselves. Read :ref:`payment-fees`
for documentation on how this behaves.
Available until
This allows you to set a date at which this payment method will automatically become disabled. This is useful if you
want people to be able to pay by card on the day before your event, but not by bank transfer, because it would not
arrive in time.
Text on invoices
If you are using pretix' invoicing feature, this is a text that will be printed on every invoice for an order that
uses this payment method. You could use this to tell the accounting department of the invoice receiver that the payment
has already been received online or that it should be performed via bank transfer.

View File

@@ -9,6 +9,7 @@ Dashboard. As you can see in the following screenshot, you will be presented wit
and one for live payments. In each set, there is a secret and a publishable keys.
.. image:: img/stripe1.png
:class: screenshot
Choose one of the two sets and copy the two keys to the appropriate fields in pretix' settings. To perform actual
payments, you will need to use the live keys, but you can use the test keys to test the payment flow before you go live.
@@ -21,6 +22,7 @@ that you are currently on. Then, click "Add endpoint" and enter the URL that you
configuration in pretix' settings.
.. image:: img/stripe2.png
:class: screenshot
Again, you can choose between live mode and test mode here.

View File

@@ -1,44 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="149.59399"
height="149.59399"
id="svg2"
viewBox="0 0 149.59399 149.59399"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="icon_draft.svg">
id="svg2"
height="159.56693"
width="159.56693">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="141.14985"
inkscape:cy="82.686886"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1914"
inkscape:window-height="1039"
inkscape:window-x="1920"
inkscape:window-y="18"
inkscape:window-maximized="0"
fit-margin-top="20"
fit-margin-left="20"
fit-margin-right="20"
fit-margin-bottom="20" />
<metadata
id="metadata7">
<rdf:RDF>
@@ -52,15 +25,12 @@
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-257.78125,-548.74975)">
transform="translate(-257.78125,-548.74975)"
id="layer1">
<path
style="color:#000000;fill:#3b1c4a;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 277.78125,568.74975 0,34.09383 c 11.37842,0 20.613,9.28198 20.613,20.7188 0,11.4368 -9.23458,20.68754 -20.613,20.68754 l 0,34.09383 68.33691,0 0,-9.50002 2.98469,0 0,9.50002 38.2724,0 0,-34.09383 c -0.0104,2e-5 -0.0207,0 -0.031,0 -11.37841,0 -20.613,-9.25074 -20.613,-20.68754 0,-11.43682 9.23459,-20.7188 20.613,-20.7188 0.0105,0 0.0207,-2e-5 0.031,0 l 0,-34.09383 -38.2724,0 0,9.09377 -2.98469,0 0,-9.09377 z m 68.33691,16.09379 2.98469,0 0,14.00003 -2.98469,0 z m 0,21.00004 2.98469,0 0,14.00004 -2.98469,0 z m -24.40604,3.68751 c 4.02516,3e-5 7.02244,1.10354 8.98515,3.34376 1.96268,2.20685 2.92251,5.27326 2.92251,9.21877 l 0,3.87501 c 0,3.94554 -0.95983,7.04102 -2.92251,9.28127 -1.96271,2.20683 -4.95999,3.31251 -8.98515,3.31251 -0.5988,0 -1.31361,-0.0268 -2.14524,-0.0937 -0.83167,-0.0334 -1.71126,-0.11626 -2.64269,-0.25 l 0,8.87502 c -1e-5,0.26748 -0.11132,0.48687 -0.31091,0.6875 -0.19961,0.20061 -0.41788,0.31249 -0.68399,0.3125 l -4.60139,0 c -0.26614,-1e-5 -0.4844,-0.11189 -0.684,-0.3125 -0.19959,-0.20063 -0.3109,-0.42002 -0.3109,-0.6875 l 0,-34.90633 c 0,-0.36777 0.0824,-0.64529 0.24872,-0.8125 0.16633,-0.20059 0.52265,-0.39529 1.08817,-0.5625 1.5635,-0.40121 3.24248,-0.70343 5.00557,-0.93751 1.76309,-0.23403 3.43988,-0.34372 5.03666,-0.34375 z m 0,5.40627 c -0.89819,2e-5 -1.80453,0.0269 -2.73596,0.0937 -0.89819,0.0669 -1.58626,0.14971 -2.05197,0.25 l 0,17.50004 c 0.69857,0.10031 1.49359,0.18313 2.42505,0.25 0.9647,0.0669 1.76408,0.12501 2.36288,0.125 1.06449,10e-6 1.94409,-0.19469 2.64269,-0.5625 0.69857,-0.36781 1.24859,-0.86471 1.6478,-1.50001 0.39917,-0.63529 0.67527,-1.38064 0.80835,-2.25 0.16631,-0.86934 0.24871,-1.83846 0.24873,-2.87501 l 0,-3.87501 c -2e-5,-1.03651 -0.0824,-1.97438 -0.24873,-2.84375 -0.13308,-0.86934 -0.40918,-1.61469 -0.80835,-2.25001 -0.39921,-0.63527 -0.94923,-1.13218 -1.6478,-1.5 -0.6986,-0.36778 -1.5782,-0.56248 -2.64269,-0.5625 z m 24.40604,11.90627 2.98469,0 0,14.00003 -2.98469,0 z m 0,21.00005 2.98469,0 0,14.00003 -2.98469,0 z"
id="rect3888"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccccccccssscccccccccccccccccccsscscccccccssccccccccccccccccccccccccccccc" />
transform="matrix(0.93749999,0,0,0.93749999,257.78125,548.74975)"
d="M 21.333984 21.333984 L 21.333984 57.699219 C 33.470966 57.699219 43.320312 67.601506 43.320312 79.800781 C 43.320312 92.000035 33.470966 101.86719 21.333984 101.86719 L 21.333984 138.23438 L 94.226562 138.23438 L 94.226562 128.09961 L 97.410156 128.09961 L 97.410156 138.23438 L 138.23438 138.23438 L 138.23438 101.86719 C 138.22328 101.86721 138.21216 101.86719 138.20117 101.86719 C 126.0642 101.86719 116.21289 92.000035 116.21289 79.800781 C 116.21289 67.601506 126.0642 57.699219 138.20117 57.699219 C 138.21237 57.699219 138.22339 57.699197 138.23438 57.699219 L 138.23438 21.333984 L 97.410156 21.333984 L 97.410156 31.033203 L 94.226562 31.033203 L 94.226562 21.333984 L 21.333984 21.333984 z M 94.226562 38.5 L 97.410156 38.5 L 97.410156 53.433594 L 94.226562 53.433594 L 94.226562 38.5 z M 94.226562 60.900391 L 97.410156 60.900391 L 97.410156 75.833984 L 94.226562 75.833984 L 94.226562 60.900391 z M 67.044922 64.027344 C 76.359333 64.027344 82.662109 68.991742 82.662109 79.533203 C 82.662109 89.014942 77.139434 95.039062 69.386719 95.039062 C 67.490377 95.039062 65.927327 94.814901 65.146484 94.591797 L 65.146484 106.64062 L 54.550781 106.64062 L 54.550781 66.314453 C 57.395304 64.97585 61.244324 64.027344 67.044922 64.027344 z M 66.990234 70.216797 C 66.209392 70.216797 65.648458 70.328766 65.146484 70.496094 L 65.146484 88.568359 C 65.536906 88.735677 66.097199 88.845703 66.822266 88.845703 C 70.61497 88.845703 72.175781 85.725087 72.175781 79.589844 C 72.175781 73.287273 70.838704 70.216797 66.990234 70.216797 z M 94.226562 83.300781 L 97.410156 83.300781 L 97.410156 98.234375 L 94.226562 98.234375 L 94.226562 83.300781 z M 94.226562 105.69922 L 97.410156 105.69922 L 97.410156 120.63281 L 94.226562 120.63281 L 94.226562 105.69922 z "
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#3b1c4a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672;marker:none;enable-background:accumulate" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -6,7 +6,7 @@ localecompile:
localegen:
./manage.py makemessages --all --ignore "pretix/helpers/*"
./manage.py makemessages --all -d djangojs --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "build/*"
./manage.py makemessages --all -d djangojs --ignore "pretix/helpers/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static/jsi18n/*" --ignore "pretix/static.dist/*" --ignore "data/*" --ignore "build/*"
staticfiles: jsi18n
./manage.py collectstatic --noinput

View File

@@ -47,14 +47,15 @@ question = Question.objects.create(
event=event, question='Age',
type=Question.TYPE_NUMBER, required=False
)
tr19 = event.tax_rules.create(rate=19)
item_ticket = Item.objects.create(
event=event, category=cat_tickets, name='Ticket',
default_price=23, tax_rate=19, admission=True
default_price=23, tax_rule=tr19, admission=True
)
item_ticket.questions.add(question)
item_shirt = Item.objects.create(
event=event, category=cat_merch, name='T-Shirt',
default_price=15, tax_rate=19
default_price=15, tax_rule=tr19
)
var_s = ItemVariation.objects.create(item=item_shirt, value='S')
var_m = ItemVariation.objects.create(item=item_shirt, value='M')

View File

@@ -1 +1 @@
__version__ = "1.5.1"
__version__ = "1.10.1"

View File

@@ -1,3 +1,8 @@
import time
from django.conf import settings
from django.contrib.auth import logout
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import SAFE_METHODS, BasePermission
from pretix.base.models import Event
@@ -9,10 +14,27 @@ class EventPermission(BasePermission):
def has_permission(self, request, view):
if not request.user.is_authenticated and not isinstance(request.auth, TeamAPIToken):
if request.method in SAFE_METHODS and request.path.startswith('/api/v1/docs/'):
return True
return False
if request.method not in SAFE_METHODS and hasattr(view, 'write_permission'):
required_permission = getattr(view, 'write_permission')
elif hasattr(view, 'permission'):
required_permission = getattr(view, 'permission')
else:
required_permission = None
if request.user.is_authenticated:
# If this logic is updated, make sure to also update the logic in pretix/control/middleware.py
if not settings.PRETIX_LONG_SESSIONS or not request.session.get('pretix_auth_long_session', False):
last_used = request.session.get('pretix_auth_last_used', time.time())
if time.time() - request.session.get('pretix_auth_login_time', time.time()) > settings.PRETIX_SESSION_TIMEOUT_ABSOLUTE:
logout(request)
request.session['pretix_auth_login_time'] = 0
return False
if time.time() - last_used > settings.PRETIX_SESSION_TIMEOUT_RELATIVE:
return False
request.session['pretix_auth_last_used'] = int(time.time())
perm_holder = (request.auth if isinstance(request.auth, TeamAPIToken)
else request.user)
if 'event' in request.resolver_match.kwargs and 'organizer' in request.resolver_match.kwargs:
@@ -25,9 +47,8 @@ class EventPermission(BasePermission):
request.organizer = request.event.organizer
request.eventpermset = perm_holder.get_event_permission_set(request.organizer, request.event)
if hasattr(view, 'permission'):
if view.permission and view.permission not in request.eventpermset:
return False
if required_permission and required_permission not in request.eventpermset:
return False
elif 'organizer' in request.resolver_match.kwargs:
request.organizer = Organizer.objects.filter(
@@ -37,7 +58,21 @@ class EventPermission(BasePermission):
return False
request.orgapermset = perm_holder.get_organizer_permission_set(request.organizer)
if hasattr(view, 'permission'):
if view.permission and view.permission not in request.orgapermset:
return False
if required_permission and required_permission not in request.orgapermset:
return False
return True
def permission_required(required_permission):
def decorator(function):
def wrapper(self, request, *args, **kw):
if 'event' in request.resolver_match.kwargs and 'organizer' in request.resolver_match.kwargs:
if required_permission and required_permission not in request.eventpermset:
raise PermissionDenied('You do not have permission to perform this operation.')
elif 'organizer' in request.resolver_match.kwargs:
if required_permission and required_permission not in request.orgapermset:
raise PermissionDenied('You do not have permission to perform this operation.')
return function(self, request, *args, **kw)
return wrapper
return decorator

View File

@@ -0,0 +1,16 @@
from rest_framework.response import Response
from rest_framework.views import exception_handler, status
from pretix.base.services.locking import LockTimeoutException
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if isinstance(exc, LockTimeoutException):
response = Response(
{'detail': 'The server was too busy to process your request. Please try again.'},
status=status.HTTP_409_CONFLICT
)
return response

View File

@@ -0,0 +1,37 @@
from django.utils.translation import ugettext as _
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from pretix.api.serializers.i18n import I18nAwareModelSerializer
from pretix.base.models import CheckinList
class CheckinListSerializer(I18nAwareModelSerializer):
checkin_count = serializers.IntegerField(read_only=True)
position_count = serializers.IntegerField(read_only=True)
class Meta:
model = CheckinList
fields = ('id', 'name', 'all_products', 'limit_products', 'subevent', 'checkin_count', 'position_count')
def validate(self, data):
data = super().validate(data)
event = self.context['event']
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
full_data.update(data)
for item in full_data.get('limit_products'):
if event != item.event:
raise ValidationError(_('One or more items do not belong to this event.'))
if event.has_subevents:
if not full_data.get('subevent'):
raise ValidationError(_('Subevent cannot be null for event series.'))
if event != full_data.get('subevent').event:
raise ValidationError(_('The subevent does not belong to this event.'))
else:
if full_data.get('subevent'):
raise ValidationError(_('The subevent does not belong to this event.'))
return data

View File

@@ -1,10 +1,55 @@
from django_countries.serializers import CountryFieldMixin
from rest_framework.fields import Field
from pretix.api.serializers.i18n import I18nAwareModelSerializer
from pretix.base.models import Event
from pretix.base.models import Event, TaxRule
from pretix.base.models.event import SubEvent
from pretix.base.models.items import SubEventItem, SubEventItemVariation
class MetaDataField(Field):
def to_representation(self, value):
return {
v.property.name: v.value for v in value.meta_values.all()
}
class EventSerializer(I18nAwareModelSerializer):
meta_data = MetaDataField(source='*')
class Meta:
model = Event
fields = ('name', 'slug', 'live', 'currency', 'date_from',
'date_to', 'date_admission', 'is_public', 'presale_start',
'presale_end', 'location')
'presale_end', 'location', 'has_subevents', 'meta_data')
class SubEventItemSerializer(I18nAwareModelSerializer):
class Meta:
model = SubEventItem
fields = ('item', 'price')
class SubEventItemVariationSerializer(I18nAwareModelSerializer):
class Meta:
model = SubEventItemVariation
fields = ('variation', 'price')
class SubEventSerializer(I18nAwareModelSerializer):
item_price_overrides = SubEventItemSerializer(source='subeventitem_set', many=True)
variation_price_overrides = SubEventItemVariationSerializer(source='subeventitemvariation_set', many=True)
meta_data = MetaDataField(source='*')
class Meta:
model = SubEvent
fields = ('id', 'name', 'date_from', 'date_to', 'active', 'date_admission',
'presale_start', 'presale_end', 'location',
'item_price_overrides', 'variation_price_overrides', 'meta_data')
class TaxRuleSerializer(CountryFieldMixin, I18nAwareModelSerializer):
class Meta:
model = TaxRule
fields = ('id', 'name', 'rate', 'price_includes_tax', 'eu_reverse_charge', 'home_country')

View File

@@ -1,5 +1,7 @@
from django.conf import settings
from i18nfield.fields import I18nCharField, I18nTextField
from i18nfield.strings import LazyI18nString
from rest_framework.exceptions import ValidationError
from rest_framework.fields import Field
from rest_framework.serializers import ModelSerializer
@@ -22,6 +24,16 @@ class I18nField(Field):
settings.LANGUAGE_CODE: str(value.data)
}
def to_internal_value(self, data):
if isinstance(data, str):
return LazyI18nString(data)
elif isinstance(data, dict):
if any([k not in dict(settings.LANGUAGES) for k in data.keys()]):
raise ValidationError('Invalid languages included.')
return LazyI18nString(data)
else:
raise ValidationError('Invalid data type.')
class I18nAwareModelSerializer(ModelSerializer):
pass

View File

@@ -1,3 +1,5 @@
from decimal import Decimal
from rest_framework import serializers
from pretix.api.serializers.i18n import I18nAwareModelSerializer
@@ -21,17 +23,26 @@ class InlineItemAddOnSerializer(serializers.ModelSerializer):
'position')
class ItemTaxRateField(serializers.Field):
def to_representation(self, i):
if i.tax_rule:
return str(Decimal(i.tax_rule.rate))
else:
return str(Decimal('0.00'))
class ItemSerializer(I18nAwareModelSerializer):
addons = InlineItemAddOnSerializer(many=True)
variations = InlineItemVariationSerializer(many=True)
tax_rate = ItemTaxRateField(source='*', read_only=True)
class Meta:
model = Item
fields = ('id', 'category', 'name', 'active', 'description',
'default_price', 'free_price', 'tax_rate', 'admission',
'default_price', 'free_price', 'tax_rate', 'tax_rule', 'admission',
'position', 'picture', 'available_from', 'available_until',
'require_voucher', 'hide_without_voucher', 'allow_cancel',
'min_per_order', 'max_per_order', 'has_variations',
'min_per_order', 'max_per_order', 'checkin_attention', 'has_variations',
'variations', 'addons')
@@ -61,4 +72,17 @@ class QuotaSerializer(I18nAwareModelSerializer):
class Meta:
model = Quota
fields = ('id', 'name', 'size', 'items', 'variations')
fields = ('id', 'name', 'size', 'items', 'variations', 'subevent')
def validate(self, data):
data = super().validate(data)
event = self.context['event']
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
full_data.update(data)
Quota.clean_variations(full_data.get('items'), full_data.get('variations'))
Quota.clean_items(event, full_data.get('items'), full_data.get('variations'))
Quota.clean_subevent(event, full_data.get('subevent'))
return data

View File

@@ -1,3 +1,5 @@
from decimal import Decimal
from rest_framework import serializers
from rest_framework.reverse import reverse
@@ -6,13 +8,25 @@ from pretix.base.models import (
Checkin, Invoice, InvoiceAddress, InvoiceLine, Order, OrderPosition,
QuestionAnswer,
)
from pretix.base.models.orders import OrderFee
from pretix.base.signals import register_ticket_outputs
class CompatibleCountryField(serializers.Field):
def to_representation(self, instance: InvoiceAddress):
if instance.country:
return str(instance.country)
else:
return instance.country_old
class InvoiceAdddressSerializer(I18nAwareModelSerializer):
country = CompatibleCountryField(source='*')
class Meta:
model = InvoiceAddress
fields = ('last_modified', 'company', 'name', 'street', 'zipcode', 'city', 'country', 'vat_id')
fields = ('last_modified', 'is_business', 'company', 'name', 'street', 'zipcode', 'city', 'country', 'vat_id',
'vat_id_validated', 'internal_reference')
class AnswerSerializer(I18nAwareModelSerializer):
@@ -86,25 +100,48 @@ class OrderPositionSerializer(I18nAwareModelSerializer):
class Meta:
model = OrderPosition
fields = ('id', 'order', 'positionid', 'item', 'variation', 'price', 'attendee_name', 'attendee_email',
'voucher', 'tax_rate', 'tax_value', 'secret', 'addon_to', 'checkins', 'downloads', 'answers')
'voucher', 'tax_rate', 'tax_value', 'secret', 'addon_to', 'subevent', 'checkins', 'downloads',
'answers', 'tax_rule')
class OrderFeeSerializer(I18nAwareModelSerializer):
class Meta:
model = OrderFee
fields = ('fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule')
class PaymentFeeLegacyField(serializers.Field):
def __init__(self, *args, **kwargs):
self.attr = kwargs.pop('attribute')
super().__init__(*args, **kwargs)
def to_representation(self, instance: Order):
return str(
sum([getattr(f, self.attr) for f in instance.fees.all() if f.fee_type == OrderFee.FEE_TYPE_PAYMENT],
Decimal('0.00'))
)
class OrderSerializer(I18nAwareModelSerializer):
invoice_address = InvoiceAdddressSerializer()
positions = OrderPositionSerializer(many=True)
fees = OrderFeeSerializer(many=True)
downloads = OrderDownloadsField(source='*')
payment_fee = PaymentFeeLegacyField(source='*', attribute='value') # TODO: Remove in 1.9
payment_fee_tax_rate = PaymentFeeLegacyField(source='*', attribute='tax_rate') # TODO: Remove in 1.9
payment_fee_tax_value = PaymentFeeLegacyField(source='*', attribute='tax_value') # TODO: Remove in 1.9
class Meta:
model = Order
fields = ('code', 'status', 'secret', 'email', 'locale', 'datetime', 'expires', 'payment_date',
'payment_provider', 'payment_fee', 'payment_fee_tax_rate', 'payment_fee_tax_value',
'total', 'comment', 'invoice_address', 'positions', 'downloads')
'payment_provider', 'fees', 'total', 'comment', 'invoice_address', 'positions', 'downloads',
'payment_fee', 'payment_fee_tax_rate', 'payment_fee_tax_value')
class InlineInvoiceLineSerializer(I18nAwareModelSerializer):
class Meta:
model = InvoiceLine
fields = ('description', 'gross_value', 'tax_value', 'tax_rate')
fields = ('description', 'gross_value', 'tax_value', 'tax_rate', 'tax_name')
class InvoiceSerializer(I18nAwareModelSerializer):
@@ -114,5 +151,7 @@ class InvoiceSerializer(I18nAwareModelSerializer):
class Meta:
model = Invoice
fields = ('order', 'invoice_no', 'is_cancellation', 'invoice_from', 'invoice_to', 'date', 'refers', 'locale',
'introductory_text', 'additional_text', 'payment_provider_text', 'footer_text', 'lines')
fields = ('order', 'number', 'is_cancellation', 'invoice_from', 'invoice_to', 'date', 'refers', 'locale',
'introductory_text', 'additional_text', 'payment_provider_text', 'footer_text', 'lines',
'foreign_currency_display', 'foreign_currency_rate', 'foreign_currency_rate_date',
'internal_reference')

View File

@@ -7,4 +7,37 @@ class VoucherSerializer(I18nAwareModelSerializer):
model = Voucher
fields = ('id', 'code', 'max_usages', 'redeemed', 'valid_until', 'block_quota',
'allow_ignore_quota', 'price_mode', 'value', 'item', 'variation', 'quota',
'tag', 'comment')
'tag', 'comment', 'subevent')
read_only_fields = ('id', 'redeemed')
def validate(self, data):
data = super().validate(data)
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
full_data.update(data)
Voucher.clean_item_properties(
full_data, self.context.get('event'),
full_data.get('quota'), full_data.get('item'), full_data.get('variation')
)
Voucher.clean_subevent(
full_data, self.context.get('event')
)
Voucher.clean_max_usages(full_data, self.instance.redeemed if self.instance else 0)
check_quota = Voucher.clean_quota_needs_checking(
full_data, self.instance,
item_changed=self.instance and (
full_data.get('item') != self.instance.item or
full_data.get('variation') != self.instance.variation or
full_data.get('quota') != self.instance.quota
),
creating=not self.instance
)
if check_quota:
Voucher.clean_quota_check(
full_data, 1, self.instance, self.context.get('event'),
full_data.get('quota'), full_data.get('item'), full_data.get('variation')
)
Voucher.clean_voucher_code(full_data, self.context.get('event'), self.instance.pk if self.instance else None)
return data

View File

@@ -6,4 +6,4 @@ class WaitingListSerializer(I18nAwareModelSerializer):
class Meta:
model = WaitingListEntry
fields = ('id', 'created', 'email', 'voucher', 'item', 'variation', 'locale')
fields = ('id', 'created', 'email', 'voucher', 'item', 'variation', 'locale', 'subevent')

View File

@@ -1,19 +0,0 @@
{% extends "rest_framework/base.html" %}
{% load staticfiles %}
{% load compress %}
{% block bootstrap_theme %}
{% compress css %}
<link rel="stylesheet" type="text/x-scss" href="{% static "rest_framework/scss/main.scss" %}" />
{% endcompress %}
{% endblock %}
{% block branding %}
<a class="navbar-brand" href="/api/v1/">pretix REST API</a>
{% endblock %}
{% block description %}
<div class="alert alert-info alert-docs-link">
<a href="https://docs.pretix.eu/en/latest/api/index.html">
You can find documentation on our REST API on docs.pretix.eu.
</a>
</div>
{% endblock %}

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