forked from CGM_Public/pretix_original
Compare commits
69 Commits
fix-tests
...
api-webhoo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1226de8d2f | ||
|
|
c0d7630eae | ||
|
|
8fe136b374 | ||
|
|
f055a598ce | ||
|
|
9138464896 | ||
|
|
479f51a84c | ||
|
|
a3ac54d419 | ||
|
|
b2841e5c61 | ||
|
|
3009f50d51 | ||
|
|
ff3a49ab2a | ||
|
|
19f3fbc7e8 | ||
|
|
bb9b9ac9aa | ||
|
|
d7f6befb5b | ||
|
|
2287be2009 | ||
|
|
0480b6873d | ||
|
|
711f08c9e8 | ||
|
|
d18914fcca | ||
|
|
2411144262 | ||
|
|
2f02d35a52 | ||
|
|
71e82fda81 | ||
|
|
ca3802da90 | ||
|
|
2c68b9e895 | ||
|
|
01092498f4 | ||
|
|
fd841ed66d | ||
|
|
04cbccb536 | ||
|
|
b8ea93de1e | ||
|
|
c49f42301c | ||
|
|
2ae0a16e67 | ||
|
|
6b06fdf822 | ||
|
|
ea3f4e5f62 | ||
|
|
d71c23f7e0 | ||
|
|
5ed7b0032b | ||
|
|
a77f2d01a7 | ||
|
|
ca4f511cde | ||
|
|
83b1c2ea7e | ||
|
|
c91eb2e20d | ||
|
|
bfb480a288 | ||
|
|
22e2143623 | ||
|
|
9e61f7f978 | ||
|
|
092de9e3c4 | ||
|
|
f0822d3c27 | ||
|
|
6fc47ca3b6 | ||
|
|
3716a686f5 | ||
|
|
9c0c77958e | ||
|
|
6154a44274 | ||
|
|
d5aff10297 | ||
|
|
846e39a652 | ||
|
|
75d37b2a37 | ||
|
|
2a0c3da8c4 | ||
|
|
fb7f4d1160 | ||
|
|
5c8817f0c3 | ||
|
|
7663bf7994 | ||
|
|
ea8f74f8aa | ||
|
|
7b34701449 | ||
|
|
06f4bfea24 | ||
|
|
e2862a98a0 | ||
|
|
82f4feadc3 | ||
|
|
906222c7d3 | ||
|
|
7ce2089ca8 | ||
|
|
2133584ed2 | ||
|
|
c3c50d7205 | ||
|
|
4f7a41a4b2 | ||
|
|
93fd79ab33 | ||
|
|
59595c2f10 | ||
|
|
91c6d09f0b | ||
|
|
570a818129 | ||
|
|
d63e2ebe2d | ||
|
|
884c97d62a | ||
|
|
032e958a00 |
1
.github/workflows/tests.yml
vendored
1
.github/workflows/tests.yml
vendored
@@ -5,7 +5,6 @@ on:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'doc/**'
|
||||
- 'src/pretix/locale/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
""""""""""""
|
||||
|
||||
105
doc/plugins/getyourguide.rst
Normal file
105
doc/plugins/getyourguide.rst
Normal 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
|
||||
@@ -25,3 +25,4 @@ If you want to **create** a plugin, please go to the
|
||||
webinar
|
||||
presale-saml
|
||||
kulturpass
|
||||
getyourguide
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
sphinx==7.3.*
|
||||
sphinx==7.4.*
|
||||
jinja2==3.1.*
|
||||
sphinx-rtd-theme
|
||||
sphinxcontrib-httpdomain
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-e ../
|
||||
sphinx==7.3.*
|
||||
sphinx==7.4.*
|
||||
jinja2==3.1.*
|
||||
sphinx-rtd-theme
|
||||
sphinxcontrib-httpdomain
|
||||
|
||||
@@ -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 widget’s
|
||||
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
|
||||
-----------------------------------------
|
||||
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
18
src/pretix/base/migrations/0269_order_api_meta.py
Normal file
18
src/pretix/base/migrations/0269_order_api_meta.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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': {
|
||||
|
||||
@@ -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__'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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."
|
||||
|
||||
30238
src/pretix/locale/eu/LC_MESSAGES/django.po
Normal file
30238
src/pretix/locale/eu/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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)')
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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``
|
||||
|
||||
@@ -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.')))
|
||||
|
||||
1540
src/pretix/static/npm_dir/package-lock.json
generated
1540
src/pretix/static/npm_dir/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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","","","","","","","","","","","","",""
|
||||
""")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user