mirror of
https://github.com/pretix/pretix.git
synced 2025-12-27 17:42:27 +00:00
Compare commits
97 Commits
subevent-e
...
api-expand
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5139eeb03b | ||
|
|
a7edb16fc0 | ||
|
|
f6df03c427 | ||
|
|
308eac20b2 | ||
|
|
ab3c03b278 | ||
|
|
161404f152 | ||
|
|
8b119b329c | ||
|
|
512ca1966d | ||
|
|
90ec82ea1a | ||
|
|
d55f411989 | ||
|
|
40855e14d9 | ||
|
|
7bb2e4c170 | ||
|
|
dec07b2df1 | ||
|
|
9fc9aaa661 | ||
|
|
70f71c8077 | ||
|
|
dc198d4ab6 | ||
|
|
fdbb03d038 | ||
|
|
8418d03add | ||
|
|
b5f8438c18 | ||
|
|
5420f57aa2 | ||
|
|
b5e20df508 | ||
|
|
eba5c1b36d | ||
|
|
7d30ecf527 | ||
|
|
2359307462 | ||
|
|
325f7c565d | ||
|
|
df48adef1b | ||
|
|
74cea09f6c | ||
|
|
e8abe5cad8 | ||
|
|
6c9f66487d | ||
|
|
5f828127bf | ||
|
|
c5b3093f20 | ||
|
|
ae4073b3e4 | ||
|
|
362ac8de6f | ||
|
|
cced9cd768 | ||
|
|
dfb45e13ca | ||
|
|
23489f50f8 | ||
|
|
80148a8435 | ||
|
|
9f49b7747c | ||
|
|
b75f8bf893 | ||
|
|
d53af424cf | ||
|
|
24c02751cc | ||
|
|
2f7a00e660 | ||
|
|
767b01be9a | ||
|
|
f9acefc0f9 | ||
|
|
234a3d0db1 | ||
|
|
b7228ff5b8 | ||
|
|
053c713a2a | ||
|
|
6959dca7c1 | ||
|
|
87312c9d8a | ||
|
|
4b697b9244 | ||
|
|
cc55aba2e6 | ||
|
|
fbbc6502f3 | ||
|
|
62b3af2197 | ||
|
|
177717d594 | ||
|
|
2f2991105a | ||
|
|
d03af3ce06 | ||
|
|
6b95bfbc96 | ||
|
|
0f4d5b639d | ||
|
|
53ebee37fe | ||
|
|
572973b5c0 | ||
|
|
ab72abea0a | ||
|
|
c53fc8df4e | ||
|
|
87fb3d2df8 | ||
|
|
6aa3747403 | ||
|
|
d255c40a0b | ||
|
|
f600200ec6 | ||
|
|
3f9b52ad0c | ||
|
|
36c0acc574 | ||
|
|
ac2f2e073e | ||
|
|
75215b64e1 | ||
|
|
54e109251c | ||
|
|
3180bd8a6e | ||
|
|
c271c6dea8 | ||
|
|
3a48279b22 | ||
|
|
0ee451560a | ||
|
|
f0c95c4b03 | ||
|
|
5866162932 | ||
|
|
f9c0baf369 | ||
|
|
d97f203d70 | ||
|
|
0ef5385b99 | ||
|
|
66a4a34383 | ||
|
|
1752b2f037 | ||
|
|
e6dd24b9d5 | ||
|
|
2c7196d996 | ||
|
|
99e69ef4a6 | ||
|
|
03ce0d6817 | ||
|
|
509500f100 | ||
|
|
165410c2f5 | ||
|
|
875da30238 | ||
|
|
df1be0bf86 | ||
|
|
25605d294b | ||
|
|
0877da3c58 | ||
|
|
f9d1a89950 | ||
|
|
1fb29bbe85 | ||
|
|
e01b8251ce | ||
|
|
295c043375 | ||
|
|
001780e4a0 |
@@ -203,9 +203,35 @@ Query parameters
|
||||
Most list endpoints allow a filtering of the results using query parameters. In this case, booleans should be passed
|
||||
as the string values ``true`` and ``false``.
|
||||
|
||||
Ordering
|
||||
--------
|
||||
|
||||
If the ``ordering`` parameter is documented for a resource, you can use it to sort the result set by one of the allowed
|
||||
fields. Prepend a ``-`` to the field name to reverse the sort order.
|
||||
|
||||
Filtering and expanding fields
|
||||
------------------------------
|
||||
|
||||
On many endpoints, you can modify what fields are being returned:
|
||||
|
||||
- Using the ``include`` query parameter, you can chose which fields will be returned as part of the response.
|
||||
For example, if you pass ``include=code&include=email`` to the list of orders, you will receive a list of only
|
||||
order codes and email addresses.
|
||||
|
||||
- Using the ``exclude`` query parameter, you can chose which fields will not be returned as part of the response.
|
||||
For example, if you pass ``exclude=payments&exclude=refunds`` to the list of orders, you will receive a list
|
||||
without the payment and refund objects.
|
||||
|
||||
- Using the ``expand`` query parameter, you can chose which fields will be expanded into full objects. For example,
|
||||
if you pass ``expand=voucher`` to the list of order positions, the response will contain a full voucher object
|
||||
instead of just the ID. If you do not have permission to view vouchers, a 403 status code is returned.
|
||||
For performance reasons, this option is only available for a limited number of fields that are noted as
|
||||
"expandable" in the documentation of the respective object.
|
||||
|
||||
In all of these, you can use dotted notation to address fields of sub-objects, such as ``positions.checkins.gate``.
|
||||
|
||||
These options are not available everywhere as we are slowly rolling them out throughout the codebase. Please check
|
||||
the individual endpoint documentation for availability.
|
||||
|
||||
Idempotency
|
||||
-----------
|
||||
|
||||
@@ -48,11 +48,6 @@ seat objects The assigned se
|
||||
└ seat_guid string Identifier of the seat within the seating plan
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.14
|
||||
|
||||
This ``is_bundled`` attribute has been added and the cart creation endpoints have been updated.
|
||||
|
||||
|
||||
Cart position endpoints
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -9,14 +9,6 @@ This page describes special APIs built for ticket scanning apps. For managing ch
|
||||
please also see :ref:`rest-checkinlists`. The check-in list API also contains endpoints to obtain statistics or log
|
||||
failed scans.
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
The endpoints listed on this page have been added.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``source_type`` parameter has been added.
|
||||
|
||||
.. _`rest-checkin-redeem`:
|
||||
|
||||
Checking a ticket in
|
||||
|
||||
@@ -40,10 +40,6 @@ ignore_in_statistics boolean If ``true``, ch
|
||||
consider_tickets_used boolean If ``true`` (default), tickets checked in on this list will be considered "used" by other functionality, i.e. when checking if they can still be canceled.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
The ``addon_match`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 2023.9
|
||||
|
||||
The ``ignore_in_statistics`` and ``consider_tickets_used`` attributes have been added.
|
||||
|
||||
@@ -34,12 +34,6 @@ password string Can only be set
|
||||
not be included in any responses.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionadded:: 4.0
|
||||
|
||||
.. versionchanged:: 4.3
|
||||
|
||||
Passwords can now be set through the API during customer creation.
|
||||
|
||||
.. versionchanged:: 2024.3
|
||||
|
||||
The attribute ``phone`` has been added.
|
||||
|
||||
@@ -61,25 +61,6 @@ public_url string The public, cus
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The ``clone_from`` parameter has been added to the event creation endpoint.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability_for`` parameter has been added.
|
||||
|
||||
The ``search`` query parameter has been added to filter events by their slug, name, or location in any language.
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``public_url`` field has been added.
|
||||
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
|
||||
added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/
|
||||
|
||||
Returns a list of all events within a given organizer the authenticated user/token has access to.
|
||||
@@ -171,6 +152,8 @@ Endpoints
|
||||
and ``null`` for "status unknown". These values might be served from a cache. This parameter can make the response
|
||||
slow.
|
||||
:query search: Only return events matching a given search query.
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:param organizer: The ``slug`` field of a valid organizer
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
@@ -242,6 +225,8 @@ Endpoints
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:param event: The ``slug`` field of the event to fetch
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.
|
||||
@@ -630,10 +615,6 @@ organizer level.
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``readonly`` flag has been added.
|
||||
|
||||
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/settings/
|
||||
|
||||
Updates event settings. Note that ``PUT`` is not allowed here, only ``PATCH``.
|
||||
|
||||
@@ -47,11 +47,6 @@ acceptor string Organizer slug
|
||||
this field was added.)
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.20
|
||||
|
||||
The ``owner_ticket`` and ``issuer`` attributes of the gift card and the ``info`` and ``acceptor`` attributes of the
|
||||
gift card transaction resource have been added.
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
|
||||
@@ -111,18 +111,6 @@ internal_reference string Customer's refe
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The attributes ``fee_type`` and ``fee_internal_type`` have been added.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The attribute ``lines.event_location`` has been added.
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The attribute ``lines.subevent`` has been added.
|
||||
|
||||
.. versionchanged:: 2023.8
|
||||
|
||||
The ``event`` attribute has been added. The organizer-level endpoint has been added.
|
||||
|
||||
@@ -64,10 +64,6 @@ hide_without_voucher boolean If ``true``, th
|
||||
meta_data object Values set for event-specific meta data parameters.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``meta_data`` and ``checkin_attention`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.10
|
||||
|
||||
The ``free_price_suggestion`` attribute has been added.
|
||||
|
||||
@@ -19,7 +19,7 @@ name multi-lingual string The item's vi
|
||||
internal_name string An optional name that is only used in the backend
|
||||
default_price money (string) The item price that is applied if the price is not
|
||||
overwritten by variations or other options.
|
||||
category integer The ID of the category this item belongs to
|
||||
category integer (expandable) The ID of the category this item belongs to
|
||||
(or ``null``).
|
||||
active boolean If ``false``, the item is hidden from all public lists
|
||||
and will not be sold.
|
||||
@@ -33,7 +33,7 @@ free_price_suggestion money (string) A suggested p
|
||||
``free_price`` is set (or ``null``).
|
||||
tax_rate decimal (string) The VAT rate to be applied for this item (read-only,
|
||||
set through ``tax_rule``).
|
||||
tax_rule integer The internal ID of the applied tax rule (or ``null``).
|
||||
tax_rule integer (expandable) The internal ID of the applied tax rule (or ``null``).
|
||||
admission boolean ``true`` for items that grant admission to the event
|
||||
(such as primary tickets) and ``false`` for others
|
||||
(such as add-ons or merchandise).
|
||||
@@ -211,28 +211,6 @@ bundles list of objects Definition of
|
||||
meta_data object Values set for event-specific meta data parameters.
|
||||
======================================= ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The attributes ``require_membership``, ``require_membership_types``, ``grant_membership_type``, ``grant_membership_duration_like_event``,
|
||||
``grant_membership_duration_days`` and ``grant_membership_duration_months`` have been added.
|
||||
|
||||
.. versionchanged:: 4.4
|
||||
|
||||
The attributes ``require_membership_hidden`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``variations[x].meta_data`` and ``variations[x].checkin_attention`` attributes have been added.
|
||||
The ``personalized`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``validity_*`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``media_policy`` and ``media_type`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.10
|
||||
|
||||
The ``checkin_text`` and ``variations[x].checkin_text`` attributes have been added.
|
||||
@@ -412,6 +390,9 @@ Endpoints
|
||||
will be returned.
|
||||
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
|
||||
Default: ``position``
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:query string expand: Expand an object reference with the referenced object. Can be passed multiple times.
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:param event: The ``slug`` field of the event to fetch
|
||||
:statuscode 200: no error
|
||||
@@ -553,6 +534,9 @@ Endpoints
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:param event: The ``slug`` field of the event to fetch
|
||||
:param id: The ``id`` field of the item to fetch
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:query string expand: Expand an object reference with the referenced object. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource.
|
||||
|
||||
@@ -114,34 +114,6 @@ plugin_data object Additional data
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.0
|
||||
|
||||
The ``customer`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``custom_followup_at`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.4
|
||||
|
||||
The ``item`` and ``variation`` query parameters have been added.
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The ``subevent`` query parameters has been added.
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
The ``order.fees.id`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 4.15
|
||||
|
||||
The ``include`` query parameter has been added.
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The ``valid_if_pending`` attribute has been added.
|
||||
|
||||
.. versionchanged:: 2023.8
|
||||
|
||||
The ``event`` attribute has been added. The organizer-level endpoint has been added.
|
||||
@@ -185,8 +157,8 @@ order string Order code of t
|
||||
positionid integer Number of the position within the order
|
||||
canceled boolean Whether or not this position has been canceled. Note that
|
||||
by default, only non-canceled positions are shown.
|
||||
item integer ID of the purchased item
|
||||
variation integer ID of the purchased variation (or ``null``)
|
||||
item integer (expandable) ID of the purchased item
|
||||
variation integer (expandable) ID of the purchased variation (or ``null``)
|
||||
price money (string) Price of this position
|
||||
attendee_name string Specified attendee name for this position (or ``null``)
|
||||
attendee_name_parts object of strings Decomposition of attendee name (i.e. given name, family name)
|
||||
@@ -198,7 +170,7 @@ city string Attendee city (
|
||||
country string Attendee country code (or ``null``)
|
||||
state string Attendee state (ISO 3166-2 code). Only supported in
|
||||
AU, BR, CA, CN, MY, MX, and US, otherwise ``null``.
|
||||
voucher integer Internal ID of the voucher used for this position (or ``null``)
|
||||
voucher integer (expandable) Internal ID of the voucher used for this position (or ``null``)
|
||||
voucher_budget_use money (string) Amount of money discounted by the voucher, corresponding
|
||||
to how much of the ``budget`` of the voucher is consumed.
|
||||
**Important:** Do not rely on this amount to be a useful
|
||||
@@ -210,7 +182,7 @@ tax_code string Codified reason
|
||||
tax_rule integer The ID of the used tax rule (or ``null``)
|
||||
secret string Secret code printed on the tickets for validation
|
||||
addon_to integer Internal ID of the position this position is an add-on for (or ``null``)
|
||||
subevent integer ID of the date inside an event series this position belongs to (or ``null``).
|
||||
subevent integer (expandable) ID of the date inside an event series this position belongs to (or ``null``).
|
||||
discount integer ID of a discount that has been used during the creation of this position in some way (or ``null``).
|
||||
blocked list of strings A list of strings, or ``null``. Whenever not ``null``, the ticket may not be used (e.g. for check-in).
|
||||
valid_from datetime The ticket will not be valid before this time. Can be ``null``.
|
||||
@@ -260,10 +232,6 @@ pdf_data object Data object req
|
||||
plugin_data object Additional data added by plugins.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.16
|
||||
|
||||
The attributes ``blocked``, ``valid_from`` and ``valid_until`` have been added.
|
||||
|
||||
.. versionchanged:: 2024.9
|
||||
|
||||
The attribute ``print_logs`` has been added.
|
||||
@@ -756,10 +724,6 @@ Fetching individual orders
|
||||
Order ticket download
|
||||
---------------------
|
||||
|
||||
.. versionchanged:: 4.10
|
||||
|
||||
The API now supports ticket downloads for pending orders if allowed by the event settings.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/download/(output)/
|
||||
|
||||
Download tickets for an order, identified by its order code. Depending on the chosen output, the response might
|
||||
@@ -1095,9 +1059,10 @@ Creating orders
|
||||
prices. Note that this will not include other fees and is calculated once during order generation and will not
|
||||
be respected automatically when the order changes later.)
|
||||
* ``_split_taxes_like_products`` (Optional convenience flag. If set to ``true``, your ``tax_rule`` will be ignored
|
||||
and the fee will be taxed like the products in the order. If the products have multiple tax rates, multiple fees
|
||||
will be generated with weights adjusted to the net price of the products. Note that this will be calculated once
|
||||
during order generation and is not respected automatically when the order changes later.)
|
||||
and the fee will be taxed like the products in the order *unless* the total amount of the positions is zero.
|
||||
If the products have multiple tax rates, multiple fees will be generated with weights adjusted to the net price
|
||||
of the products. Note that this will be calculated once during order generation and is not respected automatically
|
||||
when the order changes later.)
|
||||
|
||||
* ``force`` (optional). If set to ``true``, quotas will be ignored.
|
||||
* ``send_email`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of
|
||||
@@ -1832,10 +1797,6 @@ Fetching individual positions
|
||||
Order position ticket download
|
||||
------------------------------
|
||||
|
||||
.. versionchanged:: 4.10
|
||||
|
||||
The API now supports ticket downloads for pending orders if allowed by the event settings.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/orderpositions/(id)/download/(output)/
|
||||
|
||||
Download tickets for one order position, identified by its internal ID.
|
||||
@@ -1888,15 +1849,6 @@ Order position ticket download
|
||||
Manipulating individual positions
|
||||
---------------------------------
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
The ``PATCH`` method now supports changing items, variations, subevents, seats, prices, and tax rules.
|
||||
The ``POST`` endpoint to add individual positions has been added.
|
||||
|
||||
.. versionadded:: 4.16
|
||||
|
||||
The endpoints to manage blocks have been added.
|
||||
|
||||
.. versionchanged:: 2024.9
|
||||
|
||||
The API now supports logging ticket and badge prints.
|
||||
@@ -2226,10 +2178,6 @@ multiple changes to an order at once within one transaction. This makes it possi
|
||||
attendees in an order without running into conflicts. This interface also offers some possibilities not available
|
||||
otherwise, such as splitting an order or changing fees.
|
||||
|
||||
.. versionchanged:: 4.8
|
||||
|
||||
This endpoint has been added to the system.
|
||||
|
||||
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/orders/(code)/change/
|
||||
|
||||
Performs a change operation on an order. You can supply the following fields:
|
||||
|
||||
@@ -25,10 +25,6 @@ public_url string The public, cus
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.17
|
||||
|
||||
The ``public_url`` field has been added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/
|
||||
|
||||
Returns a list of all organizers the authenticated user/token has access to.
|
||||
@@ -65,6 +61,8 @@ Endpoints
|
||||
:query page: The page number in case of a multi-page result set, default is 1
|
||||
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``slug`` and
|
||||
``name``. Default: ``slug``.
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
|
||||
@@ -95,6 +93,8 @@ Endpoints
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
|
||||
|
||||
@@ -36,11 +36,6 @@ available_number integer Number of avail
|
||||
slightly out of date. ``null`` means unlimited.
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability`` query parameter has been added.
|
||||
|
||||
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
@@ -86,7 +81,8 @@ Endpoints
|
||||
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``.
|
||||
Default: ``position``
|
||||
:query integer subevent: Only return quotas of the sub-event with the given ID.
|
||||
:query integer subevent__in: Only return quotas of sub-events with one the given IDs (comma-separated).
|
||||
:query integer subevent__in: Only return quotas of sub-events with one of the given IDs (comma-separated).
|
||||
:query integer items__in: Only return quotas that include a product with one of the given IDs (comma-separated).
|
||||
:query string with_availability: Set to ``true`` to get availability information. Can lead to increased answer times.
|
||||
:param organizer: The ``slug`` field of the organizer to fetch
|
||||
:param event: The ``slug`` field of the event to fetch
|
||||
|
||||
@@ -6,10 +6,6 @@ Data shredders
|
||||
pretix and it's plugins include a number of data shredders that allow you to clear personal information from the system.
|
||||
This page shows you how to use these shredders through the API.
|
||||
|
||||
.. versionchanged:: 4.12
|
||||
|
||||
This feature has been added to the API.
|
||||
|
||||
.. warning::
|
||||
|
||||
Unlike the user interface, the API will not force you to download tax-relevant data before you delete it.
|
||||
|
||||
@@ -59,15 +59,6 @@ seat_category_mapping object An object mappi
|
||||
last_modified datetime Last modification of this object
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.15
|
||||
|
||||
The ``search`` query parameter has been added to filter sub-events by their name or location in any language.
|
||||
|
||||
.. versionchanged:: 5.0
|
||||
|
||||
The ``date_from_before``, ``date_from_after``, ``date_to_before``, and ``date_to_after`` query parameters have been
|
||||
added.
|
||||
|
||||
.. versionchanged:: 2023.8.0
|
||||
|
||||
For the organizer-wide endpoint, the ``search`` query parameter has been modified to filter sub-events by their parent events slug too.
|
||||
@@ -75,10 +66,6 @@ last_modified datetime Last modificati
|
||||
Endpoints
|
||||
---------
|
||||
|
||||
.. versionchanged:: 4.1
|
||||
|
||||
The ``with_availability_for`` parameter has been added.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/
|
||||
|
||||
Returns a list of all sub-events of an event.
|
||||
@@ -159,10 +146,70 @@ Endpoints
|
||||
attribute with values of 100 for "tickets available", values less than 100 for "tickets sold out or reserved",
|
||||
and ``null`` for "status unknown". These values might be served from a cache. This parameter can make the response
|
||||
slow.
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to view it.
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/(id)/
|
||||
|
||||
Returns information on one sub-event, identified by its ID.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/1/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Vary: Accept
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"name": {"en": "First Sample Conference"},
|
||||
"event": "sampleconf",
|
||||
"active": false,
|
||||
"is_public": true,
|
||||
"date_from": "2017-12-27T10:00:00Z",
|
||||
"date_to": null,
|
||||
"date_admission": null,
|
||||
"presale_start": null,
|
||||
"presale_end": null,
|
||||
"location": null,
|
||||
"geo_lat": null,
|
||||
"geo_lon": null,
|
||||
"seating_plan": null,
|
||||
"seat_category_mapping": {},
|
||||
"item_price_overrides": [
|
||||
{
|
||||
"item": 2,
|
||||
"disabled": false,
|
||||
"available_from": null,
|
||||
"available_until": null,
|
||||
"price": "12.00"
|
||||
}
|
||||
],
|
||||
"variation_price_overrides": [],
|
||||
"meta_data": {}
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of a valid organizer
|
||||
:param event: The ``slug`` field of the main event
|
||||
:param id: The ``id`` field of the sub-event to fetch
|
||||
:query string include: Limit the output to the given field. Can be passed multiple times.
|
||||
:query string exclude: Exclude a field from the output. Can be passed multiple times.
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.
|
||||
|
||||
.. http:post:: /api/v1/organizers/(organizer)/events/(event)/subevents/
|
||||
|
||||
Creates a new subevent.
|
||||
@@ -250,63 +297,6 @@ Endpoints
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer does not exist **or** you have no permission to create this resource.
|
||||
|
||||
|
||||
.. http:get:: /api/v1/organizers/(organizer)/events/(event)/subevents/(id)/
|
||||
|
||||
Returns information on one sub-event, identified by its ID.
|
||||
|
||||
**Example request**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
GET /api/v1/organizers/bigevents/events/sampleconf/subevents/1/ HTTP/1.1
|
||||
Host: pretix.eu
|
||||
Accept: application/json, text/javascript
|
||||
|
||||
**Example response**:
|
||||
|
||||
.. sourcecode:: http
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Vary: Accept
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"name": {"en": "First Sample Conference"},
|
||||
"event": "sampleconf",
|
||||
"active": false,
|
||||
"is_public": true,
|
||||
"date_from": "2017-12-27T10:00:00Z",
|
||||
"date_to": null,
|
||||
"date_admission": null,
|
||||
"presale_start": null,
|
||||
"presale_end": null,
|
||||
"location": null,
|
||||
"geo_lat": null,
|
||||
"geo_lon": null,
|
||||
"seating_plan": null,
|
||||
"seat_category_mapping": {},
|
||||
"item_price_overrides": [
|
||||
{
|
||||
"item": 2,
|
||||
"disabled": false,
|
||||
"available_from": null,
|
||||
"available_until": null,
|
||||
"price": "12.00"
|
||||
}
|
||||
],
|
||||
"variation_price_overrides": [],
|
||||
"meta_data": {}
|
||||
}
|
||||
|
||||
:param organizer: The ``slug`` field of a valid organizer
|
||||
:param event: The ``slug`` field of the main event
|
||||
:param id: The ``id`` field of the sub-event to fetch
|
||||
:statuscode 200: no error
|
||||
:statuscode 401: Authentication failure
|
||||
:statuscode 403: The requested organizer/event does not exist **or** you have no permission to view it.
|
||||
|
||||
.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/subevents/(id)/
|
||||
|
||||
Updates a sub-event, identified by its ID. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to
|
||||
|
||||
@@ -40,10 +40,6 @@ custom_rules object Dynamic rules s
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
|
||||
.. versionchanged:: 4.6
|
||||
|
||||
The ``internal_name`` and ``keep_gross_if_rate_changes`` attributes have been added.
|
||||
|
||||
.. versionchanged:: 2023.6
|
||||
|
||||
The ``custom_rules`` attribute has been added.
|
||||
|
||||
@@ -39,10 +39,6 @@ can_change_vouchers boolean
|
||||
can_checkin_orders boolean
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
.. versionchanged:: 4.18
|
||||
|
||||
The ``can_manage_reusable_media`` permission has been added.
|
||||
|
||||
Team member resource
|
||||
--------------------
|
||||
|
||||
|
||||
@@ -178,13 +178,6 @@ You can then implement a view as you would normally do. It will be automatically
|
||||
* Your plugin is enabled
|
||||
* The locale is set correctly
|
||||
|
||||
.. versionchanged:: 1.7
|
||||
|
||||
The ``event_url()`` wrapper has been added in 1.7 to replace the former ``@event_view`` decorator. The
|
||||
``event_url()`` wrapper is optional and using ``url()`` still works, but you will not be able to set the
|
||||
``require_live`` setting any more via the decorator. The ``@event_view`` decorator is now deprecated and
|
||||
does nothing.
|
||||
|
||||
REST API viewsets
|
||||
-----------------
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ Contents:
|
||||
exporter
|
||||
ticketoutput
|
||||
payment
|
||||
payment_2.0
|
||||
email
|
||||
placeholder
|
||||
invoice
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
.. highlight:: python
|
||||
:linenothreshold: 5
|
||||
|
||||
.. _`payment2.0`:
|
||||
|
||||
Porting a payment provider from pretix 1.x to pretix 2.x
|
||||
========================================================
|
||||
|
||||
In pretix 2.x, we changed large parts of the payment provider API. This documentation details the changes we made
|
||||
and shows you how you can make an existing pretix 1.x payment provider compatible with pretix 2.x
|
||||
|
||||
Conceptual overview
|
||||
-------------------
|
||||
|
||||
In pretix 1.x, an order was always directly connected to a payment provider for the full life of an order. As long as
|
||||
an order was unpaid, this could still be changed in some cases, but once an order was paid, no changes to the payment
|
||||
provider were possible any more. Additionally, the internal state of orders allowed orders only to be fully paid or
|
||||
not paid at all. This leads to a couple of consequences:
|
||||
|
||||
* Payment-related functions (like "execute payment" or "do a refund") always operated on full orders.
|
||||
|
||||
* Changing the total of an order was basically impossible once an order was paid, since there was no concept of
|
||||
partial payments or partial refunds.
|
||||
|
||||
* Payment provider plugins needed to take complicated steps to detect cases that require human intervention, like e.g.
|
||||
|
||||
* An order has expired, no quota is left to revive it, but a payment has been received
|
||||
|
||||
* A payment has been received for a canceled order
|
||||
|
||||
* A payment has been received for an order that has already been paid with a different payment method
|
||||
|
||||
* An external payment service notified us of a refund/dispute
|
||||
|
||||
We noticed that we copied and repeated large portions of code in all our official payment provider plugins, just
|
||||
to deal with some of these cases.
|
||||
|
||||
* Sometimes, there is the need to mark an order as refunded within pretix, without automatically triggering a refund
|
||||
with an external API. Every payment method needed to implement a user interface for this independently.
|
||||
|
||||
* If a refund was not possible automatically, there was no way user to track which payments actually have been refunded
|
||||
manually and which are still left to do.
|
||||
|
||||
* When the payment with one payment provider failed and the user changed to a different payment provider, all
|
||||
information about the first payment was lost from the order object and could only be retrieved from order log data,
|
||||
which also made it hard to design a data shredder API to get rid of this data.
|
||||
|
||||
In pretix 2.x, we introduced two new models, :py:class:`OrderPayment <pretix.base.models.OrderPayment>` and
|
||||
:py:class:`OrderRefund <pretix.base.models.OrderRefund>`. Each instance of these is connected to an order and
|
||||
represents one single attempt to pay or refund a specific amount of money. Each one of these has an individual state,
|
||||
can individually fail or succeed, and carries an amount variable that can differ from the order total.
|
||||
|
||||
This has the following advantages:
|
||||
|
||||
* The system can now detect orders that are over- or underpaid, independent of the payment providers in use.
|
||||
|
||||
* Therefore, we can now allow partial payments, partial refunds, and changing paid orders, and automatically detect
|
||||
the cases listed above and notify the user.
|
||||
|
||||
Payment providers now interact with those payment and refund objects more than with orders.
|
||||
|
||||
Your to-do list
|
||||
---------------
|
||||
|
||||
Payment processing
|
||||
""""""""""""""""""
|
||||
|
||||
* The method ``BasePaymentProvider.order_pending_render`` has been removed and replaced by a new
|
||||
``BasePaymentProvider.payment_pending_render(request, payment)`` method that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* The method ``BasePaymentProvider.payment_form_render`` now receives a new ``total`` parameter.
|
||||
|
||||
* The method ``BasePaymentProvider.payment_perform`` has been removed and replaced by a new method
|
||||
``BasePaymentProvider.execute_payment(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* The function ``pretix.base.services.mark_order_paid`` has been removed, instead call ``payment.confirm()``
|
||||
on a pending ``OrderPayment`` object. If no further payments are required for this order, this will also
|
||||
mark the order as paid automatically. Note that ``payment.confirm()`` can still throw a ``QuotaExceededException``,
|
||||
however it will still mark the payment as complete (not the order!), so you should catch this exception and
|
||||
inform the user, but not abort the transaction.
|
||||
|
||||
* A new property ``BasePaymentProvider.abort_pending_allowed`` has been introduced. Only if set, the user will
|
||||
be able to retry a payment or switch the payment method when the order currently has a payment object in
|
||||
state ``"pending"``. This replaces ``BasePaymentProvider.order_can_retry``, which no longer exists.
|
||||
|
||||
* The methods ``BasePaymentProvider.retry_prepare`` and ``BasePaymentProvider.order_prepare`` have both been
|
||||
replaced by a new method ``BasePaymentProvider.payment_prepare(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``. **Keep in mind that this payment object might have an amount property that
|
||||
differs from the order total, if the order is already partially paid.**
|
||||
|
||||
* The method ``BasePaymentProvider.order_paid_render`` has been removed.
|
||||
|
||||
* The method ``BasePaymentProvider.order_control_render`` has been removed and replaced by a new method
|
||||
``BasePaymentProvider.payment_control_render(request, payment)`` that is passed an ``OrderPayment``
|
||||
object instead of an ``Order``.
|
||||
|
||||
* There's no need to manually deal with excess payments or duplicate payments anymore, just setting the ``OrderPayment``
|
||||
methods to the correct state will do the job.
|
||||
|
||||
Creating refunds
|
||||
""""""""""""""""
|
||||
|
||||
* The methods ``BasePaymentProvider.order_control_refund_render`` and ``BasePaymentProvider.order_control_refund_perform``
|
||||
have been removed.
|
||||
|
||||
* Two new boolean methods ``BasePaymentProvider.payment_refund_supported(payment)`` and ``BasePaymentProvider.payment_partial_refund_supported(payment)``
|
||||
have been introduced. They should be set to return ``True`` if and only if the payment API allows to *automatically*
|
||||
transfer the money back to the customer.
|
||||
|
||||
* A new method ``BasePaymentProvider.execute_refund(refund)`` has been introduced. This method is called using a
|
||||
``OrderRefund`` object in ``"created"`` state and is expected to transfer the money back and confirm success with
|
||||
calling ``refund.done()``. This will only ever be called if either ``BasePaymentProvider.payment_refund_supported(payment)``
|
||||
or ``BasePaymentProvider.payment_partial_refund_supported(payment)`` return ``True``.
|
||||
|
||||
Processing external refunds
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
* If e.g. a webhook API notifies you that a payment has been disputed or refunded with the external API, you are
|
||||
expected to call ``OrderPayment.create_external_refund(self, amount, execution_date, info='{}')`` on this payment.
|
||||
This will create and return an appropriate ``OrderRefund`` object and send out a notification. However, it will not
|
||||
mark the order as refunded, but will ask the event organizer for a decision.
|
||||
|
||||
Data shredders
|
||||
""""""""""""""
|
||||
|
||||
* The method ``BasePaymentProvider.shred_payment_info`` is no longer passed an order, but instead **either**
|
||||
an ``OrderPayment`` **or** an ``OrderRefund``.
|
||||
@@ -1,177 +0,0 @@
|
||||
.. spelling:word-list::
|
||||
|
||||
AGPL
|
||||
AGPLv3
|
||||
GPL
|
||||
LGPL
|
||||
Apache
|
||||
BSD
|
||||
MIT
|
||||
CLA
|
||||
django
|
||||
i18nfields
|
||||
hierarkey
|
||||
rami.io
|
||||
rami
|
||||
io
|
||||
GmbH
|
||||
|
||||
License FAQ
|
||||
===========
|
||||
|
||||
.. warning::
|
||||
|
||||
This FAQ tries to explain in simpler terms what the license of the pretix open source project does and does not
|
||||
allow. It is based on our interpretation of the license and is not legal advice. The contents of this page are not
|
||||
legally binding, only the original text of the license in the `license file`_ is legally binding.
|
||||
|
||||
How is pretix licensed?
|
||||
-----------------------
|
||||
|
||||
pretix follows the popular dual licensing model. It is available under the `GNU Affero General Public License 3`_ (AGPL)
|
||||
plus some additional terms, as well as under a proprietary license ("pretix Enterprise license") on request.
|
||||
|
||||
How can it be AGPL if there are additional terms?
|
||||
-------------------------------------------------
|
||||
|
||||
Even though it is fairly unknown, the AGPL's section 7 is titled "Additional Terms" and outlines specific conditions
|
||||
under which additional terms can be imposed on an AGPL-licensed work. In our case, we add three additional terms.
|
||||
|
||||
The first additional term for pretix is an additional **permission**. It allows you to do something that the AGPL would
|
||||
generally not allow. As it doesn't restrict your freedoms granted by AGPL, if you don't like it, you can ignore it, and
|
||||
if you distribute pretix further, you can remove it.
|
||||
|
||||
The second and third additional term for pretix are additional terms that restrict or specify other provisions of the
|
||||
license. AGPL specifically requires that these terms can only restrict or specify very specific things and we believe
|
||||
our additional terms are in compliance with that and are thus valid and may not be removed.
|
||||
|
||||
Why did you choose this license model?
|
||||
--------------------------------------
|
||||
|
||||
pretix was born in the open source community and we're deeply committed to building the best open source ticketing
|
||||
solution in the world. It is important to us that pretix is available with a comprehensive feature set under term that
|
||||
are compatible with the `Open Source Definition`_. This enables event organizers from all industries and regions
|
||||
to have access to a self-hosted, privacy-friendly and secure option to host their events.
|
||||
|
||||
However, developing and maintaining pretix is a lot of work. Between 2014 and 2021, we've received external
|
||||
contributions from more than 150 individuals. Not counting translations over 90 % of the development was
|
||||
done by staff engineers of rami.io GmbH, the company that started pretix. While we're very happy to receive many more
|
||||
contributions in the future, we also want to ensure that we continue to be able to pay people working on pretix
|
||||
full-time.
|
||||
|
||||
We believe our model creates a good balance between ensuring pretix is available freely as well as protecting our
|
||||
business interests. Unlike licenses chosen by other projects recently, such as the Server-Side Public License, our
|
||||
choice does not restrict using pretix for any possible use case, it just sets a few rules that you have to play by
|
||||
if you do.
|
||||
|
||||
What do I need to do if I use pretix unmodified?
|
||||
------------------------------------------------
|
||||
|
||||
If you use pretix without any modifications or plugins, you can use it for whatever you want, as long as you keep
|
||||
all copyright notices (including the link to pretix at the bottom of the site) intact.
|
||||
|
||||
You are also allowed to make copies of the unmodified source code and distribute them to others as long as you keep
|
||||
all copyright and license information intact.
|
||||
|
||||
If you install **plugins**, you must follow the same terms as when using a **modified** version (see below).
|
||||
|
||||
What do I need to do if I modify pretix?
|
||||
----------------------------------------
|
||||
|
||||
If you want to modify pretix, you have the right to do so. However, you need to follow the following rules:
|
||||
|
||||
* If you **run it for your own events** (events run by you or your company as well as companies from the same
|
||||
corporate groups) our additional permission allows you to do so **without needing to share your source code
|
||||
modifications** as long as you keep the link to pretix at the bottom of the site intact.
|
||||
|
||||
* If you **run it for others**, for example as part of a Software-as-a-Service offering or a managed hosting service
|
||||
you **must** make the source code **including all your modifications and all installed plugins** available under the
|
||||
same license as pretix to every visitor of your site. You need to do so in a prominent place such as a link at the bottom of the
|
||||
site. You also **must** keep the existing link intact.
|
||||
You **may not** add additional restrictions on the result as a whole. You **may** add additional permissions, but
|
||||
only on the parts you added. You **must** make clear which changes you made and you must not give the impression that
|
||||
your modified version is an official version of pretix.
|
||||
|
||||
* If you **distribute** the modified version, for example as a source code or software package, you **must** license it
|
||||
under the AGPL license with the same additional terms. You **may not** add additional restrictions on the result as a
|
||||
whole. You **may** add additional permissions, but only on the parts you added. You **must** make clear which changes
|
||||
you made and you must not give the impression that your modified version is an official version of pretix.
|
||||
|
||||
Does the AGPL copyleft mechanism extend to plugins?
|
||||
---------------------------------------------------
|
||||
|
||||
Yes. pretix plugins are tightly integrated with pretix, so when running pretix together with a plugin in the same
|
||||
environment they form a `combined work`_ and the copyleft mechanism of AGPL applies.
|
||||
|
||||
Can I create proprietary or secret plugins?
|
||||
-------------------------------------------
|
||||
|
||||
Yes, you can create a proprietary or secret plugin, but it may only ever be **used** in an environment that is covered
|
||||
by the additional permission from our license. As soon as the plugin is installed in an installation that is not covered
|
||||
by our additional permission (e.g. when it is used in a SaaS environment) or covered by an active pretix Enterprise
|
||||
license it **must** be released to the visitors of the site under the same license as pretix (like a modified version
|
||||
of pretix).
|
||||
|
||||
What licenses can plugins use?
|
||||
------------------------------
|
||||
|
||||
Technically, you can distribute a plugin under any free or proprietary license as long as it is distributed separately.
|
||||
However, once it is either **distributed together with pretix or used in an environment not covered by our
|
||||
additional permission** or an active pretix Enterprise license, you **must** release it to all recipients of the
|
||||
distribution or all visitors of your site under the same license as pretix (like a modified version of pretix).
|
||||
|
||||
If you release a plugin publicly, it is therefore most practical to use a license that is `compatible to AGPL`_.
|
||||
This includes most open source licenses such as AGPL, GPL, Apache, 3-clause BSD or MIT.
|
||||
|
||||
Note however that when you license a plugin with pure AGPL, it will be incompatible with our additional permission.
|
||||
Therefore, if you want to use an AGPL-licensed plugin, you'll need to publish the source code of **all** your plugins
|
||||
under AGPL terms **even if you only use it for your own events**. A plugin would add its `own additional permission`_
|
||||
to its license to allow combining it with pretix for this use case.
|
||||
|
||||
To make things less complicated, if you want to distribute a plugin freely, we therefore recommend distributing the
|
||||
plugin under **Apache License 2.0**, like we do for most plugins we distribute as open source.
|
||||
|
||||
What do I need to do if I want to contribute my changes back?
|
||||
-------------------------------------------------------------
|
||||
|
||||
In order to retain the possibility for us to offer pretix in a dual licensing model, we unfortunately need you to sign
|
||||
a Contributor License Agreement (CLA) that gives us permission to use your contribution in all present and future
|
||||
distributions of pretix. We know the bureaucracy sucks. Sorry.
|
||||
|
||||
What if I want to re-use a minor part of pretix in my project?
|
||||
--------------------------------------------------------------
|
||||
|
||||
This is the main part we dislike about AGPL: If you see a specific thing in pretix that you'd like to use in another
|
||||
project, you'll need to distribute your other project under AGPL terms as well which is often not practical.
|
||||
|
||||
In this case, feel free to get in touch with us! We're happy to grant you special permission or pull the component
|
||||
out into a separately, permissively licensed repository. We already did that with `django-hierarkey`_ and
|
||||
`django-i18nfield`_ which have previously been parts of pretix.
|
||||
|
||||
What can I use the name "pretix" for?
|
||||
-------------------------------------
|
||||
|
||||
The name pretix is a registered trademark by rami.io GmbH.
|
||||
|
||||
* You **may** use it to **indicate copyright**, such as in the "powered by pretix" or "based on pretix" line, or when
|
||||
indicating that a distribution is based on pretix.
|
||||
|
||||
* You **may** use it to **indicate compatibility**, for example you are allowed to name your plugin "<name> for pretix"
|
||||
or you may state that an external service is compatible with pretix.
|
||||
|
||||
* You **may not** give the impression that your modified version, plugin or compatible service is official or authorized
|
||||
by rami.io GmbH or pretix unless we specifically allowed you to do so.
|
||||
|
||||
* You **may not** use it to name your modified version of pretix. End-users must be able to easily identify whether
|
||||
a version of pretix is distributed by us.
|
||||
|
||||
* You **may not** use any variations of the name, such as "MyPretix".
|
||||
|
||||
.. _license file: https://github.com/pretix/pretix/blob/master/LICENSE
|
||||
.. _GNU Affero General Public License 3: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
.. _compatible to AGPL: https://www.gnu.org/licenses/license-list.en.html#GPLCompatibleLicenses
|
||||
.. _Open Source Definition: https://opensource.org/osd
|
||||
.. _combined work: https://www.gnu.org/licenses/gpl-faq.html#GPLPlugins
|
||||
.. _own additional permission: https://www.gnu.org/licenses/gpl-faq.html#GPLIncompatibleLibs
|
||||
.. _django-hierarkey: https://github.com/raphaelm/django-hierarkey
|
||||
.. _django-i18nfield: https://github.com/raphaelm/django-i18nfield
|
||||
@@ -46,12 +46,12 @@ dependencies = [
|
||||
"django-hijack==3.7.*",
|
||||
"django-i18nfield==1.10.*",
|
||||
"django-libsass==0.9",
|
||||
"django-localflavor==4.0",
|
||||
"django-localflavor==5.0",
|
||||
"django-markup",
|
||||
"django-oauth-toolkit==2.3.*",
|
||||
"django-otp==1.6.*",
|
||||
"django-phonenumber-field==7.3.*",
|
||||
"django-redis==5.4.*",
|
||||
"django-redis==6.0.*",
|
||||
"django-scopes==2.0.*",
|
||||
"django-statici18n==2.6.*",
|
||||
"djangorestframework==3.16.*",
|
||||
@@ -67,7 +67,7 @@ dependencies = [
|
||||
"markdown==3.8", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
|
||||
"mt-940==4.30.*",
|
||||
"oauthlib==3.2.*",
|
||||
"oauthlib==3.3.*",
|
||||
"openpyxl==3.1.*",
|
||||
"packaging",
|
||||
"paypalrestsdk==1.13.*",
|
||||
@@ -76,22 +76,22 @@ dependencies = [
|
||||
"phonenumberslite==9.0.*",
|
||||
"Pillow==11.2.*",
|
||||
"pretix-plugin-build",
|
||||
"protobuf==6.30.*",
|
||||
"protobuf==6.31.*",
|
||||
"psycopg2-binary",
|
||||
"pycountry",
|
||||
"pycparser==2.22",
|
||||
"pycryptodome==3.23.*",
|
||||
"pypdf==5.4.*",
|
||||
"pypdf==5.6.*",
|
||||
"python-bidi==0.6.*", # Support for Arabic in reportlab
|
||||
"python-dateutil==2.9.*",
|
||||
"pytz",
|
||||
"pytz-deprecation-shim==0.1.*",
|
||||
"pyuca",
|
||||
"qrcode==8.2",
|
||||
"redis==5.2.*",
|
||||
"redis==6.2.*",
|
||||
"reportlab==4.4.*",
|
||||
"requests==2.31.*",
|
||||
"sentry-sdk==2.29.*",
|
||||
"sentry-sdk==2.30.*",
|
||||
"sepaxml==2.6.*",
|
||||
"stripe==7.9.*",
|
||||
"text-unidecode==1.*",
|
||||
@@ -107,10 +107,10 @@ dependencies = [
|
||||
[project.optional-dependencies]
|
||||
memcached = ["pylibmc"]
|
||||
dev = [
|
||||
"aiohttp==3.11.*",
|
||||
"aiohttp==3.12.*",
|
||||
"coverage",
|
||||
"coveralls",
|
||||
"fakeredis==2.26.*",
|
||||
"fakeredis==2.30.*",
|
||||
"flake8==7.2.*",
|
||||
"freezegun",
|
||||
"isort==6.0.*",
|
||||
@@ -122,8 +122,8 @@ dev = [
|
||||
"pytest-django==4.*",
|
||||
"pytest-mock==3.14.*",
|
||||
"pytest-sugar",
|
||||
"pytest-xdist==3.6.*",
|
||||
"pytest==8.3.*",
|
||||
"pytest-xdist==3.7.*",
|
||||
"pytest==8.4.*",
|
||||
"responses",
|
||||
]
|
||||
|
||||
|
||||
@@ -19,4 +19,4 @@
|
||||
# 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/>.
|
||||
#
|
||||
__version__ = "2025.5.0.dev0"
|
||||
__version__ = "2025.6.0.dev0"
|
||||
|
||||
@@ -23,7 +23,7 @@ import json
|
||||
|
||||
from django.db.models import prefetch_related_objects
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from rest_framework.exceptions import PermissionDenied, ValidationError
|
||||
|
||||
|
||||
class AsymmetricField(serializers.Field):
|
||||
@@ -132,6 +132,136 @@ class SalesChannelMigrationMixin:
|
||||
s.identifier for s in
|
||||
self.organizer.sales_channels.all()
|
||||
])
|
||||
else:
|
||||
elif "limit_sales_channels" in value:
|
||||
value["sales_channels"] = value["limit_sales_channels"]
|
||||
return value
|
||||
|
||||
|
||||
class ConfigurableSerializerMixin:
|
||||
expand_fields = {}
|
||||
|
||||
def get_exclude_requests(self):
|
||||
if hasattr(self, "initial_data"):
|
||||
# Do not support include requests when the serializer is used for writing
|
||||
# TODO: think about this
|
||||
return set()
|
||||
if getattr(self, "parent", None):
|
||||
# Field selection is always handled by top-level serializer
|
||||
return set()
|
||||
if 'exclude' in self.context:
|
||||
return self.context['exclude']
|
||||
elif 'request' in self.context:
|
||||
return self.context['request'].query_params.getlist('exclude')
|
||||
raise TypeError("Could not discover list of fields to exclude")
|
||||
|
||||
def get_include_requests(self):
|
||||
if hasattr(self, "initial_data"):
|
||||
# Do not support include requests when the serializer is used for writing
|
||||
# TODO: think about this
|
||||
return set()
|
||||
if getattr(self, "parent", None):
|
||||
# Field selection is always handled by top-level serializer
|
||||
return set()
|
||||
if 'include' in self.context:
|
||||
return self.context['include']
|
||||
elif 'request' in self.context:
|
||||
return self.context['request'].query_params.getlist('include')
|
||||
raise TypeError("Could not discover list of fields to include")
|
||||
|
||||
def get_expand_requests(self):
|
||||
if hasattr(self, "initial_data"):
|
||||
# Do not support expand requests when the serializer is used for writing
|
||||
# TODO: think about this
|
||||
return set()
|
||||
if getattr(self, "parent", None):
|
||||
# Field selection is always handled by top-level serializer
|
||||
return set()
|
||||
if 'expand' in self.context:
|
||||
return self.context['expand']
|
||||
elif 'request' in self.context:
|
||||
return self.context['request'].query_params.getlist('expand')
|
||||
raise TypeError("Could not discover list of fields to expand")
|
||||
|
||||
def _exclude_field(self, serializer, path):
|
||||
if path[0] not in serializer.fields:
|
||||
return # field does not exist, nothing to do
|
||||
|
||||
if len(path) == 1:
|
||||
del serializer.fields[path[0]]
|
||||
elif len(path) >= 2 and hasattr(serializer.fields[path[0]], "child"):
|
||||
self._exclude_field(serializer.fields[path[0]].child, path[1:])
|
||||
elif len(path) >= 2 and isinstance(serializer.fields[path[0]], serializers.Serializer):
|
||||
self._exclude_field(serializer.fields[path[0]], path[1:])
|
||||
|
||||
def _filter_fields_to_included(self, serializer, includes):
|
||||
any_field_remaining = False
|
||||
for fname, field in list(serializer.fields.items()):
|
||||
if fname in includes:
|
||||
any_field_remaining = True
|
||||
continue
|
||||
elif hasattr(field, 'child'): # Nested list serializers
|
||||
child_includes = {i.removeprefix(f'{fname}.') for i in includes if i.startswith(f'{fname}.')}
|
||||
if child_includes and self._filter_fields_to_included(field.child, child_includes):
|
||||
any_field_remaining = True
|
||||
continue
|
||||
serializer.fields.pop(fname)
|
||||
elif isinstance(field, serializers.Serializer): # Nested serializers
|
||||
child_includes = {i.removeprefix(f'{fname}.') for i in includes if i.startswith(f'{fname}.')}
|
||||
if child_includes and self._filter_fields_to_included(field, child_includes):
|
||||
any_field_remaining = True
|
||||
continue
|
||||
serializer.fields.pop(fname)
|
||||
else:
|
||||
serializer.fields.pop(fname)
|
||||
return any_field_remaining
|
||||
|
||||
def _expand_field(self, serializer, path, original_field):
|
||||
if path[0] not in serializer.fields or not self.is_field_expandable(original_field):
|
||||
return False # field does not exist, nothing to do
|
||||
|
||||
if len(path) == 1:
|
||||
serializer.fields[path[0]] = self.get_expand_serializer(original_field)
|
||||
return True
|
||||
elif len(path) >= 2 and hasattr(serializer.fields[path[0]], "child"):
|
||||
return self._expand_field(serializer.fields[path[0]].child, path[1:], original_field)
|
||||
elif len(path) >= 2 and isinstance(serializer.fields[path[0]], serializers.Serializer):
|
||||
return self._expand_field(serializer.fields[path[0]], path[1:], original_field)
|
||||
|
||||
def is_field_expandable(self, field):
|
||||
return field in self.expand_fields
|
||||
|
||||
def get_expand_serializer(self, field):
|
||||
from pretix.base.models import Device, TeamAPIToken
|
||||
|
||||
ef = self.expand_fields[field]
|
||||
if "permission" in ef:
|
||||
request = self.context["request"]
|
||||
perm_holder = request.auth if isinstance(request.auth, (Device, TeamAPIToken)) else request.user
|
||||
if not perm_holder.has_event_permission(request.organizer, request.event, ef["permission"], request=request):
|
||||
raise PermissionDenied(f"No permission to expand field {field}")
|
||||
|
||||
if hasattr(self, "instance") and "prefetch" in ef:
|
||||
for prefetch in ef["prefetch"]:
|
||||
prefetch_related_objects(
|
||||
self.instance if hasattr(self.instance, '__iter__') else [self.instance],
|
||||
prefetch
|
||||
)
|
||||
|
||||
return ef["serializer"](
|
||||
read_only=True,
|
||||
context=self.context,
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
expanded = False
|
||||
for expand in sorted(list(self.get_expand_requests())):
|
||||
expanded = self._expand_field(self, expand.split('.'), expand) or expanded
|
||||
|
||||
includes = set(self.get_include_requests())
|
||||
if includes:
|
||||
self._filter_fields_to_included(self, includes)
|
||||
|
||||
for exclude_field in self.get_exclude_requests():
|
||||
self._exclude_field(self, exclude_field.split('.'))
|
||||
|
||||
@@ -23,15 +23,19 @@ from django.utils.translation import gettext as _
|
||||
from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from pretix.api.serializers import ConfigurableSerializerMixin
|
||||
from pretix.api.serializers.event import SubEventSerializer
|
||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||
from pretix.base.media import MEDIA_TYPES
|
||||
from pretix.base.models import Checkin, CheckinList
|
||||
|
||||
|
||||
class CheckinListSerializer(I18nAwareModelSerializer):
|
||||
class CheckinListSerializer(ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
checkin_count = serializers.IntegerField(read_only=True)
|
||||
position_count = serializers.IntegerField(read_only=True)
|
||||
expand_fields = {
|
||||
"subevent": SubEventSerializer,
|
||||
}
|
||||
|
||||
class Meta:
|
||||
model = CheckinList
|
||||
@@ -42,17 +46,6 @@ class CheckinListSerializer(I18nAwareModelSerializer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
if 'subevent' in self.context['request'].query_params.getlist('expand'):
|
||||
self.fields['subevent'] = SubEventSerializer(read_only=True)
|
||||
|
||||
for exclude_field in self.context['request'].query_params.getlist('exclude'):
|
||||
p = exclude_field.split('.')
|
||||
if p[0] in self.fields:
|
||||
if len(p) == 1:
|
||||
del self.fields[p[0]]
|
||||
elif len(p) == 2:
|
||||
self.fields[p[0]].child.fields.pop(p[1])
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
event = self.context['event']
|
||||
|
||||
@@ -48,7 +48,8 @@ from rest_framework.fields import ChoiceField, Field
|
||||
from rest_framework.relations import SlugRelatedField
|
||||
|
||||
from pretix.api.serializers import (
|
||||
CompatibleJSONField, SalesChannelMigrationMixin,
|
||||
CompatibleJSONField, ConfigurableSerializerMixin,
|
||||
SalesChannelMigrationMixin,
|
||||
)
|
||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||
from pretix.api.serializers.settings import SettingsSerializer
|
||||
@@ -167,7 +168,7 @@ class ValidKeysField(Field):
|
||||
}
|
||||
|
||||
|
||||
class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
class EventSerializer(SalesChannelMigrationMixin, ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
meta_data = MetaDataField(required=False, source='*')
|
||||
item_meta_properties = MetaPropertyField(required=False, source='*')
|
||||
plugins = PluginsField(required=False, source='*')
|
||||
@@ -198,10 +199,11 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if not hasattr(self.context['request'], 'event'):
|
||||
self.fields.pop('valid_keys')
|
||||
self.fields.pop('valid_keys', None)
|
||||
if not self.context.get('request') or 'with_availability_for' not in self.context['request'].GET:
|
||||
self.fields.pop('best_availability_state')
|
||||
self.fields['limit_sales_channels'].child_relation.queryset = self.context['organizer'].sales_channels.all()
|
||||
self.fields.pop('best_availability_state', None)
|
||||
if 'limit_sales_channels' in self.fields:
|
||||
self.fields['limit_sales_channels'].child_relation.queryset = self.context['organizer'].sales_channels.all()
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
@@ -483,7 +485,7 @@ class SubEventItemVariationSerializer(I18nAwareModelSerializer):
|
||||
fields = ('variation', 'price', 'disabled', 'available_from', 'available_until')
|
||||
|
||||
|
||||
class SubEventSerializer(I18nAwareModelSerializer):
|
||||
class SubEventSerializer(ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
item_price_overrides = SubEventItemSerializer(source='subeventitem_set', many=True, required=False)
|
||||
variation_price_overrides = SubEventItemVariationSerializer(source='subeventitemvariation_set', many=True, required=False)
|
||||
seat_category_mapping = SeatCategoryMappingField(source='*', required=False)
|
||||
@@ -502,7 +504,7 @@ class SubEventSerializer(I18nAwareModelSerializer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if not self.context.get('request') or 'with_availability_for' not in self.context['request'].GET:
|
||||
self.fields.pop('best_availability_state')
|
||||
self.fields.pop('best_availability_state', None)
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
|
||||
@@ -42,8 +42,10 @@ from django.utils.functional import cached_property, lazy
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
|
||||
from pretix.api.serializers import SalesChannelMigrationMixin
|
||||
from pretix.api.serializers.event import MetaDataField
|
||||
from pretix.api.serializers import (
|
||||
ConfigurableSerializerMixin, SalesChannelMigrationMixin,
|
||||
)
|
||||
from pretix.api.serializers.event import MetaDataField, TaxRuleSerializer
|
||||
from pretix.api.serializers.fields import UploadedFileField
|
||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||
from pretix.base.models import (
|
||||
@@ -246,7 +248,29 @@ class ItemTaxRateField(serializers.Field):
|
||||
return str(Decimal('0.00'))
|
||||
|
||||
|
||||
class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
class ItemCategorySerializer(I18nAwareModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = ItemCategory
|
||||
fields = (
|
||||
'id', 'name', 'internal_name', 'description', 'position',
|
||||
'is_addon', 'cross_selling_mode',
|
||||
'cross_selling_condition', 'cross_selling_match_products'
|
||||
)
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
|
||||
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
|
||||
full_data.update(data)
|
||||
|
||||
if full_data.get('is_addon') and full_data.get('cross_selling_mode'):
|
||||
raise ValidationError('is_addon and cross_selling_mode are mutually exclusive')
|
||||
|
||||
return data
|
||||
|
||||
|
||||
class ItemSerializer(SalesChannelMigrationMixin, ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
addons = InlineItemAddOnSerializer(many=True, required=False)
|
||||
bundles = InlineItemBundleSerializer(many=True, required=False)
|
||||
variations = InlineItemVariationSerializer(many=True, required=False)
|
||||
@@ -262,6 +286,16 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
allow_empty=True,
|
||||
many=True,
|
||||
)
|
||||
expand_fields = {
|
||||
"category": {
|
||||
"serializer": ItemCategorySerializer,
|
||||
"prefetch": ["category"],
|
||||
},
|
||||
"tax_rule": {
|
||||
"serializer": TaxRuleSerializer,
|
||||
"prefetch": ["tax_rule"],
|
||||
},
|
||||
}
|
||||
|
||||
class Meta:
|
||||
model = Item
|
||||
@@ -284,13 +318,18 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['default_price'].allow_null = False
|
||||
self.fields['default_price'].required = True
|
||||
if 'default_price' in self.fields:
|
||||
self.fields['default_price'].allow_null = False
|
||||
self.fields['default_price'].required = True
|
||||
if not self.read_only:
|
||||
self.fields['require_membership_types'].queryset = self.context['event'].organizer.membership_types.all()
|
||||
self.fields['grant_membership_type'].queryset = self.context['event'].organizer.membership_types.all()
|
||||
self.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all()
|
||||
self.fields['variations'].child.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all()
|
||||
if 'require_membership_types' in self.fields:
|
||||
self.fields['require_membership_types'].queryset = self.context['event'].organizer.membership_types.all()
|
||||
if 'grant_membership_type' in self.fields:
|
||||
self.fields['grant_membership_type'].queryset = self.context['event'].organizer.membership_types.all()
|
||||
if 'limit_sales_channels' in self.fields:
|
||||
self.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all()
|
||||
if 'variations' in self.fields and 'limit_sales_channels' in self.fields['variations'].child.fields:
|
||||
self.fields['variations'].child.fields['limit_sales_channels'].child_relation.queryset = self.context['event'].organizer.sales_channels.all()
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
@@ -437,28 +476,6 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
return item
|
||||
|
||||
|
||||
class ItemCategorySerializer(I18nAwareModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = ItemCategory
|
||||
fields = (
|
||||
'id', 'name', 'internal_name', 'description', 'position',
|
||||
'is_addon', 'cross_selling_mode',
|
||||
'cross_selling_condition', 'cross_selling_match_products'
|
||||
)
|
||||
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
|
||||
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
|
||||
full_data.update(data)
|
||||
|
||||
if full_data.get('is_addon') and full_data.get('cross_selling_mode'):
|
||||
raise ValidationError('is_addon and cross_selling_mode are mutually exclusive')
|
||||
|
||||
return data
|
||||
|
||||
|
||||
class QuestionOptionSerializer(I18nAwareModelSerializer):
|
||||
identifier = serializers.CharField(allow_null=True)
|
||||
|
||||
|
||||
@@ -40,12 +40,15 @@ from rest_framework.exceptions import ValidationError
|
||||
from rest_framework.relations import SlugRelatedField
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from pretix.api.serializers import CompatibleJSONField
|
||||
from pretix.api.serializers import (
|
||||
CompatibleJSONField, ConfigurableSerializerMixin,
|
||||
)
|
||||
from pretix.api.serializers.event import SubEventSerializer
|
||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||
from pretix.api.serializers.item import (
|
||||
InlineItemVariationSerializer, ItemSerializer, QuestionSerializer,
|
||||
)
|
||||
from pretix.api.serializers.voucher import VoucherSerializer
|
||||
from pretix.api.signals import order_api_details, orderposition_api_details
|
||||
from pretix.base.decimal import round_decimal
|
||||
from pretix.base.i18n import language
|
||||
@@ -175,7 +178,7 @@ class AnswerSerializer(I18nAwareModelSerializer):
|
||||
|
||||
def to_representation(self, instance):
|
||||
r = super().to_representation(instance)
|
||||
if r['answer'].startswith('file://') and instance.orderposition:
|
||||
if r.get('answer') and r.get('answer').startswith('file://') and instance.orderposition:
|
||||
r['answer'] = reverse('api-v1:orderposition-answer', kwargs={
|
||||
'organizer': instance.orderposition.order.event.organizer.slug,
|
||||
'event': instance.orderposition.order.event.slug,
|
||||
@@ -757,7 +760,7 @@ class OrderPluginDataField(serializers.Field):
|
||||
return d
|
||||
|
||||
|
||||
class OrderSerializer(I18nAwareModelSerializer):
|
||||
class OrderSerializer(ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
event = SlugRelatedField(slug_field='slug', read_only=True)
|
||||
invoice_address = InvoiceAddressSerializer(allow_null=True)
|
||||
positions = OrderPositionSerializer(many=True, read_only=True)
|
||||
@@ -775,6 +778,39 @@ class OrderSerializer(I18nAwareModelSerializer):
|
||||
required=False,
|
||||
)
|
||||
plugin_data = OrderPluginDataField(source='*', allow_null=True, read_only=True)
|
||||
expand_fields = {
|
||||
"positions.voucher": {
|
||||
"serializer": VoucherSerializer,
|
||||
"permission": "can_view_vouchers",
|
||||
"prefetch": ["positions__voucher"],
|
||||
},
|
||||
"positions.item": {
|
||||
"serializer": ItemSerializer,
|
||||
"prefetch": [
|
||||
"positions__item",
|
||||
"positions__item__addons",
|
||||
"positions__item__bundles",
|
||||
"positions__item__meta_values",
|
||||
"positions__item__variations",
|
||||
"positions__item__tax_rule",
|
||||
],
|
||||
},
|
||||
"positions.variation": {
|
||||
"serializer": ItemSerializer,
|
||||
"prefetch": ["positions__variation", "positions__variation__meta_values"],
|
||||
},
|
||||
"positions.subevent": {
|
||||
"serializer": SubEventSerializer,
|
||||
"prefetch": [
|
||||
"positions__subevent",
|
||||
"positions__subevent__event",
|
||||
"positions__subevent__subeventitem_set",
|
||||
"positions__subevent__subeventitemvariation_set",
|
||||
"positions__subevent__seat_category_mappings",
|
||||
"positions__subevent__meta_values",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
class Meta:
|
||||
model = Order
|
||||
@@ -793,47 +829,14 @@ class OrderSerializer(I18nAwareModelSerializer):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if "organizer" in self.context:
|
||||
self.fields["sales_channel"].queryset = self.context["organizer"].sales_channels.all()
|
||||
else:
|
||||
self.fields["sales_channel"].queryset = self.context["event"].organizer.sales_channels.all()
|
||||
if not self.context['pdf_data']:
|
||||
if "sales_channel" in self.fields:
|
||||
if "organizer" in self.context:
|
||||
self.fields["sales_channel"].queryset = self.context["organizer"].sales_channels.all()
|
||||
else:
|
||||
self.fields["sales_channel"].queryset = self.context["event"].organizer.sales_channels.all()
|
||||
if not self.context['pdf_data'] and "positions" in self.fields:
|
||||
self.fields['positions'].child.fields.pop('pdf_data', None)
|
||||
|
||||
includes = set(self.context['include'])
|
||||
if includes:
|
||||
for fname, field in list(self.fields.items()):
|
||||
if fname in includes:
|
||||
continue
|
||||
elif hasattr(field, 'child'): # Nested list serializers
|
||||
found_any = False
|
||||
for childfname, childfield in list(field.child.fields.items()):
|
||||
if f'{fname}.{childfname}' not in includes:
|
||||
field.child.fields.pop(childfname)
|
||||
else:
|
||||
found_any = True
|
||||
if not found_any:
|
||||
self.fields.pop(fname)
|
||||
elif isinstance(field, serializers.Serializer): # Nested serializers
|
||||
found_any = False
|
||||
for childfname, childfield in list(field.fields.items()):
|
||||
if f'{fname}.{childfname}' not in includes:
|
||||
field.fields.pop(childfname)
|
||||
else:
|
||||
found_any = True
|
||||
if not found_any:
|
||||
self.fields.pop(fname)
|
||||
else:
|
||||
self.fields.pop(fname)
|
||||
|
||||
for exclude_field in self.context['exclude']:
|
||||
p = exclude_field.split('.')
|
||||
if p[0] in self.fields:
|
||||
if len(p) == 1:
|
||||
del self.fields[p[0]]
|
||||
elif len(p) == 2:
|
||||
self.fields[p[0]].child.fields.pop(p[1])
|
||||
|
||||
def validate_locale(self, l):
|
||||
if l not in set(k for k in self.instance.event.settings.locales):
|
||||
raise ValidationError('"{}" is not a supported locale for this event.'.format(l))
|
||||
@@ -1600,7 +1603,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
|
||||
self.context['event'].currency)
|
||||
is_split_taxes = fee_data.pop('_split_taxes_like_products', False)
|
||||
|
||||
if is_split_taxes:
|
||||
if is_split_taxes and order.total:
|
||||
d = defaultdict(lambda: Decimal('0.00'))
|
||||
trz = TaxRule.zero()
|
||||
for p in pos_map.values():
|
||||
|
||||
@@ -31,7 +31,7 @@ from rest_framework import serializers
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from pretix.api.auth.devicesecurity import get_all_security_profiles
|
||||
from pretix.api.serializers import AsymmetricField
|
||||
from pretix.api.serializers import AsymmetricField, ConfigurableSerializerMixin
|
||||
from pretix.api.serializers.i18n import I18nAwareModelSerializer
|
||||
from pretix.api.serializers.order import CompatibleJSONField
|
||||
from pretix.api.serializers.settings import SettingsSerializer
|
||||
@@ -51,7 +51,7 @@ from pretix.multidomain.urlreverse import build_absolute_uri
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class OrganizerSerializer(I18nAwareModelSerializer):
|
||||
class OrganizerSerializer(ConfigurableSerializerMixin, I18nAwareModelSerializer):
|
||||
public_url = serializers.SerializerMethodField('get_organizer_url', read_only=True)
|
||||
|
||||
def get_organizer_url(self, organizer):
|
||||
|
||||
@@ -121,6 +121,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
def get_serializer_context(self):
|
||||
ctx = super().get_serializer_context()
|
||||
ctx['event'] = self.request.event
|
||||
ctx['request'] = self.request
|
||||
return ctx
|
||||
|
||||
def perform_update(self, serializer):
|
||||
@@ -485,8 +486,17 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
|
||||
super().perform_destroy(instance)
|
||||
|
||||
|
||||
class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
|
||||
pass
|
||||
|
||||
|
||||
with scopes_disabled():
|
||||
class QuotaFilter(FilterSet):
|
||||
items__in = NumberInFilter(
|
||||
field_name='items__id',
|
||||
lookup_expr='in',
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Quota
|
||||
fields = {
|
||||
@@ -508,7 +518,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
return self.request.event.quotas.all()
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
queryset = self.filter_queryset(self.get_queryset()).distinct()
|
||||
|
||||
page = self.paginate_queryset(queryset)
|
||||
|
||||
|
||||
@@ -182,10 +182,15 @@ class NamePartsWidget(forms.MultiWidget):
|
||||
if self.field.required:
|
||||
these_attrs['required'] = 'required'
|
||||
these_attrs.pop('data-no-required-attr', None)
|
||||
these_attrs['autocomplete'] = (self.attrs.get('autocomplete', '') + ' ' + self.autofill_map.get(self.scheme['fields'][i][0], 'off')).strip()
|
||||
|
||||
autofill_section = self.attrs.get('autocomplete', '')
|
||||
autofill_by_name_scheme = self.autofill_map.get(self.scheme['fields'][i][0], 'off')
|
||||
if autofill_by_name_scheme == "off" or autofill_section.strip() == "off":
|
||||
these_attrs['autocomplete'] = "off"
|
||||
else:
|
||||
these_attrs['autocomplete'] = (autofill_section + ' ' + autofill_by_name_scheme).strip()
|
||||
these_attrs['data-size'] = self.scheme['fields'][i][2]
|
||||
if len(self.widgets) > 1:
|
||||
these_attrs['aria-label'] = self.scheme['fields'][i][1]
|
||||
these_attrs['aria-label'] = self.scheme['fields'][i][1]
|
||||
else:
|
||||
these_attrs = final_attrs
|
||||
output.append(widget.render(name + '_%s' % i, widget_value, these_attrs, renderer=renderer))
|
||||
@@ -303,7 +308,10 @@ class WrappedPhonePrefixSelect(Select):
|
||||
self.initial = "+%d" % prefix
|
||||
break
|
||||
choices += get_phone_prefixes_sorted_and_localized()
|
||||
super().__init__(choices=choices, attrs={'aria-label': pgettext_lazy('phonenumber', 'International area code')})
|
||||
super().__init__(choices=choices, attrs={
|
||||
'aria-label': pgettext_lazy('phonenumber', 'International area code'),
|
||||
'autocomplete': 'tel-country-code',
|
||||
})
|
||||
|
||||
def render(self, name, value, *args, **kwargs):
|
||||
return super().render(name, value or self.initial, *args, **kwargs)
|
||||
@@ -326,11 +334,11 @@ class WrappedPhonePrefixSelect(Select):
|
||||
class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget):
|
||||
|
||||
def __init__(self, attrs=None, initial=None):
|
||||
attrs = {
|
||||
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)')
|
||||
}
|
||||
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs=attrs))
|
||||
super(PhoneNumberPrefixWidget, self).__init__(widgets, attrs)
|
||||
widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput(attrs={
|
||||
'aria-label': pgettext_lazy('phonenumber', 'Phone number (without international area code)'),
|
||||
'autocomplete': 'tel-national',
|
||||
}))
|
||||
super(PhoneNumberPrefixWidget, self).__init__(widgets)
|
||||
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
output = super().render(name, value, attrs, renderer)
|
||||
@@ -987,8 +995,19 @@ class BaseQuestionsForm(forms.Form):
|
||||
value.initial = data.get('question_form_data', {}).get(key)
|
||||
|
||||
for k, v in self.fields.items():
|
||||
if isinstance(v.widget, forms.MultiWidget):
|
||||
for w in v.widget.widgets:
|
||||
autocomplete = w.attrs.get('autocomplete', '')
|
||||
if autocomplete.strip() == "off":
|
||||
w.attrs['autocomplete'] = 'off'
|
||||
else:
|
||||
w.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + autocomplete
|
||||
if v.widget.attrs.get('autocomplete') or k == 'attendee_name_parts':
|
||||
v.widget.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + v.widget.attrs.get('autocomplete', '')
|
||||
autocomplete = v.widget.attrs.get('autocomplete', '')
|
||||
if autocomplete.strip() == "off":
|
||||
v.widget.attrs['autocomplete'] = 'off'
|
||||
else:
|
||||
v.widget.attrs['autocomplete'] = 'section-{} '.format(self.prefix) + autocomplete
|
||||
|
||||
def clean(self):
|
||||
from pretix.base.addressvalidation import \
|
||||
@@ -1202,7 +1221,11 @@ class BaseInvoiceAddressForm(forms.ModelForm):
|
||||
|
||||
for k, v in self.fields.items():
|
||||
if v.widget.attrs.get('autocomplete') or k == 'name_parts':
|
||||
v.widget.attrs['autocomplete'] = 'section-invoice billing ' + v.widget.attrs.get('autocomplete', '')
|
||||
autocomplete = v.widget.attrs.get('autocomplete', '')
|
||||
if autocomplete.strip() == "off":
|
||||
v.widget.attrs['autocomplete'] = 'off'
|
||||
else:
|
||||
v.widget.attrs['autocomplete'] = 'section-invoice billing ' + autocomplete
|
||||
|
||||
def clean(self):
|
||||
from pretix.base.addressvalidation import \
|
||||
|
||||
@@ -26,7 +26,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
|
||||
from pretix.base.models import (
|
||||
Discount, Item, ItemCategory, Order, Question, Quota, SubEvent, TaxRule,
|
||||
Voucher,
|
||||
Voucher, WaitingListEntry,
|
||||
)
|
||||
|
||||
from .logentrytype_registry import ( # noqa
|
||||
@@ -145,3 +145,15 @@ class TaxRuleLogEntryType(EventLogEntryType):
|
||||
object_link_viewname = 'control:event.settings.tax.edit'
|
||||
object_link_argname = 'rule'
|
||||
content_type = TaxRule
|
||||
|
||||
|
||||
class WaitingListEntryLogEntryType(EventLogEntryType):
|
||||
object_link_wrapper = _('{val}')
|
||||
object_link_viewname = 'control:event.orders.waitinglist'
|
||||
content_type = WaitingListEntry
|
||||
|
||||
def get_object_link_info(self, logentry) -> Optional[dict]:
|
||||
info = super().get_object_link_info(logentry)
|
||||
if info and 'href' in info:
|
||||
info['href'] += '?status=a&entry=' + str(logentry.content_object.pk)
|
||||
return info
|
||||
|
||||
@@ -1084,6 +1084,7 @@ class Event(EventMixin, LoggedModel):
|
||||
s.product = item_map[s.product_id]
|
||||
s.save(force_insert=True)
|
||||
|
||||
valid_sales_channel_identifers = set(self.organizer.sales_channels.values_list("identifier", flat=True))
|
||||
skip_settings = (
|
||||
'ticket_secrets_pretix_sig1_pubkey',
|
||||
'ticket_secrets_pretix_sig1_privkey',
|
||||
@@ -1119,6 +1120,11 @@ class Event(EventMixin, LoggedModel):
|
||||
settings_to_save.append(s)
|
||||
except ValueError:
|
||||
pass
|
||||
elif s.key.startswith('payment_') and s.key.endswith('__restrict_to_sales_channels'):
|
||||
data = other.settings._unserialize(s.value, as_type=list)
|
||||
data = [ident for ident in data if ident in valid_sales_channel_identifers]
|
||||
s.value = other.settings._serialize(data)
|
||||
settings_to_save.append(s)
|
||||
else:
|
||||
settings_to_save.append(s)
|
||||
other.settings._objects.bulk_create(settings_to_save)
|
||||
|
||||
@@ -793,7 +793,7 @@ class Item(LoggedModel):
|
||||
class Meta:
|
||||
verbose_name = _("Product")
|
||||
verbose_name_plural = _("Products")
|
||||
ordering = ("category__position", "category", "position")
|
||||
ordering = ("category__position", "category", "position", "pk")
|
||||
|
||||
def __str__(self):
|
||||
return str(self.internal_name or self.name)
|
||||
|
||||
@@ -218,7 +218,6 @@ class WaitingListEntry(LoggedModel):
|
||||
'waitinglistentry': self.pk,
|
||||
'subevent': self.subevent.pk if self.subevent else None,
|
||||
}, user=user, auth=auth)
|
||||
self.log_action('pretix.event.orders.waitinglist.voucher_assigned', user=user, auth=auth)
|
||||
self.voucher = v
|
||||
self.save()
|
||||
|
||||
@@ -234,6 +233,7 @@ class WaitingListEntry(LoggedModel):
|
||||
),
|
||||
user=user,
|
||||
auth=auth,
|
||||
log_entry_type='pretix.event.orders.waitinglist.voucher_assigned',
|
||||
)
|
||||
|
||||
def send_mail(self, subject: Union[str, LazyI18nString], template: Union[str, LazyI18nString],
|
||||
|
||||
@@ -43,7 +43,6 @@ from zoneinfo import ZoneInfo
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
||||
from django.db import transaction
|
||||
from django.dispatch import receiver
|
||||
@@ -93,15 +92,73 @@ class PaymentProviderForm(Form):
|
||||
cleaned_data = super().clean()
|
||||
for k, v in self.fields.items():
|
||||
val = cleaned_data.get(k)
|
||||
if v._required and not val:
|
||||
if hasattr(v, '_required') and v._required and not val:
|
||||
self.add_error(k, _('This field is required.'))
|
||||
return cleaned_data
|
||||
|
||||
|
||||
class GiftCardPaymentForm(PaymentProviderForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.event = kwargs.pop('event')
|
||||
self.testmode = kwargs.pop('testmode')
|
||||
self.positions = kwargs.pop('positions')
|
||||
self.used_cards = kwargs.pop('used_cards')
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
if "code" not in cleaned_data:
|
||||
return cleaned_data
|
||||
|
||||
code = cleaned_data["code"].strip()
|
||||
msg = ""
|
||||
for p in self.positions:
|
||||
if p.item.issue_giftcard:
|
||||
msg = _("You cannot pay with gift cards when buying a gift card.")
|
||||
self.add_error('code', msg)
|
||||
return cleaned_data
|
||||
try:
|
||||
event = self.event
|
||||
gc = event.organizer.accepted_gift_cards.get(
|
||||
secret=code
|
||||
)
|
||||
if gc.currency != event.currency:
|
||||
msg = _("This gift card does not support this currency.")
|
||||
elif gc.testmode and not self.testmode:
|
||||
msg = _("This gift card can only be used in test mode.")
|
||||
elif not gc.testmode and self.testmode:
|
||||
msg = _("Only test gift cards can be used in test mode.")
|
||||
elif gc.expires and gc.expires < time_machine_now():
|
||||
msg = _("This gift card is no longer valid.")
|
||||
elif gc.value <= Decimal("0.00"):
|
||||
msg = _("All credit on this gift card has been used.")
|
||||
|
||||
if msg:
|
||||
self.add_error('code', msg)
|
||||
return cleaned_data
|
||||
|
||||
if gc.pk in self.used_cards:
|
||||
self.add_error('code', _("This gift card is already used for your payment."))
|
||||
return cleaned_data
|
||||
except GiftCard.DoesNotExist:
|
||||
if event.vouchers.filter(code__iexact=code).exists():
|
||||
msg = _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
|
||||
"the product selection.")
|
||||
self.add_error('code', msg)
|
||||
else:
|
||||
msg = _("This gift card is not known.")
|
||||
self.add_error('code', msg)
|
||||
except GiftCard.MultipleObjectsReturned:
|
||||
msg = _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event.")
|
||||
self.add_error('code', msg)
|
||||
return cleaned_data
|
||||
|
||||
|
||||
class BasePaymentProvider:
|
||||
"""
|
||||
This is the base class for all payment providers.
|
||||
"""
|
||||
payment_form_template_name = 'pretixpresale/event/checkout_payment_form_default.html'
|
||||
|
||||
def __init__(self, event: Event):
|
||||
self.event = event
|
||||
@@ -632,11 +689,6 @@ class BasePaymentProvider:
|
||||
the ``_restrict_countries`` and ``_restrict_to_sales_channels`` setting.
|
||||
|
||||
:param total: The total value without the payment method fee, after taxes.
|
||||
|
||||
.. versionchanged:: 1.17.0
|
||||
|
||||
The ``total`` parameter has been added. For backwards compatibility, this method is called again
|
||||
without this parameter if it raises a ``TypeError`` on first try.
|
||||
"""
|
||||
timing = self._is_available_by_time(cart_id=get_or_create_cart_id(request))
|
||||
pricing = True
|
||||
@@ -694,7 +746,7 @@ class BasePaymentProvider:
|
||||
:param order: Only set when this is a change to a new payment method for an existing order.
|
||||
"""
|
||||
form = self.payment_form(request)
|
||||
template = get_template('pretixpresale/event/checkout_payment_form_default.html')
|
||||
template = get_template(self.payment_form_template_name)
|
||||
ctx = {'request': request, 'form': form}
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -1318,6 +1370,49 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
multi_use_supported = True
|
||||
execute_payment_needs_user = False
|
||||
verbose_name = _("Gift card")
|
||||
payment_form_class = GiftCardPaymentForm
|
||||
payment_form_template_name = 'pretixcontrol/giftcards/checkout.html'
|
||||
|
||||
def payment_form(self, request: HttpRequest) -> Form:
|
||||
# Unfortunately, in payment_form we do not know if we're in checkout
|
||||
# or in an existing order. But we need to do the validation logic in the
|
||||
# form to get the error messages in the right places for accessbility :-(
|
||||
if 'checkout' in request.resolver_match.url_name:
|
||||
cs = cart_session(request)
|
||||
used_cards = [
|
||||
p.get('info_data', {}).get('gift_card')
|
||||
for p in cs.get('payments', [])
|
||||
if p.get('info_data', {}).get('gift_card')
|
||||
]
|
||||
positions = get_cart(request)
|
||||
testmode = self.event.testmode
|
||||
else:
|
||||
used_cards = []
|
||||
order = self.event.orders.get(code=request.resolver_match.kwargs["order"])
|
||||
positions = order.positions.all()
|
||||
testmode = order.testmode
|
||||
|
||||
form = self.payment_form_class(
|
||||
event=self.event,
|
||||
used_cards=used_cards,
|
||||
positions=positions,
|
||||
testmode=testmode,
|
||||
data=(request.POST if request.method == 'POST' and request.POST.get("payment") == self.identifier else None),
|
||||
prefix='payment_%s' % self.identifier,
|
||||
initial={
|
||||
k.replace('payment_%s_' % self.identifier, ''): v
|
||||
for k, v in request.session.items()
|
||||
if k.startswith('payment_%s_' % self.identifier)
|
||||
}
|
||||
)
|
||||
form.fields = self.payment_form_fields
|
||||
|
||||
for k, v in form.fields.items():
|
||||
v._required = v.required
|
||||
v.required = False
|
||||
v.widget.is_required = False
|
||||
|
||||
return form
|
||||
|
||||
@property
|
||||
def public_name(self) -> str:
|
||||
@@ -1350,6 +1445,19 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
f.move_to_end("_enabled", last=False)
|
||||
return f
|
||||
|
||||
@property
|
||||
def payment_form_fields(self):
|
||||
fields = [
|
||||
(
|
||||
"code",
|
||||
forms.CharField(
|
||||
label=_("Gift card code"),
|
||||
required=True,
|
||||
),
|
||||
),
|
||||
]
|
||||
return OrderedDict(fields)
|
||||
|
||||
@property
|
||||
def test_mode_message(self) -> str:
|
||||
return _("In test mode, only test cards will work.")
|
||||
@@ -1360,11 +1468,6 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
def order_change_allowed(self, order: Order) -> bool:
|
||||
return super().order_change_allowed(order) and self.event.organizer.has_gift_cards
|
||||
|
||||
def payment_form_render(self, request: HttpRequest, total: Decimal) -> str:
|
||||
return get_template('pretixcontrol/giftcards/checkout.html').render({
|
||||
'request': request,
|
||||
})
|
||||
|
||||
def checkout_confirm_render(self, request, order=None, info_data=None) -> str:
|
||||
return get_template('pretixcontrol/giftcards/checkout_confirm.html').render({
|
||||
'info_data': info_data,
|
||||
@@ -1432,21 +1535,6 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
def _add_giftcard_to_cart(self, cs, gc):
|
||||
from pretix.base.services.cart import add_payment_to_cart_session
|
||||
|
||||
if gc.currency != self.event.currency:
|
||||
raise ValidationError(_("This gift card does not support this currency."))
|
||||
if gc.testmode and not self.event.testmode:
|
||||
raise ValidationError(_("This gift card can only be used in test mode."))
|
||||
if not gc.testmode and self.event.testmode:
|
||||
raise ValidationError(_("Only test gift cards can be used in test mode."))
|
||||
if gc.expires and gc.expires < time_machine_now():
|
||||
raise ValidationError(_("This gift card is no longer valid."))
|
||||
if gc.value <= Decimal("0.00"):
|
||||
raise ValidationError(_("All credit on this gift card has been used."))
|
||||
|
||||
for p in cs.get('payments', []):
|
||||
if p['provider'] == self.identifier and p['info_data']['gift_card'] == gc.pk:
|
||||
raise ValidationError(_("This gift card is already used for your payment."))
|
||||
|
||||
add_payment_to_cart_session(
|
||||
cs,
|
||||
self,
|
||||
@@ -1458,77 +1546,32 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
)
|
||||
|
||||
def checkout_prepare(self, request: HttpRequest, cart: Dict[str, Any]) -> Union[bool, str, None]:
|
||||
for p in get_cart(request):
|
||||
if p.item.issue_giftcard:
|
||||
messages.error(request, _("You cannot pay with gift cards when buying a gift card."))
|
||||
return
|
||||
form = self.payment_form(request)
|
||||
if not form.is_valid():
|
||||
return False
|
||||
|
||||
if not request.POST.get("giftcard"):
|
||||
messages.error(request, _("Please enter the code of your gift card."))
|
||||
return
|
||||
|
||||
try:
|
||||
gc = self.event.organizer.accepted_gift_cards.get(
|
||||
secret=request.POST.get("giftcard").strip()
|
||||
)
|
||||
cs = cart_session(request)
|
||||
try:
|
||||
self._add_giftcard_to_cart(cs, gc)
|
||||
return True
|
||||
except ValidationError as e:
|
||||
messages.error(request, str(e.message))
|
||||
return
|
||||
except GiftCard.DoesNotExist:
|
||||
if self.event.vouchers.filter(code__iexact=request.POST.get("giftcard")).exists():
|
||||
messages.warning(request, _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
|
||||
"the product selection."))
|
||||
else:
|
||||
messages.error(request, _("This gift card is not known."))
|
||||
except GiftCard.MultipleObjectsReturned:
|
||||
messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event."))
|
||||
gc = self.event.organizer.accepted_gift_cards.get(
|
||||
secret=form.cleaned_data["code"]
|
||||
)
|
||||
cs = cart_session(request)
|
||||
self._add_giftcard_to_cart(cs, gc)
|
||||
return True
|
||||
|
||||
def payment_prepare(self, request: HttpRequest, payment: OrderPayment) -> Union[bool, str, None]:
|
||||
for p in payment.order.positions.all():
|
||||
if p.item.issue_giftcard:
|
||||
messages.error(request, _("You cannot pay with gift cards when buying a gift card."))
|
||||
return
|
||||
|
||||
try:
|
||||
gc = self.event.organizer.accepted_gift_cards.get(
|
||||
secret=request.POST.get("giftcard").strip()
|
||||
)
|
||||
if gc.currency != self.event.currency:
|
||||
messages.error(request, _("This gift card does not support this currency."))
|
||||
return
|
||||
if gc.testmode and not payment.order.testmode:
|
||||
messages.error(request, _("This gift card can only be used in test mode."))
|
||||
return
|
||||
if not gc.testmode and payment.order.testmode:
|
||||
messages.error(request, _("Only test gift cards can be used in test mode."))
|
||||
return
|
||||
if gc.expires and gc.expires < time_machine_now():
|
||||
messages.error(request, _("This gift card is no longer valid."))
|
||||
return
|
||||
if gc.value <= Decimal("0.00"):
|
||||
messages.error(request, _("All credit on this gift card has been used."))
|
||||
return
|
||||
payment.info_data = {
|
||||
'gift_card': gc.pk,
|
||||
'gift_card_secret': gc.secret,
|
||||
'retry': True
|
||||
}
|
||||
payment.amount = min(payment.amount, gc.value)
|
||||
payment.save()
|
||||
|
||||
return True
|
||||
except GiftCard.DoesNotExist:
|
||||
if self.event.vouchers.filter(code__iexact=request.POST.get("giftcard").strip()).exists():
|
||||
messages.warning(request, _("You entered a voucher instead of a gift card. Vouchers can only be entered on the first page of the shop below "
|
||||
"the product selection."))
|
||||
else:
|
||||
messages.error(request, _("This gift card is not known."))
|
||||
except GiftCard.MultipleObjectsReturned:
|
||||
messages.error(request, _("This gift card can not be redeemed since its code is not unique. Please contact the organizer of this event."))
|
||||
form = self.payment_form(request)
|
||||
if not form.is_valid():
|
||||
return False
|
||||
gc = self.event.organizer.accepted_gift_cards.get(
|
||||
secret=form.cleaned_data["code"]
|
||||
)
|
||||
payment.info_data = {
|
||||
'gift_card': gc.pk,
|
||||
'gift_card_secret': gc.secret,
|
||||
'retry': True
|
||||
}
|
||||
payment.amount = min(payment.amount, gc.value)
|
||||
payment.save()
|
||||
return True
|
||||
|
||||
def execute_payment(self, request: HttpRequest, payment: OrderPayment, is_early_special_case=False) -> str:
|
||||
for p in payment.order.positions.all():
|
||||
|
||||
@@ -96,12 +96,19 @@ class SendMailException(Exception):
|
||||
|
||||
|
||||
def clean_sender_name(sender_name: str) -> str:
|
||||
# Even though we try to properly escape sender names, some characters seem to cause problems when the escaping
|
||||
# fails due to some forwardings, etc.
|
||||
|
||||
# Emails with @ in their sender name are rejected by some mailservers (e.g. Microsoft) because it looks like
|
||||
# a phishing attempt.
|
||||
sender_name = sender_name.replace("@", " ")
|
||||
# Emails with : in their sender name are treated by Microsoft like emails with no From header at all, leading
|
||||
# to a higher spam likelihood.
|
||||
sender_name = sender_name.replace(":", " ")
|
||||
# Emails with , in their sender name look like multiple senders
|
||||
sender_name = sender_name.replace(",", "")
|
||||
# Emails with " in their sender name could be escaped, but somehow create issues in reality
|
||||
sender_name = sender_name.replace("\"", "")
|
||||
|
||||
# Emails with excessively long sender names are rejected by some mailservers
|
||||
if len(sender_name) > 75:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% load i18n %}
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="14" viewBox="0 0 18 14"
|
||||
class="{{ cls }}">
|
||||
class="{{ cls }}" role="img" aria-label="{% trans "Seat" %}">
|
||||
<path d="M7.713 3.573c-.787-.124-1.677.472-1.511 1.529l.857 3.473c.116.579.578 1.086 1.317 1.086h3.166v3.504c0 1.108 1.556 1.113 1.556.019V8.682c0-.536-.376-1.116-1.099-1.116L9.52 7.563l-.752-2.936c-.147-.648-.583-.981-1.055-1.055v.001Z"></path>
|
||||
<path d="M4.48 5.835a.6.6 0 0 0-.674.725l.71 3.441c.287 1.284 1.39 2.114 2.495 2.114h2.273c.807 0 .811-1.215-.01-1.215H7.188c-.753 0-1.375-.45-1.563-1.289l-.672-3.293c-.062-.3-.26-.452-.474-.483ZM7.433.102a1.468 1.468 0 1 0 0 2.937 1.469 1.469 0 1 0 0-2.937Z"></path>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 636 B After Width: | Height: | Size: 695 B |
@@ -58,7 +58,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_from,
|
||||
description=pgettext_lazy('timeline', 'Your event starts'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_from_0'
|
||||
))
|
||||
|
||||
if ev.date_to:
|
||||
@@ -66,7 +66,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_to,
|
||||
description=pgettext_lazy('timeline', 'Your event ends'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_to_0'
|
||||
))
|
||||
|
||||
if ev.date_admission:
|
||||
@@ -74,7 +74,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.date_admission,
|
||||
description=pgettext_lazy('timeline', 'Admissions for your event start'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_date_admission_0'
|
||||
))
|
||||
|
||||
if ev.presale_start:
|
||||
@@ -82,7 +82,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=ev.presale_start,
|
||||
description=pgettext_lazy('timeline', 'Start of ticket sales'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_presale_start_0'
|
||||
))
|
||||
|
||||
tl.append(TimelineEvent(
|
||||
@@ -95,7 +95,7 @@ def timeline_for_event(event, subevent=None):
|
||||
pgettext_lazy('timeline', 'End of ticket sales'),
|
||||
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured') if not ev.presale_end else ""
|
||||
),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_presale_end_0'
|
||||
))
|
||||
|
||||
rd = event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper)
|
||||
@@ -104,7 +104,7 @@ def timeline_for_event(event, subevent=None):
|
||||
event=event, subevent=subevent,
|
||||
datetime=rd.datetime(ev),
|
||||
description=pgettext_lazy('timeline', 'Customers can no longer modify their order information'),
|
||||
edit_url=ev_edit_url
|
||||
edit_url=ev_edit_url + '#id_settings-last_order_modification_date_0_0'
|
||||
))
|
||||
|
||||
rd = event.settings.get('payment_term_last', as_type=RelativeDateWrapper)
|
||||
@@ -281,7 +281,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': p.pk,
|
||||
})
|
||||
}) + '#id_available_from_0'
|
||||
))
|
||||
if p.available_until:
|
||||
tl.append(TimelineEvent(
|
||||
@@ -292,7 +292,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': p.pk,
|
||||
})
|
||||
}) + '#id_available_until_0'
|
||||
))
|
||||
|
||||
for v in ItemVariation.objects.filter(
|
||||
@@ -311,7 +311,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': v.item.pk,
|
||||
})
|
||||
}) + '#tab-0-3-open'
|
||||
))
|
||||
if v.available_until:
|
||||
tl.append(TimelineEvent(
|
||||
@@ -325,7 +325,7 @@ def timeline_for_event(event, subevent=None):
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'item': v.item.pk,
|
||||
})
|
||||
}) + '#tab-0-3-open'
|
||||
))
|
||||
|
||||
pprovs = event.get_payment_providers()
|
||||
@@ -339,6 +339,24 @@ def timeline_for_event(event, subevent=None):
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
availability_start = pprov.settings.get('_availability_start', as_type=RelativeDateWrapper)
|
||||
if availability_start:
|
||||
d = make_aware(datetime.combine(
|
||||
availability_start.date(ev),
|
||||
time(hour=0, minute=0, second=0)
|
||||
), event.timezone)
|
||||
tl.append(TimelineEvent(
|
||||
event=event, subevent=subevent,
|
||||
datetime=d,
|
||||
description=pgettext_lazy('timeline', 'Payment provider "{name}" becomes active').format(
|
||||
name=str(pprov.verbose_name)
|
||||
),
|
||||
edit_url=reverse('control:event.settings.payment.provider', kwargs={
|
||||
'event': event.slug,
|
||||
'organizer': event.organizer.slug,
|
||||
'provider': pprov.identifier,
|
||||
})
|
||||
))
|
||||
availability_date = pprov.settings.get('_availability_date', as_type=RelativeDateWrapper)
|
||||
if availability_date:
|
||||
d = make_aware(datetime.combine(
|
||||
|
||||
@@ -665,9 +665,9 @@ class EventSettingsForm(EventSettingsValidationMixin, FormPlaceholderMixin, Sett
|
||||
del self.fields['event_list_available_only']
|
||||
del self.fields['event_list_filters']
|
||||
del self.fields['event_calendar_future_only']
|
||||
self.fields['primary_font'].choices += [
|
||||
self.fields['primary_font'].choices = [('Open Sans', 'Open Sans')] + sorted([
|
||||
(a, {"title": a, "data": v}) for a, v in get_fonts(self.event, pdf_support_required=False).items()
|
||||
]
|
||||
], key=lambda a: a[0])
|
||||
|
||||
# create "virtual" fields for better UX when editing <name>_asked and <name>_required fields
|
||||
self.virtual_keys = []
|
||||
|
||||
@@ -178,6 +178,13 @@ class SubEventBulkEditForm(I18nModelForm):
|
||||
widgets = {
|
||||
}
|
||||
|
||||
def clean(self):
|
||||
data = super().clean()
|
||||
if self.prefix + "name" in self.data.getlist('_bulk'):
|
||||
if not data.get("name"):
|
||||
self.add_error("name", _("This field is required."))
|
||||
return data
|
||||
|
||||
def save(self, commit=True):
|
||||
objs = list(self.queryset)
|
||||
fields = set()
|
||||
|
||||
@@ -50,7 +50,7 @@ from pretix.base.logentrytypes import (
|
||||
DiscountLogEntryType, EventLogEntryType, ItemCategoryLogEntryType,
|
||||
ItemLogEntryType, LogEntryType, OrderLogEntryType, QuestionLogEntryType,
|
||||
QuotaLogEntryType, TaxRuleLogEntryType, VoucherLogEntryType,
|
||||
log_entry_types,
|
||||
WaitingListEntryLogEntryType, log_entry_types,
|
||||
)
|
||||
from pretix.base.models import (
|
||||
Checkin, CheckinList, Event, ItemVariation, LogEntry, OrderPosition,
|
||||
@@ -697,11 +697,7 @@ class CoreUserImpersonatedLogEntryType(UserImpersonatedLogEntryType):
|
||||
'the last request was less than 24 hours ago.'),
|
||||
'pretix.organizer.deleted': _('The organizer "{name}" has been deleted.'),
|
||||
'pretix.waitinglist.voucher': _('A voucher has been sent to a person on the waiting list.'), # legacy
|
||||
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
|
||||
'pretix.event.order.waitinglist.transferred': _('An entry has been transferred to another waiting list.'), # legacy
|
||||
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
|
||||
'pretix.team.created': _('The team has been created.'),
|
||||
'pretix.team.changed': _('The team settings have been changed.'),
|
||||
'pretix.team.deleted': _('The team has been deleted.'),
|
||||
@@ -903,3 +899,13 @@ class LegacyCheckinLogEntryType(OrderLogEntryType):
|
||||
datetime=dt_formatted,
|
||||
list=checkin_list
|
||||
)
|
||||
|
||||
|
||||
@log_entry_types.new_from_dict({
|
||||
'pretix.event.orders.waitinglist.voucher_assigned': _('A voucher has been sent to a person on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.deleted': _('An entry has been removed from the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.changed': _('An entry has been changed on the waiting list.'),
|
||||
'pretix.event.orders.waitinglist.added': _('An entry has been added to the waiting list.'),
|
||||
})
|
||||
class CoreWaitingListEntryLogEntryType(WaitingListEntryLogEntryType):
|
||||
pass
|
||||
|
||||
@@ -247,6 +247,17 @@
|
||||
{% bootstrap_field sform.show_variations_expanded layout="control" %}
|
||||
{% bootstrap_field sform.hide_sold_out layout="control" %}
|
||||
|
||||
<div data-display-dependency="#id_settings-waiting_list_enabled">
|
||||
<div data-display-dependency="#id_settings-hide_sold_out">
|
||||
<div class="alert alert-danger dynamic">
|
||||
<h4>{% trans "Incompatible settings" %}</h4>
|
||||
{% blocktrans trimmed %}
|
||||
Customers won't be able to add themselves to the waiting list, because "Hide all products that are sold out" is enabled.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4>{% trans "Calendar and list views" context "subevents" %}</h4>
|
||||
{% if sform.frontpage_subevent_ordering %}
|
||||
{% bootstrap_field sform.frontpage_subevent_ordering layout="control" %}
|
||||
@@ -372,6 +383,16 @@
|
||||
</strong>
|
||||
</div>
|
||||
{% bootstrap_field sform.waiting_list_enabled layout="control" %}
|
||||
<div data-display-dependency="#id_settings-hide_sold_out">
|
||||
<div data-display-dependency="#id_settings-waiting_list_enabled">
|
||||
<div class="alert alert-danger dynamic">
|
||||
<h4>{% trans "Incompatible settings" %}</h4>
|
||||
{% blocktrans trimmed %}
|
||||
Customers won't be able to add themselves to the waiting list, because "Hide all products that are sold out" is enabled.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% bootstrap_field sform.waiting_list_auto layout="control" %}
|
||||
<div class="form-group">
|
||||
<label class="control-label col-md-3">
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
{% load rich_text %}
|
||||
|
||||
{{ request.event.settings.payment_giftcard_public_description|rich_text }}
|
||||
<input name="giftcard" class="form-control" placeholder="{% trans "Gift card code" %}">
|
||||
|
||||
{% bootstrap_form form layout='checkout' %}
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="row" id="question-stats">
|
||||
<div class="row">
|
||||
{% if not stats %}
|
||||
<div class="empty-collection col-md-10 col-xs-12">
|
||||
<p>
|
||||
@@ -81,7 +81,7 @@
|
||||
<div class="chart" id="question_chart" data-type="{{ question.type }}">
|
||||
|
||||
</div>
|
||||
<script type="application/json" id="question-chart-data">{{ stats_json|escapejson }}</script>
|
||||
{{ stats|json_script:"question-chart-data" }}
|
||||
</div>
|
||||
<div class="col-md-5 col-xs-12">
|
||||
<table class="table table-bordered table-hover">
|
||||
@@ -89,7 +89,8 @@
|
||||
<tr>
|
||||
<th>{% trans "Answer" %}</th>
|
||||
<th class="text-right">{% trans "Count" %}</th>
|
||||
<th class="text-right">{% trans "Percentage" %}</th>
|
||||
<th class="text-right">{% trans "% of answers" %}</th>
|
||||
<th class="text-right">{% trans "% of tickets" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -102,6 +103,7 @@
|
||||
</td>
|
||||
<td class="text-right">{{ stat.count }}</td>
|
||||
<td class="text-right">{{ stat.percentage|floatformat:1 }} %</td>
|
||||
<td class="text-right">{{ stat.percentage_attendees|floatformat:1 }} %</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@@ -110,6 +112,7 @@
|
||||
<td><strong>{% trans "Sum" %}</strong></td>
|
||||
<td class="text-right"><strong>{{ total }}</strong></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
{% load captureas %}
|
||||
{% load static %}
|
||||
{% load eventsignal %}
|
||||
{% load dialog %}
|
||||
{% block title %}{% trans "Change multiple dates" context "subevent" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>
|
||||
@@ -182,21 +183,22 @@
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Quotas" %}</legend>
|
||||
{% if sampled_quotas|default_if_none:"NONE" == "NONE" %}
|
||||
<div class="alert alert-warning">
|
||||
{% blocktrans trimmed %}
|
||||
You selected a set of dates that currently have different quota setups. You can therefore
|
||||
not change their quotas in bulk. If you want, you can set up a new set of quotas to
|
||||
<strong>replace</strong> the quota setup of all selected dates.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="bulk-edit-field-group">
|
||||
<div class="bulk-edit-field-group"
|
||||
{% if sampled_quotas|default_if_none:"NONE" == "NONE" %}
|
||||
data-confirm-dialog="#confirm-override-quotas"
|
||||
{% endif %}>
|
||||
<label class="field-toggle">
|
||||
<input type="checkbox" name="_bulk" value="__quotas" {% if "__quotas" in bulk_selected %}checked{% endif %}>
|
||||
{% trans "change" context "form_bulk" %}
|
||||
</label>
|
||||
<div class="field-content">
|
||||
{% if sampled_quotas|default_if_none:"NONE" == "NONE" %}
|
||||
<div class="alert alert-warning">
|
||||
{% trans "You selected a set of dates that currently have different quota setups." %}
|
||||
{% trans "Using this option will <strong>delete all current quotas</strong> from <strong>all selected dates</strong>." %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="formset" data-formset data-formset-prefix="{{ formset.prefix }}">
|
||||
{{ formset.management_form }}
|
||||
{% bootstrap_formset_errors formset %}
|
||||
@@ -271,7 +273,7 @@
|
||||
<fieldset>
|
||||
<legend>{% trans "Check-in lists" %}</legend>
|
||||
{% if sampled_lists|default_if_none:"NONE" == "NONE" %}
|
||||
<div class="alert alert-warning">
|
||||
<div class="alert alert-info">
|
||||
{% blocktrans trimmed %}
|
||||
You selected a set of dates that currently have different check-in list setups. You can
|
||||
therefore not change their check-in lists in bulk.
|
||||
@@ -367,4 +369,17 @@
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
{% trans "Delete existing quotas" as dialog_title %}
|
||||
{% trans "Using this option will <strong>delete all current quotas</strong> from <strong>all selected dates</strong>." as dialog_text %}
|
||||
{% trans "This cannot be reverted. Are you sure to proceed?" as dialog_text2 %}
|
||||
{% dialog "confirm-override-quotas" dialog_title dialog_text|add:" "|add:dialog_text2 icon="trash" %}
|
||||
<p class="modal-card-confirm modal-card-confirm-spread">
|
||||
<button class="btn btn-lg btn-default" value="no">
|
||||
{% trans "Cancel" %}
|
||||
</button>
|
||||
<button class="btn btn-lg btn-danger" value="yes">
|
||||
{% trans "Proceed" %}
|
||||
</button>
|
||||
</p>
|
||||
{% enddialog %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -64,8 +64,9 @@ from pretix.api.serializers.item import (
|
||||
)
|
||||
from pretix.base.forms import I18nFormSet
|
||||
from pretix.base.models import (
|
||||
CartPosition, Item, ItemCategory, ItemVariation, Order, Question,
|
||||
QuestionAnswer, QuestionOption, Quota, SeatCategoryMapping, Voucher,
|
||||
CartPosition, Item, ItemCategory, ItemVariation, Order, OrderPosition,
|
||||
Question, QuestionAnswer, QuestionOption, Quota, SeatCategoryMapping,
|
||||
Voucher,
|
||||
)
|
||||
from pretix.base.models.event import SubEvent
|
||||
from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
|
||||
@@ -665,36 +666,41 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
|
||||
template_name_field = 'question'
|
||||
|
||||
def get_answer_statistics(self):
|
||||
opqs = OrderPosition.objects.filter(
|
||||
order__event=self.request.event,
|
||||
)
|
||||
qs = QuestionAnswer.objects.filter(
|
||||
question=self.object, orderposition__isnull=False,
|
||||
orderposition__order__event=self.request.event
|
||||
)
|
||||
|
||||
if self.request.GET.get("subevent", "") != "":
|
||||
qs = qs.filter(orderposition__subevent=self.request.GET["subevent"])
|
||||
opqs = opqs.filter(subevent=self.request.GET["subevent"])
|
||||
|
||||
s = self.request.GET.get("status", "np")
|
||||
if s != "":
|
||||
if s == 'o':
|
||||
qs = qs.filter(orderposition__order__status=Order.STATUS_PENDING,
|
||||
orderposition__order__expires__lt=now().replace(hour=0, minute=0, second=0))
|
||||
opqs = opqs.filter(order__status=Order.STATUS_PENDING,
|
||||
order__expires__lt=now().replace(hour=0, minute=0, second=0))
|
||||
elif s == 'np':
|
||||
qs = qs.filter(orderposition__order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
|
||||
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID])
|
||||
elif s == 'pv':
|
||||
qs = qs.filter(
|
||||
Q(orderposition__order__status=Order.STATUS_PAID) |
|
||||
Q(orderposition__order__status=Order.STATUS_PENDING, orderposition__order__valid_if_pending=True)
|
||||
opqs = opqs.filter(
|
||||
Q(order__status=Order.STATUS_PAID) |
|
||||
Q(order__status=Order.STATUS_PENDING, order__valid_if_pending=True)
|
||||
)
|
||||
elif s == 'ne':
|
||||
qs = qs.filter(orderposition__order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
|
||||
opqs = opqs.filter(order__status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED])
|
||||
else:
|
||||
qs = qs.filter(orderposition__order__status=s)
|
||||
opqs = opqs.filter(order__status=s)
|
||||
|
||||
if s not in (Order.STATUS_CANCELED, ""):
|
||||
qs = qs.filter(orderposition__canceled=False)
|
||||
opqs = opqs.filter(canceled=False)
|
||||
if self.request.GET.get("item", "") != "":
|
||||
i = self.request.GET.get("item", "")
|
||||
qs = qs.filter(orderposition__item_id__in=(i,))
|
||||
opqs = opqs.filter(item_id__in=(i,))
|
||||
|
||||
qs = qs.filter(orderposition__in=opqs)
|
||||
op_cnt = opqs.filter(item__in=self.object.items.all()).count()
|
||||
|
||||
if self.object.type == Question.TYPE_FILE:
|
||||
qs = [
|
||||
@@ -734,6 +740,7 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
|
||||
total = sum(a['count'] for a in r)
|
||||
for a in r:
|
||||
a['percentage'] = (a['count'] / total * 100.) if total else 0
|
||||
a['percentage_attendees'] = (a['count'] / op_cnt * 100.) if op_cnt else 0
|
||||
return r, total
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@@ -741,7 +748,6 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV
|
||||
ctx['items'] = self.object.items.all()
|
||||
stats = self.get_answer_statistics()
|
||||
ctx['stats'], ctx['total'] = stats
|
||||
ctx['stats_json'] = json.dumps(stats)
|
||||
return ctx
|
||||
|
||||
def get_object(self, queryset=None) -> Question:
|
||||
|
||||
@@ -5,8 +5,8 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"PO-Revision-Date: 2025-06-12 17:00+0000\n"
|
||||
"Last-Translator: Richard Schreiber <schreiber@rami.io>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/de/"
|
||||
">\n"
|
||||
"Language: de\n"
|
||||
@@ -10699,23 +10699,17 @@ msgstr ""
|
||||
"sammeln."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "URL zu Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Dies sollte bspw. ein Link zu einem Teil Ihrer Website sein, auf dem Sie "
|
||||
"beschreiben, wie Sie persönliche Daten nutzen, die Sie in Ihrem Ticketshop "
|
||||
"sammeln."
|
||||
"beschreiben, wie Ihr Ticketshop im Einklang mit Richtlinien zur "
|
||||
"Barrierefreiheit steht."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10723,22 +10717,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Titel für Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Text für Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -23870,10 +23858,8 @@ msgstr ""
|
||||
"Drittanbietern nicht kennen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Verfügbarkeit"
|
||||
msgstr "Barrierefreiheit"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -23882,12 +23868,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"In einigen Regionen, einschließlich der Europäischen Union, sind Sie "
|
||||
"verpflichtet, Informationen über die Barrierefreiheit Ihres Ticketshops zu "
|
||||
"veröffentlichen. Sie finden eine Vorlage in <a href="
|
||||
"\"https://docs.pretix.eu/de/trust/accessibility/\" target=\"_blank\">unserer "
|
||||
"Dokumentation</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"Statt einer URL kannst du auch einen Text eingeben, der von pretix angezeigt "
|
||||
"wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -33399,8 +33392,6 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Extend reservation"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Reservierung verlängern"
|
||||
|
||||
@@ -33410,7 +33401,7 @@ msgstr "Übersicht über die bestellten Produkte"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:50
|
||||
msgid "Continue with order process"
|
||||
msgstr "Mit dem Bestellprozess fortfahren"
|
||||
msgstr "Fortfahren mit dem Bestellprozess"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:55
|
||||
#: pretix/presale/templates/pretixpresale/event/index.html:232
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:08+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"de/>\n"
|
||||
@@ -728,7 +728,7 @@ msgstr "Warenkorb abgelaufen"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Ihr Warenkorb läuft gleich ab."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -739,16 +739,10 @@ msgstr[1] ""
|
||||
"Die Produkte in Ihrem Warenkorb sind noch {num} Minuten für Sie reserviert."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Warenkorb abgelaufen"
|
||||
msgstr "Ihr Warenkorb ist abgelaufen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
@@ -759,11 +753,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Möchten Sie die Reservierung verlängern?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Reservierung verlängern"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -806,12 +800,12 @@ msgstr "Menge erhöhen"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Veranstaltungen filtern nach"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtern"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1058,17 +1052,16 @@ msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Kauf fortsetzen"
|
||||
msgstr "Kauf schließen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"Sie können diese Aktion nicht abbrechen. Bitte warten Sie, bis der "
|
||||
"Ladevorgang abgeschlossen ist."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/de_Informal/>\n"
|
||||
@@ -10685,23 +10685,17 @@ msgstr ""
|
||||
"sammelst."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "URL zu Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Dies sollte bspw. ein Link zu einem Teil deiner Website sein, auf dem du "
|
||||
"beschreibst, wie du persönliche Daten nutzt, die du in deinem Ticketshop "
|
||||
"sammelst."
|
||||
"beschreibst, wie dein Ticketshop im Einklang mit Richtlinien zur "
|
||||
"Barrierefreiheit steht."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10709,22 +10703,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Titel für Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Konto-Informationen"
|
||||
msgstr "Text für Informationen zur Barrierefreiheit"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -23834,10 +23822,8 @@ msgstr ""
|
||||
"eingesetzten Drittanbietern nicht kennen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Verfügbarkeit"
|
||||
msgstr "Barrierefreiheit"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -23846,12 +23832,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"In einigen Regionen, einschließlich der Europäischen Union, bist du "
|
||||
"verpflichtet, Informationen über die Barrierefreiheit Ihres Ticketshops zu "
|
||||
"veröffentlichen. Du findest eine Vorlage in <a href="
|
||||
"\"https://docs.pretix.eu/de/trust/accessibility/\" target=\"_blank\">unserer "
|
||||
"Dokumentation</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"Statt einer URL kannst du auch einen Text eingeben, der von pretix angezeigt "
|
||||
"wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -33342,8 +33335,6 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Extend reservation"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Reservierung verlängern"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-27 10:40+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:07+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix-js/de_Informal/>\n"
|
||||
@@ -728,7 +728,7 @@ msgstr "Warenkorb abgelaufen"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Dein Warenkorb läuft gleich ab."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -739,16 +739,10 @@ msgstr[1] ""
|
||||
"Die Produkte in deinem Warenkorb sind noch {num} Minuten für dich reserviert."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Warenkorb abgelaufen"
|
||||
msgstr "Dein Warenkorb ist abgelaufen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
@@ -759,11 +753,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Möchtest du die Reservierung verlängern?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Reservierung verlängern"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -806,12 +800,12 @@ msgstr "Menge erhöhen"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Veranstaltungen filtern nach"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtern"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1058,17 +1052,16 @@ msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Kauf fortsetzen"
|
||||
msgstr "Kauf schließen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"Du kannst diese Aktion nicht abbrechen. Bitte warte, bis der Ladevorgang "
|
||||
"abgeschlossen ist."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-14 02:00+0000\n"
|
||||
"Last-Translator: Zona Vip <contacto@zonavip.mx>\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"es/>\n"
|
||||
"Language: es\n"
|
||||
@@ -4379,13 +4379,15 @@ msgstr "Opcional. Ningún producto será vendido antes de esta fecha."
|
||||
|
||||
#: pretix/base/models/event.py:621
|
||||
msgid "This event is remote or partially remote."
|
||||
msgstr ""
|
||||
msgstr "Este evento es remoto o parcialmente remoto."
|
||||
|
||||
#: pretix/base/models/event.py:622
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone "
|
||||
"and let’s us calculate users’ local times."
|
||||
msgstr ""
|
||||
"Esto se utilizará para que los usuarios sepan si el evento se celebra en una "
|
||||
"zona horaria diferente y nos permite calcular la hora local de los usuarios."
|
||||
|
||||
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
|
||||
msgid "Plugins"
|
||||
@@ -10688,22 +10690,16 @@ msgstr ""
|
||||
"cómo utiliza los datos recopilados en su taquilla virtual."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Información de la cuenta"
|
||||
msgstr "Información sobre accesibilidad URL"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Esto debería señalar, por ejemplo, a una parte de su sitio web que explica "
|
||||
"cómo utiliza los datos recopilados en su taquilla virtual."
|
||||
"Debe remitir, por ejemplo, a una parte de su sitio web que explique cómo su "
|
||||
"tienda de entradas cumple la normativa sobre accesibilidad."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10711,22 +10707,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Información de la cuenta"
|
||||
msgstr "Información sobre accesibilidad"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Información de la cuenta"
|
||||
msgstr "Título de la información sobre accesibilidad"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Información de la cuenta"
|
||||
msgstr "Texto informativo sobre accesibilidad"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -17821,7 +17811,7 @@ msgstr "Funcionamiento en modo de desarrollo"
|
||||
#: pretix/presale/templates/pretixpresale/postmessage.html:27
|
||||
#: pretix/presale/templates/pretixpresale/waiting.html:42
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr "Si esto tarda más de unos minutos, póngase en contacto con nosotros."
|
||||
msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
|
||||
@@ -23858,10 +23848,8 @@ msgstr ""
|
||||
"proveedores de pago o de seguimiento."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Disponibilidad"
|
||||
msgstr "Accesibilidad"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -23870,12 +23858,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"Algunas jurisdicciones, incluida la Unión Europea, exigen que publique "
|
||||
"información sobre la accesibilidad de su taquilla/tienda de entradas. Puede "
|
||||
"encontrar una plantilla en <a href="
|
||||
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">nuestra "
|
||||
"documentación</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"En lugar de una URL, también puede configurar un texto que se mostrará "
|
||||
"dentro de pretix. Esto se ignorará si se configura una URL."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -32408,8 +32403,6 @@ msgstr ""
|
||||
"y contraseña."
|
||||
|
||||
#: pretix/presale/forms/customer.py:74
|
||||
#, fuzzy
|
||||
#| msgid "Please verify that you entered the correct email addess."
|
||||
msgid "Please verify that you entered the correct email address."
|
||||
msgstr ""
|
||||
"Compruebe que ha introducido la dirección de correo electrónico correcta."
|
||||
@@ -33390,10 +33383,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Event description"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Descripción del evento"
|
||||
msgstr "Renovar reserva"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
|
||||
msgid "Overview of your ordered products."
|
||||
@@ -34693,10 +34684,8 @@ msgstr ""
|
||||
"Una vez completado el proceso en la nueva ventana, podrás continuar aquí."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
|
||||
#, fuzzy
|
||||
#| msgid "Closed"
|
||||
msgid "Close"
|
||||
msgstr "Cerrado"
|
||||
msgstr "Cerrar"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:79
|
||||
msgid "Adjust settings in detail"
|
||||
@@ -34740,8 +34729,6 @@ msgid "Save selection"
|
||||
msgstr "Guarda selección"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
|
||||
#, fuzzy
|
||||
#| msgid "You didn’t select any ticket."
|
||||
msgid "You didn't select any ticket."
|
||||
msgstr "No ha seleccionado ninguna entrada."
|
||||
|
||||
|
||||
@@ -8,10 +8,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-22 08:37+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:15+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
"js/es/>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/es/>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -343,7 +343,7 @@ msgstr "No"
|
||||
|
||||
#: pretix/static/lightbox/js/lightbox.js:96
|
||||
msgid "close"
|
||||
msgstr "Cerrar"
|
||||
msgstr "cerrar"
|
||||
|
||||
#: pretix/static/pretixbase/js/addressform.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:513
|
||||
@@ -416,7 +416,7 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
msgstr "Si tarda más de unos minutos, póngase en contacto con nosotros."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -725,7 +725,7 @@ msgstr "El carrito de compra ha expirado"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Su carrito está a punto de caducar."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -737,16 +737,10 @@ msgstr[1] ""
|
||||
"minutos."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "El carrito de compra ha expirado"
|
||||
msgstr "Su cesta ha caducado."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
@@ -756,11 +750,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "¿Desea renovar el periodo de reserva?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Renovar reserva"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -803,12 +797,12 @@ msgstr "Incrementar cantidad"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Filtrar eventos por"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtrar"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1056,17 +1050,14 @@ msgid "Close"
|
||||
msgstr "Cerrar"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Continuar pago"
|
||||
msgstr "Cerrar caja"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
msgstr "No puede cancelar esta operación. Espere a que finalice la carga."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -4,7 +4,7 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:06+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
|
||||
">\n"
|
||||
@@ -4396,13 +4396,16 @@ msgstr "Facultatif. Aucun produit ne sera vendu avant cette date."
|
||||
|
||||
#: pretix/base/models/event.py:621
|
||||
msgid "This event is remote or partially remote."
|
||||
msgstr ""
|
||||
msgstr "Cet événement est éloigné ou partiellement éloigné."
|
||||
|
||||
#: pretix/base/models/event.py:622
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone "
|
||||
"and let’s us calculate users’ local times."
|
||||
msgstr ""
|
||||
"Elle sera utilisée pour indiquer aux utilisateurs si l'événement se déroule "
|
||||
"dans un autre fuseau horaire et nous permettra de calculer l'heure locale "
|
||||
"des utilisateurs."
|
||||
|
||||
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
|
||||
msgid "Plugins"
|
||||
@@ -10785,22 +10788,17 @@ msgstr ""
|
||||
"explique comment vous utilisez les données collectées dans votre billetterie."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Informations sur le compte"
|
||||
msgstr "Informations d'accessibilité URL"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Cela devrait pointer par exemple vers une partie de votre site Web qui "
|
||||
"explique comment vous utilisez les données collectées dans votre billetterie."
|
||||
"Elle doit renvoyer, par exemple, à une partie de votre site web qui explique "
|
||||
"comment votre billetterie est conforme à la réglementation en matière "
|
||||
"d'accessibilité."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10808,22 +10806,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Informations sur le compte"
|
||||
msgstr "Informations sur l'accessibilité"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Informations sur le compte"
|
||||
msgstr "Titre de l'information sur l'accessibilité"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Informations sur le compte"
|
||||
msgstr "Texte d'information sur l'accessibilité"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -24041,10 +24033,8 @@ msgstr ""
|
||||
"tiers tels que les fournisseurs de paiement ou de suivi."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Disponibilité"
|
||||
msgstr "Accessibilité"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -24053,12 +24043,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"Certaines juridictions, y compris l'Union européenne, vous obligent à "
|
||||
"publier des informations sur l'accessibilité de votre billetterie. Vous "
|
||||
"pouvez trouver un modèle dans <a href="
|
||||
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">notre "
|
||||
"documentation</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"Au lieu d'une URL, vous pouvez également configurer un texte qui sera "
|
||||
"affiché dans pretix. Ce texte sera ignoré si une URL est configurée."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -32667,10 +32664,8 @@ msgstr ""
|
||||
"passe."
|
||||
|
||||
#: pretix/presale/forms/customer.py:74
|
||||
#, fuzzy
|
||||
#| msgid "Please verify that you entered the correct email addess."
|
||||
msgid "Please verify that you entered the correct email address."
|
||||
msgstr "Veuillez vérifier que vous avez saisi une adresse e-mail conforme."
|
||||
msgstr "Veuillez vérifier que vous avez saisi l'adresse électronique correcte."
|
||||
|
||||
#: pretix/presale/forms/customer.py:75
|
||||
msgid "Please enter the correct password."
|
||||
@@ -33661,10 +33656,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Event description"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Description de l’événement"
|
||||
msgstr "Renouveler la réservation"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
|
||||
msgid "Overview of your ordered products."
|
||||
@@ -35002,10 +34995,8 @@ msgstr ""
|
||||
"continuer ici."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
|
||||
#, fuzzy
|
||||
#| msgid "Closed"
|
||||
msgid "Close"
|
||||
msgstr "Fermé"
|
||||
msgstr "Fermer"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:79
|
||||
msgid "Adjust settings in detail"
|
||||
@@ -35049,8 +35040,6 @@ msgid "Save selection"
|
||||
msgstr "Enregistrer la sélection"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
|
||||
#, fuzzy
|
||||
#| msgid "You didn’t select any ticket."
|
||||
msgid "You didn't select any ticket."
|
||||
msgstr "Vous n'avez sélectionné aucun billet."
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgstr ""
|
||||
"Project-Id-Version: French\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-22 08:37+0000\n"
|
||||
"PO-Revision-Date: 2025-05-30 11:06+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"fr/>\n"
|
||||
@@ -417,7 +417,7 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
msgstr "Si cela prend plus de quelques minutes, veuillez nous contacter."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -634,8 +634,7 @@ msgstr "Erreur inconnue."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:292
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr ""
|
||||
"Votre choix de couleur a un bon contraste et il est très facile à lire !"
|
||||
msgstr "Votre choix de couleur a un bon contraste et il est très facile à lire."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:296
|
||||
msgid ""
|
||||
@@ -643,7 +642,7 @@ msgid ""
|
||||
"requirements."
|
||||
msgstr ""
|
||||
"Votre choix de couleur est assez bon pour la lecture et offre un bon "
|
||||
"contraste !"
|
||||
"contraste."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:300
|
||||
msgid ""
|
||||
@@ -727,7 +726,7 @@ msgstr "Panier expiré"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Votre panier est sur le point d'expirer."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -736,30 +735,24 @@ msgstr[0] "Les articles de votre panier sont réservés pour une minute."
|
||||
msgstr[1] "Les articles de votre panier sont réservés pendant {num} minutes."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Panier expiré"
|
||||
msgstr "Votre panier a expiré."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
msgstr ""
|
||||
"Les articles de votre panier ne vous sont plus réservés. Vous pouvez "
|
||||
"toujours compléter votre commande tant qu'ils sont disponibles."
|
||||
"Les articles de votre panier ne vous sont plus réservés. Vous pouvez encore "
|
||||
"compléter votre commande tant qu'ils sont disponibles."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Souhaitez-vous renouveler la période de réservation ?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Renouveler la réservation"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -803,12 +796,12 @@ msgstr "Augmenter la quantité"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Filtrer les événements par"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtrer"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1056,17 +1049,16 @@ msgid "Close"
|
||||
msgstr "Fermer"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Finaliser ma commande"
|
||||
msgstr "Fermer la caisse"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"Vous ne pouvez pas annuler cette opération. Veuillez attendre la fin du "
|
||||
"chargement."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-27 23:00+0000\n"
|
||||
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-06-02 09:00+0000\n"
|
||||
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"ja/>\n"
|
||||
"Language: ja\n"
|
||||
@@ -32540,10 +32540,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Event description"
|
||||
msgid "Renew reservation"
|
||||
msgstr "イベントの説明"
|
||||
msgstr "予約を更新"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
|
||||
msgid "Overview of your ordered products."
|
||||
|
||||
@@ -8,10 +8,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-12 13:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-02 09:00+0000\n"
|
||||
"Last-Translator: Hijiri Umemoto <hijiri@umemoto.org>\n"
|
||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
"js/ja/>\n"
|
||||
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -727,34 +727,27 @@ msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||
msgstr[0] "カート内の商品の予約は {num} 分以内に完了します。"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "カートの有効期限が切れています"
|
||||
msgstr "カートの保存期限が切れています。"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
msgstr ""
|
||||
"カートに入っている商品は現在売り切れです。在庫があれば、このまま注文を完了す"
|
||||
"ることができます。"
|
||||
msgstr "カートに入っている商品はお取り置きできません。在庫があれば、このまま注文を進"
|
||||
"めることができます。"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "予約の期間を更新しますか?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "予約を更新"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "主催者には%(currency)s %(amount)sが与えられます"
|
||||
msgstr "主催者は%(currency)s %(amount)sを留保します"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:202
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
@@ -762,7 +755,7 @@ msgstr "%(currency)s %(amount)s が払い戻されます"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:218
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr "イベント開催者が受け取る料金を入力してください。"
|
||||
msgstr "主催者が留保する料金を入力してください。"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:558
|
||||
msgid "Your local time:"
|
||||
|
||||
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: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
|
||||
"Last-Translator: 조정화 <junghwa.jo@om.org>\n"
|
||||
"Language-Team: Korean <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"ko/>\n"
|
||||
@@ -733,7 +733,7 @@ msgstr "카트가 만료되었습니다"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "카트가 곧 만료됩니다."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -764,11 +764,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "예약 기간을 갱신하시겠습니까?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "예약 갱신"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -811,12 +811,13 @@ msgstr "수량 증가"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "이벤트를 걸러내다(이벤트 중에서 특정 조건에 맞는 것만 골라서 보여주거나, "
|
||||
"나머지를 숨기는 것을 의미)"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "걸러내다(데이터나 목록, 정보에서 조건에 맞는 것만 보여주기라는 의미)"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1075,7 +1076,7 @@ msgstr "체크아웃 재개"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
msgstr "이 작업은 취소할 수 없습니다. 로딩이 끝날 때까지 기다려 주세요"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -7,16 +7,16 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
|
||||
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
|
||||
">\n"
|
||||
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
|
||||
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\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.11.1\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -88,7 +88,7 @@ msgstr "Grieks"
|
||||
|
||||
#: pretix/_base_settings.py:104
|
||||
msgid "Hebrew"
|
||||
msgstr ""
|
||||
msgstr "Hebreeuws"
|
||||
|
||||
#: pretix/_base_settings.py:105
|
||||
msgid "Indonesian"
|
||||
@@ -694,16 +694,16 @@ msgstr ""
|
||||
"gebruikt worden door integraties."
|
||||
|
||||
#: pretix/base/context.py:38
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
|
||||
#, python-brace-format
|
||||
msgid "<a {a_name_attr}>powered by {name}</a> <a {a_attr}>based on pretix</a>"
|
||||
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
|
||||
msgstr ""
|
||||
"<a {a_name_attr}>mogelijk gemaakt door {name}</a> <a {a_attr}> gebaseerd op "
|
||||
"pretix</a>"
|
||||
|
||||
#: pretix/base/context.py:48
|
||||
#, fuzzy, python-brace-format
|
||||
#| msgid "powered by {name} based on <a {a_attr}>pretix</a>"
|
||||
#, python-brace-format
|
||||
msgid "<a {a_attr}>powered by {name} based on pretix</a>"
|
||||
msgstr "mogelijk gemaakt door {name}, gebaseerd op <a {a_attr}>pretix</a>"
|
||||
msgstr "<a {a_attr}>medemogelijk gemaakt door {name} gebasseerd op pretix</a>"
|
||||
|
||||
#: pretix/base/context.py:55
|
||||
#, python-format
|
||||
@@ -4362,13 +4362,15 @@ msgstr "Optioneel. Er worden geen producten verkocht vóór deze datum."
|
||||
|
||||
#: pretix/base/models/event.py:621
|
||||
msgid "This event is remote or partially remote."
|
||||
msgstr ""
|
||||
msgstr "Dit evenement is afgelegen of gedeeltelijk afgelegen."
|
||||
|
||||
#: pretix/base/models/event.py:622
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone "
|
||||
"and let’s us calculate users’ local times."
|
||||
msgstr ""
|
||||
"Dit wordt gebruikt om gebruikers te laten weten of het evenement in een "
|
||||
"andere tijdzone is en laat het ons de gebruikers lokale tijdzone berekenen."
|
||||
|
||||
#: pretix/base/models/event.py:642 pretix/control/navigation.py:65
|
||||
msgid "Plugins"
|
||||
@@ -6064,10 +6066,8 @@ msgid "Cart ID (e.g. session key)"
|
||||
msgstr "Winkelwagen-ID (bijv. sessiesleutel)"
|
||||
|
||||
#: pretix/base/models/orders.py:3102
|
||||
#, fuzzy
|
||||
#| msgid "Gift card: Expiration date"
|
||||
msgid "Limit for extending expiration date"
|
||||
msgstr "Cadeaubon: Verloopdatum"
|
||||
msgstr "Limiet voor het uitstellen van de vervaldatum"
|
||||
|
||||
#: pretix/base/models/orders.py:3131
|
||||
msgid "Cart position"
|
||||
@@ -7262,10 +7262,8 @@ msgid "You cannot pay with gift cards when buying a gift card."
|
||||
msgstr "U kunt niet met cadeaubonnen betalen wanneer u een cadeaubon koopt."
|
||||
|
||||
#: pretix/base/payment.py:1467
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the correct result."
|
||||
msgid "Please enter the code of your gift card."
|
||||
msgstr "Vul alstublieft het correcte resultaat in."
|
||||
msgstr "Vul alstublieft de code van jouw cadeaukaart in."
|
||||
|
||||
#: pretix/base/payment.py:1483 pretix/base/payment.py:1526
|
||||
msgid ""
|
||||
@@ -10658,22 +10656,16 @@ msgstr ""
|
||||
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie URL"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This should point e.g. to a part of your website that explains how you "
|
||||
#| "use data gathered in your ticket shop."
|
||||
msgid ""
|
||||
"This should point e.g. to a part of your website that explains how your "
|
||||
"ticket shop complies with accessibility regulation."
|
||||
msgstr ""
|
||||
"Dit zou bijvoorbeeld naar een deel van uw website moeten wijzen dat uitlegt "
|
||||
"hoe uw de in uw ticketwinkel verzamelde gegevens gebruikt."
|
||||
"hoe uw ticketwinkel omgaat met de toegankelijkheids wetgevingen."
|
||||
|
||||
#: pretix/base/settings.py:2079
|
||||
#: pretix/presale/templates/pretixpresale/event/base.html:228
|
||||
@@ -10681,22 +10673,16 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:106
|
||||
#: pretix/presale/templates/pretixpresale/organizers/base.html:111
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie"
|
||||
|
||||
#: pretix/base/settings.py:2083
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information title"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie titel"
|
||||
|
||||
#: pretix/base/settings.py:2093
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information text"
|
||||
msgstr "Accountinformatie"
|
||||
msgstr "Toegankelijkheids informatie tekst"
|
||||
|
||||
#: pretix/base/settings.py:2114
|
||||
msgid "Attach ticket files"
|
||||
@@ -17767,7 +17753,9 @@ msgstr "draaiend in ontwikkelmodus"
|
||||
#: pretix/presale/templates/pretixpresale/postmessage.html:27
|
||||
#: pretix/presale/templates/pretixpresale/waiting.html:42
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr "Neem contact met ons op als dit langer dan een aantal minuten duurt."
|
||||
msgstr ""
|
||||
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
|
||||
"ons op."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
|
||||
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
|
||||
@@ -21253,13 +21241,11 @@ msgstr "Product met varianten"
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:118
|
||||
msgctxt "subevent"
|
||||
msgid "Product assigned to seating plan for one or more dates"
|
||||
msgstr ""
|
||||
msgstr "Product toegewezen tot een zittingsschema voor een of meerdere data"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:118
|
||||
#, fuzzy
|
||||
#| msgid "Product settings"
|
||||
msgid "Product assigned to seating plan"
|
||||
msgstr "Productinstellingen"
|
||||
msgstr "Product toegewezen tot een zittingsplan"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/index.html:126
|
||||
msgid "Only available as an add-on product"
|
||||
@@ -23786,10 +23772,8 @@ msgstr ""
|
||||
"trackingaanbieders niet kennen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:204
|
||||
#, fuzzy
|
||||
#| msgid "Availability"
|
||||
msgid "Accessibility"
|
||||
msgstr "Beschikbaarheid"
|
||||
msgstr "Toegankelijkheid"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:206
|
||||
msgid ""
|
||||
@@ -23798,12 +23782,19 @@ msgid ""
|
||||
"template in <a href=\"https://docs.pretix.eu/trust/accessibility/\" "
|
||||
"target=\"_blank\">our documentation</a>."
|
||||
msgstr ""
|
||||
"Sommige rechtsgebieden, waaronder de Europeese Unie, vereist jou om "
|
||||
"informatie te publiceren over de toegankelijkheid van je ticket winkel. Je "
|
||||
"kan een template vinden in <a href="
|
||||
"\"https://docs.pretix.eu/trust/accessibility/\" target=\"_blank\">onze "
|
||||
"documentatie</a>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:216
|
||||
msgid ""
|
||||
"Instead of an URL, you can also configure a text that will be shown within "
|
||||
"pretix. This will be ignored if a URL is configured."
|
||||
msgstr ""
|
||||
"In plaats van een URL, kan je ook een tekst instellen, dat wordt laten zien "
|
||||
"binnen pretix. Dit wordt genegeerd als een URL is ingesteld."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:228
|
||||
msgid "Barcode media"
|
||||
@@ -29091,10 +29082,8 @@ msgid "Open BezahlCode in your banking app to start the payment process."
|
||||
msgstr "Open BezahlCode in uw bank-app om het betalingsproces te starten."
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:129
|
||||
#, fuzzy
|
||||
#| msgid "Scan the qr-code with your banking app"
|
||||
msgid "Scan the QR code with your banking app"
|
||||
msgstr "Scan de qr-code met uw bankapplicatie"
|
||||
msgstr "Scan de QR-code met uw bankapplicatie"
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:141
|
||||
#, python-format
|
||||
@@ -32272,17 +32261,12 @@ msgid "You need to fill out all fields."
|
||||
msgstr "Vul alle velden in."
|
||||
|
||||
#: pretix/presale/forms/customer.py:69
|
||||
#, fuzzy
|
||||
#| msgid "Please enter a valid email address."
|
||||
msgid "You need to enter an email address."
|
||||
msgstr "Vul alstublieft een geldig e-mailadres in."
|
||||
msgstr "U moet een e-mailadres invullen."
|
||||
|
||||
#: pretix/presale/forms/customer.py:70
|
||||
#, fuzzy
|
||||
#| msgctxt "subevent"
|
||||
#| msgid "You need to select a date."
|
||||
msgid "You need to enter a password."
|
||||
msgstr "U moet een datum selecteren."
|
||||
msgstr "U moet een wachtwoord invullen."
|
||||
|
||||
#: pretix/presale/forms/customer.py:72
|
||||
msgid "We have not found an account with this email address and password."
|
||||
@@ -32291,27 +32275,18 @@ msgstr ""
|
||||
"wachtwoord vinden."
|
||||
|
||||
#: pretix/presale/forms/customer.py:74
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the same email address twice."
|
||||
msgid "Please verify that you entered the correct email address."
|
||||
msgstr "Voer twee keer hetzelfde e-mailadres in."
|
||||
msgstr "Alstublieft controleer of u het juiste emailadress heeft ingevuld."
|
||||
|
||||
#: pretix/presale/forms/customer.py:75
|
||||
#, fuzzy
|
||||
#| msgid "Please enter the correct result."
|
||||
msgid "Please enter the correct password."
|
||||
msgstr "Vul alstublieft het correcte resultaat in."
|
||||
msgstr "Vul alstublieft het correcte wachtwoord in."
|
||||
|
||||
#: pretix/presale/forms/customer.py:76
|
||||
msgid "This account is disabled."
|
||||
msgstr "Dit account is uitgeschakeld."
|
||||
|
||||
#: pretix/presale/forms/customer.py:77
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You have not yet activated your account and set a password. Please click "
|
||||
#| "the link in the email we sent you. Click \"Reset password\" to receive a "
|
||||
#| "new email in case you cannot find it again."
|
||||
msgid ""
|
||||
"You have not yet activated your account and set a password. Please click the "
|
||||
"link in the email we sent you. In case you cannot find it, click \"Forgot "
|
||||
@@ -32323,10 +32298,8 @@ msgstr ""
|
||||
"te klikken."
|
||||
|
||||
#: pretix/presale/forms/customer.py:90
|
||||
#, fuzzy
|
||||
#| msgid "Your password"
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Uw wachtwoord"
|
||||
msgstr "Wachtwoord vergeten?"
|
||||
|
||||
#: pretix/presale/forms/customer.py:146
|
||||
msgid ""
|
||||
@@ -32431,17 +32404,13 @@ msgid "Organizer: {organizer}"
|
||||
msgstr "Organisator: {organizer}"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:47
|
||||
#, fuzzy
|
||||
#| msgid "Send links"
|
||||
msgctxt "skip-to-main-nav"
|
||||
msgid "Skip link"
|
||||
msgstr "Verstuur links"
|
||||
msgstr "Sla over link"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Email content"
|
||||
msgid "Skip to main content"
|
||||
msgstr "E-mailinhoud"
|
||||
msgstr "Overslaan naar de hoofd-inhoud"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/base.html:76
|
||||
msgid "Footer Navigation"
|
||||
@@ -33286,10 +33255,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
|
||||
#, fuzzy
|
||||
#| msgid "Event description"
|
||||
msgid "Renew reservation"
|
||||
msgstr "Evenementomschrijving"
|
||||
msgstr "Vernieuw reservering"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
|
||||
msgid "Overview of your ordered products."
|
||||
@@ -33643,8 +33610,6 @@ msgstr "Toon vorige maand, %(month)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:24
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:52
|
||||
#, fuzzy
|
||||
#| msgid "Select month to show"
|
||||
msgid "Select a month to display"
|
||||
msgstr "Kies maand om te tonen"
|
||||
|
||||
@@ -33656,11 +33621,8 @@ msgstr "Maand"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:39
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:67
|
||||
#, fuzzy
|
||||
#| msgctxt "reporting_timeframe"
|
||||
#| msgid "by month"
|
||||
msgid "Show month"
|
||||
msgstr "per maand"
|
||||
msgstr "Weergeven per maand"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar.html:50
|
||||
#, python-format
|
||||
@@ -33675,10 +33637,8 @@ msgstr "Toon vorige week, %(week)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:24
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:52
|
||||
#, fuzzy
|
||||
#| msgid "Select week to show"
|
||||
msgid "Select a week to display"
|
||||
msgstr "Kies week om te tonen"
|
||||
msgstr "Kies een week om te weer te geven"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:26
|
||||
#: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:12
|
||||
@@ -33692,11 +33652,8 @@ msgstr "Kies week om te tonen"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:43
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:71
|
||||
#, fuzzy
|
||||
#| msgctxt "reporting_timeframe"
|
||||
#| msgid "by week"
|
||||
msgid "Show week"
|
||||
msgstr "per week"
|
||||
msgstr "Weergeef per week"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:54
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_subevent_calendar_week.html:73
|
||||
@@ -34622,8 +34579,6 @@ msgstr ""
|
||||
"gaan."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:58
|
||||
#, fuzzy
|
||||
#| msgid "Closed"
|
||||
msgid "Close"
|
||||
msgstr "Gesloten"
|
||||
|
||||
@@ -34668,8 +34623,6 @@ msgid "Save selection"
|
||||
msgstr "Selectie opslaan"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html:141
|
||||
#, fuzzy
|
||||
#| msgid "You did not select any products."
|
||||
msgid "You didn't select any ticket."
|
||||
msgstr "U heeft geen producten geselecteerd."
|
||||
|
||||
@@ -34678,6 +34631,8 @@ msgid ""
|
||||
"Please tick a checkbox or enter a quantity for one of the ticket types to "
|
||||
"add to the cart."
|
||||
msgstr ""
|
||||
"Alstublieft klik op een selectievak of voeg een quantiteit toe voor een van "
|
||||
"de ticket types in de winkelwagen."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:82
|
||||
#, python-format
|
||||
@@ -34729,10 +34684,9 @@ msgid "Event overview"
|
||||
msgstr "Evenementenoverzicht"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:21
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Show next month, %(month)s"
|
||||
#, python-format
|
||||
msgid "Events in %(month)s"
|
||||
msgstr "Toon volgende maand, %(month)s"
|
||||
msgstr "Evenementen in %(month)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar.html:91
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:104
|
||||
@@ -34742,28 +34696,22 @@ msgstr ""
|
||||
"Merk op dat de evenementen in dit overzicht in verschillende tijdzones zijn."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:21
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Entry scan: %(date)s"
|
||||
#, python-format
|
||||
msgid "Events on %(day)s"
|
||||
msgstr "Ingangsscan: %(date)s"
|
||||
msgstr "Evenementen op %(day)s"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:52
|
||||
#, fuzzy
|
||||
#| msgctxt "subevents"
|
||||
#| msgid "Select date"
|
||||
msgid "Select a date to display"
|
||||
msgstr "Kies een datum"
|
||||
msgstr "Kies een datum om weer te geven"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:59
|
||||
#, fuzzy
|
||||
#| msgid "Show start date"
|
||||
msgid "Show date"
|
||||
msgstr "Toon startdatum"
|
||||
msgstr "Weergeef startdatum"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/calendar_week.html:21
|
||||
#, python-format
|
||||
msgid "Events in %(week)s (%(week_day_from)s – %(week_day_to)s)"
|
||||
msgstr ""
|
||||
msgstr "Evenementen in %(week)s (%(week_day_from)s – %(week_day_to)s)"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:5
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:10
|
||||
@@ -34997,10 +34945,8 @@ msgid "Your cart is now empty."
|
||||
msgstr "Uw winkelwagen is nu leeg."
|
||||
|
||||
#: pretix/presale/views/cart.py:553
|
||||
#, fuzzy
|
||||
#| msgid "Your cart has been updated."
|
||||
msgid "Your cart timeout was extended."
|
||||
msgstr "Uw winkelwagen is bijgewerkt."
|
||||
msgstr "Uw winkelwagens tijdslimiet is verlengt."
|
||||
|
||||
#: pretix/presale/views/cart.py:568
|
||||
msgid "The products have been successfully added to your cart."
|
||||
|
||||
@@ -7,8 +7,8 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2025-05-01 02:00+0000\n"
|
||||
"Last-Translator: Foxy Hunter <matthias.vancoillie@outlook.com>\n"
|
||||
"PO-Revision-Date: 2025-06-10 04:00+0000\n"
|
||||
"Last-Translator: Tim Maurizio Dullaart <Tim.maurizio@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"nl/>\n"
|
||||
"Language: nl\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.11.1\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -415,6 +415,8 @@ msgstr ""
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
"Als dit langer dan een paar minuten duurt, neem dan alstublieft contact met "
|
||||
"ons op."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -626,25 +628,26 @@ msgid "Unknown error."
|
||||
msgstr "Onbekende fout."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:292
|
||||
#, fuzzy
|
||||
#| msgid "Your color has great contrast and is very easy to read!"
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "Uw kleur heeft een goed contrast, en is gemakkelijk te lezen!"
|
||||
msgstr ""
|
||||
"Uw kleur heeft een goed contrast, en zal zorgen voor een uitstekende "
|
||||
"toegankelijkheid."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:296
|
||||
#, fuzzy
|
||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||
msgid ""
|
||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||
"requirements."
|
||||
msgstr ""
|
||||
"Uw kleur heeft een redelijk contrast, en is waarschijnlijk goed te lezen!"
|
||||
"Uw kleur heeft een redelijk contrast, en is voldoende voor de minimale "
|
||||
"toegankelijkheids eisen."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:300
|
||||
msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"Uw kleur heeft een te weinig contrast met wit. De toegankelijkheid van jouw "
|
||||
"site wordt beïnvloed."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:416
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:436
|
||||
@@ -720,7 +723,7 @@ msgstr "Winkelwagen is verlopen"
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Uw winkelwagen staat op het punt om te verlopen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
@@ -730,16 +733,10 @@ msgstr[1] ""
|
||||
"De items in uw winkelwagen zijn nog {num} minuten voor u gereserveerd."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Winkelwagen is verlopen"
|
||||
msgstr "Uw winkelwagen is verlopen."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
@@ -749,11 +746,11 @@ msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Wilt u de reservererings periode vernieuwen?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Vernieuw reservering"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -796,12 +793,12 @@ msgstr "Verhoog aantal"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Filter evenementen op"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filter"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
@@ -1050,17 +1047,15 @@ msgid "Close"
|
||||
msgstr "Sluiten"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Doorgaan met afrekenen"
|
||||
msgstr "Stoppen met afrekenen"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"U kan niet deze actie annuleren. Alstublieft wacht tot het laden is voltooid."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-04-28 01:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-02 23:00+0000\n"
|
||||
"Last-Translator: Anarion Dunedain <anarion80@gmail.com>\n"
|
||||
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix/pl/"
|
||||
">\n"
|
||||
@@ -18,7 +18,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.11\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
@@ -11070,7 +11070,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:2434
|
||||
#, python-brace-format
|
||||
msgid "Your order is about to expire: {code}"
|
||||
msgstr "Twoje zamówienie ma wygasa: {code}"
|
||||
msgstr "Twoje zamówienie wkrótce wygaśnie: {code}"
|
||||
|
||||
#: pretix/base/settings.py:2438
|
||||
#, python-brace-format
|
||||
@@ -11090,7 +11090,7 @@ msgstr ""
|
||||
"Witaj,\n"
|
||||
"\n"
|
||||
"Nie otrzymaliśmy jeszcze pełnej płatności za zamówienie na {event}.\n"
|
||||
"Pamiętaj, że Twoje zamówienie będzi pewne tylko wtedy, jeżeli otrzymamy\n"
|
||||
"Pamiętaj, że Twoje zamówienie będzie pewne tylko wtedy, jeżeli otrzymamy\n"
|
||||
"Twoją płatność przed {expire_date}.\n"
|
||||
"\n"
|
||||
"Możesz wyświetlić informacje o płatności i status Twojego zamówienia pod "
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-02-03 16:07+0000\n"
|
||||
"Last-Translator: Cornelius Kibelka <ckibelka-ctr@wikimedia.org>\n"
|
||||
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
|
||||
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
|
||||
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix/pt/>\n"
|
||||
"Language: pt\n"
|
||||
@@ -17,59 +17,59 @@ 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.9.2\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/_base_settings.py:87
|
||||
msgid "English"
|
||||
msgstr ""
|
||||
msgstr "Inglês"
|
||||
|
||||
#: pretix/_base_settings.py:88
|
||||
msgid "German"
|
||||
msgstr ""
|
||||
msgstr "Alemão"
|
||||
|
||||
#: pretix/_base_settings.py:89
|
||||
msgid "German (informal)"
|
||||
msgstr ""
|
||||
msgstr "Alemão (informal)"
|
||||
|
||||
#: pretix/_base_settings.py:90
|
||||
msgid "Arabic"
|
||||
msgstr ""
|
||||
msgstr "Arabe"
|
||||
|
||||
#: pretix/_base_settings.py:91
|
||||
msgid "Basque"
|
||||
msgstr ""
|
||||
msgstr "Basco"
|
||||
|
||||
#: pretix/_base_settings.py:92
|
||||
msgid "Catalan"
|
||||
msgstr ""
|
||||
msgstr "Catalão"
|
||||
|
||||
#: pretix/_base_settings.py:93
|
||||
msgid "Chinese (simplified)"
|
||||
msgstr ""
|
||||
msgstr "Chinês (simplificado)"
|
||||
|
||||
#: pretix/_base_settings.py:94
|
||||
msgid "Chinese (traditional)"
|
||||
msgstr ""
|
||||
msgstr "chinês (tradicional)"
|
||||
|
||||
#: pretix/_base_settings.py:95
|
||||
msgid "Czech"
|
||||
msgstr ""
|
||||
msgstr "Tcheco"
|
||||
|
||||
#: pretix/_base_settings.py:96
|
||||
msgid "Croatian"
|
||||
msgstr ""
|
||||
msgstr "Croata"
|
||||
|
||||
#: pretix/_base_settings.py:97
|
||||
msgid "Danish"
|
||||
msgstr ""
|
||||
msgstr "Dinamarquês"
|
||||
|
||||
#: pretix/_base_settings.py:98
|
||||
msgid "Dutch"
|
||||
msgstr "Alemão"
|
||||
msgstr "Holandês"
|
||||
|
||||
#: pretix/_base_settings.py:99
|
||||
msgid "Dutch (informal)"
|
||||
msgstr "Alemão (informal)"
|
||||
msgstr "Holandês (informal)"
|
||||
|
||||
#: pretix/_base_settings.py:100
|
||||
msgid "French"
|
||||
@@ -81,7 +81,7 @@ msgstr "Finlandês"
|
||||
|
||||
#: pretix/_base_settings.py:102
|
||||
msgid "Galician"
|
||||
msgstr ""
|
||||
msgstr "Galego"
|
||||
|
||||
#: pretix/_base_settings.py:103
|
||||
msgid "Greek"
|
||||
@@ -89,11 +89,11 @@ msgstr "Grego"
|
||||
|
||||
#: pretix/_base_settings.py:104
|
||||
msgid "Hebrew"
|
||||
msgstr ""
|
||||
msgstr "Hebraico"
|
||||
|
||||
#: pretix/_base_settings.py:105
|
||||
msgid "Indonesian"
|
||||
msgstr ""
|
||||
msgstr "Indonésio"
|
||||
|
||||
#: pretix/_base_settings.py:106
|
||||
msgid "Italian"
|
||||
@@ -101,15 +101,15 @@ msgstr "Italiano"
|
||||
|
||||
#: pretix/_base_settings.py:107
|
||||
msgid "Japanese"
|
||||
msgstr ""
|
||||
msgstr "Japonês"
|
||||
|
||||
#: pretix/_base_settings.py:108
|
||||
msgid "Latvian"
|
||||
msgstr ""
|
||||
msgstr "Letão"
|
||||
|
||||
#: pretix/_base_settings.py:109
|
||||
msgid "Norwegian Bokmål"
|
||||
msgstr ""
|
||||
msgstr "Bokmål norueguês"
|
||||
|
||||
#: pretix/_base_settings.py:110
|
||||
msgid "Polish"
|
||||
@@ -125,7 +125,7 @@ msgstr "Português (Brasil)"
|
||||
|
||||
#: pretix/_base_settings.py:113
|
||||
msgid "Romanian"
|
||||
msgstr ""
|
||||
msgstr "Romano"
|
||||
|
||||
#: pretix/_base_settings.py:114
|
||||
msgid "Russian"
|
||||
@@ -133,11 +133,11 @@ msgstr "Russo"
|
||||
|
||||
#: pretix/_base_settings.py:115
|
||||
msgid "Slovak"
|
||||
msgstr ""
|
||||
msgstr "Eslovaco"
|
||||
|
||||
#: pretix/_base_settings.py:116
|
||||
msgid "Swedish"
|
||||
msgstr ""
|
||||
msgstr "Suéco"
|
||||
|
||||
#: pretix/_base_settings.py:117
|
||||
msgid "Spanish"
|
||||
@@ -149,7 +149,7 @@ msgstr "Turco"
|
||||
|
||||
#: pretix/_base_settings.py:119
|
||||
msgid "Ukrainian"
|
||||
msgstr ""
|
||||
msgstr "Ucraniano"
|
||||
|
||||
#: pretix/api/auth/devicesecurity.py:58
|
||||
msgid ""
|
||||
@@ -184,10 +184,8 @@ msgid "Allowed URIs list, space separated"
|
||||
msgstr "Lista de URIs permitidos, separados por espaço"
|
||||
|
||||
#: pretix/api/models.py:47
|
||||
#, fuzzy
|
||||
#| msgid "Allowed URIs list, space separated"
|
||||
msgid "Allowed Post Logout URIs list, space separated"
|
||||
msgstr "Lista de URIs permitidos, separados por espaço"
|
||||
msgstr "Lista de URIs de saída de postagem permitidas, separadas por espaços"
|
||||
|
||||
#: pretix/api/models.py:51 pretix/base/models/customers.py:406
|
||||
#: pretix/plugins/paypal/payment.py:113 pretix/plugins/paypal2/payment.py:110
|
||||
@@ -233,7 +231,7 @@ msgstr "Comentário"
|
||||
|
||||
#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1414
|
||||
msgid "The product \"{}\" is not assigned to a quota."
|
||||
msgstr ""
|
||||
msgstr "O produto \"{}\" não está atribuído a uma cota."
|
||||
|
||||
#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1685
|
||||
#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2184
|
||||
@@ -251,6 +249,8 @@ msgid ""
|
||||
"Events cannot be created as 'live'. Quotas and payment must be added to the "
|
||||
"event before sales can go live."
|
||||
msgstr ""
|
||||
"Eventos não podem ser criados como \"ao vivo\". Cotas e pagamentos devem ser "
|
||||
"adicionados ao evento antes que as vendas sejam publicadas."
|
||||
|
||||
#: pretix/api/serializers/event.py:246 pretix/api/serializers/event.py:555
|
||||
#, python-brace-format
|
||||
@@ -281,21 +281,23 @@ msgstr "A propriedade de metadados do item '{name}' não existe."
|
||||
|
||||
#: pretix/api/serializers/item.py:207 pretix/control/forms/item.py:1267
|
||||
msgid "The bundled item must not be the same item as the bundling one."
|
||||
msgstr ""
|
||||
msgstr "O item agrupado não deve ser o mesmo item que o do pacote."
|
||||
|
||||
#: pretix/api/serializers/item.py:210 pretix/control/forms/item.py:1269
|
||||
msgid "The bundled item must not have bundles on its own."
|
||||
msgstr ""
|
||||
msgstr "O item agrupado não deve ter pacotes próprios."
|
||||
|
||||
#: pretix/api/serializers/item.py:298
|
||||
msgid ""
|
||||
"Updating add-ons, bundles, or variations via PATCH/PUT is not supported. "
|
||||
"Please use the dedicated nested endpoint."
|
||||
msgstr ""
|
||||
"Não há suporte para atualização de complementos, pacotes ou variações via "
|
||||
"PATCH/PUT. Use o endpoint aninhado dedicado."
|
||||
|
||||
#: pretix/api/serializers/item.py:306
|
||||
msgid "Only admission products can currently be personalized."
|
||||
msgstr ""
|
||||
msgstr "Atualmente, somente produtos de admissão podem ser personalizados."
|
||||
|
||||
#: pretix/api/serializers/item.py:317
|
||||
msgid ""
|
||||
@@ -317,6 +319,8 @@ msgid ""
|
||||
"Updating options via PATCH/PUT is not supported. Please use the dedicated "
|
||||
"nested endpoint."
|
||||
msgstr ""
|
||||
"A atualização de opções via PATCH/PUT não é suportada. Use o endpoint "
|
||||
"aninhado dedicado."
|
||||
|
||||
#: pretix/api/serializers/item.py:533 pretix/control/forms/item.py:178
|
||||
msgid "Question cannot depend on a question asked during check-in."
|
||||
@@ -351,7 +355,7 @@ msgstr ""
|
||||
#: pretix/api/serializers/order.py:79
|
||||
#, python-brace-format
|
||||
msgid "\"{input}\" is not a valid choice."
|
||||
msgstr ""
|
||||
msgstr "\"{input}\" não é uma escolha válida."
|
||||
|
||||
#: pretix/api/serializers/order.py:1375 pretix/api/views/cart.py:224
|
||||
#: pretix/base/services/orders.py:1533
|
||||
@@ -367,11 +371,12 @@ msgstr "O produto \"{}\" não está disponível nesta data."
|
||||
msgid ""
|
||||
"There is not enough quota available on quota \"{}\" to perform the operation."
|
||||
msgstr ""
|
||||
"Não há cota suficiente disponível na cota \"{}\" para executar a operação."
|
||||
|
||||
#: pretix/api/serializers/organizer.py:105
|
||||
#: pretix/control/forms/organizer.py:892 pretix/presale/forms/customer.py:456
|
||||
msgid "An account with this email address is already registered."
|
||||
msgstr ""
|
||||
msgstr "Uma conta com este endereço de e-mail já está registrada."
|
||||
|
||||
#: pretix/api/serializers/organizer.py:238
|
||||
#: pretix/control/forms/organizer.py:741
|
||||
@@ -400,11 +405,11 @@ msgstr "Este usuário já tem permissões para esta equipe."
|
||||
#: pretix/api/views/cart.py:209
|
||||
msgid ""
|
||||
"The specified voucher has already been used the maximum number of times."
|
||||
msgstr ""
|
||||
msgstr "O voucher especificado já foi utilizado o número máximo de vezes."
|
||||
|
||||
#: pretix/api/views/checkin.py:611 pretix/api/views/checkin.py:618
|
||||
msgid "Medium connected to other event"
|
||||
msgstr ""
|
||||
msgstr "Meio conectado a outro evento"
|
||||
|
||||
#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:692
|
||||
#, python-brace-format
|
||||
@@ -462,9 +467,8 @@ msgid "Order expired"
|
||||
msgstr "Pedido expirado"
|
||||
|
||||
#: pretix/api/webhooks.py:261
|
||||
#, fuzzy
|
||||
msgid "Order expiry date changed"
|
||||
msgstr "Informações de pedido alteradas"
|
||||
msgstr "Data de validade do pedido alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:265 pretix/base/notifications.py:269
|
||||
msgid "Order information changed"
|
||||
@@ -480,9 +484,8 @@ msgid "Order changed"
|
||||
msgstr "Pedido alterado"
|
||||
|
||||
#: pretix/api/webhooks.py:277
|
||||
#, fuzzy
|
||||
msgid "Refund of payment created"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento criado"
|
||||
|
||||
#: pretix/api/webhooks.py:281 pretix/base/notifications.py:293
|
||||
msgid "External refund of payment"
|
||||
@@ -490,28 +493,23 @@ msgstr "Reembolso externo de pagamento"
|
||||
|
||||
#: pretix/api/webhooks.py:285
|
||||
msgid "Refund of payment requested by customer"
|
||||
msgstr ""
|
||||
msgstr "Reembolso do pagamento solicitado pelo cliente"
|
||||
|
||||
#: pretix/api/webhooks.py:289
|
||||
#, fuzzy
|
||||
msgid "Refund of payment completed"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento concluído"
|
||||
|
||||
#: pretix/api/webhooks.py:293
|
||||
#, fuzzy
|
||||
msgid "Refund of payment canceled"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Reembolso de pagamento cancelado"
|
||||
|
||||
#: pretix/api/webhooks.py:297
|
||||
#, fuzzy
|
||||
msgid "Refund of payment failed"
|
||||
msgstr "Reembolso externo de pagamento"
|
||||
msgstr "Falha no reembolso do pagamento"
|
||||
|
||||
#: pretix/api/webhooks.py:301
|
||||
#, fuzzy
|
||||
#| msgid "Payment provider"
|
||||
msgid "Payment confirmed"
|
||||
msgstr "Provedor de pagamento"
|
||||
msgstr "Pagamento confirmado"
|
||||
|
||||
#: pretix/api/webhooks.py:305
|
||||
msgid "Order approved"
|
||||
@@ -522,18 +520,16 @@ msgid "Order denied"
|
||||
msgstr "Pedido negado"
|
||||
|
||||
#: pretix/api/webhooks.py:313
|
||||
#, fuzzy
|
||||
#| msgid "Order denied"
|
||||
msgid "Order deleted"
|
||||
msgstr "Pedido negado"
|
||||
msgstr "Pedido excluído"
|
||||
|
||||
#: pretix/api/webhooks.py:317
|
||||
msgid "Ticket checked in"
|
||||
msgstr "Ingresso registrado"
|
||||
msgstr "Check-in do bilhete"
|
||||
|
||||
#: pretix/api/webhooks.py:321
|
||||
msgid "Ticket check-in reverted"
|
||||
msgstr "Ingresso revertido"
|
||||
msgstr "O check-in do bilhete foi revertido"
|
||||
|
||||
#: pretix/api/webhooks.py:325
|
||||
msgid "Event created"
|
||||
@@ -544,14 +540,13 @@ msgid "Event details changed"
|
||||
msgstr "Detalhes do evento alterados"
|
||||
|
||||
#: pretix/api/webhooks.py:333
|
||||
#, fuzzy
|
||||
msgid "Event deleted"
|
||||
msgstr "Evento criado"
|
||||
msgstr "Evento excluído"
|
||||
|
||||
#: pretix/api/webhooks.py:337
|
||||
msgctxt "subevent"
|
||||
msgid "Event series date added"
|
||||
msgstr "Data da série de eventos adicionada"
|
||||
msgstr "Data de adição da série de eventos"
|
||||
|
||||
#: pretix/api/webhooks.py:341
|
||||
msgctxt "subevent"
|
||||
@@ -561,64 +556,59 @@ msgstr "Data da série de eventos alterada"
|
||||
#: pretix/api/webhooks.py:345
|
||||
msgctxt "subevent"
|
||||
msgid "Event series date deleted"
|
||||
msgstr "Data da série de eventos apagada"
|
||||
msgstr "Data da série de eventos excluída"
|
||||
|
||||
#: pretix/api/webhooks.py:349
|
||||
msgid ""
|
||||
"Product changed (including product added or deleted and including changes to "
|
||||
"nested objects like variations or bundles)"
|
||||
msgstr ""
|
||||
"Produto alterado (incluindo produtos adicionados ou excluídos e incluindo "
|
||||
"alterações em objetos aninhados, como variações ou pacotes)"
|
||||
|
||||
#: pretix/api/webhooks.py:354
|
||||
msgid "Shop taken live"
|
||||
msgstr ""
|
||||
msgstr "Loja ao vivo"
|
||||
|
||||
#: pretix/api/webhooks.py:358
|
||||
msgid "Shop taken offline"
|
||||
msgstr ""
|
||||
msgstr "Loja offline"
|
||||
|
||||
#: pretix/api/webhooks.py:362
|
||||
#, fuzzy
|
||||
msgid "Test-Mode of shop has been activated"
|
||||
msgstr "A equipe selecionada não pode ser deletada."
|
||||
msgstr "O modo de teste da loja foi ativado"
|
||||
|
||||
#: pretix/api/webhooks.py:366
|
||||
#, fuzzy
|
||||
msgid "Test-Mode of shop has been deactivated"
|
||||
msgstr "A equipe selecionada não pode ser deletada."
|
||||
msgstr "O modo de teste da loja foi desativado"
|
||||
|
||||
#: pretix/api/webhooks.py:370
|
||||
msgid "Waiting list entry added"
|
||||
msgstr ""
|
||||
msgstr "Adicionado em aguardando na lista de espera"
|
||||
|
||||
#: pretix/api/webhooks.py:374
|
||||
#, fuzzy
|
||||
msgid "Waiting list entry changed"
|
||||
msgstr "O valor foi creditado no seu cartão."
|
||||
msgstr "Entrada na lista de espera alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:378
|
||||
#, fuzzy
|
||||
msgid "Waiting list entry deleted"
|
||||
msgstr "O valor foi creditado no seu cartão."
|
||||
msgstr "Entrada na lista de espera excluída"
|
||||
|
||||
#: pretix/api/webhooks.py:382
|
||||
msgid "Waiting list entry received voucher"
|
||||
msgstr ""
|
||||
msgstr "Inscrição na lista de espera recebeu voucher"
|
||||
|
||||
#: pretix/api/webhooks.py:386
|
||||
#, fuzzy
|
||||
msgid "Customer account created"
|
||||
msgstr "País"
|
||||
msgstr "Conta de cliente criada"
|
||||
|
||||
#: pretix/api/webhooks.py:390
|
||||
#, fuzzy
|
||||
msgid "Customer account changed"
|
||||
msgstr "País"
|
||||
msgstr "Conta do cliente alterada"
|
||||
|
||||
#: pretix/api/webhooks.py:394
|
||||
#, fuzzy
|
||||
msgid "Customer account anonymized"
|
||||
msgstr "País"
|
||||
msgstr "Conta de cliente anonimizada"
|
||||
|
||||
#: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103
|
||||
#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1004
|
||||
@@ -631,15 +621,15 @@ msgstr "País"
|
||||
#: pretix/plugins/banktransfer/payment.py:679
|
||||
#: pretix/presale/forms/customer.py:151
|
||||
msgid "This field is required."
|
||||
msgstr ""
|
||||
msgstr "Este campo é obrigatório."
|
||||
|
||||
#: pretix/base/addressvalidation.py:213
|
||||
msgid "Enter a postal code in the format XXX."
|
||||
msgstr ""
|
||||
msgstr "Digite um código postal no formato XXX."
|
||||
|
||||
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
|
||||
msgid "Enter a postal code in the format XXXX."
|
||||
msgstr ""
|
||||
msgstr "Digite um código postal no formato XXXX."
|
||||
|
||||
#: pretix/base/auth.py:146
|
||||
#, python-brace-format
|
||||
@@ -680,7 +670,7 @@ msgstr "Senha"
|
||||
|
||||
#: pretix/base/auth.py:176 pretix/base/auth.py:183
|
||||
msgid "Your password must contain both numeric and alphabetic characters."
|
||||
msgstr ""
|
||||
msgstr "Sua senha deve conter caracteres numéricos e alfabéticos."
|
||||
|
||||
#: pretix/base/auth.py:202 pretix/base/auth.py:212
|
||||
#, python-format
|
||||
@@ -688,8 +678,10 @@ msgid "Your password may not be the same as your previous password."
|
||||
msgid_plural ""
|
||||
"Your password may not be the same as one of your %(history_length)s previous "
|
||||
"passwords."
|
||||
msgstr[0] ""
|
||||
msgstr[0] "Sua senha pode não ser a mesma que sua senha anterior."
|
||||
msgstr[1] ""
|
||||
"Sua senha pode não ser a mesma que uma das suas senhas anteriores de "
|
||||
"%(history_length)s."
|
||||
|
||||
#: pretix/base/channels.py:168
|
||||
msgid "Online shop"
|
||||
@@ -697,13 +689,15 @@ msgstr "Loja online"
|
||||
|
||||
#: pretix/base/channels.py:174
|
||||
msgid "API"
|
||||
msgstr ""
|
||||
msgstr "API"
|
||||
|
||||
#: pretix/base/channels.py:175
|
||||
msgid ""
|
||||
"API sales channels come with no built-in functionality, but may be used for "
|
||||
"custom integrations."
|
||||
msgstr ""
|
||||
"API de canais de vendas de não vêm com nenhuma funcionalidade integrada, "
|
||||
"mas podem ser usados para integrações personalizadas."
|
||||
|
||||
#: pretix/base/context.py:38
|
||||
#, fuzzy, python-brace-format
|
||||
@@ -729,25 +723,27 @@ msgstr "código-fonte"
|
||||
#: pretix/base/customersso/oidc.py:61
|
||||
#, python-brace-format
|
||||
msgid "Configuration option \"{name}\" is missing."
|
||||
msgstr ""
|
||||
msgstr "A opção de configuração \"{name}\" está ausente."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:69 pretix/base/customersso/oidc.py:74
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unable to retrieve configuration from \"{url}\". Error message: \"{error}\"."
|
||||
msgstr ""
|
||||
"Não foi possível recuperar a configuração de \"{url}\". Mensagem de erro: "
|
||||
"\"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:80 pretix/base/customersso/oidc.py:85
|
||||
#: pretix/base/customersso/oidc.py:90 pretix/base/customersso/oidc.py:95
|
||||
#: pretix/base/customersso/oidc.py:100 pretix/base/customersso/oidc.py:105
|
||||
#, python-brace-format
|
||||
msgid "Incompatible SSO provider: \"{error}\"."
|
||||
msgstr ""
|
||||
msgstr "Provedor SSO incompatível: \"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:111
|
||||
#, python-brace-format
|
||||
msgid "You are not requesting \"{scope}\"."
|
||||
msgstr ""
|
||||
msgstr "Você não está solicitando \"{scope}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:117
|
||||
#, python-brace-format
|
||||
@@ -755,6 +751,8 @@ msgid ""
|
||||
"You are requesting scope \"{scope}\" but provider only supports these: "
|
||||
"{scopes}."
|
||||
msgstr ""
|
||||
"Você está solicitando o escopo \"{scope}\", mas o provedor só oferece "
|
||||
"suporte a estes: {scopes}."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:127
|
||||
#, python-brace-format
|
||||
@@ -762,6 +760,8 @@ msgid ""
|
||||
"You are requesting field \"{field}\" but provider only supports these: "
|
||||
"{fields}."
|
||||
msgstr ""
|
||||
"Você está solicitando o campo \"{field}\", mas o provedor suporta somente "
|
||||
"estes: {fields}."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:219 pretix/base/customersso/oidc.py:226
|
||||
#: pretix/base/customersso/oidc.py:245 pretix/base/customersso/oidc.py:262
|
||||
@@ -770,13 +770,15 @@ msgstr ""
|
||||
#: pretix/presale/views/customer.py:866
|
||||
#, python-brace-format
|
||||
msgid "Login was not successful. Error message: \"{error}\"."
|
||||
msgstr ""
|
||||
msgstr "O login não foi bem-sucedido. Mensagem de erro: \"{error}\"."
|
||||
|
||||
#: pretix/base/customersso/oidc.py:252
|
||||
msgid ""
|
||||
"The email address on this account is not yet verified. Please first confirm "
|
||||
"the email address in your customer account."
|
||||
msgstr ""
|
||||
"O endereço de e-mail desta conta ainda não foi verificado. Primeiro, "
|
||||
"confirme o endereço de e-mail na sua conta de cliente."
|
||||
|
||||
#: pretix/base/email.py:203 pretix/base/exporters/items.py:157
|
||||
#: pretix/base/exporters/items.py:205 pretix/control/views/main.py:322
|
||||
@@ -830,17 +832,17 @@ msgstr "Respostas para perguntas sobre o upload de arquivos"
|
||||
#: pretix/base/exporters/orderlist.py:1241
|
||||
#: pretix/plugins/reports/exporters.py:478
|
||||
#: pretix/plugins/reports/exporters.py:651
|
||||
#, fuzzy
|
||||
#| msgid "Order data"
|
||||
msgctxt "export_category"
|
||||
msgid "Order data"
|
||||
msgstr "Dia do pedido"
|
||||
msgstr "Data do pedido"
|
||||
|
||||
#: pretix/base/exporters/answers.py:56
|
||||
msgid ""
|
||||
"Download a ZIP file including all files that have been uploaded by your "
|
||||
"customers while creating an order."
|
||||
msgstr ""
|
||||
"Baixe um arquivo ZIP incluindo todos os arquivos que foram enviados pelos "
|
||||
"seus clientes ao criar um pedido."
|
||||
|
||||
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1767
|
||||
#: pretix/control/navigation.py:172
|
||||
@@ -881,7 +883,7 @@ msgstr "Perguntas"
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_change_form.html:20
|
||||
msgctxt "subevent"
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Data"
|
||||
|
||||
#: pretix/base/exporters/answers.py:79 pretix/base/exporters/answers.py:88
|
||||
#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1611
|
||||
@@ -899,22 +901,22 @@ msgstr ""
|
||||
#: pretix/plugins/sendmail/forms.py:351
|
||||
msgctxt "subevent"
|
||||
msgid "All dates"
|
||||
msgstr ""
|
||||
msgstr "Todas as datas"
|
||||
|
||||
#: pretix/base/exporters/customers.py:49 pretix/control/navigation.py:606
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:132
|
||||
msgid "Customer accounts"
|
||||
msgstr ""
|
||||
msgstr "Contas de clientes"
|
||||
|
||||
#: pretix/base/exporters/customers.py:51
|
||||
#, fuzzy
|
||||
msgctxt "export_category"
|
||||
msgid "Customer accounts"
|
||||
msgstr "País"
|
||||
msgstr "Contas de clientes"
|
||||
|
||||
#: pretix/base/exporters/customers.py:52
|
||||
msgid "Download a spreadsheet of all currently registered customer accounts."
|
||||
msgstr ""
|
||||
"Baixe uma planilha de todas as contas de clientes registradas atualmente."
|
||||
|
||||
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:29
|
||||
@@ -922,20 +924,19 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/event/checkout_customer.html:36
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:37
|
||||
msgid "Customer ID"
|
||||
msgstr ""
|
||||
msgstr "ID do cliente"
|
||||
|
||||
#: pretix/base/exporters/customers.py:65
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:32
|
||||
#, fuzzy
|
||||
msgid "SSO provider"
|
||||
msgstr "Provedor de pagamento"
|
||||
msgstr "Provedor de SSO"
|
||||
|
||||
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:36
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
|
||||
#: pretix/control/templates/pretixcontrol/users/form.html:49
|
||||
msgid "External identifier"
|
||||
msgstr ""
|
||||
msgstr "Identificador externo"
|
||||
|
||||
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:262
|
||||
#: pretix/base/exporters/orderlist.py:445
|
||||
@@ -960,7 +961,7 @@ msgstr "Número de telefone"
|
||||
#: pretix/base/settings.py:3640 pretix/base/settings.py:3652
|
||||
#: pretix/control/templates/pretixcontrol/users/index.html:47
|
||||
msgid "Full name"
|
||||
msgstr ""
|
||||
msgstr "Nome Completo"
|
||||
|
||||
#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:206
|
||||
#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:332
|
||||
@@ -1008,21 +1009,21 @@ msgstr "Nome"
|
||||
|
||||
#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99
|
||||
msgid "Account active"
|
||||
msgstr ""
|
||||
msgstr "Conta ativa"
|
||||
|
||||
#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100
|
||||
msgid "Verified email address"
|
||||
msgstr ""
|
||||
msgstr "Endereço de e-mail verificado"
|
||||
|
||||
#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:68
|
||||
msgid "Last login"
|
||||
msgstr ""
|
||||
msgstr "Último login"
|
||||
|
||||
#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:66
|
||||
msgid "Registration date"
|
||||
msgstr ""
|
||||
msgstr "Data de inscrição"
|
||||
|
||||
#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205
|
||||
#: pretix/base/exporters/waitinglist.py:120 pretix/base/models/auth.py:258
|
||||
@@ -1038,7 +1039,7 @@ msgstr "Idioma"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html:72
|
||||
#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
msgstr "Notas"
|
||||
|
||||
#: pretix/base/exporters/customers.py:100
|
||||
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
|
||||
@@ -1115,6 +1116,8 @@ msgid ""
|
||||
"Download invoices in a format that can be used by the dekodi NREI conversion "
|
||||
"software."
|
||||
msgstr ""
|
||||
"Baixe faturas em um formato que possa ser usado pelo software de conversão "
|
||||
"de NREI dekodi."
|
||||
|
||||
#: pretix/base/exporters/dekodi.py:105
|
||||
#, python-brace-format
|
||||
@@ -1132,7 +1135,7 @@ msgstr "Ingresso do evento {event}-{code}"
|
||||
#: pretix/plugins/reports/exporters.py:698
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:85
|
||||
msgid "Date range"
|
||||
msgstr ""
|
||||
msgstr "Intervalo de datas"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py:237 pretix/base/exporters/invoices.py:77
|
||||
#, fuzzy
|
||||
@@ -1147,21 +1150,21 @@ msgstr ""
|
||||
"fatura nem sempre corresponde à data do pedido ou do pagamento."
|
||||
|
||||
#: pretix/base/exporters/events.py:47
|
||||
#, fuzzy
|
||||
msgid "Event data"
|
||||
msgstr "Data final do evento"
|
||||
msgstr "Dados do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:48
|
||||
#, fuzzy
|
||||
msgctxt "export_category"
|
||||
msgid "Event data"
|
||||
msgstr "Data final do evento"
|
||||
msgstr "Dados do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:49
|
||||
msgid ""
|
||||
"Download a spreadsheet with information on all events in this organizer "
|
||||
"account."
|
||||
msgstr ""
|
||||
"Baixe uma planilha com informações sobre todos os eventos nesta conta do "
|
||||
"organizador."
|
||||
|
||||
#: pretix/base/exporters/events.py:57 pretix/base/exporters/orderlist.py:261
|
||||
#: pretix/base/exporters/orderlist.py:441
|
||||
@@ -1173,17 +1176,17 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/events/index.html:68
|
||||
#: pretix/control/templates/pretixcontrol/organizers/detail.html:64
|
||||
msgid "Event name"
|
||||
msgstr ""
|
||||
msgstr "Nome do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:58 pretix/base/models/event.py:588
|
||||
#: pretix/base/models/organizer.py:91
|
||||
#: pretix/control/templates/pretixcontrol/organizers/index.html:47
|
||||
msgid "Short form"
|
||||
msgstr ""
|
||||
msgstr "Forma abreviada"
|
||||
|
||||
#: pretix/base/exporters/events.py:59 pretix/base/models/event.py:590
|
||||
msgid "Shop is live"
|
||||
msgstr ""
|
||||
msgstr "A loja está no ar"
|
||||
|
||||
#: pretix/base/exporters/events.py:60 pretix/base/models/event.py:592
|
||||
msgid "Event currency"
|
||||
@@ -1192,59 +1195,59 @@ msgstr "Moeda do evento"
|
||||
#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:261
|
||||
#: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93
|
||||
msgid "Timezone"
|
||||
msgstr ""
|
||||
msgstr "Fuso horário"
|
||||
|
||||
#: pretix/base/exporters/events.py:62 pretix/base/models/event.py:595
|
||||
#: pretix/base/models/event.py:1489 pretix/base/settings.py:3263
|
||||
#: pretix/base/settings.py:3273 pretix/control/forms/subevents.py:480
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:268
|
||||
msgid "Event start time"
|
||||
msgstr ""
|
||||
msgstr "Hora de início do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:63 pretix/base/models/event.py:597
|
||||
#: pretix/base/models/event.py:1491 pretix/base/pdf.py:286
|
||||
#: pretix/control/forms/subevents.py:485
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:270
|
||||
msgid "Event end time"
|
||||
msgstr ""
|
||||
msgstr "Horário de término do evento"
|
||||
|
||||
#: pretix/base/exporters/events.py:64 pretix/base/models/event.py:599
|
||||
#: pretix/base/models/event.py:1493 pretix/control/forms/subevents.py:490
|
||||
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:274
|
||||
msgid "Admission time"
|
||||
msgstr ""
|
||||
msgstr "Horário de entrada"
|
||||
|
||||
#: pretix/base/exporters/events.py:65 pretix/base/models/event.py:611
|
||||
#: pretix/base/models/event.py:1502 pretix/control/forms/subevents.py:93
|
||||
msgid "Start of presale"
|
||||
msgstr ""
|
||||
msgstr "Início da pré-venda"
|
||||
|
||||
#: pretix/base/exporters/events.py:66 pretix/base/models/event.py:605
|
||||
#: pretix/base/models/event.py:1496 pretix/control/forms/subevents.py:99
|
||||
msgid "End of presale"
|
||||
msgstr ""
|
||||
msgstr "Fim da pré-venda"
|
||||
|
||||
#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:351
|
||||
#: pretix/base/models/event.py:617 pretix/base/models/event.py:1508
|
||||
msgid "Location"
|
||||
msgstr ""
|
||||
msgstr "Localização"
|
||||
|
||||
#: pretix/base/exporters/events.py:68 pretix/base/models/event.py:625
|
||||
#: pretix/base/models/event.py:1511
|
||||
msgid "Latitude"
|
||||
msgstr ""
|
||||
msgstr "Latitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:69 pretix/base/models/event.py:633
|
||||
#: pretix/base/models/event.py:1519
|
||||
msgid "Longitude"
|
||||
msgstr ""
|
||||
msgstr "Longitude"
|
||||
|
||||
#: pretix/base/exporters/events.py:70 pretix/base/models/event.py:645
|
||||
#: pretix/base/models/event.py:1534
|
||||
#: pretix/control/templates/pretixcontrol/event/index.html:128
|
||||
#: pretix/control/templates/pretixcontrol/order/index.html:991
|
||||
msgid "Internal comment"
|
||||
msgstr ""
|
||||
msgstr "Comentário interno"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753
|
||||
#: pretix/base/models/orders.py:2162 pretix/control/forms/filter.py:204
|
||||
@@ -1284,7 +1287,7 @@ msgstr "Todas faturas"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:127
|
||||
msgid "Download all invoices created by the system as a ZIP file of PDF files."
|
||||
msgstr ""
|
||||
msgstr "Baixe todas as faturas criadas pelo sistema como um arquivo ZIP ou PDF."
|
||||
|
||||
#: pretix/base/exporters/invoices.py:178
|
||||
msgid "Invoice data"
|
||||
@@ -1296,6 +1299,9 @@ msgid ""
|
||||
"The spreadsheet includes two sheets, one with a line for every invoice, and "
|
||||
"one with a line for every position of every invoice."
|
||||
msgstr ""
|
||||
"Baixe uma planilha com os dados de todas as faturas criadas pelo sistema. A "
|
||||
"planilha inclui duas folhas, uma com uma linha para cada fatura e outra com "
|
||||
"uma linha para cada posição de cada fatura."
|
||||
|
||||
#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:576
|
||||
#: pretix/control/templates/pretixcontrol/order/index.html:268
|
||||
@@ -1355,7 +1361,7 @@ msgstr "Data"
|
||||
#: pretix/plugins/reports/exporters.py:884
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:96
|
||||
msgid "Order code"
|
||||
msgstr "Código de pedido"
|
||||
msgstr "Código do pedido"
|
||||
|
||||
#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329
|
||||
#: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59
|
||||
@@ -26318,7 +26324,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
|
||||
msgid "Comment:"
|
||||
msgstr ""
|
||||
msgstr "Comentário:"
|
||||
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
|
||||
msgid "No order code detected"
|
||||
@@ -26591,7 +26597,7 @@ msgstr ""
|
||||
#: pretix/plugins/paypal2/payment.py:1096
|
||||
#: pretix/plugins/paypal2/payment.py:1097 pretix/plugins/stripe/payment.py:1816
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal/apps.py:53
|
||||
msgid ""
|
||||
@@ -28075,7 +28081,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
|
||||
msgid "iDEAL"
|
||||
msgstr ""
|
||||
msgstr "iDEAL"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352
|
||||
#: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395
|
||||
@@ -28095,11 +28101,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Contato bancário"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:366
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Débito Direto SEPA"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:369
|
||||
msgid ""
|
||||
@@ -28135,7 +28141,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769
|
||||
msgid "WeChat Pay"
|
||||
@@ -28284,7 +28290,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1480
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1483
|
||||
msgid ""
|
||||
@@ -31717,14 +31723,17 @@ msgid ""
|
||||
"while we are processing your current payment. Please check back after your "
|
||||
"current payment has been accepted."
|
||||
msgstr ""
|
||||
"Você não pode alterar seu pedido de forma que exija pagamento adicional "
|
||||
"enquanto estivermos processando seu pagamento atual. Verifique novamente "
|
||||
"após a aceitação do seu pagamento atual."
|
||||
|
||||
#: pretix/presale/views/order.py:1662 pretix/presale/views/order.py:1693
|
||||
msgid "You cannot change this order."
|
||||
msgstr ""
|
||||
msgstr "Você não pode alterar este pedido."
|
||||
|
||||
#: pretix/presale/views/user.py:61
|
||||
msgid "We had difficulties processing your input."
|
||||
msgstr ""
|
||||
msgstr "Tivemos dificuldades em processar sua entrada."
|
||||
|
||||
#: pretix/presale/views/user.py:70
|
||||
#, python-brace-format
|
||||
@@ -31734,32 +31743,43 @@ msgid ""
|
||||
"{number} hours. If the email did not arrive, please check your spam folder "
|
||||
"and also double check that you used the correct email address."
|
||||
msgstr ""
|
||||
"Se o endereço de e-mail informado for válido e estiver associado a um "
|
||||
"ingresso, já enviamos um e-mail com um link para o seu ingresso nas últimas "
|
||||
"{number} horas. Se o e-mail não chegou, verifique sua caixa de spam e "
|
||||
"verifique se você usou o endereço de e-mail correto."
|
||||
|
||||
#: pretix/presale/views/user.py:91
|
||||
msgid "We have trouble sending emails right now, please check back later."
|
||||
msgstr ""
|
||||
"Estamos com problemas para enviar e-mails neste momento. Volte mais tarde."
|
||||
|
||||
#: pretix/presale/views/user.py:94
|
||||
msgid ""
|
||||
"If there were any orders by this user, they will receive an email with their "
|
||||
"order codes."
|
||||
msgstr ""
|
||||
"Se houver algum pedido deste usuário, ele receberá um e-mail com seus "
|
||||
"códigos de pedido."
|
||||
|
||||
#: pretix/presale/views/waiting.py:127
|
||||
msgid ""
|
||||
"No ticket types are available for the waiting list, have a look at the "
|
||||
"ticket shop instead."
|
||||
msgstr ""
|
||||
"Não há tipos de ingressos disponíveis para a lista de espera; em vez disso, "
|
||||
"dê uma olhada na loja de ingressos."
|
||||
|
||||
#: pretix/presale/views/waiting.py:137 pretix/presale/views/waiting.py:161
|
||||
msgid "Waiting lists are disabled for this event."
|
||||
msgstr ""
|
||||
msgstr "As listas de espera estão desativadas para este evento."
|
||||
|
||||
#: pretix/presale/views/waiting.py:173
|
||||
msgid ""
|
||||
"You cannot add yourself to the waiting list as this product is currently "
|
||||
"available."
|
||||
msgstr ""
|
||||
"Você não pode se adicionar à lista de espera, pois este produto ainda não "
|
||||
"está disponível."
|
||||
|
||||
#: pretix/presale/views/waiting.py:180
|
||||
#, python-brace-format
|
||||
@@ -31767,35 +31787,40 @@ msgid ""
|
||||
"We've added you to the waiting list. We will send an email to {email} as "
|
||||
"soon as this product gets available again."
|
||||
msgstr ""
|
||||
"Adicionamos você à lista de espera. Enviaremos um e-mail para {email} assim "
|
||||
"que este produto estiver disponível novamente."
|
||||
|
||||
#: pretix/presale/views/waiting.py:208
|
||||
msgid "We could not find you on our waiting list."
|
||||
msgstr ""
|
||||
msgstr "Não conseguimos encontrá-lo em nossa lista de espera."
|
||||
|
||||
#: pretix/presale/views/waiting.py:212
|
||||
msgid ""
|
||||
"Your waiting list spot is no longer valid or already used. There's nothing "
|
||||
"more to do here."
|
||||
msgstr ""
|
||||
"Sua vaga na lista de espera não é mais válida ou já foi usada. Não há mais "
|
||||
"nada a fazer aqui."
|
||||
|
||||
#: pretix/presale/views/waiting.py:222
|
||||
msgid ""
|
||||
"Thank you very much! We will assign your spot on the waiting list to someone "
|
||||
"else."
|
||||
msgstr ""
|
||||
"Muito obrigado! Vamos atribuir a sua vaga na lista de espera a outra pessoa."
|
||||
|
||||
#: pretix/presale/views/widget.py:397
|
||||
msgid "This ticket shop is currently disabled."
|
||||
msgstr ""
|
||||
msgstr "Esta bilheteria está desativada no momento."
|
||||
|
||||
#: pretix/presale/views/widget.py:411
|
||||
msgid "The selected date does not exist in this event series."
|
||||
msgstr ""
|
||||
msgstr "A data selecionada não existe nesta série de eventos."
|
||||
|
||||
#: pretix/presale/views/widget.py:474
|
||||
#, python-format
|
||||
msgid "from %(start_date)s"
|
||||
msgstr ""
|
||||
msgstr "a partir de %(start_date)s"
|
||||
|
||||
#: pretix/settings.py:789
|
||||
msgid "User profile only"
|
||||
@@ -31803,15 +31828,15 @@ msgstr "Somente perfil de usuário"
|
||||
|
||||
#: pretix/settings.py:790
|
||||
msgid "Read access"
|
||||
msgstr ""
|
||||
msgstr "Acesso de leitura"
|
||||
|
||||
#: pretix/settings.py:791
|
||||
msgid "Write access"
|
||||
msgstr ""
|
||||
msgstr "Acesso de escrita"
|
||||
|
||||
#: pretix/settings.py:802
|
||||
msgid "Kosovo"
|
||||
msgstr ""
|
||||
msgstr "Kosovo"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Email"
|
||||
|
||||
@@ -3,79 +3,80 @@
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"PO-Revision-Date: 2025-06-05 04:00+0000\n"
|
||||
"Last-Translator: Francisco Rosa <francisco@comm7.net>\n"
|
||||
"Language-Team: Portuguese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/pt/>\n"
|
||||
"Language: pt\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.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
|
||||
msgid "Marked as paid"
|
||||
msgstr ""
|
||||
msgstr "Marcado como pago"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
|
||||
msgid "Comment:"
|
||||
msgstr ""
|
||||
msgstr "Comentário:"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
|
||||
msgid "PayPal"
|
||||
msgstr ""
|
||||
msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
|
||||
msgid "Venmo"
|
||||
msgstr ""
|
||||
msgstr "Venmo"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:38
|
||||
msgid "Apple Pay"
|
||||
msgstr ""
|
||||
msgstr "Apple Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
|
||||
msgid "Itaú"
|
||||
msgstr ""
|
||||
msgstr "Itaú"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
|
||||
msgid "PayPal Credit"
|
||||
msgstr ""
|
||||
msgstr "Crédito PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:39
|
||||
msgid "Credit Card"
|
||||
msgstr ""
|
||||
msgstr "Cartão de crédito"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
||||
msgid "PayPal Pay Later"
|
||||
msgstr ""
|
||||
msgstr "PayPal Pagar Depois"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
||||
msgid "iDEAL"
|
||||
msgstr ""
|
||||
msgstr "iDEAL"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Débito Direto SEPA"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Contato bancário"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
|
||||
msgid "SOFORT"
|
||||
msgstr ""
|
||||
msgstr "SOFORT"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
||||
msgid "eps"
|
||||
@@ -83,15 +84,15 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
||||
msgid "MyBank"
|
||||
msgstr ""
|
||||
msgstr "MyBank"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
|
||||
msgid "Verkkopankki"
|
||||
msgstr ""
|
||||
msgstr "Verkkopankki"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
|
||||
msgid "PayU"
|
||||
@@ -127,7 +128,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
|
||||
msgid "Mercado Pago"
|
||||
msgstr ""
|
||||
msgstr "Mercado Pago"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:35+0000\n"
|
||||
"PO-Revision-Date: 2025-05-28 08:00+0000\n"
|
||||
"PO-Revision-Date: 2025-06-04 06:32+0000\n"
|
||||
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/pt_BR/>\n"
|
||||
@@ -10604,10 +10604,8 @@ msgstr ""
|
||||
"você usa os dados coletados em sua loja de ingressos."
|
||||
|
||||
#: pretix/base/settings.py:2071
|
||||
#, fuzzy
|
||||
#| msgid "Account information"
|
||||
msgid "Accessibility information URL"
|
||||
msgstr "Informações da conta"
|
||||
msgstr "URL de informação de acessibilidade"
|
||||
|
||||
#: pretix/base/settings.py:2072
|
||||
#, fuzzy
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-05-30 10:36+0000\n"
|
||||
"PO-Revision-Date: 2024-05-30 17:00+0000\n"
|
||||
"Last-Translator: Luan Thien <vanthienluan@gmail.com>\n"
|
||||
"PO-Revision-Date: 2025-06-06 06:09+0000\n"
|
||||
"Last-Translator: Michael Dao <garudong89@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix-js/vi/>\n"
|
||||
"Language: vi\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.5.5\n"
|
||||
"X-Generator: Weblate 5.11.4\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
|
||||
@@ -35,16 +35,16 @@ msgstr "PayPal"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
|
||||
msgid "Venmo"
|
||||
msgstr "Venmo"
|
||||
msgstr "Nền tảng Venmo"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:38
|
||||
msgid "Apple Pay"
|
||||
msgstr "Apple Pay"
|
||||
msgstr "Nền tảng Apple Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
|
||||
msgid "Itaú"
|
||||
msgstr "Itaú"
|
||||
msgstr "Nền tảng Itaú"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
|
||||
msgid "PayPal Credit"
|
||||
@@ -56,11 +56,11 @@ msgstr "Thẻ tín dụng"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
|
||||
msgid "PayPal Pay Later"
|
||||
msgstr "PayPal Pay Later"
|
||||
msgstr "Nền tảng PayPal Pay Later"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
|
||||
msgid "iDEAL"
|
||||
msgstr "iDEAL"
|
||||
msgstr "Nền tảng iDEAL"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
|
||||
msgid "SEPA Direct Debit"
|
||||
@@ -68,11 +68,11 @@ msgstr "Ghi nợ trực tiếp SEPA"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
|
||||
msgid "Bancontact"
|
||||
msgstr "Bancontact"
|
||||
msgstr "Nền tảng Bancontact"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
|
||||
msgid "giropay"
|
||||
msgstr "giropay"
|
||||
msgstr "Nền tảng giropay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
|
||||
msgid "SOFORT"
|
||||
@@ -80,55 +80,55 @@ msgstr "SOFORT"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
|
||||
msgid "eps"
|
||||
msgstr "eps"
|
||||
msgstr "Nền tảng eps"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
|
||||
msgid "MyBank"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng MyBank"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Przelewy24"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
|
||||
msgid "Verkkopankki"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Verkkopankki"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
|
||||
msgid "PayU"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng PayU"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:51
|
||||
msgid "BLIK"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng BLIK"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:52
|
||||
msgid "Trustly"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Trustly"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:53
|
||||
msgid "Zimpler"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Zimpler"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:54
|
||||
msgid "Maxima"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Maxima"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:55
|
||||
msgid "OXXO"
|
||||
msgstr ""
|
||||
msgstr "?? OXXO"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:56
|
||||
msgid "Boleto"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Boleto"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:57
|
||||
msgid "WeChat Pay"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng WeChat Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
|
||||
msgid "Mercado Pago"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Mercado Pago"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
|
||||
@@ -238,11 +238,11 @@ msgstr "Đã huỷ"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
|
||||
msgid "Confirmed"
|
||||
msgstr ""
|
||||
msgstr "Đã Xác Nhận"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
|
||||
msgid "Approval pending"
|
||||
msgstr ""
|
||||
msgstr "Đang chờ phê duyệt"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
|
||||
msgid "Redeemed"
|
||||
@@ -307,7 +307,7 @@ msgstr "Vé không hợp lệ tại thời điểm này"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
|
||||
msgid "Order canceled"
|
||||
msgstr "Đã huỷ đơn hàng"
|
||||
msgstr "Đơn hàng đã bị hủy"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
|
||||
msgid "Ticket code is ambiguous on list"
|
||||
@@ -348,7 +348,7 @@ msgstr "đóng"
|
||||
#: pretix/static/pretixbase/js/addressform.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:513
|
||||
msgid "required"
|
||||
msgstr ""
|
||||
msgstr "bắt buộc"
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:12
|
||||
msgid ""
|
||||
@@ -411,6 +411,8 @@ msgstr ""
|
||||
#: pretix/static/pretixbase/js/asynctask.js:270
|
||||
msgid "If this takes longer than a few minutes, please contact us."
|
||||
msgstr ""
|
||||
"Yêu cầu của bạn hiện đang được xử lý. Tùy theo quy mô sự kiện, quá trình này "
|
||||
"có thể mất đến vài phút."
|
||||
|
||||
#: pretix/static/pretixbase/js/asynctask.js:325
|
||||
msgid "Close message"
|
||||
@@ -480,27 +482,27 @@ msgstr "Số mục trước từ khi"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
|
||||
msgid "Number of previous entries before"
|
||||
msgstr "Số mục trước trước lúc"
|
||||
msgstr "Số lượt nhập trước đó"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
|
||||
msgid "Number of days with a previous entry"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:143
|
||||
msgid "Number of days with a previous entry since"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó kể từ khi"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:147
|
||||
msgid "Number of days with a previous entry before"
|
||||
msgstr ""
|
||||
msgstr "Số ngày có lượt nhập trước đó trước"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:151
|
||||
msgid "Minutes since last entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Số phút kể từ lượt nhập cuối cùng (-1 đối với lượt nhập đầu tiên)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:155
|
||||
msgid "Minutes since first entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Số phút kể từ lượt nhập đầu tiên (-1 đối với lượt nhập đầu tiên)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182
|
||||
msgid "All of the conditions below (AND)"
|
||||
@@ -569,16 +571,12 @@ msgid "Group of objects"
|
||||
msgstr "Nhóm các đối tượng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:908
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text object (deprecated)"
|
||||
msgstr "Văn bản"
|
||||
msgstr "Đối tượng văn bản (đã lỗi thời)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:910
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text box"
|
||||
msgstr "Văn bản"
|
||||
msgstr "Văn bản chữ"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js:912
|
||||
msgid "Barcode area"
|
||||
@@ -626,24 +624,26 @@ msgid "Unknown error."
|
||||
msgstr "Lỗi không xác định."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:292
|
||||
#, fuzzy
|
||||
#| msgid "Your color has great contrast and is very easy to read!"
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "Bạn đã chọn màu có độ tương phản tốt và dễ đọc!"
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản cao và sẽ mang lại khả năng tiếp cận tuyệt "
|
||||
"vời."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:296
|
||||
#, fuzzy
|
||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||
msgid ""
|
||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||
"requirements."
|
||||
msgstr "Bạn đã giảm độ tương phản và có lẽ khá tốt để đọc!"
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản khá và đủ đáp ứng yêu cầu tối thiểu về khả "
|
||||
"năng tiếp cận."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:300
|
||||
msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"Màu sắc của bạn có độ tương phản không đủ so với màu trắng. Khả năng tiếp "
|
||||
"cận của trang web bạn sẽ bị ảnh hưởng."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:416
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:436
|
||||
@@ -672,246 +672,246 @@ msgstr "Số trang không hợp lệ."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:943
|
||||
msgid "Use a different name internally"
|
||||
msgstr ""
|
||||
msgstr "Sử dụng tên khác ở bên trong"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:983
|
||||
msgid "Click to close"
|
||||
msgstr ""
|
||||
msgstr "Nhấn để đóng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js:1064
|
||||
msgid "You have unsaved changes!"
|
||||
msgstr ""
|
||||
msgstr "Bạn có những thay đổi chưa được lưu!"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/orderchange.js:25
|
||||
msgid "Calculating default price…"
|
||||
msgstr ""
|
||||
msgstr "Đang tính giá mặc định…"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/plugins.js:69
|
||||
#, fuzzy
|
||||
#| msgid "Search results"
|
||||
msgid "No results"
|
||||
msgstr "Kết quả tìm kiếm"
|
||||
msgstr "Không có kết quả"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js:42
|
||||
msgid "Others"
|
||||
msgstr ""
|
||||
msgstr "Khác"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js:82
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
msgstr "Số lượng"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/subevent.js:111
|
||||
msgid "(one more date)"
|
||||
msgid_plural "({num} more dates)"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[0] "{num} ngày còn lại"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:48
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they’re available."
|
||||
msgstr ""
|
||||
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
|
||||
"hoàn tất đơn hàng miễn là chúng còn hàng."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:50
|
||||
msgid "Cart expired"
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng đã hết hạn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:59
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:87
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng của bạn sắp hết hạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:64
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
msgstr[0] "Các mặt hàng trong giỏ của bạn được giữ trong vòng {num} phút."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:86
|
||||
msgid "Your cart has expired."
|
||||
msgstr ""
|
||||
msgstr "Giỏ hàng của bạn đã hết hạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:89
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
msgstr ""
|
||||
"Các mặt hàng trong giỏ của bạn không còn được giữ chỗ nữa. Bạn vẫn có thể "
|
||||
"hoàn tất đơn hàng miễn là chúng còn hàng."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:90
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Bạn có muốn gia hạn thời gian giữ chỗ không?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js:93
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Gia hạn giữ chỗ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:194
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
msgstr "Người tổ chức giữ lại %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:202
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
msgstr "Bạn nhận lại %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:218
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
msgstr "Vui lòng nhập số tiền người tổ chức được giữ lại."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:558
|
||||
msgid "Your local time:"
|
||||
msgstr ""
|
||||
msgstr "Thời gian địa phương của bạn:"
|
||||
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js:39
|
||||
msgid "Google Pay"
|
||||
msgstr ""
|
||||
msgstr "Nền tảng Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:16
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:16
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
msgstr "Số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:17
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:17
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
msgstr "Giảm số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:18
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:18
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
msgstr "Tăng số lượng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Lọc sự kiện bởi"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:20
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Lọc"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:21
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:19
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "Giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:22
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:20
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
msgstr "Giá gốc: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:23
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:21
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
msgstr "Giá mới: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:24
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:22
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr ""
|
||||
msgstr "Chọn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:25
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:23
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select %s"
|
||||
msgstr ""
|
||||
msgstr "Chọn %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:26
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:24
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Select variant %s"
|
||||
msgstr ""
|
||||
msgstr "Chọn biến thể %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:27
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:25
|
||||
msgctxt "widget"
|
||||
msgid "Sold out"
|
||||
msgstr ""
|
||||
msgstr "Bán hết"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:28
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:26
|
||||
msgctxt "widget"
|
||||
msgid "Buy"
|
||||
msgstr ""
|
||||
msgstr "Mua"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:29
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:27
|
||||
msgctxt "widget"
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "Đăng ký"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:30
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:28
|
||||
msgctxt "widget"
|
||||
msgid "Reserved"
|
||||
msgstr ""
|
||||
msgstr "Đã đặt"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:31
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:29
|
||||
msgctxt "widget"
|
||||
msgid "FREE"
|
||||
msgstr ""
|
||||
msgstr "MIỄN PHÍ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:32
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:30
|
||||
msgctxt "widget"
|
||||
msgid "from %(currency)s %(price)s"
|
||||
msgstr ""
|
||||
msgstr "từ %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:33
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:31
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
msgstr "Hình của %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:34
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:32
|
||||
msgctxt "widget"
|
||||
msgid "incl. %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
msgstr "đã bao gồm %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:35
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:33
|
||||
msgctxt "widget"
|
||||
msgid "plus %(rate)s% %(taxname)s"
|
||||
msgstr ""
|
||||
msgstr "cộng thêm %(rate)s% %(taxname)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:36
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:34
|
||||
msgctxt "widget"
|
||||
msgid "incl. taxes"
|
||||
msgstr ""
|
||||
msgstr "đã bao gồm thuế"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:37
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:35
|
||||
msgctxt "widget"
|
||||
msgid "plus taxes"
|
||||
msgstr ""
|
||||
msgstr "cộng thêm thuế"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:38
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:36
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "currently available: %s"
|
||||
msgstr ""
|
||||
msgstr "hiện có sẵn: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:39
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:37
|
||||
msgctxt "widget"
|
||||
msgid "Only available with a voucher"
|
||||
msgstr ""
|
||||
msgstr "Chỉ áp dụng với phiếu giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:40
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:43
|
||||
@@ -919,38 +919,38 @@ msgstr ""
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:41
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr ""
|
||||
msgstr "Chưa có sẵn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:41
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:39
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
msgstr "Không có nữa"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:42
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:40
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr ""
|
||||
msgstr "Hiện tại không có sẵn"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:44
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:42
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "minimum amount to order: %s"
|
||||
msgstr ""
|
||||
msgstr "Số lượng đặt hàng tối thiểu: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:45
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:43
|
||||
msgctxt "widget"
|
||||
msgid "Close ticket shop"
|
||||
msgstr ""
|
||||
msgstr "Đóng cửa hàng vé"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:46
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:44
|
||||
msgctxt "widget"
|
||||
msgid "The ticket shop could not be loaded."
|
||||
msgstr ""
|
||||
msgstr "Không thể tải cửa hàng vé."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:47
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:45
|
||||
@@ -959,24 +959,26 @@ msgid ""
|
||||
"There are currently a lot of users in this ticket shop. Please open the shop "
|
||||
"in a new tab to continue."
|
||||
msgstr ""
|
||||
"Hiện có rất nhiều người dùng trong cửa hàng vé này. Vui lòng mở cửa hàng ở "
|
||||
"tab mới để tiếp tục."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:49
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:47
|
||||
msgctxt "widget"
|
||||
msgid "Open ticket shop"
|
||||
msgstr ""
|
||||
msgstr "Mở cửa hàng vé"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:50
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:48
|
||||
msgctxt "widget"
|
||||
msgid "Checkout"
|
||||
msgstr ""
|
||||
msgstr "Thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:51
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:49
|
||||
msgctxt "widget"
|
||||
msgid "The cart could not be created. Please try again later"
|
||||
msgstr ""
|
||||
msgstr "Không thể tạo giỏ hàng. Vui lòng thử lại sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:52
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:50
|
||||
@@ -985,12 +987,14 @@ msgid ""
|
||||
"We could not create your cart, since there are currently too many users in "
|
||||
"this ticket shop. Please click \"Continue\" to retry in a new tab."
|
||||
msgstr ""
|
||||
"Chúng tôi không thể tạo giỏ hàng của bạn do hiện có quá nhiều người dùng "
|
||||
"trong cửa hàng vé này. Vui lòng nhấn \"Tiếp tục\" để thử lại trong tab mới."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:54
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:52
|
||||
msgctxt "widget"
|
||||
msgid "Waiting list"
|
||||
msgstr ""
|
||||
msgstr "Danh sách chờ"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:55
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:53
|
||||
@@ -999,112 +1003,114 @@ msgid ""
|
||||
"You currently have an active cart for this event. If you select more "
|
||||
"products, they will be added to your existing cart."
|
||||
msgstr ""
|
||||
"Hiện bạn đang có một giỏ hàng còn hiệu lực cho sự kiện này. Nếu bạn chọn "
|
||||
"thêm sản phẩm, chúng sẽ được thêm vào giỏ hàng hiện tại của bạn."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:57
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:55
|
||||
msgctxt "widget"
|
||||
msgid "Resume checkout"
|
||||
msgstr ""
|
||||
msgstr "Tiếp tục thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:58
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:56
|
||||
msgctxt "widget"
|
||||
msgid "Redeem a voucher"
|
||||
msgstr ""
|
||||
msgstr "Sử dụng phiếu giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:59
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:57
|
||||
msgctxt "widget"
|
||||
msgid "Redeem"
|
||||
msgstr ""
|
||||
msgstr "Đổi mã"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:60
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:58
|
||||
msgctxt "widget"
|
||||
msgid "Voucher code"
|
||||
msgstr ""
|
||||
msgstr "Mã giảm giá"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:61
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:59
|
||||
msgctxt "widget"
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
msgstr "Đóng"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:62
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr ""
|
||||
msgstr "Đóng trang thanh toán"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:63
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
msgstr "Bạn không thể hủy thao tác này. Vui lòng chờ quá trình tải hoàn tất."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:64
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:60
|
||||
msgctxt "widget"
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "Tiếp tục"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:65
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:61
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr ""
|
||||
msgstr "Hiển thị các biến thể"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:66
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:62
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr ""
|
||||
msgstr "Ẩn các biến thể"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:67
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:63
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different event"
|
||||
msgstr ""
|
||||
msgstr "Chọn sự kiện khác"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:68
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:64
|
||||
msgctxt "widget"
|
||||
msgid "Choose a different date"
|
||||
msgstr ""
|
||||
msgstr "Chọn ngày khác"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:69
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:65
|
||||
msgctxt "widget"
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
msgstr "Quay về"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:70
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:66
|
||||
msgctxt "widget"
|
||||
msgid "Next month"
|
||||
msgstr ""
|
||||
msgstr "Tháng sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:71
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:67
|
||||
msgctxt "widget"
|
||||
msgid "Previous month"
|
||||
msgstr ""
|
||||
msgstr "Tháng trước"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:72
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:68
|
||||
msgctxt "widget"
|
||||
msgid "Next week"
|
||||
msgstr ""
|
||||
msgstr "Tuần sau"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:73
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:69
|
||||
msgctxt "widget"
|
||||
msgid "Previous week"
|
||||
msgstr ""
|
||||
msgstr "Tuần trước"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:74
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:70
|
||||
msgctxt "widget"
|
||||
msgid "Open seat selection"
|
||||
msgstr ""
|
||||
msgstr "Mở chọn chỗ ngồi"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:75
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:71
|
||||
@@ -1114,142 +1120,144 @@ msgid ""
|
||||
"add yourself to the waiting list. We will then notify if seats are available "
|
||||
"again."
|
||||
msgstr ""
|
||||
"Một số hoặc tất cả các loại vé hiện đã bán hết. Nếu bạn muốn, bạn có thể "
|
||||
"thêm tên vào danh sách chờ. Chúng tôi sẽ thông báo khi có chỗ ngồi lại."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:76
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:72
|
||||
msgctxt "widget"
|
||||
msgid "Load more"
|
||||
msgstr ""
|
||||
msgstr "Tải thêm"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:78
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:74
|
||||
msgid "Mo"
|
||||
msgstr ""
|
||||
msgstr "T2"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:79
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:75
|
||||
msgid "Tu"
|
||||
msgstr ""
|
||||
msgstr "T3"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:80
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:76
|
||||
msgid "We"
|
||||
msgstr ""
|
||||
msgstr "T4"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:81
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:77
|
||||
msgid "Th"
|
||||
msgstr ""
|
||||
msgstr "T5"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:82
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:78
|
||||
msgid "Fr"
|
||||
msgstr ""
|
||||
msgstr "T6"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:83
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:79
|
||||
msgid "Sa"
|
||||
msgstr ""
|
||||
msgstr "T7"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:84
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:80
|
||||
msgid "Su"
|
||||
msgstr ""
|
||||
msgstr "CN"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:85
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:81
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Hai"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:86
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:82
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Ba"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:87
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:83
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Tư"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:88
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:84
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Năm"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:89
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:85
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Sáu"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:90
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:86
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
msgstr "Thứ Bảy"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:91
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:87
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
msgstr "Chủ Nhật"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:94
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:90
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
msgstr "Tháng 1"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:95
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:91
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
msgstr "Tháng 2"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:96
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:92
|
||||
msgid "March"
|
||||
msgstr ""
|
||||
msgstr "Tháng 3"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:97
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:93
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
msgstr "Tháng 4"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:98
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:94
|
||||
msgid "May"
|
||||
msgstr ""
|
||||
msgstr "Tháng 5"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:99
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:95
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
msgstr "Tháng 6"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:100
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:96
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
msgstr "Tháng 7"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:101
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:97
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
msgstr "Tháng 8"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:102
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:98
|
||||
msgid "September"
|
||||
msgstr ""
|
||||
msgstr "Tháng 9"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:103
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:99
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
msgstr "Tháng 10"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:104
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:100
|
||||
msgid "November"
|
||||
msgstr ""
|
||||
msgstr "Tháng 11"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js:105
|
||||
#: pretix/static/pretixpresale/js/widget/widget.v1.js:101
|
||||
msgid "December"
|
||||
msgstr ""
|
||||
msgstr "Tháng 12"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your color has bad contrast for text on white background, please choose a "
|
||||
|
||||
@@ -47,7 +47,8 @@ from django.utils.translation import gettext_lazy as _
|
||||
from django_scopes import scope, scopes_disabled
|
||||
|
||||
from pretix.base.logentrytypes import (
|
||||
EventLogEntryType, OrderLogEntryType, log_entry_types,
|
||||
EventLogEntryType, OrderLogEntryType, WaitingListEntryLogEntryType,
|
||||
log_entry_types,
|
||||
)
|
||||
from pretix.base.models import SubEvent
|
||||
from pretix.base.signals import (
|
||||
@@ -130,6 +131,11 @@ class SendmailPluginOrderLogEntryType(OrderLogEntryType):
|
||||
pass
|
||||
|
||||
|
||||
@log_entry_types.new('pretix.plugins.sendmail.waitinglist.email.sent', _('The person on the waiting list received a mass email.'))
|
||||
class SendmailPluginWaitingListLogEntryType(WaitingListEntryLogEntryType):
|
||||
pass
|
||||
|
||||
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.added', _('An email rule was created'))
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.changed', _('An email rule was updated'))
|
||||
@log_entry_types.new('pretix.plugins.sendmail.rule.order.email.sent', _('A scheduled email was sent to the order'))
|
||||
|
||||
@@ -201,4 +201,5 @@ def send_mails_to_waitinglist(event: Event, user: int, subject: dict, message: d
|
||||
),
|
||||
user=user,
|
||||
attach_cached_files=attachments,
|
||||
log_entry_type='pretix.plugins.sendmail.waitinglist.email.sent',
|
||||
)
|
||||
|
||||
@@ -55,7 +55,7 @@ class AuthenticationForm(forms.Form):
|
||||
required_css_class = 'required'
|
||||
email = forms.EmailField(
|
||||
label=_("Email"),
|
||||
widget=forms.EmailInput()
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
|
||||
)
|
||||
password = forms.CharField(
|
||||
label=_("Password"),
|
||||
@@ -140,6 +140,7 @@ class RegistrationForm(forms.Form):
|
||||
name_parts = forms.CharField()
|
||||
email = forms.EmailField(
|
||||
label=_("Email"),
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'})
|
||||
)
|
||||
|
||||
error_messages = {
|
||||
@@ -341,6 +342,7 @@ class ResetPasswordForm(forms.Form):
|
||||
}
|
||||
email = forms.EmailField(
|
||||
label=_('Email'),
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'email'}),
|
||||
)
|
||||
|
||||
def __init__(self, request=None, *args, **kwargs):
|
||||
@@ -388,12 +390,12 @@ class ChangePasswordForm(forms.Form):
|
||||
)
|
||||
password_current = forms.CharField(
|
||||
label=_('Your current password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
|
||||
required=True
|
||||
)
|
||||
password = forms.CharField(
|
||||
label=_('New password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'minlength': '8', 'autocomplete': 'new-password'}),
|
||||
max_length=4096,
|
||||
required=True
|
||||
)
|
||||
@@ -457,7 +459,7 @@ class ChangeInfoForm(forms.ModelForm):
|
||||
}
|
||||
password_current = forms.CharField(
|
||||
label=_('Your current password'),
|
||||
widget=forms.PasswordInput,
|
||||
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
|
||||
help_text=_('Only required if you change your email address'),
|
||||
max_length=4096,
|
||||
required=False
|
||||
@@ -471,6 +473,8 @@ class ChangeInfoForm(forms.ModelForm):
|
||||
self.request = request
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.fields['email'].widget.attrs['autocomplete'] = 'email'
|
||||
|
||||
self.fields['name_parts'] = NamePartsFormField(
|
||||
max_length=255,
|
||||
required=True,
|
||||
|
||||
@@ -79,7 +79,7 @@ class CheckoutFieldRenderer(FieldRenderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['layout'] = 'horizontal'
|
||||
super().__init__(*args, **kwargs)
|
||||
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
|
||||
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or self.is_multi_widget
|
||||
|
||||
def get_form_group_class(self):
|
||||
form_group_class = self.form_group_class
|
||||
|
||||
@@ -57,6 +57,8 @@ class WaitingListForm(forms.ModelForm):
|
||||
|
||||
event = self.event
|
||||
|
||||
self.fields['email'].widget.attrs['autocomplete'] = 'email'
|
||||
|
||||
if event.settings.waiting_list_names_asked:
|
||||
self.fields['name_parts'] = NamePartsFormField(
|
||||
max_length=255,
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
<div class="panel-body questions-form">
|
||||
{% if form.position.seat %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Seat" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Seat" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
{% include "icons/seat.svg" with cls="svg-icon" %}
|
||||
{{ form.position.seat }}
|
||||
@@ -30,9 +30,9 @@
|
||||
{% endif %}
|
||||
{% if form.position.addons.all %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Selected add-ons" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Selected add-ons" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
{% for a in form.position.addons.all %}
|
||||
@@ -44,13 +44,13 @@
|
||||
{% endif %}
|
||||
{% if form.position.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="5">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ form.position.subevent.name }} · {{ form.position.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -16,16 +16,17 @@
|
||||
{% for p in current_payments %}
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-xs-9">
|
||||
{{ p.provider_name }}
|
||||
<div class="col-md-7 col-sm-6 col-xs-8">
|
||||
<strong id="payment-label-{{ forloop.counter }}">{{ p.provider_name }}</strong>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
|
||||
{{ p.payment_amount|money:request.event.currency }}
|
||||
</div>
|
||||
<div class="col-xs-1 text-right">
|
||||
<button name="remove_payment" value="{{ p.id }}" title="{% trans "Remove payment" %}"
|
||||
class="btn btn-link btn-xs">
|
||||
<span class="fa fa-trash text-danger"></span>
|
||||
<div class="col-md-3 col-sm-4 col-xs-12 text-right">
|
||||
<button name="remove_payment" value="{{ p.id }}" aria-describedby="payment-label-{{ forloop.counter }}"
|
||||
class="btn btn-danger">
|
||||
<span class="fa fa-trash"></span>
|
||||
{% trans "Remove payment" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -34,11 +35,11 @@
|
||||
{% if remaining %}
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-xs-9">
|
||||
<div class="col-md-7 col-sm-6 col-xs-8">
|
||||
<strong>{% trans "Remaining balance" %}</strong><br>
|
||||
<span class="text-muted">{% trans "Please select a payment method below." %}</span>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
|
||||
<strong>
|
||||
{{ remaining|money:request.event.currency }}
|
||||
</strong>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends "pretixpresale/event/checkout_base.html" %}
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
{% load bootstrap3 %}
|
||||
{% load rich_text %}
|
||||
{% load lists %}
|
||||
@@ -74,14 +75,6 @@
|
||||
{% if pos.variation %}
|
||||
– {{ pos.variation }}
|
||||
{% endif %}</strong>
|
||||
{% if forloop.counter > 1 %}
|
||||
<span class="text-right flip">
|
||||
{% if event.settings.checkout_show_copy_answers_button %}
|
||||
<button type="button" data-id="{{ forloop.counter0 }}" name="copy"
|
||||
class="js-copy-answers btn btn-default btn-xs">{% trans "Copy answers from above" %}</button>
|
||||
{% endif %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</h3>
|
||||
</summary>
|
||||
<div>
|
||||
@@ -89,11 +82,22 @@
|
||||
{% if event.settings.attendee_data_explanation_text and pos.item.ask_attendee_data %}
|
||||
{{ event.settings.attendee_data_explanation_text|rich_text }}
|
||||
{% endif %}
|
||||
{% if forloop.counter > 1 and event.settings.checkout_show_copy_answers_button %}
|
||||
<div class="form-group">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<button type="button" data-id="{{ forloop.counter0 }}" name="copy"
|
||||
class="js-copy-answers btn btn-default btn-sm">
|
||||
{% icon "files-o" %}
|
||||
{% trans "Copy answers from above" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if pos.seat %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Seat" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Seat" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
{% include "icons/seat.svg" with cls="svg-icon" %}
|
||||
{{ pos.seat }}
|
||||
@@ -102,9 +106,9 @@
|
||||
{% endif %}
|
||||
{% if pos.addons_without_bundled %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Selected add-ons" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Selected add-ons" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
{% regroup pos.addons_without_bundled by item_and_variation as addons_by_itemvar %}
|
||||
@@ -117,25 +121,24 @@
|
||||
{% endif %}
|
||||
{% if pos.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ pos.subevent.name }} · {{ pos.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<fieldset>
|
||||
<legend class="sr-only">{{ pos.item.name }}{% if pos.variation %} – {{ pos.variation }}{% endif %}</legend>
|
||||
{% for form in forms %}
|
||||
{% if form.pos.item != pos.item %}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
{# Add-Ons #}
|
||||
<legend{% if profiles_data %} class="profile-add-on-legend"{% endif %}>
|
||||
{% if form.show_copy_answers_to_addon_button and event.settings.checkout_show_copy_answers_button %}
|
||||
<span class="pull-right flip">
|
||||
<button type="button" data-id="{{ forloop.parentloop.counter0 }}" data-addonid="{{ forloop.counter0 }}" name="copy" class="js-copy-answers-addon btn btn-default btn-xs">{% trans "Copy answers" %}</button>
|
||||
</span>
|
||||
{% endif %}
|
||||
+ {{ form.pos.item.name }}{% if form.pos.variation %} – {{ form.pos.variation.value }}{% endif %}
|
||||
</legend>
|
||||
{% endif %}
|
||||
@@ -157,8 +160,20 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if form.show_copy_answers_to_addon_button and event.settings.checkout_show_copy_answers_button %}
|
||||
<div class="form-group">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<button type="button" data-id="{{ forloop.parentloop.counter0 }}" data-addonid="{{ forloop.counter0 }}" name="copy" class="js-copy-answers-addon btn btn-default btn-sm">
|
||||
{% icon "files-o" %}
|
||||
{% trans "Copy answers from above" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% bootstrap_form form layout="checkout" %}
|
||||
</div>
|
||||
</fieldset>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -96,8 +96,8 @@
|
||||
{% if not event.settings.show_variations_expanded %}
|
||||
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
|
||||
data-label-alt="{% trans "Hide variants" %}"
|
||||
aria-expanded="false"
|
||||
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{item}}{% endblocktrans %}">
|
||||
aria-expanded="false" aria-controls="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations"
|
||||
aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-legend">
|
||||
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
|
||||
<span>{% trans "Show variants" %}</span>
|
||||
</button>
|
||||
@@ -105,7 +105,7 @@
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="cp-{{ form.pos.pk }}-item-{{ item.pk }}-variations">
|
||||
{% for var in item.available_variations %}
|
||||
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row-fluid product-row variation"
|
||||
{% if not item.free_price %}
|
||||
@@ -186,7 +186,7 @@
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if var.cached_availability.0 == 100 or var.initial %}
|
||||
{% if not item.current_unavailability_reason and not var.current_unavailability_reason and var.cached_availability.0 == 100 or var.initial %}
|
||||
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
|
||||
{% if c.max_count == 1 or not c.multi_allowed %}
|
||||
<label class="btn btn-default btn-checkbox">
|
||||
@@ -327,7 +327,7 @@
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
{% if item.cached_availability.0 == 100 or item.initial %}
|
||||
{% if not item.current_unavailability_reason and item.cached_availability.0 == 100 or item.initial %}
|
||||
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
|
||||
{% if c.max_count == 1 or not c.multi_allowed %}
|
||||
<label class="btn btn-default btn-checkbox">
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
{% load eventurl %}
|
||||
{% load daterange %}
|
||||
{% load safelink %}
|
||||
@@ -24,7 +25,7 @@
|
||||
</div>
|
||||
<div role="rowgroup" class="firstchild-in-panel">
|
||||
{% for line in cart.positions %}
|
||||
<div role="row" class="row cart-row {% if hide_prices %}hide-prices{% endif %} {% if download %}has-downloads{% endif %}{% if editable %}editable{% endif %}">
|
||||
<div role="row" class="row cart-row {% if hide_prices %}hide-prices{% endif %} {% if download %}has-downloads{% endif %}{% if editable %}editable{% endif %}" data-article-id="item-{{ line.item.id }}{% if line.variation %}-{{ line.variation.id }}{% endif %}">
|
||||
<div role="cell" class="product">
|
||||
<p>
|
||||
{% if line.addon_to %}
|
||||
@@ -506,10 +507,23 @@
|
||||
</p>
|
||||
<p>
|
||||
<button class="btn btn-default" type="submit" id="cart-extend-button" aria-describedby="cart-deadline">
|
||||
<i class="fa fa-refresh" aria-hidden="true"></i> {% trans "Renew reservation" %}
|
||||
{% icon "refresh" %} {% trans "Renew reservation" %}
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<dialog role="alertdialog" id="cart-extend-confirmation-dialog" class="inline-dialog" aria-labelledby="cart-deadline">
|
||||
<form method="dialog">
|
||||
<p>
|
||||
<button class="btn btn-success" autofocus value="OK">
|
||||
<span role="img" aria-label="{% trans "OK" %}.">
|
||||
{% icon "check" %}
|
||||
</span>
|
||||
{% trans "Reservation renewed" %}
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
</dialog>
|
||||
{% else %}
|
||||
<p class="sr-only" id="cart-description">{% trans "Overview of your ordered products." %}</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
<div class="form-order-change-main">
|
||||
{% if position.subevent %}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">
|
||||
{% trans "Date" context "subevent" %}
|
||||
</label>
|
||||
<div class="col-md-3 control-label">
|
||||
<strong role="heading" aria-level="4">{% trans "Date" context "subevent" %}</strong>
|
||||
</div>
|
||||
<div class="col-md-9 form-control-text">
|
||||
<ul class="addon-list">
|
||||
<p class="addon-list">
|
||||
{{ position.subevent.name }} · {{ position.subevent.get_date_range_display_with_times_as_html }}
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -101,8 +101,8 @@
|
||||
{% endif %}
|
||||
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
|
||||
data-label-alt="{% trans "Hide variants" %}"
|
||||
aria-expanded="false"
|
||||
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{ item }}{% endblocktrans %}">
|
||||
aria-expanded="false" aria-controls="{{ form_prefix }}item-{{ item.pk }}-variations"
|
||||
aria-describedby="{{ form_prefix }}item-{{ item.pk }}-legend">
|
||||
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
|
||||
<span>{% trans "Show variants" %}</span>
|
||||
</button>
|
||||
@@ -110,7 +110,7 @@
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
|
||||
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}" id="{{ form_prefix }}item-{{ item.pk }}-variations">
|
||||
{% for var in item.available_variations %}
|
||||
<article aria-labelledby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="{{ form_prefix }}item-{{ item.pk }}-{{ var.pk }}"
|
||||
{% if not item.free_price %}
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
<div class="input-group{% if "voucher_invalid" in request.GET %} has-error{% endif %}">
|
||||
<span class="input-group-addon"><i class="fa fa-ticket fa-fw" aria-hidden="true"></i></span>
|
||||
<input type="text" class="form-control{% if "voucher_invalid" in request.GET %} has-error{% endif %}" name="voucher" id="voucher"
|
||||
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
|
||||
placeholder="{% trans "Voucher code" %}" required="required">
|
||||
{% if "voucher_invalid" in request.GET %} aria-describedby="error-message"{% endif %}
|
||||
autocomplete="off"
|
||||
placeholder="{% trans "Voucher code" %}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />
|
||||
|
||||
@@ -34,13 +34,13 @@
|
||||
{% endblocktrans %}
|
||||
{% endif %}
|
||||
</p>
|
||||
<p class="help-block">
|
||||
<p class="help-block" id="add-to-list-description">
|
||||
{% blocktrans trimmed %}
|
||||
You will <strong>not</strong> receive a confirmation email after you have been added to the waiting list. We will only contact you once a spot opens up.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<button type="submit" class="btn btn-primary" aria-describedby="add-to-list-description">
|
||||
{% trans "Add me to the list" %}
|
||||
</button>
|
||||
</p>
|
||||
|
||||
@@ -2,22 +2,21 @@
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
|
||||
<div class="btn-group" role="group">
|
||||
<a href="?{% url_replace request "style" "list" "date" "" %}" type="button"
|
||||
class="btn btn-default{% if style == "list" %} active{% endif %}">
|
||||
<div class="btn-group" role="navigation" aria-label="{% trans "Event overview by month, week, etc." %}">
|
||||
<a href="?{% url_replace request "style" "list" "date" "" %}"
|
||||
class="btn btn-default{% if style == "list" %} active" aria-current="page{% endif %}">
|
||||
{% trans "List" %}
|
||||
</a>
|
||||
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "week" "old" "" "page" "" "date" date|date:"o-\WW" %}{% else %}{% url_replace request "style" "week" "old" "" "page" "" %}{% endif %}" type="button"
|
||||
class="btn btn-default{% if style == "week" %} active{% endif %}">
|
||||
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "week" "old" "" "page" "" "date" date|date:"o-\WW" %}{% else %}{% url_replace request "style" "week" "old" "" "page" "" %}{% endif %}"
|
||||
class="btn btn-default{% if style == "week" %} active" aria-current="page{% endif %}">
|
||||
{% trans "Week" %}
|
||||
</a>
|
||||
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "calendar" "old" "" "page" "" "date" date|date:"Y-m" %}{% else %}{% url_replace request "style" "calendar" "old" "" "page" "" %}{% endif %}"
|
||||
type="button"
|
||||
class="btn btn-default{% if style == "calendar" %} active{% endif %}">
|
||||
class="btn btn-default{% if style == "calendar" %} active" aria-current="page{% endif %}">
|
||||
{% trans "Month" %}
|
||||
</a>
|
||||
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "day" "old" "" "page" "" "date" date|date:"Y-m-d" %}{% else %}{% url_replace request "style" "day" "old" "" "page" "" "date" %}{% endif %}" type="button"
|
||||
class="btn btn-default{% if style == "day" %} active{% endif %}">
|
||||
<a href="?{% if "date" in request.GET %}{% url_replace request "style" "day" "old" "" "page" "" "date" date|date:"Y-m-d" %}{% else %}{% url_replace request "style" "day" "old" "" "page" "" "date" %}{% endif %}"
|
||||
class="btn btn-default{% if style == "day" %} active" aria-current="page{% endif %}">
|
||||
{% trans "Day" %}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "Renew reservation" %}</button></p>
|
||||
{% enddialog %}
|
||||
|
||||
{% dialog "dialog-cart-extended" "" "" icon="clock-o" alert=true %}
|
||||
<p class="modal-card-confirm"><button class="btn btn-lg btn-primary">{% trans "OK" %}</button></p>
|
||||
{% enddialog %}
|
||||
|
||||
<dialog id="lightbox-dialog" class="modal-card" role="alertdialog" aria-labelledby="lightbox-label">
|
||||
<form method="dialog" class="modal-card-inner form-horizontal">
|
||||
<div class="modal-card-content">
|
||||
|
||||
@@ -4,7 +4,11 @@
|
||||
{% load rich_text %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% block title %}{% trans "Event overview" %}{% endblock %}
|
||||
{% block title %}
|
||||
{% blocktrans trimmed with month=date|date:"F Y" %}
|
||||
Events in {{ month }}
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if organizer_homepage_text %}
|
||||
<div class="blank-after">
|
||||
|
||||
@@ -4,7 +4,11 @@
|
||||
{% load rich_text %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% block title %}{% trans "Event overview" %}{% endblock %}
|
||||
{% block title %}
|
||||
{% blocktrans trimmed with day=date|date:"DATE_FORMAT" %}
|
||||
Events on {{ day }}
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if organizer_homepage_text %}
|
||||
<div class="blank-after">
|
||||
|
||||
@@ -4,7 +4,11 @@
|
||||
{% load rich_text %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% block title %}{% trans "Event overview" %}{% endblock %}
|
||||
{% block title %}
|
||||
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date_to|date:short_month_day_format %}
|
||||
Events in {{ week }} ({{ week_day_from }} – {{ week_day_to }})
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if organizer_homepage_text %}
|
||||
<div class="blank-after">
|
||||
@@ -18,7 +22,7 @@
|
||||
<div class="panel-heading">
|
||||
<h2 class="panel-title">
|
||||
<strong>
|
||||
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date|date:short_month_day_format %}
|
||||
{% blocktrans trimmed with week=date|date:week_format week_day_from=date|date:short_month_day_format week_day_to=date_to|date:short_month_day_format %}
|
||||
Events in {{ week }} ({{ week_day_from }} – {{ week_day_to }})
|
||||
{% endblocktrans %}
|
||||
</strong>
|
||||
|
||||
@@ -70,7 +70,7 @@ from pretix.helpers.http import redirect_to_url
|
||||
from pretix.multidomain.urlreverse import eventreverse
|
||||
from pretix.presale.views import (
|
||||
CartMixin, EventViewMixin, allow_cors_if_namespaced,
|
||||
allow_frame_if_namespaced, iframe_entry_view_wrapper,
|
||||
allow_frame_if_namespaced, get_cart, iframe_entry_view_wrapper,
|
||||
)
|
||||
from pretix.presale.views.event import (
|
||||
get_grouped_items, item_group_by_category,
|
||||
@@ -441,7 +441,7 @@ class CartApplyVoucher(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
return _('We applied the voucher to as many products in your cart as we could.')
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
from pretix.base.payment import GiftCardPayment
|
||||
from pretix.base.payment import GiftCardPayment, GiftCardPaymentForm
|
||||
|
||||
if 'voucher' in request.POST:
|
||||
code = request.POST.get('voucher').strip()
|
||||
@@ -454,6 +454,22 @@ class CartApplyVoucher(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
raise ValidationError(error_messages['voucher_invalid'])
|
||||
else:
|
||||
cs = cart_session(request)
|
||||
used_cards = [
|
||||
p.get('info_data', {}).get('gift_card')
|
||||
for p in cs.get('payments', [])
|
||||
if p.get('info_data', {}).get('gift_card')
|
||||
]
|
||||
form = GiftCardPaymentForm(
|
||||
event=request.event,
|
||||
used_cards=used_cards,
|
||||
positions=get_cart(request),
|
||||
testmode=request.event.testmode,
|
||||
data={'code': code},
|
||||
)
|
||||
form.fields = gcp.payment_form_fields
|
||||
if not form.is_valid():
|
||||
# raise first validation-error in form
|
||||
raise next(iter(form.errors.as_data().values()))[0]
|
||||
gcp._add_giftcard_to_cart(cs, gc)
|
||||
messages.success(
|
||||
request,
|
||||
@@ -694,7 +710,7 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
|
||||
return context
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
from pretix.base.payment import GiftCardPayment
|
||||
from pretix.base.payment import GiftCardPayment, GiftCardPaymentForm
|
||||
|
||||
err = None
|
||||
v = request.GET.get('voucher')
|
||||
@@ -719,12 +735,28 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, CartMixin, TemplateView
|
||||
err = error_messages['voucher_redeemed_cart'] % self.request.event.settings.reservation_time
|
||||
except Voucher.DoesNotExist:
|
||||
try:
|
||||
gc = self.request.event.organizer.accepted_gift_cards.get(secret=v.strip())
|
||||
gcp = GiftCardPayment(self.request.event)
|
||||
if not gcp.is_enabled or not gcp.is_allowed(self.request, Decimal("1.00")):
|
||||
gc = request.event.organizer.accepted_gift_cards.get(secret=v)
|
||||
gcp = GiftCardPayment(request.event)
|
||||
if not gcp.is_enabled or not gcp.is_allowed(request, Decimal("1.00")):
|
||||
err = error_messages['voucher_invalid']
|
||||
else:
|
||||
cs = cart_session(request)
|
||||
used_cards = [
|
||||
p.get('info_data', {}).get('gift_card')
|
||||
for p in cs.get('payments', [])
|
||||
if p.get('info_data', {}).get('gift_card')
|
||||
]
|
||||
form = GiftCardPaymentForm(
|
||||
event=request.event,
|
||||
used_cards=used_cards,
|
||||
positions=get_cart(request),
|
||||
testmode=request.event.testmode,
|
||||
data={'code': v},
|
||||
)
|
||||
form.fields = gcp.payment_form_fields
|
||||
if not form.is_valid():
|
||||
# raise first validation-error in form
|
||||
raise next(iter(form.errors.as_data().values()))[0]
|
||||
gcp._add_giftcard_to_cart(cs, gc)
|
||||
messages.success(
|
||||
request,
|
||||
|
||||
@@ -683,6 +683,8 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView):
|
||||
ctx['show_fees'] = any(p['fee_diff'] for p in self.provider_forms)
|
||||
if len(self.provider_forms) == 1:
|
||||
ctx['selected'] = self.provider_forms[0]['provider'].identifier
|
||||
elif "payment" in self.request.POST:
|
||||
ctx['selected'] = self.request.POST.get("payment")
|
||||
return ctx
|
||||
|
||||
def get_confirm_url(self, payment):
|
||||
|
||||
@@ -64,6 +64,7 @@ from pretix.base.models import (
|
||||
Event, EventMetaValue, Organizer, Quota, SubEvent, SubEventMetaValue,
|
||||
)
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
from pretix.base.timemachine import time_machine_now
|
||||
from pretix.helpers.compat import date_fromisocalendar
|
||||
from pretix.helpers.daterange import daterange
|
||||
from pretix.helpers.formats.en.formats import (
|
||||
@@ -228,7 +229,7 @@ class EventListMixin:
|
||||
|
||||
def _set_month_to_next_subevent(self):
|
||||
tz = self.request.event.timezone
|
||||
now_dt = now()
|
||||
now_dt = time_machine_now()
|
||||
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).annotate(
|
||||
effective_date=Case(
|
||||
When(date_from__lt=now_dt, date_to__isnull=False, date_to__gte=now_dt, then=Value(now_dt)),
|
||||
@@ -245,8 +246,8 @@ class EventListMixin:
|
||||
self.year = datetime_from.astimezone(tz).year
|
||||
self.month = datetime_from.astimezone(tz).month
|
||||
else:
|
||||
self.year = now().year
|
||||
self.month = now().month
|
||||
self.year = now_dt.year
|
||||
self.month = now_dt.month
|
||||
|
||||
def _set_month_to_next_event(self):
|
||||
now_dt = now()
|
||||
@@ -296,7 +297,7 @@ class EventListMixin:
|
||||
try:
|
||||
date = dateutil.parser.isoparse(self.request.GET.get('date')).date()
|
||||
except ValueError:
|
||||
date = now().date()
|
||||
date = time_machine_now().date()
|
||||
self.year = date.year
|
||||
self.month = date.month
|
||||
else:
|
||||
@@ -306,7 +307,7 @@ class EventListMixin:
|
||||
self._set_month_to_next_event()
|
||||
|
||||
def _set_week_to_next_subevent(self):
|
||||
now_dt = now()
|
||||
now_dt = time_machine_now()
|
||||
tz = self.request.event.timezone
|
||||
next_sev = self.request.event.subevents.using(settings.DATABASE_REPLICA).annotate(
|
||||
effective_date=Case(
|
||||
@@ -324,8 +325,8 @@ class EventListMixin:
|
||||
self.year = datetime_from.astimezone(tz).isocalendar()[0]
|
||||
self.week = datetime_from.astimezone(tz).isocalendar()[1]
|
||||
else:
|
||||
self.year = now().isocalendar()[0]
|
||||
self.week = now().isocalendar()[1]
|
||||
self.year = now_dt.isocalendar()[0]
|
||||
self.week = now_dt.isocalendar()[1]
|
||||
|
||||
def _set_week_to_next_event(self):
|
||||
now_dt = now()
|
||||
@@ -375,7 +376,7 @@ class EventListMixin:
|
||||
try:
|
||||
iso = dateutil.parser.isoparse(self.request.GET.get('date')).isocalendar()
|
||||
except ValueError:
|
||||
iso = now().isocalendar()
|
||||
iso = time_machine_now().isocalendar()
|
||||
self.year = iso[0]
|
||||
self.week = iso[1]
|
||||
else:
|
||||
@@ -811,6 +812,7 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
|
||||
) + timedelta(days=1)
|
||||
|
||||
ctx['date'] = week.monday()
|
||||
ctx['date_to'] = week.sunday()
|
||||
ctx['before'] = before
|
||||
ctx['after'] = after
|
||||
|
||||
|
||||
271
src/pretix/static/npm_dir/package-lock.json
generated
271
src/pretix/static/npm_dir/package-lock.json
generated
@@ -8,8 +8,8 @@
|
||||
"name": "pretix",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.27.1",
|
||||
"@babel/preset-env": "^7.27.1",
|
||||
"@babel/core": "^7.27.4",
|
||||
"@babel/preset-env": "^7.27.2",
|
||||
"@rollup/plugin-babel": "^6.0.4",
|
||||
"@rollup/plugin-node-resolve": "^16.0.1",
|
||||
"rollup": "^2.79.1",
|
||||
@@ -45,30 +45,30 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/compat-data": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
|
||||
"integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
|
||||
"integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/core": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
|
||||
"integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
|
||||
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ampproject/remapping": "^2.2.0",
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/generator": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/helper-module-transforms": "^7.27.1",
|
||||
"@babel/helpers": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/traverse": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/generator": "^7.27.3",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-module-transforms": "^7.27.3",
|
||||
"@babel/helpers": "^7.27.4",
|
||||
"@babel/parser": "^7.27.4",
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/traverse": "^7.27.4",
|
||||
"@babel/types": "^7.27.3",
|
||||
"convert-source-map": "^2.0.0",
|
||||
"debug": "^4.1.0",
|
||||
"gensync": "^1.0.0-beta.2",
|
||||
@@ -103,13 +103,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/generator": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
|
||||
"integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
|
||||
"integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/parser": "^7.27.3",
|
||||
"@babel/types": "^7.27.3",
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.25",
|
||||
"jsesc": "^3.0.2"
|
||||
@@ -144,12 +144,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-compilation-targets": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
|
||||
"integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
|
||||
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.27.1",
|
||||
"@babel/compat-data": "^7.27.2",
|
||||
"@babel/helper-validator-option": "^7.27.1",
|
||||
"browserslist": "^4.24.0",
|
||||
"lru-cache": "^5.1.1",
|
||||
@@ -278,14 +278,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-module-transforms": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
|
||||
"integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
|
||||
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-module-imports": "^7.27.1",
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"@babel/traverse": "^7.27.1"
|
||||
"@babel/traverse": "^7.27.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -404,25 +404,25 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helpers": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
|
||||
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
|
||||
"integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1"
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/types": "^7.27.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
|
||||
"integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
|
||||
"integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.27.1"
|
||||
"@babel/types": "^7.27.3"
|
||||
},
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
@@ -714,9 +714,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-transform-destructuring": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz",
|
||||
"integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz",
|
||||
"integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-plugin-utils": "^7.27.1"
|
||||
@@ -1041,13 +1041,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/plugin-transform-object-rest-spread": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz",
|
||||
"integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz",
|
||||
"integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-plugin-utils": "^7.27.1",
|
||||
"@babel/plugin-transform-destructuring": "^7.27.3",
|
||||
"@babel/plugin-transform-parameters": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1353,13 +1354,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/preset-env": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz",
|
||||
"integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
|
||||
"integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/compat-data": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/compat-data": "^7.27.2",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-plugin-utils": "^7.27.1",
|
||||
"@babel/helper-validator-option": "^7.27.1",
|
||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
|
||||
@@ -1401,7 +1402,7 @@
|
||||
"@babel/plugin-transform-new-target": "^7.27.1",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
|
||||
"@babel/plugin-transform-numeric-separator": "^7.27.1",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.27.1",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.27.2",
|
||||
"@babel/plugin-transform-object-super": "^7.27.1",
|
||||
"@babel/plugin-transform-optional-catch-binding": "^7.27.1",
|
||||
"@babel/plugin-transform-optional-chaining": "^7.27.1",
|
||||
@@ -1457,13 +1458,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/template": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
|
||||
"integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
|
||||
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/parser": "^7.27.2",
|
||||
"@babel/types": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1471,16 +1472,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/traverse": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
|
||||
"integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
|
||||
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/generator": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/generator": "^7.27.3",
|
||||
"@babel/parser": "^7.27.4",
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/types": "^7.27.3",
|
||||
"debug": "^4.3.1",
|
||||
"globals": "^11.1.0"
|
||||
},
|
||||
@@ -1489,9 +1490,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/types": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
|
||||
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
|
||||
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/helper-string-parser": "^7.27.1",
|
||||
@@ -1886,9 +1887,10 @@
|
||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
@@ -3838,25 +3840,25 @@
|
||||
}
|
||||
},
|
||||
"@babel/compat-data": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz",
|
||||
"integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A=="
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
|
||||
"integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw=="
|
||||
},
|
||||
"@babel/core": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
|
||||
"integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
|
||||
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
|
||||
"requires": {
|
||||
"@ampproject/remapping": "^2.2.0",
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/generator": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/helper-module-transforms": "^7.27.1",
|
||||
"@babel/helpers": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/traverse": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/generator": "^7.27.3",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-module-transforms": "^7.27.3",
|
||||
"@babel/helpers": "^7.27.4",
|
||||
"@babel/parser": "^7.27.4",
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/traverse": "^7.27.4",
|
||||
"@babel/types": "^7.27.3",
|
||||
"convert-source-map": "^2.0.0",
|
||||
"debug": "^4.1.0",
|
||||
"gensync": "^1.0.0-beta.2",
|
||||
@@ -3877,12 +3879,12 @@
|
||||
}
|
||||
},
|
||||
"@babel/generator": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
|
||||
"integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
|
||||
"integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
|
||||
"requires": {
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/parser": "^7.27.3",
|
||||
"@babel/types": "^7.27.3",
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.25",
|
||||
"jsesc": "^3.0.2"
|
||||
@@ -3909,11 +3911,11 @@
|
||||
}
|
||||
},
|
||||
"@babel/helper-compilation-targets": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz",
|
||||
"integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
|
||||
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
|
||||
"requires": {
|
||||
"@babel/compat-data": "^7.27.1",
|
||||
"@babel/compat-data": "^7.27.2",
|
||||
"@babel/helper-validator-option": "^7.27.1",
|
||||
"browserslist": "^4.24.0",
|
||||
"lru-cache": "^5.1.1",
|
||||
@@ -4009,13 +4011,13 @@
|
||||
}
|
||||
},
|
||||
"@babel/helper-module-transforms": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
|
||||
"integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
|
||||
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
|
||||
"requires": {
|
||||
"@babel/helper-module-imports": "^7.27.1",
|
||||
"@babel/helper-validator-identifier": "^7.27.1",
|
||||
"@babel/traverse": "^7.27.1"
|
||||
"@babel/traverse": "^7.27.3"
|
||||
}
|
||||
},
|
||||
"@babel/helper-optimise-call-expression": {
|
||||
@@ -4086,20 +4088,20 @@
|
||||
}
|
||||
},
|
||||
"@babel/helpers": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
|
||||
"integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz",
|
||||
"integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==",
|
||||
"requires": {
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1"
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/types": "^7.27.3"
|
||||
}
|
||||
},
|
||||
"@babel/parser": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz",
|
||||
"integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz",
|
||||
"integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==",
|
||||
"requires": {
|
||||
"@babel/types": "^7.27.1"
|
||||
"@babel/types": "^7.27.3"
|
||||
}
|
||||
},
|
||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
|
||||
@@ -4262,9 +4264,9 @@
|
||||
}
|
||||
},
|
||||
"@babel/plugin-transform-destructuring": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz",
|
||||
"integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz",
|
||||
"integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==",
|
||||
"requires": {
|
||||
"@babel/helper-plugin-utils": "^7.27.1"
|
||||
}
|
||||
@@ -4442,12 +4444,13 @@
|
||||
}
|
||||
},
|
||||
"@babel/plugin-transform-object-rest-spread": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz",
|
||||
"integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz",
|
||||
"integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==",
|
||||
"requires": {
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-plugin-utils": "^7.27.1",
|
||||
"@babel/plugin-transform-destructuring": "^7.27.3",
|
||||
"@babel/plugin-transform-parameters": "^7.27.1"
|
||||
}
|
||||
},
|
||||
@@ -4614,12 +4617,12 @@
|
||||
}
|
||||
},
|
||||
"@babel/preset-env": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz",
|
||||
"integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz",
|
||||
"integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==",
|
||||
"requires": {
|
||||
"@babel/compat-data": "^7.27.1",
|
||||
"@babel/helper-compilation-targets": "^7.27.1",
|
||||
"@babel/compat-data": "^7.27.2",
|
||||
"@babel/helper-compilation-targets": "^7.27.2",
|
||||
"@babel/helper-plugin-utils": "^7.27.1",
|
||||
"@babel/helper-validator-option": "^7.27.1",
|
||||
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
|
||||
@@ -4661,7 +4664,7 @@
|
||||
"@babel/plugin-transform-new-target": "^7.27.1",
|
||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
|
||||
"@babel/plugin-transform-numeric-separator": "^7.27.1",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.27.1",
|
||||
"@babel/plugin-transform-object-rest-spread": "^7.27.2",
|
||||
"@babel/plugin-transform-object-super": "^7.27.1",
|
||||
"@babel/plugin-transform-optional-catch-binding": "^7.27.1",
|
||||
"@babel/plugin-transform-optional-chaining": "^7.27.1",
|
||||
@@ -4707,33 +4710,33 @@
|
||||
}
|
||||
},
|
||||
"@babel/template": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz",
|
||||
"integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==",
|
||||
"version": "7.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
|
||||
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/parser": "^7.27.2",
|
||||
"@babel/types": "^7.27.1"
|
||||
}
|
||||
},
|
||||
"@babel/traverse": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
|
||||
"integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
|
||||
"version": "7.27.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
|
||||
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.27.1",
|
||||
"@babel/generator": "^7.27.1",
|
||||
"@babel/parser": "^7.27.1",
|
||||
"@babel/template": "^7.27.1",
|
||||
"@babel/types": "^7.27.1",
|
||||
"@babel/generator": "^7.27.3",
|
||||
"@babel/parser": "^7.27.4",
|
||||
"@babel/template": "^7.27.2",
|
||||
"@babel/types": "^7.27.3",
|
||||
"debug": "^4.3.1",
|
||||
"globals": "^11.1.0"
|
||||
}
|
||||
},
|
||||
"@babel/types": {
|
||||
"version": "7.27.1",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
|
||||
"integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
|
||||
"version": "7.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
|
||||
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
|
||||
"requires": {
|
||||
"@babel/helper-string-parser": "^7.27.1",
|
||||
"@babel/helper-validator-identifier": "^7.27.1"
|
||||
@@ -5007,9 +5010,9 @@
|
||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"version": "1.1.12",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
"private": true,
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.27.1",
|
||||
"@babel/preset-env": "^7.27.1",
|
||||
"@babel/core": "^7.27.4",
|
||||
"@babel/preset-env": "^7.27.2",
|
||||
"@rollup/plugin-babel": "^6.0.4",
|
||||
"@rollup/plugin-node-resolve": "^16.0.1",
|
||||
"vue": "^2.7.16",
|
||||
|
||||
@@ -12,10 +12,12 @@ setup_collapsible_details = function (el) {
|
||||
return;
|
||||
}
|
||||
content.setAttribute('aria-hidden', 'true');
|
||||
content.setAttribute('inert', true);
|
||||
button.setAttribute('aria-expanded', 'false');
|
||||
button.addEventListener('click', function (e) {
|
||||
button.setAttribute('aria-expanded', 'true');
|
||||
content.setAttribute('aria-hidden', 'false');
|
||||
content.removeAttribute('inert');
|
||||
|
||||
content.addEventListener('transitionend', function() {
|
||||
content.classList.remove('sneak-peek-content');
|
||||
@@ -47,6 +49,7 @@ setup_collapsible_details = function (el) {
|
||||
container.removeEventListener("toggle", removeSneekPeakWhenClosed);
|
||||
trigger.remove();
|
||||
content.removeAttribute('aria-hidden');
|
||||
content.removeAttribute('inert');
|
||||
content.classList.remove('sneak-peek-content');
|
||||
}
|
||||
}
|
||||
@@ -114,7 +117,7 @@ setup_collapsible_details = function (el) {
|
||||
el.find("article button[data-toggle=variations]").click(function (e) {
|
||||
var $button = $(this);
|
||||
var $details = $button.closest("article");
|
||||
var $detailsNotSummary = $(".variations", $details);
|
||||
var $detailsNotSummary = $button.attr("aria-controls") ? $('#' + $button.attr("aria-controls")) : $(".variations", $details);
|
||||
var isOpen = !$detailsNotSummary.prop("hidden");
|
||||
if ($detailsNotSummary.is(':animated')) {
|
||||
e.preventDefault();
|
||||
@@ -122,7 +125,7 @@ setup_collapsible_details = function (el) {
|
||||
}
|
||||
|
||||
var altLabel = $button.attr("data-label-alt");
|
||||
$button.attr("data-label-alt", $button.text());
|
||||
$button.attr("data-label-alt", $button.text().trim());
|
||||
$button.find("span").text(altLabel);
|
||||
$button.attr("aria-expanded", !isOpen);
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
dialog.inline-dialog {
|
||||
position: static;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Modal dialogs using HTML5 dialog tags for accessibility */
|
||||
dialog.modal-card {
|
||||
border: none;
|
||||
@@ -8,9 +15,6 @@ dialog.modal-card {
|
||||
box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
|
||||
background: white;
|
||||
border-radius: $border-radius-large;
|
||||
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
}
|
||||
.modal-card-inner {
|
||||
display: flex;
|
||||
@@ -52,18 +56,8 @@ dialog.modal-card .modal-card-content {
|
||||
|
||||
dialog::backdrop {
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
opacity: 0;
|
||||
transition: opacity .5s allow-discrete;
|
||||
backdrop-filter: blur(2px);
|
||||
}
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 1;
|
||||
}
|
||||
@starting-style {
|
||||
dialog[open], dialog[open]::backdrop {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: $screen-sm-min) {
|
||||
dialog.modal-card:has(.modal-card-icon) .modal-card-inner {
|
||||
|
||||
@@ -10,6 +10,12 @@ body {
|
||||
padding: 50px 0;
|
||||
}
|
||||
|
||||
*:focus, .btn:focus {
|
||||
outline: 2px solid $link-hover-color;
|
||||
outline-offset: 2px;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.big-icon {
|
||||
font-size: 200px;
|
||||
color: $navbar-inverse-bg;
|
||||
|
||||
@@ -648,18 +648,47 @@ var form_handlers = function (el) {
|
||||
var $checkbox = $(this).find("input[type=checkbox][name=_bulk]");
|
||||
var $content = $(this).find(".field-content");
|
||||
var $fields = $content.find("input, select, textarea, button");
|
||||
var $dialog = $(this).attr("data-confirm-dialog") ? $($(this).attr("data-confirm-dialog")) : null;
|
||||
var warningShown = false;
|
||||
|
||||
if ($dialog) {
|
||||
$dialog.on("close", function () {
|
||||
if ($dialog.get(0).returnValue === "yes") {
|
||||
$checkbox.prop("checked", true);
|
||||
} else {
|
||||
$checkbox.prop("checked", false);
|
||||
warningShown = false;
|
||||
}
|
||||
update();
|
||||
});
|
||||
}
|
||||
|
||||
var update = function () {
|
||||
var isChecked = $checkbox.prop("checked");
|
||||
|
||||
$content.toggleClass("enabled", isChecked);
|
||||
$fields.attr("tabIndex", isChecked ? 0 : -1);
|
||||
}
|
||||
$content.on("focusin change click", function () {
|
||||
if ($checkbox.prop("checked")) return;
|
||||
$checkbox.prop("checked", true);
|
||||
update();
|
||||
if ($dialog && !warningShown) {
|
||||
warningShown = true;
|
||||
$dialog.get(0).showModal();
|
||||
} else {
|
||||
$checkbox.prop("checked", true);
|
||||
update();
|
||||
}
|
||||
});
|
||||
$checkbox.on('change', update)
|
||||
$checkbox.on('change', function () {
|
||||
var isChecked = $checkbox.prop("checked");
|
||||
if (isChecked && $dialog && !warningShown) {
|
||||
warningShown = true;
|
||||
$dialog.get(0).showModal();
|
||||
} else if (!isChecked) {
|
||||
warningShown = false;
|
||||
}
|
||||
update();
|
||||
})
|
||||
update();
|
||||
});
|
||||
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
/*global $, Morris, gettext*/
|
||||
$(function () {
|
||||
// Question view
|
||||
if (!$("#question-stats").length) {
|
||||
if (!$("#question_chart").length) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(".chart").css("height", "250px");
|
||||
var data_type = $("#question_chart").attr("data-type"),
|
||||
data = JSON.parse($("#question-chart-data").html()),
|
||||
data = JSON.parse($("#question-chart-data").text() || "[]"),
|
||||
others_sum = 0,
|
||||
max_num = 8;
|
||||
|
||||
for (var i in data) {
|
||||
data[i].value = data[i].count;
|
||||
data[i].label = data[i].answer;
|
||||
if (data[i].label.length > 20) {
|
||||
data[i].label = data[i].label.substring(0, 20) + '…';
|
||||
data = data.map(function (d) {
|
||||
return {
|
||||
'value': d.count,
|
||||
'label': d.answer.length > 20 ? d.answer.substring(0, 20) + '…' : d.answer,
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (data_type == 'N') {
|
||||
// Sort
|
||||
@@ -36,7 +35,7 @@ $(function () {
|
||||
// Limit shown options
|
||||
if (data.length > max_num) {
|
||||
for (var i = max_num; i < data.length; i++) {
|
||||
others_sum += data[i].count;
|
||||
others_sum += data[i].value;
|
||||
}
|
||||
data = data.slice(0, max_num);
|
||||
data.push({'value': others_sum, 'label': gettext('Others')});
|
||||
@@ -78,7 +77,7 @@ $(function () {
|
||||
data: data,
|
||||
resize: true,
|
||||
xkey: 'label',
|
||||
ykeys: ['count'],
|
||||
ykeys: ['value'],
|
||||
labels: [gettext('Count')]
|
||||
});
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ $(function () {
|
||||
.attr("href", "#" + tid)
|
||||
.text($fieldset.find("legend").text())
|
||||
.appendTo($tabli);
|
||||
if ($fieldset.find(".has-error, .alert-danger").length > 0) {
|
||||
if ($fieldset.find(".has-error, .alert-danger:not(.dynamic)").length > 0) {
|
||||
$tablink.append(" ");
|
||||
$tablink.append($("<span>").addClass("fa fa-warning text-danger"));
|
||||
if (preselect === null) {
|
||||
|
||||
@@ -5,7 +5,6 @@ var cart = {
|
||||
_deadline_call: 0,
|
||||
_time_offset: 0,
|
||||
_prev_diff_minutes: 0,
|
||||
_renewed_message: "",
|
||||
|
||||
_get_now: function () {
|
||||
return moment().add(cart._time_offset, 'ms');
|
||||
@@ -59,7 +58,6 @@ var cart = {
|
||||
$("#cart-deadline").text(gettext("Your cart is about to expire."))
|
||||
} else {
|
||||
$("#cart-deadline").text(
|
||||
cart._renewed_message + " " +
|
||||
ngettext(
|
||||
"The items in your cart are reserved for you for one minute.",
|
||||
"The items in your cart are reserved for you for {num} minutes.",
|
||||
@@ -74,7 +72,6 @@ var cart = {
|
||||
pad(diff_minutes.toString(), 2) + ':' + pad(diff_seconds.toString(), 2)
|
||||
);
|
||||
|
||||
cart._renewed_message = "";
|
||||
cart._deadline_timeout = window.setTimeout(cart.draw_deadline, 500);
|
||||
}
|
||||
var already_expired = diff_total_seconds <= 0;
|
||||
@@ -112,7 +109,6 @@ var cart = {
|
||||
}
|
||||
cart._deadline_timeout = null;
|
||||
cart._max_extend = moment(max_extend);
|
||||
cart._renewed_message = renewed_message || "";
|
||||
cart.draw_deadline();
|
||||
}
|
||||
};
|
||||
@@ -122,22 +118,41 @@ $(function () {
|
||||
|
||||
if ($("#cart-deadline").length) {
|
||||
cart.init();
|
||||
$("#cart-extend-confirmation-button").hide().on("blur", function() {
|
||||
$(this).hide();
|
||||
});
|
||||
}
|
||||
|
||||
$("#cart-extend-form").on("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
cart.set_deadline(data.expiry, data.max_expiry_extend, data.message);
|
||||
var cart_panel_heading = $(this).closest(".panel").find(".panel-heading").get(0);
|
||||
if (cart_panel_heading) {
|
||||
cart_panel_heading.focus();
|
||||
}
|
||||
cart.set_deadline(data.expiry, data.max_expiry_extend);
|
||||
} else {
|
||||
alert(data.message);
|
||||
}
|
||||
});
|
||||
// renew-button in cart-panel is clicked, show inline dialog
|
||||
$("#cart-extend-button").on("click", function() {
|
||||
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
document.getElementById("cart-extend-confirmation-dialog").show();
|
||||
}
|
||||
});
|
||||
});
|
||||
$("#cart-extend-confirmation-dialog").on("keydown", function (e) {
|
||||
if(e.key === "Escape") {
|
||||
this.close();
|
||||
}
|
||||
});
|
||||
|
||||
// renew-button in modal dialog is clicked, show modal dialog
|
||||
$("#dialog-cart-extend form").submit(function() {
|
||||
$("#cart-extend-form").submit();
|
||||
$("#cart-extend-form").one("pretix:async-task-success", function(e, data) {
|
||||
if (data.success) {
|
||||
$("#dialog-cart-extended-title").text(data.message);
|
||||
$("#dialog-cart-extended-description").text($("#cart-deadline").text());
|
||||
document.getElementById("dialog-cart-extended").showModal();
|
||||
}
|
||||
}).submit();
|
||||
});
|
||||
|
||||
$(".toggle-container").each(function() {
|
||||
|
||||
@@ -7,4 +7,12 @@ var inIframe = function () {
|
||||
};
|
||||
if (inIframe()) {
|
||||
document.documentElement.classList.add('in-iframe');
|
||||
try {
|
||||
window.parent.postMessage({
|
||||
type: "pretix:widget:title",
|
||||
title: document.title,
|
||||
}, "*");
|
||||
} catch (e) {
|
||||
console.error("Could not post message to parent.", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +252,7 @@ Vue.component('availbox', {
|
||||
variation: Object
|
||||
},
|
||||
mounted: function() {
|
||||
if (this.$root.itemnum === 1 && !this.$root.has_seating_plan ? 1 : 0) {
|
||||
if (this.$root.itemnum === 1 && (!this.$root.categories[0].items[0].has_variations || this.$root.categories[0].items[0].variations.length < 2) && !this.$root.has_seating_plan ? 1 : 0) {
|
||||
this.$refs.quantity.value = 1;
|
||||
if (this.order_max === 1) {
|
||||
this.$refs.quantity.checked = true;
|
||||
@@ -823,7 +823,7 @@ var shared_loading_fragment = (
|
||||
);
|
||||
|
||||
var shared_iframe_fragment = (
|
||||
'<dialog :class="frameClasses" role="alertdialog" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
|
||||
'<dialog :class="frameClasses" aria-label="'+strings.checkout+'" @close="close" @cancel="cancel">'
|
||||
+ '<div class="pretix-widget-frame-loading" v-show="$root.frame_loading">'
|
||||
+ '<svg width="256" height="256" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path class="pretix-widget-primary-color" d="M1152 896q0-106-75-181t-181-75-181 75-75 181 75 181 181 75 181-75 75-181zm512-109v222q0 12-8 23t-20 13l-185 28q-19 54-39 91 35 50 107 138 10 12 10 25t-9 23q-27 37-99 108t-94 71q-12 0-26-9l-138-108q-44 23-91 38-16 136-29 186-7 28-36 28h-222q-14 0-24.5-8.5t-11.5-21.5l-28-184q-49-16-90-37l-141 107q-10 9-25 9-14 0-25-11-126-114-165-168-7-10-7-23 0-12 8-23 15-21 51-66.5t54-70.5q-27-50-41-99l-183-27q-13-2-21-12.5t-8-23.5v-222q0-12 8-23t19-13l186-28q14-46 39-92-40-57-107-138-10-12-10-24 0-10 9-23 26-36 98.5-107.5t94.5-71.5q13 0 26 10l138 107q44-23 91-38 16-136 29-186 7-28 36-28h222q14 0 24.5 8.5t11.5 21.5l28 184q49 16 90 37l142-107q9-9 24-9 13 0 25 10 129 119 165 170 7 8 7 22 0 12-8 23-15 21-51 66.5t-54 70.5q26 50 41 98l183 28q13 2 21 12.5t8 23.5z"/></svg>'
|
||||
+ '<p :class="cancelBlockedClasses"><strong>'+strings.cancel_blocked+'</strong></p>'
|
||||
@@ -903,6 +903,14 @@ Vue.component('pretix-overlay', {
|
||||
}
|
||||
}
|
||||
},
|
||||
'$root.frame_shown': function (newValue) {
|
||||
if (newValue) {
|
||||
var btn = this.$el?.querySelector('.pretix-widget-frame-close button');
|
||||
this.$nextTick(function() {
|
||||
btn.focus();
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
frameClasses: function () {
|
||||
@@ -931,7 +939,18 @@ Vue.component('pretix-overlay', {
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
window.addEventListener('message', this.onMessage, false);
|
||||
},
|
||||
unmounted () {
|
||||
window.removeEventListener('message', this.onMessage, false);
|
||||
},
|
||||
methods: {
|
||||
onMessage: function(e) {
|
||||
if (e.data.type && e.data.type == "pretix:widget:title") {
|
||||
this.$el.querySelector("iframe").title = e.data.title;
|
||||
}
|
||||
},
|
||||
lightboxClose: function () {
|
||||
this.$root.lightbox = null;
|
||||
},
|
||||
@@ -1563,14 +1582,14 @@ Vue.component('pretix-widget-event-calendar', {
|
||||
+ '<a class="pretix-widget-event-calendar-previous-month" href="#" @click.prevent.stop="prevmonth">« '
|
||||
+ strings['previous_month']
|
||||
+ '</a> '
|
||||
+ '<strong>{{ monthname }}</strong> '
|
||||
+ '<strong :id="aria_labelledby">{{ monthname }}</strong> '
|
||||
+ '<a class="pretix-widget-event-calendar-next-month" href="#" @click.prevent.stop="nextmonth">'
|
||||
+ strings['next_month']
|
||||
+ ' »</a>'
|
||||
+ '</div>'
|
||||
|
||||
// Calendar
|
||||
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-label="monthname">'
|
||||
+ '<table class="pretix-widget-event-calendar-table" :id="id" tabindex="0" v-bind:aria-labelledby="aria_labelledby">'
|
||||
+ '<thead>'
|
||||
+ '<tr>'
|
||||
+ '<th aria-label="' + strings['days']['MONDAY'] + '">' + strings['days']['MO'] + '</th>'
|
||||
@@ -1597,6 +1616,9 @@ Vue.component('pretix-widget-event-calendar', {
|
||||
id: function () {
|
||||
return this.$root.html_id + "-event-calendar-table";
|
||||
},
|
||||
aria_labelledby: function () {
|
||||
return this.$root.html_id + "-event-calendar-table-label";
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
back_to_list: function () {
|
||||
@@ -2182,11 +2204,22 @@ var create_overlay = function (app) {
|
||||
// show loading spinner only when previously no frame_src was set
|
||||
if (newValue && !oldValue) {
|
||||
this.frame_loading = true;
|
||||
this.$el?.querySelector('dialog.pretix-widget-frame-holder').showModal();
|
||||
}
|
||||
// to close and unload the iframe, frame_src can be empty -> make it valid HTML with about:blank
|
||||
this.$el.querySelector("iframe").src = newValue || "about:blank";
|
||||
},
|
||||
frame_loading: function (newValue) {
|
||||
var dialog = this.$el?.querySelector('dialog.pretix-widget-frame-holder');
|
||||
if (newValue) {
|
||||
if (!dialog.open) {
|
||||
dialog.showModal();
|
||||
}
|
||||
} else {
|
||||
if (!this.frame_src && dialog.open) {// finished loading, but no iframe to display => close
|
||||
dialog.close();
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
app.$root.overlay = framechild;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user