Compare commits

..

69 Commits

Author SHA1 Message Date
Raphael Michel
1226de8d2f Fix isort 2024-07-26 16:43:12 +02:00
Raphael Michel
c0d7630eae Fix naming 2024-07-25 13:19:00 +02:00
Raphael Michel
8fe136b374 API: Allow to filter enabled webhooks (Z#23160605) 2024-07-25 10:48:56 +02:00
dependabot[bot]
f055a598ce Bump django-compressor from 4.5 to 4.5.1 (#4330)
Bumps [django-compressor](https://github.com/django-compressor/django-compressor) from 4.5 to 4.5.1.
- [Changelog](https://github.com/django-compressor/django-compressor/blob/develop/docs/changelog.txt)
- [Commits](https://github.com/django-compressor/django-compressor/compare/4.5...4.5.1)

---
updated-dependencies:
- dependency-name: django-compressor
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-24 14:38:54 +02:00
Raphael Michel
9138464896 Translations: Delete Abron 2024-07-24 14:38:38 +02:00
Martin Gross
479f51a84c Apply suggestions from code review
Co-authored-by: robbi5 <richt@rami.io>
Co-authored-by: Felix Rindt <felix@rindt.me>
2024-07-24 14:23:12 +02:00
Martin Gross
a3ac54d419 Docs: Add documentation on GetYourGuide 2024-07-24 14:23:12 +02:00
Raphael Michel
b2841e5c61 SSO Providers: Use redacted field for secret key 2024-07-23 16:26:37 +02:00
dependabot[bot]
3009f50d51 Update pytest requirement from ==8.2.* to ==8.3.* (#4324)
Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.2.0.dev0...8.3.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 15:54:51 +02:00
Gero Nagel
ff3a49ab2a Docs: Remove redundant package dependency (#4327)
* remove naming python3-dev twice

* Revert "ListExporter: Do not create excel sheets with more than 30 characters"

This reverts commit ca3802da90.

* Revert "remove naming python3-dev twice"

This reverts commit 7adf2d65e89e4afd82a198e5c0a7416ed8d44b3b.

* Revert "Revert "ListExporter: Do not create excel sheets with more than 30 characters""

This reverts commit d289dc0d1dbf5831452799995a2264642c284c5d.

* delete naming pyhton3-dev twice
2024-07-23 15:54:37 +02:00
Raphael Michel
19f3fbc7e8 Order data export: Include ID of parent position of add-ons 2024-07-23 15:52:55 +02:00
dependabot[bot]
bb9b9ac9aa Update pypdf requirement from ==4.2.* to ==4.3.* (#4307)
Updates the requirements on [pypdf](https://github.com/py-pdf/pypdf) to permit the latest version.
- [Release notes](https://github.com/py-pdf/pypdf/releases)
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md)
- [Commits](https://github.com/py-pdf/pypdf/compare/4.2.0...4.3.0)

---
updated-dependencies:
- dependency-name: pypdf
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Raphael Michel <michel@rami.io>
2024-07-23 13:48:11 +02:00
dependabot[bot]
d7f6befb5b Bump @babel/preset-env from 7.24.6 to 7.24.7 in /src/pretix/static/npm_dir (#4281)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.24.6 to 7.24.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 13:30:58 +02:00
dependabot[bot]
2287be2009 Update sphinx requirement from ==7.3.* to ==7.4.* (#4306)
Updates the requirements on [sphinx](https://github.com/sphinx-doc/sphinx) to permit the latest version.
- [Release notes](https://github.com/sphinx-doc/sphinx/releases)
- [Changelog](https://github.com/sphinx-doc/sphinx/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinx/compare/v7.3.0...v7.4.4)

---
updated-dependencies:
- dependency-name: sphinx
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 13:29:18 +02:00
dependabot[bot]
0480b6873d Update sentry-sdk requirement from ==2.5.* to ==2.10.* (#4305)
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.5.0...2.10.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-23 13:29:11 +02:00
dependabot[bot]
711f08c9e8 Update python-bidi requirement from ==0.4.* to ==0.5.* (#4325)
* Update python-bidi requirement from ==0.4.* to ==0.5.*

Updates the requirements on [python-bidi](https://github.com/MeirKriheli/python-bidi) to permit the latest version.
- [Release notes](https://github.com/MeirKriheli/python-bidi/releases)
- [Changelog](https://github.com/MeirKriheli/python-bidi/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/MeirKriheli/python-bidi/compare/v0.4.0...v0.5.0)

---
updated-dependencies:
- dependency-name: python-bidi
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update import

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Raphael Michel <michel@rami.io>
2024-07-23 13:27:15 +02:00
Alberto Ortega
d18914fcca Translations: Update Spanish
Currently translated at 88.5% (5041 of 5690 strings)

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

powered by weblate
2024-07-23 13:27:07 +02:00
Raphael Michel
2411144262 Ignore a deprecation warning in pypdf 2024-07-23 13:06:00 +02:00
test\"img src=x onerror=prompt(document.cookie)
2f02d35a52 Translations: Add Abron 2024-07-23 11:56:05 +02:00
Richard Schreiber
71e82fda81 Auto-fill questions from invoice address (Z#23143497) (#4303)
* Match invoice address to questions by id, placeholder and label

* make label-text extraction more robust

* match actual label as well
2024-07-23 11:54:10 +02:00
Raphael Michel
ca3802da90 ListExporter: Do not create excel sheets with more than 30 characters 2024-07-23 09:35:34 +02:00
JnnisCanis
2c68b9e895 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5690 of 5690 strings)

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

powered by weblate
2024-07-22 10:07:01 +02:00
bokor-rami-io
01092498f4 Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5690 of 5690 strings)

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

powered by weblate
2024-07-22 10:07:01 +02:00
Raphael Michel
fd841ed66d Translations: Update German (informal) (de_Informal)
Currently translated at 100.0% (5690 of 5690 strings)

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

powered by weblate
2024-07-22 10:07:01 +02:00
Raphael Michel
04cbccb536 Translations: Update German
Currently translated at 100.0% (5690 of 5690 strings)

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

powered by weblate
2024-07-22 10:07:01 +02:00
Raphael Michel
b8ea93de1e Fix ticket_download_require_validated_email after sales channel change 2024-07-22 09:38:35 +02:00
Richard Schreiber
c49f42301c Fix file-type check for product image 2024-07-19 12:44:49 +02:00
Reece Needham
2ae0a16e67 Translations: Update Spanish
Currently translated at 100.0% (231 of 231 strings)

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

powered by weblate
2024-07-19 11:52:27 +02:00
Reece Needham
6b06fdf822 Translations: Update Spanish
Currently translated at 88.6% (5045 of 5690 strings)

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

powered by weblate
2024-07-19 11:52:27 +02:00
Reece Needham
ea3f4e5f62 Translations: Update Spanish
Currently translated at 100.0% (231 of 231 strings)

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

powered by weblate
2024-07-19 11:52:27 +02:00
Reece Needham
d71c23f7e0 Translations: Update Spanish
Currently translated at 87.5% (4983 of 5690 strings)

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

powered by weblate
2024-07-19 11:52:27 +02:00
Nikolai
5ed7b0032b Translations: Update Danish
Currently translated at 49.4% (2815 of 5690 strings)

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

powered by weblate
2024-07-19 11:52:27 +02:00
Martin Gross
a77f2d01a7 CartManager: Allow to explicitly set an order expiration 2024-07-19 11:38:36 +02:00
Raphael Michel
ca4f511cde Voucher import: Fix subevent column 2024-07-19 10:56:17 +02:00
Raphael Michel
83b1c2ea7e Do not take "optional" as part of error message label (#4309) 2024-07-18 14:57:25 +02:00
Richard Schreiber
c91eb2e20d Set cursor to not-allowed on labels for disabled checkboxes 2024-07-18 11:54:43 +02:00
Richard Schreiber
bfb480a288 UI: in plugin-list only show border-top when necessary (#4314) 2024-07-18 11:43:24 +02:00
Richard Schreiber
22e2143623 API: add api_meta to order 2024-07-18 10:01:03 +02:00
Raphael Michel
9e61f7f978 API: Fix admin permission issue in subevent endpoint 2024-07-18 09:44:30 +02:00
Raphael Michel
092de9e3c4 Add webhook for pretix.event.order.deleted (Z#23159520) (#4310) 2024-07-17 17:15:35 +02:00
Richard Schreiber
f0822d3c27 Docs: add help for HTTP-COOP: same-origin, widget and Paypal (#4311)
* Docs: add help for HTTP-COOP, widget and Paypal

* fix typo Paypal => PayPal

Co-authored-by: Raphael Michel <michel@rami.io>

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2024-07-17 16:12:17 +02:00
dependabot[bot]
6fc47ca3b6 Update django-hijack requirement from ==3.5.* to ==3.6.* (#4290)
Updates the requirements on [django-hijack](https://github.com/django-hijack/django-hijack) to permit the latest version.
- [Release notes](https://github.com/django-hijack/django-hijack/releases)
- [Changelog](https://github.com/django-hijack/django-hijack/blob/master/docs/release-button.png)
- [Commits](https://github.com/django-hijack/django-hijack/compare/3.5.0...3.6.0)

---
updated-dependencies:
- dependency-name: django-hijack
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-17 14:27:42 +02:00
Raphael Michel
3716a686f5 Translations: Add Basque 2024-07-17 14:27:30 +02:00
Erik Löfman
9c0c77958e Translations: Update Swedish
Currently translated at 99.9% (5685 of 5690 strings)

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

powered by weblate
2024-07-17 14:27:30 +02:00
Nikolai
6154a44274 Translations: Update Danish
Currently translated at 47.9% (2727 of 5690 strings)

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

powered by weblate
2024-07-17 14:27:30 +02:00
Erik Löfman
d5aff10297 Translations: Update Swedish
Currently translated at 98.5% (5610 of 5690 strings)

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

powered by weblate
2024-07-17 14:27:30 +02:00
Erik Löfman
846e39a652 Translations: Update Swedish
Currently translated at 94.4% (5374 of 5690 strings)

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

powered by weblate
2024-07-17 14:27:30 +02:00
Mira
75d37b2a37 Don't exclude localization PRs from test CI action (#4276)
* Don't exclude localization PRs from test CI action

* Update tests.yml

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2024-07-17 14:23:39 +02:00
Raphael Michel
2a0c3da8c4 Fix N+1 query found by sentry (PRETIXEU-AC2) 2024-07-16 11:25:48 +02:00
Martin Gross
fb7f4d1160 Control/Waitlist: Add help_text to waiting_list_limit_per_user (Z#23158537) 2024-07-15 13:39:31 +02:00
Erik Löfman
5c8817f0c3 Translations: Update Swedish
Currently translated at 94.2% (5364 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
7663bf7994 Translations: Update Swedish
Currently translated at 87.3% (4972 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
ea8f74f8aa Translations: Update Swedish
Currently translated at 87.3% (4970 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
7b34701449 Translations: Update Danish
Currently translated at 46.1% (2625 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Dirk-jan mollema
06f4bfea24 Translations: Update Dutch
Currently translated at 86.5% (4925 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
e2862a98a0 Translations: Update Danish
Currently translated at 45.2% (2572 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
82f4feadc3 Translations: Update Swedish
Currently translated at 81.8% (4657 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
906222c7d3 Translations: Update Danish
Currently translated at 66.2% (153 of 231 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
7ce2089ca8 Translations: Update Danish
Currently translated at 44.4% (2532 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
2133584ed2 Translations: Update Swedish
Currently translated at 75.2% (4280 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
c3c50d7205 Translations: Update Danish
Currently translated at 41.6% (2369 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
4f7a41a4b2 Translations: Update Swedish
Currently translated at 71.2% (4055 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
93fd79ab33 Translations: Update Danish
Currently translated at 65.8% (152 of 231 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
59595c2f10 Translations: Update Danish
Currently translated at 40.9% (2332 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Erik Löfman
91c6d09f0b Translations: Update Swedish
Currently translated at 64.8% (3688 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Nikolai
570a818129 Translations: Update Danish
Currently translated at 35.5% (2025 of 5690 strings)

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

powered by weblate
2024-07-15 09:46:49 +02:00
Martin Gross
d63e2ebe2d Chore/flake8: Remove extra blank line 2024-07-12 12:34:39 +02:00
Martin Gross
884c97d62a Stripe/SOFORT: Move SOFORT from iFrame to proper redirect (Z#23158598) 2024-07-12 12:30:37 +02:00
Mira
032e958a00 Fix test cases for checkinlist export (#4301) 2024-07-12 11:58:10 +02:00
54 changed files with 36353 additions and 5139 deletions

View File

@@ -5,7 +5,6 @@ on:
branches: [ master ]
paths-ignore:
- 'doc/**'
- 'src/pretix/locale/**'
pull_request:
branches: [ master ]
paths-ignore:

View File

@@ -65,7 +65,7 @@ Package dependencies
To build and run pretix, you will need the following debian packages::
# apt-get install git build-essential python3-dev python3-venv python3 python3-pip \
python3-dev libxml2-dev libxslt1-dev libffi-dev zlib1g-dev libssl-dev \
libxml2-dev libxslt1-dev libffi-dev zlib1g-dev libssl-dev \
gettext libpq-dev libjpeg-dev libopenjp2-7-dev
Config file

View File

@@ -42,6 +42,8 @@ payment_date date **DEPRECATED AN
payment_provider string **DEPRECATED AND INACCURATE** Payment provider used for this order
total money (string) Total value of this order
comment string Internal comment on this order
api_meta object Meta data for that order. Only available through API, no guarantees
on the content structure. You can use this to save references to your system.
custom_followup_at date Internal date for a custom follow-up action
checkin_attention boolean If ``true``, the check-in app should show a warning
that this ticket requires special attention if a ticket
@@ -562,6 +564,7 @@ Fetching individual orders
"fees": [],
"total": "23.00",
"comment": "",
"api_meta": {},
"custom_followup_at": null,
"checkin_attention": false,
"checkin_text": null,
@@ -742,6 +745,8 @@ Updating order fields
* ``comment``
* ``api_meta``
* ``custom_followup_at``
* ``invoice_address`` (you always need to supply the full object, or ``null`` to delete the current address)

View File

@@ -41,6 +41,7 @@ The following values for ``action_types`` are valid with pretix core:
* ``pretix.event.order.modified``
* ``pretix.event.order.contact.changed``
* ``pretix.event.order.changed.*``
* ``pretix.event.order.deleted`` (can only occur for test mode orders)
* ``pretix.event.order.refund.created``
* ``pretix.event.order.refund.created.externally``
* ``pretix.event.order.refund.requested``
@@ -115,6 +116,7 @@ Endpoints
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query boolean enabled: Only show webhooks that are or are not enabled
:param organizer: The ``slug`` field of the organizer to fetch
:statuscode 200: no error
:statuscode 401: Authentication failure

View File

@@ -39,7 +39,7 @@ Frontend
.. automodule:: pretix.presale.signals
:members: order_info, order_info_top, order_meta_from_request
:members: order_info, order_info_top, order_meta_from_request, order_api_meta_from_request
Request flow
""""""""""""

View File

@@ -0,0 +1,105 @@
GetYourGuide
============
.. note::
The GetYourGuide integration is currently in Beta. Please contact support@pretix.eu to enable the integration
for your pretix.eu organizer account.
Introduction
------------
Using third party aggregators, such als GetYourGuide, event organizers can sell tickets to their events not only on
their own ticket-shop but also on the aggregator's portal. While this service is not for free, it allows event
organizers to reacher a larger audience that would otherwise not have found their way into the organizers webshop.
Using pretix' integration with GetYourGuide, event organizers can profit from an additional sales and revenue channel,
while keeping the effort for setting up and maintaining multiple ticket shops to a minimum.
Preparing your organizer account
--------------------------------
The first step in enabling the GetYourGuide integration, is to setup a corresponding Sales Channel, which will be used
to properly attribute the sales generated. This needs to be done only once per organizer account.
To do so, log into the pretix backend, select ``Organizers`` from the navigation and then the organizer in question.
Extending the ``Settings``-menu, find the ``Sales channels`` configuration and click the ``Add a new channel`` button.
On the following page, you will be able to select ``GetYourGuide`` as the sales channel type and give it a custom name.
Preparing your event
--------------------
In order to now sell your events on GetYourGuide, you will need to configure each event in question.
1. Enabling the plugin
Within your event, extend the ``Settings`` menu and navigate to ``Plugins``. Activate the plugin in the
``Integrations`` tab.
2. Sell the event on the sales channel
Pick the sales channel or channels, on which you would like to sell your event by navigating to the event's general
settings page using the ``Sell on all sales channels`` or ``Restrict to specific sales channels`` checkboxes.
3. Configure one or more products to be sold on GetYourGuide
Either create a new or edit an existing product, that you would like to sell on GetYourGuide. To do so, you will
need to have checked the ``Sell on all sales channels`` or appropriate ``Restrict to specific sales channels``
checkbox of the product within it's ``Availability`` tab.
In addition, you will also need to set the GetYourGuide equivalent ticket category in the product's accordingly
named settings tab. Within your event, there can be only one product per ticket category. Depending on your further
configuration, you must at least select one product to be in the ``Adult`` or ``Group`` category.
4. Configuring the GetYourGuide-plugin
Once you have configured one or more products to be eligible to be sold on GetYourGuide, you'll need to configure a
few basic settings within the event (``Settings`` --> ``GetYourGuide``). The most important settings can be found
the in the ``Configuration`` tab, such as the location of the event on sale.
Ticket Categories
-----------------
While pretix only uses the ticket category term loosely to group together multiple products for nicer display,
GetYourGuide is relying on the ticket categories to price the tickets.
First of all, you need to make the decision on how you are planning on selling your tickets on GetYourGuide - in most
cases, this will reflect your current sales strategy within your pretix shop.
- Individual tickets
Every single person attending will need to purchase their own ticket. A family of two adults and two
children will have to purchase and pay for a total of 4 tickets.
In this case, you will need to offer *at least* a ticket of the ``Adult`` type, but may offer any other ticket
category type (Child, Youth, Senior, ...) in addition. But you cannot offer a ``Group`` ticket.
- Group tickets
Two groups, consisting of 10 and 20 participants respectively, won't need to purchase a total of 30 tickets, but
rather two group tickets. It is up to you to configure the group size limits within the GetYourGuide-settings of your
product.
Choosing this option, you cannot offer any other ticket categories besides ``Group``.
Setting up event dates and quotas
---------------------------------
Of course, in addition to creating products, you will also need to add them to a quota for them to be available for
sale. The process for doing this is the very same as for any regular event or event series.
.. note::
When selling individual tickets through GetYourGuide, you will not be able to offer differing quantities for
individual ticket categories.
For this reason, we recommend to place all GetYourGuide-eligible products into the same quota. Should you however opt
to create multiple quotas which create an imbalance, pretix will report only the available number of tickets for the
lowest relevant quota.
Connecting your event to GetYourGuide
-------------------------------------
Once you have set up your event and products and performed all necessary configuration, you may want to use the
Analyzer-feature of our GetYourGuide-plugin (``Settings`` -> ``GetYourGuide`` -> tab ``Analyzer``).
The Analyzer should not display any blocking error messages and at least one event date that is ready for publishing on
the GetYourGuide platform.
At this point, you will need to setup your event (called ``product`` in the GetYourGuide universe) on their
`Supplier Portal`_ and connect it with your pretix shop. To do so, please follow the
`Connecting a new product to your Reservation System`_ on the GetYourGuide Supply Partner Help Center.
Select ``pretix.eu`` as your reservation system; the required ``product ID`` can be found in the ``Configuration`` tab
of the GetYourGuide plugin settings page.
From this point on, GetYourGuide will automatically import the availabilities and products and offer them for sale.
.. _Supplier Portal: https://suppliers.getyourguide.com/
.. _Connecting a new product to your Reservation System: https://supply.getyourguide.support/hc/en-us/articles/18008029689373-Connecting-a-new-product-to-your-Reservation-system

View File

@@ -25,3 +25,4 @@ If you want to **create** a plugin, please go to the
webinar
presale-saml
kulturpass
getyourguide

View File

@@ -1,4 +1,4 @@
sphinx==7.3.*
sphinx==7.4.*
jinja2==3.1.*
sphinx-rtd-theme
sphinxcontrib-httpdomain

View File

@@ -1,5 +1,5 @@
-e ../
sphinx==7.3.*
sphinx==7.4.*
jinja2==3.1.*
sphinx-rtd-theme
sphinxcontrib-httpdomain

View File

@@ -449,6 +449,16 @@ Further reading:
* `Stripe Payment Method Domain registration`_
External payment providers and Cross-Origin-Opener-Policy
---------------------------------------------------------
If you use a payment provider that opens a new window during checkout (such as PayPal), be aware that setting
``Cross-Origin-Opener-Policy: same-origin`` results in an empty popup-window being opened in the foreground. This is
due to JavaScript not having access to the opened window. To mitigate this, you either need to always open the widgets
checkout in a new tab (see :ref:`Always open a new tab`) or set ``Cross-Origin-Opener-Policy: same-origin-allow-popups``
Working with Cross-Origin-Embedder-Policy
-----------------------------------------

View File

@@ -38,13 +38,13 @@ dependencies = [
"dj-static",
"Django[argon2]==4.2.*",
"django-bootstrap3==24.2",
"django-compressor==4.5",
"django-compressor==4.5.1",
"django-countries==7.6.*",
"django-filter==24.2",
"django-formset-js-improved==0.5.0.3",
"django-formtools==2.5.1",
"django-hierarkey==1.2.*",
"django-hijack==3.5.*",
"django-hijack==3.6.*",
"django-i18nfield==1.9.*,>=1.9.4",
"django-libsass==0.9",
"django-localflavor==4.0",
@@ -82,8 +82,8 @@ dependencies = [
"pycountry",
"pycparser==2.22",
"pycryptodome==3.20.*",
"pypdf==4.2.*",
"python-bidi==0.4.*", # Support for Arabic in reportlab
"pypdf==4.3.*",
"python-bidi==0.5.*", # Support for Arabic in reportlab
"python-dateutil==2.9.*",
"pytz",
"pytz-deprecation-shim==0.1.*",
@@ -92,7 +92,7 @@ dependencies = [
"redis==5.0.*",
"reportlab==4.2.*",
"requests==2.31.*",
"sentry-sdk==2.5.*",
"sentry-sdk==2.10.*",
"sepaxml==2.6.*",
"slimit",
"static3==0.7.*",
@@ -127,7 +127,7 @@ dev = [
"pytest-rerunfailures==14.*",
"pytest-sugar",
"pytest-xdist==3.6.*",
"pytest==8.2.*",
"pytest==8.3.*",
"responses",
]

View File

@@ -21,6 +21,7 @@
#
import json
from django.db.models import prefetch_related_objects
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
@@ -80,6 +81,7 @@ class SalesChannelMigrationMixin:
def to_internal_value(self, data):
if "sales_channels" in data:
prefetch_related_objects([self.organizer], "sales_channels")
all_channels = {
s.identifier for s in
self.organizer.sales_channels.all()
@@ -109,6 +111,7 @@ class SalesChannelMigrationMixin:
def to_representation(self, value):
value = super().to_representation(value)
if value.get("all_sales_channels"):
prefetch_related_objects([self.organizer], "sales_channels")
value["sales_channels"] = sorted([
s.identifier for s in
self.organizer.sales_channels.all()

View File

@@ -726,7 +726,7 @@ class OrderSerializer(I18nAwareModelSerializer):
'code', 'event', 'status', 'testmode', 'secret', 'email', 'phone', 'locale', 'datetime', 'expires', 'payment_date',
'payment_provider', 'fees', 'total', 'comment', 'custom_followup_at', 'invoice_address', 'positions', 'downloads',
'checkin_attention', 'checkin_text', 'last_modified', 'payments', 'refunds', 'require_approval', 'sales_channel',
'url', 'customer', 'valid_if_pending'
'url', 'customer', 'valid_if_pending', 'api_meta'
)
read_only_fields = (
'code', 'status', 'testmode', 'secret', 'datetime', 'expires', 'payment_date',
@@ -786,7 +786,7 @@ class OrderSerializer(I18nAwareModelSerializer):
# Even though all fields that shouldn't be edited are marked as read_only in the serializer
# (hopefully), we'll be extra careful here and be explicit about the model fields we update.
update_fields = ['comment', 'custom_followup_at', 'checkin_attention', 'checkin_text', 'email', 'locale',
'phone', 'valid_if_pending']
'phone', 'valid_if_pending', 'api_meta']
if 'invoice_address' in validated_data:
iadata = validated_data.pop('invoice_address')
@@ -1059,7 +1059,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
fields = ('code', 'status', 'testmode', 'email', 'phone', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel',
'invoice_address', 'positions', 'checkin_attention', 'checkin_text', 'payment_info', 'payment_date',
'consume_carts', 'force', 'send_email', 'simulate', 'customer', 'custom_followup_at',
'require_approval', 'valid_if_pending', 'expires')
'require_approval', 'valid_if_pending', 'expires', 'api_meta')
def validate_payment_provider(self, pp):
if pp is None:

View File

@@ -443,7 +443,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
elif self.request.user.is_authenticated:
qs = SubEvent.objects.filter(
event__organizer=self.request.organizer,
event__in=self.request.user.get_events_with_any_permission()
event__in=self.request.user.get_events_with_any_permission(request=self.request)
)
qs = filter_qs_by_attr(qs, self.request)

View File

@@ -19,6 +19,8 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import django_filters
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
from rest_framework import viewsets
from pretix.api.models import WebHook
@@ -26,11 +28,17 @@ from pretix.api.serializers.webhooks import WebHookSerializer
from pretix.helpers.dicts import merge_dicts
class WebhookFilter(FilterSet):
enabled = django_filters.rest_framework.BooleanFilter()
class WebHookViewSet(viewsets.ModelViewSet):
serializer_class = WebHookSerializer
queryset = WebHook.objects.none()
permission = 'can_change_organizer_settings'
write_permission = 'can_change_organizer_settings'
filter_backends = (DjangoFilterBackend,)
filterset_class = WebhookFilter
def get_queryset(self):
return self.request.organizer.webhooks.prefetch_related('listeners')

View File

@@ -126,6 +126,17 @@ class ParametrizedOrderWebhookEvent(ParametrizedWebhookEvent):
}
class DeletedOrderWebhookEvent(ParametrizedWebhookEvent):
def build_payload(self, logentry: LogEntry):
return {
'notification_id': logentry.pk,
'organizer': logentry.organizer.slug,
'event': logentry.event.slug,
'code': logentry.parsed_data.get("code"),
'action': logentry.action_type,
}
class ParametrizedEventWebhookEvent(ParametrizedWebhookEvent):
def build_payload(self, logentry: LogEntry):
@@ -297,6 +308,10 @@ def register_default_webhook_events(sender, **kwargs):
'pretix.event.order.denied',
_('Order denied'),
),
DeletedOrderWebhookEvent(
'pretix.event.order.deleted',
_('Order deleted'),
),
ParametrizedOrderPositionCheckinWebhookEvent(
'pretix.event.checkin',
_('Ticket checked in'),

View File

@@ -256,7 +256,7 @@ class ListExporter(BaseExporter):
ws = wb.create_sheet()
self.prepare_xlsx_sheet(ws)
try:
ws.title = str(self.verbose_name)
ws.title = str(self.verbose_name)[:30]
except:
pass
total = 0
@@ -374,7 +374,7 @@ class MultiSheetListExporter(ListExporter):
wb = SafeWorkbook(write_only=True)
n_sheets = len(self.sheets)
for i_sheet, (s, l) in enumerate(self.sheets):
ws = wb.create_sheet(str(l))
ws = wb.create_sheet(str(l)[:30])
if hasattr(self, 'prepare_xlsx_sheet_' + s):
getattr(self, 'prepare_xlsx_sheet_' + s)(ws)

View File

@@ -560,7 +560,7 @@ class OrderListExporter(MultiSheetListExporter):
),
).select_related(
'order', 'order__invoice_address', 'order__customer', 'item', 'variation',
'voucher', 'tax_rule'
'voucher', 'tax_rule', 'addon_to',
).prefetch_related(
'subevent', 'subevent__meta_values',
'answers', 'answers__question', 'answers__options'
@@ -619,6 +619,7 @@ class OrderListExporter(MultiSheetListExporter):
_('Valid until'),
_('Order comment'),
_('Follow-up date'),
_('Add-on to position ID'),
]
questions = list(Question.objects.filter(event__in=self.events))
@@ -652,7 +653,8 @@ class OrderListExporter(MultiSheetListExporter):
_('VAT ID'),
]
headers += [
_('Sales channel'), _('Order locale'),
_('Sales channel'),
_('Order locale'),
_('E-mail address verified'),
_('External customer ID'),
_('Check-in lists'),
@@ -743,6 +745,7 @@ class OrderListExporter(MultiSheetListExporter):
]
row.append(order.comment)
row.append(order.custom_followup_at.strftime("%Y-%m-%d") if order.custom_followup_at else "")
row.append(op.addon_to.positionid if op.addon_to_id else "")
acache = {}
for a in op.answers.all():
# We do not want to localize Date, Time and Datetime question answers, as those can lead

View File

@@ -30,7 +30,7 @@ from typing import Tuple
import bleach
import vat_moss.exchange_rates
from bidi.algorithm import get_display
from bidi import get_display
from django.contrib.staticfiles import finders
from django.db.models import Sum
from django.dispatch import receiver

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.13 on 2024-07-17 14:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0268_remove_subevent_items_remove_subevent_variations_and_more'),
]
operations = [
migrations.AddField(
model_name='order',
name='api_meta',
field=models.JSONField(default=dict),
),
]

View File

@@ -28,9 +28,9 @@ from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy
from pretix.base.modelimport import (
BooleanColumnMixin, DatetimeColumnMixin, DecimalColumnMixin, ImportColumn,
IntegerColumnMixin, i18n_flat,
IntegerColumnMixin, SubeventColumnMixin, i18n_flat,
)
from pretix.base.models import ItemVariation, Quota, Seat, Voucher
from pretix.base.models import ItemVariation, Quota, Seat, SubEvent, Voucher
from pretix.base.signals import voucher_import_columns
@@ -55,11 +55,11 @@ class CodeColumn(ImportColumn):
obj.code = value
class SubeventColumn(ImportColumn):
class SubeventColumn(SubeventColumnMixin, ImportColumn):
identifier = 'subevent'
verbose_name = pgettext_lazy('subevents', 'Date')
def assign(self, value, obj: Voucher, **kwargs):
def assign(self, value, obj: SubEvent, **kwargs):
obj.subevent = value

View File

@@ -299,6 +299,11 @@ class Order(LockModel, LoggedModel):
verbose_name=_("Meta information"),
null=True, blank=True
)
api_meta = models.JSONField(
verbose_name=_("API meta information"),
null=False, blank=True,
default=dict
)
last_modified = models.DateTimeField(
auto_now=True, db_index=False
)

View File

@@ -49,7 +49,7 @@ from io import BytesIO
import jsonschema
import reportlab.rl_config
from bidi.algorithm import get_display
from bidi import get_display
from django.conf import settings
from django.contrib.staticfiles import finders
from django.core.exceptions import ValidationError

View File

@@ -275,7 +275,7 @@ class CartManager:
}
def __init__(self, event: Event, cart_id: str, sales_channel: SalesChannel,
invoice_address: InvoiceAddress=None, widget_data=None):
invoice_address: InvoiceAddress=None, widget_data=None, expiry=None):
self.event = event
self.cart_id = cart_id
self.real_now_dt = now()
@@ -287,6 +287,7 @@ class CartManager:
self._variations_cache = {}
self._seated_cache = {}
self._expiry = None
self._explicit_expiry = expiry
self.invoice_address = invoice_address
self._widget_data = widget_data or {}
self._sales_channel = sales_channel
@@ -305,7 +306,12 @@ class CartManager:
return self._seated_cache[item, subevent]
def _calculate_expiry(self):
self._expiry = self.real_now_dt + timedelta(minutes=self.event.settings.get('reservation_time', as_type=int))
if self._explicit_expiry:
self._expiry = self._explicit_expiry
else:
self._expiry = self.real_now_dt + timedelta(
minutes=self.event.settings.get('reservation_time', as_type=int)
)
def _check_presale_dates(self):
if self.event.presale_start and time_machine_now(self.real_now_dt) < self.event.presale_start:

View File

@@ -960,7 +960,7 @@ def _get_fees(positions: List[CartPosition], payment_requests: List[dict], addre
def _create_order(event: Event, *, email: str, positions: List[CartPosition], now_dt: datetime,
payment_requests: List[dict], sales_channel: SalesChannel, locale: str=None,
address: InvoiceAddress=None, meta_info: dict=None, shown_total=None,
customer=None, valid_if_pending=False):
customer=None, valid_if_pending=False, api_meta: dict=None):
payments = []
try:
@@ -985,6 +985,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no
total=total,
testmode=True if sales_channel.type_instance.testmode_supported and event.testmode else False,
meta_info=json.dumps(meta_info or {}),
api_meta=api_meta or {},
require_approval=require_approval,
sales_channel=sales_channel,
customer=customer,
@@ -1096,7 +1097,7 @@ def _order_placed_email_attendee(event: Event, order: Order, position: OrderPosi
def _perform_order(event: Event, payment_requests: List[dict], position_ids: List[str],
email: str, locale: str, address: int, meta_info: dict=None, sales_channel: str='web',
shown_total=None, customer=None):
shown_total=None, customer=None, api_meta: dict=None):
for p in payment_requests:
p['pprov'] = event.get_payment_providers(cached=True)[p['provider']]
if not p['pprov']:
@@ -1200,7 +1201,8 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis
sales_channel=sales_channel,
shown_total=shown_total,
customer=customer,
valid_if_pending=valid_if_pending
valid_if_pending=valid_if_pending,
api_meta=api_meta,
)
try:
@@ -2873,12 +2875,13 @@ class OrderChangeManager:
@app.task(base=ProfiledEventTask, bind=True, max_retries=5, default_retry_delay=1, throws=(OrderError,))
def perform_order(self, event: Event, payments: List[dict], positions: List[str],
email: str=None, locale: str=None, address: int=None, meta_info: dict=None,
sales_channel: str='web', shown_total=None, customer=None, override_now_dt: datetime=None):
sales_channel: str='web', shown_total=None, customer=None, override_now_dt: datetime=None,
api_meta: dict=None):
with language(locale), time_machine_now_assigned(override_now_dt):
try:
try:
return _perform_order(event, payments, positions, email, locale, address, meta_info,
sales_channel, shown_total, customer)
sales_channel, shown_total, customer, api_meta)
except LockTimeoutException:
self.retry()
except (MaxRetriesExceededError, LockTimeoutException):

View File

@@ -1478,6 +1478,10 @@ DEFAULTS = {
min_value=1,
required=True,
widget=forms.NumberInput(),
help_text=_('With an increased limit, a customer may request more than one ticket for a specific product '
'using the same, unique email address. However, regardless of this setting, they will need to '
'fill the waitlist form multiple times if they want more than one ticket, as every entry only '
'grants one single ticket at a time.'),
)
},
'show_checkin_number_user': {

View File

@@ -40,7 +40,6 @@ from urllib.parse import urlencode
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import UploadedFile
from django.db.models import Max
from django.forms.formsets import DELETION_FIELD_NAME
from django.urls import reverse
@@ -63,9 +62,9 @@ from pretix.base.models import (
from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
from pretix.base.signals import item_copy_data
from pretix.control.forms import (
ButtonGroupRadioSelect, ItemMultipleChoiceField,
SalesChannelCheckboxSelectMultiple, SizeValidationMixin,
SplitDateTimeField, SplitDateTimePickerWidget,
ButtonGroupRadioSelect, ExtFileField, ItemMultipleChoiceField,
SalesChannelCheckboxSelectMultiple, SplitDateTimeField,
SplitDateTimePickerWidget,
)
from pretix.control.forms.widgets import Select2, Select2ItemVarMulti
from pretix.helpers.models import modelcopy
@@ -562,6 +561,13 @@ class TicketNullBooleanSelect(forms.NullBooleanSelect):
class ItemUpdateForm(I18nModelForm):
picture = ExtFileField(
label=_('Product picture'),
ext_whitelist=settings.FILE_UPLOAD_EXTENSIONS_IMAGE,
max_size=settings.FILE_UPLOAD_MAX_SIZE_IMAGE,
required=False,
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all()
@@ -751,14 +757,6 @@ class ItemUpdateForm(I18nModelForm):
return d
def clean_picture(self):
value = self.cleaned_data.get('picture')
if isinstance(value, UploadedFile) and value.size > settings.FILE_UPLOAD_MAX_SIZE_IMAGE:
raise forms.ValidationError(_("Please do not upload files larger than {size}!").format(
size=SizeValidationMixin._sizeof_fmt(settings.FILE_UPLOAD_MAX_SIZE_IMAGE)
))
return value
class Meta:
model = Item
localized_fields = '__all__'

View File

@@ -58,7 +58,8 @@ from pretix.api.models import WebHook
from pretix.api.webhooks import get_all_webhook_events
from pretix.base.customersso.oidc import oidc_validate_and_complete_config
from pretix.base.forms import (
I18nMarkdownTextarea, I18nModelForm, PlaceholderValidator, SettingsForm,
SECRET_REDACTED, I18nMarkdownTextarea, I18nModelForm, PlaceholderValidator,
SecretKeySettingsField, SettingsForm,
)
from pretix.base.forms.questions import (
NamePartsFormField, WrappedPhoneNumberPrefixWidget, get_country_by_locale,
@@ -958,7 +959,7 @@ class SSOProviderForm(I18nModelForm):
label=pgettext_lazy('sso_oidc', 'Client ID'),
required=False,
)
config_oidc_client_secret = forms.CharField(
config_oidc_client_secret = SecretKeySettingsField(
label=pgettext_lazy('sso_oidc', 'Client secret'),
required=False,
)
@@ -1015,7 +1016,13 @@ class SSOProviderForm(I18nModelForm):
if self.instance and self.instance.method == method:
f.initial = self.instance.configuration.get(suffix)
def _unmask_secret_fields(self):
for k, v in self.cleaned_data.items():
if isinstance(self.fields.get(k), SecretKeySettingsField) and self.cleaned_data.get(k) == SECRET_REDACTED:
self.cleaned_data[k] = self.fields[k].initial
def clean(self):
self._unmask_secret_fields()
data = self.cleaned_data
if not data.get("method"):
return data

View File

@@ -98,6 +98,14 @@ class ControlFieldRenderer(FieldRenderer):
attrs = ''
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
def wrap_widget(self, html):
if isinstance(self.widget, CheckboxInput):
css_class = "checkbox"
if self.field.field.disabled:
css_class += " disabled"
html = f'<div class="{css_class}">{html}</div>'
return html
class ControlFieldWithVisibilityRenderer(ControlFieldRenderer):
def __init__(self, *args, **kwargs):

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-24 08:20+0000\n"
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
"PO-Revision-Date: 2024-07-10 15:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
"da/>\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.6.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -261,7 +261,7 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket not paid"
msgstr ""
msgstr "Billet ikke betalt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "This ticket is not yet paid. Do you want to continue anyways?"
@@ -281,11 +281,11 @@ msgstr ""
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
msgid "Ticket already used"
msgstr ""
msgstr "Billet allerede i brug"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Information required"
msgstr ""
msgstr "Kræver information"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Unknown ticket"
@@ -301,15 +301,15 @@ msgstr "Adgang ikke tilladt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Ticket code revoked/changed"
msgstr ""
msgstr "Billetkode trukket tilbage/ændret"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Ticket blocked"
msgstr ""
msgstr "Billet blokeret"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Ticket not valid at this time"
msgstr ""
msgstr "Billetten er ikke gyldig på dette tidspunkt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order canceled"
@@ -317,11 +317,11 @@ msgstr "Bestilling annulleret"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Ticket code is ambiguous on list"
msgstr ""
msgstr "Billetkoden er flertydig på listen"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
msgid "Order not approved"
msgstr ""
msgstr "Bestilling ikke godkendt"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68
#, fuzzy
@@ -472,7 +472,7 @@ msgstr "Produktvariation"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
msgid "Gate"
msgstr ""
msgstr "Indgang"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
@@ -548,7 +548,7 @@ msgstr ""
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:186
msgid "Event admission"
msgstr ""
msgstr "Adgang til arrangementet"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:187
msgid "custom date and time"

View File

@@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-30 18:55+0000\n"
"PO-Revision-Date: 2024-07-02 19:00+0000\n"
"PO-Revision-Date: 2024-07-19 22:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
">\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.1\n"
"X-Generator: Weblate 5.6.2\n"
"X-Poedit-Bookmarks: -1,-1,904,-1,-1,-1,-1,-1,-1,-1\n"
#: pretix/_base_settings.py:78
@@ -4921,8 +4921,8 @@ msgid ""
"The duration of the membership is the same as the duration of the event or "
"event series date"
msgstr ""
"Die Dauer der Mitgliedschaft entspricht der Dauer der Veranstaltung oder des "
"Termins"
"Die Dauer der Mitgliedschaft entspricht der Dauer der Veranstaltung bzw. in "
"Veranstaltungsreihen des gebuchten Termins"
#: pretix/base/models/items.py:660
msgid "Membership duration in days"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-30 18:55+0000\n"
"PO-Revision-Date: 2024-07-02 19:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"PO-Revision-Date: 2024-07-20 13:00+0000\n"
"Last-Translator: JnnisCanis <me@jnnis.de>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.1\n"
"X-Generator: Weblate 5.6.2\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -4917,8 +4917,8 @@ msgid ""
"The duration of the membership is the same as the duration of the event or "
"event series date"
msgstr ""
"Die Dauer der Mitgliedschaft entspricht der Dauer der Veranstaltung oder des "
"Termins"
"Die Dauer der Mitgliedschaft entspricht der Dauer der Veranstaltung bzw. in "
"Veranstaltungsreihen des gebuchten Termins"
#: pretix/base/models/items.py:660
msgid "Membership duration in days"
@@ -6671,11 +6671,10 @@ msgid ""
"rel=\"noopener\">Click here for detailed information on what this does.</a> "
"Don't forget to set the correct fees above!"
msgstr ""
"Wir empfehlen, diese Option zu aktivieren, wenn du die Gebühren Ihres "
"Zahlungsdienstleisters an Ihre Kunden weitergeben willst. Denk daran, oben "
"die richtigen Gebührensätze des Zahlungsanbieters einzustellen. <a "
"href=\"{docs_url}\" target=\"_blank\" rel=\"noopener\">Weitere "
"Informationen</a>."
"Wir empfehlen, diese Option zu aktivieren, wenn Du die Gebühren deines "
"Zahlungsdienstleisters an deine Kunden weitergeben willst. Denke daran, oben "
"die richtigen Gebührensätze des Zahlungsanbieters einzustellen. <a href=\""
"{docs_url}\" target=\"_blank\" rel=\"noopener\">Weitere Informationen</a>."
#: pretix/base/payment.py:394
msgid "Text on invoices"
@@ -9239,9 +9238,9 @@ msgid ""
msgstr ""
"Anzahl an Minuten, die ein Benutzer nach Abschicken der Bestellung hat, um "
"die Zahlung abzuschließen. Benutze dies nur, wenn du ausschließlich "
"Zahlungsmethoden mit sofortiger Bestätigung anbietest. Bitte beachte das das "
"tatsächliche Zeitfenster aus technischen Gründen einige Minuten länger sein "
"kann."
"Zahlungsmethoden mit sofortiger Bestätigung anbietest. Bitte beachte, dass "
"das tatsächliche Zeitfenster aus technischen Gründen einige Minuten länger "
"sein kann."
#: pretix/base/settings.py:920
msgid "Last date of payments"
@@ -9914,7 +9913,8 @@ msgstr "Keine Änderungen an bestehenden Bestellungen"
#: pretix/base/settings.py:1665 pretix/base/settings.py:1674
msgid "Only the person who ordered can make changes"
msgstr ""
"Nur die Person, die die Bestellung aufgegeben hat, kann Änderungen vornehmen"
"Nur die Person, welche die Bestellung aufgegeben hat, kann Änderungen "
"vornehmen"
#: pretix/base/settings.py:1666 pretix/base/settings.py:1675
msgid "Both the attendee and the person who ordered can make changes"
@@ -10854,7 +10854,7 @@ msgstr ""
"Hallo,\n"
"\n"
"du hast dich auf die Warteliste für {event} \n"
"für das Produkt {product} eingetragen.\n"
"und das Produkt {product} eingetragen.\n"
"\n"
"Wir haben nun ein Ticket für dich! Du kannst es in unserem Ticketshop "
"erwerben,\n"
@@ -10872,9 +10872,8 @@ msgstr ""
"weitergeben,\n"
"wenn du den Gutschein nicht in diesem Zeitraum einlöst.\n"
"\n"
"Wenn du das Ticket NICHT mehr möchtest, bitten wir dich folgenden Link zu "
"klicken\n"
"um uns Bescheid zu sagen. So können wir das Ticket schnellstmöglich an die "
"Wenn du das Ticket NICHT mehr möchtest, sag uns bitte durch Klicken auf "
"folgenden Link Bescheid. So können wir das Ticket schnellstmöglich an die "
"nächste\n"
"wartende Person auf der Warteliste weitergeben:\n"
"\n"
@@ -13976,7 +13975,7 @@ msgid ""
"set the name here."
msgstr ""
"Wenn du den \"powered by\"-Text in der Fußzeile anpassen willst, um den "
"Namen Ihrer Firma oder Organisation aufzunehmen (wenn du Änderungen an "
"Namen deiner Firma oder Organisation aufzunehmen (wenn du Änderungen an "
"pretix vorgenommen hast), kannst du hier den Namen eintragen."
#: pretix/control/forms/global_settings.py:205
@@ -14641,7 +14640,7 @@ msgstr ""
"Erstattungen angezeigt. Wenn diese Option mit der Option für automatische "
"Erstattungen kombiniert wird, werden ausschließlich Zahlungen mit einer "
"Zahlungsart, die keine automatischen Erstattungen unterstützt, automatisch "
"als manuelle Erstattungen auf Ihrer Erstattungsliste als \"zu erledigen\" "
"als manuelle Erstattungen auf deiner Erstattungsliste als \"zu erledigen\" "
"auftauchen. Wähle diese Option nicht, wenn du Bestellungen mit anderen "
"Bestellungen verrechnen oder als Gutschein erstatten möchtest."
@@ -17466,7 +17465,7 @@ msgstr "Filter"
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:50
msgid "Your search did not match any check-ins."
msgstr "Ihre Filter treffen auf keine Check-ins zu."
msgstr "Deine Filter treffen auf keine Check-ins zu."
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:52
msgid "You haven't scanned any tickets yet."
@@ -19807,7 +19806,7 @@ msgid ""
"usage of pretix is in compliance with the Enterprise license you purchased."
msgstr ""
"Der Bericht dient zwei Zwecken: Dem Sammeln nützlicher Informationen um "
"Probleme mit Ihrer pretix-Installation zu analysieren und um zu überprüfen, "
"Probleme mit deiner pretix-Installation zu analysieren und um zu überprüfen, "
"dass deine Nutzung von pretix von der erworbenen pretix-Enterprise-Lizenz "
"abgedeckt ist."
@@ -30131,7 +30130,7 @@ msgid ""
"generate you API keys with the recommended permission level for optimal "
"usage with pretix."
msgstr ""
"Der Button oben wird unsere Stripe-App in Ihrem Stripe-Konto installieren "
"Der obige Button wird unsere Stripe-App in deinem Stripe-Konto installieren "
"und API-Schlüssel mit dem empfohlenen Berechtigungslevel für die Verwendung "
"mit pretix generieren."
@@ -30382,7 +30381,7 @@ msgstr ""
#: pretix/plugins/stripe/payment.py:992
msgid "Your payment failed. Please try again."
msgstr "Ihre Zahlung ist fehlgeschlagen, bitte erneut versuchen."
msgstr "Deine Zahlung ist fehlgeschlagen. Bitte versuche es erneut."
#: pretix/plugins/stripe/payment.py:998
#, python-format
@@ -32466,7 +32465,7 @@ msgid ""
"If you click the link in our email, you will be able to download your "
"tickets here."
msgstr ""
"Wenn du den Link in Ihrer E-Mail anklickst, kannst du deine Tickets hier "
"Wenn du den Link in deiner E-Mail anklickst, kannst du deine Tickets hier "
"herunterladen."
#: pretix/presale/templates/pretixpresale/event/fragment_downloads.html:30
@@ -33691,7 +33690,7 @@ msgstr "Konto erstellen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:7
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:10
msgid "Your membership"
msgstr "Ihre Mitgliedschaft"
msgstr "Deine Mitgliedschaft"
#: pretix/presale/templates/pretixpresale/organizers/customer_password.html:6
#: pretix/presale/templates/pretixpresale/organizers/customer_resetpw.html:6

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-24 08:20+0000\n"
"PO-Revision-Date: 2024-06-25 01:00+0000\n"
"PO-Revision-Date: 2024-07-19 08:56+0000\n"
"Last-Translator: Reece Needham <nouveaureece@protonmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
"pretix-js/es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5.5\n"
"X-Generator: Weblate 5.6.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -254,7 +254,7 @@ msgstr "Cancelar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket not paid"
msgstr "Ticket por pagar"
msgstr "Entrada no pagada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "This ticket is not yet paid. Do you want to continue anyways?"
@@ -274,7 +274,7 @@ msgstr "Salida registrada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
msgid "Ticket already used"
msgstr "Este ticket ya fue utilizado"
msgstr "Esta entrada ya fue utilizada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Information required"
@@ -282,11 +282,11 @@ msgstr "Información requerida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Unknown ticket"
msgstr "Ticket no encontrado"
msgstr "Entrada desconocida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
msgid "Ticket type not allowed here"
msgstr "Tipo de ticket no está permitido"
msgstr "Tipo de entrada no está permitido"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Entry not allowed"
@@ -294,19 +294,19 @@ msgstr "Entrada no permitida"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Ticket code revoked/changed"
msgstr "Código de ticket revocado/cambiado"
msgstr "Código de entrada revocada/cambiada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Ticket blocked"
msgstr "Ticket bloqueado"
msgstr "Entrada bloqueada"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Ticket not valid at this time"
msgstr "Ticket no válido en este momento"
msgstr "Entrada no válida en este momento"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order canceled"
msgstr "Orden cancelada"
msgstr "Pedido cancelado"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Ticket code is ambiguous on list"
@@ -591,7 +591,7 @@ msgstr "Objeto"
#: pretix/static/pretixcontrol/js/ui/editor.js:673
msgid "Ticket design"
msgstr "Diseño del ticket"
msgstr "Diseño del entrada"
#: pretix/static/pretixcontrol/js/ui/editor.js:972
msgid "Saving failed."

File diff suppressed because it is too large Load Diff

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-30 18:55+0000\n"
"PO-Revision-Date: 2024-04-19 23:00+0000\n"
"Last-Translator: Christiaan de Die le Clercq <contact@techwolf12.nl>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
">\n"
"PO-Revision-Date: 2024-07-11 02:00+0000\n"
"Last-Translator: Dirk-jan mollema <dirkjan@outsidersecurity.nl>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4.3\n"
"X-Generator: Weblate 5.6.1\n"
#: pretix/_base_settings.py:78
msgid "English"
@@ -25927,10 +25927,8 @@ msgstr "Voucherhistorie"
#: pretix/control/templates/pretixcontrol/vouchers/import_start.html:6
#: pretix/control/templates/pretixcontrol/vouchers/index.html:81
#: pretix/control/templates/pretixcontrol/vouchers/index.html:94
#, fuzzy
#| msgid "Import mode"
msgid "Import vouchers"
msgstr "Importmodus"
msgstr "Importeer vouchers"
#: pretix/control/templates/pretixcontrol/vouchers/index.html:10
msgid ""
@@ -33194,10 +33192,8 @@ msgid "There are no add-ons available for this product."
msgstr "Er zijn geen add-ons beschikbaar voor dit product."
#: pretix/presale/templates/pretixpresale/event/fragment_availability.html:6
#, fuzzy
#| msgid "Enter a voucher code below to buy this ticket."
msgid "Enter a voucher code below to buy this product."
msgstr "Voer hieronder een vouchercode in om dit ticket te kopen."
msgstr "Voer hieronder een vouchercode in om dit product te kopen."
#: pretix/presale/templates/pretixpresale/event/fragment_availability.html:10
#, fuzzy

File diff suppressed because it is too large Load Diff

View File

@@ -1585,7 +1585,7 @@ class StripeBancontact(StripeRedirectWithAccountNamePaymentIntentMethod):
return super().payment_presale_render(payment)
class StripeSofort(StripeMethod):
class StripeSofort(StripeRedirectMethod):
identifier = 'stripe_sofort'
verbose_name = _('SOFORT via Stripe')
public_name = _('SOFORT (instant bank transfer)')

View File

@@ -85,7 +85,7 @@ from pretix.presale.forms.customer import AuthenticationForm, RegistrationForm
from pretix.presale.signals import (
checkout_all_optional, checkout_confirm_messages, checkout_flow_steps,
contact_form_fields, contact_form_fields_overrides,
order_meta_from_request, question_form_fields,
order_api_meta_from_request, order_meta_from_request, question_form_fields,
question_form_fields_overrides,
)
from pretix.presale.utils import customer_login
@@ -1544,11 +1544,14 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
str(m) for m in self.confirm_messages.values()
]
}
api_meta = {}
unlock_hashes = request.session.get('pretix_unlock_hashes', [])
if unlock_hashes:
meta_info['unlock_hashes'] = unlock_hashes
for receiver, response in order_meta_from_request.send(sender=request.event, request=request):
meta_info.update(response)
for receiver, response in order_api_meta_from_request.send(sender=request.event, request=request):
api_meta.update(response)
return self.do(
self.request.event.id,
@@ -1562,6 +1565,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
shown_total=self.cart_session.get('shown_total'),
customer=self.cart_session.get('customer'),
override_now_dt=time_machine_now(default=None),
api_meta=api_meta,
)
def get_success_message(self, value):

View File

@@ -174,3 +174,11 @@ class CheckoutFieldRenderer(FieldRenderer):
else:
attrs = ''
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
def wrap_widget(self, html):
if isinstance(self.widget, CheckboxInput):
css_class = "checkbox"
if self.field.field.disabled:
css_class += " disabled"
html = f'<div class="{css_class}">{html}</div>'
return html

View File

@@ -170,6 +170,17 @@ You will receive the request triggering the order creation as the ``request`` ke
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
order_api_meta_from_request = EventPluginSignal()
"""
Arguments: ``request``
This signal is sent before an order is created through the pretixpresale frontend. It allows you
to return a dictionary that will be merged in the api_meta attribute of the order.
You will receive the request triggering the order creation as the ``request`` keyword argument.
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
"""
checkout_confirm_page_content = EventPluginSignal()
"""
Arguments: ``request``

View File

@@ -179,7 +179,7 @@ class TicketPageMixin:
can_download = can_download and self.order.ticket_download_available
ctx['download_email_required'] = can_download and (
self.request.event.settings.ticket_download_require_validated_email and
self.order.sales_channel == 'web' and
self.order.sales_channel.type == 'web' and
not self.order.email_known_to_work
)
ctx['can_download'] = can_download and not ctx['download_email_required']
@@ -1106,7 +1106,7 @@ class OrderDownloadMixin:
if (
self.request.event.settings.ticket_download_require_validated_email and
self.order.sales_channel == 'web' and
self.order.sales_channel.type == 'web' and
not self.order.email_known_to_work
):
return self.error(OrderError(_('Please click the link we sent you via email to download your tickets.')))

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"scripts": {},
"dependencies": {
"@babel/core": "^7.24.7",
"@babel/preset-env": "^7.24.6",
"@babel/preset-env": "^7.24.7",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^15.2.3",
"vue": "^2.7.16",

View File

@@ -781,7 +781,7 @@ function setup_basics(el) {
scrollTarget.id = "panel_" + $("input", scrollTarget).attr("id");
}
} else {
label = $("label", this).first().text();
label = $("label", this).first().contents().filter(function () { return this.nodeType != Node.ELEMENT_NODE || !this.classList.contains("optional") }).text();
description = $(".help-block", this).first().text();
scrollTarget = $(":input", this).get(0);
}

View File

@@ -767,9 +767,11 @@ h1 .label {
.plugin-container {
flex-basis: 100%;
flex-shrink: 0;
border-top: 1px solid #ccc;
padding-top: 15px;
}
.plugin-container:not(.featured-plugin) + .plugin-container {
border-top: 1px solid #ccc;
}
h4 {
margin-top: 0;
}

View File

@@ -380,23 +380,28 @@ $(function () {
" #id_city, #id_country, #id_state").change(function () {
if (copy_to_first_ticket) {
var $first_ticket_form = $(".questions-form").first().find("[data-addonidx=0]");
$first_ticket_form.find("input[id*=attendee_email]").val($("#id_email").val());
$first_ticket_form.find("input[id$=company]").val($("#id_company").val());
$first_ticket_form.find("textarea[id$=street]").val($("#id_street").val());
$first_ticket_form.find("input[id$=zipcode]").val($("#id_zipcode").val());
$first_ticket_form.find("input[id$=city]").val($("#id_city").val());
$first_ticket_form.find("select[id$=state]").val($("#id_state").val());
if ($first_ticket_form.find("select[id$=country]").val() !== $("#id_country").val()) {
$first_ticket_form.find("select[id$=country]").val($("#id_country").val()).trigger('change');
$first_ticket_form.find("[id$=" + this.id.substring(3) + "]").val(this.value);
if (this.placeholder) {
$first_ticket_form.find("[placeholder='" + this.placeholder + "']").val(this.value);
}
var label = $("label[for=" + this.id +"]").first().contents().filter(function () {
return this.nodeType != Node.ELEMENT_NODE || !this.classList.contains("sr-only");
}).text().trim();
if (label) {
// match to placeholder and label
$first_ticket_form.find("[placeholder='" + label + "']").val(this.value);
var v = this.value;
$first_ticket_form.find("label").each(function() {
var text = $(this).first().contents().filter(function () {
return this.nodeType != Node.ELEMENT_NODE || !this.classList.contains("sr-only");
}).text().trim();
if (text == label) {
$("#" + this.getAttribute("for")).val(v);
}
});
}
$first_ticket_form.find("[id*=attendee_name_parts]").each(function () {
var parts = $(this).attr("id").split("_");
var num = parts[parts.length - 1];
$(this).val($("#id_name_parts_" + num).val());
});
}
});
}).trigger("change");
attendee_address_fields.change(function () {
copy_to_first_ticket = false;
});

View File

@@ -33,6 +33,7 @@ filterwarnings =
ignore::DeprecationWarning:django
ignore::DeprecationWarning:cgi
ignore::DeprecationWarning:vat_moss
ignore::cryptography.utils.CryptographyDeprecationWarning:pypdf
ignore:.*ast.NameConstant.*:DeprecationWarning:reportlab
ignore:.*utcnow.*:DeprecationWarning:
ignore:.*PyType_Spec.*:DeprecationWarning:

View File

@@ -255,6 +255,9 @@ def test_order_update_allowed_fields(token_client, organizer, event, order):
organizer.slug, event.slug, order.code
), format='json', data={
'comment': 'Here is a comment',
'api_meta': {
'test': 1
},
'valid_if_pending': True,
'custom_followup_at': '2021-06-12',
'checkin_attention': True,
@@ -280,6 +283,9 @@ def test_order_update_allowed_fields(token_client, organizer, event, order):
assert resp.status_code == 200
order.refresh_from_db()
assert order.comment == 'Here is a comment'
assert order.api_meta == {
'test': 1
}
assert order.custom_followup_at.isoformat() == '2021-06-12'
assert order.checkin_attention
assert order.checkin_text == 'foobar'

View File

@@ -232,6 +232,9 @@ def test_order_create(token_client, organizer, event, item, quota, question):
with scopes_disabled():
customer = organizer.customers.create()
res['customer'] = customer.identifier
res['api_meta'] = {
'test': 1
}
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
@@ -251,6 +254,9 @@ def test_order_create(token_client, organizer, event, item, quota, question):
assert o.valid_if_pending
assert o.expires > now()
assert not o.testmode
assert o.api_meta == {
'test': 1
}
with scopes_disabled():
p = o.payments.first()
@@ -421,6 +427,7 @@ def test_order_create_simulate(token_client, organizer, event, item, quota, ques
],
'total': '21.75',
'comment': '',
'api_meta': {},
"custom_followup_at": None,
'invoice_address': {
'is_business': False,

View File

@@ -291,6 +291,7 @@ TEST_ORDER_RES = {
"payment_provider": "banktransfer",
"total": "23.00",
"comment": "",
"api_meta": {},
"custom_followup_at": None,
"checkin_attention": False,
"checkin_text": None,

View File

@@ -60,6 +60,11 @@ def test_hook_list(token_client, organizer, event, webhook):
assert resp.status_code == 200
assert [res] == resp.data['results']
resp = token_client.get('/api/v1/organizers/{}/webhooks/?enabled=true'.format(organizer.slug))
assert [res] == resp.data['results']
resp = token_client.get('/api/v1/organizers/{}/webhooks/?enabled=false'.format(organizer.slug))
assert [] == resp.data['results']
@pytest.mark.django_db
def test_hook_detail(token_client, organizer, event, webhook):

View File

@@ -272,4 +272,3 @@ def test_csv_order_by_orderdatetime(event):
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","","No","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test","'+498912345678","","","2019-02-22","14:00:00","No","","meow","","","","","","","","","","","","",""
""")