diff --git a/doc/api/resources/checkin.rst b/doc/api/resources/checkin.rst index 89ab1cff1..479fa28a3 100644 --- a/doc/api/resources/checkin.rst +++ b/doc/api/resources/checkin.rst @@ -421,3 +421,94 @@ Annulment of a check-in :statuscode 401: Authentication failure :statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource. :statuscode 404: The requested nonce does not exist. + + +Check-in history +---------------- + +.. rst-class:: rest-resource-table + +===================================== ========================== ======================================================= +Field Type Description +===================================== ========================== ======================================================= +id integer Internal ID of the check-in +successful boolean Whether the check-in was successful +error_reason string Category of reason why the check-in was unsuccessful. Currently + ``"canceled"``, ``"invalid"``, ``"unpaid"`` ``"product"``, + ``"rules"``, ``"revoked"``, ``"incomplete"``, ``"already_redeemed"``, + ``"ambiguous"``, ``"error"``, ``"blocked"``, ``"unapproved"``, + ``"invalid_time"``, ``"annulled"`` or ``null`` +error_explanation string Additional, human-readable reason for the check-in to be unsuccessful (or ``null``) +position integer Internal ID of the order position (or ``null`` for unknown scans) +datetime datetime Logical time when the check-in happened +created datetime Time when the check-in appeared on the server +list integer Internal ID of the check-in list +auto_checked_in boolean Whether the check-in was performed by the system automatically +gate integer Internal ID of the gate (or ``null``) +device integer Internal ID of the device (or ``null``) +device_id integer Organizer-internal ID of the device (or ``null``) +type string Type of check-in, currently ``"entry"`` or ``"exit"`` +===================================== ========================== ======================================================= + +.. http:get:: /api/v1/organizers/(organizer)/events/(event)/checkins/ + + Returns a list of all check-in events within a given event. + + **Example request**: + + .. sourcecode:: http + + GET /api/v1/organizers/bigevents/events/sampleconf/checkins/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + + { + "count": 1, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "successful": true, + "error_reason": null, + "error_explanation": null, + "position": 1234, + "datetime": "2017-12-25T12:45:23Z", + "created": "2017-12-25T12:45:23Z", + "list": 2, + "auto_checked_in": false, + "gate": null, + "device": null, + "device_id": null, + "type": "entry", + } + ] + } + + :query integer page: The page number in case of a multi-page result set, default is 1 + :query datetime created_since: Only return check-ins that have been created since the given date (inclusive). + :query datetime created_before: Only return check-ins that have been created before the given date (exclusive). + :query datetime datetime_since: Only return check-ins that have happened since the given date (inclusive). + :query datetime datetime_before: Only return check-ins that have happened before the given date (exclusive). + :query boolean successful: Only return check-ins that have (not) been successful. + :query boolean error_reason: Only return check-ins with a specific error reason. + :query integer list: Only return check-ins from a specific list. + :query string type: Only return check-ins of a specific type. + :query integer gate: Only return check-ins from a specific gate. + :query integer device: Only return check-ins from a specific device. + :query boolean auto_checked_in: Only return check-ins that are (not) auto-checked in. + :query string ordering: Manually set the ordering of results. Valid fields to be used are ``datetime``, ``created``, + and ``id``. + :param organizer: The ``slug`` field of the organizer to fetch + :param event: The ``slug`` field of the event to fetch + :statuscode 200: no error + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource. diff --git a/doc/api/resources/index.rst b/doc/api/resources/index.rst index 642befcce..8b9d96cdd 100644 --- a/doc/api/resources/index.rst +++ b/doc/api/resources/index.rst @@ -19,6 +19,7 @@ at :ref:`plugin-docs`. item_bundles item_add-ons item_meta_properties + item_program_times questions question_options quotas diff --git a/doc/api/resources/invoices.rst b/doc/api/resources/invoices.rst index de9245941..3a97ca412 100644 --- a/doc/api/resources/invoices.rst +++ b/doc/api/resources/invoices.rst @@ -22,6 +22,7 @@ invoice_from_name string Sender address: invoice_from string Sender address: Address lines invoice_from_zipcode string Sender address: ZIP code invoice_from_city string Sender address: City +invoice_from_state string Sender address: State (only used in some countries) invoice_from_country string Sender address: Country code invoice_from_tax_id string Sender address: Local Tax ID invoice_from_vat_id string Sender address: EU VAT ID @@ -233,6 +234,7 @@ List of all invoices "invoice_from": "Demo street 12", "invoice_from_zipcode":"", "invoice_from_city":"Demo town", + "invoice_from_state":"CA", "invoice_from_country":"US", "invoice_from_tax_id":"", "invoice_from_vat_id":"", @@ -381,6 +383,7 @@ Fetching individual invoices "invoice_from": "Demo street 12", "invoice_from_zipcode":"", "invoice_from_city":"Demo town", + "invoice_from_state":"CA", "invoice_from_country":"US", "invoice_from_tax_id":"", "invoice_from_vat_id":"", diff --git a/doc/api/resources/item_program_times.rst b/doc/api/resources/item_program_times.rst new file mode 100644 index 000000000..eedf3be0a --- /dev/null +++ b/doc/api/resources/item_program_times.rst @@ -0,0 +1,223 @@ +Item program times +================== + +Resource description +-------------------- + +Program times for products (items) that can be set in addition to event times, e.g. to display seperate schedules within an event. +Note that ``program_times`` are not available for items inside event series. +The program times resource contains the following public fields: + +.. rst-class:: rest-resource-table + +===================================== ========================== ======================================================= +Field Type Description +===================================== ========================== ======================================================= +id integer Internal ID of the program time +start datetime The start date time for this program time slot. +end datetime The end date time for this program time slot. +===================================== ========================== ======================================================= + +.. versionchanged:: TODO + + The resource has been added. + + +Endpoints +--------- + +.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/program_times/ + + Returns a list of all program times for a given item. + + **Example request**: + + .. sourcecode:: http + + GET /api/v1/organizers/bigevents/events/sampleconf/items/11/program_times/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + + { + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "start": "2025-08-14T22:00:00Z", + "end": "2025-08-15T00:00:00Z" + }, + { + "id": 3, + "start": "2025-08-12T22:00:00Z", + "end": "2025-08-13T22:00:00Z" + }, + { + "id": 14, + "start": "2025-08-15T22:00:00Z", + "end": "2025-08-17T22:00:00Z" + } + ] + } + + :param organizer: The ``slug`` field of the organizer to fetch + :param event: The ``slug`` field of the event to fetch + :param item: The ``id`` field of the item to fetch + :statuscode 200: no error + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event/item does not exist **or** you have no permission to view this resource. + +.. http:get:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/program_times/(id)/ + + Returns information on one program time, identified by its ID. + + **Example request**: + + .. sourcecode:: http + + GET /api/v1/organizers/bigevents/events/sampleconf/items/1/program_times/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, + "start": "2025-08-15T22:00:00Z", + "end": "2025-10-27T23:00:00Z" + } + + :param organizer: The ``slug`` field of the organizer to fetch + :param event: The ``slug`` field of the event to fetch + :param item: The ``id`` field of the item to fetch + :param id: The ``id`` field of the program time to fetch + :statuscode 200: no error + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event does not exist **or** you have no permission to view this resource. + +.. http:post:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/program_times/ + + Creates a new program time + + **Example request**: + + .. sourcecode:: http + + POST /api/v1/organizers/bigevents/events/sampleconf/items/1/program_times/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + Content-Type: application/json + + { + "start": "2025-08-15T10:00:00Z", + "end": "2025-08-15T22:00:00Z" + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 201 Created + Vary: Accept + Content-Type: application/json + + { + "id": 17, + "start": "2025-08-15T10:00:00Z", + "end": "2025-08-15T22:00:00Z" + } + + :param organizer: The ``slug`` field of the organizer of the event/item to create a program time for + :param event: The ``slug`` field of the event to create a program time for + :param item: The ``id`` field of the item to create a program time for + :statuscode 201: no error + :statuscode 400: The program time could not be created due to invalid submitted data. + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event does not exist **or** you have no permission to create this resource. + +.. http:patch:: /api/v1/organizers/(organizer)/events/(event)/items/(item)/program_times/(id)/ + + Update a program time. You can also use ``PUT`` instead of ``PATCH``. With ``PUT``, you have to provide all fields of + the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you + want to change. + + You can change all fields of the resource except the ``id`` field. + + **Example request**: + + .. sourcecode:: http + + PATCH /api/v1/organizers/bigevents/events/sampleconf/items/1/program_times/1/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + Content-Type: application/json + Content-Length: 94 + + { + "start": "2025-08-14T10:00:00Z" + } + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + + { + "id": 1, + "start": "2025-08-14T10:00:00Z", + "end": "2025-08-15T12:00:00Z" + } + + :param organizer: The ``slug`` field of the organizer to modify + :param event: The ``slug`` field of the event to modify + :param id: The ``id`` field of the item to modify + :param id: The ``id`` field of the program time to modify + :statuscode 200: no error + :statuscode 400: The program time could not be modified due to invalid submitted data + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event does not exist **or** you have no permission to change this resource. + +.. http:delete:: /api/v1/organizers/(organizer)/events/(event)/items/(id)/program_times/(id)/ + + Delete a program time. + + **Example request**: + + .. sourcecode:: http + + DELETE /api/v1/organizers/bigevents/events/sampleconf/items/1/program_times/1/ HTTP/1.1 + Host: pretix.eu + Accept: application/json, text/javascript + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 204 No Content + Vary: Accept + + :param organizer: The ``slug`` field of the organizer to modify + :param event: The ``slug`` field of the event to modify + :param id: The ``id`` field of the item to modify + :param id: The ``id`` field of the program time to delete + :statuscode 204: no error + :statuscode 401: Authentication failure + :statuscode 403: The requested organizer/event does not exist **or** you have no permission to delete this resource. diff --git a/doc/api/resources/items.rst b/doc/api/resources/items.rst index 383da02d7..a8a5a1482 100644 --- a/doc/api/resources/items.rst +++ b/doc/api/resources/items.rst @@ -139,6 +139,10 @@ has_variations boolean Shows whether variations list of objects A list with one object for each variation of this item. Can be empty. Only writable during creation, use separate endpoint to modify this later. +program_times list of objects A list with one object for each program time of this item. + Can be empty. Only writable during creation, + use separate endpoint to modify this later. + Not available for items in event series. ├ id integer Internal ID of the variation ├ value multi-lingual string The "name" of the variation ├ default_price money (string) The price set directly for this variation or ``null`` @@ -225,6 +229,10 @@ meta_data object Values set fo The ``hidden_if_item_available_mode`` attributes has been added. +.. versionchanged:: 2025.9 + + The ``program_times`` attribute has been added. + Notes ----- @@ -232,9 +240,11 @@ Please note that an item either always has variations or never has. Once created change to an item without and vice versa. To create an item with variations ensure that you POST an item with at least one variation. -Also note that ``variations``, ``bundles``, and ``addons`` are only supported on ``POST``. To update/delete variations, -bundles, and add-ons please use the dedicated nested endpoints. By design this endpoint does not support ``PATCH`` and ``PUT`` -with nested ``variations``, ``bundles`` and/or ``addons``. +Also note that ``variations``, ``bundles``, ``addons`` and ``program_times`` are only supported on ``POST``. To update/delete variations, +bundles, add-ons and program times please use the dedicated nested endpoints. By design this endpoint does not support ``PATCH`` and ``PUT`` +with nested ``variations``, ``bundles``, ``addons`` and/or ``program_times``. + +``program_times`` is not available to items in event series. Endpoints --------- @@ -373,7 +383,8 @@ Endpoints } ], "addons": [], - "bundles": [] + "bundles": [], + "program_times": [] } ] } @@ -525,7 +536,8 @@ Endpoints } ], "addons": [], - "bundles": [] + "bundles": [], + "program_times": [] } :param organizer: The ``slug`` field of the organizer to fetch @@ -653,7 +665,13 @@ Endpoints } ], "addons": [], - "bundles": [] + "bundles": [], + "program_times": [ + { + "start": "2025-08-14T22:00:00Z", + "end": "2025-08-15T00:00:00Z" + } + ] } **Example response**: @@ -773,7 +791,13 @@ Endpoints } ], "addons": [], - "bundles": [] + "bundles": [], + "program_times": [ + { + "start": "2025-08-14T22:00:00Z", + "end": "2025-08-15T00:00:00Z" + } + ] } :param organizer: The ``slug`` field of the organizer of the event to create an item for @@ -789,8 +813,9 @@ Endpoints the resource, other fields will be reset to default. With ``PATCH``, you only need to provide the fields that you want to change. - You can change all fields of the resource except the ``has_variations``, ``variations`` and the ``addon`` field. If - you need to update/delete variations or add-ons please use the nested dedicated endpoints. + You can change all fields of the resource except the ``has_variations``, ``variations``, ``addon`` and the + ``program_times`` field. If you need to update/delete variations, add-ons or program times, please use the nested + dedicated endpoints. **Example request**: @@ -924,7 +949,8 @@ Endpoints } ], "addons": [], - "bundles": [] + "bundles": [], + "program_times": [] } :param organizer: The ``slug`` field of the organizer to modify diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 2894d16c6..f863a6df4 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -41,6 +41,7 @@ expires datetime The order will payment_date date **DEPRECATED AND INACCURATE** Date of payment receipt payment_provider string **DEPRECATED AND INACCURATE** Payment provider used for this order total money (string) Total value of this order +tax_rounding_mode string Tax rounding mode, see :ref:`algorithms-rounding` comment string Internal comment on this order api_meta object Meta data for that order. Only available through API, no guarantees on the content structure. You can use this to save references to your system. @@ -151,6 +152,10 @@ plugin_data object Additional data The ``invoice_address.transmission_type`` and ``invoice_address.transmission_info`` attributes have been added. +.. versionchanged:: 2025.10 + + The ``tax_rounding_mode`` attribute has been added. + .. _order-position-resource: Order position resource @@ -358,6 +363,7 @@ List of all orders "payment_provider": "banktransfer", "fees": [], "total": "23.00", + "tax_rounding_mode": "line", "comment": "", "custom_followup_at": null, "checkin_attention": false, @@ -602,6 +608,7 @@ Fetching individual orders "payment_provider": "banktransfer", "fees": [], "total": "23.00", + "tax_rounding_mode": "line", "comment": "", "api_meta": {}, "custom_followup_at": null, @@ -1011,6 +1018,7 @@ Creating orders provider will not be called to do anything about this (i.e. if you pass a bank account to a debit provider, *no* charge will be created), this is just informative in case you *handled the payment already*. * ``payment_date`` (optional) – Date and time of the completion of the payment. + * ``tax_rounding_mode`` (optional) * ``comment`` (optional) * ``custom_followup_at`` (optional) * ``checkin_attention`` (optional) diff --git a/doc/development/algorithms/pricing.rst b/doc/development/algorithms/pricing.rst index 1b8863389..aa1c7769f 100644 --- a/doc/development/algorithms/pricing.rst +++ b/doc/development/algorithms/pricing.rst @@ -178,3 +178,124 @@ Flowchart --------- .. image:: /images/cart_pricing.png + + +.. _`algorithms-rounding`: + +Rounding of taxes +----------------- + +pretix internally always stores taxes on a per-line level, like this: + + ========== ========== =========== ======= ============= + Product Tax rate Net price Tax Gross price + ========== ========== =========== ======= ============= + Ticket A 19 % 84.03 15.97 100.00 + Ticket B 19 % 84.03 15.97 100.00 + Ticket C 19 % 84.03 15.97 100.00 + Ticket D 19 % 84.03 15.97 100.00 + Ticket E 19 % 84.03 15.97 100.00 + Sum 420.15 79.85 500.00 + ========== ========== =========== ======= ============= + +Whether the net price is computed from the gross price or vice versa is configured on the tax rule and may differ for every line. + +The line-based computation has a few significant advantages: + +- We can report both net and gross prices for every individual ticket. + +- We can report both net and gross prices for every filter imaginable, such as the gross sum of all sales of Ticket A + or the net sum of all sales for a specific date in an event series. All numbers will be exact. + +- When splitting the order into two, both net price and gross price are split without any changes in rounding. + +The main disadvantage is that the tax looks "wrong" when computed from the sum. Taking the sum of net prices (420.15) +and multiplying it with the tax rate (19%) yields a tax amount of 79.83 (instead of 79.85) and a gross sum of 499.98 +(instead of 499.98). This becomes a problem when juristictions, data formats, or external systems expect this calculation +to work on the level of the entire order. A prominent example is the EN 16931 standard for e-invoicing that +does not allow the computation as created by pretix. + +However, calculating the tax rate from the net total has significant disadvantages: + +- It is impossible to guarantee a stable gross price this way, i.e. if you advertise a price of €100 per ticket to + consumers, they will be confused when they only need to pay €499.98 for 5 tickets. + +- Some prices are impossible, e.g. you cannot sell a ticket for a gross price of €99.99 at a 19% tax rate, since there + is no two-decimal net price that would be computed to a gross price of €99.99. + +- When splitting an order into two, the combined of the new orders is not guaranteed to be the same as the total of the + original order. Therefore, additional payments or refunds of very small amounts might be necessary. + +To allow organizers to make their own choices on this matter, pretix provides the following options: + +Compute taxes for every line individually +""""""""""""""""""""""""""""""""""""""""" + +Algorithm identifier: ``line`` + +This is our original algorithm where the tax value is rounded for every line individually. + +**This is our current default algorithm and we recommend it whenever you do not have different requirements** (see below). +For the example above: + + ========== ========== =========== ======= ============= + Product Tax rate Net price Tax Gross price + ========== ========== =========== ======= ============= + Ticket A 19 % 84.03 15.97 100.00 + Ticket B 19 % 84.03 15.97 100.00 + Ticket C 19 % 84.03 15.97 100.00 + Ticket D 19 % 84.03 15.97 100.00 + Ticket E 19 % 84.03 15.97 100.00 + Sum 420.15 79.85 500.00 + ========== ========== =========== ======= ============= + + +Compute taxes based on net total +"""""""""""""""""""""""""""""""" + +Algorithm identifier: ``sum_by_net`` + +In this algorithm, the tax value and gross total are computed from the sum of the net prices. To accomplish this within +our data model, the gross price and tax of some of the tickets will be changed by the minimum currency unit (e.g. €0.01). +The net price of the tickets always stay the same. + +**This is the algorithm intended by EN 16931 invoices and our recommendation to use for e-invoicing when (primarily) business customers are involved.** + +The main downside is that it might be confusing when selling to consumers, since the amounts to be paid change in unexpected ways. +For the example above, the customer expects to pay 5 times 100.00, but they are are in fact charged 499.98: + + ========== ========== =========== ============================== ============================== + Product Tax rate Net price Tax Gross price + ========== ========== =========== ============================== ============================== + Ticket A 19 % 84.03 15.96 (incl. -0.01 rounding) 99.99 (incl. -0.01 rounding) + Ticket B 19 % 84.03 15.96 (incl. -0.01 rounding) 99.99 (incl. -0.01 rounding) + Ticket C 19 % 84.03 15.97 100.00 + Ticket D 19 % 84.03 15.97 100.00 + Ticket E 19 % 84.03 15.97 100.00 + Sum 420.15 78.83 499.98 + ========== ========== =========== ============================== ============================== + +Compute taxes based on net total with stable gross prices +""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Algorithm identifier: ``sum_by_net_keep_gross`` + +In this algorithm, the tax value and gross total are computed from the sum of the net prices. However, the net prices +of some of the tickets will be changed automatically by the minimum currency unit (e.g. €0.01) such that the resulting +gross prices stay the same. + +**This is less confusing to consumers and the end result is still compliant to EN 16931, so we recommend this for e-invoicing when (primarily) consumers are involved.** + +The main downside is that it might be confusing when selling to business customers, since the prices of the identical tickets appear to be different. +Full computation for the example above: + + ========== ========== ============================= ============================== ============= + Product Tax rate Net price Tax Gross price + ========== ========== ============================= ============================== ============= + Ticket A 19 % 84.04 (incl. 0.01 rounding) 15.96 (incl. -0.01 rounding) 100.00 + Ticket B 19 % 84.04 (incl. 0.01 rounding) 15.96 (incl. -0.01 rounding) 100.00 + Ticket C 19 % 84.03 15.97 100.00 + Ticket D 19 % 84.03 15.97 100.00 + Ticket E 19 % 84.03 15.97 100.00 + Sum 420.17 79.83 500.00 + ========== ========== ============================= ============================== ============= diff --git a/doc/images/cart_pricing.png b/doc/images/cart_pricing.png index 4b1f3a713..b2d667eea 100644 Binary files a/doc/images/cart_pricing.png and b/doc/images/cart_pricing.png differ diff --git a/doc/images/cart_pricing.puml b/doc/images/cart_pricing.puml index ae945e0dd..47c1c49ff 100644 --- a/doc/images/cart_pricing.puml +++ b/doc/images/cart_pricing.puml @@ -23,6 +23,7 @@ partition "For every cart position" { --> "Store as line_price (gross), tax_rate" } --> "Apply discount engine" +--> "Apply tax rounding" --> "Store as price (gross)" @enduml diff --git a/pyproject.toml b/pyproject.toml index c1a12ddf8..ddda75cbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,9 +33,9 @@ dependencies = [ "celery==5.5.*", "chardet==5.2.*", "cryptography>=44.0.0", - "css-inline==0.17.*", + "css-inline==0.18.*", "defusedcsv>=1.1.0", - "Django[argon2]==4.2.*,>=4.2.24", + "Django[argon2]==4.2.*,>=4.2.26", "django-bootstrap3==25.2", "django-compressor==4.5.1", "django-countries==7.6.*", @@ -81,7 +81,7 @@ dependencies = [ "pycountry", "pycparser==2.23", "pycryptodome==3.23.*", - "pypdf==6.1.*", + "pypdf==6.3.*", "python-bidi==0.6.*", # Support for Arabic in reportlab "python-dateutil==2.9.*", "pytz", @@ -91,7 +91,7 @@ dependencies = [ "redis==6.4.*", "reportlab==4.4.*", "requests==2.32.*", - "sentry-sdk==2.42.*", + "sentry-sdk==2.45.*", "sepaxml==2.7.*", "stripe==7.9.*", "text-unidecode==1.*", diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index ac9cd86de..86a2cb9ad 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "2025.9.0" +__version__ = "2025.10.0" diff --git a/src/pretix/api/migrations/0014_alter_webhook_target_url_and_more.py b/src/pretix/api/migrations/0014_alter_webhook_target_url_and_more.py new file mode 100644 index 000000000..f146b7fe4 --- /dev/null +++ b/src/pretix/api/migrations/0014_alter_webhook_target_url_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.24 on 2025-11-14 16:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixapi", "0013_alter_webhookcallretry_retry_not_before"), + ] + + operations = [ + migrations.AlterField( + model_name="webhook", + name="target_url", + field=models.URLField(max_length=1024), + ), + migrations.AlterField( + model_name="webhookcall", + name="target_url", + field=models.URLField(max_length=1024), + ), + ] diff --git a/src/pretix/api/models.py b/src/pretix/api/models.py index a6c202e57..36fda8859 100644 --- a/src/pretix/api/models.py +++ b/src/pretix/api/models.py @@ -114,7 +114,7 @@ class OAuthRefreshToken(AbstractRefreshToken): class WebHook(models.Model): organizer = models.ForeignKey('pretixbase.Organizer', on_delete=models.CASCADE, related_name='webhooks') enabled = models.BooleanField(default=True, verbose_name=_("Enable webhook")) - target_url = models.URLField(verbose_name=_("Target URL"), max_length=255) + target_url = models.URLField(verbose_name=_("Target URL"), max_length=1024) all_events = models.BooleanField(default=True, verbose_name=_("All events (including newly created ones)")) limit_events = models.ManyToManyField('pretixbase.Event', verbose_name=_("Limit to events"), blank=True) comment = models.CharField(verbose_name=_("Comment"), max_length=255, null=True, blank=True) @@ -140,7 +140,7 @@ class WebHookEventListener(models.Model): class WebHookCall(models.Model): webhook = models.ForeignKey('WebHook', on_delete=models.CASCADE, related_name='calls') datetime = models.DateTimeField(auto_now_add=True) - target_url = models.URLField(max_length=255) + target_url = models.URLField(max_length=1024) action_type = models.CharField(max_length=255) is_retry = models.BooleanField(default=False) execution_time = models.FloatField(null=True) diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index 680d1bd5d..1f1c40cf2 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -820,6 +820,7 @@ class EventSettingsSerializer(SettingsSerializer): 'invoice_address_from', 'invoice_address_from_zipcode', 'invoice_address_from_city', + 'invoice_address_from_state', 'invoice_address_from_country', 'invoice_address_from_tax_id', 'invoice_address_from_vat_id', @@ -829,6 +830,7 @@ class EventSettingsSerializer(SettingsSerializer): 'invoice_eu_currencies', 'invoice_logo_image', 'invoice_renderer_highlight_order_code', + 'tax_rounding', 'cancel_allow_user', 'cancel_allow_user_until', 'cancel_allow_user_unpaid_keep', @@ -951,6 +953,7 @@ class DeviceEventSettingsSerializer(EventSettingsSerializer): 'invoice_address_from', 'invoice_address_from_zipcode', 'invoice_address_from_city', + 'invoice_address_from_state', 'invoice_address_from_country', 'invoice_address_from_tax_id', 'invoice_address_from_vat_id', diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index 3b1dd9d9b..a2c6258f5 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -47,8 +47,9 @@ from pretix.api.serializers.event import MetaDataField from pretix.api.serializers.fields import UploadedFileField from pretix.api.serializers.i18n import I18nAwareModelSerializer from pretix.base.models import ( - Item, ItemAddOn, ItemBundle, ItemCategory, ItemMetaValue, ItemVariation, - ItemVariationMetaValue, Question, QuestionOption, Quota, SalesChannel, + Item, ItemAddOn, ItemBundle, ItemCategory, ItemMetaValue, ItemProgramTime, + ItemVariation, ItemVariationMetaValue, Question, QuestionOption, Quota, + SalesChannel, ) @@ -187,6 +188,12 @@ class InlineItemAddOnSerializer(serializers.ModelSerializer): 'position', 'price_included', 'multi_allowed') +class InlineItemProgramTimeSerializer(serializers.ModelSerializer): + class Meta: + model = ItemProgramTime + fields = ('start', 'end') + + class ItemBundleSerializer(serializers.ModelSerializer): class Meta: model = ItemBundle @@ -212,6 +219,37 @@ class ItemBundleSerializer(serializers.ModelSerializer): return data +class ItemProgramTimeSerializer(serializers.ModelSerializer): + class Meta: + model = ItemProgramTime + fields = ('id', 'start', 'end') + + 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) + + start = full_data.get('start') + if not start: + raise ValidationError(_("The program start must not be empty.")) + + end = full_data.get('end') + if not end: + raise ValidationError(_("The program end must not be empty.")) + + if start > end: + raise ValidationError(_("The program end must not be before the program start.")) + + event = self.context['event'] + if event.has_subevents: + raise ValidationError({ + _("You cannot use program times on an event series.") + }) + + return data + + class ItemAddOnSerializer(serializers.ModelSerializer): class Meta: model = ItemAddOn @@ -250,6 +288,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): addons = InlineItemAddOnSerializer(many=True, required=False) bundles = InlineItemBundleSerializer(many=True, required=False) variations = InlineItemVariationSerializer(many=True, required=False) + program_times = InlineItemProgramTimeSerializer(many=True, required=False) tax_rate = ItemTaxRateField(source='*', read_only=True) meta_data = MetaDataField(required=False, source='*') picture = UploadedFileField(required=False, allow_null=True, allowed_types=( @@ -271,7 +310,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): 'available_from', 'available_from_mode', 'available_until', 'available_until_mode', 'require_voucher', 'hide_without_voucher', 'allow_cancel', 'require_bundling', 'min_per_order', 'max_per_order', 'checkin_attention', 'checkin_text', 'has_variations', 'variations', - 'addons', 'bundles', 'original_price', 'require_approval', 'generate_tickets', + 'addons', 'bundles', 'program_times', 'original_price', 'require_approval', 'generate_tickets', 'show_quota_left', 'hidden_if_available', 'hidden_if_item_available', 'hidden_if_item_available_mode', 'allow_waitinglist', 'issue_giftcard', 'meta_data', 'require_membership', 'require_membership_types', 'require_membership_hidden', 'grant_membership_type', @@ -294,9 +333,9 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): def validate(self, data): data = super().validate(data) - if self.instance and ('addons' in data or 'variations' in data or 'bundles' in data): - raise ValidationError(_('Updating add-ons, bundles, or variations via PATCH/PUT is not supported. Please use the ' - 'dedicated nested endpoint.')) + if self.instance and ('addons' in data or 'variations' in data or 'bundles' in data or 'program_times' in data): + raise ValidationError(_('Updating add-ons, bundles, program times or variations via PATCH/PUT is not ' + 'supported. Please use the dedicated nested endpoint.')) Item.clean_per_order(data.get('min_per_order'), data.get('max_per_order')) Item.clean_available(data.get('available_from'), data.get('available_until')) @@ -347,6 +386,13 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): ItemAddOn.clean_max_min_count(addon_data.get('max_count', 0), addon_data.get('min_count', 0)) return value + def validate_program_times(self, value): + if not self.instance: + for program_time_data in value: + ItemProgramTime.clean_start_end(self, start=program_time_data.get('start', None), + end=program_time_data.get('end', None)) + return value + @cached_property def item_meta_properties(self): return { @@ -364,6 +410,7 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): variations_data = validated_data.pop('variations') if 'variations' in validated_data else {} addons_data = validated_data.pop('addons') if 'addons' in validated_data else {} bundles_data = validated_data.pop('bundles') if 'bundles' in validated_data else {} + program_times_data = validated_data.pop('program_times') if 'program_times' in validated_data else {} meta_data = validated_data.pop('meta_data', None) picture = validated_data.pop('picture', None) require_membership_types = validated_data.pop('require_membership_types', []) @@ -398,6 +445,8 @@ class ItemSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer): ItemAddOn.objects.create(base_item=item, **addon_data) for bundle_data in bundles_data: ItemBundle.objects.create(base_item=item, **bundle_data) + for program_time_data in program_times_data: + ItemProgramTime.objects.create(item=item, **program_time_data) # Meta data if meta_data is not None: diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index b58754ed9..1459e1c26 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -52,9 +52,10 @@ from pretix.base.decimal import round_decimal from pretix.base.i18n import language from pretix.base.invoicing.transmission import get_transmission_types from pretix.base.models import ( - CachedFile, Checkin, Customer, Invoice, InvoiceAddress, InvoiceLine, Item, - ItemVariation, Order, OrderPosition, Question, QuestionAnswer, - ReusableMedium, SalesChannel, Seat, SubEvent, TaxRule, Voucher, + CachedFile, Checkin, Customer, Device, Invoice, InvoiceAddress, + InvoiceLine, Item, ItemVariation, Order, OrderPosition, Question, + QuestionAnswer, ReusableMedium, SalesChannel, Seat, SubEvent, TaxRule, + Voucher, ) from pretix.base.models.orders import ( BlockedTicketSecret, CartPosition, OrderFee, OrderPayment, OrderRefund, @@ -64,10 +65,13 @@ from pretix.base.pdf import get_images, get_variables from pretix.base.services.cart import error_messages from pretix.base.services.locking import LOCK_TRUST_WINDOW, lock_objects from pretix.base.services.pricing import ( - apply_discounts, get_line_price, get_listed_price, is_included_for_free, + apply_discounts, apply_rounding, get_line_price, get_listed_price, + is_included_for_free, ) from pretix.base.services.quotas import QuotaAvailability -from pretix.base.settings import COUNTRIES_WITH_STATE_IN_ADDRESS +from pretix.base.settings import ( + COUNTRIES_WITH_STATE_IN_ADDRESS, ROUNDING_MODES, +) from pretix.base.signals import register_ticket_outputs from pretix.helpers.countries import CachedCountries from pretix.multidomain.urlreverse import build_absolute_uri @@ -325,7 +329,7 @@ class AnswerSerializer(I18nAwareModelSerializer): return data -class CheckinSerializer(I18nAwareModelSerializer): +class InlineCheckinSerializer(I18nAwareModelSerializer): device_id = serializers.SlugRelatedField( source='device', slug_field='device_id', @@ -337,6 +341,21 @@ class CheckinSerializer(I18nAwareModelSerializer): fields = ('id', 'datetime', 'list', 'auto_checked_in', 'gate', 'device', 'device_id', 'type') +class CheckinSerializer(I18nAwareModelSerializer): + device_id = serializers.SlugRelatedField( + source='device', + slug_field='device_id', + read_only=True, + ) + + class Meta: + model = Checkin + fields = ( + 'id', 'successful', 'error_reason', 'error_explanation', 'position', 'datetime', 'list', 'created', + 'auto_checked_in', 'gate', 'device', 'device_id', 'type' + ) + + class PrintLogSerializer(serializers.ModelSerializer): device_id = serializers.SlugRelatedField( source='device', @@ -560,7 +579,7 @@ class OrderPositionPluginDataField(serializers.Field): class OrderPositionSerializer(I18nAwareModelSerializer): - checkins = CheckinSerializer(many=True, read_only=True) + checkins = InlineCheckinSerializer(many=True, read_only=True) print_logs = PrintLogSerializer(many=True, read_only=True) answers = AnswerSerializer(many=True) downloads = PositionDownloadsField(source='*', read_only=True) @@ -833,14 +852,15 @@ class OrderSerializer(I18nAwareModelSerializer): list_serializer_class = OrderListSerializer fields = ( 'code', 'event', 'status', 'testmode', 'secret', 'email', 'phone', 'locale', 'datetime', 'expires', 'payment_date', - 'payment_provider', 'fees', 'total', 'comment', 'custom_followup_at', 'invoice_address', 'positions', 'downloads', - 'checkin_attention', 'checkin_text', 'last_modified', 'payments', 'refunds', 'require_approval', 'sales_channel', - 'url', 'customer', 'valid_if_pending', 'api_meta', 'cancellation_date', 'plugin_data', + 'payment_provider', 'fees', 'total', 'tax_rounding_mode', 'comment', 'custom_followup_at', 'invoice_address', + 'positions', 'downloads', 'checkin_attention', 'checkin_text', 'last_modified', 'payments', 'refunds', + 'require_approval', 'sales_channel', 'url', 'customer', 'valid_if_pending', 'api_meta', 'cancellation_date', + 'plugin_data', ) read_only_fields = ( 'code', 'status', 'testmode', 'secret', 'datetime', 'expires', 'payment_date', - 'payment_provider', 'fees', 'total', 'positions', 'downloads', 'customer', - 'last_modified', 'payments', 'refunds', 'require_approval', 'sales_channel', 'cancellation_date' + 'payment_provider', 'fees', 'total', 'tax_rounding_mode', 'positions', 'downloads', 'customer', + 'last_modified', 'payments', 'refunds', 'require_approval', 'sales_channel', 'cancellation_date', ) def __init__(self, *args, **kwargs): @@ -1159,6 +1179,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): queryset=SalesChannel.objects.none(), required=False, ) + tax_rounding_mode = serializers.ChoiceField(choices=ROUNDING_MODES, allow_null=True, required=False,) locale = serializers.ChoiceField(choices=[], required=False, allow_null=True) def __init__(self, *args, **kwargs): @@ -1175,7 +1196,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): fields = ('code', 'status', 'testmode', 'email', 'phone', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel', 'invoice_address', 'positions', 'checkin_attention', 'checkin_text', 'payment_info', 'payment_date', 'consume_carts', 'force', 'send_email', 'simulate', 'customer', 'custom_followup_at', - 'require_approval', 'valid_if_pending', 'expires', 'api_meta') + 'require_approval', 'valid_if_pending', 'expires', 'api_meta', 'tax_rounding_mode') def validate_payment_provider(self, pp): if pp is None: @@ -1701,7 +1722,31 @@ class OrderCreateSerializer(I18nAwareModelSerializer): else: f.save() - order.total += sum([f.value for f in fees]) + rounding_mode = validated_data.get("tax_rounding_mode") + if not rounding_mode: + if isinstance(self.context.get("auth"), Device): + # Safety fallback to avoid differences in tax reporting + brand = self.context.get("auth").software_brand or "" + if "pretixPOS" in brand or "pretixKIOSK" in brand: + rounding_mode = "line" + if not rounding_mode: + rounding_mode = self.context["event"].settings.tax_rounding + changed = apply_rounding( + rounding_mode, + self.context["event"].currency, + [*pos_map.values(), *fees] + ) + for line in changed: + if isinstance(line, OrderPosition): + line.save(update_fields=[ + "price", "price_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + elif isinstance(line, OrderFee): + line.save(update_fields=[ + "value", "value_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + + order.total = sum([c.price for c in pos_map.values()]) + sum([f.value for f in fees]) if simulate: order.fees = fees order.positions = pos_map.values() @@ -1786,7 +1831,7 @@ class InvoiceSerializer(I18nAwareModelSerializer): class Meta: model = Invoice fields = ('event', 'order', 'number', 'is_cancellation', 'invoice_from', 'invoice_from_name', 'invoice_from_zipcode', - 'invoice_from_city', 'invoice_from_country', 'invoice_from_tax_id', 'invoice_from_vat_id', + 'invoice_from_city', 'invoice_from_state', 'invoice_from_country', 'invoice_from_tax_id', 'invoice_from_vat_id', 'invoice_to', 'invoice_to_is_business', 'invoice_to_company', 'invoice_to_name', 'invoice_to_street', 'invoice_to_zipcode', 'invoice_to_city', 'invoice_to_state', 'invoice_to_country', 'invoice_to_vat_id', 'invoice_to_beneficiary', 'invoice_to_transmission_info', 'custom_field', 'date', 'refers', 'locale', diff --git a/src/pretix/api/urls.py b/src/pretix/api/urls.py index 15c654567..a4db75dfd 100644 --- a/src/pretix/api/urls.py +++ b/src/pretix/api/urls.py @@ -92,6 +92,7 @@ event_router.register(r'taxrules', event.TaxRuleViewSet) event_router.register(r'seats', event.SeatViewSet) event_router.register(r'waitinglistentries', waitinglist.WaitingListViewSet) event_router.register(r'checkinlists', checkin.CheckinListViewSet) +event_router.register(r'checkins', checkin.CheckinViewSet) event_router.register(r'cartpositions', cart.CartPositionViewSet) event_router.register(r'scheduled_exports', exporters.ScheduledEventExportViewSet) event_router.register(r'exporters', exporters.EventExportersViewSet, basename='exporters') @@ -111,6 +112,7 @@ item_router = routers.DefaultRouter() item_router.register(r'variations', item.ItemVariationViewSet) item_router.register(r'addons', item.ItemAddOnViewSet) item_router.register(r'bundles', item.ItemBundleViewSet) +item_router.register(r'program_times', item.ItemProgramTimeViewSet) order_router = routers.DefaultRouter() order_router.register(r'payments', order.PaymentViewSet) diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index 02304446d..26c0bbcae 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -56,7 +56,8 @@ from pretix.api.serializers.checkin import ( ) from pretix.api.serializers.item import QuestionSerializer from pretix.api.serializers.order import ( - CheckinListOrderPositionSerializer, FailedCheckinSerializer, + CheckinListOrderPositionSerializer, CheckinSerializer, + FailedCheckinSerializer, ) from pretix.api.views import RichOrderingFilter from pretix.api.views.order import OrderPositionFilter @@ -96,6 +97,16 @@ with scopes_disabled(): ) return queryset.filter(expr) + class CheckinFilter(FilterSet): + created_since = django_filters.IsoDateTimeFilter(field_name='created', lookup_expr='gte') + created_before = django_filters.IsoDateTimeFilter(field_name='created', lookup_expr='lt') + datetime_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte') + datetime_before = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='lt') + + class Meta: + model = Checkin + fields = ['successful', 'error_reason', 'list', 'type', 'gate', 'device', 'auto_checked_in'] + class CheckinListViewSet(viewsets.ModelViewSet): serializer_class = CheckinListSerializer @@ -1080,3 +1091,25 @@ class CheckinRPCAnnulView(views.APIView): checkin_annulled.send(ci.position.order.event, checkin=ci) return Response({"status": "ok"}, status=status.HTTP_200_OK) + + +class CheckinViewSet(viewsets.ReadOnlyModelViewSet): + serializer_class = CheckinSerializer + queryset = Checkin.all.none() + filter_backends = (DjangoFilterBackend, RichOrderingFilter) + filterset_class = CheckinFilter + ordering = ('created', 'id') + ordering_fields = ('created', 'datetime', 'id',) + permission = 'can_view_orders' + + def get_queryset(self): + qs = Checkin.all.filter().select_related( + "position", + "device", + ) + return qs + + def get_serializer_context(self): + ctx = super().get_serializer_context() + ctx['event'] = self.request.event + return ctx diff --git a/src/pretix/api/views/item.py b/src/pretix/api/views/item.py index 19661c60e..443a5157f 100644 --- a/src/pretix/api/views/item.py +++ b/src/pretix/api/views/item.py @@ -40,19 +40,19 @@ from django_filters.rest_framework import DjangoFilterBackend, FilterSet from django_scopes import scopes_disabled from rest_framework import viewsets from rest_framework.decorators import action -from rest_framework.exceptions import PermissionDenied +from rest_framework.exceptions import PermissionDenied, ValidationError from rest_framework.response import Response from pretix.api.pagination import TotalOrderingFilter from pretix.api.serializers.item import ( ItemAddOnSerializer, ItemBundleSerializer, ItemCategorySerializer, - ItemSerializer, ItemVariationSerializer, QuestionOptionSerializer, - QuestionSerializer, QuotaSerializer, + ItemProgramTimeSerializer, ItemSerializer, ItemVariationSerializer, + QuestionOptionSerializer, QuestionSerializer, QuotaSerializer, ) from pretix.api.views import ConditionalListView from pretix.base.models import ( - CartPosition, Item, ItemAddOn, ItemBundle, ItemCategory, ItemVariation, - Question, QuestionOption, Quota, + CartPosition, Item, ItemAddOn, ItemBundle, ItemCategory, ItemProgramTime, + ItemVariation, Question, QuestionOption, Quota, ) from pretix.base.services.quotas import QuotaAvailability from pretix.helpers.dicts import merge_dicts @@ -279,6 +279,59 @@ class ItemBundleViewSet(viewsets.ModelViewSet): ) +class ItemProgramTimeViewSet(viewsets.ModelViewSet): + serializer_class = ItemProgramTimeSerializer + queryset = ItemProgramTime.objects.none() + filter_backends = (DjangoFilterBackend, TotalOrderingFilter,) + ordering_fields = ('id',) + ordering = ('id',) + permission = None + write_permission = 'can_change_items' + + @cached_property + def item(self): + return get_object_or_404(Item, pk=self.kwargs['item'], event=self.request.event) + + def get_queryset(self): + if self.request.event.has_subevents: + raise ValidationError('You cannot use program times on an event series.') + return self.item.program_times.all() + + def get_serializer_context(self): + ctx = super().get_serializer_context() + ctx['event'] = self.request.event + ctx['item'] = self.item + return ctx + + def perform_create(self, serializer): + item = get_object_or_404(Item, pk=self.kwargs['item'], event=self.request.event) + serializer.save(item=item) + item.log_action( + 'pretix.event.item.program_times.added', + user=self.request.user, + auth=self.request.auth, + data=merge_dicts(self.request.data, {'id': serializer.instance.pk}) + ) + + def perform_update(self, serializer): + serializer.save(event=self.request.event) + serializer.instance.item.log_action( + 'pretix.event.item.program_times.changed', + user=self.request.user, + auth=self.request.auth, + data=merge_dicts(self.request.data, {'id': serializer.instance.pk}) + ) + + def perform_destroy(self, instance): + super().perform_destroy(instance) + instance.item.log_action( + 'pretix.event.item.program_times.removed', + user=self.request.user, + auth=self.request.auth, + data={'start': instance.start, 'end': instance.end} + ) + + class ItemAddOnViewSet(viewsets.ModelViewSet): serializer_class = ItemAddOnSerializer queryset = ItemAddOn.objects.none() diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index f818192ae..51d463047 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -344,6 +344,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet): def get_serializer_context(self): ctx = super().get_serializer_context() ctx['event'] = self.request.event + ctx['auth'] = self.request.auth ctx['pdf_data'] = self.request.query_params.get('pdf_data', 'false').lower() == 'true' return ctx diff --git a/src/pretix/base/customersso/oidc.py b/src/pretix/base/customersso/oidc.py index b093c0125..638f0be2a 100644 --- a/src/pretix/base/customersso/oidc.py +++ b/src/pretix/base/customersso/oidc.py @@ -112,23 +112,6 @@ def oidc_validate_and_complete_config(config): scope="openid", )) - for scope in config["scope"].split(" "): - if scope not in provider_config.get("scopes_supported", []): - raise ValidationError(_('You are requesting scope "{scope}" but provider only supports these: {scopes}.').format( - scope=scope, - scopes=", ".join(provider_config.get("scopes_supported", [])) - )) - - if "claims_supported" in provider_config: - claims_supported = provider_config.get("claims_supported", []) - for k, v in config.items(): - if k.endswith('_field') and v: - if v not in claims_supported: # https://openid.net/specs/openid-connect-core-1_0.html#UserInfo - raise ValidationError(_('You are requesting field "{field}" but provider only supports these: {fields}.').format( - field=v, - fields=", ".join(provider_config.get("claims_supported", [])) - )) - if "token_endpoint_auth_methods_supported" in provider_config: token_endpoint_auth_methods_supported = provider_config.get("token_endpoint_auth_methods_supported", ["client_secret_basic"]) diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index e1efce0b0..ab71fb45f 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -24,6 +24,7 @@ from itertools import groupby from smtplib import SMTPResponseException from typing import TypeVar +import bleach import css_inline from django.conf import settings from django.core.mail.backends.smtp import EmailBackend @@ -34,7 +35,10 @@ from django.utils.translation import get_language, gettext_lazy as _ from pretix.base.models import Event from pretix.base.signals import register_html_mail_renderers -from pretix.base.templatetags.rich_text import markdown_compile_email +from pretix.base.templatetags.rich_text import ( + DEFAULT_CALLBACKS, EMAIL_RE, URL_RE, abslink_callback, + markdown_compile_email, truelink_callback, +) from pretix.helpers.format import SafeFormatter, format_map from pretix.base.services.placeholders import ( # noqa @@ -133,13 +137,24 @@ class TemplateBasedMailRenderer(BaseHTMLMailRenderer): def template_name(self): raise NotImplementedError() - def compile_markdown(self, plaintext): - return markdown_compile_email(plaintext) + def compile_markdown(self, plaintext, context=None): + return markdown_compile_email(plaintext, context=context) def render(self, plain_body: str, plain_signature: str, subject: str, order, position, context) -> str: - body_md = self.compile_markdown(plain_body) + body_md = self.compile_markdown(plain_body, context) if context: - body_md = format_map(body_md, context=context, mode=SafeFormatter.MODE_RICH_TO_HTML) + linker = bleach.Linker( + url_re=URL_RE, + email_re=EMAIL_RE, + callbacks=DEFAULT_CALLBACKS + [truelink_callback, abslink_callback], + parse_email=True + ) + body_md = format_map( + body_md, + context=context, + mode=SafeFormatter.MODE_RICH_TO_HTML, + linkifier=linker + ) htmlctx = { 'site': settings.PRETIX_INSTANCE_NAME, 'site_url': settings.SITE_URL, diff --git a/src/pretix/base/exporters/invoices.py b/src/pretix/base/exporters/invoices.py index 8aa3dba22..630a15b77 100644 --- a/src/pretix/base/exporters/invoices.py +++ b/src/pretix/base/exporters/invoices.py @@ -209,6 +209,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter): _('Invoice sender:') + ' ' + _('Address'), _('Invoice sender:') + ' ' + _('ZIP code'), _('Invoice sender:') + ' ' + _('City'), + _('Invoice sender:') + ' ' + pgettext('address', 'State'), _('Invoice sender:') + ' ' + _('Country'), _('Invoice sender:') + ' ' + _('Tax ID'), _('Invoice sender:') + ' ' + _('VAT ID'), @@ -291,6 +292,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter): i.invoice_from, i.invoice_from_zipcode, i.invoice_from_city, + i.invoice_from_state, i.invoice_from_country, i.invoice_from_tax_id, i.invoice_from_vat_id, diff --git a/src/pretix/base/exporters/items.py b/src/pretix/base/exporters/items.py index fba449768..ba586143b 100644 --- a/src/pretix/base/exporters/items.py +++ b/src/pretix/base/exporters/items.py @@ -149,7 +149,7 @@ class ItemDataExporter(ListExporter): row += [ _("Yes") if i.active and v.active else "", ", ".join([str(sn.label) for sn in sales_channels]), - v.default_price or i.default_price, + v.default_price if v.default_price is not None else i.default_price, _("Yes") if i.free_price else "", str(i.tax_rule) if i.tax_rule else "", _("Yes") if i.admission else "", diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index 3d716899c..c0756ca8a 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -610,7 +610,7 @@ class OrderListExporter(MultiSheetListExporter): headers.append(_('Attendee name') + ': ' + str(label)) headers += [ _('Attendee email'), - _('Company'), + _('Attendee company'), _('Address'), _('ZIP code'), _('City'), @@ -650,7 +650,7 @@ class OrderListExporter(MultiSheetListExporter): options[q.pk].append(o) headers.append(str(q.question)) headers += [ - _('Company'), + _('Invoice address company'), _('Invoice address name'), ] if name_scheme and len(name_scheme['fields']) > 1: diff --git a/src/pretix/base/forms/auth.py b/src/pretix/base/forms/auth.py index dd44bb9a6..79e5a0e7c 100644 --- a/src/pretix/base/forms/auth.py +++ b/src/pretix/base/forms/auth.py @@ -214,21 +214,38 @@ class PasswordRecoverForm(forms.Form): error_messages = { 'pw_mismatch': _("Please enter the same password twice"), } + email = forms.EmailField( + max_length=255, + disabled=True, + label=_("Your email address"), + widget=forms.EmailInput( + attrs={'autocomplete': 'username'}, + ), + ) password = forms.CharField( label=_('Password'), - widget=forms.PasswordInput, + widget=forms.PasswordInput(attrs={ + 'autocomplete': 'new-password', + }), max_length=4096, required=True ) password_repeat = forms.CharField( label=_('Repeat password'), - widget=forms.PasswordInput, + widget=forms.PasswordInput(attrs={ + 'autocomplete': 'new-password', + }), max_length=4096, ) def __init__(self, user_id=None, *args, **kwargs): - self.user_id = user_id - super().__init__(*args, **kwargs) + initial = kwargs.pop('initial', {}) + try: + self.user = User.objects.get(id=user_id) + initial['email'] = self.user.email + except User.DoesNotExist: + self.user = None + super().__init__(*args, initial=initial, **kwargs) def clean(self): password1 = self.cleaned_data.get('password', '') @@ -243,11 +260,7 @@ class PasswordRecoverForm(forms.Form): def clean_password(self): password1 = self.cleaned_data.get('password', '') - try: - user = User.objects.get(id=self.user_id) - except User.DoesNotExist: - user = None - if validate_password(password1, user=user) is not None: + if validate_password(password1, user=self.user) is not None: raise forms.ValidationError(_(password_validators_help_texts()), code='pw_invalid') return password1 @@ -307,3 +320,10 @@ class ReauthForm(forms.Form): self.error_messages['inactive'], code='inactive', ) + + +class ConfirmationCodeForm(forms.Form): + code = forms.IntegerField( + label=_('Confirmation code'), + widget=forms.NumberInput(attrs={'class': 'confirmation-code-input', 'inputmode': 'numeric', 'type': 'text'}), + ) diff --git a/src/pretix/base/forms/user.py b/src/pretix/base/forms/user.py index 10a904322..773f95220 100644 --- a/src/pretix/base/forms/user.py +++ b/src/pretix/base/forms/user.py @@ -39,37 +39,16 @@ from django.contrib.auth.password_validation import ( password_validators_help_texts, validate_password, ) from django.db.models import Q +from django.urls.base import reverse from django.utils.translation import gettext_lazy as _ from pytz import common_timezones from pretix.base.models import User from pretix.control.forms import SingleLanguageWidget +from pretix.helpers.format import format_map class UserSettingsForm(forms.ModelForm): - error_messages = { - 'duplicate_identifier': _("There already is an account associated with this email address. " - "Please choose a different one."), - 'pw_current': _("Please enter your current password if you want to change your email address " - "or password."), - 'pw_current_wrong': _("The current password you entered was not correct."), - 'pw_mismatch': _("Please enter the same password twice"), - 'rate_limit': _("For security reasons, please wait 5 minutes before you try again."), - 'pw_equal': _("Please choose a password different to your current one.") - } - - old_pw = forms.CharField(max_length=255, - required=False, - label=_("Your current password"), - widget=forms.PasswordInput()) - new_pw = forms.CharField(max_length=255, - required=False, - label=_("New password"), - widget=forms.PasswordInput()) - new_pw_repeat = forms.CharField(max_length=255, - required=False, - label=_("Repeat new password"), - widget=forms.PasswordInput()) timezone = forms.ChoiceField( choices=((a, a) for a in common_timezones), label=_("Default timezone"), @@ -93,16 +72,63 @@ class UserSettingsForm(forms.ModelForm): self.user = kwargs.pop('user') super().__init__(*args, **kwargs) self.fields['email'].required = True - if self.user.auth_backend != 'native': - del self.fields['old_pw'] - del self.fields['new_pw'] - del self.fields['new_pw_repeat'] - self.fields['email'].disabled = True + self.fields['email'].disabled = True + self.fields['email'].help_text = format_map(' {text}', { + 'text': _("Change email address"), + 'link': reverse('control:user.settings.email.change') + }) + + +class User2FADeviceAddForm(forms.Form): + name = forms.CharField(label=_('Device name'), max_length=64) + devicetype = forms.ChoiceField(label=_('Device type'), widget=forms.RadioSelect, choices=( + ('totp', _('Smartphone with the Authenticator application')), + ('webauthn', _('WebAuthn-compatible hardware token (e.g. Yubikey)')), + )) + + +class UserPasswordChangeForm(forms.Form): + error_messages = { + 'pw_current_wrong': _("The current password you entered was not correct."), + 'pw_mismatch': _("Please enter the same password twice"), + 'rate_limit': _("For security reasons, please wait 5 minutes before you try again."), + 'pw_equal': _("Please choose a password different to your current one.") + } + email = forms.EmailField(max_length=255, + disabled=True, + label=_("Your email address"), + widget=forms.EmailInput( + attrs={'autocomplete': 'username'}, + )) + old_pw = forms.CharField(max_length=255, + required=True, + label=_("Your current password"), + widget=forms.PasswordInput( + attrs={'autocomplete': 'current-password'}, + )) + new_pw = forms.CharField(max_length=255, + required=True, + label=_("New password"), + widget=forms.PasswordInput( + attrs={'autocomplete': 'new-password'}, + )) + new_pw_repeat = forms.CharField(max_length=255, + required=True, + label=_("Repeat new password"), + widget=forms.PasswordInput( + attrs={'autocomplete': 'new-password'}, + )) + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') + initial = kwargs.pop('initial', {}) + initial['email'] = self.user.email + super().__init__(*args, initial=initial, **kwargs) def clean_old_pw(self): old_pw = self.cleaned_data.get('old_pw') - if old_pw and settings.HAS_REDIS: + if settings.HAS_REDIS: from django_redis import get_redis_connection rc = get_redis_connection("redis") cnt = rc.incr('pretix_pwchange_%s' % self.user.pk) @@ -113,7 +139,7 @@ class UserSettingsForm(forms.ModelForm): code='rate_limit', ) - if old_pw and not check_password(old_pw, self.user.password): + if not check_password(old_pw, self.user.password): raise forms.ValidationError( self.error_messages['pw_current_wrong'], code='pw_current_wrong', @@ -121,59 +147,47 @@ class UserSettingsForm(forms.ModelForm): return old_pw - def clean_email(self): - email = self.cleaned_data['email'] - if User.objects.filter(Q(email__iexact=email) & ~Q(pk=self.instance.pk)).exists(): - raise forms.ValidationError( - self.error_messages['duplicate_identifier'], - code='duplicate_identifier', - ) - return email - def clean_new_pw(self): password1 = self.cleaned_data.get('new_pw', '') - if password1 and validate_password(password1, user=self.user) is not None: + if validate_password(password1, user=self.user) is not None: raise forms.ValidationError( _(password_validators_help_texts()), code='pw_invalid' ) + if self.user.check_password(password1): + raise forms.ValidationError( + self.error_messages['pw_equal'], + code='pw_equal', + ) return password1 def clean_new_pw_repeat(self): password1 = self.cleaned_data.get('new_pw') password2 = self.cleaned_data.get('new_pw_repeat') - if password1 and password1 != password2: + if password1 != password2: raise forms.ValidationError( self.error_messages['pw_mismatch'], code='pw_mismatch' ) - def clean(self): - password1 = self.cleaned_data.get('new_pw') - email = self.cleaned_data.get('email') - old_pw = self.cleaned_data.get('old_pw') - if (password1 or email != self.user.email) and not old_pw: +class UserEmailChangeForm(forms.Form): + error_messages = { + 'duplicate_identifier': _("There already is an account associated with this email address. " + "Please choose a different one."), + } + old_email = forms.EmailField(label=_('Old email address'), disabled=True) + new_email = forms.EmailField(label=_('New email address')) + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') + super().__init__(*args, **kwargs) + + def clean_new_email(self): + email = self.cleaned_data['new_email'] + if User.objects.filter(Q(email__iexact=email) & ~Q(pk=self.user.pk)).exists(): raise forms.ValidationError( - self.error_messages['pw_current'], - code='pw_current' + self.error_messages['duplicate_identifier'], + code='duplicate_identifier', ) - - if password1 and password1 == old_pw: - raise forms.ValidationError( - self.error_messages['pw_equal'], - code='pw_equal' - ) - - if password1: - self.instance.set_password(password1) - - return self.cleaned_data - - -class User2FADeviceAddForm(forms.Form): - name = forms.CharField(label=_('Device name'), max_length=64) - devicetype = forms.ChoiceField(label=_('Device type'), widget=forms.RadioSelect, choices=( - ('totp', _('Smartphone with the Authenticator application')), - ('webauthn', _('WebAuthn-compatible hardware token (e.g. Yubikey)')), - )) + return email diff --git a/src/pretix/base/invoicing/pdf.py b/src/pretix/base/invoicing/pdf.py index 2f2f36ed5..a97d71374 100644 --- a/src/pretix/base/invoicing/pdf.py +++ b/src/pretix/base/invoicing/pdf.py @@ -23,6 +23,7 @@ import datetime import logging import math import re +import textwrap import unicodedata from collections import defaultdict from decimal import Decimal @@ -752,11 +753,59 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): return dt.astimezone(tz).date() total = Decimal('0.00') + if has_taxes: + colwidths = [a * doc.width for a in (.50, .05, .15, .15, .15)] + else: + colwidths = [a * doc.width for a in (.65, .20, .15)] + for (description, tax_rate, tax_name, net_value, gross_value, subevent, period_start, period_end), lines in addon_aware_groupby( all_lines, key=_group_key, is_addon=lambda l: l.description.startswith(" +"), ): + # split description into multiple Paragraphs so each fits in a table cell on a single page + # otherwise PDF-build fails + + description_p_list = [] + # normalize linebreaks to newlines instead of HTML so we can safely substring + description = description.replace('
', '
').replace('
\n', '\n').replace('
', '\n') + + # start first line with different settings than the rest of the description + curr_description = description.split("\n", maxsplit=1)[0] + cellpadding = 6 # default cellpadding is only set on right side of column + max_width = colwidths[0] - cellpadding + max_height = self.stylesheet['Normal'].leading * 5 + p_style = self.stylesheet['Normal'] + for __ in range(1000): + p = FontFallbackParagraph( + self._clean_text(curr_description, tags=['br']), + p_style + ) + h = p.wrap(max_width, doc.height)[1] + if h <= max_height: + description_p_list.append(p) + if curr_description == description: + break + description = description[len(curr_description):].lstrip() + curr_description = description.split("\n", maxsplit=1)[0] + # use different settings for all except first line + max_width = sum(colwidths[0:3 if has_taxes else 2]) - cellpadding + max_height = self.stylesheet['Fineprint'].leading * 8 + p_style = self.stylesheet['Fineprint'] + continue + + if not description_p_list: + # first "manual" line is larger than 5 "real" lines => only allow one line and set rest in Fineprint + max_height = self.stylesheet['Normal'].leading + + if h > max_height * 1.1: + # quickly bring the text-length down to a managable length to then stepwise reduce + wrap_to = math.ceil(len(curr_description) * max_height * 1.1 / h) + else: + # trim to 95% length, but at most 10 chars to not have strangely short lines in the middle of a paragraph + wrap_to = max(len(curr_description) - 10, math.ceil(len(curr_description) * 0.95)) + curr_description = textwrap.wrap(curr_description, wrap_to, replace_whitespace=False, drop_whitespace=False)[0] + # Try to be clever and figure out when organizers would want to show the period. This heuristic is # not perfect and the only "fully correct" way would be to include the period on every line always, # however this will cause confusion (a) due to useless repetition of the same date all over the invoice @@ -810,7 +859,10 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): # Group together at the end of the invoice request_show_service_date = period_line elif period_line: - description += "\n" + period_line + description_p_list.append(FontFallbackParagraph( + period_line, + self.stylesheet['Fineprint'] + )) lines = list(lines) if has_taxes: @@ -819,13 +871,13 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): net_price=money_filter(net_value, self.invoice.event.currency), gross_price=money_filter(gross_value, self.invoice.event.currency), ) - description = description + "\n" + single_price_line + description_p_list.append(FontFallbackParagraph( + single_price_line, + self.stylesheet['Fineprint'] + )) tdata.append(( - FontFallbackParagraph( - self._clean_text(description, tags=['br']), - self.stylesheet['Normal'] - ), + description_p_list.pop(0), str(len(lines)), localize(tax_rate) + " %", FontFallbackParagraph( @@ -837,23 +889,52 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): self.stylesheet['NormalRight'] ), )) + for p in description_p_list: + tdata.append((p, "", "", "", "")) + tstyledata.append(( + 'SPAN', + (0, len(tdata) - 1), + (2, len(tdata) - 1), + )) else: if len(lines) > 1: single_price_line = pgettext('invoice', 'Single price: {price}').format( price=money_filter(gross_value, self.invoice.event.currency), ) - description = description + "\n" + single_price_line + description_p_list.append(FontFallbackParagraph( + single_price_line, + self.stylesheet['Fineprint'] + )) tdata.append(( - FontFallbackParagraph( - self._clean_text(description, tags=['br']), - self.stylesheet['Normal'] - ), + description_p_list.pop(0), str(len(lines)), FontFallbackParagraph( money_filter(gross_value * len(lines), self.invoice.event.currency).replace('\xa0', ' '), self.stylesheet['NormalRight'] ), )) + for p in description_p_list: + tdata.append((p, "", "")) + tstyledata.append(( + 'SPAN', + (0, len(tdata) - 1), + (1, len(tdata) - 1), + )) + + tstyledata += [ + ( + 'BOTTOMPADDING', + (0, len(tdata) - len(description_p_list)), + (-1, len(tdata) - 2), + 0 + ), + ( + 'TOPPADDING', + (0, len(tdata) - len(description_p_list)), + (-1, len(tdata) - 1), + 0 + ), + ] taxvalue_map[tax_rate, tax_name] += (gross_value - net_value) * len(lines) grossvalue_map[tax_rate, tax_name] += gross_value * len(lines) total += gross_value * len(lines) @@ -863,13 +944,11 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', '', '', money_filter(total, self.invoice.event.currency) ]) - colwidths = [a * doc.width for a in (.50, .05, .15, .15, .15)] else: tdata.append([ FontFallbackParagraph(self._normalize(pgettext('invoice', 'Invoice total')), self.stylesheet['Bold']), '', money_filter(total, self.invoice.event.currency) ]) - colwidths = [a * doc.width for a in (.65, .20, .15)] if not self.invoice.is_cancellation: if self.invoice.event.settings.invoice_show_payments and self.invoice.order.status == Order.STATUS_PENDING: diff --git a/src/pretix/base/migrations/0293_cartposition_price_includes_rounding_correction_and_more.py b/src/pretix/base/migrations/0293_cartposition_price_includes_rounding_correction_and_more.py new file mode 100644 index 000000000..548e84225 --- /dev/null +++ b/src/pretix/base/migrations/0293_cartposition_price_includes_rounding_correction_and_more.py @@ -0,0 +1,81 @@ +# Generated by Django 4.2.17 on 2025-04-20 13:58 + +from decimal import Decimal + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0292_giftcard_customer"), + ] + + operations = [ + migrations.AddField( + model_name="cartposition", + name="price_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="cartposition", + name="tax_code", + field=models.CharField(max_length=190, null=True), + ), + migrations.AddField( + model_name="cartposition", + name="tax_value_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="orderfee", + name="tax_value_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="orderfee", + name="value_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="orderposition", + name="price_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="orderposition", + name="tax_value_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="transaction", + name="price_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="transaction", + name="tax_value_includes_rounding_correction", + field=models.DecimalField( + decimal_places=2, default=Decimal("0.00"), max_digits=13 + ), + ), + migrations.AddField( + model_name="order", + name="tax_rounding_mode", + field=models.CharField(default="line", max_length=100), + ), + ] diff --git a/src/pretix/base/migrations/0294_item_program_time.py b/src/pretix/base/migrations/0294_item_program_time.py new file mode 100644 index 000000000..4a53b9f0f --- /dev/null +++ b/src/pretix/base/migrations/0294_item_program_time.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.19 on 2025-08-11 10:25 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0293_cartposition_price_includes_rounding_correction_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='ItemProgramTime', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('start', models.DateTimeField()), + ('end', models.DateTimeField()), + ('item', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='program_times', + to='pretixbase.item')), + ], + ), + ] diff --git a/src/pretix/base/migrations/0295_user_is_verified.py b/src/pretix/base/migrations/0295_user_is_verified.py new file mode 100644 index 000000000..2a6a5d59e --- /dev/null +++ b/src/pretix/base/migrations/0295_user_is_verified.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-09-04 16:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0294_item_program_time"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="is_verified", + field=models.BooleanField(default=False), + ), + ] diff --git a/src/pretix/base/migrations/0296_invoice_invoice_from_state.py b/src/pretix/base/migrations/0296_invoice_invoice_from_state.py new file mode 100644 index 000000000..9b7ae9e77 --- /dev/null +++ b/src/pretix/base/migrations/0296_invoice_invoice_from_state.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.24 on 2025-11-10 16:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0295_user_is_verified"), + ] + + operations = [ + migrations.AddField( + model_name="invoice", + name="invoice_from_state", + field=models.CharField(max_length=190, null=True), + ), + ] diff --git a/src/pretix/base/models/__init__.py b/src/pretix/base/models/__init__.py index 944737501..372fc8287 100644 --- a/src/pretix/base/models/__init__.py +++ b/src/pretix/base/models/__init__.py @@ -36,8 +36,9 @@ from .giftcards import GiftCard, GiftCardAcceptance, GiftCardTransaction from .invoices import Invoice, InvoiceLine, invoice_filename from .items import ( Item, ItemAddOn, ItemBundle, ItemCategory, ItemMetaProperty, ItemMetaValue, - ItemVariation, ItemVariationMetaValue, Question, QuestionOption, Quota, - SubEventItem, SubEventItemVariation, itempicture_upload_to, + ItemProgramTime, ItemVariation, ItemVariationMetaValue, Question, + QuestionOption, Quota, SubEventItem, SubEventItemVariation, + itempicture_upload_to, ) from .log import LogEntry from .media import ReusableMedium diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index 31871dadb..347f4d271 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -35,6 +35,7 @@ import binascii import json import operator +import secrets from datetime import timedelta from functools import reduce @@ -44,6 +45,7 @@ from django.contrib.auth.models import ( ) from django.contrib.auth.tokens import default_token_generator from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import BadRequest, PermissionDenied from django.db import IntegrityError, models, transaction from django.db.models import Q from django.utils.crypto import get_random_string, salted_hmac @@ -239,9 +241,11 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] + MAX_CONFIRMATION_CODE_ATTEMPTS = 10 email = models.EmailField(unique=True, db_index=True, null=True, blank=True, verbose_name=_('Email'), max_length=190) + is_verified = models.BooleanField(default=False, verbose_name=_('Verified email address')) fullname = models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Full name')) is_active = models.BooleanField(default=True, @@ -353,6 +357,77 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): except SendMailException: pass # Already logged + def send_confirmation_code(self, session, reason, email=None, state=None): + """ + Sends a confirmation code via email to the user. The code is only valid for the action specified by `reason`. + The email is either sent to the email address currently on file for the user, or to the one given in the optional `email` parameter. + A `state` value can be provided which is bound to this confirmation code, and returned on successfully checking the code. + :param session: the user's request session + :param reason: the action which should be confirmed using this confirmation code (currently, only `email_change` is allowed) + :param email: optional, the email address to send the confirmation code to + :param state: optional + """ + from pretix.base.services.mail import mail + + with language(self.locale): + if reason == 'email_change': + msg = str(_('to confirm changing your email address from {old_email}\nto {new_email}, use the following code:').format( + old_email=self.email, new_email=email, + )) + elif reason == 'email_verify': + msg = str(_('to confirm that your email address {email} belongs to your pretix account, use the following code:').format( + email=self.email, + )) + else: + raise Exception('Invalid confirmation code reason') + + code = "%07d" % secrets.SystemRandom().randint(0, 9999999) + session['user_confirmation_code:' + reason] = { + 'code': code, + 'state': state, + 'attempts': 0, + } + mail( + email or self.email, + _('pretix confirmation code'), + 'pretixcontrol/email/confirmation_code.txt', + { + 'user': self, + 'reason': msg, + 'code': code, + }, + event=None, + user=self, + locale=self.locale + ) + + def check_confirmation_code(self, session, reason, code): + """ + Checks a confirmation code entered by the user against the valid code stored in the session. + If the code is correct, an optional state bound to the code is returned. + If the code is incorrect, PermissionDenied is raised. If the code could not be validated, either because no + code for the given reason is stored, or the number of input attempts is exceeded, BadRequest is raised. + + :param session: the user's request session + :param reason: the action which should be confirmed using this confirmation code + :param code: the code entered by the user + :return: optional state bound to this code using the state parameter of send_confirmation_code, None otherwise + """ + stored = session.get('user_confirmation_code:' + reason) + if not stored: + raise BadRequest + + if stored['attempts'] > User.MAX_CONFIRMATION_CODE_ATTEMPTS: + raise BadRequest + + if int(stored['code']) == int(code): + del session['user_confirmation_code:' + reason] + return stored['state'] + else: + stored['attempts'] += 1 + session['user_confirmation_code:' + reason] = stored + raise PermissionDenied + def send_password_reset(self): from pretix.base.services.mail import mail diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index c96ee870d..dfe1616cb 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -847,7 +847,7 @@ class Event(EventMixin, LoggedModel): from ..signals import event_copy_data from . import ( Discount, Item, ItemAddOn, ItemBundle, ItemCategory, ItemMetaValue, - ItemVariationMetaValue, Question, Quota, + ItemProgramTime, ItemVariationMetaValue, Question, Quota, ) # Note: avoid self.set_active_plugins(), it causes trouble e.g. for the badges plugin. @@ -990,6 +990,12 @@ class Event(EventMixin, LoggedModel): ia.bundled_variation = variation_map[ia.bundled_variation.pk] ia.save(force_insert=True) + if not self.has_subevents and not other.has_subevents: + for ipt in ItemProgramTime.objects.filter(item__event=other).prefetch_related('item'): + ipt.pk = None + ipt.item = item_map[ipt.item.pk] + ipt.save(force_insert=True) + quota_map = {} for q in Quota.objects.filter(event=other, subevent__isnull=True).prefetch_related('items', 'variations'): quota_map[q.pk] = q diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index 602e062d8..e4e9eaa6c 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -142,6 +142,7 @@ class Invoice(models.Model): invoice_from_name = models.CharField(max_length=190, null=True) invoice_from_zipcode = models.CharField(max_length=190, null=True) invoice_from_city = models.CharField(max_length=190, null=True) + invoice_from_state = models.CharField(max_length=190, null=True) invoice_from_country = FastCountryField(null=True) invoice_from_tax_id = models.CharField(max_length=190, null=True) invoice_from_vat_id = models.CharField(max_length=190, null=True) @@ -218,10 +219,23 @@ class Invoice(models.Model): taxidrow = "ABN: %s" % self.invoice_from_tax_id else: taxidrow = pgettext("invoice", "Tax ID: %s") % self.invoice_from_tax_id + + state_name = "" + if self.invoice_from_state: + state_name = self.invoice_from_state + if str(self.invoice_from_country) in COUNTRIES_WITH_STATE_IN_ADDRESS: + if COUNTRIES_WITH_STATE_IN_ADDRESS[str(self.invoice_from_country)][1] == 'long': + try: + state_name = pycountry.subdivisions.get( + code='{}-{}'.format(self.invoice_from_country, self.invoice_from_state) + ).name + except: + pass + parts = [ self.invoice_from_name, self.invoice_from, - (self.invoice_from_zipcode or "") + " " + (self.invoice_from_city or ""), + ((self.invoice_from_zipcode or "") + " " + (self.invoice_from_city or "") + " " + (state_name or "")).strip(), self.invoice_from_country.name if self.invoice_from_country else "", pgettext("invoice", "VAT-ID: %s") % self.invoice_from_vat_id if self.invoice_from_vat_id else "", taxidrow, @@ -230,10 +244,22 @@ class Invoice(models.Model): @property def address_invoice_from(self): + state_name = "" + if self.invoice_from_state: + state_name = self.invoice_from_state + if str(self.invoice_from_country) in COUNTRIES_WITH_STATE_IN_ADDRESS: + if COUNTRIES_WITH_STATE_IN_ADDRESS[str(self.invoice_from_country)][1] == 'long': + try: + state_name = pycountry.subdivisions.get( + code='{}-{}'.format(self.invoice_from_country, self.invoice_from_state) + ).name + except: + pass + parts = [ self.invoice_from_name, self.invoice_from, - (self.invoice_from_zipcode or "") + " " + (self.invoice_from_city or ""), + " ".join(s for s in [self.invoice_from_zipcode, self.invoice_from_city, state_name] if s), self.invoice_from_country.name if self.invoice_from_country else "", ] return '\n'.join([p.strip() for p in parts if p and p.strip()]) diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 7e42f2cb7..d307ba9c7 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -505,8 +505,7 @@ class Item(LoggedModel): verbose_name=_("Free price input"), help_text=_("If this option is active, your users can choose the price themselves. The price configured above " "is then interpreted as the minimum price a user has to enter. You could use this e.g. to collect " - "additional donations for your event. This is currently not supported for products that are " - "bought as an add-on to other products.") + "additional donations for your event.") ) free_price_suggestion = models.DecimalField( verbose_name=_("Suggested price"), @@ -2294,3 +2293,29 @@ class ItemVariationMetaValue(LoggedModel): class Meta: unique_together = ('variation', 'property') + + +class ItemProgramTime(models.Model): + """ + This model can be used to add a program time to an item. + + :param item: The item the program time applies to + :type item: Item + :param start: The date and time this program time starts + :type start: datetime + :param end: The date and time this program time ends + :type end: datetime + """ + item = models.ForeignKey('Item', related_name='program_times', on_delete=models.CASCADE) + start = models.DateTimeField(verbose_name=_("Start")) + end = models.DateTimeField(verbose_name=_("End")) + + def clean(self): + if hasattr(self, 'item') and self.item and self.item.event.has_subevents: + raise ValidationError(_("You cannot use program times on an event series.")) + self.clean_start_end(start=self.start, end=self.end) + super().clean() + + def clean_start_end(self, start: datetime = None, end: datetime = None): + if start and end and start > end: + raise ValidationError(_("The program end must not be before the program start.")) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index adcb69bcc..f8201f071 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -81,7 +81,7 @@ from pretix.base.email import get_email_context from pretix.base.i18n import language from pretix.base.models import Customer, User from pretix.base.reldate import RelativeDateWrapper -from pretix.base.settings import PERSON_NAME_SCHEMES +from pretix.base.settings import PERSON_NAME_SCHEMES, ROUNDING_MODES from pretix.base.signals import allow_ticket_download, order_gracefully_delete from pretix.base.timemachine import time_machine_now @@ -324,6 +324,11 @@ class Order(LockModel, LoggedModel): # Invoice needs to be re-issued when the order is paid again default=False, ) + tax_rounding_mode = models.CharField( + max_length=100, + choices=ROUNDING_MODES, + default="line", + ) objects = ScopedManager(OrderQuerySet.as_manager().__class__, organizer='event__organizer') @@ -1259,7 +1264,8 @@ class Order(LockModel, LoggedModel): keys = set(target_transaction_count.keys()) | set(current_transaction_count.keys()) create = [] for k in keys: - positionid, itemid, variationid, subeventid, price, taxrate, taxruleid, taxvalue, feetype, internaltype, taxcode = k + (positionid, itemid, variationid, subeventid, price, price_includes_rounding_correction, taxrate, + taxruleid, taxvalue, taxvalue_includes_rounding_correction, feetype, internaltype, taxcode) = k d = target_transaction_count[k] - current_transaction_count[k] if d: create.append(Transaction( @@ -1272,9 +1278,11 @@ class Order(LockModel, LoggedModel): variation_id=variationid, subevent_id=subeventid, price=price, + price_includes_rounding_correction=price_includes_rounding_correction, tax_rate=taxrate, tax_rule_id=taxruleid, tax_value=taxvalue, + tax_value_includes_rounding_correction=taxvalue_includes_rounding_correction, tax_code=taxcode, fee_type=feetype, internal_type=internaltype, @@ -1449,7 +1457,22 @@ class QuestionAnswer(models.Model): super().delete(**kwargs) -class AbstractPosition(models.Model): +class RoundingCorrectionMixin: + + @property + def gross_price_before_rounding(self): + return self.price - self.price_includes_rounding_correction + + @property + def tax_value_before_rounding(self): + return self.tax_value - self.tax_value_includes_rounding_correction + + @property + def net_price_before_rounding(self): + return self.gross_price_before_rounding - self.tax_value_before_rounding + + +class AbstractPosition(RoundingCorrectionMixin, models.Model): """ A position can either be one line of an order or an item placed in a cart. @@ -1499,6 +1522,9 @@ class AbstractPosition(models.Model): decimal_places=2, max_digits=13, verbose_name=_("Price") ) + price_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) attendee_name_cached = models.CharField( max_length=255, verbose_name=_("Attendee name"), @@ -2272,7 +2298,7 @@ class ActivePositionManager(ScopedManager(organizer='order__event__organizer')._ return super().get_queryset().filter(canceled=False) -class OrderFee(models.Model): +class OrderFee(RoundingCorrectionMixin, models.Model): """ An OrderFee object represents a fee that is added to the order total independently of the actual positions. This might for example be a payment or a shipping fee. @@ -2322,6 +2348,9 @@ class OrderFee(models.Model): decimal_places=2, max_digits=13, verbose_name=_("Value") ) + value_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) order = models.ForeignKey( Order, verbose_name=_("Order"), @@ -2350,6 +2379,9 @@ class OrderFee(models.Model): max_digits=13, decimal_places=2, verbose_name=_('Tax value') ) + tax_value_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) canceled = models.BooleanField(default=False) all = ScopedManager(organizer='order__event__organizer') @@ -2398,17 +2430,23 @@ class OrderFee(models.Model): self.fee_type, self.value ) - def _calculate_tax(self, tax_rule=None, invoice_address=None): + def _calculate_tax(self, tax_rule=None, invoice_address=None, event=None): if tax_rule: self.tax_rule = tax_rule - try: - ia = invoice_address or self.order.invoice_address - except InvoiceAddress.DoesNotExist: + if invoice_address: + ia = invoice_address + elif hasattr(self, "order"): + try: + ia = self.order.invoice_address + except InvoiceAddress.DoesNotExist: + ia = None + else: ia = None - if not self.tax_rule and self.fee_type == "payment" and self.order.event.settings.tax_rule_payment == "default": - self.tax_rule = self.order.event.cached_default_tax_rule + event = event or self.order.event + if not self.tax_rule and self.fee_type == "payment" and event.settings.tax_rule_payment == "default": + self.tax_rule = event.cached_default_tax_rule if self.tax_rule: tax = self.tax_rule.tax(self.value, base_price_is='gross', invoice_address=ia, force_fixed_gross_price=True) @@ -2443,6 +2481,24 @@ class OrderFee(models.Model): self.order.touch() super().delete(**kwargs) + # For historical reasons, OrderFee has "value", but OrderPosition has "price". These properties + # help using them the same way. + @property + def price(self): + return self.value + + @price.setter + def price(self, value): + self.value = value + + @property + def price_includes_rounding_correction(self): + return self.value_includes_rounding_correction + + @price_includes_rounding_correction.setter + def price_includes_rounding_correction(self, value): + self.value_includes_rounding_correction = value + class OrderPosition(AbstractPosition): """ @@ -2522,6 +2578,9 @@ class OrderPosition(AbstractPosition): max_digits=13, decimal_places=2, verbose_name=_('Tax value') ) + tax_value_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00"), + ) secret = models.CharField(max_length=255, null=False, blank=False, db_index=True) web_secret = models.CharField(max_length=32, default=generate_secret, db_index=True) @@ -2694,7 +2753,14 @@ class OrderPosition(AbstractPosition): setattr(op, f.name, cp_mapping[cartpos.addon_to_id]) else: setattr(op, f.name, getattr(cartpos, f.name)) - op._calculate_tax() + + op.tax_value = cartpos.tax_value + op.tax_value_includes_rounding_correction = cartpos.tax_value_includes_rounding_correction + op.tax_rate = cartpos.tax_rate + op.tax_code = cartpos.tax_code + op.tax_rule = cartpos.item.tax_rule + # todo: is removing this safe? op._calculate_tax() + if cartpos.voucher: op.voucher_budget_use = cartpos.listed_price - cartpos.price_after_voucher @@ -3027,6 +3093,9 @@ class Transaction(models.Model): decimal_places=2, max_digits=13, verbose_name=_("Price") ) + price_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) tax_rate = models.DecimalField( max_digits=7, decimal_places=2, verbose_name=_('Tax rate') @@ -3044,6 +3113,9 @@ class Transaction(models.Model): max_digits=13, decimal_places=2, verbose_name=_('Tax value') ) + tax_value_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) fee_type = models.CharField( max_length=100, choices=OrderFee.FEE_TYPES, null=True, blank=True ) @@ -3073,14 +3145,19 @@ class Transaction(models.Model): @staticmethod def key(obj): if isinstance(obj, Transaction): - return (obj.positionid, obj.item_id, obj.variation_id, obj.subevent_id, obj.price, obj.tax_rate, - obj.tax_rule_id, obj.tax_value, obj.fee_type, obj.internal_type, obj.tax_code) + return (obj.positionid, obj.item_id, obj.variation_id, obj.subevent_id, obj.price, + obj.price_includes_rounding_correction, obj.tax_rate, obj.tax_rule_id, + obj.tax_value, obj.tax_value_includes_rounding_correction, obj.fee_type, + obj.internal_type, obj.tax_code) elif isinstance(obj, OrderPosition): - return (obj.positionid, obj.item_id, obj.variation_id, obj.subevent_id, obj.price, obj.tax_rate, - obj.tax_rule_id, obj.tax_value, None, None, obj.tax_code) + return (obj.positionid, obj.item_id, obj.variation_id, obj.subevent_id, obj.price, + obj.price_includes_rounding_correction, obj.tax_rate, obj.tax_rule_id, + obj.tax_value, obj.tax_value_includes_rounding_correction, None, + None, obj.tax_code) elif isinstance(obj, OrderFee): - return (None, None, None, None, obj.value, obj.tax_rate, - obj.tax_rule_id, obj.tax_value, obj.fee_type, obj.internal_type, obj.tax_code) + return (None, None, None, None, obj.value, obj.value_includes_rounding_correction, + obj.tax_rate, obj.tax_rule_id, obj.tax_value, obj.tax_value_includes_rounding_correction, + obj.fee_type, obj.internal_type, obj.tax_code) raise ValueError('invalid state') # noqa @property @@ -3091,6 +3168,14 @@ class Transaction(models.Model): def full_tax_value(self): return self.tax_value * self.count + @property + def full_price_includes_rounding_correction(self): + return self.price_includes_rounding_correction * self.count + + @property + def full_tax_value_includes_rounding_correction(self): + return self.tax_value_includes_rounding_correction * self.count + class CartPosition(AbstractPosition): """ @@ -3131,6 +3216,13 @@ class CartPosition(AbstractPosition): max_digits=7, decimal_places=2, default=Decimal('0.00'), verbose_name=_('Tax rate') ) + tax_code = models.CharField( + max_length=190, + null=True, blank=True, + ) + tax_value_includes_rounding_correction = models.DecimalField( + max_digits=13, decimal_places=2, default=Decimal("0.00") + ) listed_price = models.DecimalField( decimal_places=2, max_digits=13, null=True, ) @@ -3171,9 +3263,15 @@ class CartPosition(AbstractPosition): @property def tax_value(self): - net = round_decimal(self.price - (self.price * (1 - 100 / (100 + self.tax_rate))), + price = self.gross_price_before_rounding + net = round_decimal(price - (price * (1 - 100 / (100 + self.tax_rate))), self.event.currency) - return self.price - net + return self.gross_price_before_rounding - net + self.tax_value_includes_rounding_correction + + @tax_value.setter + def tax_value(self, value): + # ignore, tax value is always computed on the fly + pass @cached_property def sort_key(self): diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 70ac0b892..8ddc0b605 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -280,13 +280,13 @@ class Seat(models.Model): def is_available(self, ignore_cart=None, ignore_orderpos=None, ignore_voucher_id=None, sales_channel='web', - ignore_distancing=False, distance_ignore_cart_id=None): + ignore_distancing=False, distance_ignore_cart_id=None, always_allow_blocked=False): from .orders import Order from .organizer import SalesChannel if isinstance(sales_channel, SalesChannel): sales_channel = sales_channel.identifier - if self.blocked and sales_channel not in self.event.settings.seating_allow_blocked_seats_for_channel: + if not always_allow_blocked and self.blocked and sales_channel not in self.event.settings.seating_allow_blocked_seats_for_channel: return False opqs = self.orderposition_set.filter( order__status__in=[Order.STATUS_PENDING, Order.STATUS_PAID], diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index 72f127770..67e54a824 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -72,7 +72,7 @@ from pretix.helpers.countries import CachedCountries from pretix.helpers.format import format_map from pretix.helpers.money import DecimalTextInput from pretix.multidomain.urlreverse import build_absolute_uri -from pretix.presale.views import get_cart, get_cart_total +from pretix.presale.views import get_cart from pretix.presale.views.cart import cart_session, get_or_create_cart_id logger = logging.getLogger(__name__) @@ -1149,12 +1149,16 @@ class FreeOrderProvider(BasePaymentProvider): from .services.cart import get_fees cart = get_cart(request) - total = get_cart_total(request) + try: - total += sum([f.value for f in get_fees(self.event, request, total, None, None, cart)]) + fees = get_fees(event=request.event, request=request, + invoice_address=None, + payments=None, positions=cart) except TaxRule.SaleNotAllowed: # ignore for now, will fail on order creation - pass + fees = [] + total = sum([c.price for c in cart]) + sum([f.value for f in fees]) + return total == 0 def order_change_allowed(self, order: Order) -> bool: @@ -1373,7 +1377,7 @@ class GiftCardPayment(BasePaymentProvider): execute_payment_needs_user = False verbose_name = _("Gift card") payment_form_class = GiftCardPaymentForm - payment_form_template_name = 'pretixcontrol/giftcards/checkout.html' + payment_form_template_name = 'pretixpresale/giftcard/checkout.html' @cached_property def customer_gift_cards(self): @@ -1500,7 +1504,7 @@ class GiftCardPayment(BasePaymentProvider): return super().order_change_allowed(order) and self.event.organizer.has_gift_cards def checkout_confirm_render(self, request, order=None, info_data=None) -> str: - return get_template('pretixcontrol/giftcards/checkout_confirm.html').render({ + return get_template('pretixpresale/giftcard/checkout_confirm.html').render({ 'info_data': info_data, }) diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index ed00d9231..7117551ff 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -84,6 +84,7 @@ from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.base.signals import layout_image_variables, layout_text_variables from pretix.base.templatetags.money import money_filter from pretix.base.templatetags.phone_format import phone_format +from pretix.helpers.daterange import datetimerange from pretix.helpers.reportlab import ThumbnailingImageReader, reshaper from pretix.presale.style import get_fonts @@ -490,6 +491,12 @@ DEFAULT_VARIABLES = OrderedDict(( "TIME_FORMAT" ) if op.valid_until else "" }), + ("program_times", { + "label": _("Program times: date and time"), + "editor_sample": _( + "2017-05-31 10:00 – 12:00\n2017-05-31 14:00 – 16:00\n2017-05-31 14:00 – 2017-06-01 14:00"), + "evaluate": lambda op, order, ev: get_program_times(op, ev) + }), ("medium_identifier", { "label": _("Reusable Medium ID"), "editor_sample": "ABC1234DEF4567", @@ -734,6 +741,16 @@ def get_seat(op: OrderPosition): return None +def get_program_times(op: OrderPosition, ev: Event): + return '\n'.join([ + datetimerange( + pt.start.astimezone(ev.timezone), + pt.end.astimezone(ev.timezone), + as_html=False + ) for pt in op.item.program_times.all() + ]) + + def generate_compressed_addon_list(op, order, event): itemcount = defaultdict(int) addons = [p for p in ( diff --git a/src/pretix/base/services/cancelevent.py b/src/pretix/base/services/cancelevent.py index 89d0d82b6..694ea3598 100644 --- a/src/pretix/base/services/cancelevent.py +++ b/src/pretix/base/services/cancelevent.py @@ -350,7 +350,7 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, ocm.add_fee(f) if dry_run: - refund_total += max(payment_refund_sum - (o.total + ocm._totaldiff), Decimal("0.00")) + refund_total += max(payment_refund_sum - (o.total + ocm._totaldiff_guesstimate), Decimal("0.00")) else: ocm.commit() refund_amount = payment_refund_sum - o.total diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index efffda374..66c7c47bd 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -66,8 +66,8 @@ from pretix.base.reldate import RelativeDateWrapper from pretix.base.services.checkin import _save_answers from pretix.base.services.locking import LockTimeoutException, lock_objects from pretix.base.services.pricing import ( - apply_discounts, get_line_price, get_listed_price, get_price, - is_included_for_free, + apply_discounts, apply_rounding, get_line_price, get_listed_price, + get_price, is_included_for_free, ) from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.tasks import ProfiledEventTask @@ -1430,11 +1430,12 @@ class CartManager: ) for cp, (new_price, discount) in zip(positions, discount_results): - if cp.price != new_price or cp.discount_id != (discount.pk if discount else None): - diff += new_price - cp.price + if cp.gross_price_before_rounding != new_price or cp.discount_id != (discount.pk if discount else None): + diff += new_price - cp.gross_price_before_rounding cp.price = new_price + cp.price_includes_rounding_correction = Decimal("0.00") cp.discount = discount - cp.save(update_fields=['price', 'discount']) + cp.save(update_fields=['price', 'price_includes_rounding_correction', 'discount']) return diff @@ -1493,30 +1494,53 @@ def add_payment_to_cart(request, provider, min_value: Decimal=None, max_value: D add_payment_to_cart_session(cs, provider, min_value, max_value, info_data) -def get_fees(event, request, total, invoice_address, payments, positions): +def get_fees(event, request, _total_ignored_=None, invoice_address=None, payments=None, positions=None): + """ + Return all fees that would be created for the current cart. Also implicitly applies rounding on the order + positions. A recommended usage pattern to compute the total looks like this:: + + cart = get_cart(request) + fees = get_fees( + event=request.event, + request=request, + invoice_address=cached_invoice_address(request), + payments=None, + positions=cart, + ) + total = sum([c.price for c in cart]) + sum([f.value for f in fees]) + """ if payments and not isinstance(payments, list): raise TypeError("payments must now be a list") + if positions is None: + raise TypeError("Must pass positions, parameter is only optional for backwards-compat reasons") fees = [] + total = sum([c.gross_price_before_rounding for c in positions]) for recv, resp in fee_calculation_for_cart.send(sender=event, request=request, invoice_address=invoice_address, - total=total, positions=positions, payment_requests=payments): + positions=positions, total=total, payment_requests=payments): if resp: fees += resp - total = total + sum(f.value for f in fees) + for fee in fees: + fee._calculate_tax(invoice_address=invoice_address, event=event) + if fee.tax_rule and not fee.tax_rule.pk: + fee.tax_rule = None # TODO: deprecate + + apply_rounding(event.settings.tax_rounding, event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) if total != 0 and payments: - total_remaining = total + payments_assigned = Decimal("0.00") for p in payments: # This algorithm of treating min/max values and fees needs to stay in sync between the following # places in the code base: # - pretix.base.services.cart.get_fees # - pretix.base.services.orders._get_fees # - pretix.presale.views.CartMixin.current_selected_payments - if p.get('min_value') and total_remaining < Decimal(p['min_value']): + if p.get('min_value') and total - payments_assigned < Decimal(p['min_value']): continue - to_pay = total_remaining + to_pay = max(total - payments_assigned, Decimal("0.00")) if p.get('max_value') and to_pay > Decimal(p['max_value']): to_pay = min(to_pay, Decimal(p['max_value'])) @@ -1525,28 +1549,32 @@ def get_fees(event, request, total, invoice_address, payments, positions): continue payment_fee = pprov.calculate_fee(to_pay) - total_remaining += payment_fee - to_pay += payment_fee - - if p.get('max_value') and to_pay > Decimal(p['max_value']): - to_pay = min(to_pay, Decimal(p['max_value'])) - - total_remaining -= to_pay - if payment_fee: if event.settings.tax_rule_payment == "default": payment_fee_tax_rule = event.cached_default_tax_rule or TaxRule.zero() else: payment_fee_tax_rule = TaxRule.zero() payment_fee_tax = payment_fee_tax_rule.tax(payment_fee, base_price_is='gross', invoice_address=invoice_address) - fees.append(OrderFee( + pf = OrderFee( fee_type=OrderFee.FEE_TYPE_PAYMENT, value=payment_fee, tax_rate=payment_fee_tax.rate, tax_value=payment_fee_tax.tax, tax_code=payment_fee_tax.code, tax_rule=payment_fee_tax_rule - )) + ) + fees.append(pf) + + # Re-apply rounding as grand total has changed + apply_rounding(event.settings.tax_rounding, event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) + + # Re-calculate to_pay as grand total has changed + to_pay = max(total - payments_assigned, Decimal("0.00")) + if p.get('max_value') and to_pay > Decimal(p['max_value']): + to_pay = min(to_pay, Decimal(p['max_value'])) + + payments_assigned += to_pay return fees diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 704ea90da..6db88be3e 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -93,6 +93,7 @@ def build_invoice(invoice: Invoice) -> Invoice: invoice.invoice_from_name = invoice.event.settings.get('invoice_address_from_name') invoice.invoice_from_zipcode = invoice.event.settings.get('invoice_address_from_zipcode') invoice.invoice_from_city = invoice.event.settings.get('invoice_address_from_city') + invoice.invoice_from_state = invoice.event.settings.get('invoice_address_from_state') invoice.invoice_from_country = invoice.event.settings.get('invoice_address_from_country') invoice.invoice_from_tax_id = invoice.event.settings.get('invoice_address_from_tax_id') invoice.invoice_from_vat_id = invoice.event.settings.get('invoice_address_from_vat_id') @@ -258,9 +259,15 @@ def build_invoice(invoice: Invoice) -> Invoice: if resp: desc += "
" + resp - for answ in p.answers.all(): - if not answ.question.print_on_invoice: - continue + answers_qs = p.answers.filter( + question__print_on_invoice=True + ).select_related( + 'question' + ).order_by( + 'question__position', + 'question__id' + ) + for answ in answers_qs: desc += "
{}{} {}".format( answ.question.question, "" if str(answ.question.question).endswith("?") else ":", @@ -453,6 +460,7 @@ def generate_cancellation(invoice: Invoice, trigger_pdf=True): cancellation.invoice_from_name = invoice.event.settings.get('invoice_address_from_name') cancellation.invoice_from_zipcode = invoice.event.settings.get('invoice_address_from_zipcode') cancellation.invoice_from_city = invoice.event.settings.get('invoice_address_from_city') + cancellation.invoice_from_state = invoice.event.settings.get('invoice_address_from_state') cancellation.invoice_from_country = invoice.event.settings.get('invoice_address_from_country') cancellation.invoice_from_tax_id = invoice.event.settings.get('invoice_address_from_tax_id') cancellation.invoice_from_vat_id = invoice.event.settings.get('invoice_address_from_vat_id') @@ -556,6 +564,7 @@ def build_preview_invoice_pdf(event): invoice.invoice_from_name = invoice.event.settings.get('invoice_address_from_name') invoice.invoice_from_zipcode = invoice.event.settings.get('invoice_address_from_zipcode') invoice.invoice_from_city = invoice.event.settings.get('invoice_address_from_city') + invoice.invoice_from_state = invoice.event.settings.get('invoice_address_from_state') invoice.invoice_from_country = invoice.event.settings.get('invoice_address_from_country') invoice.invoice_from_tax_id = invoice.event.settings.get('invoice_address_from_tax_id') invoice.invoice_from_vat_id = invoice.event.settings.get('invoice_address_from_vat_id') @@ -687,7 +696,7 @@ def retry_stuck_invoices(sender, **kwargs): with transaction.atomic(): qs = Invoice.objects.filter( transmission_status=Invoice.TRANSMISSION_STATUS_INFLIGHT, - transmission_date__lte=now() - timedelta(hours=24), + transmission_date__lte=now() - timedelta(hours=48), ).select_for_update( of=OF_SELF, skip_locked=connection.features.has_select_for_update_skip_locked ) diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index 03bd489e7..3e05e9792 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -222,7 +222,7 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La 'invoice_company': '' }) renderer = ClassicMailRenderer(None, organizer) - content_plain = body_plain = render_mail(template, context) + body_plain = render_mail(template, context, placeholder_mode=SafeFormatter.MODE_RICH_TO_PLAIN) subject = str(subject).format_map(TolerantDict(context)) sender = ( sender or @@ -316,6 +316,7 @@ def mail(email: Union[str, Sequence[str]], subject: str, template: Union[str, La with override(timezone): try: + content_plain = render_mail(template, context, placeholder_mode=None) if plain_text_only: body_html = None elif 'context' in inspect.signature(renderer.render).parameters: @@ -751,11 +752,11 @@ def mail_send(*args, **kwargs): mail_send_task.apply_async(args=args, kwargs=kwargs) -def render_mail(template, context): +def render_mail(template, context, placeholder_mode=SafeFormatter.MODE_RICH_TO_PLAIN): if isinstance(template, LazyI18nString): body = str(template) - if context: - body = format_map(body, context, mode=SafeFormatter.MODE_IGNORE_RICH) + if context and placeholder_mode: + body = format_map(body, context, mode=placeholder_mode) else: tpl = get_template(template) body = tpl.render(context) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index bfe817d0f..e8be424cf 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -95,7 +95,7 @@ from pretix.base.services.memberships import ( create_membership, validate_memberships_in_order, ) from pretix.base.services.pricing import ( - apply_discounts, get_listed_price, get_price, + apply_discounts, apply_rounding, get_listed_price, get_price, ) from pretix.base.services.quotas import QuotaAvailability from pretix.base.services.tasks import ProfiledEventTask, ProfiledTask @@ -146,6 +146,10 @@ error_messages = { 'race_condition': gettext_lazy("This order was changed by someone else simultaneously. Please check if your " "changes are still accurate and try again."), 'empty': gettext_lazy("Your cart is empty."), + 'max_items': ngettext_lazy( + "You cannot select more than %s item per order.", + "You cannot select more than %s items per order." + ), 'max_items_per_product': ngettext_lazy( "You cannot select more than %(max)s item of the product %(product)s. We removed the surplus items from your cart.", "You cannot select more than %(max)s items of the product %(product)s. We removed the surplus items from your cart.", @@ -763,6 +767,11 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti shared_lock_objects=[event] ) + # Check maximum order size + limit = min(int(event.settings.max_items_per_order), settings.PRETIX_MAX_ORDER_SIZE) + if sum(1 for cp in sorted_positions if not cp.addon_to) > limit: + err = err or (error_messages['max_items'] % limit) + # Check availability for i, cp in enumerate(sorted_positions): if cp.pk in deleted_positions: @@ -947,10 +956,11 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti ] ) for cp, (new_price, discount) in zip(sorted_positions, discount_results): - if cp.price != new_price or cp.discount_id != (discount.pk if discount else None): + if cp.gross_price_before_rounding != new_price or cp.discount_id != (discount.pk if discount else None): cp.price = new_price + cp.price_includes_rounding_correction = Decimal("0.00") cp.discount = discount - cp.save(update_fields=['price', 'discount']) + cp.save(update_fields=['price', 'price_includes_rounding_correction', 'discount']) # After applying discounts, add-on positions might still have a reference to the *old* version of the # parent position, which can screw up ordering later since the system sees inconsistent data. @@ -973,10 +983,11 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti raise OrderError(err) -def _get_fees(positions: List[CartPosition], payment_requests: List[dict], address: InvoiceAddress, - meta_info: dict, event: Event, require_approval=False): +def _apply_rounding_and_fees(positions: List[CartPosition], payment_requests: List[dict], address: InvoiceAddress, + meta_info: dict, event: Event, require_approval=False): fees = [] - total = sum([c.price for c in positions]) + # Pre-rounding, pre-fee total is used for fee calculation + total = sum([c.gross_price_before_rounding for c in positions]) gift_cards = [] # for backwards compatibility for p in payment_requests: @@ -987,40 +998,53 @@ def _get_fees(positions: List[CartPosition], payment_requests: List[dict], addre meta_info=meta_info, positions=positions, gift_cards=gift_cards): if resp: fees += resp - total += sum(f.value for f in fees) - total_remaining = total + for fee in fees: + fee._calculate_tax(invoice_address=address, event=event) + if fee.tax_rule and not fee.tax_rule.pk: + fee.tax_rule = None # TODO: deprecate + + # Apply rounding to get final total in case no payment fees will be added + apply_rounding(event.settings.tax_rounding, event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) + + payments_assigned = Decimal("0.00") for p in payment_requests: # This algorithm of treating min/max values and fees needs to stay in sync between the following # places in the code base: # - pretix.base.services.cart.get_fees # - pretix.base.services.orders._get_fees # - pretix.presale.views.CartMixin.current_selected_payments - if p.get('min_value') and total_remaining < Decimal(p['min_value']): + if p.get('min_value') and total - payments_assigned < Decimal(p['min_value']): p['payment_amount'] = Decimal('0.00') continue - to_pay = total_remaining + to_pay = max(total - payments_assigned, Decimal("0.00")) if p.get('max_value') and to_pay > Decimal(p['max_value']): to_pay = min(to_pay, Decimal(p['max_value'])) payment_fee = p['pprov'].calculate_fee(to_pay) - total_remaining += payment_fee - to_pay += payment_fee - - if p.get('max_value') and to_pay > Decimal(p['max_value']): - to_pay = min(to_pay, Decimal(p['max_value'])) - - total_remaining -= to_pay - - p['payment_amount'] = to_pay if payment_fee: pf = OrderFee(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=payment_fee, internal_type=p['pprov'].identifier) + pf._calculate_tax(invoice_address=address, event=event) fees.append(pf) p['fee'] = pf - if total_remaining != Decimal('0.00') and not require_approval: + # Re-apply rounding as grand total has changed + apply_rounding(event.settings.tax_rounding, event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) + + # Re-calculate to_pay as grand total has changed + to_pay = max(total - payments_assigned, Decimal("0.00")) + + if p.get('max_value') and to_pay > Decimal(p['max_value']): + to_pay = min(to_pay, Decimal(p['max_value'])) + + payments_assigned += to_pay + p['payment_amount'] = to_pay + + if total != payments_assigned and not require_approval: raise OrderError(_("The selected payment methods do not cover the total balance.")) return fees @@ -1029,7 +1053,7 @@ def _get_fees(positions: List[CartPosition], payment_requests: List[dict], addre def _create_order(event: Event, *, email: str, positions: List[CartPosition], now_dt: datetime, payment_requests: List[dict], sales_channel: SalesChannel, locale: str=None, address: InvoiceAddress=None, meta_info: dict=None, shown_total=None, - customer=None, valid_if_pending=False, api_meta: dict=None): + customer=None, valid_if_pending=False, api_meta: dict=None, tax_rounding_mode=None): payments = [] try: @@ -1038,10 +1062,13 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no raise OrderError(e.message) require_approval = any(p.requires_approval(invoice_address=address) for p in positions) + + # Final calculation of fees, also performs final rounding try: - fees = _get_fees(positions, payment_requests, address, meta_info, event, require_approval=require_approval) + fees = _apply_rounding_and_fees(positions, payment_requests, address, meta_info, event, require_approval=require_approval) except TaxRule.SaleNotAllowed: raise OrderError(error_messages['country_blocked']) + total = pending_sum = sum([c.price for c in positions]) + sum([c.value for c in fees]) order = Order( @@ -1059,6 +1086,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no sales_channel=sales_channel, customer=customer, valid_if_pending=valid_if_pending, + tax_rounding_mode=tax_rounding_mode or event.settings.tax_rounding, ) if customer: order.email_known_to_work = customer.is_verified @@ -1073,12 +1101,6 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no for fee in fees: fee.order = order - try: - fee._calculate_tax() - except TaxRule.SaleNotAllowed: - raise OrderError(error_messages['country_blocked']) - if fee.tax_rule and not fee.tax_rule.pk: - fee.tax_rule = None # TODO: deprecate fee.save() # Safety check: Is the amount we're now going to charge the same amount the user has been shown when they @@ -1167,7 +1189,7 @@ def _order_placed_email_attendee(event: Event, order: Order, position: OrderPosi def _perform_order(event: Event, payment_requests: List[dict], position_ids: List[str], email: str, locale: str, address: int, meta_info: dict=None, sales_channel: str='web', - shown_total=None, customer=None, api_meta: dict=None): + shown_total=None, customer=None, api_meta: dict=None, tax_rounding_mode=None): for p in payment_requests: p['pprov'] = event.get_payment_providers(cached=True)[p['provider']] if not p['pprov']: @@ -1273,6 +1295,7 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis customer=customer, valid_if_pending=valid_if_pending, api_meta=api_meta, + tax_rounding_mode=tax_rounding_mode, ) try: @@ -1656,15 +1679,16 @@ class OrderChangeManager: AddBlockOperation = namedtuple('AddBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked')) RemoveBlockOperation = namedtuple('RemoveBlockOperation', ('position', 'block_name', 'ignore_from_quota_while_blocked')) - def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True): + def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True, allow_blocked_seats=False): self.order = order self.user = user self.auth = auth self.event = order.event self.split_order = None self.reissue_invoice = reissue_invoice + self.allow_blocked_seats = allow_blocked_seats self._committed = False - self._totaldiff = 0 + self._totaldiff_guesstimate = 0 self._quotadiff = Counter() self._seatdiff = Counter() self._operations = [] @@ -1781,7 +1805,7 @@ class OrderChangeManager: if position.issued_gift_cards.exists(): raise OrderError(self.error_messages['gift_card_change']) - self._totaldiff += price.gross - position.price + self._totaldiff_guesstimate += price.gross - position.gross_price_before_rounding if self.order.event.settings.invoice_include_free or price.gross != Decimal('0.00') or position.price != Decimal('0.00'): self._invoice_dirty = True @@ -1826,29 +1850,29 @@ class OrderChangeManager: else: new_tax = tax_rule.tax(pos.price, base_price_is='gross', currency=self.event.currency, override_tax_rate=new_rate, override_tax_code=new_code) - self._totaldiff += new_tax.gross - pos.price + self._totaldiff_guesstimate += new_tax.gross - pos.price self._operations.append(self.PriceOperation(pos, new_tax, new_tax.gross - pos.price)) self._invoice_dirty = True def cancel_fee(self, fee: OrderFee): - self._totaldiff -= fee.value + self._totaldiff_guesstimate -= fee.value self._operations.append(self.CancelFeeOperation(fee, -fee.value)) self._invoice_dirty = True def add_fee(self, fee: OrderFee): - self._totaldiff += fee.value + self._totaldiff_guesstimate += fee.value self._invoice_dirty = True self._operations.append(self.AddFeeOperation(fee, fee.value)) def change_fee(self, fee: OrderFee, value: Decimal): value = (fee.tax_rule or TaxRule.zero()).tax(value, base_price_is='gross', invoice_address=self._invoice_address, force_fixed_gross_price=True) - self._totaldiff += value.gross - fee.value + self._totaldiff_guesstimate += value.gross - fee.value self._invoice_dirty = True self._operations.append(self.FeeValueOperation(fee, value, value.gross - fee.value)) def cancel(self, position: OrderPosition): - self._totaldiff -= position.price + self._totaldiff_guesstimate -= position.price self._quotadiff.subtract(position.quotas) self._operations.append(self.CancelOperation(position, -position.price)) if position.seat: @@ -1914,7 +1938,7 @@ class OrderChangeManager: if self.order.event.settings.invoice_include_free or price.gross != Decimal('0.00'): self._invoice_dirty = True - self._totaldiff += price.gross + self._totaldiff_guesstimate += price.gross self._quotadiff.update(new_quotas) if seat: self._seatdiff.update([seat]) @@ -2183,7 +2207,7 @@ class OrderChangeManager: for seat, diff in self._seatdiff.items(): if diff <= 0: continue - if not seat.is_available(sales_channel=self.order.sales_channel, ignore_distancing=True) or diff > 1: + if not seat.is_available(sales_channel=self.order.sales_channel, ignore_distancing=True, always_allow_blocked=self.allow_blocked_seats) or diff > 1: raise OrderError(self.error_messages['seat_unavailable'].format(seat=seat.name)) if self.event.has_subevents: @@ -2210,8 +2234,8 @@ class OrderChangeManager: if avail[0] != Quota.AVAILABILITY_OK or (avail[1] is not None and avail[1] < diff): raise OrderError(self.error_messages['quota'].format(name=quota.name)) - def _check_paid_price_change(self): - if self.order.status == Order.STATUS_PAID and self._totaldiff > 0: + def _check_paid_price_change(self, totaldiff): + if self.order.status == Order.STATUS_PAID and totaldiff > 0: if self.order.pending_sum > Decimal('0.00'): self.order.status = Order.STATUS_PENDING self.order.set_expires( @@ -2219,7 +2243,7 @@ class OrderChangeManager: self.order.event.subevents.filter(id__in=self.order.positions.values_list('subevent_id', flat=True)) ) self.order.save() - elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff < 0: + elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and totaldiff < 0: if self.order.pending_sum <= Decimal('0.00') and not self.order.require_approval: self.order.status = Order.STATUS_PAID self.order.save() @@ -2246,7 +2270,7 @@ class OrderChangeManager: user=self.user, auth=self.auth ) - elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff > 0: + elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and totaldiff > 0: if self.open_payment: try: self.open_payment.payment_provider.cancel_payment(self.open_payment) @@ -2266,11 +2290,11 @@ class OrderChangeManager: auth=self.auth, ) - def _check_paid_to_free(self): - if self.event.currency == 'XXX' and self.order.total + self._totaldiff > Decimal("0.00"): + def _check_paid_to_free(self, totaldiff): + if self.event.currency == 'XXX' and self.order.total + totaldiff > Decimal("0.00"): raise OrderError(error_messages['currency_XXX']) - if self.order.total == 0 and (self._totaldiff < 0 or (self.split_order and self.split_order.total > 0)) and not self.order.require_approval: + if self.order.total == 0 and (totaldiff < 0 or (self.split_order and self.split_order.total > 0)) and not self.order.require_approval: if not self.order.fees.exists() and not self.order.positions.exists(): # The order is completely empty now, so we cancel it. self.order.status = Order.STATUS_CANCELED @@ -2278,7 +2302,7 @@ class OrderChangeManager: order_canceled.send(self.order.event, order=self.order) elif self.order.status != Order.STATUS_CANCELED: # if the order becomes free, mark it paid using the 'free' provider - # this could happen if positions have been made cheaper or removed (_totaldiff < 0) + # this could happen if positions have been made cheaper or removed (totaldiff < 0) # or positions got split off to a new order (split_order with positive total) p = self.order.payments.create( state=OrderPayment.PAYMENT_STATE_CREATED, @@ -2407,10 +2431,15 @@ class OrderChangeManager: 'new_price': op.price.gross }) position.price = op.price.gross + position.price_includes_rounding_correction = Decimal("0.00") position.tax_rate = op.price.rate position.tax_value = op.price.tax + position.tax_value_includes_rounding_correction = Decimal("0.00") position.tax_code = op.price.code - position.save(update_fields=['price', 'tax_rate', 'tax_value', 'tax_code']) + position.save(update_fields=[ + 'price', 'price_includes_rounding_correction', 'tax_rate', 'tax_value', + 'tax_value_includes_rounding_correction', 'tax_code' + ]) elif isinstance(op, self.TaxRuleOperation): if isinstance(op.position, OrderPosition): position = position_cache.setdefault(op.position.pk, op.position) @@ -2677,14 +2706,18 @@ class OrderChangeManager: except InvoiceAddress.DoesNotExist: pass - split_order.total = sum([p.price for p in split_positions if not p.canceled]) - + fees = [] for fee in self.order.fees.exclude(fee_type=OrderFee.FEE_TYPE_PAYMENT): new_fee = modelcopy(fee) new_fee.pk = None new_fee.order = split_order - split_order.total += new_fee.value new_fee.save() + fees.append(new_fee) + + changed_by_rounding = set(apply_rounding( + self.order.tax_rounding_mode, self.event.currency, [p for p in split_positions if not p.canceled] + fees + )) + split_order.total = sum([p.price for p in split_positions if not p.canceled]) if split_order.total != Decimal('0.00') and self.order.status != Order.STATUS_PAID: pp = self._get_payment_provider() @@ -2697,9 +2730,27 @@ class OrderChangeManager: fee._calculate_tax() if payment_fee != 0: fee.save() + fees.append(fee) elif fee.pk: + if fee in fees: + fees.remove(fee) fee.delete() - split_order.total += fee.value + + changed_by_rounding |= set(apply_rounding( + self.order.tax_rounding_mode, self.event.currency, [p for p in split_positions if not p.canceled] + fees + )) + split_order.total = sum([p.price for p in split_positions if not p.canceled]) + sum([f.value for f in fees]) + + for l in changed_by_rounding: + if isinstance(l, OrderPosition): + l.save(update_fields=[ + "price", "price_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + elif isinstance(l, OrderFee): + l.save(update_fields=[ + "value", "value_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + split_order.total = sum([p.price for p in split_positions if not p.canceled]) + sum([f.value for f in fees]) remaining_total = sum([p.price for p in self.order.positions.all()]) + sum([f.value for f in self.order.fees.all()]) offset_amount = min(max(0, self.completed_payment_sum - remaining_total), split_order.total) @@ -2759,9 +2810,12 @@ class OrderChangeManager: ).aggregate(s=Sum('amount'))['s'] or Decimal('0.00') return payment_sum - refund_sum - def _recalculate_total_and_payment_fee(self): - total = sum([p.price for p in self.order.positions.all()]) + sum([f.value for f in self.order.fees.all()]) + def _recalculate_rounding_total_and_payment_fee(self): + positions = list(self.order.positions.all()) + fees = list(self.order.fees.all()) + total = sum([p.price for p in positions]) + sum([f.value for f in fees]) payment_fee = Decimal('0.00') + fee_changed = False if self.open_payment: current_fee = Decimal('0.00') fee = None @@ -2789,14 +2843,32 @@ class OrderChangeManager: fee.value = payment_fee fee._calculate_tax() fee.save() + fee_changed = True if not self.open_payment.fee: self.open_payment.fee = fee self.open_payment.save(update_fields=['fee']) elif fee and not fee.canceled: fee.delete() + fee_changed = True - self.order.total = total + payment_fee + if fee_changed: + fees = list(self.order.fees.all()) + + changed = apply_rounding(self.order.tax_rounding_mode, self.order.event.currency, [*positions, *fees]) + for l in changed: + if isinstance(l, OrderPosition): + l.save(update_fields=[ + "price", "price_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + elif isinstance(l, OrderFee): + l.save(update_fields=[ + "value", "value_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + total = sum([p.price for p in positions]) + sum([f.value for f in fees]) + + self.order.total = total self.order.save() + return total def _check_order_size(self): if (len(self.order.positions.all()) + len([op for op in self._operations if isinstance(op, self.AddOperation)])) > settings.PRETIX_MAX_ORDER_SIZE: @@ -2806,23 +2878,6 @@ class OrderChangeManager: } ) - def _payment_fee_diff(self): - total = self.order.total + self._totaldiff - if self.open_payment: - current_fee = Decimal('0.00') - if self.open_payment and self.open_payment.fee: - current_fee = self.open_payment.fee.value - total -= current_fee - - # Do not change payment fees of paid orders - payment_fee = Decimal('0.00') - if self.order.pending_sum - current_fee != 0: - prov = self.open_payment.payment_provider - if prov: - payment_fee = prov.calculate_fee(total - self.completed_payment_sum) - - self._totaldiff += payment_fee - current_fee - def _reissue_invoice(self): i = self.order.invoices.filter(is_cancellation=False).last() if self.reissue_invoice and self._invoice_dirty: @@ -2953,6 +3008,13 @@ class OrderChangeManager: shared_lock_objects=[self.event] ) + def guess_totaldiff(self): + """ + Return the estimated difference of ``order.total`` based on the currently queued operations. This is only + a guess since it does not account for (a) tax rounding or (b) payment fee changes. + """ + return self._totaldiff_guesstimate + def commit(self, check_quotas=True): if self._committed: # an order change can only be committed once @@ -2968,8 +3030,6 @@ class OrderChangeManager: # so it's dangerous to keep the cache around. self.order._prefetched_objects_cache = {} - # finally, incorporate difference in payment fees - self._payment_fee_diff() self._check_order_size() with transaction.atomic(): @@ -2977,6 +3037,7 @@ class OrderChangeManager: if locked_instance.last_modified != self.order.last_modified: raise OrderError(error_messages['race_condition']) + original_total = self.order.total if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID): if check_quotas: self._check_quotas() @@ -2988,9 +3049,10 @@ class OrderChangeManager: self._perform_operations() except TaxRule.SaleNotAllowed: raise OrderError(self.error_messages['tax_rule_country_blocked']) - self._recalculate_total_and_payment_fee() - self._check_paid_price_change() - self._check_paid_to_free() + new_total = self._recalculate_rounding_total_and_payment_fee() + totaldiff = new_total - original_total + self._check_paid_price_change(totaldiff) + self._check_paid_to_free(totaldiff) if self.order.status in (Order.STATUS_PENDING, Order.STATUS_PAID): self._reissue_invoice() self._clear_tickets_cache() @@ -3209,6 +3271,7 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay raise Exception('change_payment_provider should only be called in atomic transaction!') oldtotal = order.total + already_paid = order.payment_refund_sum e = OrderPayment.objects.filter(fee=OuterRef('pk'), state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED)) open_fees = list( @@ -3225,19 +3288,46 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay fee = OrderFee(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.00'), order=order) old_fee = fee.value + positions = list(order.positions.all()) + fees = list(order.fees.all()) + rounding_changed = set(apply_rounding( + order.tax_rounding_mode, order.event.currency, [*positions, *[f for f in fees if f.pk != fee.pk]] + )) + total_without_fee = sum(c.price for c in positions) + sum(f.value for f in fees if f.pk != fee.pk) + pending_sum_without_fee = max(Decimal("0.00"), total_without_fee - already_paid) + new_fee = payment_provider.calculate_fee( - order.pending_sum - old_fee if amount is None else amount + pending_sum_without_fee if amount is None else amount ) if new_fee: fee.value = new_fee fee.internal_type = payment_provider.identifier fee._calculate_tax() + if fee in fees: + fees.remove(fee) + # "Update instance in the fees array + fees.append(fee) fee.save() else: + if fee in fees: + fees.remove(fee) if fee.pk: fee.delete() fee = None + rounding_changed |= set(apply_rounding( + order.tax_rounding_mode, order.event.currency, [*positions, *fees] + )) + for l in rounding_changed: + if isinstance(l, OrderPosition): + l.save(update_fields=[ + "price", "price_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + elif isinstance(l, OrderFee): + l.save(update_fields=[ + "value", "value_includes_rounding_correction", "tax_value", "tax_value_includes_rounding_correction" + ]) + open_payment = None if new_payment: lp = order.payments.select_for_update(of=OF_SELF).exclude(pk=new_payment.pk).last() @@ -3264,7 +3354,7 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay }, ) - order.total = (order.positions.aggregate(sum=Sum('price'))['sum'] or 0) + (order.fees.aggregate(sum=Sum('value'))['sum'] or 0) + order.total = sum(c.price for c in positions) + sum(f.value for f in fees) order.save(update_fields=['total']) if not new_payment: diff --git a/src/pretix/base/services/placeholders.py b/src/pretix/base/services/placeholders.py index c4cdc03c3..9376748eb 100644 --- a/src/pretix/base/services/placeholders.py +++ b/src/pretix/base/services/placeholders.py @@ -26,7 +26,7 @@ from decimal import Decimal from django.dispatch import receiver from django.utils.formats import date_format -from django.utils.html import escape +from django.utils.html import escape, mark_safe from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ @@ -123,6 +123,10 @@ class BaseRichTextPlaceholder(BaseTextPlaceholder): def identifier(self): return self._identifier + @property + def allowed_in_plain_content(self): + return False + @property def required_context(self): return self._args @@ -194,6 +198,33 @@ class SimpleButtonPlaceholder(BaseRichTextPlaceholder): return f'{text}: {url}' +class MarkdownTextPlaceholder(BaseRichTextPlaceholder): + def __init__(self, identifier, args, func, sample, inline): + super().__init__(identifier, args) + self._func = func + self._sample = sample + self._snippet = inline + + @property + def allowed_in_plain_content(self): + return self._snippet + + def render_plain(self, **context): + return self._func(**{k: context[k] for k in self._args}) + + def render_html(self, **context): + return mark_safe(markdown_compile_email(self.render_plain(**context), snippet=self._snippet)) + + def render_sample_plain(self, event): + if callable(self._sample): + return self._sample(event) + else: + return self._sample + + def render_sample_html(self, event): + return mark_safe(markdown_compile_email(self.render_sample_plain(event), snippet=self._snippet)) + + class PlaceholderContext(SafeFormatter): """ Holds the contextual arguments and corresponding list of available placeholders for formatting @@ -574,7 +605,7 @@ def base_placeholders(sender, **kwargs): 'invoice_company', ['invoice_address'], lambda invoice_address: invoice_address.company or '', _('Sample Corporation') ), - SimpleFunctionalTextPlaceholder( + MarkdownTextPlaceholder( 'orders', ['event', 'orders'], lambda event, orders: '\n' + '\n\n'.join( '* {} - {}'.format( order.full_code, @@ -604,6 +635,7 @@ def base_placeholders(sender, **kwargs): {'code': 'OPKSB', 'secret': '09pjdksflosk3njd', 'hash': 'stuvwxy2z'} ] ), + inline=False, ), SimpleFunctionalTextPlaceholder( 'hours', ['event', 'waiting_list_entry'], lambda event, waiting_list_entry: @@ -618,12 +650,13 @@ def base_placeholders(sender, **kwargs): 'code', ['waiting_list_voucher'], lambda waiting_list_voucher: waiting_list_voucher.code, '68CYU2H6ZTP3WLK5' ), - SimpleFunctionalTextPlaceholder( + MarkdownTextPlaceholder( # join vouchers with two spaces at end of line so markdown-parser inserts a
'voucher_list', ['voucher_list'], lambda voucher_list: ' \n'.join(voucher_list), - ' 68CYU2H6ZTP3WLK5\n 7MB94KKPVEPSMVF2' + '68CYU2H6ZTP3WLK5 \n7MB94KKPVEPSMVF2', + inline=False, ), - SimpleFunctionalTextPlaceholder( + MarkdownTextPlaceholder( # join vouchers with two spaces at end of line so markdown-parser inserts a
'voucher_url_list', ['event', 'voucher_list'], lambda event, voucher_list: ' \n'.join([ @@ -638,6 +671,7 @@ def base_placeholders(sender, **kwargs): ) + '?voucher=' + c for c in ['68CYU2H6ZTP3WLK5', '7MB94KKPVEPSMVF2'] ]), + inline=False, ), SimpleFunctionalTextPlaceholder( 'url', ['event', 'voucher_list'], lambda event, voucher_list: build_absolute_uri(event, 'presale:event.index', kwargs={ @@ -656,13 +690,13 @@ def base_placeholders(sender, **kwargs): 'comment', ['comment'], lambda comment: comment, _('An individual text with a reason can be inserted here.'), ), - SimpleFunctionalTextPlaceholder( + MarkdownTextPlaceholder( 'payment_info', ['order', 'payments'], _placeholder_payments, - _('The amount has been charged to your card.'), + _('The amount has been charged to your card.'), inline=False, ), - SimpleFunctionalTextPlaceholder( + MarkdownTextPlaceholder( 'payment_info', ['payment_info'], lambda payment_info: payment_info, - _('Please transfer money to this bank account: 9999-9999-9999-9999'), + _('Please transfer money to this bank account: 9999-9999-9999-9999'), inline=False, ), SimpleFunctionalTextPlaceholder( 'attendee_name', ['position'], lambda position: position.attendee_name, @@ -719,13 +753,13 @@ def base_placeholders(sender, **kwargs): )) for k, v in sender.meta_data.items(): - ph.append(SimpleFunctionalTextPlaceholder( + ph.append(MarkdownTextPlaceholder( 'meta_%s' % k, ['event'], lambda event, k=k: event.meta_data[k], - v + v, inline=True, )) - ph.append(SimpleFunctionalTextPlaceholder( + ph.append(MarkdownTextPlaceholder( 'meta_%s' % k, ['event_or_subevent'], lambda event_or_subevent, k=k: event_or_subevent.meta_data[k], - v + v, inline=True, )) return ph @@ -753,7 +787,7 @@ def get_available_placeholders(event, base_parameters, rich=False): if not isinstance(val, (list, tuple)): val = [val] for v in val: - if isinstance(v, BaseRichTextPlaceholder) and not rich: + if isinstance(v, BaseRichTextPlaceholder) and not rich and not v.allowed_in_plain_content: continue if all(rp in base_parameters for rp in v.required_context): params[v.identifier] = v @@ -775,13 +809,13 @@ def get_sample_context(event, context_parameters, rich=True): ) ) elif str(sample).strip().startswith('* ') or str(sample).startswith(' '): - context_dict[k] = '
{}
'.format( + context_dict[k] = mark_safe('
{}
'.format( lbl, markdown_compile_email(str(sample)) - ) + )) else: - context_dict[k] = '{}'.format( + context_dict[k] = mark_safe('{}'.format( lbl, escape(sample) - ) + )) return context_dict diff --git a/src/pretix/base/services/pricing.py b/src/pretix/base/services/pricing.py index 5ac9dbea4..3921a1b13 100644 --- a/src/pretix/base/services/pricing.py +++ b/src/pretix/base/services/pricing.py @@ -23,15 +23,17 @@ import re from collections import defaultdict from datetime import datetime from decimal import Decimal -from typing import List, Optional, Tuple, Union +from itertools import groupby +from typing import List, Literal, Optional, Tuple, Union from django import forms +from django.conf import settings from django.db.models import Q from pretix.base.decimal import round_decimal from pretix.base.models import ( - AbstractPosition, InvoiceAddress, Item, ItemAddOn, ItemVariation, - SalesChannel, Voucher, + AbstractPosition, CartPosition, InvoiceAddress, Item, ItemAddOn, + ItemVariation, OrderFee, OrderPosition, SalesChannel, Voucher, ) from pretix.base.models.discount import Discount, PositionInfo from pretix.base.models.event import Event, SubEvent @@ -136,7 +138,8 @@ def get_listed_price(item: Item, variation: ItemVariation = None, subevent: SubE def get_line_price(price_after_voucher: Decimal, custom_price_input: Decimal, custom_price_input_is_net: bool, - tax_rule: TaxRule, invoice_address: InvoiceAddress, bundled_sum: Decimal, is_bundled=False) -> TaxedPrice: + tax_rule: TaxRule, invoice_address: InvoiceAddress, bundled_sum: Decimal, + is_bundled=False) -> TaxedPrice: if not tax_rule: tax_rule = TaxRule( name='', @@ -152,7 +155,8 @@ def get_line_price(price_after_voucher: Decimal, custom_price_input: Decimal, cu override_tax_code=price.code, invoice_address=invoice_address, subtract_from_gross=bundled_sum) else: - price = tax_rule.tax(max(custom_price_input, price.gross), base_price_is='gross', override_tax_rate=price.rate, + price = tax_rule.tax(max(custom_price_input, price.gross), base_price_is='gross', + override_tax_rate=price.rate, override_tax_code=price.code, invoice_address=invoice_address, subtract_from_gross=bundled_sum) else: @@ -164,7 +168,7 @@ def get_line_price(price_after_voucher: Decimal, custom_price_input: Decimal, cu def apply_discounts(event: Event, sales_channel: Union[str, SalesChannel], positions: List[Tuple[int, Optional[int], Optional[datetime], Decimal, bool, bool, Decimal]], - collect_potential_discounts: Optional[defaultdict]=None) -> List[Tuple[Decimal, Optional[Discount]]]: + collect_potential_discounts: Optional[defaultdict] = None) -> List[Tuple[Decimal, Optional[Discount]]]: """ Applies any dynamic discounts to a cart @@ -203,3 +207,121 @@ def apply_discounts(event: Event, sales_channel: Union[str, SalesChannel], new_prices.update(result) return [new_prices.get(idx, (p[3], None)) for idx, p in enumerate(positions)] + + +def apply_rounding(rounding_mode: Literal["line", "sum_by_net", "sum_by_net_keep_gross"], currency: str, + lines: List[Union[OrderPosition, CartPosition, OrderFee]]) -> list: + """ + Given a list of order positions / cart positions / order fees (may be mixed), applies the given rounding mode + and mutates the ``price``, ``price_includes_rounding_correction``, ``tax_value``, and + ``tax_value_includes_rounding_correction`` attributes. + + When rounding mode is set to ``"line"``, the tax will be computed and rounded individually for every line. + + When rounding mode is set to ``"sum_by_net_keep_gross"``, the tax values of the individual lines will be adjusted + such that the per-taxrate/taxcode subtotal is rounded correctly. The gross prices will stay constant. + + When rounding mode is set to ``"sum_by_net"``, the gross prices and tax values of the individual lines will be + adjusted such that the per-taxrate/taxcode subtotal is rounded correctly. The net prices will stay constant. + + :param rounding_mode: One of ``"line"``, ``"sum_by_net"``, or ``"sum_by_net_keep_gross"``. + :param currency: Currency that will be used to determine rounding precision + :param lines: List of order/cart contents + :return: Collection of ``lines`` members that have been changed and may need to be persisted to the database. + """ + + def _key(line): + return (line.tax_rate, line.tax_code or "") + + places = settings.CURRENCY_PLACES.get(currency, 2) + minimum_unit = Decimal('1') / 10 ** places + changed = [] + + if rounding_mode == "sum_by_net": + for (tax_rate, tax_code), lines in groupby(sorted(lines, key=_key), key=_key): + lines = list(sorted(lines, key=lambda l: -l.gross_price_before_rounding)) + + # Compute the net and gross total of the line-based computation method + net_total = sum(l.net_price_before_rounding for l in lines) + gross_total = sum(l.gross_price_before_rounding for l in lines) + + # Compute the gross total we need to achieve based on the net total + target_gross_total = round_decimal((net_total * (1 + tax_rate / 100)), currency) + + # Add/subtract the smallest possible from both gross prices and tax values (so net values stay the same) + # until the values align + diff = target_gross_total - gross_total + diff_sgn = -1 if diff < 0 else 1 + for l in lines: + if diff: + apply_diff = diff_sgn * minimum_unit + l.price = l.gross_price_before_rounding + apply_diff + l.price_includes_rounding_correction = apply_diff + l.tax_value = l.tax_value_before_rounding + apply_diff + l.tax_value_includes_rounding_correction = apply_diff + diff -= apply_diff + changed.append(l) + elif l.price_includes_rounding_correction or l.tax_value_includes_rounding_correction: + l.price = l.gross_price_before_rounding + l.price_includes_rounding_correction = Decimal("0.00") + l.tax_value = l.tax_value_before_rounding + l.tax_value_includes_rounding_correction = Decimal("0.00") + changed.append(l) + + elif rounding_mode == "sum_by_net_keep_gross": + for (tax_rate, tax_code), lines in groupby(sorted(lines, key=_key), key=_key): + lines = list(sorted(lines, key=lambda l: -l.gross_price_before_rounding)) + + # Compute the net and gross total of the line-based computation method + net_total = sum(l.net_price_before_rounding for l in lines) + gross_total = sum(l.gross_price_before_rounding for l in lines) + + # Compute the net total that would yield the correct gross total (if possible) + target_net_total = round_decimal(gross_total - (gross_total * (1 - 100 / (100 + tax_rate))), currency) + + # Compute the gross total that would be computed from that net total – this will be different than + # gross_total when there is no possible net value for the gross total + # e.g. 99.99 at 19% is impossible since 84.03 + 19% = 100.00 and 84.02 + 19% = 99.98 + target_gross_total = round_decimal((target_net_total * (1 + tax_rate / 100)), currency) + + diff_gross = target_gross_total - gross_total + diff_net = target_net_total - net_total + diff_gross_sgn = -1 if diff_gross < 0 else 1 + diff_net_sgn = -1 if diff_net < 0 else 1 + for l in lines: + if diff_gross: + apply_diff = diff_gross_sgn * minimum_unit + l.price = l.gross_price_before_rounding + apply_diff + l.price_includes_rounding_correction = apply_diff + l.tax_value = l.tax_value_before_rounding + apply_diff + l.tax_value_includes_rounding_correction = apply_diff + changed.append(l) + diff_gross -= apply_diff + elif diff_net: + apply_diff = diff_net_sgn * minimum_unit + l.price = l.gross_price_before_rounding + l.price_includes_rounding_correction = Decimal("0.00") + l.tax_value = l.tax_value_before_rounding - apply_diff + l.tax_value_includes_rounding_correction = -apply_diff + changed.append(l) + diff_net -= apply_diff + elif l.price_includes_rounding_correction or l.tax_value_includes_rounding_correction: + l.price = l.gross_price_before_rounding + l.price_includes_rounding_correction = Decimal("0.00") + l.tax_value = l.tax_value_before_rounding + l.tax_value_includes_rounding_correction = Decimal("0.00") + changed.append(l) + + elif rounding_mode == "line": + for l in lines: + if l.price_includes_rounding_correction or l.tax_value_includes_rounding_correction: + l.price = l.gross_price_before_rounding + l.price_includes_rounding_correction = Decimal("0.00") + l.tax_value = l.tax_value_before_rounding + l.tax_value_includes_rounding_correction = Decimal("0.00") + changed.append(l) + + else: + raise ValueError("Unknown rounding_mode") + + return changed diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 3bf4ead9e..c2422fe69 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -40,6 +40,7 @@ from datetime import datetime from decimal import Decimal from typing import Any +import pycountry from django import forms from django.conf import settings from django.core.exceptions import ValidationError @@ -77,6 +78,13 @@ from pretix.control.forms import ( ) from pretix.helpers.countries import CachedCountries +ROUNDING_MODES = ( + ('line', _('Compute taxes for every line individually')), + ('sum_by_net', _('Compute taxes based on net total')), + ('sum_by_net_keep_gross', _('Compute taxes based on net total with stable gross prices')), + # We could also have sum_by_gross, but we're not aware of any use-cases for it +) + def country_choice_kwargs(): allcountries = list(CachedCountries()) @@ -324,7 +332,7 @@ DEFAULTS = { 'form_class': forms.BooleanField, 'serializer_class': serializers.BooleanField, 'form_kwargs': dict( - label=_("Show net prices instead of gross prices in the product list (not recommended!)"), + label=_("Show net prices instead of gross prices in the product list"), help_text=_("Independent of your choice, the cart will show gross prices as this is the price that needs to be " "paid."), @@ -465,6 +473,25 @@ DEFAULTS = { widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_settings-order_phone_asked'}), ) }, + 'tax_rounding': { + 'default': 'line', + 'type': str, + 'form_class': forms.ChoiceField, + 'serializer_class': serializers.ChoiceField, + 'form_kwargs': dict( + label=_("Rounding of taxes"), + widget=forms.RadioSelect, + choices=ROUNDING_MODES, + help_text=_( + "Note that if you transfer your sales data from pretix to an external system for tax reporting, you " + "need to make sure to account for possible rounding differences if your external system rounds " + "differently than pretix." + ) + ), + 'serializer_kwargs': dict( + choices=ROUNDING_MODES, + ), + }, 'invoice_address_asked': { 'default': 'True', 'type': bool, @@ -663,6 +690,7 @@ DEFAULTS = { label=_("Minimum length of invoice number after prefix"), help_text=_("The part of your invoice number after your prefix will be filled up with leading zeros up to this length, e.g. INV-001 or INV-00001."), max_value=12, + min_value=1, required=True, ) }, @@ -698,8 +726,9 @@ DEFAULTS = { message=lazy(lambda *args: _('Please only use the characters {allowed} in this field.').format( allowed='A-Z, a-z, 0-9, -./:#' ), str)() - ) + ), ], + max_length=155, ) }, 'invoice_numbers_prefix_cancellations': { @@ -720,8 +749,9 @@ DEFAULTS = { message=lazy(lambda *args: _('Please only use the characters {allowed} in this field.').format( allowed='A-Z, a-z, 0-9, -./:#' ), str)() - ) + ), ], + max_length=155, ) }, 'invoice_renderer_highlight_order_code': { @@ -1176,6 +1206,7 @@ DEFAULTS = { 'form_class': forms.CharField, 'serializer_class': serializers.CharField, 'form_kwargs': dict( + max_length=190, label=_("Company name"), ) }, @@ -1189,6 +1220,7 @@ DEFAULTS = { 'placeholder': '12345' }), label=_("ZIP code"), + max_length=190, ) }, 'invoice_address_from_city': { @@ -1201,15 +1233,35 @@ DEFAULTS = { 'placeholder': _('Random City') }), label=_("City"), + max_length=190, ) }, + 'invoice_address_from_state': { + 'default': '', + 'type': str, + 'form_class': forms.ChoiceField, + 'serializer_class': serializers.ChoiceField, + 'serializer_kwargs': { + 'choices': [('', '')], + }, + 'form_kwargs': { + "label": pgettext_lazy('address', 'State'), + 'choices': [('', '')], + }, + }, 'invoice_address_from_country': { 'default': '', 'type': str, 'form_class': forms.ChoiceField, 'serializer_class': serializers.ChoiceField, 'serializer_kwargs': lambda: dict(**country_choice_kwargs()), - 'form_kwargs': lambda: dict(label=_('Country'), **country_choice_kwargs()), + 'form_kwargs': lambda: dict( + label=_('Country'), + widget=forms.Select(attrs={ + 'data-trigger-address-info': 'on', + }), + **country_choice_kwargs() + ), }, 'invoice_address_from_tax_id': { 'default': '', @@ -1218,7 +1270,8 @@ DEFAULTS = { 'serializer_class': serializers.CharField, 'form_kwargs': dict( label=_("Domestic tax ID"), - help_text=_("e.g. tax number in Germany, ABN in Australia, …") + help_text=_("e.g. tax number in Germany, ABN in Australia, …"), + max_length=190, ) }, 'invoice_address_from_vat_id': { @@ -1228,6 +1281,7 @@ DEFAULTS = { 'serializer_class': serializers.CharField, 'form_kwargs': dict( label=_("EU VAT ID"), + max_length=190, ) }, 'invoice_introductory_text': { @@ -3945,6 +3999,20 @@ def validate_event_settings(event, settings_dict): raise ValidationError({ 'invoice_address_company_required': _('You have to require invoice addresses to require for company names.') }) + if settings_dict.get('invoice_address_from_state') and settings_dict.get('invoice_address_from_country'): + cc = str(settings_dict.get('invoice_address_from_country')) + if cc not in COUNTRIES_WITH_STATE_IN_ADDRESS: + raise ValidationError( + {'invoice_address_from_state': ['States are not supported in country "{}".'.format(cc)]} + ) + if not pycountry.subdivisions.get(code=cc + '-' + settings_dict.get('invoice_address_from_state')): + raise ValidationError( + {'invoice_address_from_state': [ + '"{}" is not a known subdivision of the country "{}".'.format( + settings_dict.get('invoice_address_from_state'), cc + ) + ]} + ) payment_term_last = settings_dict.get('payment_term_last') if payment_term_last and event.presale_end: diff --git a/src/pretix/base/templatetags/rich_text.py b/src/pretix/base/templatetags/rich_text.py index f38cdeab8..954e093ff 100644 --- a/src/pretix/base/templatetags/rich_text.py +++ b/src/pretix/base/templatetags/rich_text.py @@ -44,6 +44,7 @@ from django.conf import settings from django.core import signing from django.urls import reverse from django.utils.functional import SimpleLazyObject +from django.utils.html import escape from django.utils.http import url_has_allowed_host_and_scheme from django.utils.safestring import mark_safe from markdown import Extension @@ -52,6 +53,8 @@ from markdown.postprocessors import Postprocessor from markdown.treeprocessors import UnescapeTreeprocessor from tlds import tld_set +from pretix.helpers.format import SafeFormatter, format_map + register = template.Library() @@ -321,27 +324,44 @@ class LinkifyAndCleanExtension(Extension): ) -def markdown_compile_email(source, allowed_tags=ALLOWED_TAGS, allowed_attributes=ALLOWED_ATTRIBUTES): +def markdown_compile_email(source, allowed_tags=None, allowed_attributes=ALLOWED_ATTRIBUTES, snippet=False, context=None): + if allowed_tags is None: + allowed_tags = ALLOWED_TAGS_SNIPPET if snippet else ALLOWED_TAGS + + context_callbacks = [] + if context: + # This is a workaround to fix placeholders in URL targets + def context_callback(attrs, new=False): + if (None, "href") in attrs and "{" in attrs[None, "href"]: + # Do not use MODE_RICH_TO_HTML to avoid recursive linkification + attrs[None, "href"] = escape(format_map(attrs[None, "href"], context=context, mode=SafeFormatter.MODE_RICH_TO_PLAIN)) + return attrs + + context_callbacks.append(context_callback) + linker = bleach.Linker( url_re=URL_RE, email_re=EMAIL_RE, - callbacks=DEFAULT_CALLBACKS + [truelink_callback, abslink_callback], + callbacks=context_callbacks + DEFAULT_CALLBACKS + [truelink_callback, abslink_callback], parse_email=True ) + exts = [ + 'markdown.extensions.sane_lists', + 'markdown.extensions.tables', + EmailNl2BrExtension(), + LinkifyAndCleanExtension( + linker, + tags=set(allowed_tags), + attributes=allowed_attributes, + protocols=ALLOWED_PROTOCOLS, + strip=snippet, + ) + ] + if snippet: + exts.append(SnippetExtension()) return markdown.markdown( source, - extensions=[ - 'markdown.extensions.sane_lists', - 'markdown.extensions.tables', - EmailNl2BrExtension(), - LinkifyAndCleanExtension( - linker, - tags=set(allowed_tags), - attributes=allowed_attributes, - protocols=ALLOWED_PROTOCOLS, - strip=False, - ) - ] + extensions=exts ) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 2c67d74b6..8402d35e2 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -42,7 +42,6 @@ import pycountry from django import forms from django.conf import settings from django.core.exceptions import NON_FIELD_ERRORS, ValidationError -from django.core.validators import MaxValueValidator from django.db.models import Prefetch, Q, prefetch_related_objects from django.forms import formset_factory, inlineformset_factory from django.urls import reverse @@ -67,8 +66,9 @@ from pretix.base.models.tax import TAX_CODE_LISTS from pretix.base.reldate import RelativeDateField, RelativeDateTimeField from pretix.base.services.placeholders import FormPlaceholderMixin from pretix.base.settings import ( - COUNTRIES_WITH_STATE_IN_ADDRESS, DEFAULTS, PERSON_NAME_SCHEMES, - PERSON_NAME_TITLE_GROUPS, validate_event_settings, + COUNTRIES_WITH_STATE_IN_ADDRESS, COUNTRY_STATE_LABEL, DEFAULTS, + PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, ROUNDING_MODES, + validate_event_settings, ) from pretix.base.validators import multimail_validate from pretix.control.forms import ( @@ -373,6 +373,13 @@ class EventUpdateForm(I18nModelForm): super().__init__(*args, **kwargs) if not self.change_slug: self.fields['slug'].widget.attrs['readonly'] = 'readonly' + + if self.instance.orders.exists(): + self.fields['currency'].disabled = True + self.fields['currency'].help_text = _( + 'The currency cannot be changed because orders already exist.' + ) + self.fields['location'].widget.attrs['rows'] = '3' self.fields['location'].widget.attrs['placeholder'] = _( 'Sample Conference Center\nHeidelberg, Germany' @@ -541,7 +548,6 @@ class EventSettingsForm(EventSettingsValidationMixin, FormPlaceholderMixin, Sett 'show_date_to', 'show_times', 'show_items_outside_presale_period', - 'display_net_prices', 'hide_prices_from_attendees', 'presale_start_show_date', 'locales', @@ -799,6 +805,80 @@ class PaymentSettingsForm(EventSettingsValidationMixin, SettingsForm): return value +class DisplayNetPricesBooleanSelect(forms.RadioSelect): + def __init__(self, attrs=None): + choices = ( + ("false", format_html( + '{}
{}', + _("Prices including tax"), + _("Recommended if you sell tickets at least partly to consumers.") + )), + ("true", format_html( + '{}
{}', + _("Prices excluding tax"), + _("Recommended only if you sell tickets primarily to business customers.") + )), + ) + super().__init__(attrs, choices) + + def format_value(self, value): + try: + return { + True: "true", + False: "false", + "true": "true", + "false": "false", + }[value] + except KeyError: + return "unknown" + + def value_from_datadict(self, data, files, name): + value = data.get(name) + return { + True: True, + "True": True, + "False": False, + False: False, + "true": True, + "false": False, + }.get(value) + + +class TaxSettingsForm(EventSettingsValidationMixin, SettingsForm): + auto_fields = [ + 'display_net_prices', + 'tax_rounding', + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["display_net_prices"].label = _("Prices shown to customer") + self.fields["display_net_prices"].widget = DisplayNetPricesBooleanSelect() + help_text = { + "line": _( + "Recommended when e-invoicing is not required. Each product will be sold with the advertised " + "net and gross price. However, in orders of more than one product, the total tax amount " + "can differ from when it would be computed from the order total." + ), + "sum_by_net": _( + "Recommended for e-invoicing when you primarily sell to business customers and " + "show prices to customers excluding tax. " + "The gross price of some products may be changed to ensure correct rounding, while the net " + "prices will be kept as configured. This may cause the actual payment amount to differ." + ), + "sum_by_net_keep_gross": _( + "Recommended for e-invoicing when you primarily sell to consumers. " + "The gross or net price of some products may be changed automatically to ensure correct " + "rounding of the order total. The system attempts to keep gross prices as configured whenever " + "possible. Gross prices may still change if they are impossible to derive from a rounded net price." + ), + } + self.fields["tax_rounding"].choices = ( + (k, format_html('{}
{}', v, help_text.get(k, ""))) + for k, v in ROUNDING_MODES + ) + + class ProviderForm(SettingsForm): """ This is a SettingsForm, but if fields are set to required=True, validation @@ -872,6 +952,7 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm): 'invoice_address_from', 'invoice_address_from_zipcode', 'invoice_address_from_city', + 'invoice_address_from_state', 'invoice_address_from_country', 'invoice_address_from_tax_id', 'invoice_address_from_vat_id', @@ -918,8 +999,6 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm): self.fields['invoice_generate_sales_channels'].choices = ( (c.identifier, c.label) for c in event.organizer.sales_channels.all() ) - self.fields['invoice_numbers_counter_length'].validators.append(MaxValueValidator(15)) - pps = [str(pp.verbose_name) for pp in event.get_payment_providers().values() if pp.requires_invoice_immediately] if pps: generate_paid_help_text = _('An invoice will be issued before payment if the customer selects one of the following payment methods: {list}').format( @@ -944,6 +1023,26 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm): (a, a) for a in get_fonts(event, pdf_support_required=True).keys() ] + if 'invoice_address_from_country' in self.data: + cc = str(self.data['invoice_address_from_country']) + elif 'invoice_address_from_country' in self.initial: + cc = str(self.initial['invoice_address_from_country']) + else: + cc = self.obj.settings.invoice_address_from_country + c = [('', '---')] + state_label = pgettext_lazy('address', 'State') + if cc and cc in COUNTRIES_WITH_STATE_IN_ADDRESS: + types, form = COUNTRIES_WITH_STATE_IN_ADDRESS[cc] + statelist = [s for s in pycountry.subdivisions.get(country_code=cc) if s.type in types] + c += sorted([(s.code[3:], s.name) for s in statelist], key=lambda s: s[1]) + if cc in COUNTRY_STATE_LABEL: + state_label = COUNTRY_STATE_LABEL[cc] + elif 'invoice_address_from_state' in self.data: + self.data = self.data.copy() + del self.data['invoice_address_from_state'] + self.fields['invoice_address_from_state'].choices = c + self.fields['invoice_address_from_state'].label = state_label + def contains_web_channel_validate(val): if "web" not in val: @@ -1527,7 +1626,10 @@ class TaxRuleLineForm(I18nForm): rate = forms.DecimalField( label=_('Deviating tax rate'), max_digits=10, decimal_places=2, - required=False + required=False, + widget=forms.NumberInput(attrs={ + 'placeholder': _('Deviating tax rate'), + }) ) invoice_text = I18nFormField( label=_('Text on invoice'), @@ -1762,7 +1864,11 @@ class QuickSetupForm(I18nForm): self.fields['payment_banktransfer_bank_details'].required = False for f in self.fields.values(): if 'data-required-if' in f.widget.attrs: - del f.widget.attrs['data-required-if'] + f.widget.attrs['data-required-if'] += ",#id_payment_banktransfer__enabled" + + self.fields['payment_banktransfer_bank_details'].widget.attrs["data-required-if"] = ( + "#id_payment_banktransfer_bank_details_type_1,#id_payment_banktransfer__enabled" + ) def clean(self): cleaned_data = super().clean() diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 5d0e5140a..6d5b8f179 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -56,7 +56,8 @@ from i18nfield.forms import I18nFormField, I18nTextarea from pretix.base.forms import I18nFormSet, I18nMarkdownTextarea, I18nModelForm from pretix.base.forms.widgets import DatePickerWidget from pretix.base.models import ( - Item, ItemCategory, ItemVariation, Question, QuestionOption, Quota, + Item, ItemCategory, ItemProgramTime, ItemVariation, Question, + QuestionOption, Quota, ) from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue from pretix.base.signals import item_copy_data @@ -572,6 +573,8 @@ class ItemCreateForm(I18nModelForm): for b in self.cleaned_data['copy_from'].bundles.all(): instance.bundles.create(bundled_item=b.bundled_item, bundled_variation=b.bundled_variation, count=b.count, designated_price=b.designated_price) + for pt in self.cleaned_data['copy_from'].program_times.all(): + instance.program_times.create(start=pt.start, end=pt.end) item_copy_data.send(sender=self.event, source=self.cleaned_data['copy_from'], target=instance) @@ -1321,3 +1324,49 @@ class ItemMetaValueForm(forms.ModelForm): widgets = { 'value': forms.TextInput() } + + +class ItemProgramTimeFormSet(I18nFormSet): + template = "pretixcontrol/item/include_program_times.html" + title = _('Program times') + + def _construct_form(self, i, **kwargs): + kwargs['event'] = self.event + return super()._construct_form(i, **kwargs) + + @property + def empty_form(self): + self.is_valid() + form = self.form( + auto_id=self.auto_id, + prefix=self.add_prefix('__prefix__'), + empty_permitted=True, + use_required_attribute=False, + locales=self.locales, + event=self.event + ) + self.add_fields(form, None) + return form + + +class ItemProgramTimeForm(I18nModelForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['end'].widget.attrs['data-date-after'] = '#id_{prefix}-start_0'.format(prefix=self.prefix) + + class Meta: + model = ItemProgramTime + localized_fields = '__all__' + fields = [ + 'start', + 'end', + ] + field_classes = { + 'start': forms.SplitDateTimeField, + 'end': forms.SplitDateTimeField, + } + widgets = { + 'start': SplitDateTimePickerWidget(), + 'end': SplitDateTimePickerWidget(), + } diff --git a/src/pretix/control/forms/users.py b/src/pretix/control/forms/users.py index 7f813a13d..27dd3d6d4 100644 --- a/src/pretix/control/forms/users.py +++ b/src/pretix/control/forms/users.py @@ -69,6 +69,7 @@ class UserEditForm(forms.ModelForm): 'email', 'require_2fa', 'is_active', + 'is_verified', 'is_staff', 'needs_password_change', 'last_login' diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 5138b7b7c..63f8d3069 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -308,8 +308,8 @@ class VoucherBulkForm(VoucherForm): ) Recipient = namedtuple('Recipient', 'email number name tag') - def _set_field_placeholders(self, fn, base_parameters): - placeholders = get_available_placeholders(self.instance.event, base_parameters) + def _set_field_placeholders(self, fn, base_parameters, rich=False): + placeholders = get_available_placeholders(self.instance.event, base_parameters, rich=rich) ht = format_placeholders_help_text(placeholders, self.instance.event) if self.fields[fn].help_text: @@ -345,7 +345,7 @@ class VoucherBulkForm(VoucherForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._set_field_placeholders('send_subject', ['event', 'name']) - self._set_field_placeholders('send_message', ['event', 'voucher_list', 'name']) + self._set_field_placeholders('send_message', ['event', 'voucher_list', 'name'], rich=True) with language(self.instance.event.settings.locale, self.instance.event.settings.region): for f in ("send_subject", "send_message"): diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 552d07518..28484710a 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -582,6 +582,7 @@ class CoreOrderLogEntryType(OrderLogEntryType): 'The voucher has been set to expire because the recipient removed themselves from the waiting list.'), 'pretix.voucher.changed': _('The voucher has been changed.'), 'pretix.voucher.deleted': _('The voucher has been deleted.'), + 'pretix.voucher.carts.deleted': _('Cart positions including the voucher have been deleted.'), 'pretix.voucher.added.waitinglist': _('The voucher has been assigned to {email} through the waiting list.'), }) class CoreVoucherLogEntryType(VoucherLogEntryType): @@ -667,6 +668,14 @@ class UserSettingsChangedLogEntryType(LogEntryType): return text +@log_entry_types.new_from_dict({ + 'pretix.user.email.changed': _('Your email address has been changed from {old_email} to {email}.'), + 'pretix.user.email.confirmed': _('Your email address {email} has been confirmed.'), +}) +class UserEmailChangedLogEntryType(LogEntryType): + pass + + class UserImpersonatedLogEntryType(LogEntryType): def display(self, logentry, data): return self.plain.format(data['other_email']) @@ -882,6 +891,9 @@ class EventPluginStateLogEntryType(EventLogEntryType): 'pretix.event.item.bundles.added': _('A bundled item has been added to this product.'), 'pretix.event.item.bundles.removed': _('A bundled item has been removed from this product.'), 'pretix.event.item.bundles.changed': _('A bundled item has been changed on this product.'), + 'pretix.event.item.program_times.added': _('A program time has been added to this product.'), + 'pretix.event.item.program_times.changed': _('A program time has been changed on this product.'), + 'pretix.event.item.program_times.removed': _('A program time has been removed from this product.'), }) class CoreItemLogEntryType(ItemLogEntryType): pass diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 9694e88de..9b0215265 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -72,7 +72,7 @@ class PermissionMiddleware: ) EXCEPTIONS_FORCED_PW_CHANGE = ( - "user.settings", + "user.settings.password.change", "auth.logout" ) @@ -139,7 +139,7 @@ class PermissionMiddleware: return redirect_to_url(reverse('control:user.reauth') + '?next=' + quote(request.get_full_path())) except SessionPasswordChangeRequired: if url_name not in self.EXCEPTIONS_FORCED_PW_CHANGE: - return redirect_to_url(reverse('control:user.settings') + '?next=' + quote(request.get_full_path())) + return redirect_to_url(reverse('control:user.settings.password.change') + '?next=' + quote(request.get_full_path())) except Session2FASetupRequired: if url_name not in self.EXCEPTIONS_2FA: return redirect_to_url(reverse('control:user.settings.2fa')) diff --git a/src/pretix/control/navigation.py b/src/pretix/control/navigation.py index 99bdd8654..c3a0cbb8f 100644 --- a/src/pretix/control/navigation.py +++ b/src/pretix/control/navigation.py @@ -86,7 +86,7 @@ def get_event_navigation(request: HttpRequest): 'active': url.url_name == 'event.settings.mail', }, { - 'label': _('Tax rules'), + 'label': _('Taxes'), 'url': reverse('control:event.settings.tax', kwargs={ 'event': request.event.slug, 'organizer': request.event.organizer.slug, diff --git a/src/pretix/control/templates/pretixcontrol/auth/recover.html b/src/pretix/control/templates/pretixcontrol/auth/recover.html index 1caf09032..a99bd6f79 100644 --- a/src/pretix/control/templates/pretixcontrol/auth/recover.html +++ b/src/pretix/control/templates/pretixcontrol/auth/recover.html @@ -7,6 +7,7 @@

{% trans "Set new password" %}

{% csrf_token %} {% bootstrap_form_errors form type='all' layout='inline' %} + {% bootstrap_field form.email %} {% bootstrap_field form.password %} {% bootstrap_field form.password_repeat %}
diff --git a/src/pretix/control/templates/pretixcontrol/email/confirmation_code.txt b/src/pretix/control/templates/pretixcontrol/email/confirmation_code.txt new file mode 100644 index 000000000..5ac75436d --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/email/confirmation_code.txt @@ -0,0 +1,13 @@ +{% load i18n %}{% blocktrans with url=url|safe messages=messages|safe %}Hello, + +{{ reason }} + + {{ code }} + +Please do never give this code to another person. Our support team will never ask for this code. + +If this code was not requested by you, please contact us immediately. + +Best regards, +Your pretix team +{% endblocktrans %} diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index 52d9a7e9b..0b9751dfd 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -49,13 +49,14 @@ {% bootstrap_field form.invoice_address_custom_field_helptext layout="control" %} {% bootstrap_field form.invoice_address_explanation_text layout="control" %} -
+
{% trans "Issuer details" %} {% bootstrap_field form.invoice_address_from_name layout="control" %} {% bootstrap_field form.invoice_address_from layout="control" %} {% bootstrap_field form.invoice_address_from_zipcode layout="control" %} {% bootstrap_field form.invoice_address_from_city layout="control" %} {% bootstrap_field form.invoice_address_from_country layout="control" %} + {% bootstrap_field form.invoice_address_from_state layout="control" %} {% bootstrap_field form.invoice_address_from_tax_id layout="control" %} {% bootstrap_field form.invoice_address_from_vat_id layout="control" %}
diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 3a90aef7c..8d9a46f73 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -243,7 +243,6 @@ {% bootstrap_field sform.show_times layout="control" %}

{% trans "Product list" %}

{% bootstrap_field sform.show_quota_left layout="control" %} - {% bootstrap_field sform.display_net_prices layout="control" %} {% bootstrap_field sform.show_variations_expanded layout="control" %} {% bootstrap_field sform.hide_sold_out layout="control" %} diff --git a/src/pretix/control/templates/pretixcontrol/event/tax.html b/src/pretix/control/templates/pretixcontrol/event/tax.html new file mode 100644 index 000000000..9a58c7540 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/event/tax.html @@ -0,0 +1,120 @@ +{% extends "pretixcontrol/event/settings_base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Taxes" %}{% endblock %} +{% block inside %} +

{% trans "Taxes" %}

+ {% bootstrap_form_errors form layout="control" %} +
+ {% trans "Tax rules" %} +

+ {% blocktrans trimmed %} + Tax rules define different taxation scenarios that can then be assigned to the individual products. + Each tax rule contains a default tax rate and can optionally contain additional rules that depend + on the customer's country and type. + {% endblocktrans %} +

+ + {% if taxrules|length == 0 %} +
+

+ {% blocktrans trimmed %} + You haven't created any tax rules yet. + {% endblocktrans %} +

+ + {% trans "Create a new tax rule" %} +
+ {% else %} +
+ + + + + + + + + + + + {% for tr in taxrules %} + + + + + + + + {% endfor %} + + + + + + +
{% trans "Name" %}{% trans "Default" %}{% trans "Usage" %}{% trans "Rate" %}
+ + {{ tr.internal_name|default:tr.name }} + + + {% if tr.default %} + + + {% trans "Default" %} + + {% else %} +
+ {% csrf_token %} + +
+ {% endif %} +
+ {% blocktrans trimmed count count=tr.c_items %} + {{ count }} product + {% plural %} + {{ count }} products + {% endblocktrans %} + + {% if tr.price_includes_tax %} + {% blocktrans with rate=tr.rate %}incl. {{ rate }} %{% endblocktrans %} + {% else %} + {% blocktrans with rate=tr.rate %}excl. {{ rate }} %{% endblocktrans %} + {% endif %} + {% if tr.has_custom_rules %} +
{% trans "with custom rules" %} + {% elif tr.eu_reverse_charge %} +
{% trans "reverse charge enabled" %} + {% endif %} +
+ + +
+ {% trans "Create a new tax rule" %} + +
+
+ {% endif %} +
+
+ {% csrf_token %} +
+ {% trans "Tax settings" %} + {% bootstrap_field form.tax_rounding layout="control" %} + {% bootstrap_field form.display_net_prices layout="control" %} +
+
+ +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/event/tax_index.html b/src/pretix/control/templates/pretixcontrol/event/tax_index.html deleted file mode 100644 index 19123adb1..000000000 --- a/src/pretix/control/templates/pretixcontrol/event/tax_index.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "pretixcontrol/event/settings_base.html" %} -{% load i18n %} -{% block title %}{% trans "Tax rules" %}{% endblock %} -{% block inside %} -

{% trans "Tax rules" %}

- {% if taxrules|length == 0 %} -
-

- {% blocktrans trimmed %} - You haven't created any tax rules yet. - {% endblocktrans %} -

- - {% trans "Create a new tax rule" %} -
- {% else %} -

- {% trans "Create a new tax rule" %} - -

-
- - - - - - - - - - - {% for tr in taxrules %} - - - - - - - {% endfor %} - -
{% trans "Name" %}{% trans "Default" %}{% trans "Rate" %}
- - {{ tr.internal_name|default:tr.name }} - - - {% if tr.default %} - - - {% trans "Default" %} - - {% else %} -
- {% csrf_token %} - -
- {% endif %} -
- {% if tr.price_includes_tax %} - {% blocktrans with rate=tr.rate%}incl. {{ rate }} %{% endblocktrans %} - {% else %} - {% blocktrans with rate=tr.rate%}excl. {{ rate }} %{% endblocktrans %} - {% endif %} - {% if tr.eu_reverse_charge %} - ({% trans "reverse charge enabled" %}) - {% endif %} - - - -
-
- {% endif %} - {% include "pretixcontrol/pagination.html" %} -{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html b/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html deleted file mode 100644 index 23403ac1e..000000000 --- a/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html +++ /dev/null @@ -1,35 +0,0 @@ -{% load i18n %} -{% load bootstrap3 %} -{% load money %} -{% load rich_text %} - -{{ request.event.settings.payment_giftcard_public_description|rich_text }} -{% if customer_gift_cards %} -

- {% trans "Information" %} - {% trans "The following gift cards are available in your customer account:" %} -

-
- {% csrf_token %} -
    - {% for c in customer_gift_cards %} -
  • -
    - {{ c }} -
    -
    - {{ c.value|money:c.currency }} -
    -
    - -
    -
  • - {% endfor %} -
-
-{% endif %} -{% bootstrap_form form layout='checkout' %} diff --git a/src/pretix/control/templates/pretixcontrol/item/include_program_times.html b/src/pretix/control/templates/pretixcontrol/item/include_program_times.html new file mode 100644 index 000000000..e223a0eec --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/item/include_program_times.html @@ -0,0 +1,70 @@ +{% load i18n %} +{% load bootstrap3 %} +{% load formset_tags %} +

+ {% blocktrans trimmed %} + With program times, you can set specific dates and times for this product. + This is useful if this product represents access to parts of your event that happen at different times than your event in general. + This will not affect access control, but will affect calendar invites and ticket output. + {% endblocktrans %} +

+ +
+ {{ formset.management_form }} + {% bootstrap_formset_errors formset %} +
+ {% for form in formset %} +
+
+ {{ form.id }} + {% bootstrap_field form.DELETE form_group_class="" layout="inline" %} +
+
+
+
+

{% trans "Program time" %}

+
+
+ +
+
+
+
+ {% bootstrap_form_errors form %} + {% bootstrap_field form.start layout="control" %} + {% bootstrap_field form.end layout="control" %} +
+
+ {% endfor %} +
+ +

+ +

+
diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 889dc6fdf..2a1cada25 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -362,6 +362,11 @@ {% endif %} {% endif %} + {% if staff_session %} + + {% trans "Inspect" %} + + {% endif %} {% if forloop.revcounter0 > 0 %}
{% endif %} @@ -681,6 +686,16 @@ {% endif %} {% endif %} + {% if django_settings.DEBUG %} +
+ + price = {{ line.price|floatformat:2 }}
+ rounding_correction = {{ line.price_includes_rounding_correction|floatformat:2 }}
+ tax_value = {{ line.tax_value|floatformat:2 }}
+ tax_value_rounding_correction = {{ line.tax_value_includes_rounding_correction|floatformat:2 }}
+ voucher_budget_use = {{ line.voucher_budget_use|floatformat:2 }} +
+ {% endif %}
@@ -721,6 +736,16 @@ {% endif %} {% endif %} + {% if django_settings.DEBUG %} +
+ + price = {{ fee.value|floatformat:2 }}
+ rounding_correction = {{ fee.value_includes_rounding_correction|floatformat:2 }}
+ tax_value = {{ fee.tax_value|floatformat:2 }}
+ tax_value_rounding_correction = {{ fee.tax_value_includes_rounding_correction|floatformat:2 }}
+ voucher_budget_use = {{ fee.voucher_budget_use|floatformat:2 }} +
+ {% endif %}
@@ -749,6 +774,12 @@
{{ items.total|money:event.currency }} + {% if django_settings.DEBUG %} +
+ + tax_rounding_mode = {{ order.tax_rounding_mode }} + + {% endif %}
diff --git a/src/pretix/control/templates/pretixcontrol/order/transactions.html b/src/pretix/control/templates/pretixcontrol/order/transactions.html index 7d327de15..90431ec73 100644 --- a/src/pretix/control/templates/pretixcontrol/order/transactions.html +++ b/src/pretix/control/templates/pretixcontrol/order/transactions.html @@ -56,8 +56,26 @@ {{ t.get_tax_code_display }} {{ t.count }} × {{ t.price|money:request.event.currency }} - {{ t.full_tax_value|money:request.event.currency }} - {{ t.full_price|money:request.event.currency }} + + {{ t.full_tax_value|money:request.event.currency }} + {% if t.full_price_includes_rounding_correction %} +
+ {% blocktrans trimmed with amount=t.full_tax_value_includes_rounding_correction|money:request.event.currency %} + incl. {{ amount }} rounding correction + {% endblocktrans %} + + {% endif %} + + + {{ t.full_price|money:request.event.currency }} + {% if t.full_price_includes_rounding_correction %} +
+ {% blocktrans trimmed with amount=t.full_price_includes_rounding_correction|money:request.event.currency %} + incl. {{ amount }} rounding correction + {% endblocktrans %} + + {% endif %} + {% endfor %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/property_edit.html b/src/pretix/control/templates/pretixcontrol/organizers/property_edit.html index b697a8e8e..19c77991e 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/property_edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/property_edit.html @@ -91,6 +91,8 @@
+
diff --git a/src/pretix/control/templates/pretixcontrol/user/change_email.html b/src/pretix/control/templates/pretixcontrol/user/change_email.html new file mode 100644 index 000000000..1d6e56700 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/user/change_email.html @@ -0,0 +1,29 @@ +{% extends "pretixcontrol/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Change login email address" %}{% endblock %} +{% block content %} +
+

+ {% trans "Change login email address" %} +

+ {% csrf_token %} + {% bootstrap_form_errors form %} +

+ {% trans "This changes the email address used to login to your account, as well as where we send email notifications." %} +

+ {% bootstrap_field form.old_email %} + {% bootstrap_field form.new_email %} +

+ {% trans "We will send a confirmation code to your new email address, which you need to enter in the next step to confirm the email address is correct." %} +

+
+ + {% trans "Cancel" %} + + +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/user/change_password.html b/src/pretix/control/templates/pretixcontrol/user/change_password.html new file mode 100644 index 000000000..cdfe5bc5e --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/user/change_password.html @@ -0,0 +1,24 @@ +{% extends "pretixcontrol/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Change password" %}{% endblock %} +{% block content %} +
+

+ {% trans "Change password" %} +

+
+ {% csrf_token %} + {% bootstrap_form_errors form %} + {% bootstrap_field form.email %} + {% bootstrap_field form.old_pw %} + {% bootstrap_field form.new_pw %} + {% bootstrap_field form.new_pw_repeat %} +
+ {% trans "Cancel" %} + +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html b/src/pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html new file mode 100644 index 000000000..58bb2f653 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html @@ -0,0 +1,21 @@ +{% extends "pretixcontrol/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Enter confirmation code" %}{% endblock %} +{% block content %} +
+

+ {% trans "Enter confirmation code" %} +

+ {% csrf_token %} + {% bootstrap_form_errors form type='all' layout='inline' %} +

{{ message }}

+ {% bootstrap_field form.code %} +
+ {% trans "Cancel" %} + +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/user/settings.html b/src/pretix/control/templates/pretixcontrol/user/settings.html index 139bfcbd5..0a4c4701f 100644 --- a/src/pretix/control/templates/pretixcontrol/user/settings.html +++ b/src/pretix/control/templates/pretixcontrol/user/settings.html @@ -3,8 +3,26 @@ {% load bootstrap3 %} {% block title %}{% trans "Account settings" %}{% endblock %} {% block content %} +{% if not user.is_verified %} +
+

+ {% blocktrans trimmed %} + Your email address is not confirmed yet. To secure your account, please confirm your email address using + a confirmation code we will send to your email address. + {% endblocktrans %} +

+

+

+ {% csrf_token %} + +
+

+
+{% endif %}

{% trans "Account settings" %}

-
+ {% csrf_token %} {% bootstrap_form_errors form %}
@@ -13,7 +31,7 @@ {% bootstrap_field form.locale layout='horizontal' %} {% bootstrap_field form.timezone layout='horizontal' %}
- +
{% if request.user.notifications_send and request.user.notification_settings.exists %} @@ -41,8 +59,18 @@ {% bootstrap_field form.new_pw layout='horizontal' %} {% bootstrap_field form.new_pw_repeat layout='horizontal' %} {% endif %} + {% if user.auth_backend == 'native' %} +
+ + +
+ {% endif %}
- +
{% if user.require_2fa %} {% trans "Enabled" %}   @@ -58,7 +86,7 @@
- +
- +
diff --git a/src/pretix/control/templates/pretixcontrol/users/form.html b/src/pretix/control/templates/pretixcontrol/users/form.html index 6e0443b11..1f846bf8b 100644 --- a/src/pretix/control/templates/pretixcontrol/users/form.html +++ b/src/pretix/control/templates/pretixcontrol/users/form.html @@ -56,6 +56,7 @@ {% if form.new_pw %} {% bootstrap_field form.new_pw layout='control' %} {% bootstrap_field form.new_pw_repeat layout='control' %} + {% bootstrap_field form.is_verified layout='control' %} {% endif %} {% bootstrap_field form.last_login layout='control' %} {% bootstrap_field form.require_2fa layout='control' %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index feb3b6401..d310572e3 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -110,6 +110,10 @@ urlpatterns = [ name='user.settings.2fa.confirm.webauthn'), re_path(r'^settings/2fa/(?P[^/]+)/(?P[0-9]+)/delete', user.User2FADeviceDeleteView.as_view(), name='user.settings.2fa.delete'), + re_path(r'^settings/email/confirm$', user.UserEmailConfirmView.as_view(), name='user.settings.email.confirm'), + re_path(r'^settings/email/change$', user.UserEmailChangeView.as_view(), name='user.settings.email.change'), + re_path(r'^settings/email/verify', user.UserEmailVerifyView.as_view(), name='user.settings.email.send_verification_code'), + re_path(r'^settings/password/change$', user.UserPasswordChangeView.as_view(), name='user.settings.password.change'), re_path(r'^organizers/$', organizer.OrganizerList.as_view(), name='organizers'), re_path(r'^organizers/add$', organizer.OrganizerCreate.as_view(), name='organizers.add'), re_path(r'^organizers/select2$', typeahead.organizer_select2, name='organizers.select2'), @@ -290,7 +294,7 @@ urlpatterns = [ re_path(r'^settings/invoice$', event.InvoiceSettings.as_view(), name='event.settings.invoice'), re_path(r'^settings/invoice/preview$', event.InvoicePreview.as_view(), name='event.settings.invoice.preview'), re_path(r'^settings/display', event.DisplaySettings.as_view(), name='event.settings.display'), - re_path(r'^settings/tax/$', event.TaxList.as_view(), name='event.settings.tax'), + re_path(r'^settings/tax/$', event.TaxSettings.as_view(), name='event.settings.tax'), re_path(r'^settings/tax/(?P\d+)/$', event.TaxUpdate.as_view(), name='event.settings.tax.edit'), re_path(r'^settings/tax/add$', event.TaxCreate.as_view(), name='event.settings.tax.add'), re_path(r'^settings/tax/(?P\d+)/delete$', event.TaxDelete.as_view(), name='event.settings.tax.delete'), @@ -387,6 +391,8 @@ urlpatterns = [ name='event.order.retransmitinvoice'), re_path(r'^orders/(?P[0-9A-Z]+)/invoices/(?P\d+)/reissue$', orders.OrderInvoiceReissue.as_view(), name='event.order.reissueinvoice'), + re_path(r'^orders/(?P[0-9A-Z]+)/invoices/(?P\d+)/inspect$', orders.OrderInvoiceInspect.as_view(), + name='event.order.inspect'), re_path(r'^orders/(?P[0-9A-Z]+)/download/(?P\d+)/(?P[^/]+)/$', orders.OrderDownload.as_view(), name='event.order.download.ticket'), diff --git a/src/pretix/control/views/auth.py b/src/pretix/control/views/auth.py index b1b52985e..a1514de73 100644 --- a/src/pretix/control/views/auth.py +++ b/src/pretix/control/views/auth.py @@ -254,6 +254,9 @@ def invite(request, token): return redirect('control:index') else: with transaction.atomic(): + if request.user.email.lower() == inv.email.lower(): + request.user.is_verified = True + request.user.save(update_fields=['is_verified']) inv.team.members.add(request.user) inv.team.log_action( 'pretix.team.member.joined', data={ @@ -274,7 +277,8 @@ def invite(request, token): user = User.objects.create_user( form.cleaned_data['email'], form.cleaned_data['password'], locale=request.LANGUAGE_CODE, - timezone=request.timezone if hasattr(request, 'timezone') else settings.TIME_ZONE + timezone=request.timezone if hasattr(request, 'timezone') else settings.TIME_ZONE, + is_verified=form.cleaned_data['email'].lower() == inv.email.lower() ) user = authenticate(request=request, email=user.email, password=form.cleaned_data['password']) user.log_action('pretix.control.auth.user.created', user=user) diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index c72e81bb7..3a521eb54 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -54,7 +54,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import PermissionDenied from django.core.files import File from django.db import transaction -from django.db.models import ProtectedError +from django.db.models import Count, ProtectedError from django.forms import inlineformset_factory from django.http import ( Http404, HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed, @@ -90,7 +90,7 @@ from pretix.control.forms.event import ( EventFooterLinkFormset, EventMetaValueForm, EventSettingsForm, EventUpdateForm, InvoiceSettingsForm, ItemMetaPropertyForm, MailSettingsForm, PaymentSettingsForm, ProviderForm, QuickSetupForm, - QuickSetupProductFormSet, TaxRuleForm, TaxRuleLineFormSet, + QuickSetupProductFormSet, TaxRuleForm, TaxRuleLineFormSet, TaxSettingsForm, TicketSettingsForm, WidgetCodeForm, ) from pretix.control.permissions import EventPermissionRequiredMixin @@ -648,6 +648,25 @@ class PaymentSettings(EventSettingsViewMixin, EventSettingsFormView): return context +class TaxSettings(EventSettingsViewMixin, EventSettingsFormView): + template_name = 'pretixcontrol/event/tax.html' + form_class = TaxSettingsForm + permission = 'can_change_event_settings' + + def get_success_url(self) -> str: + return reverse('control:event.settings.tax', kwargs={ + 'organizer': self.request.organizer.slug, + 'event': self.request.event.slug, + }) + + def get_context_data(self, *args, **kwargs) -> dict: + context = super().get_context_data(*args, **kwargs) + context['taxrules'] = self.request.event.tax_rules.annotate( + c_items=Count("item") + ).all() + return context + + class InvoiceSettings(EventSettingsViewMixin, EventSettingsFormView): model = Event form_class = InvoiceSettingsForm @@ -1263,16 +1282,6 @@ class EventComment(EventPermissionRequiredMixin, View): }) -class TaxList(EventSettingsViewMixin, EventPermissionRequiredMixin, PaginationMixin, ListView): - model = TaxRule - context_object_name = 'taxrules' - template_name = 'pretixcontrol/event/tax_index.html' - permission = 'can_change_event_settings' - - def get_queryset(self): - return self.request.event.tax_rules.all() - - class TaxCreate(EventSettingsViewMixin, EventPermissionRequiredMixin, CreateView): model = TaxRule form_class = TaxRuleForm diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index f120a03d5..b0af1dda1 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -60,13 +60,14 @@ from django.views.generic.detail import DetailView, SingleObjectMixin from django_countries.fields import Country from pretix.api.serializers.item import ( - ItemAddOnSerializer, ItemBundleSerializer, ItemVariationSerializer, + ItemAddOnSerializer, ItemBundleSerializer, ItemProgramTimeSerializer, + ItemVariationSerializer, ) from pretix.base.forms import I18nFormSet from pretix.base.models import ( - CartPosition, Item, ItemCategory, ItemVariation, Order, OrderPosition, - Question, QuestionAnswer, QuestionOption, Quota, SeatCategoryMapping, - Voucher, + CartPosition, Item, ItemCategory, ItemProgramTime, 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 @@ -75,9 +76,9 @@ from pretix.base.services.tickets import invalidate_cache from pretix.base.signals import quota_availability from pretix.control.forms.item import ( CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm, - ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemUpdateForm, - ItemVariationForm, ItemVariationsFormSet, QuestionForm, QuestionOptionForm, - QuotaForm, + ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm, + ItemProgramTimeFormSet, ItemUpdateForm, ItemVariationForm, + ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaForm, ) from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, @@ -1431,7 +1432,8 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE form.instance.position = i setattr(form.instance, attr, self.get_object()) created = not form.instance.pk - form.save() + if form.has_changed(): + form.save() if form.has_changed() and any(a for a in form.changed_data if a != 'ORDER'): change_data = {k: form.cleaned_data.get(k) for k in form.changed_data} if key == 'variations': @@ -1497,6 +1499,16 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE 'bundles', 'bundles', 'base_item', order=False, serializer=ItemBundleSerializer ) + elif k == 'program_times': + self.save_formset( + 'program_times', 'program_times', order=False, + serializer=ItemProgramTimeSerializer + ) + if not change_data: + for f in v.forms: + if (f in v.deleted_forms and f.instance.pk) or f.has_changed(): + invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'item': self.object.pk}) + break else: v.save() @@ -1559,9 +1571,20 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE queryset=ItemBundle.objects.filter(base_item=self.get_object()), event=self.request.event, item=self.item, prefix="bundles" )), + ('program_times', inlineformset_factory( + Item, ItemProgramTime, + form=ItemProgramTimeForm, formset=ItemProgramTimeFormSet, + can_order=False, can_delete=True, extra=0 + )( + self.request.POST if self.request.method == "POST" else None, + queryset=ItemProgramTime.objects.filter(item=self.get_object()), + event=self.request.event, prefix="program_times" + )), ]) if not self.object.has_variations: del f['variations'] + if self.item.event.has_subevents: + del f['program_times'] i = 0 for rec, resp in item_formsets.send(sender=self.request.event, item=self.item, request=self.request): diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index aec42dea8..e6b498645 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -131,13 +131,16 @@ from pretix.control.forms.orders import ( ReactivateOrderForm, ) from pretix.control.forms.rrule import RRuleForm -from pretix.control.permissions import EventPermissionRequiredMixin +from pretix.control.permissions import ( + AdministratorPermissionRequiredMixin, EventPermissionRequiredMixin, +) from pretix.control.signals import order_search_forms from pretix.control.views import PaginationMixin from pretix.helpers import OF_SELF from pretix.helpers.compat import CompatDeleteView from pretix.helpers.format import SafeFormatter, format_map from pretix.helpers.hierarkey import clean_filename +from pretix.helpers.json import CustomJSONEncoder from pretix.helpers.safedownload import check_token from pretix.presale.signals import question_form_fields @@ -633,7 +636,9 @@ class OrderTransactions(OrderView): ctx['sums'] = self.order.transactions.aggregate( sum_count=Sum('count'), full_price=Sum(F('count') * F('price')), + full_price_includes_rounding_correction=Sum(F('count') * F('price_includes_rounding_correction')), full_tax_value=Sum(F('count') * F('tax_value')), + full_tax_value_includes_rounding_correction=Sum(F('count') * F('tax_value_includes_rounding_correction')), ) return ctx @@ -1750,6 +1755,25 @@ class OrderInvoiceReissue(OrderView): return HttpResponseNotAllowed(['POST']) +class OrderInvoiceInspect(AdministratorPermissionRequiredMixin, OrderView): + + def get(self, *args, **kwargs): # NOQA + inv = get_object_or_404(self.order.invoices, pk=kwargs.get('id')) + d = {"lines": []} + for f in inv._meta.fields: + v = getattr(inv, f.name) + d[f.name] = v + + for il in inv.lines.all(): + line = {} + for f in il._meta.fields: + v = getattr(il, f.name) + line[f.name] = v + d["lines"].append(line) + + return JsonResponse(d, encoder=CustomJSONEncoder) + + class OrderResendLink(OrderView): permission = 'can_change_orders' @@ -2144,7 +2168,8 @@ class OrderChange(OrderView): self.order, user=self.request.user, notify=notify, - reissue_invoice=self.other_form.cleaned_data['reissue_invoice'] if self.other_form.is_valid() else True + reissue_invoice=self.other_form.cleaned_data['reissue_invoice'] if self.other_form.is_valid() else True, + allow_blocked_seats=True, ) form_valid = (self._process_add_fees(ocm) and self._process_add_positions(ocm) and diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index 8b863f372..719fa4cd9 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -44,7 +44,9 @@ from pypdf.errors import PdfReadError from reportlab.lib.units import mm from pretix.base.i18n import language -from pretix.base.models import CachedFile, InvoiceAddress, OrderPosition +from pretix.base.models import ( + CachedFile, InvoiceAddress, ItemProgramTime, OrderPosition, +) from pretix.base.pdf import get_images, get_variables from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.control.permissions import EventPermissionRequiredMixin @@ -95,6 +97,9 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): description=_("Sample product description")) item2 = self.request.event.items.create(name=_("Sample workshop"), default_price=Decimal('23.40')) + ItemProgramTime.objects.create(start=now(), end=now(), item=item) + ItemProgramTime.objects.create(start=now(), end=now(), item=item2) + from pretix.base.models import Order order = self.request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), email='sample@pretix.eu', diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 5c8116ed0..16297d6e1 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -820,12 +820,13 @@ def organizer_select2(request): total = qs.count() pagesize = 20 offset = (page - 1) * pagesize + display_slug = 'display_slug' in request.GET doc = { "results": [ { 'id': o.pk, - 'text': str(o.name) + 'text': '{} — {}'.format(o.slug, o.name) if display_slug else str(o.name) } for o in qs[offset:offset + pagesize] ], "pagination": { diff --git a/src/pretix/control/views/user.py b/src/pretix/control/views/user.py index 2f325f134..89364f1f2 100644 --- a/src/pretix/control/views/user.py +++ b/src/pretix/control/views/user.py @@ -44,11 +44,13 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth import update_session_auth_hash from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import BadRequest, PermissionDenied from django.db import transaction from django.shortcuts import get_object_or_404, redirect from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.functional import cached_property +from django.utils.html import format_html from django.utils.http import url_has_allowed_host_and_scheme from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ @@ -60,8 +62,11 @@ from django_scopes import scopes_disabled from webauthn.helpers import generate_challenge, generate_user_handle from pretix.base.auth import get_auth_backends -from pretix.base.forms.auth import ReauthForm -from pretix.base.forms.user import User2FADeviceAddForm, UserSettingsForm +from pretix.base.forms.auth import ConfirmationCodeForm, ReauthForm +from pretix.base.forms.user import ( + User2FADeviceAddForm, UserEmailChangeForm, UserPasswordChangeForm, + UserSettingsForm, +) from pretix.base.models import ( Event, LogEntry, NotificationSetting, U2FDevice, User, WebAuthnDevice, ) @@ -237,25 +242,7 @@ class UserSettings(UpdateView): data = {} for k in form.changed_data: - if k not in ('old_pw', 'new_pw_repeat'): - if 'new_pw' == k: - data['new_pw'] = True - else: - data[k] = form.cleaned_data[k] - - msgs = [] - - if 'new_pw' in form.changed_data: - self.request.user.needs_password_change = False - msgs.append(_('Your password has been changed.')) - - if 'email' in form.changed_data: - msgs.append(_('Your email address has been changed to {email}.').format(email=form.cleaned_data['email'])) - - if msgs: - self.request.user.send_security_notice(msgs, email=form.cleaned_data['email']) - if self._old_email != form.cleaned_data['email']: - self.request.user.send_security_notice(msgs, email=self._old_email) + data[k] = form.cleaned_data[k] sup = super().form_valid(form) self.request.user.log_action('pretix.user.settings.changed', user=self.request.user, data=data) @@ -834,3 +821,159 @@ class EditStaffSession(StaffMemberRequiredMixin, UpdateView): return get_object_or_404(StaffSession, pk=self.kwargs['id']) else: return get_object_or_404(StaffSession, pk=self.kwargs['id'], user=self.request.user) + + +class UserPasswordChangeView(FormView): + max_time = 300 + + form_class = UserPasswordChangeForm + template_name = 'pretixcontrol/user/change_password.html' + + def get_form_kwargs(self): + if self.request.user.auth_backend != 'native': + raise PermissionDenied + + return { + **super().get_form_kwargs(), + "user": self.request.user, + } + + def form_valid(self, form): + with transaction.atomic(): + self.request.user.set_password(form.cleaned_data['new_pw']) + self.request.user.needs_password_change = False + self.request.user.save() + msgs = [] + msgs.append(_('Your password has been changed.')) + self.request.user.send_security_notice(msgs) + + self.request.user.log_action('pretix.user.settings.changed', user=self.request.user, data={'new_pw': True}) + + update_session_auth_hash(self.request, self.request.user) + + messages.success(self.request, _('Your changes have been saved.')) + return redirect(self.get_success_url()) + + def form_invalid(self, form): + messages.error(self.request, _('We could not save your changes. See below for details.')) + return super().form_invalid(form) + + def get_success_url(self): + if "next" in self.request.GET and url_has_allowed_host_and_scheme(self.request.GET.get("next"), allowed_hosts=None): + return self.request.GET.get("next") + return reverse('control:user.settings') + + +class UserEmailChangeView(RecentAuthenticationRequiredMixin, FormView): + max_time = 300 + + form_class = UserEmailChangeForm + template_name = 'pretixcontrol/user/change_email.html' + + def get_form_kwargs(self): + if self.request.user.auth_backend != 'native': + raise PermissionDenied + + return { + **super().get_form_kwargs(), + "user": self.request.user, + } + + def get_initial(self): + return { + "old_email": self.request.user.email + } + + def form_valid(self, form): + self.request.user.send_confirmation_code( + session=self.request.session, + reason='email_change', + email=form.cleaned_data['new_email'], + state=form.cleaned_data['new_email'], + ) + self.request.session['email_confirmation_destination'] = form.cleaned_data['new_email'] + return redirect(reverse('control:user.settings.email.confirm', kwargs={}) + '?reason=email_change') + + def form_invalid(self, form): + messages.error(self.request, _('We could not save your changes. See below for details.')) + return super().form_invalid(form) + + +class UserEmailVerifyView(View): + def post(self, request, *args, **kwargs): + if self.request.user.is_verified: + messages.success(self.request, _('Your email address was already verified.')) + return redirect(reverse('control:user.settings', kwargs={})) + + self.request.user.send_confirmation_code( + session=self.request.session, + reason='email_verify', + email=self.request.user.email, + state=self.request.user.email, + ) + self.request.session['email_confirmation_destination'] = self.request.user.email + return redirect(reverse('control:user.settings.email.confirm', kwargs={}) + '?reason=email_verify') + + +class UserEmailConfirmView(FormView): + form_class = ConfirmationCodeForm + template_name = 'pretixcontrol/user/confirmation_code_dialog.html' + + def get_context_data(self, **kwargs): + return { + **super().get_context_data(**kwargs), + "cancel_url": reverse('control:user.settings', kwargs={}), + "message": format_html( + _("Please enter the confirmation code we sent to your email address {email}."), + email=self.request.session.get('email_confirmation_destination', ''), + ), + } + + @transaction.atomic() + def form_valid(self, form): + reason = self.request.GET['reason'] + if reason not in ('email_change', 'email_verify'): + raise PermissionDenied + try: + new_email = self.request.user.check_confirmation_code( + session=self.request.session, + reason=reason, + code=form.cleaned_data['code'], + ) + except PermissionDenied: + return self.form_invalid(form) + except BadRequest: + messages.error(self.request, _( + 'We were unable to verify your confirmation code. Please try again.' + )) + return redirect(reverse('control:user.settings', kwargs={})) + + log_data = { + 'email': new_email, + 'email_verified': True, + } + if reason == 'email_change': + msgs = [] + msgs.append(_('Your email address has been changed to {email}.').format(email=new_email)) + log_data['old_email'] = old_email = self.request.user.email + self.request.user.send_security_notice(msgs, email=old_email) + self.request.user.send_security_notice(msgs, email=new_email) + log_action = 'pretix.user.email.changed' + else: + log_action = 'pretix.user.email.confirmed' + + self.request.user.email = new_email + self.request.user.is_verified = True + self.request.user.save() + self.request.user.log_action(log_action, user=self.request.user, data=log_data) + update_session_auth_hash(self.request, self.request.user) + + if reason == 'email_change': + messages.success(self.request, _('Your email address has been changed successfully.')) + else: + messages.success(self.request, _('Your email address has been confirmed successfully.')) + return redirect(reverse('control:user.settings', kwargs={})) + + def form_invalid(self, form): + messages.error(self.request, _('The entered confirmation code is not correct. Please try again.')) + return super().form_invalid(form) diff --git a/src/pretix/helpers/format.py b/src/pretix/helpers/format.py index 33549ed8b..a79b869e5 100644 --- a/src/pretix/helpers/format.py +++ b/src/pretix/helpers/format.py @@ -22,6 +22,8 @@ import logging from string import Formatter +from django.utils.html import conditional_escape + logger = logging.getLogger(__name__) @@ -40,14 +42,14 @@ class SafeFormatter(Formatter): Customized version of ``str.format`` that (a) behaves just like ``str.format_map`` and (b) does not allow any unwanted shenanigans like attribute access or format specifiers. """ - MODE_IGNORE_RICH = 0 MODE_RICH_TO_PLAIN = 1 MODE_RICH_TO_HTML = 2 - def __init__(self, context, raise_on_missing=False, mode=MODE_IGNORE_RICH): + def __init__(self, context, raise_on_missing=False, mode=MODE_RICH_TO_PLAIN, linkifier=None): self.context = context self.raise_on_missing = raise_on_missing self.mode = mode + self.linkifier = linkifier def get_field(self, field_name, args, kwargs): return self.get_value(field_name, args, kwargs), field_name @@ -55,22 +57,28 @@ class SafeFormatter(Formatter): def get_value(self, key, args, kwargs): if not self.raise_on_missing and key not in self.context: return '{' + str(key) + '}' - r = self.context[key] - if isinstance(r, PlainHtmlAlternativeString): - if self.mode == self.MODE_IGNORE_RICH: - return '{' + str(key) + '}' - elif self.mode == self.MODE_RICH_TO_PLAIN: - return r.plain + return self.context[key] + + def _prepare_value(self, value): + if isinstance(value, PlainHtmlAlternativeString): + if self.mode == self.MODE_RICH_TO_PLAIN: + return value.plain elif self.mode == self.MODE_RICH_TO_HTML: - return r.html - return r + return value.html + else: + value = str(value) + if self.mode == self.MODE_RICH_TO_HTML: + value = conditional_escape(value) + if self.linkifier: + value = self.linkifier.linkify(value) + return value def format_field(self, value, format_spec): # Ignore format_spec - return super().format_field(value, '') + return super().format_field(self._prepare_value(value), '') -def format_map(template, context, raise_on_missing=False, mode=SafeFormatter.MODE_IGNORE_RICH): +def format_map(template, context, raise_on_missing=False, mode=SafeFormatter.MODE_RICH_TO_PLAIN, linkifier=None): if not isinstance(template, str): template = str(template) - return SafeFormatter(context, raise_on_missing, mode=mode).format(template) + return SafeFormatter(context, raise_on_missing, mode=mode, linkifier=linkifier).format(template) diff --git a/src/pretix/helpers/json.py b/src/pretix/helpers/json.py index c3ec849a8..195c124a3 100644 --- a/src/pretix/helpers/json.py +++ b/src/pretix/helpers/json.py @@ -20,6 +20,7 @@ # . # from django.core.files import File +from django_countries.fields import Country from i18nfield.utils import I18nJSONEncoder from phonenumber_field.phonenumber import PhoneNumber @@ -36,7 +37,9 @@ class CustomJSONEncoder(I18nJSONEncoder): return obj.name elif isinstance(obj, LazyI18nStringList): return [s.data for s in obj.data] - if isinstance(obj, PhoneNumber): + elif isinstance(obj, PhoneNumber): + return str(obj) + elif isinstance(obj, Country): return str(obj) else: return super().default(obj) diff --git a/src/pretix/locale/ang/LC_MESSAGES/django.po b/src/pretix/locale/ang/LC_MESSAGES/django.po index 5e133204a..4f37420db 100644 --- a/src/pretix/locale/ang/LC_MESSAGES/django.po +++ b/src/pretix/locale/ang/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-29 07:54+0000\n" +"POT-Creation-Date: 2025-11-27 13:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -219,27 +219,27 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1098 #: pretix/base/modelimport_vouchers.py:326 pretix/base/models/orders.py:272 #: pretix/base/models/vouchers.py:295 pretix/control/forms/filter.py:588 -#: pretix/control/templates/pretixcontrol/order/index.html:950 +#: pretix/control/templates/pretixcontrol/order/index.html:981 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:38 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:21 #: pretix/control/views/vouchers.py:121 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/checkinlists/exporters.py:525 msgid "Comment" msgstr "" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1471 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1492 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "" -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1718 -#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1724 +#: pretix/base/models/items.py:1916 pretix/base/models/items.py:2202 msgid "One or more items do not belong to this event." msgstr "" #: pretix/api/serializers/checkin.py:69 pretix/api/serializers/checkin.py:72 -#: pretix/base/models/items.py:2214 pretix/base/models/items.py:2217 +#: pretix/base/models/items.py:2213 pretix/base/models/items.py:2216 #: pretix/base/models/waitinglist.py:310 pretix/base/models/waitinglist.py:313 msgid "The subevent does not belong to this event." msgstr "" @@ -270,59 +270,75 @@ msgstr "" msgid "Restricted plugin: '{name}'." msgstr "" -#: pretix/api/serializers/item.py:86 pretix/api/serializers/item.py:148 -#: pretix/api/serializers/item.py:359 +#: pretix/api/serializers/item.py:87 pretix/api/serializers/item.py:149 +#: pretix/api/serializers/item.py:405 #, python-brace-format msgid "Item meta data property '{name}' does not exist." msgstr "" -#: pretix/api/serializers/item.py:207 pretix/control/forms/item.py:1274 +#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1277 msgid "The bundled item must not be the same item as the bundling one." msgstr "" -#: pretix/api/serializers/item.py:210 pretix/control/forms/item.py:1276 +#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1279 msgid "The bundled item must not have bundles on its own." msgstr "" -#: 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." +#: pretix/api/serializers/item.py:235 +msgid "The program start must not be empty." msgstr "" -#: pretix/api/serializers/item.py:306 +#: pretix/api/serializers/item.py:239 +msgid "The program end must not be empty." +msgstr "" + +#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2321 +msgid "The program end must not be before the program start." +msgstr "" + +#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2315 +msgid "You cannot use program times on an event series." +msgstr "" + +#: pretix/api/serializers/item.py:337 +msgid "" +"Updating add-ons, bundles, program times or variations via PATCH/PUT is not " +"supported. Please use the dedicated nested endpoint." +msgstr "" + +#: pretix/api/serializers/item.py:345 msgid "Only admission products can currently be personalized." msgstr "" -#: pretix/api/serializers/item.py:317 +#: pretix/api/serializers/item.py:356 msgid "" "Gift card products should not be associated with non-zero tax rates since " "sales tax will be applied when the gift card is redeemed." msgstr "" -#: pretix/api/serializers/item.py:322 pretix/control/forms/item.py:781 +#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:784 msgid "Gift card products should not be admission products at the same time." msgstr "" -#: pretix/api/serializers/item.py:524 +#: pretix/api/serializers/item.py:573 msgid "" "Updating options via PATCH/PUT is not supported. Please use the dedicated " "nested endpoint." msgstr "" -#: pretix/api/serializers/item.py:538 pretix/control/forms/item.py:176 +#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177 msgid "Question cannot depend on a question asked during check-in." msgstr "" -#: pretix/api/serializers/item.py:543 pretix/control/forms/item.py:181 +#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182 msgid "Circular dependency between questions detected." msgstr "" -#: pretix/api/serializers/item.py:548 pretix/control/forms/item.py:190 +#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:191 msgid "This type of question cannot be asked during check-in." msgstr "" -#: pretix/api/serializers/item.py:551 pretix/control/forms/item.py:198 +#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:199 msgid "This type of question cannot be shown during check-in." msgstr "" @@ -332,23 +348,23 @@ msgid "" "account." msgstr "" -#: pretix/api/serializers/order.py:81 +#: pretix/api/serializers/order.py:85 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "" -#: pretix/api/serializers/order.py:1432 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1619 +#: pretix/api/serializers/order.py:1453 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1642 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "" -#: pretix/api/serializers/order.py:1458 pretix/api/serializers/order.py:1465 +#: pretix/api/serializers/order.py:1479 pretix/api/serializers/order.py:1486 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "" -#: pretix/api/serializers/order.py:1480 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1501 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." @@ -386,34 +402,34 @@ msgid "" "The specified voucher has already been used the maximum number of times." msgstr "" -#: pretix/api/views/checkin.py:616 pretix/api/views/checkin.py:623 +#: pretix/api/views/checkin.py:627 pretix/api/views/checkin.py:634 msgid "Medium connected to other event" msgstr "" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:755 +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:764 #, python-brace-format msgid "" "The application \"{application_name}\" has been authorized to access your " "account." msgstr "" -#: pretix/api/views/order.py:608 pretix/control/views/orders.py:1603 +#: pretix/api/views/order.py:609 pretix/control/views/orders.py:1608 #: pretix/presale/views/order.py:736 pretix/presale/views/order.py:816 msgid "You cannot generate an invoice for this order." msgstr "" -#: pretix/api/views/order.py:613 pretix/control/views/orders.py:1605 +#: pretix/api/views/order.py:614 pretix/control/views/orders.py:1610 #: pretix/presale/views/order.py:738 pretix/presale/views/order.py:818 msgid "An invoice for this order already exists." msgstr "" -#: pretix/api/views/order.py:639 pretix/control/views/orders.py:1764 +#: pretix/api/views/order.py:640 pretix/control/views/orders.py:1788 #: pretix/control/views/users.py:145 msgid "There was an error sending the mail. Please try again later." msgstr "" -#: pretix/api/views/order.py:719 pretix/base/services/cart.py:216 -#: pretix/base/services/orders.py:191 pretix/presale/views/order.py:800 +#: pretix/api/views/order.py:720 pretix/base/services/cart.py:216 +#: pretix/base/services/orders.py:195 pretix/presale/views/order.py:800 msgid "One of the selected products is not available in the selected country." msgstr "" @@ -432,7 +448,7 @@ msgstr "" #: pretix/api/webhooks.py:274 pretix/base/models/checkin.py:355 #: pretix/base/notifications.py:251 #: pretix/control/templates/pretixcontrol/event/mail.html:114 -#: pretix/control/views/orders.py:1564 +#: pretix/control/views/orders.py:1569 msgid "Order canceled" msgstr "" @@ -611,9 +627,9 @@ msgstr "" #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 #: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1048 #: pretix/base/forms/questions.py:1079 pretix/base/forms/questions.py:1333 -#: pretix/base/payment.py:97 pretix/control/forms/event.py:792 -#: pretix/control/forms/event.py:798 pretix/control/forms/event.py:838 -#: pretix/control/forms/event.py:1455 pretix/control/forms/mailsetup.py:87 +#: pretix/base/payment.py:97 pretix/control/forms/event.py:798 +#: pretix/control/forms/event.py:804 pretix/control/forms/event.py:918 +#: pretix/control/forms/event.py:1554 pretix/control/forms/mailsetup.py:87 #: pretix/control/forms/mailsetup.py:129 pretix/control/forms/subevents.py:181 #: pretix/plugins/banktransfer/payment.py:507 #: pretix/plugins/banktransfer/payment.py:513 @@ -638,10 +654,10 @@ msgstr "" #: pretix/base/exporters/orderlist.py:263 #: pretix/base/exporters/orderlist.py:454 #: pretix/base/exporters/orderlist.py:587 -#: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:257 -#: pretix/base/invoicing/email.py:43 pretix/base/models/auth.py:244 +#: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:270 +#: pretix/base/invoicing/email.py:43 pretix/base/models/auth.py:247 #: pretix/base/models/customers.py:101 pretix/base/models/notifications.py:46 -#: pretix/base/models/orders.py:246 pretix/base/pdf.py:336 +#: pretix/base/models/orders.py:246 pretix/base/pdf.py:337 #: pretix/control/navigation.py:81 pretix/control/navigation.py:513 #: pretix/control/templates/pretixcontrol/checkin/index.html:107 #: pretix/control/templates/pretixcontrol/event/settings.html:71 @@ -650,7 +666,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/customers.html:59 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:161 #: pretix/plugins/checkinlists/exporters.py:509 -#: pretix/presale/checkoutflow.py:1542 pretix/presale/forms/checkout.py:57 +#: pretix/presale/checkoutflow.py:1553 pretix/presale/forms/checkout.py:57 #: pretix/presale/forms/customer.py:57 pretix/presale/forms/customer.py:142 #: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:344 #: pretix/presale/forms/customer.py:388 pretix/presale/forms/user.py:40 @@ -660,8 +676,9 @@ msgid "Email" msgstr "" #: pretix/base/auth.py:157 pretix/base/forms/auth.py:164 -#: pretix/base/forms/auth.py:218 pretix/base/models/auth.py:675 +#: pretix/base/forms/auth.py:226 pretix/base/models/auth.py:750 #: pretix/base/models/customers.py:103 pretix/control/forms/mailsetup.py:57 +#: pretix/control/templates/pretixcontrol/user/settings.html:64 #: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 msgid "Password" msgstr "" @@ -735,30 +752,16 @@ msgstr "" msgid "You are not requesting \"{scope}\"." msgstr "" -#: pretix/base/customersso/oidc.py:117 -#, python-brace-format -msgid "" -"You are requesting scope \"{scope}\" but provider only supports these: " -"{scopes}." -msgstr "" - -#: pretix/base/customersso/oidc.py:127 -#, python-brace-format -msgid "" -"You are requesting field \"{field}\" but provider only supports these: " -"{fields}." -msgstr "" - -#: pretix/base/customersso/oidc.py:223 pretix/base/customersso/oidc.py:231 -#: pretix/base/customersso/oidc.py:254 pretix/base/customersso/oidc.py:271 -#: pretix/base/customersso/oidc.py:278 pretix/presale/views/customer.py:758 +#: pretix/base/customersso/oidc.py:206 pretix/base/customersso/oidc.py:214 +#: pretix/base/customersso/oidc.py:237 pretix/base/customersso/oidc.py:254 +#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:758 #: pretix/presale/views/customer.py:768 pretix/presale/views/customer.py:807 #: pretix/presale/views/customer.py:881 #, python-brace-format msgid "Login was not successful. Error message: \"{error}\"." msgstr "" -#: pretix/base/customersso/oidc.py:261 +#: pretix/base/customersso/oidc.py:244 msgid "" "The email address on this account is not yet verified. Please first confirm " "the email address in your customer account." @@ -794,7 +797,7 @@ msgid "Attendee details" msgstr "" #: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66 -#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172 +#: pretix/base/models/items.py:1766 pretix/control/navigation.py:172 #: pretix/control/templates/pretixcontrol/items/questions.html:3 #: pretix/control/templates/pretixcontrol/items/questions.html:5 msgid "Questions" @@ -805,7 +808,7 @@ msgid "Product details" msgstr "" #: pretix/base/datasync/sourcefields.py:132 -#: pretix/control/templates/pretixcontrol/event/settings.html:280 +#: pretix/control/templates/pretixcontrol/event/settings.html:279 #: pretix/control/templates/pretixcontrol/order/index.html:176 #: pretix/presale/templates/pretixpresale/event/order.html:22 msgid "Order details" @@ -839,11 +842,11 @@ msgstr "" #: pretix/base/exporters/orderlist.py:605 #: pretix/base/exporters/orderlist.py:610 pretix/base/forms/questions.py:681 #: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:320 -#: pretix/base/models/orders.py:1504 pretix/base/pdf.py:183 +#: pretix/base/models/orders.py:1530 pretix/base/pdf.py:184 #: pretix/control/forms/filter.py:679 pretix/control/forms/organizer.py:1019 -#: pretix/control/templates/pretixcontrol/order/index.html:566 +#: pretix/control/templates/pretixcontrol/order/index.html:571 #: pretix/control/templates/pretixcontrol/organizers/customer.html:121 -#: pretix/control/views/item.py:442 pretix/plugins/badges/exporters.py:495 +#: pretix/control/views/item.py:443 pretix/plugins/badges/exporters.py:495 #: pretix/plugins/checkinlists/exporters.py:121 #: pretix/plugins/checkinlists/exporters.py:495 #: pretix/plugins/ticketoutputpdf/exporters.py:94 @@ -863,10 +866,10 @@ msgstr "" #: pretix/base/datasync/sourcefields.py:207 #: pretix/base/exporters/orderlist.py:612 pretix/base/forms/questions.py:687 -#: pretix/base/models/customers.py:327 pretix/base/models/orders.py:1512 -#: pretix/base/pdf.py:225 -#: pretix/control/templates/pretixcontrol/order/index.html:571 -#: pretix/control/views/item.py:454 +#: pretix/base/models/customers.py:327 pretix/base/models/orders.py:1538 +#: pretix/base/pdf.py:226 +#: pretix/control/templates/pretixcontrol/order/index.html:576 +#: pretix/control/views/item.py:455 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175 msgid "Attendee email" @@ -876,8 +879,9 @@ msgstr "" msgid "Attendee or order email" msgstr "" -#: pretix/base/datasync/sourcefields.py:232 pretix/base/pdf.py:188 -#: pretix/control/templates/pretixcontrol/order/index.html:595 +#: pretix/base/datasync/sourcefields.py:232 +#: pretix/base/exporters/orderlist.py:613 pretix/base/pdf.py:189 +#: pretix/control/templates/pretixcontrol/order/index.html:600 #: pretix/plugins/badges/exporters.py:496 #: pretix/plugins/ticketoutputpdf/exporters.py:95 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182 @@ -901,7 +905,8 @@ msgstr "" msgid "Attendee address country" msgstr "" -#: pretix/base/datasync/sourcefields.py:279 pretix/base/pdf.py:346 +#: pretix/base/datasync/sourcefields.py:279 +#: pretix/base/exporters/orderlist.py:653 pretix/base/pdf.py:347 msgid "Invoice address company" msgstr "" @@ -909,27 +914,27 @@ msgstr "" #: pretix/base/exporters/orderlist.py:465 #: pretix/base/exporters/orderlist.py:470 #: pretix/base/exporters/orderlist.py:654 -#: pretix/base/exporters/orderlist.py:658 pretix/base/pdf.py:341 +#: pretix/base/exporters/orderlist.py:658 pretix/base/pdf.py:342 msgid "Invoice address name" msgstr "" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:352 msgid "Invoice address street" msgstr "" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:357 msgid "Invoice address ZIP code" msgstr "" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:362 msgid "Invoice address city" msgstr "" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:372 msgid "Invoice address country" msgstr "" @@ -942,12 +947,12 @@ msgid "Order email domain" msgstr "" #: pretix/base/datasync/sourcefields.py:371 -#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332 #: pretix/base/exporters/orderlist.py:263 #: pretix/base/exporters/orderlist.py:452 #: pretix/base/exporters/orderlist.py:584 #: pretix/base/exporters/orderlist.py:899 pretix/base/models/orders.py:210 -#: pretix/base/notifications.py:199 pretix/base/pdf.py:105 +#: pretix/base/notifications.py:199 pretix/base/pdf.py:106 #: pretix/base/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 #: pretix/control/templates/pretixcontrol/order/index.html:181 @@ -1007,7 +1012,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:451 #: pretix/base/exporters/orderlist.py:583 #: pretix/base/exporters/waitinglist.py:117 pretix/base/models/event.py:595 -#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1279 +#: pretix/base/pdf.py:236 pretix/control/forms/filter.py:1279 #: pretix/control/forms/filter.py:1724 #: pretix/control/templates/pretixcontrol/events/index.html:68 #: pretix/control/templates/pretixcontrol/organizers/detail.html:64 @@ -1015,12 +1020,12 @@ msgid "Event name" msgstr "" #: pretix/base/datasync/sourcefields.py:446 -#: pretix/base/exporters/invoices.py:328 +#: pretix/base/exporters/invoices.py:330 msgid "Event start date" msgstr "" #: pretix/base/datasync/sourcefields.py:455 -#: pretix/base/exporters/invoices.py:352 pretix/base/pdf.py:289 +#: pretix/base/exporters/invoices.py:354 pretix/base/pdf.py:290 msgid "Event end date" msgstr "" @@ -1038,7 +1043,7 @@ msgstr "" msgid "Voucher code" msgstr "" -#: pretix/base/datasync/sourcefields.py:473 pretix/base/pdf.py:118 +#: pretix/base/datasync/sourcefields.py:473 pretix/base/pdf.py:119 msgid "Order code and position number" msgstr "" @@ -1095,28 +1100,28 @@ msgid "Question: {name}" msgstr "" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3588 -#: pretix/base/settings.py:3601 pretix/base/settings.py:3617 -#: pretix/base/settings.py:3667 pretix/base/settings.py:3680 -#: pretix/base/settings.py:3694 pretix/base/settings.py:3747 -#: pretix/base/settings.py:3768 pretix/base/settings.py:3790 +#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3642 +#: pretix/base/settings.py:3655 pretix/base/settings.py:3671 +#: pretix/base/settings.py:3721 pretix/base/settings.py:3734 +#: pretix/base/settings.py:3748 pretix/base/settings.py:3801 +#: pretix/base/settings.py:3822 pretix/base/settings.py:3844 msgid "Given name" msgstr "" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3589 -#: pretix/base/settings.py:3602 pretix/base/settings.py:3618 -#: pretix/base/settings.py:3634 pretix/base/settings.py:3651 -#: pretix/base/settings.py:3666 pretix/base/settings.py:3681 -#: pretix/base/settings.py:3695 pretix/base/settings.py:3748 -#: pretix/base/settings.py:3769 pretix/base/settings.py:3791 +#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3643 +#: pretix/base/settings.py:3656 pretix/base/settings.py:3672 +#: pretix/base/settings.py:3688 pretix/base/settings.py:3705 +#: pretix/base/settings.py:3720 pretix/base/settings.py:3735 +#: pretix/base/settings.py:3749 pretix/base/settings.py:3802 +#: pretix/base/settings.py:3823 pretix/base/settings.py:3845 msgid "Family name" msgstr "" -#: pretix/base/email.py:203 pretix/base/exporters/items.py:157 +#: pretix/base/email.py:218 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:205 pretix/base/models/tax.py:381 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:27 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:44 +#: pretix/control/templates/pretixcontrol/event/tax.html:35 +#: pretix/control/templates/pretixcontrol/event/tax.html:54 #: pretix/control/views/main.py:323 pretix/plugins/badges/apps.py:50 #: pretix/plugins/badges/models.py:48 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:35 @@ -1127,7 +1132,7 @@ msgstr "" msgid "Default" msgstr "" -#: pretix/base/email.py:210 +#: pretix/base/email.py:225 msgid "Simple with logo" msgstr "" @@ -1179,9 +1184,9 @@ msgstr "" #: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:593 #: pretix/base/exporters/orderlist.py:918 #: pretix/base/exporters/orderlist.py:1159 pretix/base/models/checkin.py:58 -#: pretix/base/models/items.py:2067 pretix/base/models/orders.py:1485 -#: pretix/base/models/orders.py:3024 pretix/base/models/vouchers.py:190 -#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1620 +#: pretix/base/models/items.py:2066 pretix/base/models/orders.py:1508 +#: pretix/base/models/orders.py:3090 pretix/base/models/vouchers.py:190 +#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1722 #: pretix/control/forms/filter.py:441 pretix/control/forms/filter.py:1928 #: pretix/control/forms/filter.py:2150 pretix/control/forms/filter.py:2265 #: pretix/control/forms/filter.py:2347 pretix/control/forms/filter.py:2564 @@ -1208,7 +1213,7 @@ msgid "Date" msgstr "" #: pretix/base/exporters/answers.py:79 pretix/base/exporters/answers.py:88 -#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1621 +#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1723 #: pretix/control/forms/filter.py:444 pretix/control/forms/filter.py:471 #: pretix/control/forms/filter.py:1931 pretix/control/forms/filter.py:1964 #: pretix/control/forms/filter.py:2153 pretix/control/forms/filter.py:2173 @@ -1264,45 +1269,45 @@ msgstr "" #: pretix/base/exporters/orderlist.py:588 #: pretix/base/exporters/waitinglist.py:111 #: pretix/base/modelimport_orders.py:87 pretix/base/models/customers.py:102 -#: pretix/base/models/customers.py:416 pretix/base/models/items.py:1659 +#: pretix/base/models/customers.py:416 pretix/base/models/items.py:1658 #: pretix/base/models/orders.py:250 pretix/base/models/waitinglist.py:80 -#: pretix/base/pdf.py:331 +#: pretix/base/pdf.py:332 #: pretix/control/templates/pretixcontrol/order/index.html:257 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:163 #: pretix/control/views/waitinglist.py:314 #: pretix/plugins/checkinlists/exporters.py:510 -#: pretix/presale/checkoutflow.py:1548 pretix/presale/forms/checkout.py:84 +#: pretix/presale/checkoutflow.py:1559 pretix/presale/forms/checkout.py:84 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 msgid "Phone number" msgstr "" -#: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:246 -#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3295 -#: pretix/base/settings.py:3721 pretix/base/settings.py:3733 +#: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:250 +#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3393 +#: pretix/base/settings.py:3775 pretix/base/settings.py:3787 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "" #: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:208 -#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:334 -#: pretix/base/exporters/invoices.py:342 pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:336 +#: pretix/base/exporters/invoices.py:344 pretix/base/exporters/orderlist.py:264 #: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1248 #: pretix/base/models/devices.py:65 pretix/base/models/devices.py:127 -#: pretix/base/models/event.py:1524 pretix/base/models/event.py:1762 -#: pretix/base/models/items.py:2071 pretix/base/models/items.py:2244 +#: pretix/base/models/event.py:1530 pretix/base/models/event.py:1768 +#: pretix/base/models/items.py:2070 pretix/base/models/items.py:2243 #: pretix/base/models/memberships.py:41 pretix/base/models/organizer.py:77 #: pretix/base/models/organizer.py:601 pretix/base/models/seating.py:85 -#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3346 -#: pretix/base/settings.py:3356 pretix/base/settings.py:3710 -#: pretix/control/forms/filter.py:656 pretix/control/forms/item.py:446 +#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3400 +#: pretix/base/settings.py:3410 pretix/base/settings.py:3764 +#: pretix/control/forms/filter.py:656 pretix/control/forms/item.py:447 #: pretix/control/forms/organizer.py:950 #: pretix/control/templates/pretixcontrol/checkin/index.html:109 #: pretix/control/templates/pretixcontrol/checkin/lists.html:99 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:26 +#: pretix/control/templates/pretixcontrol/event/tax.html:34 #: pretix/control/templates/pretixcontrol/oauth/app_list.html:12 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:999 +#: pretix/control/templates/pretixcontrol/order/index.html:1030 #: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:62 #: pretix/control/templates/pretixcontrol/organizers/devices.html:77 @@ -1332,7 +1337,8 @@ msgstr "" msgid "Account active" msgstr "" -#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:107 +#: pretix/base/exporters/customers.py:78 pretix/base/models/auth.py:248 +#: pretix/base/models/customers.py:107 msgid "Verified email address" msgstr "" @@ -1347,9 +1353,9 @@ msgid "Registration date" msgstr "" #: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:207 -#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:258 +#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:262 #: pretix/base/models/customers.py:113 pretix/base/models/exports.py:54 -#: pretix/control/forms/event.py:1626 pretix/control/forms/exports.py:49 +#: pretix/control/forms/event.py:1728 pretix/control/forms/exports.py:49 #: pretix/control/forms/exports.py:88 pretix/control/views/waitinglist.py:315 msgid "Language" msgstr "" @@ -1364,7 +1370,7 @@ msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:307 pretix/base/exporters/items.py:150 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/items.py:150 #: pretix/base/exporters/items.py:153 pretix/base/exporters/items.py:155 #: pretix/base/exporters/items.py:156 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:158 pretix/base/exporters/items.py:163 @@ -1386,11 +1392,11 @@ msgstr "" #: pretix/base/exporters/orderlist.py:808 #: pretix/base/exporters/orderlist.py:1404 #: pretix/base/exporters/reusablemedia.py:64 pretix/base/modelimport.py:194 -#: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1401 -#: pretix/base/models/orders.py:3441 pretix/control/forms/filter.py:177 +#: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1409 +#: pretix/base/models/orders.py:3539 pretix/control/forms/filter.py:177 #: pretix/control/forms/filter.py:551 pretix/control/forms/filter.py:738 -#: pretix/control/forms/item.py:615 pretix/control/forms/subevents.py:119 -#: pretix/control/views/item.py:733 pretix/control/views/vouchers.py:139 +#: pretix/control/forms/item.py:618 pretix/control/forms/subevents.py:119 +#: pretix/control/views/item.py:734 pretix/control/views/vouchers.py:139 #: pretix/control/views/vouchers.py:140 #: pretix/plugins/checkinlists/exporters.py:602 #: pretix/plugins/checkinlists/exporters.py:605 @@ -1405,17 +1411,17 @@ msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:307 pretix/base/exporters/orderlist.py:396 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:396 #: pretix/base/exporters/orderlist.py:401 #: pretix/base/exporters/orderlist.py:776 #: pretix/base/exporters/orderlist.py:808 #: pretix/base/exporters/orderlist.py:1404 #: pretix/base/exporters/reusablemedia.py:64 pretix/base/modelimport.py:193 -#: pretix/base/modelimport.py:203 pretix/base/models/orders.py:1403 -#: pretix/base/models/orders.py:3443 pretix/control/forms/filter.py:177 +#: pretix/base/modelimport.py:203 pretix/base/models/orders.py:1411 +#: pretix/base/models/orders.py:3541 pretix/control/forms/filter.py:177 #: pretix/control/forms/filter.py:552 pretix/control/forms/filter.py:739 -#: pretix/control/forms/item.py:616 pretix/control/forms/subevents.py:120 -#: pretix/control/views/item.py:733 pretix/control/views/vouchers.py:139 +#: pretix/control/forms/item.py:619 pretix/control/forms/subevents.py:120 +#: pretix/control/views/item.py:734 pretix/control/views/vouchers.py:139 #: pretix/control/views/vouchers.py:140 #: pretix/plugins/checkinlists/exporters.py:602 #: pretix/plugins/checkinlists/exporters.py:605 @@ -1491,70 +1497,70 @@ msgstr "" msgid "Event currency" msgstr "" -#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:261 +#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:265 #: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93 msgid "Timezone" msgstr "" #: pretix/base/exporters/events.py:62 pretix/base/models/event.py:618 -#: pretix/base/models/event.py:1526 pretix/base/settings.py:3344 -#: pretix/base/settings.py:3354 pretix/control/forms/subevents.py:484 +#: pretix/base/models/event.py:1532 pretix/base/settings.py:3398 +#: pretix/base/settings.py:3408 pretix/control/forms/subevents.py:484 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:268 msgid "Event start time" msgstr "" #: pretix/base/exporters/events.py:63 pretix/base/models/event.py:620 -#: pretix/base/models/event.py:1528 pretix/base/pdf.py:297 +#: pretix/base/models/event.py:1534 pretix/base/pdf.py:298 #: pretix/control/forms/subevents.py:489 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:270 msgid "Event end time" msgstr "" #: pretix/base/exporters/events.py:64 pretix/base/models/event.py:622 -#: pretix/base/models/event.py:1530 pretix/control/forms/subevents.py:494 +#: pretix/base/models/event.py:1536 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 msgid "Admission time" msgstr "" #: pretix/base/exporters/events.py:65 pretix/base/models/event.py:634 -#: pretix/base/models/event.py:1539 pretix/control/forms/subevents.py:93 +#: pretix/base/models/event.py:1545 pretix/control/forms/subevents.py:93 msgid "Start of presale" msgstr "" #: pretix/base/exporters/events.py:66 pretix/base/models/event.py:628 -#: pretix/base/models/event.py:1533 pretix/control/forms/subevents.py:99 +#: pretix/base/models/event.py:1539 pretix/control/forms/subevents.py:99 msgid "End of presale" msgstr "" -#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:353 -#: pretix/base/models/event.py:640 pretix/base/models/event.py:1545 +#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:355 +#: pretix/base/models/event.py:640 pretix/base/models/event.py:1551 #: pretix/base/templates/pretixbase/email/order_details.html:83 msgid "Location" msgstr "" #: pretix/base/exporters/events.py:68 pretix/base/models/event.py:648 -#: pretix/base/models/event.py:1548 +#: pretix/base/models/event.py:1554 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:18 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:54 msgid "Latitude" msgstr "" #: pretix/base/exporters/events.py:69 pretix/base/models/event.py:656 -#: pretix/base/models/event.py:1556 +#: pretix/base/models/event.py:1562 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:28 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:64 msgid "Longitude" msgstr "" #: pretix/base/exporters/events.py:70 pretix/base/models/event.py:668 -#: pretix/base/models/event.py:1571 +#: pretix/base/models/event.py:1577 #: pretix/control/templates/pretixcontrol/event/index.html:137 -#: pretix/control/templates/pretixcontrol/order/index.html:1049 +#: pretix/control/templates/pretixcontrol/order/index.html:1080 msgid "Internal comment" msgstr "" -#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753 -#: pretix/base/models/orders.py:2187 pretix/control/forms/filter.py:209 +#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1779 +#: pretix/base/models/orders.py:2213 pretix/control/forms/filter.py:209 #: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:2305 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:9 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:14 @@ -1602,7 +1608,7 @@ msgstr "" #: pretix/base/exporters/invoices.py:193 pretix/base/shredder.py:579 #: pretix/control/templates/pretixcontrol/order/index.html:268 -#: pretix/control/templates/pretixcontrol/order/index.html:381 +#: pretix/control/templates/pretixcontrol/order/index.html:386 #: pretix/control/templates/pretixcontrol/organizers/edit.html:312 #: pretix/presale/templates/pretixpresale/event/order.html:236 #: pretix/presale/templates/pretixpresale/event/order.html:257 @@ -1613,16 +1619,16 @@ msgstr "" msgid "Invoice lines" msgstr "" -#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:320 +#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:322 msgid "Invoice number" msgstr "" -#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:331 #: pretix/base/exporters/orderlist.py:1236 #: pretix/base/exporters/orderlist.py:1282 #: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/widgets.py:213 -#: pretix/base/models/items.py:1655 pretix/base/models/orders.py:259 -#: pretix/base/models/orders.py:2999 pretix/base/models/orders.py:3119 +#: pretix/base/models/items.py:1654 pretix/base/models/orders.py:259 +#: pretix/base/models/orders.py:3065 pretix/base/models/orders.py:3204 #: pretix/base/templates/pretixbase/email/order_details.html:70 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:25 #: pretix/control/templates/pretixcontrol/order/transactions.html:19 @@ -1635,7 +1641,7 @@ msgstr "" msgid "Date" msgstr "" -#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 +#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:333 #: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59 #: pretix/base/models/customers.py:415 pretix/base/models/waitinglist.py:76 #: pretix/control/forms/filter.py:584 @@ -1644,33 +1650,34 @@ msgstr "" msgid "Email address" msgstr "" -#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:332 +#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:334 msgid "Invoice type" msgstr "" -#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:333 +#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:335 msgid "Cancellation of" msgstr "" #: pretix/base/exporters/invoices.py:208 pretix/base/exporters/invoices.py:209 #: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:211 #: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:213 -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:334 -#: pretix/base/exporters/invoices.py:335 pretix/base/exporters/invoices.py:336 -#: pretix/base/exporters/invoices.py:337 pretix/base/exporters/invoices.py:338 -#: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:340 +#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:215 +#: pretix/base/exporters/invoices.py:336 pretix/base/exporters/invoices.py:337 +#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:339 +#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:342 msgid "Invoice sender:" msgstr "" -#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:335 +#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:337 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:614 pretix/base/forms/questions.py:706 #: pretix/base/modelimport_orders.py:232 pretix/base/modelimport_orders.py:386 -#: pretix/base/models/customers.py:331 pretix/base/models/orders.py:1539 -#: pretix/base/models/orders.py:3297 pretix/control/forms/filter.py:660 +#: pretix/base/models/customers.py:331 pretix/base/models/orders.py:1565 +#: pretix/base/models/orders.py:3395 pretix/control/forms/filter.py:660 #: pretix/control/forms/filter.py:691 -#: pretix/control/templates/pretixcontrol/order/index.html:1001 +#: pretix/control/templates/pretixcontrol/order/index.html:1032 #: pretix/plugins/checkinlists/exporters.py:536 #: pretix/plugins/reports/exporters.py:852 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 @@ -1678,48 +1685,65 @@ msgstr "" msgid "Address" msgstr "" -#: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:218 -#: pretix/base/exporters/invoices.py:336 pretix/base/exporters/invoices.py:344 +#: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:219 +#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:615 pretix/base/forms/questions.py:717 #: pretix/base/modelimport_orders.py:244 pretix/base/modelimport_orders.py:397 -#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1540 -#: pretix/base/models/orders.py:3298 pretix/base/settings.py:1191 +#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1566 +#: pretix/base/models/orders.py:3396 pretix/base/settings.py:1222 #: pretix/control/forms/filter.py:664 pretix/control/forms/filter.py:695 -#: pretix/control/views/item.py:488 +#: pretix/control/views/item.py:489 #: pretix/plugins/checkinlists/exporters.py:537 #: pretix/plugins/reports/exporters.py:853 msgid "ZIP code" msgstr "" -#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:219 -#: pretix/base/exporters/invoices.py:337 pretix/base/exporters/invoices.py:345 +#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:220 +#: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:347 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:616 pretix/base/forms/questions.py:725 #: pretix/base/modelimport_orders.py:256 pretix/base/modelimport_orders.py:408 -#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1541 -#: pretix/base/models/orders.py:3299 pretix/base/settings.py:1203 +#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1567 +#: pretix/base/models/orders.py:3397 pretix/base/settings.py:1235 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 -#: pretix/control/views/item.py:498 +#: pretix/control/views/item.py:499 #: pretix/plugins/checkinlists/exporters.py:538 #: pretix/plugins/reports/exporters.py:854 msgid "City" msgstr "" -#: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:220 -#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 +#: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:222 +#: pretix/base/exporters/invoices.py:349 pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:472 +#: pretix/base/exporters/orderlist.py:618 pretix/base/forms/questions.py:762 +#: pretix/base/forms/questions.py:1198 pretix/base/modelimport_orders.py:295 +#: pretix/base/models/customers.py:335 pretix/base/models/orders.py:1569 +#: pretix/base/models/orders.py:3401 pretix/base/settings.py:1248 +#: pretix/base/views/js_helpers.py:48 pretix/control/forms/event.py:1033 +#: pretix/control/templates/pretixcontrol/order/index.html:1039 +#: pretix/plugins/checkinlists/exporters.py:540 +#: pretix/plugins/reports/exporters.py:855 +#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 +#: pretix/presale/templates/pretixpresale/event/order.html:323 +msgctxt "address" +msgid "State" +msgstr "" + +#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:221 +#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:617 pretix/base/forms/questions.py:737 #: pretix/base/modelimport_orders.py:274 pretix/base/modelimport_orders.py:425 -#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3300 pretix/base/models/orders.py:3301 -#: pretix/base/settings.py:1212 pretix/control/forms/filter.py:674 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3398 pretix/base/models/orders.py:3399 +#: pretix/base/settings.py:1259 pretix/control/forms/filter.py:674 #: pretix/control/forms/filter.py:705 -#: pretix/control/templates/pretixcontrol/order/index.html:1005 -#: pretix/control/views/item.py:508 +#: pretix/control/templates/pretixcontrol/order/index.html:1036 +#: pretix/control/views/item.py:509 #: pretix/plugins/checkinlists/exporters.py:539 #: pretix/plugins/reports/exporters.py:804 #: pretix/plugins/reports/exporters.py:849 @@ -1729,17 +1753,17 @@ msgstr "" msgid "Country" msgstr "" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 +#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:341 msgid "Tax ID" msgstr "" -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:222 -#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 +#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:223 +#: pretix/base/exporters/invoices.py:342 pretix/base/exporters/invoices.py:350 #: pretix/base/exporters/orderlist.py:272 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:663 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3304 -#: pretix/control/templates/pretixcontrol/order/index.html:1012 +#: pretix/base/models/orders.py:3402 +#: pretix/control/templates/pretixcontrol/order/index.html:1043 #: pretix/plugins/reports/exporters.py:856 #: pretix/plugins/reports/exporters.py:898 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 @@ -1747,28 +1771,26 @@ msgstr "" msgid "VAT ID" msgstr "" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:216 -#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:218 -#: pretix/base/exporters/invoices.py:219 pretix/base/exporters/invoices.py:220 -#: pretix/base/exporters/invoices.py:221 pretix/base/exporters/invoices.py:222 -#: pretix/base/exporters/invoices.py:223 pretix/base/exporters/invoices.py:224 -#: pretix/base/exporters/invoices.py:341 pretix/base/exporters/invoices.py:342 +#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:217 +#: pretix/base/exporters/invoices.py:218 pretix/base/exporters/invoices.py:219 +#: pretix/base/exporters/invoices.py:220 pretix/base/exporters/invoices.py:221 +#: pretix/base/exporters/invoices.py:222 pretix/base/exporters/invoices.py:223 +#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:225 #: pretix/base/exporters/invoices.py:343 pretix/base/exporters/invoices.py:344 #: pretix/base/exporters/invoices.py:345 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/invoices.py:347 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/invoices.py:349 pretix/base/exporters/invoices.py:350 +#: pretix/base/exporters/invoices.py:351 pretix/base/exporters/invoices.py:352 msgid "Invoice recipient:" msgstr "" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:343 #: pretix/base/exporters/orderlist.py:264 -#: pretix/base/exporters/orderlist.py:464 -#: pretix/base/exporters/orderlist.py:613 -#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:698 +#: pretix/base/exporters/orderlist.py:464 pretix/base/forms/questions.py:698 #: pretix/base/modelimport_orders.py:199 pretix/base/modelimport_orders.py:375 #: pretix/control/forms/filter.py:652 pretix/control/forms/filter.py:687 -#: pretix/control/templates/pretixcontrol/order/index.html:997 -#: pretix/control/views/item.py:466 +#: pretix/control/templates/pretixcontrol/order/index.html:1028 +#: pretix/control/views/item.py:467 #: pretix/plugins/checkinlists/exporters.py:520 #: pretix/plugins/reports/exporters.py:851 #: pretix/plugins/reports/exporters.py:897 @@ -1777,65 +1799,49 @@ msgstr "" msgid "Company" msgstr "" -#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:343 +#: pretix/base/exporters/invoices.py:218 pretix/base/exporters/invoices.py:345 msgid "Street address" msgstr "" -#: pretix/base/exporters/invoices.py:221 pretix/base/exporters/invoices.py:347 -#: pretix/base/exporters/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:472 -#: pretix/base/exporters/orderlist.py:618 pretix/base/forms/questions.py:762 -#: pretix/base/forms/questions.py:1198 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:335 pretix/base/models/orders.py:1543 -#: pretix/base/models/orders.py:3303 pretix/base/views/js_helpers.py:48 -#: pretix/control/templates/pretixcontrol/order/index.html:1008 -#: pretix/plugins/checkinlists/exporters.py:540 -#: pretix/plugins/reports/exporters.py:855 -#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 -#: pretix/presale/templates/pretixpresale/event/order.html:323 -msgctxt "address" -msgid "State" -msgstr "" - -#: pretix/base/exporters/invoices.py:223 pretix/base/exporters/invoices.py:349 -#: pretix/base/models/orders.py:3313 pretix/base/models/orders.py:3369 +#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:351 +#: pretix/base/models/orders.py:3411 pretix/base/models/orders.py:3467 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "" -#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:350 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3308 -#: pretix/control/templates/pretixcontrol/order/index.html:1033 +#: pretix/base/exporters/invoices.py:225 pretix/base/exporters/invoices.py:352 +#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3406 +#: pretix/control/templates/pretixcontrol/order/index.html:1064 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "" -#: pretix/base/exporters/invoices.py:225 pretix/base/models/tax.py:162 -#: pretix/control/forms/event.py:1516 +#: pretix/base/exporters/invoices.py:226 pretix/base/models/tax.py:162 +#: pretix/control/forms/event.py:1615 msgid "Reverse charge" msgstr "" -#: pretix/base/exporters/invoices.py:226 +#: pretix/base/exporters/invoices.py:227 msgid "Shown foreign currency" msgstr "" -#: pretix/base/exporters/invoices.py:227 +#: pretix/base/exporters/invoices.py:228 msgid "Foreign currency rate" msgstr "" -#: pretix/base/exporters/invoices.py:228 +#: pretix/base/exporters/invoices.py:229 msgid "Total value (with taxes)" msgstr "" -#: pretix/base/exporters/invoices.py:229 +#: pretix/base/exporters/invoices.py:230 msgid "Total value (without taxes)" msgstr "" -#: pretix/base/exporters/invoices.py:230 +#: pretix/base/exporters/invoices.py:231 msgid "Payment matching IDs" msgstr "" -#: pretix/base/exporters/invoices.py:231 pretix/base/exporters/invoices.py:351 +#: pretix/base/exporters/invoices.py:232 pretix/base/exporters/invoices.py:353 #: pretix/base/exporters/orderlist.py:291 #: pretix/base/exporters/orderlist.py:476 #: pretix/base/exporters/orderlist.py:671 pretix/base/plugins.py:139 @@ -1843,11 +1849,11 @@ msgstr "" msgid "Payment providers" msgstr "" -#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 +#: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 msgid "Cancellation" msgstr "" -#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 +#: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 #: pretix/control/templates/pretixcontrol/event/mail.html:120 #: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/control/templates/pretixcontrol/order/mail_history.html:70 @@ -1855,36 +1861,36 @@ msgstr "" msgid "Invoice" msgstr "" -#: pretix/base/exporters/invoices.py:321 +#: pretix/base/exporters/invoices.py:323 msgid "Line number" msgstr "" -#: pretix/base/exporters/invoices.py:322 pretix/base/exporters/orderlist.py:459 -#: pretix/base/models/items.py:492 pretix/base/models/items.py:1155 +#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:459 +#: pretix/base/models/items.py:492 pretix/base/models/items.py:1154 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "" -#: pretix/base/exporters/invoices.py:323 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:355 msgid "Gross price" msgstr "" -#: pretix/base/exporters/invoices.py:324 +#: pretix/base/exporters/invoices.py:326 msgid "Net price" msgstr "" -#: pretix/base/exporters/invoices.py:325 pretix/base/exporters/orderlist.py:463 +#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:463 #: pretix/base/exporters/orderlist.py:604 -#: pretix/base/exporters/orderlist.py:924 pretix/base/models/orders.py:2351 -#: pretix/base/models/orders.py:2523 pretix/base/models/orders.py:3045 +#: pretix/base/exporters/orderlist.py:924 pretix/base/models/orders.py:2380 +#: pretix/base/models/orders.py:2579 pretix/base/models/orders.py:3114 msgid "Tax value" msgstr "" -#: pretix/base/exporters/invoices.py:326 pretix/base/exporters/orderlist.py:461 +#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:461 #: pretix/base/exporters/orderlist.py:602 -#: pretix/base/exporters/orderlist.py:921 pretix/base/models/orders.py:2338 -#: pretix/base/models/orders.py:2510 pretix/base/models/orders.py:3032 -#: pretix/base/models/orders.py:3132 pretix/base/models/tax.py:348 +#: pretix/base/exporters/orderlist.py:921 pretix/base/models/orders.py:2367 +#: pretix/base/models/orders.py:2566 pretix/base/models/orders.py:3101 +#: pretix/base/models/orders.py:3217 pretix/base/models/tax.py:348 #: pretix/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 #: pretix/plugins/reports/exporters.py:805 @@ -1892,7 +1898,7 @@ msgstr "" msgid "Tax rate" msgstr "" -#: pretix/base/exporters/invoices.py:327 +#: pretix/base/exporters/invoices.py:329 msgid "Tax name" msgstr "" @@ -1916,7 +1922,7 @@ msgid "Variation ID" msgstr "" #: pretix/base/exporters/items.py:59 pretix/base/models/items.py:142 -#: pretix/base/pdf.py:153 +#: pretix/base/pdf.py:154 #: pretix/control/templates/pretixcontrol/items/category.html:4 #: pretix/control/templates/pretixcontrol/items/category.html:6 msgid "Product category" @@ -1935,18 +1941,18 @@ msgstr "" #: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:599 #: pretix/base/exporters/orderlist.py:913 -#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1495 pretix/base/models/orders.py:3017 +#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1147 +#: pretix/base/models/orders.py:1518 pretix/base/models/orders.py:3083 #: pretix/plugins/checkinlists/exporters.py:698 msgid "Variation" msgstr "" #: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:49 #: pretix/base/models/customers.py:64 pretix/base/models/customers.py:423 -#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1515 -#: pretix/base/models/items.py:489 pretix/base/models/items.py:1152 -#: pretix/base/models/media.py:77 pretix/base/settings.py:204 -#: pretix/base/settings.py:239 pretix/base/settings.py:270 +#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1521 +#: pretix/base/models/items.py:489 pretix/base/models/items.py:1151 +#: pretix/base/models/media.py:77 pretix/base/settings.py:212 +#: pretix/base/settings.py:247 pretix/base/settings.py:278 #: pretix/control/forms/filter.py:1232 pretix/control/forms/filter.py:2037 #: pretix/control/templates/pretixcontrol/event/plugins.html:25 #: pretix/control/templates/pretixcontrol/event/plugins.html:75 @@ -1957,7 +1963,7 @@ msgid "Active" msgstr "" #: pretix/base/exporters/items.py:72 pretix/base/models/discount.py:77 -#: pretix/control/forms/event.py:977 pretix/control/navigation.py:520 +#: pretix/control/forms/event.py:1076 pretix/control/navigation.py:520 #: pretix/control/templates/pretixcontrol/organizers/channels.html:6 #: pretix/plugins/autocheckin/models.py:64 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:30 @@ -1965,7 +1971,7 @@ msgid "Sales channels" msgstr "" #: pretix/base/exporters/items.py:73 pretix/base/models/items.py:497 -#: pretix/base/models/items.py:1166 +#: pretix/base/models/items.py:1165 #: pretix/control/templates/pretixcontrol/items/index.html:44 msgid "Default price" msgstr "" @@ -1975,11 +1981,11 @@ msgstr "" msgid "Free price input" msgstr "" -#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:520 +#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:519 msgid "Sales tax" msgstr "" -#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:525 +#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:524 msgid "Is an admission ticket" msgstr "" @@ -1989,22 +1995,22 @@ msgstr "" msgid "Personalized ticket" msgstr "" -#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:539 +#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:538 msgid "Generate tickets" msgstr "" #: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1156 #: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:367 -#: pretix/control/forms/event.py:1696 pretix/control/navigation.py:237 -#: pretix/control/templates/pretixcontrol/event/settings.html:363 +#: pretix/control/forms/event.py:1798 pretix/control/navigation.py:237 +#: pretix/control/templates/pretixcontrol/event/settings.html:362 #: pretix/control/templates/pretixcontrol/orders/cancel.html:62 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:9 #: pretix/plugins/sendmail/views.py:448 #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:31 #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:44 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:93 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:100 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:97 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:104 #: pretix/presale/templates/pretixpresale/event/index.html:200 #: pretix/presale/templates/pretixpresale/event/waitinglist.html:3 #: pretix/presale/templates/pretixpresale/event/waitinglist_remove.html:3 @@ -2018,7 +2024,7 @@ msgstr "" #: pretix/base/exporters/items.py:80 pretix/base/models/discount.py:82 #: pretix/base/models/items.py:224 pretix/base/models/items.py:280 -#: pretix/base/models/items.py:562 pretix/base/models/items.py:1205 +#: pretix/base/models/items.py:561 pretix/base/models/items.py:1204 #: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 #: pretix/control/forms/subevents.py:345 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 @@ -2029,7 +2035,7 @@ msgstr "" #: pretix/base/exporters/items.py:81 pretix/base/models/discount.py:87 #: pretix/base/models/items.py:229 pretix/base/models/items.py:285 -#: pretix/base/models/items.py:572 pretix/base/models/items.py:1215 +#: pretix/base/models/items.py:571 pretix/base/models/items.py:1214 #: pretix/base/payment.py:400 pretix/control/forms/subevents.py:328 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:512 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:177 @@ -2037,68 +2043,68 @@ msgstr "" msgid "Available until" msgstr "" -#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:609 +#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:608 msgid "This product can only be bought using a voucher." msgstr "" -#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:622 +#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:621 msgid "" "This product will only be shown if a voucher matching the product is " "redeemed." msgstr "" -#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:615 +#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:614 msgid "Buying this product requires approval" msgstr "" -#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:628 +#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:627 msgid "Only sell this product as part of a bundle" msgstr "" -#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:635 +#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:634 msgid "Allow product to be canceled or changed" msgstr "" -#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:641 +#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:640 msgid "Minimum amount per order" msgstr "" -#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:648 +#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:647 msgid "Maximum amount per order" msgstr "" #: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:284 -#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:656 -#: pretix/base/models/items.py:1242 pretix/base/models/orders.py:282 +#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:655 +#: pretix/base/models/items.py:1241 pretix/base/models/orders.py:282 #: pretix/plugins/checkinlists/exporters.py:524 msgid "Requires special attention" msgstr "" #: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:285 -#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:663 -#: pretix/base/models/items.py:1249 pretix/base/models/orders.py:289 +#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:662 +#: pretix/base/models/items.py:1248 pretix/base/models/orders.py:289 #: pretix/plugins/checkinlists/exporters.py:526 msgid "Check-in text" msgstr "" -#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:668 -#: pretix/base/models/items.py:1169 +#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:667 +#: pretix/base/models/items.py:1168 msgid "Original price" msgstr "" -#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:685 +#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:684 msgid "This product is a gift card" msgstr "" -#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:691 -#: pretix/base/models/items.py:1190 +#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:690 +#: pretix/base/models/items.py:1189 #: pretix/control/templates/pretixcontrol/item/include_variations.html:41 #: pretix/control/templates/pretixcontrol/item/include_variations.html:167 msgid "Require a valid membership" msgstr "" -#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:700 -#: pretix/base/models/items.py:1199 +#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:699 +#: pretix/base/models/items.py:1198 msgid "Hide without a valid membership" msgstr "" @@ -2134,20 +2140,20 @@ msgid "" "position, and one with a line for every additional fee charged in an order." msgstr "" -#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:332 +#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:337 #: pretix/control/navigation.py:255 pretix/control/navigation.py:362 #: pretix/control/templates/pretixcontrol/orders/index.html:8 #: pretix/control/templates/pretixcontrol/orders/index.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer.html:199 #: pretix/plugins/reports/accountingreport.py:671 -#: pretix/plugins/reports/accountingreport.py:863 +#: pretix/plugins/reports/accountingreport.py:865 #: pretix/plugins/reports/exporters.py:669 pretix/plugins/statistics/apps.py:39 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:13 #: pretix/presale/views/customer.py:360 msgid "Orders" msgstr "" -#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2572 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2631 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "" @@ -2174,8 +2180,8 @@ msgid "Only include orders created within this date range." msgstr "" #: pretix/base/exporters/orderlist.py:137 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/base/settings.py:1110 -#: pretix/base/settings.py:1121 pretix/plugins/badges/exporters.py:499 +#: pretix/base/pdf.py:246 pretix/base/settings.py:1140 +#: pretix/base/settings.py:1151 pretix/plugins/badges/exporters.py:499 #: pretix/plugins/reports/exporters.py:316 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 @@ -2194,7 +2200,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:896 #: pretix/base/exporters/orderlist.py:1097 #: pretix/base/exporters/orderlist.py:1282 -#: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1672 +#: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1774 #: pretix/control/forms/organizer.py:116 msgid "Event slug" msgstr "" @@ -2213,10 +2219,10 @@ msgstr "" #: pretix/control/forms/filter.py:2395 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:52 #: pretix/control/templates/pretixcontrol/checkin/index.html:112 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:97 #: pretix/control/templates/pretixcontrol/events/index.html:90 -#: pretix/control/templates/pretixcontrol/order/index.html:795 -#: pretix/control/templates/pretixcontrol/order/index.html:891 +#: pretix/control/templates/pretixcontrol/order/index.html:826 +#: pretix/control/templates/pretixcontrol/order/index.html:922 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 @@ -2244,7 +2250,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:456 #: pretix/base/exporters/orderlist.py:589 #: pretix/base/exporters/orderlist.py:900 pretix/base/notifications.py:203 -#: pretix/base/settings.py:1111 pretix/base/settings.py:1122 +#: pretix/base/settings.py:1141 pretix/base/settings.py:1152 #: pretix/control/forms/filter.py:2356 #: pretix/control/templates/pretixcontrol/order/index.html:183 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 @@ -2346,8 +2352,8 @@ msgstr "" #: pretix/base/exporters/orderlist.py:460 #: pretix/base/exporters/orderlist.py:601 #: pretix/base/exporters/orderlist.py:920 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3028 -#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:638 +#: pretix/base/models/orders.py:1523 pretix/base/models/orders.py:3094 +#: pretix/base/pdf.py:161 pretix/control/forms/orders.py:638 #: pretix/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 #: pretix/control/templates/pretixcontrol/order/change.html:418 @@ -2386,8 +2392,8 @@ msgstr "" #: pretix/base/forms/questions.py:661 pretix/base/models/memberships.py:145 #: pretix/control/forms/rrule.py:49 #: pretix/control/templates/pretixcontrol/events/index.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:792 -#: pretix/control/templates/pretixcontrol/order/index.html:886 +#: pretix/control/templates/pretixcontrol/order/index.html:823 +#: pretix/control/templates/pretixcontrol/order/index.html:917 #: pretix/control/templates/pretixcontrol/orders/refunds.html:55 #: pretix/control/templates/pretixcontrol/organizers/detail.html:66 #: pretix/control/templates/pretixcontrol/search/payments.html:83 @@ -2415,7 +2421,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:911 #: pretix/base/exporters/waitinglist.py:112 #: pretix/base/modelimport_orders.py:129 -#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:794 +#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:793 #: pretix/base/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 #: pretix/control/forms/filter.py:2156 pretix/control/forms/filter.py:2411 #: pretix/control/forms/orders.py:335 pretix/control/forms/vouchers.py:67 @@ -2494,7 +2500,7 @@ msgid "Blocked" msgstr "" #: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2539 +#: pretix/base/models/orders.py:2598 #: pretix/control/templates/pretixcontrol/organizers/customer.html:118 #: pretix/plugins/checkinlists/exporters.py:533 #: pretix/plugins/checkinlists/exporters.py:707 @@ -2504,7 +2510,7 @@ msgid "Valid from" msgstr "" #: pretix/base/exporters/orderlist.py:629 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2544 +#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2603 #: pretix/base/models/vouchers.py:224 #: pretix/control/templates/pretixcontrol/organizers/customer.html:119 #: pretix/control/views/vouchers.py:119 @@ -2558,8 +2564,8 @@ msgid "Only include transactions created within this date range." msgstr "" #: pretix/base/exporters/orderlist.py:895 pretix/base/models/event.py:695 -#: pretix/base/models/items.py:468 pretix/base/models/items.py:2060 -#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3111 +#: pretix/base/models/items.py:468 pretix/base/models/items.py:2059 +#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3196 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 #: pretix/base/notifications.py:187 #: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 @@ -2580,7 +2586,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1383 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:50 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:34 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:36 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:15 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html:39 @@ -2601,13 +2607,13 @@ msgstr "" msgid "Old data" msgstr "" -#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1554 #: pretix/control/templates/pretixcontrol/order/transactions.html:23 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:207 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:353 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:225 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:377 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:241 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:405 #: pretix/presale/templates/pretixpresale/event/voucher.html:234 #: pretix/presale/templates/pretixpresale/event/voucher.html:389 msgid "Quantity" @@ -2678,10 +2684,10 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1097 #: pretix/base/exporters/orderlist.py:1239 -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:331 -#: pretix/base/models/orders.py:1740 pretix/base/models/orders.py:2168 -#: pretix/base/models/orders.py:2327 pretix/base/models/orders.py:2499 -#: pretix/base/models/orders.py:2990 +#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:336 +#: pretix/base/models/orders.py:1766 pretix/base/models/orders.py:2194 +#: pretix/base/models/orders.py:2356 pretix/base/models/orders.py:2555 +#: pretix/base/models/orders.py:3056 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:23 #: pretix/control/templates/pretixcontrol/organizers/customer.html:120 #: pretix/control/templates/pretixcontrol/search/payments.html:78 @@ -2709,7 +2715,7 @@ msgid "Creation date" msgstr "" #: pretix/base/exporters/orderlist.py:1097 -#: pretix/control/templates/pretixcontrol/order/index.html:887 +#: pretix/control/templates/pretixcontrol/order/index.html:918 msgid "Completion date" msgstr "" @@ -2719,16 +2725,16 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1098 #: pretix/base/exporters/orderlist.py:1237 -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:1736 -#: pretix/base/models/orders.py:2164 pretix/control/forms/filter.py:1082 +#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:1762 +#: pretix/base/models/orders.py:2190 pretix/control/forms/filter.py:1082 #: pretix/control/forms/filter.py:1085 -#: pretix/control/templates/pretixcontrol/order/index.html:796 -#: pretix/control/templates/pretixcontrol/order/index.html:892 +#: pretix/control/templates/pretixcontrol/order/index.html:827 +#: pretix/control/templates/pretixcontrol/order/index.html:923 #: pretix/control/templates/pretixcontrol/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 #: pretix/plugins/banktransfer/payment.py:299 #: pretix/plugins/banktransfer/payment.py:308 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Amount" @@ -2737,8 +2743,8 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1098 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:115 -#: pretix/control/templates/pretixcontrol/order/index.html:794 -#: pretix/control/templates/pretixcontrol/order/index.html:889 +#: pretix/control/templates/pretixcontrol/order/index.html:825 +#: pretix/control/templates/pretixcontrol/order/index.html:920 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:85 #: pretix/plugins/reports/accountingreport.py:496 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:29 @@ -2775,11 +2781,11 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 -#: pretix/control/views/item.py:970 +#: pretix/control/views/item.py:971 msgid "Paid orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:975 +#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:976 msgid "Pending orders" msgstr "" @@ -2787,7 +2793,7 @@ msgstr "" msgid "Blocking vouchers" msgstr "" -#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:994 +#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:995 msgid "Current user's carts" msgstr "" @@ -2802,7 +2808,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1173 #: pretix/base/exporters/orderlist.py:1180 #: pretix/control/templates/pretixcontrol/items/quota.html:58 -#: pretix/control/views/item.py:1001 +#: pretix/control/views/item.py:1002 msgid "Infinite" msgstr "" @@ -2823,9 +2829,9 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1234 #: pretix/base/exporters/orderlist.py:1282 #: pretix/base/exporters/orderlist.py:1378 pretix/base/models/giftcards.py:96 -#: pretix/base/payment.py:1485 +#: pretix/base/payment.py:1489 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:4 -#: pretix/control/templates/pretixcontrol/order/index.html:558 +#: pretix/control/templates/pretixcontrol/order/index.html:563 #: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:28 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:56 @@ -2857,7 +2863,7 @@ msgstr "" msgid "Organizer" msgstr "" -#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:587 +#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:588 #: pretix/control/templates/pretixcontrol/base.html:281 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 @@ -2905,7 +2911,7 @@ msgstr "" #: pretix/control/navigation.py:568 #: pretix/control/templates/pretixcontrol/organizers/customer.html:285 #: pretix/control/templates/pretixcontrol/organizers/edit.html:156 -#: pretix/plugins/reports/accountingreport.py:899 +#: pretix/plugins/reports/accountingreport.py:907 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 #: pretix/presale/views/customer.py:372 @@ -3045,7 +3051,7 @@ msgid "Identifier" msgstr "" #: pretix/base/exporters/reusablemedia.py:50 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3123 +#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3208 #: pretix/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" @@ -3140,16 +3146,16 @@ msgstr "" msgid "Keep me logged in" msgstr "" -#: pretix/base/forms/auth.py:65 pretix/base/forms/auth.py:272 +#: pretix/base/forms/auth.py:65 pretix/base/forms/auth.py:285 msgid "This combination of credentials is not known to our system." msgstr "" -#: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:57 +#: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:94 #: pretix/presale/forms/customer.py:385 pretix/presale/forms/customer.py:457 msgid "For security reasons, please wait 5 minutes before you try again." msgstr "" -#: pretix/base/forms/auth.py:67 pretix/base/forms/auth.py:273 +#: pretix/base/forms/auth.py:67 pretix/base/forms/auth.py:286 msgid "This account is inactive." msgstr "" @@ -3159,16 +3165,25 @@ msgid "" msgstr "" #: pretix/base/forms/auth.py:157 pretix/base/forms/auth.py:215 -#: pretix/base/forms/user.py:56 pretix/control/forms/users.py:45 +#: pretix/base/forms/user.py:93 pretix/control/forms/users.py:45 #: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:384 msgid "Please enter the same password twice" msgstr "" -#: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:224 +#: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:234 #: pretix/presale/forms/customer.py:308 pretix/presale/forms/customer.py:403 msgid "Repeat password" msgstr "" +#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99 +msgid "Your email address" +msgstr "" + +#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041 +#: pretix/control/templates/pretixcontrol/shredder/download.html:53 +msgid "Confirmation code" +msgstr "" + #: pretix/base/forms/questions.py:137 pretix/base/forms/questions.py:264 msgctxt "name_salutation" msgid "not specified" @@ -3278,68 +3293,74 @@ msgstr "" msgid "This field is required for the selected type of invoice transmission." msgstr "" -#: pretix/base/forms/user.py:51 pretix/control/forms/users.py:43 -msgid "" -"There already is an account associated with this email address. Please " -"choose a different one." -msgstr "" - -#: pretix/base/forms/user.py:53 -msgid "" -"Please enter your current password if you want to change your email address " -"or password." -msgstr "" - -#: pretix/base/forms/user.py:55 pretix/presale/forms/customer.py:383 -#: pretix/presale/forms/customer.py:456 -msgid "The current password you entered was not correct." -msgstr "" - -#: pretix/base/forms/user.py:58 -msgid "Please choose a password different to your current one." -msgstr "" - -#: pretix/base/forms/user.py:63 pretix/presale/forms/customer.py:392 -#: pretix/presale/forms/customer.py:461 -msgid "Your current password" -msgstr "" - -#: pretix/base/forms/user.py:67 pretix/control/forms/users.py:50 -#: pretix/presale/forms/customer.py:397 -msgid "New password" -msgstr "" - -#: pretix/base/forms/user.py:71 pretix/control/forms/users.py:54 -msgid "Repeat new password" -msgstr "" - -#: pretix/base/forms/user.py:75 pretix/control/forms/organizer.py:458 +#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458 #: pretix/control/forms/users.py:58 msgid "Default timezone" msgstr "" -#: pretix/base/forms/user.py:76 pretix/control/forms/users.py:59 +#: pretix/base/forms/user.py:55 pretix/control/forms/users.py:59 msgid "" "Only used for views that are not bound to an event. For all event views, the " "event timezone is used instead." msgstr "" -#: pretix/base/forms/user.py:175 +#: pretix/base/forms/user.py:77 +msgid "Change email address" +msgstr "" + +#: pretix/base/forms/user.py:83 msgid "Device name" msgstr "" -#: pretix/base/forms/user.py:176 +#: pretix/base/forms/user.py:84 msgid "Device type" msgstr "" -#: pretix/base/forms/user.py:177 +#: pretix/base/forms/user.py:85 msgid "Smartphone with the Authenticator application" msgstr "" -#: pretix/base/forms/user.py:178 +#: pretix/base/forms/user.py:86 msgid "WebAuthn-compatible hardware token (e.g. Yubikey)" msgstr "" +#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:383 +#: pretix/presale/forms/customer.py:456 +msgid "The current password you entered was not correct." +msgstr "" + +#: pretix/base/forms/user.py:95 +msgid "Please choose a password different to your current one." +msgstr "" + +#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:392 +#: pretix/presale/forms/customer.py:461 +msgid "Your current password" +msgstr "" + +#: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50 +#: pretix/presale/forms/customer.py:397 +msgid "New password" +msgstr "" + +#: pretix/base/forms/user.py:117 pretix/control/forms/users.py:54 +msgid "Repeat new password" +msgstr "" + +#: pretix/base/forms/user.py:176 pretix/control/forms/users.py:43 +msgid "" +"There already is an account associated with this email address. Please " +"choose a different one." +msgstr "" + +#: pretix/base/forms/user.py:179 +msgid "Old email address" +msgstr "" + +#: pretix/base/forms/user.py:180 +msgid "New email address" +msgstr "" + #: pretix/base/forms/validators.py:51 msgid "" "There is an error with your placeholder syntax. Please check that the " @@ -3348,7 +3369,7 @@ msgid "" "\"{{\" and \"}}\"." msgstr "" -#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:851 +#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:870 #, python-format msgid "Invalid placeholder: {%(value)s}" msgstr "" @@ -3363,7 +3384,7 @@ msgstr "" msgid "Available placeholders: {list}" msgstr "" -#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1656 +#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1655 #: pretix/plugins/checkinlists/exporters.py:757 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54 @@ -3430,68 +3451,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:142 +#: pretix/base/invoicing/pdf.py:143 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "" -#: pretix/base/invoicing/pdf.py:383 +#: pretix/base/invoicing/pdf.py:384 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "" -#: pretix/base/invoicing/pdf.py:427 +#: pretix/base/invoicing/pdf.py:428 msgctxt "invoice" msgid "Invoice from" msgstr "" -#: pretix/base/invoicing/pdf.py:433 +#: pretix/base/invoicing/pdf.py:434 msgctxt "invoice" msgid "Invoice to" msgstr "" -#: pretix/base/invoicing/pdf.py:470 pretix/base/invoicing/pdf.py:1143 +#: pretix/base/invoicing/pdf.py:471 pretix/base/invoicing/pdf.py:1222 msgctxt "invoice" msgid "Order code" msgstr "" -#: pretix/base/invoicing/pdf.py:479 pretix/base/invoicing/pdf.py:1156 +#: pretix/base/invoicing/pdf.py:480 pretix/base/invoicing/pdf.py:1235 msgctxt "invoice" msgid "Cancellation number" msgstr "" -#: pretix/base/invoicing/pdf.py:485 pretix/base/invoicing/pdf.py:1158 +#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1237 msgctxt "invoice" msgid "Original invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:490 pretix/base/invoicing/pdf.py:1163 +#: pretix/base/invoicing/pdf.py:491 pretix/base/invoicing/pdf.py:1242 msgctxt "invoice" msgid "Invoice number" msgstr "" -#: pretix/base/invoicing/pdf.py:498 pretix/base/invoicing/pdf.py:1178 +#: pretix/base/invoicing/pdf.py:499 pretix/base/invoicing/pdf.py:1257 msgctxt "invoice" msgid "Cancellation date" msgstr "" -#: pretix/base/invoicing/pdf.py:504 +#: pretix/base/invoicing/pdf.py:505 msgctxt "invoice" msgid "Original invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:511 pretix/base/invoicing/pdf.py:1180 +#: pretix/base/invoicing/pdf.py:512 pretix/base/invoicing/pdf.py:1259 msgctxt "invoice" msgid "Invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:527 +#: pretix/base/invoicing/pdf.py:528 msgctxt "invoice" msgid "Event" msgstr "" -#: pretix/base/invoicing/pdf.py:561 +#: pretix/base/invoicing/pdf.py:562 #, python-brace-format msgctxt "invoice" msgid "" @@ -3499,39 +3520,39 @@ msgid "" "until {to_date}" msgstr "" -#: pretix/base/invoicing/pdf.py:608 pretix/base/services/mail.py:511 +#: pretix/base/invoicing/pdf.py:609 pretix/base/services/mail.py:512 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "" -#: pretix/base/invoicing/pdf.py:660 +#: pretix/base/invoicing/pdf.py:661 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "" -#: pretix/base/invoicing/pdf.py:668 +#: pretix/base/invoicing/pdf.py:669 msgctxt "invoice" msgid "Customer VAT ID" msgstr "" -#: pretix/base/invoicing/pdf.py:675 +#: pretix/base/invoicing/pdf.py:676 msgctxt "invoice" msgid "Beneficiary" msgstr "" -#: pretix/base/invoicing/pdf.py:708 +#: pretix/base/invoicing/pdf.py:709 msgctxt "invoice" msgid "Tax Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:709 +#: pretix/base/invoicing/pdf.py:710 msgctxt "invoice" msgid "Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:710 +#: pretix/base/invoicing/pdf.py:711 #: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/control/templates/pretixcontrol/order/mail_history.html:70 #: pretix/presale/templates/pretixpresale/event/order.html:244 @@ -3539,100 +3560,100 @@ msgctxt "invoice" msgid "Cancellation" msgstr "" -#: pretix/base/invoicing/pdf.py:732 pretix/base/invoicing/pdf.py:740 +#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 msgctxt "invoice" msgid "Description" msgstr "" -#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 +#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:742 msgctxt "invoice" msgid "Qty" msgstr "" -#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:960 +#: pretix/base/invoicing/pdf.py:735 pretix/base/invoicing/pdf.py:1039 msgctxt "invoice" msgid "Tax rate" msgstr "" -#: pretix/base/invoicing/pdf.py:735 +#: pretix/base/invoicing/pdf.py:736 msgctxt "invoice" msgid "Net" msgstr "" -#: pretix/base/invoicing/pdf.py:736 +#: pretix/base/invoicing/pdf.py:737 msgctxt "invoice" msgid "Gross" msgstr "" -#: pretix/base/invoicing/pdf.py:742 +#: pretix/base/invoicing/pdf.py:743 msgctxt "invoice" msgid "Amount" msgstr "" -#: pretix/base/invoicing/pdf.py:818 +#: pretix/base/invoicing/pdf.py:870 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:842 +#: pretix/base/invoicing/pdf.py:901 #, python-brace-format msgctxt "invoice" msgid "Single price: {price}" msgstr "" -#: pretix/base/invoicing/pdf.py:863 pretix/base/invoicing/pdf.py:869 +#: pretix/base/invoicing/pdf.py:944 pretix/base/invoicing/pdf.py:949 msgctxt "invoice" msgid "Invoice total" msgstr "" -#: pretix/base/invoicing/pdf.py:879 +#: pretix/base/invoicing/pdf.py:958 msgctxt "invoice" msgid "Received payments" msgstr "" -#: pretix/base/invoicing/pdf.py:884 +#: pretix/base/invoicing/pdf.py:963 msgctxt "invoice" msgid "Outstanding payments" msgstr "" -#: pretix/base/invoicing/pdf.py:901 +#: pretix/base/invoicing/pdf.py:980 msgctxt "invoice" msgid "Paid by gift card" msgstr "" -#: pretix/base/invoicing/pdf.py:906 +#: pretix/base/invoicing/pdf.py:985 msgctxt "invoice" msgid "Remaining amount" msgstr "" -#: pretix/base/invoicing/pdf.py:930 +#: pretix/base/invoicing/pdf.py:1009 #, python-brace-format msgctxt "invoice" msgid "Invoice period: {daterange}" msgstr "" -#: pretix/base/invoicing/pdf.py:961 +#: pretix/base/invoicing/pdf.py:1040 msgctxt "invoice" msgid "Net value" msgstr "" -#: pretix/base/invoicing/pdf.py:962 +#: pretix/base/invoicing/pdf.py:1041 msgctxt "invoice" msgid "Gross value" msgstr "" -#: pretix/base/invoicing/pdf.py:963 +#: pretix/base/invoicing/pdf.py:1042 msgctxt "invoice" msgid "Tax" msgstr "" -#: pretix/base/invoicing/pdf.py:993 +#: pretix/base/invoicing/pdf.py:1072 msgctxt "invoice" msgid "Included taxes" msgstr "" -#: pretix/base/invoicing/pdf.py:1021 +#: pretix/base/invoicing/pdf.py:1100 #, python-brace-format msgctxt "invoice" msgid "" @@ -3640,7 +3661,7 @@ msgid "" "{date}, this corresponds to:" msgstr "" -#: pretix/base/invoicing/pdf.py:1036 +#: pretix/base/invoicing/pdf.py:1115 #, python-brace-format msgctxt "invoice" msgid "" @@ -3648,20 +3669,20 @@ msgid "" "{date}, the invoice total corresponds to {total}." msgstr "" -#: pretix/base/invoicing/pdf.py:1050 +#: pretix/base/invoicing/pdf.py:1129 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1139 +#: pretix/base/invoicing/pdf.py:1218 msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "" -#: pretix/base/invoicing/pdf.py:1186 +#: pretix/base/invoicing/pdf.py:1265 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1205 +#: pretix/base/invoicing/pdf.py:1284 #, python-brace-format msgctxt "invoice" msgid "Event date: {date_range}" @@ -3796,9 +3817,9 @@ msgstr "" msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1174 -#: pretix/control/views/orders.py:1203 pretix/control/views/orders.py:1248 -#: pretix/control/views/orders.py:1283 pretix/control/views/orders.py:1306 +#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1179 +#: pretix/control/views/orders.py:1208 pretix/control/views/orders.py:1253 +#: pretix/control/views/orders.py:1288 pretix/control/views/orders.py:1311 msgid "You entered an invalid number." msgstr "" @@ -3855,7 +3876,7 @@ msgid "Multiple matching products were found." msgstr "" #: pretix/base/modelimport_orders.py:160 -#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1257 +#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1256 #: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99 msgid "Product variation" msgstr "" @@ -3910,7 +3931,7 @@ msgstr "" #: pretix/control/forms/filter.py:687 pretix/control/forms/filter.py:691 #: pretix/control/forms/filter.py:695 pretix/control/forms/filter.py:700 #: pretix/control/forms/filter.py:705 -#: pretix/control/templates/pretixcontrol/order/index.html:603 +#: pretix/control/templates/pretixcontrol/order/index.html:608 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196 msgid "Attendee address" @@ -3926,7 +3947,7 @@ msgstr "" #: pretix/base/modelimport_orders.py:486 #: pretix/control/templates/pretixcontrol/checkin/index.html:111 -#: pretix/control/templates/pretixcontrol/order/index.html:531 +#: pretix/control/templates/pretixcontrol/order/index.html:536 msgid "Ticket code" msgstr "" @@ -3978,8 +3999,8 @@ msgstr "" msgid "You need to select a specific seat." msgstr "" -#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1671 -#: pretix/base/models/items.py:1766 pretix/control/forms/item.py:147 +#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1670 +#: pretix/base/models/items.py:1765 pretix/control/forms/item.py:148 #: pretix/control/templates/pretixcontrol/items/question_edit.html:10 #: pretix/control/templates/pretixcontrol/items/question_edit.html:17 #: pretix/control/templates/pretixcontrol/items/questions.html:21 @@ -3987,7 +4008,7 @@ msgid "Question" msgstr "" #: pretix/base/modelimport_orders.py:701 pretix/base/modelimport_orders.py:709 -#: pretix/base/models/items.py:1830 pretix/base/models/items.py:1848 +#: pretix/base/models/items.py:1829 pretix/base/models/items.py:1847 msgid "Invalid option selected." msgstr "" @@ -4051,7 +4072,7 @@ msgstr "" msgid "It is pointless to set a value without a price mode." msgstr "" -#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2121 +#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2120 #: pretix/base/models/vouchers.py:275 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:8 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:15 @@ -4100,35 +4121,35 @@ msgid "" "voucher" msgstr "" -#: pretix/base/models/auth.py:248 +#: pretix/base/models/auth.py:252 msgid "Is active" msgstr "" -#: pretix/base/models/auth.py:250 +#: pretix/base/models/auth.py:254 msgid "Is site admin" msgstr "" -#: pretix/base/models/auth.py:252 +#: pretix/base/models/auth.py:256 msgid "Date joined" msgstr "" -#: pretix/base/models/auth.py:254 +#: pretix/base/models/auth.py:258 msgid "Force user to select a new password" msgstr "" -#: pretix/base/models/auth.py:264 +#: pretix/base/models/auth.py:268 msgid "Two-factor authentication is required to log in" msgstr "" -#: pretix/base/models/auth.py:268 +#: pretix/base/models/auth.py:272 msgid "Receive notifications according to my settings below" msgstr "" -#: pretix/base/models/auth.py:269 +#: pretix/base/models/auth.py:273 msgid "If turned off, you will not get any notifications." msgstr "" -#: pretix/base/models/auth.py:283 +#: pretix/base/models/auth.py:287 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:23 #: pretix/control/templates/pretixcontrol/orders/index.html:135 #: pretix/control/templates/pretixcontrol/search/orders.html:54 @@ -4136,21 +4157,39 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:15 #: pretix/control/templates/pretixcontrol/users/form.html:4 #: pretix/control/templates/pretixcontrol/users/form.html:6 -#: pretix/control/views/organizer.py:170 tests/base/test_mail.py:149 +#: pretix/control/views/organizer.py:170 tests/base/test_mail.py:157 msgid "User" msgstr "" -#: pretix/base/models/auth.py:284 pretix/control/navigation.py:411 +#: pretix/base/models/auth.py:288 pretix/control/navigation.py:411 #: pretix/control/templates/pretixcontrol/users/index.html:5 #: pretix/control/templates/pretixcontrol/users/index.html:7 msgid "Users" msgstr "" -#: pretix/base/models/auth.py:342 +#: pretix/base/models/auth.py:346 msgid "Account information changed" msgstr "" -#: pretix/base/models/auth.py:360 +#: pretix/base/models/auth.py:374 +#, python-brace-format +msgid "" +"to confirm changing your email address from {old_email}\n" +"to {new_email}, use the following code:" +msgstr "" + +#: pretix/base/models/auth.py:378 +#, python-brace-format +msgid "" +"to confirm that your email address {email} belongs to your pretix account, " +"use the following code:" +msgstr "" + +#: pretix/base/models/auth.py:392 +msgid "pretix confirmation code" +msgstr "" + +#: pretix/base/models/auth.py:435 #: pretix/control/templates/pretixcontrol/auth/forgot.html:7 msgid "Password recovery" msgstr "" @@ -4310,7 +4349,7 @@ msgid "Single-sign-on method" msgstr "" #: pretix/base/models/customers.py:92 pretix/base/models/devices.py:71 -#: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 +#: pretix/base/models/items.py:1675 pretix/base/models/items.py:1951 msgid "" "You can enter any value here to make it easier to match the data with other " "sources. If you do not input one, we will generate one automatically." @@ -4331,13 +4370,13 @@ msgstr "" msgid "disabled" msgstr "" -#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1538 -#: pretix/base/models/orders.py:3294 pretix/base/settings.py:1179 +#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1564 +#: pretix/base/models/orders.py:3392 pretix/base/settings.py:1210 msgid "Company name" msgstr "" -#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3301 pretix/base/settings.py:83 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3399 pretix/base/settings.py:91 #: pretix/plugins/stripe/payment.py:272 msgid "Select country" msgstr "" @@ -4406,11 +4445,11 @@ msgstr "" msgid "System error, needs manual intervention" msgstr "" -#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1675 +#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1674 msgid "Internal identifier" msgstr "" -#: pretix/base/models/devices.py:90 pretix/base/models/items.py:1788 +#: pretix/base/models/devices.py:90 pretix/base/models/items.py:1787 msgid "This identifier is already used for a different question." msgstr "" @@ -4447,8 +4486,8 @@ msgctxt "subevent" msgid "Each matching product must be for a different date" msgstr "" -#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1161 -#: pretix/base/models/items.py:1481 pretix/base/models/items.py:1708 +#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1160 +#: pretix/base/models/items.py:1480 pretix/base/models/items.py:1707 #: pretix/base/models/organizer.py:619 msgid "Position" msgstr "" @@ -4603,7 +4642,7 @@ msgstr "" msgid "The slug may only contain letters, numbers, dots and dashes." msgstr "" -#: pretix/base/models/event.py:624 pretix/base/models/event.py:1519 +#: pretix/base/models/event.py:624 pretix/base/models/event.py:1525 msgid "Show in lists" msgstr "" @@ -4613,14 +4652,14 @@ msgid "" "organizer account." msgstr "" -#: pretix/base/models/event.py:629 pretix/base/models/event.py:1534 +#: pretix/base/models/event.py:629 pretix/base/models/event.py:1540 #: pretix/control/forms/subevents.py:100 msgid "" "Optional. No products will be sold after this date. If you do not set this " "value, the presale will end after the end date of your event." msgstr "" -#: pretix/base/models/event.py:635 pretix/base/models/event.py:1540 +#: pretix/base/models/event.py:635 pretix/base/models/event.py:1546 #: pretix/control/forms/subevents.py:94 msgid "Optional. No products will be sold before this date." msgstr "" @@ -4640,7 +4679,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: pretix/base/models/event.py:672 pretix/base/pdf.py:240 +#: pretix/base/models/event.py:672 pretix/base/pdf.py:241 #: pretix/control/forms/event.py:273 pretix/control/forms/filter.py:1706 #: pretix/control/templates/pretixcontrol/event/index.html:13 #: pretix/control/templates/pretixcontrol/events/index.html:114 @@ -4652,16 +4691,16 @@ msgstr "" msgid "Event series" msgstr "" -#: pretix/base/models/event.py:676 pretix/base/models/event.py:1568 +#: pretix/base/models/event.py:676 pretix/base/models/event.py:1574 msgid "Seating plan" msgstr "" -#: pretix/base/models/event.py:683 pretix/base/models/items.py:675 +#: pretix/base/models/event.py:683 pretix/base/models/items.py:674 msgid "Sell on all sales channels" msgstr "" -#: pretix/base/models/event.py:688 pretix/base/models/items.py:680 -#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 +#: pretix/base/models/event.py:688 pretix/base/models/items.py:679 +#: pretix/base/models/items.py:1229 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "" @@ -4678,144 +4717,144 @@ msgstr "" msgid "Events" msgstr "" -#: pretix/base/models/event.py:1339 +#: pretix/base/models/event.py:1345 msgid "" "You have configured at least one paid product but have not enabled any " "payment methods." msgstr "" -#: pretix/base/models/event.py:1342 +#: pretix/base/models/event.py:1348 msgid "" "You have configured at least one paid product but have not configured a " "currency." msgstr "" -#: pretix/base/models/event.py:1345 +#: pretix/base/models/event.py:1351 msgid "You need to configure at least one quota to sell anything." msgstr "" -#: pretix/base/models/event.py:1350 +#: pretix/base/models/event.py:1356 #, python-brace-format msgid "You need to fill the meta parameter \"{property}\"." msgstr "" -#: pretix/base/models/event.py:1465 +#: pretix/base/models/event.py:1471 msgid "" "Once created an event cannot change between an series and a single event." msgstr "" -#: pretix/base/models/event.py:1471 +#: pretix/base/models/event.py:1477 msgid "The event slug cannot be changed." msgstr "" -#: pretix/base/models/event.py:1474 +#: pretix/base/models/event.py:1480 msgid "This slug has already been used for a different event." msgstr "" -#: pretix/base/models/event.py:1480 +#: pretix/base/models/event.py:1486 msgid "The event cannot end before it starts." msgstr "" -#: pretix/base/models/event.py:1486 +#: pretix/base/models/event.py:1492 msgid "The event's presale cannot end before it starts." msgstr "" -#: pretix/base/models/event.py:1516 +#: pretix/base/models/event.py:1522 msgid "" "Only with this checkbox enabled, this date is visible in the frontend to " "users." msgstr "" -#: pretix/base/models/event.py:1520 +#: pretix/base/models/event.py:1526 msgid "" "If selected, this event will show up publicly on the list of dates for your " "event." msgstr "" -#: pretix/base/models/event.py:1565 pretix/base/settings.py:3145 +#: pretix/base/models/event.py:1571 pretix/base/settings.py:3199 msgid "Frontpage text" msgstr "" -#: pretix/base/models/event.py:1582 +#: pretix/base/models/event.py:1588 msgid "Date in event series" msgstr "" -#: pretix/base/models/event.py:1583 +#: pretix/base/models/event.py:1589 msgid "Dates in event series" msgstr "" -#: pretix/base/models/event.py:1724 +#: pretix/base/models/event.py:1730 msgid "One or more variations do not belong to this event." msgstr "" -#: pretix/base/models/event.py:1754 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1760 pretix/base/models/items.py:2235 msgid "Can not contain spaces or special characters except underscores" msgstr "" -#: pretix/base/models/event.py:1759 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1765 pretix/base/models/items.py:2240 msgid "The property name may only contain letters, numbers and underscores." msgstr "" -#: pretix/base/models/event.py:1764 +#: pretix/base/models/event.py:1770 msgid "Default value" msgstr "" -#: pretix/base/models/event.py:1766 +#: pretix/base/models/event.py:1772 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "" -#: pretix/base/models/event.py:1768 +#: pretix/base/models/event.py:1774 msgid "Required for events" msgstr "" -#: pretix/base/models/event.py:1769 +#: pretix/base/models/event.py:1775 msgid "" "If checked, an event can only be taken live if the property is set. In event " "series, its always optional to set a value for individual dates" msgstr "" -#: pretix/base/models/event.py:1775 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1781 pretix/base/models/items.py:2252 msgid "Valid values" msgstr "" -#: pretix/base/models/event.py:1778 +#: pretix/base/models/event.py:1784 #: pretix/control/templates/pretixcontrol/organizers/properties.html:45 msgid "Show filter option to customers" msgstr "" -#: pretix/base/models/event.py:1779 +#: pretix/base/models/event.py:1785 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1782 pretix/control/forms/organizer.py:269 +#: pretix/base/models/event.py:1788 pretix/control/forms/organizer.py:269 #: pretix/control/forms/organizer.py:273 msgid "Public name" msgstr "" -#: pretix/base/models/event.py:1786 +#: pretix/base/models/event.py:1792 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1787 +#: pretix/base/models/event.py:1793 msgid "" "This field will be shown to filter events or reports in the backend, and it " "can also be used for hidden filter parameters in the frontend (e.g. using " "the widget)." msgstr "" -#: pretix/base/models/event.py:1797 +#: pretix/base/models/event.py:1803 msgid "A property can either be required or have a default value, not both." msgstr "" -#: pretix/base/models/event.py:1877 pretix/base/models/organizer.py:582 +#: pretix/base/models/event.py:1883 pretix/base/models/organizer.py:582 msgid "Link text" msgstr "" -#: pretix/base/models/event.py:1880 pretix/base/models/organizer.py:585 +#: pretix/base/models/event.py:1886 pretix/base/models/organizer.py:585 msgid "Link URL" msgstr "" @@ -4829,7 +4868,7 @@ msgid "Additional recipients" msgstr "" #: pretix/base/models/exports.py:61 pretix/base/models/exports.py:66 -#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:989 +#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:1088 #: pretix/control/forms/organizer.py:586 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -4842,9 +4881,9 @@ msgstr "" msgid "Additional recipients (Bcc)" msgstr "" -#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1095 -#: pretix/control/forms/event.py:1169 pretix/control/forms/event.py:1179 -#: pretix/control/forms/event.py:1189 pretix/control/forms/event.py:1204 +#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1194 +#: pretix/control/forms/event.py:1268 pretix/control/forms/event.py:1278 +#: pretix/control/forms/event.py:1288 pretix/control/forms/event.py:1303 #: pretix/control/forms/orders.py:730 pretix/control/forms/orders.py:952 #: pretix/control/forms/orders.py:979 pretix/control/forms/organizer.py:607 #: pretix/control/forms/organizer.py:617 pretix/control/forms/organizer.py:627 @@ -4921,13 +4960,13 @@ msgstr "" msgid "not transmitted due to test mode" msgstr "" -#: pretix/base/models/invoices.py:220 +#: pretix/base/models/invoices.py:221 #, python-format msgctxt "invoice" msgid "Tax ID: %s" msgstr "" -#: pretix/base/models/invoices.py:226 pretix/base/services/invoices.py:154 +#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:155 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -4958,15 +4997,15 @@ msgid "" msgstr "" #: pretix/base/models/items.py:114 pretix/base/models/items.py:159 -#: pretix/control/forms/item.py:97 +#: pretix/control/forms/item.py:98 msgid "Normal category" msgstr "" -#: pretix/base/models/items.py:115 pretix/control/forms/item.py:110 +#: pretix/base/models/items.py:115 pretix/control/forms/item.py:111 msgid "Normal + cross-selling category" msgstr "" -#: pretix/base/models/items.py:116 pretix/control/forms/item.py:105 +#: pretix/base/models/items.py:116 pretix/control/forms/item.py:106 msgid "Cross-selling category" msgstr "" @@ -5012,12 +5051,12 @@ msgid "Disable product for this date" msgstr "" #: pretix/base/models/items.py:226 pretix/base/models/items.py:282 -#: pretix/base/models/items.py:564 +#: pretix/base/models/items.py:563 msgid "This product will not be sold before the given date." msgstr "" #: pretix/base/models/items.py:231 pretix/base/models/items.py:287 -#: pretix/base/models/items.py:574 +#: pretix/base/models/items.py:573 msgid "This product will not be sold after the given date." msgstr "" @@ -5033,17 +5072,17 @@ msgstr "" msgid "Dynamic validity" msgstr "" -#: pretix/base/models/items.py:444 pretix/control/forms/item.py:668 +#: pretix/base/models/items.py:444 pretix/control/forms/item.py:671 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 msgid "Hide product if unavailable" msgstr "" -#: pretix/base/models/items.py:445 pretix/control/forms/item.py:669 +#: pretix/base/models/items.py:445 pretix/control/forms/item.py:672 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 msgid "Show product with info on why it’s unavailable" msgstr "" -#: pretix/base/models/items.py:456 pretix/base/models/items.py:781 +#: pretix/base/models/items.py:456 pretix/base/models/items.py:780 msgid "Don't use re-usable media, use regular one-off tickets" msgstr "" @@ -5059,7 +5098,7 @@ msgstr "" msgid "Require either an existing or a new medium to be used" msgstr "" -#: pretix/base/models/items.py:475 pretix/base/models/items.py:1458 +#: pretix/base/models/items.py:475 pretix/base/models/items.py:1457 msgid "Category" msgstr "" @@ -5085,15 +5124,14 @@ msgid "" "If this option is active, your users can choose the price themselves. The " "price configured above is then interpreted as the minimum price a user has " "to enter. You could use this e.g. to collect additional donations for your " -"event. This is currently not supported for products that are bought as an " -"add-on to other products." +"event." msgstr "" -#: pretix/base/models/items.py:512 pretix/base/models/items.py:1176 +#: pretix/base/models/items.py:511 pretix/base/models/items.py:1175 msgid "Suggested price" msgstr "" -#: pretix/base/models/items.py:513 pretix/base/models/items.py:1177 +#: pretix/base/models/items.py:512 pretix/base/models/items.py:1176 msgid "" "This price will be used as the default value of the input field. The user " "can choose a lower value, but not lower than the price this product would " @@ -5101,45 +5139,45 @@ msgid "" "used that lowers the price." msgstr "" -#: pretix/base/models/items.py:527 +#: pretix/base/models/items.py:526 msgid "Whether or not buying this product allows a person to enter your event" msgstr "" -#: pretix/base/models/items.py:532 +#: pretix/base/models/items.py:531 msgid "Is a personalized ticket" msgstr "" -#: pretix/base/models/items.py:534 +#: pretix/base/models/items.py:533 msgid "Whether or not buying this product allows to enter attendee information" msgstr "" -#: pretix/base/models/items.py:543 +#: pretix/base/models/items.py:542 msgid "Show a waiting list for this ticket" msgstr "" -#: pretix/base/models/items.py:544 +#: pretix/base/models/items.py:543 msgid "This will only work if waiting lists are enabled for this event." msgstr "" -#: pretix/base/models/items.py:548 pretix/base/settings.py:1427 -#: pretix/control/forms/event.py:1691 +#: pretix/base/models/items.py:547 pretix/base/settings.py:1481 +#: pretix/control/forms/event.py:1793 msgid "Show number of tickets left" msgstr "" -#: pretix/base/models/items.py:549 +#: pretix/base/models/items.py:548 msgid "Publicly show how many tickets are still available." msgstr "" -#: pretix/base/models/items.py:556 pretix/control/forms/item.py:633 +#: pretix/base/models/items.py:555 pretix/control/forms/item.py:636 msgid "Product picture" msgstr "" -#: pretix/base/models/items.py:585 +#: pretix/base/models/items.py:584 msgctxt "hidden_if_available_legacy" msgid "Only show after sellout of" msgstr "" -#: pretix/base/models/items.py:586 +#: pretix/base/models/items.py:585 msgid "" "If you select a quota here, this product will only be shown when that quota " "is unavailable. If combined with the option to hide sold-out products, this " @@ -5148,11 +5186,11 @@ msgid "" "all tickets in the referenced quota are reserved, but not yet sold." msgstr "" -#: pretix/base/models/items.py:596 +#: pretix/base/models/items.py:595 msgid "Only show after sellout of" msgstr "" -#: pretix/base/models/items.py:597 +#: pretix/base/models/items.py:596 msgid "" "If you select a product here, this product will only be shown when that " "product is sold out. If combined with the option to hide sold-out products, " @@ -5162,13 +5200,13 @@ msgid "" "reserved, but not yet sold." msgstr "" -#: pretix/base/models/items.py:611 +#: pretix/base/models/items.py:610 msgid "" "To buy this product, the user needs a voucher that applies to this product " "either directly or via a quota." msgstr "" -#: pretix/base/models/items.py:617 +#: pretix/base/models/items.py:616 msgid "" "If this product is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5176,34 +5214,34 @@ msgid "" "only available to specific groups." msgstr "" -#: pretix/base/models/items.py:624 +#: pretix/base/models/items.py:623 msgid "" "This product will be hidden from the event page until the user enters a " "voucher that unlocks this product." msgstr "" -#: pretix/base/models/items.py:630 +#: pretix/base/models/items.py:629 msgid "" "If this option is set, the product will only be sold as part of bundle " "products. Do not check this option if you want to use this " "product as an add-on product, but only for fixed bundles!" msgstr "" -#: pretix/base/models/items.py:637 +#: pretix/base/models/items.py:636 msgid "" "If this is checked, the usual cancellation and order change settings of this " "event apply. If this is unchecked, orders containing this product can not be " "canceled by users but only by you." msgstr "" -#: pretix/base/models/items.py:644 +#: pretix/base/models/items.py:643 msgid "" "This product can only be bought if it is added to the cart at least this " "many times. If you keep the field empty or set it to 0, there is no special " "limit for this product." msgstr "" -#: pretix/base/models/items.py:651 +#: pretix/base/models/items.py:650 msgid "" "This product can only be bought at most this many times within one order. If " "you keep the field empty or set it to 0, there is no special limit for this " @@ -5211,7 +5249,7 @@ msgid "" "applies regardless." msgstr "" -#: pretix/base/models/items.py:658 pretix/base/models/items.py:1244 +#: pretix/base/models/items.py:657 pretix/base/models/items.py:1243 msgid "" "If you set this, the check-in app will show a visible warning that this " "ticket requires special attention. You can use this for example for student " @@ -5219,62 +5257,62 @@ msgid "" "needs to be checked." msgstr "" -#: pretix/base/models/items.py:665 pretix/base/models/items.py:1251 +#: pretix/base/models/items.py:664 pretix/base/models/items.py:1250 msgid "" "This text will be shown by the check-in app if a ticket of this type is " "scanned." msgstr "" -#: pretix/base/models/items.py:671 pretix/base/models/items.py:1172 +#: pretix/base/models/items.py:670 pretix/base/models/items.py:1171 msgid "" "If set, this will be displayed next to the current price to show that the " "current price is a discounted one. This is just a cosmetic setting and will " "not actually impact pricing." msgstr "" -#: pretix/base/models/items.py:681 +#: pretix/base/models/items.py:680 msgid "Only sell tickets for this product on the selected sales channels." msgstr "" -#: pretix/base/models/items.py:686 +#: pretix/base/models/items.py:685 msgid "" "When a customer buys this product, they will get a gift card with a value " "corresponding to the product price." msgstr "" -#: pretix/base/models/items.py:696 +#: pretix/base/models/items.py:695 msgid "Allowed membership types" msgstr "" -#: pretix/base/models/items.py:701 pretix/base/models/items.py:1200 +#: pretix/base/models/items.py:700 pretix/base/models/items.py:1199 msgid "" "Do not show this unless the customer is logged in and has a valid " "membership. Be aware that this means it will never be visible in the widget." msgstr "" -#: pretix/base/models/items.py:710 +#: pretix/base/models/items.py:709 msgid "This product creates a membership of type" msgstr "" -#: pretix/base/models/items.py:713 +#: pretix/base/models/items.py:712 msgid "" "The duration of the membership is the same as the duration of the event or " "event series date" msgstr "" -#: pretix/base/models/items.py:717 +#: pretix/base/models/items.py:716 msgid "Membership duration in days" msgstr "" -#: pretix/base/models/items.py:721 +#: pretix/base/models/items.py:720 msgid "Membership duration in months" msgstr "" -#: pretix/base/models/items.py:728 +#: pretix/base/models/items.py:727 msgid "Validity" msgstr "" -#: pretix/base/models/items.py:730 +#: pretix/base/models/items.py:729 msgid "" "When setting up a regular event, or an event series with time slots, you " "typically do NOT need to change this value. The default setting means that " @@ -5286,51 +5324,51 @@ msgid "" "change but keep their current validity." msgstr "" -#: pretix/base/models/items.py:738 pretix/control/forms/item.py:736 +#: pretix/base/models/items.py:737 pretix/control/forms/item.py:739 msgid "Start of validity" msgstr "" -#: pretix/base/models/items.py:739 +#: pretix/base/models/items.py:738 msgid "End of validity" msgstr "" -#: pretix/base/models/items.py:742 +#: pretix/base/models/items.py:741 msgid "Minutes" msgstr "" -#: pretix/base/models/items.py:746 +#: pretix/base/models/items.py:745 msgid "Hours" msgstr "" -#: pretix/base/models/items.py:750 +#: pretix/base/models/items.py:749 msgid "Days" msgstr "" -#: pretix/base/models/items.py:754 +#: pretix/base/models/items.py:753 msgid "Months" msgstr "" -#: pretix/base/models/items.py:757 +#: pretix/base/models/items.py:756 msgid "Customers can select the validity start date" msgstr "" -#: pretix/base/models/items.py:758 +#: pretix/base/models/items.py:757 msgid "If not selected, the validity always starts at the time of purchase." msgstr "" -#: pretix/base/models/items.py:763 +#: pretix/base/models/items.py:762 msgid "Maximum future start" msgstr "" -#: pretix/base/models/items.py:764 +#: pretix/base/models/items.py:763 msgid "The selected start date may only be this many days in the future." msgstr "" -#: pretix/base/models/items.py:770 +#: pretix/base/models/items.py:769 msgid "Reusable media policy" msgstr "" -#: pretix/base/models/items.py:772 +#: pretix/base/models/items.py:771 msgid "" "If this product should be stored on a re-usable physical medium, you can " "attach a physical media policy. This is not required for regular tickets, " @@ -5340,20 +5378,20 @@ msgid "" "settings." msgstr "" -#: pretix/base/models/items.py:782 +#: pretix/base/models/items.py:781 msgid "Reusable media type" msgstr "" -#: pretix/base/models/items.py:784 +#: pretix/base/models/items.py:783 msgid "" "Select the type of physical medium that should be used for this product. " "Note that not all media types support all types of products, and not all " "media types are supported across all sales channels or check-in processes." msgstr "" -#: pretix/base/models/items.py:795 pretix/base/models/items.py:1702 +#: pretix/base/models/items.py:794 pretix/base/models/items.py:1701 #: pretix/control/forms/filter.py:437 pretix/control/forms/filter.py:1922 -#: pretix/control/forms/item.py:276 pretix/control/navigation.py:138 +#: pretix/control/forms/item.py:277 pretix/control/navigation.py:138 #: pretix/control/navigation.py:147 #: pretix/control/templates/pretixcontrol/checkin/lists.html:111 #: pretix/control/templates/pretixcontrol/items/base.html:3 @@ -5370,59 +5408,59 @@ msgstr "" msgid "Products" msgstr "" -#: pretix/base/models/items.py:989 +#: pretix/base/models/items.py:988 msgid "" "If you select a reusable media policy, you also need to select a reusable " "media type." msgstr "" -#: pretix/base/models/items.py:993 +#: pretix/base/models/items.py:992 msgid "The selected media type is not enabled in your organizer settings." msgstr "" -#: pretix/base/models/items.py:995 +#: pretix/base/models/items.py:994 msgid "The selected media type does not support usage for tickets currently." msgstr "" -#: pretix/base/models/items.py:997 +#: pretix/base/models/items.py:996 msgid "" "The selected media type does not support usage for gift cards currently." msgstr "" -#: pretix/base/models/items.py:999 +#: pretix/base/models/items.py:998 msgid "" "You currently cannot create gift cards with a reusable media policy. " "Instead, gift cards for some reusable media types can be created or re-" "charged directly at the POS." msgstr "" -#: pretix/base/models/items.py:1007 +#: pretix/base/models/items.py:1006 msgid "" "The maximum number per order can not be lower than the minimum number per " "order." msgstr "" -#: pretix/base/models/items.py:1013 +#: pretix/base/models/items.py:1012 msgid "The item's category must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1018 +#: pretix/base/models/items.py:1017 msgid "The item's tax rule must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1024 +#: pretix/base/models/items.py:1023 msgid "The item's availability cannot end before it starts." msgstr "" -#: pretix/base/models/items.py:1156 +#: pretix/base/models/items.py:1155 msgid "This is shown below the variation name in lists." msgstr "" -#: pretix/base/models/items.py:1183 +#: pretix/base/models/items.py:1182 msgid "Require approval" msgstr "" -#: pretix/base/models/items.py:1185 +#: pretix/base/models/items.py:1184 msgid "" "If this variation is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5430,101 +5468,101 @@ msgid "" "only available to specific groups." msgstr "" -#: pretix/base/models/items.py:1195 pretix/control/navigation.py:591 +#: pretix/base/models/items.py:1194 pretix/control/navigation.py:591 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:4 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:6 msgid "Membership types" msgstr "" -#: pretix/base/models/items.py:1207 +#: pretix/base/models/items.py:1206 msgid "This variation will not be sold before the given date." msgstr "" -#: pretix/base/models/items.py:1217 +#: pretix/base/models/items.py:1216 msgid "This variation will not be sold after the given date." msgstr "" -#: pretix/base/models/items.py:1225 +#: pretix/base/models/items.py:1224 msgid "Sell on all sales channels the product is sold on" msgstr "" -#: pretix/base/models/items.py:1231 +#: pretix/base/models/items.py:1230 msgid "" "The sales channel selection for the product as a whole takes precedence, so " "if a sales channel is selected here but not on product level, the variation " "will not be available." msgstr "" -#: pretix/base/models/items.py:1236 +#: pretix/base/models/items.py:1235 msgid "Show only if a matching voucher is redeemed." msgstr "" -#: pretix/base/models/items.py:1238 +#: pretix/base/models/items.py:1237 msgid "" "This variation will be hidden from the event page until the user enters a " "voucher that unlocks this variation." msgstr "" -#: pretix/base/models/items.py:1258 +#: pretix/base/models/items.py:1257 #: pretix/control/templates/pretixcontrol/item/create.html:111 msgid "Product variations" msgstr "" -#: pretix/base/models/items.py:1463 +#: pretix/base/models/items.py:1462 msgid "Minimum number" msgstr "" -#: pretix/base/models/items.py:1467 +#: pretix/base/models/items.py:1466 msgid "Maximum number" msgstr "" -#: pretix/base/models/items.py:1471 +#: pretix/base/models/items.py:1470 msgid "Add-Ons are included in the price" msgstr "" -#: pretix/base/models/items.py:1472 +#: pretix/base/models/items.py:1471 msgid "" "If selected, adding add-ons to this ticket is free, even if the add-ons " "would normally cost money individually." msgstr "" -#: pretix/base/models/items.py:1477 +#: pretix/base/models/items.py:1476 msgid "Allow the same product to be selected multiple times" msgstr "" -#: pretix/base/models/items.py:1496 +#: pretix/base/models/items.py:1495 msgid "The add-on's category must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1501 +#: pretix/base/models/items.py:1500 msgid "The item already has an add-on of this category." msgstr "" -#: pretix/base/models/items.py:1506 +#: pretix/base/models/items.py:1505 msgid "The minimum count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1511 +#: pretix/base/models/items.py:1510 msgid "The maximum count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1516 +#: pretix/base/models/items.py:1515 msgid "The maximum count needs to be greater than the minimum count." msgstr "" -#: pretix/base/models/items.py:1543 +#: pretix/base/models/items.py:1542 msgid "Bundled item" msgstr "" -#: pretix/base/models/items.py:1549 +#: pretix/base/models/items.py:1548 msgid "Bundled variation" msgstr "" -#: pretix/base/models/items.py:1560 +#: pretix/base/models/items.py:1559 msgid "Designated price part" msgstr "" -#: pretix/base/models/items.py:1561 +#: pretix/base/models/items.py:1560 msgid "" "If set, it will be shown that this bundled item is responsible for the given " "value of the total gross price. This might be important in cases of mixed " @@ -5532,246 +5570,246 @@ msgid "" "the base item's price." msgstr "" -#: pretix/base/models/items.py:1584 +#: pretix/base/models/items.py:1583 msgid "The bundled item must belong to the same event as the item." msgstr "" -#: pretix/base/models/items.py:1586 +#: pretix/base/models/items.py:1585 msgid "A variation needs to be set for this item." msgstr "" -#: pretix/base/models/items.py:1588 +#: pretix/base/models/items.py:1587 msgid "The chosen variation does not belong to this item." msgstr "" -#: pretix/base/models/items.py:1593 +#: pretix/base/models/items.py:1592 msgid "The count needs to be equal to or greater than zero." msgstr "" -#: pretix/base/models/items.py:1648 +#: pretix/base/models/items.py:1647 msgid "Number" msgstr "" -#: pretix/base/models/items.py:1649 +#: pretix/base/models/items.py:1648 msgid "Text (one line)" msgstr "" -#: pretix/base/models/items.py:1650 +#: pretix/base/models/items.py:1649 msgid "Multiline text" msgstr "" -#: pretix/base/models/items.py:1651 +#: pretix/base/models/items.py:1650 msgid "Yes/No" msgstr "" -#: pretix/base/models/items.py:1652 +#: pretix/base/models/items.py:1651 msgid "Choose one from a list" msgstr "" -#: pretix/base/models/items.py:1653 +#: pretix/base/models/items.py:1652 msgid "Choose multiple from a list" msgstr "" -#: pretix/base/models/items.py:1654 +#: pretix/base/models/items.py:1653 msgid "File upload" msgstr "" -#: pretix/base/models/items.py:1657 +#: pretix/base/models/items.py:1656 #: pretix/control/templates/pretixcontrol/event/settings.html:240 msgid "Date and time" msgstr "" -#: pretix/base/models/items.py:1658 +#: pretix/base/models/items.py:1657 msgid "Country code (ISO 3166-1 alpha-2)" msgstr "" -#: pretix/base/models/items.py:1681 pretix/base/models/items.py:1957 +#: pretix/base/models/items.py:1680 pretix/base/models/items.py:1956 #: pretix/base/models/organizer.py:609 msgid "" "The identifier may only contain letters, numbers, dots, dashes, and " "underscores." msgstr "" -#: pretix/base/models/items.py:1686 +#: pretix/base/models/items.py:1685 msgid "Help text" msgstr "" -#: pretix/base/models/items.py:1687 +#: pretix/base/models/items.py:1686 msgid "If the question needs to be explained or clarified, do it here!" msgstr "" -#: pretix/base/models/items.py:1693 +#: pretix/base/models/items.py:1692 msgid "Question type" msgstr "" -#: pretix/base/models/items.py:1697 +#: pretix/base/models/items.py:1696 #: pretix/control/templates/pretixcontrol/items/questions.html:55 msgid "Required question" msgstr "" -#: pretix/base/models/items.py:1704 +#: pretix/base/models/items.py:1703 msgid "This question will be asked to buyers of the selected products" msgstr "" -#: pretix/base/models/items.py:1711 +#: pretix/base/models/items.py:1710 msgid "Ask during check-in instead of in the ticket buying process" msgstr "" -#: pretix/base/models/items.py:1712 pretix/base/models/items.py:1717 +#: pretix/base/models/items.py:1711 pretix/base/models/items.py:1716 msgid "Not supported by all check-in apps for all question types." msgstr "" -#: pretix/base/models/items.py:1716 +#: pretix/base/models/items.py:1715 msgid "Show answer during check-in" msgstr "" -#: pretix/base/models/items.py:1721 +#: pretix/base/models/items.py:1720 #: pretix/control/templates/pretixcontrol/items/questions.html:66 msgid "Hidden question" msgstr "" -#: pretix/base/models/items.py:1722 +#: pretix/base/models/items.py:1721 msgid "This question will only show up in the backend." msgstr "" -#: pretix/base/models/items.py:1726 +#: pretix/base/models/items.py:1725 msgid "Print answer on invoices" msgstr "" -#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1740 -#: pretix/base/models/items.py:1746 +#: pretix/base/models/items.py:1733 pretix/base/models/items.py:1739 +#: pretix/base/models/items.py:1745 msgid "Minimum value" msgstr "" -#: pretix/base/models/items.py:1735 pretix/base/models/items.py:1738 -#: pretix/base/models/items.py:1741 pretix/base/models/items.py:1744 -#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1750 -#: pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1737 +#: pretix/base/models/items.py:1740 pretix/base/models/items.py:1743 +#: pretix/base/models/items.py:1746 pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1753 msgid "Currently not supported in our apps and during check-in" msgstr "" -#: pretix/base/models/items.py:1737 pretix/base/models/items.py:1743 -#: pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1736 pretix/base/models/items.py:1742 +#: pretix/base/models/items.py:1748 msgid "Maximum value" msgstr "" -#: pretix/base/models/items.py:1752 +#: pretix/base/models/items.py:1751 msgid "Maximum length" msgstr "" -#: pretix/base/models/items.py:1758 +#: pretix/base/models/items.py:1757 msgid "Validate file to be a portrait" msgstr "" -#: pretix/base/models/items.py:1759 +#: pretix/base/models/items.py:1758 msgid "" "If checked, files must be images with an aspect ratio of 3:4. This is " "commonly used for photos printed on badges." msgstr "" -#: pretix/base/models/items.py:1814 +#: pretix/base/models/items.py:1813 msgid "An answer to this question is required to proceed." msgstr "" -#: pretix/base/models/items.py:1824 +#: pretix/base/models/items.py:1823 msgid "Invalid input type." msgstr "" -#: pretix/base/models/items.py:1858 +#: pretix/base/models/items.py:1857 msgid "The number is to low." msgstr "" -#: pretix/base/models/items.py:1860 +#: pretix/base/models/items.py:1859 msgid "The number is to high." msgstr "" -#: pretix/base/models/items.py:1863 +#: pretix/base/models/items.py:1862 msgid "Invalid number input." msgstr "" -#: pretix/base/models/items.py:1870 pretix/base/models/items.py:1894 +#: pretix/base/models/items.py:1869 pretix/base/models/items.py:1893 msgid "Please choose a later date." msgstr "" -#: pretix/base/models/items.py:1872 pretix/base/models/items.py:1896 +#: pretix/base/models/items.py:1871 pretix/base/models/items.py:1895 msgid "Please choose an earlier date." msgstr "" -#: pretix/base/models/items.py:1875 +#: pretix/base/models/items.py:1874 msgid "Invalid date input." msgstr "" -#: pretix/base/models/items.py:1882 +#: pretix/base/models/items.py:1881 msgid "Invalid time input." msgstr "" -#: pretix/base/models/items.py:1891 +#: pretix/base/models/items.py:1890 msgid "Invalid datetime input." msgstr "" -#: pretix/base/models/items.py:1903 +#: pretix/base/models/items.py:1902 msgid "Unknown country code." msgstr "" -#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923 +#: pretix/base/models/items.py:1920 pretix/base/models/items.py:1922 msgid "The maximum date must not be before the minimum value." msgstr "" -#: pretix/base/models/items.py:1925 +#: pretix/base/models/items.py:1924 msgid "The maximum value must not be lower than the minimum value." msgstr "" -#: pretix/base/models/items.py:1943 +#: pretix/base/models/items.py:1942 msgid "" "The system already contains answers to this question that are not compatible " "with changing the type of question without data loss. Consider hiding this " "question and creating a new one instead." msgstr "" -#: pretix/base/models/items.py:1961 +#: pretix/base/models/items.py:1960 #: pretix/control/templates/pretixcontrol/items/question.html:90 msgid "Answer" msgstr "" -#: pretix/base/models/items.py:1985 +#: pretix/base/models/items.py:1984 #, python-brace-format msgid "The identifier \"{}\" is already used for a different option." msgstr "" -#: pretix/base/models/items.py:1988 +#: pretix/base/models/items.py:1987 msgid "Question option" msgstr "" -#: pretix/base/models/items.py:1989 +#: pretix/base/models/items.py:1988 msgid "Question options" msgstr "" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1725 +#: pretix/base/models/items.py:2073 pretix/control/forms/event.py:1827 #: pretix/control/templates/pretixcontrol/items/quotas.html:56 msgid "Total capacity" msgstr "" -#: pretix/base/models/items.py:2076 pretix/control/forms/item.py:456 +#: pretix/base/models/items.py:2075 pretix/control/forms/item.py:457 msgid "Leave empty for an unlimited number of tickets." msgstr "" -#: pretix/base/models/items.py:2080 pretix/base/models/orders.py:1489 -#: pretix/base/models/orders.py:3011 +#: pretix/base/models/items.py:2079 pretix/base/models/orders.py:1512 +#: pretix/base/models/orders.py:3077 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "" -#: pretix/base/models/items.py:2088 pretix/control/forms/item.py:915 +#: pretix/base/models/items.py:2087 pretix/control/forms/item.py:918 #: pretix/plugins/autocheckin/models.py:74 msgid "Variations" msgstr "" -#: pretix/base/models/items.py:2092 +#: pretix/base/models/items.py:2091 #: pretix/control/templates/pretixcontrol/items/quotas.html:70 msgid "Ignore this quota when determining event availability" msgstr "" -#: pretix/base/models/items.py:2093 +#: pretix/base/models/items.py:2092 msgid "" "If you enable this, this quota will be ignored when determining event " "availability in your event calendar. This is useful e.g. for merchandise " @@ -5779,22 +5817,22 @@ msgid "" "as sold out." msgstr "" -#: pretix/base/models/items.py:2100 +#: pretix/base/models/items.py:2099 msgid "Close this quota permanently once it is sold out" msgstr "" -#: pretix/base/models/items.py:2101 +#: pretix/base/models/items.py:2100 msgid "" "If you enable this, when the quota is sold out once, no more tickets will be " "sold, even if tickets become available again through cancellations or " "expiring orders. Of course, you can always re-open it manually." msgstr "" -#: pretix/base/models/items.py:2109 +#: pretix/base/models/items.py:2108 msgid "Allow to sell more tickets once people have checked out" msgstr "" -#: pretix/base/models/items.py:2110 +#: pretix/base/models/items.py:2109 msgid "" "With this option, quota will be released as soon as people are scanned at an " "exit of your event. This will only happen if they have been scanned both at " @@ -5804,7 +5842,7 @@ msgid "" "prevent accidental overbooking." msgstr "" -#: pretix/base/models/items.py:2122 pretix/control/navigation.py:156 +#: pretix/base/models/items.py:2121 pretix/control/navigation.py:156 #: pretix/control/templates/pretixcontrol/items/quotas.html:4 #: pretix/control/templates/pretixcontrol/items/quotas.html:6 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:416 @@ -5813,36 +5851,45 @@ msgstr "" msgid "Quotas" msgstr "" -#: pretix/base/models/items.py:2195 +#: pretix/base/models/items.py:2194 msgid "All variations must belong to an item contained in the items list." msgstr "" -#: pretix/base/models/items.py:2206 +#: pretix/base/models/items.py:2205 msgid "" "One or more items has variations but none of these are in the variations " "list." msgstr "" -#: pretix/base/models/items.py:2212 pretix/base/models/waitinglist.py:308 +#: pretix/base/models/items.py:2211 pretix/base/models/waitinglist.py:308 msgid "Subevent cannot be null for event series." msgstr "" -#: pretix/base/models/items.py:2248 +#: pretix/base/models/items.py:2247 msgid "Required for products" msgstr "" -#: pretix/base/models/items.py:2249 +#: pretix/base/models/items.py:2248 msgid "" "If checked, this property must be set in each product. Does not apply if a " "default value is set." msgstr "" -#: pretix/base/models/items.py:2254 +#: pretix/base/models/items.py:2253 msgid "" "If you keep this empty, any value is allowed. Otherwise, enter one possible " "value per line." msgstr "" +#: pretix/base/models/items.py:2310 +msgid "Start" +msgstr "" + +#: pretix/base/models/items.py:2311 +#: pretix/plugins/reports/accountingreport.py:129 +msgid "End" +msgstr "" + #: pretix/base/models/memberships.py:44 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28 msgid "Membership is transferable" @@ -5894,7 +5941,7 @@ msgid "pending" msgstr "" #: pretix/base/models/orders.py:203 pretix/base/payment.py:570 -#: pretix/base/services/invoices.py:572 +#: pretix/base/services/invoices.py:581 msgid "paid" msgstr "" @@ -5937,7 +5984,7 @@ msgid "" "scanned." msgstr "" -#: pretix/base/models/orders.py:301 pretix/base/models/orders.py:1526 +#: pretix/base/models/orders.py:301 pretix/base/models/orders.py:1552 msgid "Meta information" msgstr "" @@ -5945,187 +5992,187 @@ msgstr "" msgid "API meta information" msgstr "" -#: pretix/base/models/orders.py:414 pretix/plugins/sendmail/forms.py:236 +#: pretix/base/models/orders.py:419 pretix/plugins/sendmail/forms.py:236 #: pretix/plugins/sendmail/forms.py:389 pretix/plugins/sendmail/views.py:269 msgid "approval pending" msgstr "" -#: pretix/base/models/orders.py:416 +#: pretix/base/models/orders.py:421 msgctxt "order state" msgid "pending (confirmed)" msgstr "" -#: pretix/base/models/orders.py:418 +#: pretix/base/models/orders.py:423 msgid "canceled (paid fee)" msgstr "" -#: pretix/base/models/orders.py:1031 +#: pretix/base/models/orders.py:1036 msgid "" "The payment can not be accepted as the last date of payments configured in " "the payment settings is over." msgstr "" -#: pretix/base/models/orders.py:1033 +#: pretix/base/models/orders.py:1038 msgid "" "The payment can not be accepted as the order is expired and you configured " "that no late payments should be accepted in the payment settings." msgstr "" -#: pretix/base/models/orders.py:1035 +#: pretix/base/models/orders.py:1040 msgid "This order is not yet approved by the event organizer." msgstr "" -#: pretix/base/models/orders.py:1060 +#: pretix/base/models/orders.py:1065 #, python-brace-format msgid "The ordered product \"{item}\" is no longer available." msgstr "" -#: pretix/base/models/orders.py:1061 +#: pretix/base/models/orders.py:1066 #, python-brace-format msgid "The seat \"{seat}\" is no longer available." msgstr "" -#: pretix/base/models/orders.py:1062 +#: pretix/base/models/orders.py:1067 #, python-brace-format msgid "The voucher \"{voucher}\" no longer has sufficient budget." msgstr "" -#: pretix/base/models/orders.py:1063 +#: pretix/base/models/orders.py:1068 #, python-brace-format msgid "The voucher \"{voucher}\" has been used in the meantime." msgstr "" -#: pretix/base/models/orders.py:1405 +#: pretix/base/models/orders.py:1413 msgid "" msgstr "" -#: pretix/base/models/orders.py:1506 pretix/base/models/orders.py:1514 +#: pretix/base/models/orders.py:1532 pretix/base/models/orders.py:1540 msgid "Empty, if this product is not an admission ticket" msgstr "" -#: pretix/base/models/orders.py:1723 +#: pretix/base/models/orders.py:1749 msgctxt "payment_state" msgid "created" msgstr "" -#: pretix/base/models/orders.py:1724 +#: pretix/base/models/orders.py:1750 msgctxt "payment_state" msgid "pending" msgstr "" -#: pretix/base/models/orders.py:1725 +#: pretix/base/models/orders.py:1751 msgctxt "payment_state" msgid "confirmed" msgstr "" -#: pretix/base/models/orders.py:1726 +#: pretix/base/models/orders.py:1752 msgctxt "payment_state" msgid "canceled" msgstr "" -#: pretix/base/models/orders.py:1727 +#: pretix/base/models/orders.py:1753 msgctxt "payment_state" msgid "failed" msgstr "" -#: pretix/base/models/orders.py:1728 +#: pretix/base/models/orders.py:1754 msgctxt "payment_state" msgid "refunded" msgstr "" -#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2195 +#: pretix/base/models/orders.py:1782 pretix/base/models/orders.py:2221 #: pretix/base/shredder.py:633 msgid "Payment information" msgstr "" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2162 msgctxt "refund_state" msgid "started externally" msgstr "" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2163 msgctxt "refund_state" msgid "created" msgstr "" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2164 msgctxt "refund_state" msgid "in transit" msgstr "" -#: pretix/base/models/orders.py:2139 +#: pretix/base/models/orders.py:2165 msgctxt "refund_state" msgid "done" msgstr "" -#: pretix/base/models/orders.py:2140 +#: pretix/base/models/orders.py:2166 msgctxt "refund_state" msgid "failed" msgstr "" -#: pretix/base/models/orders.py:2142 +#: pretix/base/models/orders.py:2168 msgctxt "refund_state" msgid "canceled" msgstr "" -#: pretix/base/models/orders.py:2150 +#: pretix/base/models/orders.py:2176 msgctxt "refund_source" msgid "Organizer" msgstr "" -#: pretix/base/models/orders.py:2151 +#: pretix/base/models/orders.py:2177 msgctxt "refund_source" msgid "Customer" msgstr "" -#: pretix/base/models/orders.py:2152 +#: pretix/base/models/orders.py:2178 msgctxt "refund_source" msgid "External" msgstr "" -#: pretix/base/models/orders.py:2190 +#: pretix/base/models/orders.py:2216 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "" -#: pretix/base/models/orders.py:2191 +#: pretix/base/models/orders.py:2217 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:199 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:201 msgid "" "May be shown to the end user or used e.g. as part of a payment reference." msgstr "" -#: pretix/base/models/orders.py:2311 +#: pretix/base/models/orders.py:2337 msgid "Service fee" msgstr "" -#: pretix/base/models/orders.py:2312 +#: pretix/base/models/orders.py:2338 msgid "Payment fee" msgstr "" -#: pretix/base/models/orders.py:2313 +#: pretix/base/models/orders.py:2339 msgid "Shipping fee" msgstr "" -#: pretix/base/models/orders.py:2314 +#: pretix/base/models/orders.py:2340 #: pretix/control/templates/pretixcontrol/order/index.html:157 msgid "Cancellation fee" msgstr "" -#: pretix/base/models/orders.py:2315 +#: pretix/base/models/orders.py:2341 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2316 +#: pretix/base/models/orders.py:2342 msgid "Late fee" msgstr "" -#: pretix/base/models/orders.py:2317 +#: pretix/base/models/orders.py:2343 msgid "Other fees" msgstr "" -#: pretix/base/models/orders.py:2318 pretix/base/payment.py:1374 -#: pretix/base/payment.py:1450 pretix/base/settings.py:992 +#: pretix/base/models/orders.py:2344 pretix/base/payment.py:1378 +#: pretix/base/payment.py:1454 pretix/base/settings.py:1022 #: pretix/control/templates/pretixcontrol/items/index.html:107 #: pretix/control/templates/pretixcontrol/order/index.html:152 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:383 @@ -6134,7 +6181,7 @@ msgstr "" msgid "Gift card" msgstr "" -#: pretix/base/models/orders.py:2323 +#: pretix/base/models/orders.py:2349 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:82 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:123 #: pretix/control/views/vouchers.py:120 @@ -6142,54 +6189,54 @@ msgstr "" msgid "Value" msgstr "" -#: pretix/base/models/orders.py:2571 +#: pretix/base/models/orders.py:2630 msgid "Order position" msgstr "" -#: pretix/base/models/orders.py:3116 +#: pretix/base/models/orders.py:3201 msgid "Cart ID (e.g. session key)" msgstr "" -#: pretix/base/models/orders.py:3127 +#: pretix/base/models/orders.py:3212 msgid "Limit for extending expiration date" msgstr "" -#: pretix/base/models/orders.py:3156 +#: pretix/base/models/orders.py:3248 msgid "Cart position" msgstr "" -#: pretix/base/models/orders.py:3157 +#: pretix/base/models/orders.py:3249 msgid "Cart positions" msgstr "" -#: pretix/base/models/orders.py:3293 +#: pretix/base/models/orders.py:3391 msgid "Business customer" msgstr "" -#: pretix/base/models/orders.py:3309 +#: pretix/base/models/orders.py:3407 msgid "This reference will be printed on your invoice for your convenience." msgstr "" -#: pretix/base/models/orders.py:3436 +#: pretix/base/models/orders.py:3534 msgid "Transmission type" msgstr "" -#: pretix/base/models/orders.py:3534 +#: pretix/base/models/orders.py:3632 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "" -#: pretix/base/models/orders.py:3535 pretix/base/pdf.py:1124 +#: pretix/base/models/orders.py:3633 pretix/base/pdf.py:1141 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "" -#: pretix/base/models/orders.py:3536 +#: pretix/base/models/orders.py:3634 msgid "Certificate" msgstr "" -#: pretix/base/models/orders.py:3537 pretix/control/views/event.py:393 +#: pretix/base/models/orders.py:3635 pretix/control/views/event.py:393 #: pretix/control/views/event.py:398 pretix/control/views/organizer.py:649 #: pretix/control/views/organizer.py:654 msgid "Other" @@ -6327,7 +6374,7 @@ msgid "Type" msgstr "" #: pretix/base/models/seating.py:45 pretix/base/models/tax.py:305 -#: pretix/base/pdf.py:1301 +#: pretix/base/pdf.py:1318 msgid "Your layout file is not a valid JSON file." msgstr "" @@ -6505,7 +6552,7 @@ msgstr "" msgid "Should be short, e.g. \"VAT\"" msgstr "" -#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1523 +#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1622 #: pretix/control/templates/pretixcontrol/order/transactions.html:22 msgid "Tax code" msgstr "" @@ -6565,12 +6612,12 @@ msgstr "" msgid "You need to set your home country to use the reverse charge feature." msgstr "" -#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1570 +#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1672 msgid "" "A combination of this tax code with a non-zero tax rate does not make sense." msgstr "" -#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1574 +#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1676 msgid "" "A combination of this tax code with a zero tax rate does not make sense." msgstr "" @@ -6586,7 +6633,7 @@ msgid "plus {rate}% {name}" msgstr "" #: pretix/base/models/tax.py:441 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:63 +#: pretix/control/templates/pretixcontrol/event/tax.html:82 msgid "reverse charge enabled" msgstr "" @@ -6835,9 +6882,9 @@ msgid "Dates" msgstr "" #: pretix/base/notifications.py:200 -#: pretix/control/templates/pretixcontrol/order/index.html:730 +#: pretix/control/templates/pretixcontrol/order/index.html:755 #: pretix/plugins/reports/accountingreport.py:318 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:442 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:446 msgid "Net total" msgstr "" @@ -6849,8 +6896,8 @@ msgstr "" msgid "Purchased products" msgstr "" -#: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:384 -#: pretix/base/services/placeholders.py:393 +#: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:415 +#: pretix/base/services/placeholders.py:424 #: pretix/base/templates/pretixbase/email/order_details.html:151 msgid "View order details" msgstr "" @@ -6933,24 +6980,24 @@ msgctxt "payment" msgid "Google Pay" msgstr "" -#: pretix/base/payment.py:119 pretix/base/payment.py:1610 +#: pretix/base/payment.py:119 pretix/base/payment.py:1614 msgid "You cannot pay with gift cards when buying a gift card." msgstr "" -#: pretix/base/payment.py:128 pretix/base/payment.py:1620 -#: pretix/base/payment.py:1622 +#: pretix/base/payment.py:128 pretix/base/payment.py:1624 +#: pretix/base/payment.py:1626 msgid "This gift card does not support this currency." msgstr "" -#: pretix/base/payment.py:130 pretix/base/payment.py:1628 +#: pretix/base/payment.py:130 pretix/base/payment.py:1632 msgid "This gift card can only be used in test mode." msgstr "" -#: pretix/base/payment.py:132 pretix/base/payment.py:1630 +#: pretix/base/payment.py:132 pretix/base/payment.py:1634 msgid "Only test gift cards can be used in test mode." msgstr "" -#: pretix/base/payment.py:134 pretix/base/payment.py:1632 +#: pretix/base/payment.py:134 pretix/base/payment.py:1636 msgid "This gift card is no longer valid." msgstr "" @@ -7124,43 +7171,43 @@ msgstr "" msgid "Free of charge" msgstr "" -#: pretix/base/payment.py:1168 +#: pretix/base/payment.py:1172 msgid "Box office" msgstr "" -#: pretix/base/payment.py:1216 pretix/base/payment.py:1235 +#: pretix/base/payment.py:1220 pretix/base/payment.py:1239 #: pretix/plugins/manualpayment/apps.py:30 #: pretix/plugins/manualpayment/apps.py:33 #: pretix/plugins/manualpayment/apps.py:39 msgid "Manual payment" msgstr "" -#: pretix/base/payment.py:1221 pretix/plugins/banktransfer/payment.py:196 +#: pretix/base/payment.py:1225 pretix/plugins/banktransfer/payment.py:196 msgid "" "In test mode, you can just manually mark this order as paid in the backend " "after it has been created." msgstr "" -#: pretix/base/payment.py:1242 pretix/base/payment.py:1458 +#: pretix/base/payment.py:1246 pretix/base/payment.py:1462 #: pretix/plugins/banktransfer/payment.py:150 msgid "Payment method name" msgstr "" -#: pretix/base/payment.py:1246 +#: pretix/base/payment.py:1250 msgid "Payment process description during checkout" msgstr "" -#: pretix/base/payment.py:1247 +#: pretix/base/payment.py:1251 msgid "" "This text will be shown during checkout when the user selects this payment " "method. It should give a short explanation on this payment method." msgstr "" -#: pretix/base/payment.py:1252 +#: pretix/base/payment.py:1256 msgid "Payment process description in order confirmation emails" msgstr "" -#: pretix/base/payment.py:1253 +#: pretix/base/payment.py:1257 #, python-brace-format msgid "" "This text will be included for the {payment_info} placeholder in order " @@ -7169,11 +7216,11 @@ msgid "" "{amount_with_currency}." msgstr "" -#: pretix/base/payment.py:1260 +#: pretix/base/payment.py:1264 msgid "Payment process description for pending orders" msgstr "" -#: pretix/base/payment.py:1261 +#: pretix/base/payment.py:1265 #, python-brace-format msgid "" "This text will be shown on the order confirmation page for pending orders. " @@ -7181,129 +7228,129 @@ msgid "" "the placeholders {order}, {amount}, {currency} and {amount_with_currency}." msgstr "" -#: pretix/base/payment.py:1269 pretix/plugins/banktransfer/payment.py:145 +#: pretix/base/payment.py:1273 pretix/plugins/banktransfer/payment.py:145 msgid "" "Create an invoice for orders using bank transfer immediately if the event is " "otherwise configured to create invoices after payment is completed." msgstr "" -#: pretix/base/payment.py:1320 +#: pretix/base/payment.py:1324 msgid "Offsetting" msgstr "" -#: pretix/base/payment.py:1334 pretix/control/views/orders.py:1257 +#: pretix/base/payment.py:1338 pretix/control/views/orders.py:1262 msgid "You entered an order that could not be found." msgstr "" -#: pretix/base/payment.py:1363 +#: pretix/base/payment.py:1367 #, python-format msgid "Balanced against orders: %s" msgstr "" -#: pretix/base/payment.py:1464 +#: pretix/base/payment.py:1468 msgid "Payment method description" msgstr "" -#: pretix/base/payment.py:1494 +#: pretix/base/payment.py:1498 msgid "In test mode, only test cards will work." msgstr "" -#: pretix/base/payment.py:1624 +#: pretix/base/payment.py:1628 msgid "This gift card is not accepted by this event organizer." msgstr "" -#: pretix/base/payment.py:1626 +#: pretix/base/payment.py:1630 msgid "This gift card was used in the meantime. Please try again." msgstr "" -#: pretix/base/pdf.py:98 +#: pretix/base/pdf.py:99 msgid "Ticket code (barcode content)" msgstr "" -#: pretix/base/pdf.py:110 +#: pretix/base/pdf.py:111 msgid "Order position number" msgstr "" -#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1778 +#: pretix/base/pdf.py:124 pretix/control/forms/event.py:1884 #: pretix/control/templates/pretixcontrol/items/index.html:38 msgid "Product name" msgstr "" -#: pretix/base/pdf.py:124 pretix/base/services/tickets.py:98 -#: pretix/control/views/event.py:888 pretix/control/views/pdf.py:94 +#: pretix/base/pdf.py:125 pretix/base/services/tickets.py:98 +#: pretix/control/views/event.py:907 pretix/control/views/pdf.py:96 msgid "Sample product" msgstr "" -#: pretix/base/pdf.py:128 +#: pretix/base/pdf.py:129 msgid "Variation name" msgstr "" -#: pretix/base/pdf.py:129 +#: pretix/base/pdf.py:130 msgid "Sample variation" msgstr "" -#: pretix/base/pdf.py:133 +#: pretix/base/pdf.py:134 msgid "Product description" msgstr "" -#: pretix/base/pdf.py:134 pretix/base/services/tickets.py:99 -#: pretix/control/views/event.py:889 pretix/control/views/pdf.py:95 +#: pretix/base/pdf.py:135 pretix/base/services/tickets.py:99 +#: pretix/control/views/event.py:908 pretix/control/views/pdf.py:97 msgid "Sample product description" msgstr "" -#: pretix/base/pdf.py:138 +#: pretix/base/pdf.py:139 msgid "Product name and variation" msgstr "" -#: pretix/base/pdf.py:139 +#: pretix/base/pdf.py:140 msgid "Sample product – sample variation" msgstr "" -#: pretix/base/pdf.py:146 +#: pretix/base/pdf.py:147 msgid "Product variation description" msgstr "" -#: pretix/base/pdf.py:147 +#: pretix/base/pdf.py:148 msgid "Sample product variation description" msgstr "" -#: pretix/base/pdf.py:154 +#: pretix/base/pdf.py:155 msgid "Ticket category" msgstr "" -#: pretix/base/pdf.py:161 pretix/base/pdf.py:166 pretix/base/pdf.py:175 +#: pretix/base/pdf.py:162 pretix/base/pdf.py:167 pretix/base/pdf.py:176 msgid "123.45 EUR" msgstr "" -#: pretix/base/pdf.py:165 +#: pretix/base/pdf.py:166 msgid "Price including bundled products" msgstr "" -#: pretix/base/pdf.py:174 +#: pretix/base/pdf.py:175 msgid "Price including add-ons and bundled products" msgstr "" -#: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:573 -#: pretix/base/services/placeholders.py:571 -#: pretix/base/services/placeholders.py:653 -#: pretix/base/services/placeholders.py:669 -#: pretix/base/services/placeholders.py:678 pretix/control/views/event.py:890 +#: pretix/base/pdf.py:185 pretix/base/pdf.py:343 +#: pretix/base/services/invoices.py:582 +#: pretix/base/services/placeholders.py:602 +#: pretix/base/services/placeholders.py:687 +#: pretix/base/services/placeholders.py:703 +#: pretix/base/services/placeholders.py:712 pretix/control/views/event.py:909 msgid "John Doe" msgstr "" -#: pretix/base/pdf.py:189 pretix/base/pdf.py:347 -#: pretix/base/services/tickets.py:116 pretix/control/views/pdf.py:110 -#: pretix/control/views/pdf.py:116 pretix/control/views/pdf.py:123 -#: pretix/control/views/pdf.py:128 +#: pretix/base/pdf.py:190 pretix/base/pdf.py:348 +#: pretix/base/services/tickets.py:116 pretix/control/views/pdf.py:115 +#: pretix/control/views/pdf.py:121 pretix/control/views/pdf.py:128 +#: pretix/control/views/pdf.py:133 msgid "Sample company" msgstr "" -#: pretix/base/pdf.py:193 +#: pretix/base/pdf.py:194 msgid "Full attendee address" msgstr "" -#: pretix/base/pdf.py:194 +#: pretix/base/pdf.py:195 msgid "" "John Doe\n" "Sample company\n" @@ -7312,295 +7359,306 @@ msgid "" "Atlantis" msgstr "" -#: pretix/base/pdf.py:198 +#: pretix/base/pdf.py:199 msgid "Attendee street" msgstr "" -#: pretix/base/pdf.py:203 +#: pretix/base/pdf.py:204 msgid "Attendee ZIP code" msgstr "" -#: pretix/base/pdf.py:208 +#: pretix/base/pdf.py:209 msgid "Attendee city" msgstr "" -#: pretix/base/pdf.py:213 +#: pretix/base/pdf.py:214 msgid "Attendee state" msgstr "" -#: pretix/base/pdf.py:218 +#: pretix/base/pdf.py:219 msgid "Attendee country" msgstr "" -#: pretix/base/pdf.py:230 +#: pretix/base/pdf.py:231 msgid "Pseudonymization ID (lead scanning)" msgstr "" -#: pretix/base/pdf.py:236 pretix/base/pdf.py:241 +#: pretix/base/pdf.py:237 pretix/base/pdf.py:242 msgid "Sample event name" msgstr "" -#: pretix/base/pdf.py:246 +#: pretix/base/pdf.py:247 msgid "May 31st, 2017" msgstr "" -#: pretix/base/pdf.py:250 +#: pretix/base/pdf.py:251 msgid "Event date range" msgstr "" -#: pretix/base/pdf.py:251 +#: pretix/base/pdf.py:252 msgid "May 31st – June 4th, 2017" msgstr "" -#: pretix/base/pdf.py:255 +#: pretix/base/pdf.py:256 msgid "Event begin date and time" msgstr "" -#: pretix/base/pdf.py:256 +#: pretix/base/pdf.py:257 msgid "2017-05-31 20:00" msgstr "" -#: pretix/base/pdf.py:263 +#: pretix/base/pdf.py:264 msgid "Event begin date" msgstr "" -#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:399 -#: pretix/base/pdf.py:423 pretix/base/pdf.py:447 pretix/base/pdf.py:471 -#: pretix/base/pdf.py:528 pretix/base/pdf.py:533 +#: pretix/base/pdf.py:265 pretix/base/pdf.py:291 pretix/base/pdf.py:400 +#: pretix/base/pdf.py:424 pretix/base/pdf.py:448 pretix/base/pdf.py:472 +#: pretix/base/pdf.py:535 pretix/base/pdf.py:540 msgid "2017-05-31" msgstr "" -#: pretix/base/pdf.py:271 +#: pretix/base/pdf.py:272 msgid "Event begin time" msgstr "" -#: pretix/base/pdf.py:272 +#: pretix/base/pdf.py:273 msgid "20:00" msgstr "" -#: pretix/base/pdf.py:276 +#: pretix/base/pdf.py:277 msgid "Event begin weekday" msgstr "" -#: pretix/base/pdf.py:277 pretix/base/pdf.py:306 +#: pretix/base/pdf.py:278 pretix/base/pdf.py:307 #: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1271 msgid "Friday" msgstr "" -#: pretix/base/pdf.py:281 +#: pretix/base/pdf.py:282 msgid "Event end date and time" msgstr "" -#: pretix/base/pdf.py:282 +#: pretix/base/pdf.py:283 msgid "2017-05-31 22:00" msgstr "" -#: pretix/base/pdf.py:298 +#: pretix/base/pdf.py:299 msgid "22:00" msgstr "" -#: pretix/base/pdf.py:305 +#: pretix/base/pdf.py:306 msgid "Event end weekday" msgstr "" -#: pretix/base/pdf.py:310 +#: pretix/base/pdf.py:311 msgid "Event admission date and time" msgstr "" -#: pretix/base/pdf.py:311 pretix/base/pdf.py:407 pretix/base/pdf.py:431 -#: pretix/base/pdf.py:455 pretix/base/pdf.py:479 pretix/base/pdf.py:522 +#: pretix/base/pdf.py:312 pretix/base/pdf.py:408 pretix/base/pdf.py:432 +#: pretix/base/pdf.py:456 pretix/base/pdf.py:480 pretix/base/pdf.py:529 msgid "2017-05-31 19:00" msgstr "" -#: pretix/base/pdf.py:318 +#: pretix/base/pdf.py:319 msgid "Event admission time" msgstr "" -#: pretix/base/pdf.py:319 pretix/base/pdf.py:415 pretix/base/pdf.py:439 -#: pretix/base/pdf.py:463 pretix/base/pdf.py:487 +#: pretix/base/pdf.py:320 pretix/base/pdf.py:416 pretix/base/pdf.py:440 +#: pretix/base/pdf.py:464 pretix/base/pdf.py:488 msgid "19:00" msgstr "" -#: pretix/base/pdf.py:326 +#: pretix/base/pdf.py:327 msgid "Event location" msgstr "" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1201 +#: pretix/base/pdf.py:328 pretix/base/settings.py:1233 msgid "Random City" msgstr "" -#: pretix/base/pdf.py:352 +#: pretix/base/pdf.py:353 msgid "Sesame Street 42" msgstr "" -#: pretix/base/pdf.py:357 +#: pretix/base/pdf.py:358 msgid "12345" msgstr "" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:576 +#: pretix/base/pdf.py:363 pretix/base/services/invoices.py:585 msgid "Sample city" msgstr "" -#: pretix/base/pdf.py:366 +#: pretix/base/pdf.py:367 msgid "Invoice address state" msgstr "" -#: pretix/base/pdf.py:367 +#: pretix/base/pdf.py:368 msgid "Sample State" msgstr "" -#: pretix/base/pdf.py:372 +#: pretix/base/pdf.py:373 msgid "Atlantis" msgstr "" -#: pretix/base/pdf.py:376 +#: pretix/base/pdf.py:377 msgid "List of Add-Ons" msgstr "" -#: pretix/base/pdf.py:377 +#: pretix/base/pdf.py:378 msgid "" "Add-on 1\n" "2x Add-on 2" msgstr "" -#: pretix/base/pdf.py:383 pretix/control/forms/filter.py:1409 +#: pretix/base/pdf.py:384 pretix/control/forms/filter.py:1409 #: pretix/control/forms/filter.py:1411 #: pretix/control/templates/pretixcontrol/organizers/index.html:42 msgid "Organizer name" msgstr "" -#: pretix/base/pdf.py:384 +#: pretix/base/pdf.py:385 msgid "Event organizer company" msgstr "" -#: pretix/base/pdf.py:388 +#: pretix/base/pdf.py:389 msgid "Organizer info text" msgstr "" -#: pretix/base/pdf.py:389 +#: pretix/base/pdf.py:390 msgid "Event organizer info text" msgstr "" -#: pretix/base/pdf.py:393 pretix/base/pdf.py:394 +#: pretix/base/pdf.py:394 pretix/base/pdf.py:395 msgid "Event info text" msgstr "" -#: pretix/base/pdf.py:398 +#: pretix/base/pdf.py:399 msgid "Printing date" msgstr "" -#: pretix/base/pdf.py:406 +#: pretix/base/pdf.py:407 msgid "Printing date and time" msgstr "" -#: pretix/base/pdf.py:414 +#: pretix/base/pdf.py:415 msgid "Printing time" msgstr "" -#: pretix/base/pdf.py:422 pretix/control/forms/item.py:738 +#: pretix/base/pdf.py:423 pretix/control/forms/item.py:741 msgid "Purchase date" msgstr "" -#: pretix/base/pdf.py:430 +#: pretix/base/pdf.py:431 msgid "Purchase date and time" msgstr "" -#: pretix/base/pdf.py:438 +#: pretix/base/pdf.py:439 msgid "Purchase time" msgstr "" -#: pretix/base/pdf.py:446 +#: pretix/base/pdf.py:447 msgid "Validity start date" msgstr "" -#: pretix/base/pdf.py:454 +#: pretix/base/pdf.py:455 msgid "Validity start date and time" msgstr "" -#: pretix/base/pdf.py:462 +#: pretix/base/pdf.py:463 msgid "Validity start time" msgstr "" -#: pretix/base/pdf.py:470 +#: pretix/base/pdf.py:471 msgid "Validity end date" msgstr "" -#: pretix/base/pdf.py:478 +#: pretix/base/pdf.py:479 msgid "Validity end date and time" msgstr "" -#: pretix/base/pdf.py:486 +#: pretix/base/pdf.py:487 msgid "Validity end time" msgstr "" -#: pretix/base/pdf.py:494 +#: pretix/base/pdf.py:495 +msgid "Program times: date and time" +msgstr "" + +#: pretix/base/pdf.py:497 +msgid "" +"2017-05-31 10:00 – 12:00\n" +"2017-05-31 14:00 – 16:00\n" +"2017-05-31 14:00 – 2017-06-01 14:00" +msgstr "" + +#: pretix/base/pdf.py:501 msgid "Reusable Medium ID" msgstr "" -#: pretix/base/pdf.py:499 +#: pretix/base/pdf.py:506 msgid "Seat: Full name" msgstr "" -#: pretix/base/pdf.py:500 +#: pretix/base/pdf.py:507 msgid "Ground floor, Row 3, Seat 4" msgstr "" -#: pretix/base/pdf.py:502 pretix/base/pdf.py:508 +#: pretix/base/pdf.py:509 pretix/base/pdf.py:515 #: pretix/control/forms/orders.py:344 msgid "General admission" msgstr "" -#: pretix/base/pdf.py:505 +#: pretix/base/pdf.py:512 msgid "Seat: zone" msgstr "" -#: pretix/base/pdf.py:506 +#: pretix/base/pdf.py:513 msgid "Ground floor" msgstr "" -#: pretix/base/pdf.py:511 +#: pretix/base/pdf.py:518 msgid "Seat: row" msgstr "" -#: pretix/base/pdf.py:516 +#: pretix/base/pdf.py:523 msgid "Seat: seat number" msgstr "" -#: pretix/base/pdf.py:521 +#: pretix/base/pdf.py:528 msgid "Date and time of first scan" msgstr "" -#: pretix/base/pdf.py:527 +#: pretix/base/pdf.py:534 msgid "Gift card: Issuance date" msgstr "" -#: pretix/base/pdf.py:532 +#: pretix/base/pdf.py:539 msgid "Gift card: Expiration date" msgstr "" -#: pretix/base/pdf.py:573 pretix/base/pdf.py:611 pretix/base/pdf.py:617 +#: pretix/base/pdf.py:580 pretix/base/pdf.py:618 pretix/base/pdf.py:624 #: pretix/plugins/badges/exporters.py:504 #: pretix/plugins/ticketoutputpdf/exporters.py:102 #, python-brace-format msgid "Question: {question}" msgstr "" -#: pretix/base/pdf.py:612 pretix/base/pdf.py:618 +#: pretix/base/pdf.py:619 pretix/base/pdf.py:625 #, python-brace-format msgid "" msgstr "" -#: pretix/base/pdf.py:659 +#: pretix/base/pdf.py:666 msgid "Attendee name for salutation" msgstr "" -#: pretix/base/pdf.py:660 pretix/base/pdf.py:683 -#: pretix/base/services/placeholders.py:696 +#: pretix/base/pdf.py:667 pretix/base/pdf.py:690 +#: pretix/base/services/placeholders.py:730 #: pretix/control/forms/organizer.py:664 msgid "Mr Doe" msgstr "" -#: pretix/base/pdf.py:666 pretix/base/pdf.py:673 +#: pretix/base/pdf.py:673 pretix/base/pdf.py:680 #: pretix/plugins/badges/exporters.py:501 #: pretix/plugins/checkinlists/exporters.py:125 #: pretix/plugins/checkinlists/exporters.py:499 @@ -7609,16 +7667,16 @@ msgstr "" msgid "Attendee name: {part}" msgstr "" -#: pretix/base/pdf.py:682 +#: pretix/base/pdf.py:689 msgid "Invoice address name for salutation" msgstr "" -#: pretix/base/pdf.py:689 +#: pretix/base/pdf.py:696 #, python-brace-format msgid "Invoice address name: {part}" msgstr "" -#: pretix/base/pdf.py:1310 +#: pretix/base/pdf.py:1327 #, python-brace-format msgid "Your layout file is not a valid layout. Error message: {}" msgstr "" @@ -7708,7 +7766,7 @@ msgid "Bulk-refund confirmation" msgstr "" #: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:247 -#: pretix/base/services/orders.py:155 +#: pretix/base/services/orders.py:159 msgid "" "We were not able to process your request completely as the server was too " "busy. Please try again." @@ -7727,7 +7785,7 @@ msgctxt "subevent" msgid "No date was specified." msgstr "" -#: pretix/base/services/cart.py:108 pretix/base/services/orders.py:192 +#: pretix/base/services/cart.py:108 pretix/base/services/orders.py:196 msgid "You selected a product which is not available for sale." msgstr "" @@ -7758,14 +7816,14 @@ msgid "" "your cart: %s" msgstr "" -#: pretix/base/services/cart.py:127 +#: pretix/base/services/cart.py:127 pretix/base/services/orders.py:150 #, python-format msgid "You cannot select more than %s item per order." msgid_plural "You cannot select more than %s items per order." msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1628 +#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1651 #, python-format msgid "You cannot select more than %(max)s item of the product %(product)s." msgid_plural "" @@ -7773,7 +7831,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1633 +#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1656 #, python-format msgid "You need to select at least %(min)s item of the product %(product)s." msgid_plural "" @@ -7792,7 +7850,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:145 pretix/base/services/orders.py:158 +#: pretix/base/services/cart.py:145 pretix/base/services/orders.py:162 #: pretix/presale/templates/pretixpresale/event/index.html:170 #: pretix/presale/views/waiting.py:145 pretix/presale/views/widget.py:809 msgid "The booking period for this event has not yet started." @@ -7814,7 +7872,7 @@ msgid "" "positions have been removed from your cart." msgstr "" -#: pretix/base/services/cart.py:152 pretix/base/services/orders.py:186 +#: pretix/base/services/cart.py:152 pretix/base/services/orders.py:190 msgid "" "The booking period for one of the events in your cart has ended. The " "affected positions have been removed from your cart." @@ -7832,7 +7890,7 @@ msgstr "" msgid "This voucher code is not known in our database." msgstr "" -#: pretix/base/services/cart.py:158 pretix/base/services/orders.py:161 +#: pretix/base/services/cart.py:158 pretix/base/services/orders.py:165 #, python-format msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " @@ -7924,15 +7982,15 @@ msgctxt "subevent" msgid "The selected event date is not active." msgstr "" -#: pretix/base/services/cart.py:195 pretix/base/services/orders.py:193 +#: pretix/base/services/cart.py:195 pretix/base/services/orders.py:197 msgid "You can not select an add-on for the selected product." msgstr "" -#: pretix/base/services/cart.py:196 pretix/base/services/orders.py:194 +#: pretix/base/services/cart.py:196 pretix/base/services/orders.py:198 msgid "You can not select two variations of the same add-on product." msgstr "" -#: pretix/base/services/cart.py:198 pretix/base/services/orders.py:196 +#: pretix/base/services/cart.py:198 pretix/base/services/orders.py:200 #, python-format msgid "" "You can select at most %(max)s add-on from the category %(cat)s for the " @@ -7943,7 +8001,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:203 pretix/base/services/orders.py:201 +#: pretix/base/services/cart.py:203 pretix/base/services/orders.py:205 #, python-format msgid "" "You need to select at least %(min)s add-on from the category %(cat)s for the " @@ -7954,7 +8012,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:207 pretix/base/services/orders.py:205 +#: pretix/base/services/cart.py:207 pretix/base/services/orders.py:209 #, python-format msgid "" "You can select every add-on from the category %(cat)s for the product " @@ -8194,13 +8252,13 @@ msgstr "" msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:115 +#: pretix/base/services/invoices.py:116 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "" -#: pretix/base/services/invoices.py:127 +#: pretix/base/services/invoices.py:128 #, python-brace-format msgctxt "invoice" msgid "" @@ -8211,51 +8269,51 @@ msgid "" "{country}" msgstr "" -#: pretix/base/services/invoices.py:237 pretix/base/services/invoices.py:274 +#: pretix/base/services/invoices.py:238 pretix/base/services/invoices.py:281 #, python-brace-format msgctxt "invoice" msgid "Event location: {location}" msgstr "" -#: pretix/base/services/invoices.py:253 +#: pretix/base/services/invoices.py:254 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "" -#: pretix/base/services/invoices.py:271 pretix/plugins/reports/exporters.py:309 +#: pretix/base/services/invoices.py:278 pretix/plugins/reports/exporters.py:309 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "" -#: pretix/base/services/invoices.py:566 +#: pretix/base/services/invoices.py:575 msgid "A payment provider specific text might appear here." msgstr "" -#: pretix/base/services/invoices.py:574 +#: pretix/base/services/invoices.py:583 msgid "214th Example Street" msgstr "" -#: pretix/base/services/invoices.py:575 +#: pretix/base/services/invoices.py:584 msgid "012345" msgstr "" -#: pretix/base/services/invoices.py:592 +#: pretix/base/services/invoices.py:601 #, python-brace-format msgid "Sample product {}" msgstr "" -#: pretix/base/services/invoices.py:602 +#: pretix/base/services/invoices.py:611 msgid "Sample product A" msgstr "" -#: pretix/base/services/invoices.py:662 +#: pretix/base/services/invoices.py:671 #, python-brace-format msgid "New invoice: {number}" msgstr "" -#: pretix/base/services/invoices.py:664 +#: pretix/base/services/invoices.py:673 #, python-brace-format msgid "" "Hello,\n" @@ -8289,7 +8347,7 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "" -#: pretix/base/services/mail.py:494 +#: pretix/base/services/mail.py:495 msgctxt "attachment_filename" msgid "Calendar invite" msgstr "" @@ -8396,7 +8454,7 @@ msgid "" msgstr "" #: pretix/base/services/modelimport.py:92 -#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1637 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1660 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" @@ -8457,7 +8515,7 @@ msgstr "" msgid "Your cart is empty." msgstr "" -#: pretix/base/services/orders.py:150 +#: pretix/base/services/orders.py:154 #, python-format msgid "" "You cannot select more than %(max)s item of the product %(product)s. We " @@ -8468,225 +8526,225 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/orders.py:159 +#: pretix/base/services/orders.py:163 msgid "The booking period has ended." msgstr "" -#: pretix/base/services/orders.py:165 +#: pretix/base/services/orders.py:169 msgid "" "The voucher code used for one of the items in your cart is not known in our " "database." msgstr "" -#: pretix/base/services/orders.py:167 +#: pretix/base/services/orders.py:171 msgid "" "The voucher code used for one of the items in your cart has already been " "used the maximum number of times allowed. We removed this item from your " "cart." msgstr "" -#: pretix/base/services/orders.py:171 +#: pretix/base/services/orders.py:175 msgid "" "The voucher code used for one of the items in your cart has already been too " "often. We adjusted the price of the item in your cart." msgstr "" -#: pretix/base/services/orders.py:175 +#: pretix/base/services/orders.py:179 msgid "" "The voucher code used for one of the items in your cart is expired. We " "removed this item from your cart." msgstr "" -#: pretix/base/services/orders.py:178 +#: pretix/base/services/orders.py:182 msgid "" "The voucher code used for one of the items in your cart is not valid for " "this item. We removed this item from your cart." msgstr "" -#: pretix/base/services/orders.py:180 +#: pretix/base/services/orders.py:184 msgid "You need a valid voucher code to order one of the products." msgstr "" -#: pretix/base/services/orders.py:182 +#: pretix/base/services/orders.py:186 msgid "" "The booking period for one of the events in your cart has not yet started. " "The affected positions have been removed from your cart." msgstr "" -#: pretix/base/services/orders.py:189 +#: pretix/base/services/orders.py:193 msgid "" "One of the seats in your order was invalid, we removed the position from " "your cart." msgstr "" -#: pretix/base/services/orders.py:190 +#: pretix/base/services/orders.py:194 msgid "" "One of the seats in your order has been taken in the meantime, we removed " "the position from your cart." msgstr "" -#: pretix/base/services/orders.py:206 +#: pretix/base/services/orders.py:210 #, python-format msgid "" "You cannot remove the position %(addon)s since it has already been checked " "in." msgstr "" -#: pretix/base/services/orders.py:207 +#: pretix/base/services/orders.py:211 msgid "Paid products not supported without a valid currency." msgstr "" -#: pretix/base/services/orders.py:223 +#: pretix/base/services/orders.py:227 msgid "The order was not canceled." msgstr "" -#: pretix/base/services/orders.py:283 pretix/control/forms/orders.py:126 +#: pretix/base/services/orders.py:287 pretix/control/forms/orders.py:126 msgid "The new expiry date needs to be in the future." msgstr "" -#: pretix/base/services/orders.py:383 pretix/base/services/orders.py:481 +#: pretix/base/services/orders.py:387 pretix/base/services/orders.py:485 msgid "This order is not pending approval." msgstr "" -#: pretix/base/services/orders.py:543 pretix/presale/views/order.py:953 +#: pretix/base/services/orders.py:547 pretix/presale/views/order.py:953 #: pretix/presale/views/order.py:1007 msgid "You cannot cancel this order." msgstr "" -#: pretix/base/services/orders.py:555 +#: pretix/base/services/orders.py:559 #, python-brace-format msgid "" "This order can not be canceled since the gift card {card} purchased in this " "order has already been redeemed." msgstr "" -#: pretix/base/services/orders.py:618 pretix/control/forms/orders.py:219 +#: pretix/base/services/orders.py:622 pretix/control/forms/orders.py:219 msgid "" "The cancellation fee cannot be higher than the total amount of this order." msgstr "" -#: pretix/base/services/orders.py:1024 +#: pretix/base/services/orders.py:1048 msgid "The selected payment methods do not cover the total balance." msgstr "" -#: pretix/base/services/orders.py:1092 +#: pretix/base/services/orders.py:1114 msgid "" "While trying to place your order, we noticed that the order total has " "changed. Either one of the prices changed just now, or a gift card you used " "has been used in the meantime. Please check the prices below and try again." msgstr "" -#: pretix/base/services/orders.py:1607 +#: pretix/base/services/orders.py:1630 msgid "You need to select a variation of the product." msgstr "" -#: pretix/base/services/orders.py:1608 +#: pretix/base/services/orders.py:1631 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "" -#: pretix/base/services/orders.py:1609 +#: pretix/base/services/orders.py:1632 msgid "There is no quota defined that allows this operation." msgstr "" -#: pretix/base/services/orders.py:1610 +#: pretix/base/services/orders.py:1633 msgid "The selected product is not active or has no price set." msgstr "" -#: pretix/base/services/orders.py:1611 +#: pretix/base/services/orders.py:1634 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "" -#: pretix/base/services/orders.py:1613 +#: pretix/base/services/orders.py:1636 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." msgstr "" -#: pretix/base/services/orders.py:1616 +#: pretix/base/services/orders.py:1639 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "" -#: pretix/base/services/orders.py:1617 +#: pretix/base/services/orders.py:1640 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "" -#: pretix/base/services/orders.py:1618 +#: pretix/base/services/orders.py:1641 msgid "You need to choose a subevent for the new position." msgstr "" -#: pretix/base/services/orders.py:1621 +#: pretix/base/services/orders.py:1644 #, python-brace-format msgid "" "You selected seat \"{seat}\" for a date that does not match the selected " "ticket date. Please choose a seat again." msgstr "" -#: pretix/base/services/orders.py:1623 +#: pretix/base/services/orders.py:1646 msgid "The selected product requires you to select a seat." msgstr "" -#: pretix/base/services/orders.py:1624 +#: pretix/base/services/orders.py:1647 msgid "The selected product does not allow to select a seat." msgstr "" -#: pretix/base/services/orders.py:1625 +#: pretix/base/services/orders.py:1648 msgid "The selected country is blocked by your tax rule." msgstr "" -#: pretix/base/services/orders.py:1626 +#: pretix/base/services/orders.py:1649 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "" -#: pretix/base/services/orders.py:2451 pretix/base/services/orders.py:2468 +#: pretix/base/services/orders.py:2480 pretix/base/services/orders.py:2497 #, python-brace-format msgid "" "A position can not be canceled since the gift card {card} purchased in this " "order has already been redeemed." msgstr "" -#: pretix/base/services/orders.py:3182 +#: pretix/base/services/orders.py:3244 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." msgstr "" -#: pretix/base/services/placeholders.py:469 -#: pretix/base/services/placeholders.py:478 +#: pretix/base/services/placeholders.py:500 +#: pretix/base/services/placeholders.py:509 #: pretix/base/templates/pretixbase/email/order_details.html:49 msgid "View registration details" msgstr "" -#: pretix/base/services/placeholders.py:575 +#: pretix/base/services/placeholders.py:606 msgid "Sample Corporation" msgstr "" -#: pretix/base/services/placeholders.py:615 +#: pretix/base/services/placeholders.py:647 msgid "Sample Admission Ticket" msgstr "" -#: pretix/base/services/placeholders.py:657 +#: pretix/base/services/placeholders.py:691 msgid "An individual text with a reason can be inserted here." msgstr "" -#: pretix/base/services/placeholders.py:661 +#: pretix/base/services/placeholders.py:695 msgid "The amount has been charged to your card." msgstr "" -#: pretix/base/services/placeholders.py:665 +#: pretix/base/services/placeholders.py:699 msgid "Please transfer money to this bank account: 9999-9999-9999-9999" msgstr "" -#: pretix/base/services/placeholders.py:765 +#: pretix/base/services/placeholders.py:799 #: pretix/control/views/organizer.py:348 msgid "This value will be replaced based on dynamic parameters." msgstr "" @@ -8755,7 +8813,7 @@ msgid "" "on your invoice. Please contact support to resolve this manually." msgstr "" -#: pretix/base/services/tickets.py:100 pretix/control/views/pdf.py:96 +#: pretix/base/services/tickets.py:100 pretix/control/views/pdf.py:98 msgid "Sample workshop" msgstr "" @@ -8795,96 +8853,106 @@ msgstr "" msgid "The voucher has been sent to {recipient}." msgstr "" -#: pretix/base/settings.py:126 +#: pretix/base/settings.py:82 +msgid "Compute taxes for every line individually" +msgstr "" + +#: pretix/base/settings.py:83 +msgid "Compute taxes based on net total" +msgstr "" + +#: pretix/base/settings.py:84 +msgid "Compute taxes based on net total with stable gross prices" +msgstr "" + +#: pretix/base/settings.py:134 msgid "Allow usage of restricted plugins" msgstr "" -#: pretix/base/settings.py:159 +#: pretix/base/settings.py:167 msgid "Allow customers to create accounts" msgstr "" -#: pretix/base/settings.py:160 +#: pretix/base/settings.py:168 msgid "" "This will allow customers to sign up for an account on your ticket shop. " "This is a prerequisite for some advanced features like memberships." msgstr "" -#: pretix/base/settings.py:170 +#: pretix/base/settings.py:178 msgid "Allow customers to log in with email address and password" msgstr "" -#: pretix/base/settings.py:171 +#: pretix/base/settings.py:179 msgid "" "If disabled, you will need to connect one or more single-sign-on providers." msgstr "" -#: pretix/base/settings.py:181 +#: pretix/base/settings.py:189 msgid "Match orders based on email address" msgstr "" -#: pretix/base/settings.py:182 +#: pretix/base/settings.py:190 msgid "" "This will allow registered customers to access orders made with the same " "email address, even if the customer was not logged in during the purchase." msgstr "" -#: pretix/base/settings.py:192 +#: pretix/base/settings.py:200 msgid "Activate re-usable media" msgstr "" -#: pretix/base/settings.py:193 +#: pretix/base/settings.py:201 msgid "" "The re-usable media feature allows you to connect tickets and gift cards " "with physical media such as wristbands or chip cards that may be re-used for " "different tickets or gift cards later." msgstr "" -#: pretix/base/settings.py:219 +#: pretix/base/settings.py:227 msgid "Length of barcodes" msgstr "" -#: pretix/base/settings.py:248 +#: pretix/base/settings.py:256 msgid "" "Automatically create a new gift card if a previously unknown chip is seen" msgstr "" -#: pretix/base/settings.py:261 pretix/base/settings.py:292 +#: pretix/base/settings.py:269 pretix/base/settings.py:300 msgid "Gift card currency" msgstr "" -#: pretix/base/settings.py:279 +#: pretix/base/settings.py:287 msgid "Automatically create a new gift card if a new chip is encoded" msgstr "" -#: pretix/base/settings.py:301 +#: pretix/base/settings.py:309 msgid "Use UID protection feature of NFC chip" msgstr "" -#: pretix/base/settings.py:317 +#: pretix/base/settings.py:325 msgid "Maximum number of items per order" msgstr "" -#: pretix/base/settings.py:318 +#: pretix/base/settings.py:326 msgid "Add-on products will not be counted." msgstr "" -#: pretix/base/settings.py:327 -msgid "" -"Show net prices instead of gross prices in the product list (not " -"recommended!)" +#: pretix/base/settings.py:335 +msgid "Show net prices instead of gross prices in the product list" msgstr "" -#: pretix/base/settings.py:328 +#: pretix/base/settings.py:336 msgid "" "Independent of your choice, the cart will show gross prices as this is the " "price that needs to be paid." msgstr "" -#: pretix/base/settings.py:339 +#: pretix/base/settings.py:347 msgid "Hide prices on attendee ticket page" msgstr "" -#: pretix/base/settings.py:340 +#: pretix/base/settings.py:348 msgid "" "If a person buys multiple tickets and you send emails to all of the " "attendees, with this option the ticket price will not be shown on the ticket " @@ -8892,27 +8960,27 @@ msgid "" "price." msgstr "" -#: pretix/base/settings.py:358 +#: pretix/base/settings.py:366 msgid "Ask for attendee names" msgstr "" -#: pretix/base/settings.py:359 +#: pretix/base/settings.py:367 msgid "Ask for a name for all personalized tickets." msgstr "" -#: pretix/base/settings.py:368 +#: pretix/base/settings.py:376 msgid "Require attendee names" msgstr "" -#: pretix/base/settings.py:369 +#: pretix/base/settings.py:377 msgid "Require customers to fill in the names of all attendees." msgstr "" -#: pretix/base/settings.py:379 +#: pretix/base/settings.py:387 msgid "Ask for email addresses per ticket" msgstr "" -#: pretix/base/settings.py:380 +#: pretix/base/settings.py:388 msgid "" "Normally, pretix asks for one email address per order and the order " "confirmation will be sent only to that email address. If you enable this " @@ -8924,119 +8992,130 @@ msgid "" "enable this in the email settings." msgstr "" -#: pretix/base/settings.py:394 +#: pretix/base/settings.py:402 msgid "Require email addresses per ticket" msgstr "" -#: pretix/base/settings.py:395 +#: pretix/base/settings.py:403 msgid "" "Require customers to fill in individual email addresses for all personalized " "tickets. See the above option for more details. One email address for the " "order confirmation will always be required regardless of this setting." msgstr "" -#: pretix/base/settings.py:407 +#: pretix/base/settings.py:415 msgid "Ask for company per ticket" msgstr "" -#: pretix/base/settings.py:416 +#: pretix/base/settings.py:424 msgid "Require company per ticket" msgstr "" -#: pretix/base/settings.py:426 +#: pretix/base/settings.py:434 msgid "Ask for postal addresses per ticket" msgstr "" -#: pretix/base/settings.py:435 +#: pretix/base/settings.py:443 msgid "Require postal addresses per ticket" msgstr "" -#: pretix/base/settings.py:445 +#: pretix/base/settings.py:453 msgid "Ask for the order email address twice" msgstr "" -#: pretix/base/settings.py:446 +#: pretix/base/settings.py:454 msgid "" "Require customers to fill in the primary email address twice to avoid errors." msgstr "" -#: pretix/base/settings.py:455 +#: pretix/base/settings.py:463 msgid "Ask for a phone number per order" msgstr "" -#: pretix/base/settings.py:464 +#: pretix/base/settings.py:472 msgid "Require a phone number per order" msgstr "" -#: pretix/base/settings.py:474 -msgid "Ask for invoice address" +#: pretix/base/settings.py:482 +msgid "Rounding of taxes" msgstr "" -#: pretix/base/settings.py:483 -msgid "Do not ask for invoice address if an order is free" -msgstr "" - -#: pretix/base/settings.py:492 -msgid "Require customer name" +#: pretix/base/settings.py:486 +msgid "" +"Note that if you transfer your sales data from pretix to an external system " +"for tax reporting, you need to make sure to account for possible rounding " +"differences if your external system rounds differently than pretix." msgstr "" #: pretix/base/settings.py:501 -msgid "Show attendee names on invoices" +msgid "Ask for invoice address" msgstr "" #: pretix/base/settings.py:510 +msgid "Do not ask for invoice address if an order is free" +msgstr "" + +#: pretix/base/settings.py:519 +msgid "Require customer name" +msgstr "" + +#: pretix/base/settings.py:528 +msgid "Show attendee names on invoices" +msgstr "" + +#: pretix/base/settings.py:537 msgid "Show event location on invoices" msgstr "" -#: pretix/base/settings.py:511 +#: pretix/base/settings.py:538 msgid "" "The event location will be shown below the list of products if it is the " "same for all lines. It will be shown on every line if there are different " "locations." msgstr "" -#: pretix/base/settings.py:521 +#: pretix/base/settings.py:548 msgid "Show exchange rates" msgstr "" -#: pretix/base/settings.py:524 pretix/base/settings.py:532 -#: pretix/control/forms/item.py:626 +#: pretix/base/settings.py:551 pretix/base/settings.py:559 +#: pretix/control/forms/item.py:629 msgid "Never" msgstr "" -#: pretix/base/settings.py:525 pretix/base/settings.py:533 +#: pretix/base/settings.py:552 pretix/base/settings.py:560 msgid "" "Based on European Central Bank daily rates, whenever the invoice recipient " "is in an EU country that uses a different currency." msgstr "" -#: pretix/base/settings.py:527 pretix/base/settings.py:535 +#: pretix/base/settings.py:554 pretix/base/settings.py:562 msgid "" "Based on Czech National Bank daily rates, whenever the invoice amount is not " "in CZK." msgstr "" -#: pretix/base/settings.py:545 +#: pretix/base/settings.py:572 msgid "Require invoice address" msgstr "" -#: pretix/base/settings.py:555 +#: pretix/base/settings.py:582 msgid "Require a business address" msgstr "" -#: pretix/base/settings.py:556 +#: pretix/base/settings.py:583 msgid "This will require users to enter a company name." msgstr "" -#: pretix/base/settings.py:566 +#: pretix/base/settings.py:593 msgid "Ask for beneficiary" msgstr "" -#: pretix/base/settings.py:576 +#: pretix/base/settings.py:603 msgid "Custom recipient field label" msgstr "" -#: pretix/base/settings.py:578 +#: pretix/base/settings.py:605 msgid "" "If you want to add a custom text field, e.g. for a country-specific " "registration number, to your invoice address form, please fill in the label " @@ -9045,22 +9124,22 @@ msgid "" "on the invoice below the headline. The field will not be required." msgstr "" -#: pretix/base/settings.py:591 +#: pretix/base/settings.py:618 msgid "Custom recipient field help text" msgstr "" -#: pretix/base/settings.py:593 +#: pretix/base/settings.py:620 msgid "" "If you use the custom recipient field, you can specify a help text which " "will be displayed underneath the field. It will not be displayed on the " "invoice." msgstr "" -#: pretix/base/settings.py:603 +#: pretix/base/settings.py:630 msgid "Ask for VAT ID" msgstr "" -#: pretix/base/settings.py:605 +#: pretix/base/settings.py:632 #, python-brace-format msgid "" "Only works if an invoice address is asked for. VAT ID is never required and " @@ -9068,67 +9147,67 @@ msgid "" "{countries}" msgstr "" -#: pretix/base/settings.py:618 +#: pretix/base/settings.py:645 msgid "Invoice address explanation" msgstr "" -#: pretix/base/settings.py:621 +#: pretix/base/settings.py:648 msgid "This text will be shown above the invoice address form during checkout." msgstr "" -#: pretix/base/settings.py:630 +#: pretix/base/settings.py:657 msgid "Show paid amount on partially paid invoices" msgstr "" -#: pretix/base/settings.py:631 +#: pretix/base/settings.py:658 msgid "" "If an invoice has already been paid partially, this option will add the paid " "and pending amount to the invoice." msgstr "" -#: pretix/base/settings.py:641 +#: pretix/base/settings.py:668 msgid "Show free products on invoices" msgstr "" -#: pretix/base/settings.py:642 +#: pretix/base/settings.py:669 msgid "" "Note that invoices will never be generated for orders that contain only free " "products." msgstr "" -#: pretix/base/settings.py:652 +#: pretix/base/settings.py:679 msgid "Show expiration date of order" msgstr "" -#: pretix/base/settings.py:653 +#: pretix/base/settings.py:680 msgid "" "The expiration date will not be shown if the invoice is generated after the " "order is paid." msgstr "" -#: pretix/base/settings.py:663 +#: pretix/base/settings.py:690 msgid "Minimum length of invoice number after prefix" msgstr "" -#: pretix/base/settings.py:664 +#: pretix/base/settings.py:691 msgid "" "The part of your invoice number after your prefix will be filled up with " "leading zeros up to this length, e.g. INV-001 or INV-00001." msgstr "" -#: pretix/base/settings.py:675 +#: pretix/base/settings.py:703 msgid "Generate invoices with consecutive numbers" msgstr "" -#: pretix/base/settings.py:676 +#: pretix/base/settings.py:704 msgid "If deactivated, the order code will be used in the invoice number." msgstr "" -#: pretix/base/settings.py:685 +#: pretix/base/settings.py:713 msgid "Invoice number prefix" msgstr "" -#: pretix/base/settings.py:686 +#: pretix/base/settings.py:714 msgid "" "This will be prepended to invoice numbers. If you leave this field empty, " "your event slug will be used followed by a dash. Attention: If multiple " @@ -9139,97 +9218,97 @@ msgid "" "invoice, or %m and %d for the day of month." msgstr "" -#: pretix/base/settings.py:698 pretix/base/settings.py:720 +#: pretix/base/settings.py:726 pretix/base/settings.py:749 #, python-brace-format msgid "Please only use the characters {allowed} in this field." msgstr "" -#: pretix/base/settings.py:711 +#: pretix/base/settings.py:740 msgid "Invoice number prefix for cancellations" msgstr "" -#: pretix/base/settings.py:712 +#: pretix/base/settings.py:741 msgid "" "This will be prepended to invoice numbers of cancellations. If you leave " "this field empty, the same numbering scheme will be used that you configured " "for regular invoices." msgstr "" -#: pretix/base/settings.py:733 +#: pretix/base/settings.py:763 msgid "Highlight order code to make it stand out visibly" msgstr "" -#: pretix/base/settings.py:734 pretix/base/settings.py:745 +#: pretix/base/settings.py:764 pretix/base/settings.py:775 msgid "Only respected by some invoice renderers." msgstr "" -#: pretix/base/settings.py:744 pretix/base/settings.py:2988 +#: pretix/base/settings.py:774 pretix/base/settings.py:3042 #: pretix/control/templates/pretixcontrol/pdf/index.html:436 msgid "Font" msgstr "" -#: pretix/base/settings.py:770 +#: pretix/base/settings.py:800 msgid "Length of ticket codes" msgstr "" -#: pretix/base/settings.py:797 +#: pretix/base/settings.py:827 msgid "Reservation period" msgstr "" -#: pretix/base/settings.py:799 +#: pretix/base/settings.py:829 msgid "" "The number of minutes the items in a user's cart are reserved for this user." msgstr "" -#: pretix/base/settings.py:808 +#: pretix/base/settings.py:838 msgid "" "Directly redirect to check-out after a product has been added to the cart." msgstr "" -#: pretix/base/settings.py:817 +#: pretix/base/settings.py:847 msgid "End of presale text" msgstr "" -#: pretix/base/settings.py:820 +#: pretix/base/settings.py:850 msgid "" "This text will be shown above the ticket shop once the designated sales " "timeframe for this event is over. You can use it to describe other options " "to get a ticket, such as a box office." msgstr "" -#: pretix/base/settings.py:834 +#: pretix/base/settings.py:864 msgid "Guidance text" msgstr "" -#: pretix/base/settings.py:835 +#: pretix/base/settings.py:865 msgid "" "This text will be shown above the payment options. You can explain the " "choices to the user here, if you want." msgstr "" -#: pretix/base/settings.py:846 pretix/base/settings.py:855 +#: pretix/base/settings.py:876 pretix/base/settings.py:885 msgid "in days" msgstr "" -#: pretix/base/settings.py:847 pretix/base/settings.py:856 +#: pretix/base/settings.py:877 pretix/base/settings.py:886 msgid "in minutes" msgstr "" -#: pretix/base/settings.py:851 +#: pretix/base/settings.py:881 msgid "Set payment term" msgstr "" -#: pretix/base/settings.py:858 +#: pretix/base/settings.py:888 msgid "" "If using days, the order will expire at the end of the last day. Using " "minutes is more exact, but should only be used for real-time payment methods." msgstr "" -#: pretix/base/settings.py:868 +#: pretix/base/settings.py:898 msgid "Payment term in days" msgstr "" -#: pretix/base/settings.py:875 +#: pretix/base/settings.py:905 msgid "" "The number of days after placing an order the user has to pay to preserve " "their reservation. If you use slow payment methods like bank transfer, we " @@ -9237,11 +9316,11 @@ msgid "" "still setting two or three days to allow people to retry failed payments." msgstr "" -#: pretix/base/settings.py:893 +#: pretix/base/settings.py:923 msgid "Only end payment terms on weekdays" msgstr "" -#: pretix/base/settings.py:894 +#: pretix/base/settings.py:924 msgid "" "If this is activated and the payment term of any order ends on a Saturday or " "Sunday, it will be moved to the next Monday instead. This is required in " @@ -9249,11 +9328,11 @@ msgid "" "configured below." msgstr "" -#: pretix/base/settings.py:910 +#: pretix/base/settings.py:940 msgid "Payment term in minutes" msgstr "" -#: pretix/base/settings.py:911 +#: pretix/base/settings.py:941 msgid "" "The number of minutes after placing an order the user has to pay to preserve " "their reservation. Only use this if you exclusively offer real-time payment " @@ -9261,33 +9340,33 @@ msgid "" "be a few minutes longer before the order is marked as expired." msgstr "" -#: pretix/base/settings.py:934 +#: pretix/base/settings.py:964 msgid "Last date of payments" msgstr "" -#: pretix/base/settings.py:935 +#: pretix/base/settings.py:965 msgid "" "The last date any payments are accepted. This has precedence over the terms " "configured above. If you use the event series feature and an order contains " "tickets for multiple dates, the earliest date will be used." msgstr "" -#: pretix/base/settings.py:946 +#: pretix/base/settings.py:976 msgid "Automatically expire unpaid orders" msgstr "" -#: pretix/base/settings.py:947 +#: pretix/base/settings.py:977 msgid "" "If checked, all unpaid orders will automatically go from 'pending' to " "'expired' after the end of their payment deadline. This means that those " "tickets go back to the pool and can be ordered by other people." msgstr "" -#: pretix/base/settings.py:958 +#: pretix/base/settings.py:988 msgid "Expiration delay" msgstr "" -#: pretix/base/settings.py:959 +#: pretix/base/settings.py:989 msgid "" "The order will only actually expire this many days after the expiration date " "communicated to the customer. If you select \"Only end payment terms on " @@ -9296,18 +9375,18 @@ msgid "" "enforced." msgstr "" -#: pretix/base/settings.py:980 +#: pretix/base/settings.py:1010 msgid "Hide \"payment pending\" state on customer-facing pages" msgstr "" -#: pretix/base/settings.py:981 +#: pretix/base/settings.py:1011 msgid "" "The payment instructions panel will still be shown to the primary customer, " "but no indication of missing payment will be visible on the ticket pages of " "attendees who did not buy the ticket themselves." msgstr "" -#: pretix/base/settings.py:997 +#: pretix/base/settings.py:1027 msgid "" "If you have a gift card, please enter the gift card code here. If the gift " "card does not have enough credit to pay for the full order, you will be " @@ -9315,200 +9394,200 @@ msgid "" "a different payment method for the difference." msgstr "" -#: pretix/base/settings.py:1013 +#: pretix/base/settings.py:1043 msgid "Accept late payments" msgstr "" -#: pretix/base/settings.py:1014 +#: pretix/base/settings.py:1044 msgid "" "Accept payments for orders even when they are in 'expired' state as long as " "enough capacity is available. No payments will ever be accepted after the " "'Last date of payments' configured above." msgstr "" -#: pretix/base/settings.py:1025 +#: pretix/base/settings.py:1055 msgid "Show start date" msgstr "" -#: pretix/base/settings.py:1026 +#: pretix/base/settings.py:1056 msgid "Show the presale start date before presale has started." msgstr "" -#: pretix/base/settings.py:1037 pretix/base/settings.py:1045 -#: pretix/base/settings.py:1059 pretix/base/settings.py:1068 +#: pretix/base/settings.py:1067 pretix/base/settings.py:1075 +#: pretix/base/settings.py:1089 pretix/base/settings.py:1098 msgid "Use default tax rate" msgstr "" -#: pretix/base/settings.py:1038 pretix/base/settings.py:1046 -#: pretix/base/settings.py:1057 pretix/base/settings.py:1066 +#: pretix/base/settings.py:1068 pretix/base/settings.py:1076 +#: pretix/base/settings.py:1087 pretix/base/settings.py:1096 msgid "Charge no taxes" msgstr "" -#: pretix/base/settings.py:1042 +#: pretix/base/settings.py:1072 msgid "Tax handling on payment fees" msgstr "" -#: pretix/base/settings.py:1058 pretix/base/settings.py:1067 +#: pretix/base/settings.py:1088 pretix/base/settings.py:1097 msgid "Use same taxes as order positions (split according to net prices)" msgstr "" -#: pretix/base/settings.py:1063 +#: pretix/base/settings.py:1093 msgid "Tax handling on cancellation fees" msgstr "" -#: pretix/base/settings.py:1079 pretix/base/settings.py:1091 +#: pretix/base/settings.py:1109 pretix/base/settings.py:1121 msgid "Do not generate invoices" msgstr "" -#: pretix/base/settings.py:1080 pretix/base/settings.py:1096 +#: pretix/base/settings.py:1110 pretix/base/settings.py:1126 msgid "Only manually in admin panel" msgstr "" -#: pretix/base/settings.py:1081 pretix/base/settings.py:1094 +#: pretix/base/settings.py:1111 pretix/base/settings.py:1124 msgid "Automatically on user request" msgstr "" -#: pretix/base/settings.py:1082 pretix/base/settings.py:1095 +#: pretix/base/settings.py:1112 pretix/base/settings.py:1125 msgid "Automatically on user request for paid orders" msgstr "" -#: pretix/base/settings.py:1083 +#: pretix/base/settings.py:1113 msgid "Automatically for all created orders" msgstr "" -#: pretix/base/settings.py:1084 +#: pretix/base/settings.py:1114 msgid "Automatically on payment or when required by payment method" msgstr "" -#: pretix/base/settings.py:1088 +#: pretix/base/settings.py:1118 msgid "Generate invoices" msgstr "" -#: pretix/base/settings.py:1092 +#: pretix/base/settings.py:1122 msgid "Automatically after payment or when required by payment method" msgstr "" -#: pretix/base/settings.py:1093 +#: pretix/base/settings.py:1123 msgid "Automatically before payment for all created orders" msgstr "" -#: pretix/base/settings.py:1098 +#: pretix/base/settings.py:1128 msgid "Invoices will never be automatically generated for free orders." msgstr "" -#: pretix/base/settings.py:1108 pretix/base/settings.py:1119 +#: pretix/base/settings.py:1138 pretix/base/settings.py:1149 msgid "" "Automatic based on ticket-specific validity, membership validity, event " "series date, or event date" msgstr "" -#: pretix/base/settings.py:1109 pretix/base/settings.py:1120 +#: pretix/base/settings.py:1139 pretix/base/settings.py:1150 msgid "Automatic, but prefer invoice date over event date" msgstr "" -#: pretix/base/settings.py:1112 pretix/base/settings.py:1123 +#: pretix/base/settings.py:1142 pretix/base/settings.py:1153 msgid "Invoice date" msgstr "" -#: pretix/base/settings.py:1116 +#: pretix/base/settings.py:1146 msgid "Date of service" msgstr "" -#: pretix/base/settings.py:1125 +#: pretix/base/settings.py:1155 msgid "" "This controls what dates are shown on the invoice, but is especially " "important for electronic invoicing." msgstr "" -#: pretix/base/settings.py:1136 +#: pretix/base/settings.py:1166 msgid "Automatically cancel and reissue invoice on address changes" msgstr "" -#: pretix/base/settings.py:1137 +#: pretix/base/settings.py:1167 msgid "" "If customers change their invoice address on an existing order, the invoice " "will automatically be canceled and a new invoice will be issued. This " "setting does not affect changes made through the backend." msgstr "" -#: pretix/base/settings.py:1148 +#: pretix/base/settings.py:1178 msgid "Allow to update existing invoices" msgstr "" -#: pretix/base/settings.py:1149 +#: pretix/base/settings.py:1179 msgid "" "By default, invoices can never again be changed once they are issued. In " "most countries, we recommend to leave this option turned off and always " "issue a new invoice if a change needs to be made." msgstr "" -#: pretix/base/settings.py:1164 +#: pretix/base/settings.py:1194 msgid "Address line" msgstr "" -#: pretix/base/settings.py:1168 +#: pretix/base/settings.py:1198 msgid "Albert Einstein Road 52" msgstr "" -#: pretix/base/settings.py:1220 +#: pretix/base/settings.py:1272 msgid "Domestic tax ID" msgstr "" -#: pretix/base/settings.py:1221 +#: pretix/base/settings.py:1273 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "" -#: pretix/base/settings.py:1230 +#: pretix/base/settings.py:1283 msgid "EU VAT ID" msgstr "" -#: pretix/base/settings.py:1243 +#: pretix/base/settings.py:1297 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "" -#: pretix/base/settings.py:1246 +#: pretix/base/settings.py:1300 msgid "Introductory text" msgstr "" -#: pretix/base/settings.py:1247 +#: pretix/base/settings.py:1301 msgid "Will be printed on every invoice above the invoice rows." msgstr "" -#: pretix/base/settings.py:1260 +#: pretix/base/settings.py:1314 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." msgstr "" -#: pretix/base/settings.py:1263 +#: pretix/base/settings.py:1317 msgid "Additional text" msgstr "" -#: pretix/base/settings.py:1264 +#: pretix/base/settings.py:1318 msgid "Will be printed on every invoice below the invoice total." msgstr "" -#: pretix/base/settings.py:1277 +#: pretix/base/settings.py:1331 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." msgstr "" -#: pretix/base/settings.py:1280 +#: pretix/base/settings.py:1334 msgid "Footer" msgstr "" -#: pretix/base/settings.py:1281 +#: pretix/base/settings.py:1335 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "" -#: pretix/base/settings.py:1294 +#: pretix/base/settings.py:1348 msgid "Attach invoices to emails" msgstr "" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1349 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -9516,39 +9595,39 @@ msgid "" "are not automatically generated, they will not be attached to emails." msgstr "" -#: pretix/base/settings.py:1307 +#: pretix/base/settings.py:1361 msgid "Email address to receive a copy of each invoice" msgstr "" -#: pretix/base/settings.py:1308 +#: pretix/base/settings.py:1362 msgid "" "Each newly created invoice will be sent to this email address shortly after " "creation. You can use this for an automated import of invoices to your " "accounting system. The invoice will be the only attachment of the email." msgstr "" -#: pretix/base/settings.py:1323 +#: pretix/base/settings.py:1377 msgid "Show items outside presale period" msgstr "" -#: pretix/base/settings.py:1324 +#: pretix/base/settings.py:1378 msgid "" "Show item details before presale has started and after presale has ended" msgstr "" -#: pretix/base/settings.py:1344 +#: pretix/base/settings.py:1398 msgid "Available languages" msgstr "" -#: pretix/base/settings.py:1360 pretix/control/forms/event.py:139 +#: pretix/base/settings.py:1414 pretix/control/forms/event.py:139 msgid "Default language" msgstr "" -#: pretix/base/settings.py:1370 +#: pretix/base/settings.py:1424 msgid "Region" msgstr "" -#: pretix/base/settings.py:1371 +#: pretix/base/settings.py:1425 msgid "" "Will be used to determine date and time formatting as well as default " "country for customer addresses and phone numbers. For formatting, this takes " @@ -9556,11 +9635,11 @@ msgid "" "languages used in different regions globally (like English)." msgstr "" -#: pretix/base/settings.py:1383 +#: pretix/base/settings.py:1437 msgid "This shop represents an event" msgstr "" -#: pretix/base/settings.py:1385 +#: pretix/base/settings.py:1439 msgid "" "Uncheck this box if you are only selling something that has no specific " "date, such as gift cards or a ticket that can be used any time. The system " @@ -9569,45 +9648,45 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1398 +#: pretix/base/settings.py:1452 msgid "Show event end date" msgstr "" -#: pretix/base/settings.py:1399 +#: pretix/base/settings.py:1453 msgid "If disabled, only event's start date will be displayed to the public." msgstr "" -#: pretix/base/settings.py:1408 +#: pretix/base/settings.py:1462 msgid "Show dates with time" msgstr "" -#: pretix/base/settings.py:1409 +#: pretix/base/settings.py:1463 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." msgstr "" -#: pretix/base/settings.py:1418 +#: pretix/base/settings.py:1472 msgid "Hide all products that are sold out" msgstr "" -#: pretix/base/settings.py:1428 pretix/control/forms/event.py:1692 +#: pretix/base/settings.py:1482 pretix/control/forms/event.py:1794 msgid "Publicly show how many tickets of a certain type are still available." msgstr "" -#: pretix/base/settings.py:1437 +#: pretix/base/settings.py:1491 msgid "Ask search engines not to index the ticket shop" msgstr "" -#: pretix/base/settings.py:1446 +#: pretix/base/settings.py:1500 msgid "Show variations of a product expanded by default" msgstr "" -#: pretix/base/settings.py:1455 +#: pretix/base/settings.py:1509 msgid "Enable waiting list" msgstr "" -#: pretix/base/settings.py:1456 pretix/control/forms/event.py:1697 +#: pretix/base/settings.py:1510 pretix/control/forms/event.py:1799 msgid "" "Once a ticket is sold out, people can add themselves to a waiting list. As " "soon as a ticket becomes available again, it will be reserved for the first " @@ -9615,11 +9694,11 @@ msgid "" "notification with a voucher that can be used to buy a ticket." msgstr "" -#: pretix/base/settings.py:1467 +#: pretix/base/settings.py:1521 msgid "Automatic waiting list assignments" msgstr "" -#: pretix/base/settings.py:1468 +#: pretix/base/settings.py:1522 msgid "" "If ticket capacity becomes free, automatically create a voucher and send it " "to the first person on the waiting list for that product. If this is not " @@ -9628,22 +9707,22 @@ msgid "" "enabled, tickets will still be sent out." msgstr "" -#: pretix/base/settings.py:1484 +#: pretix/base/settings.py:1538 msgid "Waiting list response time" msgstr "" -#: pretix/base/settings.py:1487 +#: pretix/base/settings.py:1541 msgid "" "If a ticket voucher is sent to a person on the waiting list, it has to be " "redeemed within this number of hours until it expires and can be re-assigned " "to the next person on the list." msgstr "" -#: pretix/base/settings.py:1498 +#: pretix/base/settings.py:1552 msgid "Disable waiting list" msgstr "" -#: pretix/base/settings.py:1499 +#: pretix/base/settings.py:1553 msgid "" "The waiting list will be fully disabled after this date. This means that " "nobody can add themselves to the waiting list any more, but also that " @@ -9652,53 +9731,53 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1511 +#: pretix/base/settings.py:1565 msgid "Ask for a name" msgstr "" -#: pretix/base/settings.py:1512 +#: pretix/base/settings.py:1566 msgid "Ask for a name when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1521 +#: pretix/base/settings.py:1575 msgid "Require name" msgstr "" -#: pretix/base/settings.py:1522 +#: pretix/base/settings.py:1576 msgid "Require a name when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1532 +#: pretix/base/settings.py:1586 msgid "Ask for a phone number" msgstr "" -#: pretix/base/settings.py:1533 +#: pretix/base/settings.py:1587 msgid "Ask for a phone number when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1542 +#: pretix/base/settings.py:1596 msgid "Require phone number" msgstr "" -#: pretix/base/settings.py:1543 +#: pretix/base/settings.py:1597 msgid "Require a phone number when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1553 +#: pretix/base/settings.py:1607 msgid "Phone number explanation" msgstr "" -#: pretix/base/settings.py:1556 +#: pretix/base/settings.py:1610 msgid "" "If you ask for a phone number, explain why you do so and what you will use " "the phone number for." msgstr "" -#: pretix/base/settings.py:1568 +#: pretix/base/settings.py:1622 msgid "Maximum number of entries per email address for the same product" msgstr "" -#: pretix/base/settings.py:1572 +#: pretix/base/settings.py:1626 msgid "" "With an increased limit, a customer may request more than one ticket for a " "specific product using the same, unique email address. However, regardless " @@ -9707,11 +9786,11 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1584 +#: pretix/base/settings.py:1638 msgid "Show number of check-ins to customer" msgstr "" -#: pretix/base/settings.py:1585 +#: pretix/base/settings.py:1639 msgid "" "With this option enabled, your customers will be able to see how many times " "they entered the event. This is usually not necessary, but might be useful " @@ -9721,62 +9800,62 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1598 +#: pretix/base/settings.py:1652 msgid "Allow users to download tickets" msgstr "" -#: pretix/base/settings.py:1599 +#: pretix/base/settings.py:1653 msgid "If this is off, nobody can download a ticket." msgstr "" -#: pretix/base/settings.py:1608 +#: pretix/base/settings.py:1662 msgid "Download date" msgstr "" -#: pretix/base/settings.py:1609 +#: pretix/base/settings.py:1663 msgid "" "Ticket download will be offered after this date. If you use the event series " "feature and an order contains tickets for multiple event dates, download of " "all tickets will be available if at least one of the event dates allows it." msgstr "" -#: pretix/base/settings.py:1620 +#: pretix/base/settings.py:1674 msgid "Generate tickets for add-on products and bundled products" msgstr "" -#: pretix/base/settings.py:1621 +#: pretix/base/settings.py:1675 msgid "" "By default, tickets are only issued for products selected individually, not " "for add-on products or bundled products. With this option, a separate ticket " "is issued for every add-on product or bundled product as well." msgstr "" -#: pretix/base/settings.py:1634 +#: pretix/base/settings.py:1688 msgid "Generate tickets for all products" msgstr "" -#: pretix/base/settings.py:1635 +#: pretix/base/settings.py:1689 msgid "" "If turned off, tickets are only issued for products that are marked as an " "\"admission ticket\"in the product settings. You can also turn off ticket " "issuing in every product separately." msgstr "" -#: pretix/base/settings.py:1647 +#: pretix/base/settings.py:1701 msgid "Generate tickets for pending orders" msgstr "" -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1702 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." msgstr "" -#: pretix/base/settings.py:1659 +#: pretix/base/settings.py:1713 msgid "Do not issue ticket before email address is validated" msgstr "" -#: pretix/base/settings.py:1660 +#: pretix/base/settings.py:1714 msgid "" "If turned on, tickets will not be offered for download directly after " "purchase. They will be attached to the payment confirmation email (if the " @@ -9785,11 +9864,11 @@ msgid "" "orders performed through other sales channels." msgstr "" -#: pretix/base/settings.py:1676 +#: pretix/base/settings.py:1730 msgid "Low availability threshold" msgstr "" -#: pretix/base/settings.py:1677 +#: pretix/base/settings.py:1731 msgid "" "If the availability of tickets falls below this percentage, the event (or a " "date, if it is an event series) will be highlighted to have low availability " @@ -9797,95 +9876,95 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1691 +#: pretix/base/settings.py:1745 msgid "Show availability in event overviews" msgstr "" -#: pretix/base/settings.py:1692 +#: pretix/base/settings.py:1746 msgid "" "If checked, the list of events will show if events are sold out. This might " "make for longer page loading times if you have lots of events and the shown " "status might be out of date for up to two minutes." msgstr "" -#: pretix/base/settings.py:1705 pretix/base/settings.py:1713 +#: pretix/base/settings.py:1759 pretix/base/settings.py:1767 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "" -#: pretix/base/settings.py:1706 pretix/base/settings.py:1714 +#: pretix/base/settings.py:1760 pretix/base/settings.py:1768 msgid "Week calendar" msgstr "" -#: pretix/base/settings.py:1707 pretix/base/settings.py:1715 +#: pretix/base/settings.py:1761 pretix/base/settings.py:1769 msgid "Month calendar" msgstr "" -#: pretix/base/settings.py:1711 +#: pretix/base/settings.py:1765 msgid "Default overview style" msgstr "" -#: pretix/base/settings.py:1717 +#: pretix/base/settings.py:1771 msgid "" "If your event series has more than 50 dates in the future, only the month or " "week calendar can be used." msgstr "" -#: pretix/base/settings.py:1726 +#: pretix/base/settings.py:1780 msgid "Show filter options for calendar or list view" msgstr "" -#: pretix/base/settings.py:1727 +#: pretix/base/settings.py:1781 msgid "" "You can set up possible filters as meta properties in your organizer " "settings." msgstr "" -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1790 msgid "Hide all unavailable dates from calendar or list views" msgstr "" -#: pretix/base/settings.py:1737 pretix/base/settings.py:1748 +#: pretix/base/settings.py:1791 pretix/base/settings.py:1802 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1747 +#: pretix/base/settings.py:1801 msgid "Hide all past dates from calendar" msgstr "" -#: pretix/base/settings.py:1759 pretix/base/settings.py:1768 +#: pretix/base/settings.py:1813 pretix/base/settings.py:1822 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1760 pretix/base/settings.py:1769 +#: pretix/base/settings.py:1814 pretix/base/settings.py:1823 msgid "Only the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1761 pretix/base/settings.py:1770 +#: pretix/base/settings.py:1815 pretix/base/settings.py:1824 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1765 +#: pretix/base/settings.py:1819 msgid "Allow customers to modify their information" msgstr "" -#: pretix/base/settings.py:1780 +#: pretix/base/settings.py:1834 msgid "Allow customers to modify their information after they checked in." msgstr "" -#: pretix/base/settings.py:1781 +#: pretix/base/settings.py:1835 msgid "" "By default, no more modifications are possible for an order as soon as one " "of the tickets in the order has been checked in." msgstr "" -#: pretix/base/settings.py:1791 +#: pretix/base/settings.py:1845 msgid "Last date of modifications" msgstr "" -#: pretix/base/settings.py:1792 +#: pretix/base/settings.py:1846 msgid "" "The last date users can modify details of their orders, such as attendee " "names or answers to questions. If you use the event series feature and an " @@ -9893,53 +9972,53 @@ msgid "" "used." msgstr "" -#: pretix/base/settings.py:1803 +#: pretix/base/settings.py:1857 msgid "Customers can change the variation of the products they purchased" msgstr "" -#: pretix/base/settings.py:1812 +#: pretix/base/settings.py:1866 msgid "Customers can change their selected add-on products" msgstr "" -#: pretix/base/settings.py:1822 pretix/base/settings.py:1833 +#: pretix/base/settings.py:1876 pretix/base/settings.py:1887 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "" -#: pretix/base/settings.py:1823 pretix/base/settings.py:1834 +#: pretix/base/settings.py:1877 pretix/base/settings.py:1888 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "" -#: pretix/base/settings.py:1824 pretix/base/settings.py:1835 +#: pretix/base/settings.py:1878 pretix/base/settings.py:1889 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "" -#: pretix/base/settings.py:1825 pretix/base/settings.py:1836 +#: pretix/base/settings.py:1879 pretix/base/settings.py:1890 msgid "" "Allow changes regardless of price, as long as no refund is required (i.e. " "the resulting price is not lower than what has already been paid)." msgstr "" -#: pretix/base/settings.py:1827 pretix/base/settings.py:1838 +#: pretix/base/settings.py:1881 pretix/base/settings.py:1892 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" -#: pretix/base/settings.py:1831 +#: pretix/base/settings.py:1885 msgid "Requirement for changed prices" msgstr "" -#: pretix/base/settings.py:1849 +#: pretix/base/settings.py:1903 msgid "Do not allow changes after" msgstr "" -#: pretix/base/settings.py:1858 +#: pretix/base/settings.py:1912 msgid "Allow change even though the ticket has already been checked in" msgstr "" -#: pretix/base/settings.py:1859 +#: pretix/base/settings.py:1913 msgid "" "By default, order changes are disabled after any ticket in the order has " "been checked in. If you check this box, this requirement is lifted. It is " @@ -9948,11 +10027,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:1871 +#: pretix/base/settings.py:1925 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:1872 +#: pretix/base/settings.py:1926 msgid "" "By default, only the person who ordered the tickets can make any changes. If " "you check this box, individual attendees can also make changes. However, " @@ -9961,77 +10040,77 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:1884 +#: pretix/base/settings.py:1938 msgid "Customers can cancel their unpaid orders" msgstr "" -#: pretix/base/settings.py:1896 +#: pretix/base/settings.py:1950 msgid "Charge a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:1897 pretix/base/settings.py:1908 -#: pretix/base/settings.py:1922 +#: pretix/base/settings.py:1951 pretix/base/settings.py:1962 +#: pretix/base/settings.py:1976 msgid "" "Only affects orders pending payments, a cancellation fee for free orders is " "never charged. Note that it will be your responsibility to claim the " "cancellation fee from the user." msgstr "" -#: pretix/base/settings.py:1907 +#: pretix/base/settings.py:1961 msgid "Charge payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:1921 +#: pretix/base/settings.py:1975 msgid "Charge a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:1932 pretix/base/settings.py:2071 +#: pretix/base/settings.py:1986 pretix/base/settings.py:2125 msgid "Do not allow cancellations after" msgstr "" -#: pretix/base/settings.py:1941 +#: pretix/base/settings.py:1995 msgid "Customers can cancel their paid orders" msgstr "" -#: pretix/base/settings.py:1942 +#: pretix/base/settings.py:1996 msgid "" "Paid money will be automatically paid back if the payment method allows it. " "Otherwise, a manual refund will be created for you to process manually." msgstr "" -#: pretix/base/settings.py:1955 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:2009 pretix/control/forms/orders.py:909 msgid "Keep a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:1964 +#: pretix/base/settings.py:2018 msgid "Keep payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:1976 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:2030 pretix/control/forms/orders.py:920 msgid "Keep a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:1985 +#: pretix/base/settings.py:2039 msgid "Allow customers to voluntarily choose a lower refund" msgstr "" -#: pretix/base/settings.py:1986 +#: pretix/base/settings.py:2040 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "" -#: pretix/base/settings.py:1991 +#: pretix/base/settings.py:2045 msgid "" "However, if you want us to help keep the lights on here, please consider " "using the slider below to request a smaller refund. Thank you!" msgstr "" -#: pretix/base/settings.py:1998 +#: pretix/base/settings.py:2052 msgid "Voluntary lower refund explanation" msgstr "" -#: pretix/base/settings.py:2001 +#: pretix/base/settings.py:2055 msgid "" "This text will be shown in between the explanation of how the refunds work " "and the slider which your customers can use to choose the amount they would " @@ -10039,107 +10118,107 @@ msgid "" "help your organization." msgstr "" -#: pretix/base/settings.py:2016 +#: pretix/base/settings.py:2070 msgid "Step size for reduction amount" msgstr "" -#: pretix/base/settings.py:2017 +#: pretix/base/settings.py:2071 msgid "" "By default, customers can choose an arbitrary amount for you to keep. If you " "set this to e.g. 10, they will only be able to choose values in increments " "of 10." msgstr "" -#: pretix/base/settings.py:2027 +#: pretix/base/settings.py:2081 msgid "" "Customers can only request a cancellation that needs to be approved by the " "event organizer before the order is canceled and a refund is issued." msgstr "" -#: pretix/base/settings.py:2037 +#: pretix/base/settings.py:2091 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2046 pretix/base/settings.py:2056 +#: pretix/base/settings.py:2100 pretix/base/settings.py:2110 msgid "All refunds are issued to the original payment method" msgstr "" -#: pretix/base/settings.py:2047 pretix/base/settings.py:2057 +#: pretix/base/settings.py:2101 pretix/base/settings.py:2111 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" -#: pretix/base/settings.py:2048 pretix/base/settings.py:2058 +#: pretix/base/settings.py:2102 pretix/base/settings.py:2112 msgid "All refunds are issued as gift cards" msgstr "" -#: pretix/base/settings.py:2049 pretix/base/settings.py:2059 +#: pretix/base/settings.py:2103 pretix/base/settings.py:2113 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2054 +#: pretix/base/settings.py:2108 #: pretix/control/templates/pretixcontrol/order/index.html:149 msgid "Refund method" msgstr "" -#: pretix/base/settings.py:2080 pretix/base/settings.py:2093 +#: pretix/base/settings.py:2134 pretix/base/settings.py:2147 msgid "Terms of cancellation" msgstr "" -#: pretix/base/settings.py:2083 +#: pretix/base/settings.py:2137 msgid "" "This text will be shown when cancellation is allowed for a paid order. Leave " "empty if you want pretix to automatically generate the terms of cancellation " "based on your settings." msgstr "" -#: pretix/base/settings.py:2096 +#: pretix/base/settings.py:2150 msgid "" "This text will be shown when cancellation is allowed for an unpaid or free " "order. Leave empty if you want pretix to automatically generate the terms of " "cancellation based on your settings." msgstr "" -#: pretix/base/settings.py:2106 pretix/control/forms/event.py:1720 +#: pretix/base/settings.py:2160 pretix/control/forms/event.py:1822 msgid "Contact address" msgstr "" -#: pretix/base/settings.py:2107 pretix/control/forms/event.py:1722 +#: pretix/base/settings.py:2161 pretix/control/forms/event.py:1824 msgid "We'll show this publicly to allow attendees to contact you." msgstr "" -#: pretix/base/settings.py:2115 pretix/control/forms/event.py:1714 +#: pretix/base/settings.py:2169 pretix/control/forms/event.py:1816 msgid "Imprint URL" msgstr "" -#: pretix/base/settings.py:2116 pretix/control/forms/event.py:1715 +#: pretix/base/settings.py:2170 pretix/control/forms/event.py:1817 msgid "" "This should point e.g. to a part of your website that has your contact " "details and legal information." msgstr "" -#: pretix/base/settings.py:2126 +#: pretix/base/settings.py:2180 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2127 +#: pretix/base/settings.py:2181 msgid "" "This should point e.g. to a part of your website that explains how you use " "data gathered in your ticket shop." msgstr "" -#: pretix/base/settings.py:2138 +#: pretix/base/settings.py:2192 msgid "Accessibility information URL" msgstr "" -#: pretix/base/settings.py:2139 +#: pretix/base/settings.py:2193 msgid "" "This should point e.g. to a part of your website that explains how your " "ticket shop complies with accessibility regulation." msgstr "" -#: pretix/base/settings.py:2146 +#: pretix/base/settings.py:2200 #: pretix/presale/templates/pretixpresale/event/base.html:228 #: pretix/presale/templates/pretixpresale/event/base.html:233 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -10148,52 +10227,52 @@ msgstr "" msgid "Accessibility information" msgstr "" -#: pretix/base/settings.py:2150 +#: pretix/base/settings.py:2204 msgid "Accessibility information title" msgstr "" -#: pretix/base/settings.py:2160 +#: pretix/base/settings.py:2214 msgid "Accessibility information text" msgstr "" -#: pretix/base/settings.py:2181 +#: pretix/base/settings.py:2235 msgid "Attach ticket files" msgstr "" -#: pretix/base/settings.py:2183 +#: pretix/base/settings.py:2237 #, python-brace-format msgid "" "Tickets will never be attached if they're larger than {size} to avoid email " "delivery problems." msgstr "" -#: pretix/base/settings.py:2194 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2248 pretix/plugins/sendmail/forms.py:201 #: pretix/plugins/sendmail/models.py:270 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:66 msgid "Attach calendar files" msgstr "" -#: pretix/base/settings.py:2195 +#: pretix/base/settings.py:2249 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" -#: pretix/base/settings.py:2204 +#: pretix/base/settings.py:2258 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2205 +#: pretix/base/settings.py:2259 msgid "" "Use this if you e.g. put a private access link into the calendar file to " "make sure people only receive it after their payment was confirmed." msgstr "" -#: pretix/base/settings.py:2214 +#: pretix/base/settings.py:2268 msgid "Event description" msgstr "" -#: pretix/base/settings.py:2217 +#: pretix/base/settings.py:2271 msgid "" "You can use this to share information with your attendees, such as travel " "information or the link to a digital event. If you keep it empty, we will " @@ -10203,52 +10282,52 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2230 +#: pretix/base/settings.py:2284 msgid "Subject prefix" msgstr "" -#: pretix/base/settings.py:2231 +#: pretix/base/settings.py:2285 msgid "" "This will be prepended to the subject of all outgoing emails, formatted as " "[prefix]. Choose, for example, a short form of your event name." msgstr "" -#: pretix/base/settings.py:2245 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2299 pretix/control/forms/mailsetup.py:37 #: pretix/control/forms/mailsetup.py:119 #: pretix/control/templates/pretixcontrol/event/mail.html:39 #: pretix/control/templates/pretixcontrol/organizers/mail.html:40 msgid "Sender address" msgstr "" -#: pretix/base/settings.py:2246 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2300 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "" -#: pretix/base/settings.py:2255 +#: pretix/base/settings.py:2309 msgid "Sender name" msgstr "" -#: pretix/base/settings.py:2256 +#: pretix/base/settings.py:2310 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." msgstr "" -#: pretix/base/settings.py:2274 pretix/base/settings.py:2331 -#: pretix/base/settings.py:2348 pretix/base/settings.py:2366 +#: pretix/base/settings.py:2328 pretix/base/settings.py:2385 +#: pretix/base/settings.py:2402 pretix/base/settings.py:2420 #, python-brace-format msgid "Your order: {code}" msgstr "" -#: pretix/base/settings.py:2278 pretix/base/settings.py:2311 -#: pretix/base/settings.py:2416 pretix/base/settings.py:2649 -#: pretix/base/settings.py:2686 +#: pretix/base/settings.py:2332 pretix/base/settings.py:2365 +#: pretix/base/settings.py:2470 pretix/base/settings.py:2703 +#: pretix/base/settings.py:2740 #, python-brace-format msgid "Your event registration: {code}" msgstr "" -#: pretix/base/settings.py:2282 +#: pretix/base/settings.py:2336 #, python-brace-format msgid "" "Hello,\n" @@ -10263,12 +10342,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2295 +#: pretix/base/settings.py:2349 #, python-brace-format msgid "Your orders for {event}" msgstr "" -#: pretix/base/settings.py:2299 +#: pretix/base/settings.py:2353 #, python-brace-format msgid "" "Hello,\n" @@ -10282,7 +10361,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2315 +#: pretix/base/settings.py:2369 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10296,7 +10375,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2335 +#: pretix/base/settings.py:2389 #, python-brace-format msgid "" "Hello,\n" @@ -10311,7 +10390,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2352 +#: pretix/base/settings.py:2406 #, python-brace-format msgid "" "Hello,\n" @@ -10327,7 +10406,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2370 +#: pretix/base/settings.py:2424 #, python-brace-format msgid "" "Hello,\n" @@ -10345,11 +10424,11 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2388 +#: pretix/base/settings.py:2442 msgid "Attachment for new orders" msgstr "" -#: pretix/base/settings.py:2393 +#: pretix/base/settings.py:2447 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -10361,7 +10440,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2420 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10375,12 +10454,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2432 +#: pretix/base/settings.py:2486 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "" -#: pretix/base/settings.py:2436 +#: pretix/base/settings.py:2490 #, python-brace-format msgid "" "Hello,\n" @@ -10394,12 +10473,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2448 +#: pretix/base/settings.py:2502 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "" -#: pretix/base/settings.py:2452 +#: pretix/base/settings.py:2506 #, python-brace-format msgid "" "Hello,\n" @@ -10415,12 +10494,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2470 +#: pretix/base/settings.py:2524 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2474 +#: pretix/base/settings.py:2528 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10434,23 +10513,23 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2491 pretix/control/forms/event.py:1130 -#: pretix/control/forms/event.py:1244 pretix/plugins/sendmail/models.py:275 +#: pretix/base/settings.py:2545 pretix/control/forms/event.py:1229 +#: pretix/control/forms/event.py:1343 pretix/plugins/sendmail/models.py:275 msgid "Number of days" msgstr "" -#: pretix/base/settings.py:2493 pretix/control/forms/event.py:1133 +#: pretix/base/settings.py:2547 pretix/control/forms/event.py:1232 msgid "" "This email will be sent out this many days before the order expires. If the " "value is 0, the mail will never be sent." msgstr "" -#: pretix/base/settings.py:2501 +#: pretix/base/settings.py:2555 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "" -#: pretix/base/settings.py:2505 +#: pretix/base/settings.py:2559 #, python-brace-format msgid "" "Hello,\n" @@ -10466,12 +10545,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2519 +#: pretix/base/settings.py:2573 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "" -#: pretix/base/settings.py:2523 +#: pretix/base/settings.py:2577 #, python-brace-format msgid "" "Hello,\n" @@ -10486,12 +10565,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2536 +#: pretix/base/settings.py:2590 #, python-brace-format msgid "Incomplete payment received: {code}" msgstr "" -#: pretix/base/settings.py:2540 +#: pretix/base/settings.py:2594 #, python-brace-format msgid "" "Hello,\n" @@ -10509,12 +10588,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2556 +#: pretix/base/settings.py:2610 #, python-brace-format msgid "Payment failed for your order: {code}" msgstr "" -#: pretix/base/settings.py:2560 +#: pretix/base/settings.py:2614 #, python-brace-format msgid "" "Hello,\n" @@ -10532,12 +10611,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2574 +#: pretix/base/settings.py:2628 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "" -#: pretix/base/settings.py:2578 +#: pretix/base/settings.py:2632 #, python-brace-format msgid "" "Hello,\n" @@ -10568,12 +10647,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2607 +#: pretix/base/settings.py:2661 #, python-brace-format msgid "Order canceled: {code}" msgstr "" -#: pretix/base/settings.py:2611 +#: pretix/base/settings.py:2665 #, python-brace-format msgid "" "Hello,\n" @@ -10589,12 +10668,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2625 +#: pretix/base/settings.py:2679 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "" -#: pretix/base/settings.py:2629 +#: pretix/base/settings.py:2683 #, python-brace-format msgid "" "Hello,\n" @@ -10612,7 +10691,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2653 pretix/base/settings.py:2690 +#: pretix/base/settings.py:2707 pretix/base/settings.py:2744 #, python-brace-format msgid "" "Hello,\n" @@ -10626,12 +10705,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2665 +#: pretix/base/settings.py:2719 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2669 +#: pretix/base/settings.py:2723 #, python-brace-format msgid "" "Hello,\n" @@ -10646,12 +10725,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2702 +#: pretix/base/settings.py:2756 #, python-brace-format msgid "Order denied: {code}" msgstr "" -#: pretix/base/settings.py:2706 +#: pretix/base/settings.py:2760 #, python-brace-format msgid "" "Hello,\n" @@ -10668,7 +10747,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2721 +#: pretix/base/settings.py:2775 #, python-brace-format msgid "" "Hello,\n" @@ -10680,12 +10759,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2731 +#: pretix/base/settings.py:2785 #, python-brace-format msgid "Invoice {invoice_number}" msgstr "" -#: pretix/base/settings.py:2735 +#: pretix/base/settings.py:2789 #, python-brace-format msgid "" "Hello,\n" @@ -10698,12 +10777,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2753 pretix/base/settings.py:2769 +#: pretix/base/settings.py:2807 pretix/base/settings.py:2823 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "" -#: pretix/base/settings.py:2757 +#: pretix/base/settings.py:2811 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10717,7 +10796,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2773 +#: pretix/base/settings.py:2827 #, python-brace-format msgid "" "Hello,\n" @@ -10731,12 +10810,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2785 +#: pretix/base/settings.py:2839 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2789 +#: pretix/base/settings.py:2843 #, python-brace-format msgid "" "Hello {name},\n" @@ -10756,12 +10835,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2807 +#: pretix/base/settings.py:2861 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2811 +#: pretix/base/settings.py:2865 #, python-brace-format msgid "" "Hello {name},\n" @@ -10781,12 +10860,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2829 +#: pretix/base/settings.py:2883 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2833 +#: pretix/base/settings.py:2887 #, python-brace-format msgid "" "Hello {name},\n" @@ -10806,57 +10885,57 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2885 pretix/base/settings.py:2892 -#: pretix/base/settings.py:2906 pretix/base/settings.py:2914 -#: pretix/base/settings.py:2928 pretix/base/settings.py:2936 -#: pretix/base/settings.py:2950 pretix/base/settings.py:2957 +#: pretix/base/settings.py:2939 pretix/base/settings.py:2946 +#: pretix/base/settings.py:2960 pretix/base/settings.py:2968 +#: pretix/base/settings.py:2982 pretix/base/settings.py:2990 +#: pretix/base/settings.py:3004 pretix/base/settings.py:3011 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "" -#: pretix/base/settings.py:2889 +#: pretix/base/settings.py:2943 msgid "Primary color" msgstr "" -#: pretix/base/settings.py:2910 +#: pretix/base/settings.py:2964 msgid "Accent color for success" msgstr "" -#: pretix/base/settings.py:2911 +#: pretix/base/settings.py:2965 msgid "We strongly suggest to use a shade of green." msgstr "" -#: pretix/base/settings.py:2932 +#: pretix/base/settings.py:2986 msgid "Accent color for errors" msgstr "" -#: pretix/base/settings.py:2933 +#: pretix/base/settings.py:2987 msgid "We strongly suggest to use a shade of red." msgstr "" -#: pretix/base/settings.py:2954 +#: pretix/base/settings.py:3008 msgid "Page background color" msgstr "" -#: pretix/base/settings.py:2969 +#: pretix/base/settings.py:3023 msgid "Use round edges" msgstr "" -#: pretix/base/settings.py:2978 +#: pretix/base/settings.py:3032 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:2989 +#: pretix/base/settings.py:3043 msgid "Only respected by modern browsers." msgstr "" -#: pretix/base/settings.py:3000 pretix/base/settings.py:3044 +#: pretix/base/settings.py:3054 pretix/base/settings.py:3098 #: pretix/control/forms/organizer.py:523 msgid "Header image" msgstr "" -#: pretix/base/settings.py:3003 +#: pretix/base/settings.py:3057 msgid "" "If you provide a logo image, we will by default not show your event name and " "date in the page header. If you use a white background, we show your logo " @@ -10865,26 +10944,26 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:3024 pretix/base/settings.py:3067 +#: pretix/base/settings.py:3078 pretix/base/settings.py:3121 msgid "Use header image in its full size" msgstr "" -#: pretix/base/settings.py:3025 pretix/base/settings.py:3068 +#: pretix/base/settings.py:3079 pretix/base/settings.py:3122 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "" -#: pretix/base/settings.py:3034 +#: pretix/base/settings.py:3088 msgid "Show event title even if a header image is present" msgstr "" -#: pretix/base/settings.py:3035 +#: pretix/base/settings.py:3089 msgid "" "The title will only be shown on the event front page. If no header image is " "uploaded for the event, but the header image from the organizer profile is " "used, this option will be ignored and the event title will always be shown." msgstr "" -#: pretix/base/settings.py:3047 pretix/control/forms/organizer.py:527 +#: pretix/base/settings.py:3101 pretix/control/forms/organizer.py:527 msgid "" "If you provide a logo image, we will by default not show your organization " "name in the page header. If you use a white background, we show your logo " @@ -10893,25 +10972,25 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:3077 +#: pretix/base/settings.py:3131 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3085 +#: pretix/base/settings.py:3139 msgid "Favicon" msgstr "" -#: pretix/base/settings.py:3088 +#: pretix/base/settings.py:3142 msgid "" "If you provide a favicon, we will show it instead of the default pretix " "icon. We recommend a size of at least 200x200px to accommodate most devices." msgstr "" -#: pretix/base/settings.py:3104 +#: pretix/base/settings.py:3158 msgid "Social media image" msgstr "" -#: pretix/base/settings.py:3107 +#: pretix/base/settings.py:3161 msgid "" "This picture will be used as a preview if you post links to your ticket shop " "on social media. Facebook advises to use a picture size of 1200 x 630 " @@ -10920,93 +10999,93 @@ msgid "" "square is shown. If you do not fill this, we will use the logo given above." msgstr "" -#: pretix/base/settings.py:3125 +#: pretix/base/settings.py:3179 msgid "Logo image" msgstr "" -#: pretix/base/settings.py:3129 +#: pretix/base/settings.py:3183 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "" -#: pretix/base/settings.py:3155 pretix/base/settings.py:3261 +#: pretix/base/settings.py:3209 pretix/base/settings.py:3315 msgid "Info text" msgstr "" -#: pretix/base/settings.py:3158 pretix/base/settings.py:3263 +#: pretix/base/settings.py:3212 pretix/base/settings.py:3317 msgid "" "Not displayed anywhere by default, but if you want to, you can use this e.g. " "in ticket templates." msgstr "" -#: pretix/base/settings.py:3167 +#: pretix/base/settings.py:3221 msgid "Banner text (top)" msgstr "" -#: pretix/base/settings.py:3170 +#: pretix/base/settings.py:3224 msgid "" "This text will be shown above every page of your shop. Please only use this " "for very important messages." msgstr "" -#: pretix/base/settings.py:3180 +#: pretix/base/settings.py:3234 msgid "Banner text (bottom)" msgstr "" -#: pretix/base/settings.py:3183 +#: pretix/base/settings.py:3237 msgid "" "This text will be shown below every page of your shop. Please only use this " "for very important messages." msgstr "" -#: pretix/base/settings.py:3193 +#: pretix/base/settings.py:3247 msgid "Voucher explanation" msgstr "" -#: pretix/base/settings.py:3196 +#: pretix/base/settings.py:3250 msgid "" "This text will be shown next to the input for a voucher code. You can use it " "e.g. to explain how to obtain a voucher code." msgstr "" -#: pretix/base/settings.py:3206 +#: pretix/base/settings.py:3260 msgid "Attendee data explanation" msgstr "" -#: pretix/base/settings.py:3209 +#: pretix/base/settings.py:3263 msgid "" "This text will be shown above the questions asked for every personalized " "product. You can use it e.g. to explain why you need information from them." msgstr "" -#: pretix/base/settings.py:3219 +#: pretix/base/settings.py:3273 msgid "Additional success message" msgstr "" -#: pretix/base/settings.py:3220 +#: pretix/base/settings.py:3274 msgid "" "This message will be shown after an order has been created successfully. It " "will be shown in additional to the default text." msgstr "" -#: pretix/base/settings.py:3232 +#: pretix/base/settings.py:3286 msgid "Help text of the phone number field" msgstr "" -#: pretix/base/settings.py:3239 +#: pretix/base/settings.py:3293 msgid "" "Make sure to enter a valid email address. We will send you an order " "confirmation including a link that you need to access your order later." msgstr "" -#: pretix/base/settings.py:3246 +#: pretix/base/settings.py:3300 msgid "Help text of the email field" msgstr "" -#: pretix/base/settings.py:3272 +#: pretix/base/settings.py:3326 msgid "Allow creating a new team during event creation" msgstr "" -#: pretix/base/settings.py:3273 +#: pretix/base/settings.py:3327 msgid "" "Users that do not have access to all events under this organizer, must " "select one of their teams to have access to the created event. This setting " @@ -11014,68 +11093,68 @@ msgid "" "not have \"Can change teams and permissions\" permission." msgstr "" -#: pretix/base/settings.py:3345 pretix/base/settings.py:3355 +#: pretix/base/settings.py:3399 pretix/base/settings.py:3409 msgid "Event start time (descending)" msgstr "" -#: pretix/base/settings.py:3347 pretix/base/settings.py:3357 +#: pretix/base/settings.py:3401 pretix/base/settings.py:3411 msgid "Name (descending)" msgstr "" -#: pretix/base/settings.py:3352 +#: pretix/base/settings.py:3406 msgctxt "subevent" msgid "Date ordering" msgstr "" -#: pretix/base/settings.py:3368 +#: pretix/base/settings.py:3422 msgid "Link back to organizer overview on all event pages" msgstr "" -#: pretix/base/settings.py:3377 +#: pretix/base/settings.py:3431 msgid "Homepage text" msgstr "" -#: pretix/base/settings.py:3379 +#: pretix/base/settings.py:3433 msgid "This will be displayed on the organizer homepage." msgstr "" -#: pretix/base/settings.py:3394 +#: pretix/base/settings.py:3448 msgid "Length of gift card codes" msgstr "" -#: pretix/base/settings.py:3395 +#: pretix/base/settings.py:3449 #, python-brace-format msgid "" "The system generates by default {}-character long gift card codes. However, " "if a different length is required, it can be set here." msgstr "" -#: pretix/base/settings.py:3411 +#: pretix/base/settings.py:3465 msgid "Validity of gift card codes in years" msgstr "" -#: pretix/base/settings.py:3412 +#: pretix/base/settings.py:3466 msgid "" "If you set a number here, gift cards will by default expire at the end of " "the year after this many years. If you keep it empty, gift cards do not have " "an explicit expiry date." msgstr "" -#: pretix/base/settings.py:3423 +#: pretix/base/settings.py:3477 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3429 +#: pretix/base/settings.py:3483 msgid "" "By clicking \"Accept all cookies\", you agree to the storing of cookies and " "use of similar technologies on your device." msgstr "" -#: pretix/base/settings.py:3436 +#: pretix/base/settings.py:3490 msgid "Dialog text" msgstr "" -#: pretix/base/settings.py:3443 +#: pretix/base/settings.py:3497 msgid "" "We use cookies and similar technologies to gather data that allows us to " "improve this website and our offerings. If you do not agree, we will only " @@ -11083,192 +11162,192 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3451 +#: pretix/base/settings.py:3505 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3457 +#: pretix/base/settings.py:3511 msgid "Privacy settings" msgstr "" -#: pretix/base/settings.py:3462 +#: pretix/base/settings.py:3516 msgid "Dialog title" msgstr "" -#: pretix/base/settings.py:3468 +#: pretix/base/settings.py:3522 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3473 +#: pretix/base/settings.py:3527 msgid "\"Accept\" button description" msgstr "" -#: pretix/base/settings.py:3479 +#: pretix/base/settings.py:3533 msgid "Required cookies only" msgstr "" -#: pretix/base/settings.py:3484 +#: pretix/base/settings.py:3538 msgid "\"Reject\" button description" msgstr "" -#: pretix/base/settings.py:3494 +#: pretix/base/settings.py:3548 msgid "Customers can choose their own seats" msgstr "" -#: pretix/base/settings.py:3495 +#: pretix/base/settings.py:3549 msgid "" "If disabled, you will need to manually assign seats in the backend. Note " "that this can mean people will not know their seat after their purchase and " "it might not be written on their ticket." msgstr "" -#: pretix/base/settings.py:3521 +#: pretix/base/settings.py:3575 msgid "Show button to copy user input from other products" msgstr "" -#: pretix/base/settings.py:3531 +#: pretix/base/settings.py:3585 msgid "Most common English titles" msgstr "" -#: pretix/base/settings.py:3541 +#: pretix/base/settings.py:3595 msgid "Most common German titles" msgstr "" -#: pretix/base/settings.py:3554 +#: pretix/base/settings.py:3608 msgctxt "person_name_salutation" msgid "Ms" msgstr "" -#: pretix/base/settings.py:3555 +#: pretix/base/settings.py:3609 msgctxt "person_name_salutation" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3556 +#: pretix/base/settings.py:3610 msgctxt "person_name_salutation" msgid "Mx" msgstr "" -#: pretix/base/settings.py:3593 pretix/base/settings.py:3609 -#: pretix/base/settings.py:3625 pretix/base/settings.py:3640 -#: pretix/base/settings.py:3658 pretix/base/settings.py:3673 -#: pretix/base/settings.py:3703 pretix/base/settings.py:3727 -#: pretix/base/settings.py:3759 pretix/base/settings.py:3781 -#: pretix/base/settings.py:3812 +#: pretix/base/settings.py:3647 pretix/base/settings.py:3663 +#: pretix/base/settings.py:3679 pretix/base/settings.py:3694 +#: pretix/base/settings.py:3712 pretix/base/settings.py:3727 +#: pretix/base/settings.py:3757 pretix/base/settings.py:3781 +#: pretix/base/settings.py:3813 pretix/base/settings.py:3835 +#: pretix/base/settings.py:3866 msgctxt "person_name_sample" msgid "John" msgstr "" -#: pretix/base/settings.py:3594 pretix/base/settings.py:3610 -#: pretix/base/settings.py:3626 pretix/base/settings.py:3642 -#: pretix/base/settings.py:3660 pretix/base/settings.py:3674 -#: pretix/base/settings.py:3704 pretix/base/settings.py:3760 -#: pretix/base/settings.py:3782 pretix/base/settings.py:3813 +#: pretix/base/settings.py:3648 pretix/base/settings.py:3664 +#: pretix/base/settings.py:3680 pretix/base/settings.py:3696 +#: pretix/base/settings.py:3714 pretix/base/settings.py:3728 +#: pretix/base/settings.py:3758 pretix/base/settings.py:3814 +#: pretix/base/settings.py:3836 pretix/base/settings.py:3867 msgctxt "person_name_sample" msgid "Doe" msgstr "" -#: pretix/base/settings.py:3600 pretix/base/settings.py:3616 -#: pretix/base/settings.py:3648 pretix/base/settings.py:3767 -#: pretix/base/settings.py:3789 +#: pretix/base/settings.py:3654 pretix/base/settings.py:3670 +#: pretix/base/settings.py:3702 pretix/base/settings.py:3821 +#: pretix/base/settings.py:3843 msgctxt "person_name" msgid "Title" msgstr "" -#: pretix/base/settings.py:3608 pretix/base/settings.py:3624 -#: pretix/base/settings.py:3657 pretix/base/settings.py:3780 -#: pretix/base/settings.py:3811 +#: pretix/base/settings.py:3662 pretix/base/settings.py:3678 +#: pretix/base/settings.py:3711 pretix/base/settings.py:3834 +#: pretix/base/settings.py:3865 msgctxt "person_name_sample" msgid "Dr" msgstr "" -#: pretix/base/settings.py:3632 pretix/base/settings.py:3649 +#: pretix/base/settings.py:3686 pretix/base/settings.py:3703 msgid "First name" msgstr "" -#: pretix/base/settings.py:3633 pretix/base/settings.py:3650 +#: pretix/base/settings.py:3687 pretix/base/settings.py:3704 msgid "Middle name" msgstr "" -#: pretix/base/settings.py:3714 pretix/base/settings.py:3726 +#: pretix/base/settings.py:3768 pretix/base/settings.py:3780 #: pretix/control/forms/organizer.py:658 msgctxt "person_name_sample" msgid "John Doe" msgstr "" -#: pretix/base/settings.py:3720 +#: pretix/base/settings.py:3774 msgid "Calling name" msgstr "" -#: pretix/base/settings.py:3734 +#: pretix/base/settings.py:3788 msgid "Latin transcription" msgstr "" -#: pretix/base/settings.py:3746 pretix/base/settings.py:3766 -#: pretix/base/settings.py:3788 +#: pretix/base/settings.py:3800 pretix/base/settings.py:3820 +#: pretix/base/settings.py:3842 msgctxt "person_name" msgid "Salutation" msgstr "" -#: pretix/base/settings.py:3758 pretix/base/settings.py:3779 -#: pretix/base/settings.py:3810 +#: pretix/base/settings.py:3812 pretix/base/settings.py:3833 +#: pretix/base/settings.py:3864 msgctxt "person_name_sample" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3792 +#: pretix/base/settings.py:3846 msgctxt "person_name" msgid "Degree (after name)" msgstr "" -#: pretix/base/settings.py:3814 +#: pretix/base/settings.py:3868 msgctxt "person_name_sample" msgid "MA" msgstr "" -#: pretix/base/settings.py:3840 pretix/base/settings.py:3842 +#: pretix/base/settings.py:3894 pretix/base/settings.py:3896 msgctxt "address" msgid "Province" msgstr "" -#: pretix/base/settings.py:3841 +#: pretix/base/settings.py:3895 msgctxt "address" msgid "Prefecture" msgstr "" -#: pretix/base/settings.py:3930 pretix/control/forms/event.py:228 +#: pretix/base/settings.py:3984 pretix/control/forms/event.py:228 msgid "" "Your default locale must also be enabled for your event (see box above)." msgstr "" -#: pretix/base/settings.py:3934 +#: pretix/base/settings.py:3988 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "" -#: pretix/base/settings.py:3938 +#: pretix/base/settings.py:3992 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" -#: pretix/base/settings.py:3942 +#: pretix/base/settings.py:3996 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "" -#: pretix/base/settings.py:3946 +#: pretix/base/settings.py:4000 msgid "You have to require invoice addresses to require for company names." msgstr "" -#: pretix/base/settings.py:3953 +#: pretix/base/settings.py:4021 msgid "The last payment date cannot be before the end of presale." msgstr "" -#: pretix/base/settings.py:3961 +#: pretix/base/settings.py:4029 #, python-brace-format msgid "The value \"{identifier}\" is not a valid sales channel." msgstr "" -#: pretix/base/settings.py:3976 +#: pretix/base/settings.py:4044 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -12112,7 +12191,7 @@ msgid "" "You already used this slug for a different event. Please choose a new one." msgstr "" -#: pretix/control/forms/event.py:135 pretix/control/forms/event.py:519 +#: pretix/control/forms/event.py:135 pretix/control/forms/event.py:526 msgid "Event timezone" msgstr "" @@ -12150,7 +12229,7 @@ msgstr "" msgid "Create a new team for this event with me as the only member" msgstr "" -#: pretix/control/forms/event.py:207 pretix/control/forms/event.py:378 +#: pretix/control/forms/event.py:207 pretix/control/forms/event.py:385 msgid "" "Sample Conference Center\n" "Heidelberg, Germany" @@ -12172,213 +12251,262 @@ msgid "Copy configuration from" msgstr "" #: pretix/control/forms/event.py:317 pretix/control/forms/event.py:320 -#: pretix/control/forms/item.py:413 +#: pretix/control/forms/item.py:414 msgid "Do not copy" msgstr "" -#: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1301 +#: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1304 #: pretix/control/forms/subevents.py:411 #, python-brace-format msgid "Default ({value})" msgstr "" -#: pretix/control/forms/event.py:384 pretix/control/forms/event.py:397 +#: pretix/control/forms/event.py:380 +msgid "The currency cannot be changed because orders already exist." +msgstr "" + +#: pretix/control/forms/event.py:391 pretix/control/forms/event.py:404 msgid "Domain" msgstr "" -#: pretix/control/forms/event.py:388 +#: pretix/control/forms/event.py:395 msgid "You can configure this in your organizer settings." msgstr "" -#: pretix/control/forms/event.py:398 +#: pretix/control/forms/event.py:405 msgid "You can add more domains in your organizer account." msgstr "" -#: pretix/control/forms/event.py:399 +#: pretix/control/forms/event.py:406 msgid "Same as organizer account" msgstr "" -#: pretix/control/forms/event.py:504 +#: pretix/control/forms/event.py:511 #, python-brace-format msgid "" "A validation error has occurred on a setting that is not part of this form: " "{error}" msgstr "" -#: pretix/control/forms/event.py:522 pretix/control/forms/organizer.py:461 +#: pretix/control/forms/event.py:529 pretix/control/forms/organizer.py:461 msgid "Name format" msgstr "" -#: pretix/control/forms/event.py:523 pretix/control/forms/organizer.py:462 +#: pretix/control/forms/event.py:530 pretix/control/forms/organizer.py:462 msgid "" "This defines how pretix will ask for human names. Changing this after you " "already received orders might lead to unexpected behavior when sorting or " "changing names." msgstr "" -#: pretix/control/forms/event.py:528 pretix/control/forms/organizer.py:467 +#: pretix/control/forms/event.py:535 pretix/control/forms/organizer.py:467 msgid "Allowed titles" msgstr "" -#: pretix/control/forms/event.py:529 pretix/control/forms/organizer.py:468 +#: pretix/control/forms/event.py:536 pretix/control/forms/organizer.py:468 msgid "" "If the naming scheme you defined above allows users to input a title, you " "can use this to restrict the set of selectable titles." msgstr "" -#: pretix/control/forms/event.py:648 pretix/control/forms/organizer.py:542 +#: pretix/control/forms/event.py:654 pretix/control/forms/organizer.py:542 #, python-brace-format msgid "Ask for {fields}, display like {example}" msgstr "" -#: pretix/control/forms/event.py:654 pretix/control/forms/organizer.py:548 +#: pretix/control/forms/event.py:660 pretix/control/forms/organizer.py:548 msgid "Free text input" msgstr "" -#: pretix/control/forms/event.py:690 +#: pretix/control/forms/event.py:696 msgid "Do not ask" msgstr "" -#: pretix/control/forms/event.py:691 +#: pretix/control/forms/event.py:697 msgid "Ask, but do not require input" msgstr "" -#: pretix/control/forms/event.py:692 +#: pretix/control/forms/event.py:698 #: pretix/control/templates/pretixcontrol/event/settings.html:76 msgid "Ask and require input" msgstr "" -#: pretix/control/forms/event.py:770 +#: pretix/control/forms/event.py:776 #, python-brace-format msgid "" "You have configured gift cards to be valid {} years plus the year the gift " "card is issued in." msgstr "" -#: pretix/control/forms/event.py:888 +#: pretix/control/forms/event.py:813 +msgid "Prices including tax" +msgstr "" + +#: pretix/control/forms/event.py:814 +msgid "Recommended if you sell tickets at least partly to consumers." +msgstr "" + +#: pretix/control/forms/event.py:818 +msgid "Prices excluding tax" +msgstr "" + +#: pretix/control/forms/event.py:819 +msgid "Recommended only if you sell tickets primarily to business customers." +msgstr "" + +#: pretix/control/forms/event.py:855 +msgid "Prices shown to customer" +msgstr "" + +#: pretix/control/forms/event.py:859 +msgid "" +"Recommended when e-invoicing is not required. Each product will be sold with " +"the advertised net and gross price. However, in orders of more than one " +"product, the total tax amount can differ from when it would be computed from " +"the order total." +msgstr "" + +#: pretix/control/forms/event.py:864 +msgid "" +"Recommended for e-invoicing when you primarily sell to business customers " +"and show prices to customers excluding tax. The gross price of some products " +"may be changed to ensure correct rounding, while the net prices will be kept " +"as configured. This may cause the actual payment amount to differ." +msgstr "" + +#: pretix/control/forms/event.py:870 +msgid "" +"Recommended for e-invoicing when you primarily sell to consumers. The gross " +"or net price of some products may be changed automatically to ensure correct " +"rounding of the order total. The system attempts to keep gross prices as " +"configured whenever possible. Gross prices may still change if they are " +"impossible to derive from a rounded net price." +msgstr "" + +#: pretix/control/forms/event.py:969 msgid "Generate invoices for Sales channels" msgstr "" -#: pretix/control/forms/event.py:891 +#: pretix/control/forms/event.py:972 msgid "" "If you have enabled invoice generation in the previous setting, you can " "limit it here to specific sales channels." msgstr "" -#: pretix/control/forms/event.py:895 +#: pretix/control/forms/event.py:976 msgid "Invoice style" msgstr "" -#: pretix/control/forms/event.py:901 +#: pretix/control/forms/event.py:982 msgid "Invoice language" msgstr "" -#: pretix/control/forms/event.py:902 pretix/control/forms/event.py:917 +#: pretix/control/forms/event.py:983 pretix/control/forms/event.py:998 msgid "The user's language" msgstr "" -#: pretix/control/forms/event.py:925 +#: pretix/control/forms/event.py:1004 #, python-brace-format msgid "" "An invoice will be issued before payment if the customer selects one of the " "following payment methods: {list}" msgstr "" -#: pretix/control/forms/event.py:929 +#: pretix/control/forms/event.py:1008 msgid "" "None of the currently configured payment methods will cause an invoice to be " "issued before payment." msgstr "" -#: pretix/control/forms/event.py:938 +#: pretix/control/forms/event.py:1017 msgid "Recommended" msgstr "" -#: pretix/control/forms/event.py:950 +#: pretix/control/forms/event.py:1049 msgid "The online shop must be selected to receive these emails." msgstr "" -#: pretix/control/forms/event.py:966 +#: pretix/control/forms/event.py:1065 msgid "Sales channels for checkout emails" msgstr "" -#: pretix/control/forms/event.py:967 +#: pretix/control/forms/event.py:1066 msgid "" "The order placed and paid emails will only be send to orders from these " "sales channels. The online shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:978 +#: pretix/control/forms/event.py:1077 msgid "" "This email will only be send to orders from these sales channels. The online " "shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:986 pretix/control/forms/organizer.py:583 +#: pretix/control/forms/event.py:1085 pretix/control/forms/organizer.py:583 msgid "Bcc address" msgstr "" -#: pretix/control/forms/event.py:988 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:1087 pretix/control/forms/organizer.py:585 msgid "All emails will be sent to this address as a Bcc copy." msgstr "" -#: pretix/control/forms/event.py:996 pretix/control/forms/organizer.py:593 +#: pretix/control/forms/event.py:1095 pretix/control/forms/organizer.py:593 msgid "Signature" msgstr "" -#: pretix/control/forms/event.py:999 +#: pretix/control/forms/event.py:1098 #, python-brace-format msgid "This will be attached to every email. Available placeholders: {event}" msgstr "" -#: pretix/control/forms/event.py:1004 pretix/control/forms/organizer.py:601 +#: pretix/control/forms/event.py:1103 pretix/control/forms/organizer.py:601 msgid "e.g. your contact details" msgstr "" -#: pretix/control/forms/event.py:1009 +#: pretix/control/forms/event.py:1108 msgid "HTML mail renderer" msgstr "" -#: pretix/control/forms/event.py:1014 pretix/control/forms/event.py:1041 -#: pretix/control/forms/event.py:1068 pretix/control/forms/event.py:1218 +#: pretix/control/forms/event.py:1113 pretix/control/forms/event.py:1140 +#: pretix/control/forms/event.py:1167 pretix/control/forms/event.py:1317 msgid "Subject sent to order contact address" msgstr "" -#: pretix/control/forms/event.py:1019 pretix/control/forms/event.py:1046 -#: pretix/control/forms/event.py:1073 pretix/control/forms/event.py:1223 +#: pretix/control/forms/event.py:1118 pretix/control/forms/event.py:1145 +#: pretix/control/forms/event.py:1172 pretix/control/forms/event.py:1322 msgid "Text sent to order contact address" msgstr "" -#: pretix/control/forms/event.py:1024 pretix/control/forms/event.py:1051 -#: pretix/control/forms/event.py:1078 pretix/control/forms/event.py:1228 -#: pretix/control/forms/event.py:1273 pretix/control/forms/event.py:1303 +#: pretix/control/forms/event.py:1123 pretix/control/forms/event.py:1150 +#: pretix/control/forms/event.py:1177 pretix/control/forms/event.py:1327 +#: pretix/control/forms/event.py:1372 pretix/control/forms/event.py:1402 msgid "Send an email to attendees" msgstr "" -#: pretix/control/forms/event.py:1025 pretix/control/forms/event.py:1052 -#: pretix/control/forms/event.py:1079 pretix/control/forms/event.py:1229 -#: pretix/control/forms/event.py:1274 pretix/control/forms/event.py:1304 +#: pretix/control/forms/event.py:1124 pretix/control/forms/event.py:1151 +#: pretix/control/forms/event.py:1178 pretix/control/forms/event.py:1328 +#: pretix/control/forms/event.py:1373 pretix/control/forms/event.py:1403 msgid "" "If the order contains attendees with email addresses different from the " "person who orders the tickets, the following email will be sent out to the " "attendees." msgstr "" -#: pretix/control/forms/event.py:1030 pretix/control/forms/event.py:1057 -#: pretix/control/forms/event.py:1084 pretix/control/forms/event.py:1234 -#: pretix/control/forms/event.py:1279 pretix/control/forms/event.py:1309 +#: pretix/control/forms/event.py:1129 pretix/control/forms/event.py:1156 +#: pretix/control/forms/event.py:1183 pretix/control/forms/event.py:1333 +#: pretix/control/forms/event.py:1378 pretix/control/forms/event.py:1408 msgid "Subject sent to attendees" msgstr "" -#: pretix/control/forms/event.py:1035 pretix/control/forms/event.py:1062 -#: pretix/control/forms/event.py:1089 pretix/control/forms/event.py:1239 -#: pretix/control/forms/event.py:1284 pretix/control/forms/event.py:1314 +#: pretix/control/forms/event.py:1134 pretix/control/forms/event.py:1161 +#: pretix/control/forms/event.py:1188 pretix/control/forms/event.py:1338 +#: pretix/control/forms/event.py:1383 pretix/control/forms/event.py:1413 msgid "Text sent to attendees" msgstr "" -#: pretix/control/forms/event.py:1100 pretix/control/forms/event.py:1174 -#: pretix/control/forms/event.py:1184 pretix/control/forms/event.py:1194 -#: pretix/control/forms/event.py:1199 pretix/control/forms/event.py:1211 +#: pretix/control/forms/event.py:1199 pretix/control/forms/event.py:1273 +#: pretix/control/forms/event.py:1283 pretix/control/forms/event.py:1293 +#: pretix/control/forms/event.py:1298 pretix/control/forms/event.py:1310 #: pretix/control/forms/organizer.py:612 pretix/control/forms/organizer.py:622 #: pretix/control/forms/organizer.py:632 #: pretix/control/templates/pretixcontrol/event/mail.html:88 @@ -12386,187 +12514,187 @@ msgstr "" msgid "Text" msgstr "" -#: pretix/control/forms/event.py:1105 +#: pretix/control/forms/event.py:1204 msgid "Subject (sent by admin)" msgstr "" -#: pretix/control/forms/event.py:1110 +#: pretix/control/forms/event.py:1209 msgid "Subject (sent by admin to attendee)" msgstr "" -#: pretix/control/forms/event.py:1115 +#: pretix/control/forms/event.py:1214 msgid "Text (sent by admin)" msgstr "" -#: pretix/control/forms/event.py:1120 +#: pretix/control/forms/event.py:1219 msgid "Subject (requested by user)" msgstr "" -#: pretix/control/forms/event.py:1125 +#: pretix/control/forms/event.py:1224 msgid "Text (requested by user)" msgstr "" -#: pretix/control/forms/event.py:1137 +#: pretix/control/forms/event.py:1236 msgid "Text (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1142 +#: pretix/control/forms/event.py:1241 msgid "Subject (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1147 +#: pretix/control/forms/event.py:1246 msgid "Text (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1152 +#: pretix/control/forms/event.py:1251 msgid "Subject (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1157 +#: pretix/control/forms/event.py:1256 msgid "Subject (if an incomplete payment was received)" msgstr "" -#: pretix/control/forms/event.py:1162 +#: pretix/control/forms/event.py:1261 msgid "Text (if an incomplete payment was received)" msgstr "" -#: pretix/control/forms/event.py:1165 +#: pretix/control/forms/event.py:1264 msgid "" "This email only applies to payment methods that can receive incomplete " "payments, such as bank transfer." msgstr "" -#: pretix/control/forms/event.py:1207 pretix/control/forms/event.py:1214 +#: pretix/control/forms/event.py:1306 pretix/control/forms/event.py:1313 msgid "" "This will only be used if the invoice is sent to a different email address " "or at a different time than the order confirmation." msgstr "" -#: pretix/control/forms/event.py:1247 +#: pretix/control/forms/event.py:1346 msgid "" "This email will be sent out this many days before the order event starts. If " "the field is empty, the mail will never be sent." msgstr "" -#: pretix/control/forms/event.py:1251 +#: pretix/control/forms/event.py:1350 msgid "Subject for received order" msgstr "" -#: pretix/control/forms/event.py:1256 +#: pretix/control/forms/event.py:1355 msgid "Text for received order" msgstr "" -#: pretix/control/forms/event.py:1261 +#: pretix/control/forms/event.py:1360 msgid "Subject for approved order" msgstr "" -#: pretix/control/forms/event.py:1266 +#: pretix/control/forms/event.py:1365 msgid "Text for approved order" msgstr "" -#: pretix/control/forms/event.py:1269 pretix/control/forms/event.py:1287 +#: pretix/control/forms/event.py:1368 pretix/control/forms/event.py:1386 msgid "" "This will only be sent out for non-free orders. Free orders will receive the " "free order template from below instead." msgstr "" -#: pretix/control/forms/event.py:1291 +#: pretix/control/forms/event.py:1390 msgid "Subject for approved free order" msgstr "" -#: pretix/control/forms/event.py:1296 +#: pretix/control/forms/event.py:1395 msgid "Text for approved free order" msgstr "" -#: pretix/control/forms/event.py:1299 pretix/control/forms/event.py:1317 +#: pretix/control/forms/event.py:1398 pretix/control/forms/event.py:1416 msgid "" "This will only be sent out for free orders. Non-free orders will receive the " "non-free order template from above instead." msgstr "" -#: pretix/control/forms/event.py:1321 +#: pretix/control/forms/event.py:1420 msgid "Subject for denied order" msgstr "" -#: pretix/control/forms/event.py:1326 +#: pretix/control/forms/event.py:1425 msgid "Text for denied order" msgstr "" -#: pretix/control/forms/event.py:1421 +#: pretix/control/forms/event.py:1520 msgid "Ticket code generator" msgstr "" -#: pretix/control/forms/event.py:1422 +#: pretix/control/forms/event.py:1521 msgid "For advanced users, usually does not need to be changed." msgstr "" -#: pretix/control/forms/event.py:1479 +#: pretix/control/forms/event.py:1578 msgid "Any country" msgstr "" -#: pretix/control/forms/event.py:1480 +#: pretix/control/forms/event.py:1579 msgid "European Union" msgstr "" -#: pretix/control/forms/event.py:1506 +#: pretix/control/forms/event.py:1605 msgid "Any customer" msgstr "" -#: pretix/control/forms/event.py:1507 +#: pretix/control/forms/event.py:1606 msgid "Individual" msgstr "" -#: pretix/control/forms/event.py:1508 +#: pretix/control/forms/event.py:1607 msgid "Business" msgstr "" -#: pretix/control/forms/event.py:1509 +#: pretix/control/forms/event.py:1608 msgid "Business with valid VAT ID" msgstr "" -#: pretix/control/forms/event.py:1515 +#: pretix/control/forms/event.py:1614 msgid "Charge VAT" msgstr "" -#: pretix/control/forms/event.py:1517 +#: pretix/control/forms/event.py:1616 msgid "No VAT" msgstr "" -#: pretix/control/forms/event.py:1518 +#: pretix/control/forms/event.py:1617 msgid "Sale not allowed" msgstr "" -#: pretix/control/forms/event.py:1519 +#: pretix/control/forms/event.py:1618 msgid "Order requires approval" msgstr "" -#: pretix/control/forms/event.py:1524 +#: pretix/control/forms/event.py:1623 msgid "Default tax code" msgstr "" -#: pretix/control/forms/event.py:1528 +#: pretix/control/forms/event.py:1627 pretix/control/forms/event.py:1631 msgid "Deviating tax rate" msgstr "" -#: pretix/control/forms/event.py:1533 pretix/control/forms/event.py:1537 +#: pretix/control/forms/event.py:1635 pretix/control/forms/event.py:1639 msgid "Text on invoice" msgstr "" -#: pretix/control/forms/event.py:1557 +#: pretix/control/forms/event.py:1659 msgid "" "A combination of this calculation mode with a non-zero tax rate does not " "make sense." msgstr "" -#: pretix/control/forms/event.py:1562 pretix/control/forms/event.py:1566 +#: pretix/control/forms/event.py:1664 pretix/control/forms/event.py:1668 msgid "This combination of calculation mode and tax code does not make sense." msgstr "" -#: pretix/control/forms/event.py:1631 +#: pretix/control/forms/event.py:1733 msgid "Pre-selected voucher" msgstr "" -#: pretix/control/forms/event.py:1633 +#: pretix/control/forms/event.py:1735 msgid "" "If set, the widget will show products as if this voucher has been entered " "and when a product is bought via the widget, this voucher will be used. This " @@ -12574,48 +12702,48 @@ msgid "" "secret products." msgstr "" -#: pretix/control/forms/event.py:1638 +#: pretix/control/forms/event.py:1740 msgid "Compatibility mode" msgstr "" -#: pretix/control/forms/event.py:1640 +#: pretix/control/forms/event.py:1742 msgid "" "Our regular widget doesn't work in all website builders. If you run into " "trouble, try using this compatibility mode." msgstr "" -#: pretix/control/forms/event.py:1661 +#: pretix/control/forms/event.py:1763 msgid "The given voucher code does not exist." msgstr "" -#: pretix/control/forms/event.py:1668 pretix/control/forms/organizer.py:112 +#: pretix/control/forms/event.py:1770 pretix/control/forms/organizer.py:112 #: pretix/control/views/shredder.py:179 msgid "The slug you entered was not correct." msgstr "" -#: pretix/control/forms/event.py:1703 +#: pretix/control/forms/event.py:1805 msgid "Ticket downloads" msgstr "" -#: pretix/control/forms/event.py:1704 +#: pretix/control/forms/event.py:1806 msgid "Your customers will be able to download their tickets in PDF format." msgstr "" -#: pretix/control/forms/event.py:1708 +#: pretix/control/forms/event.py:1810 msgid "Require all attendees to fill in their names" msgstr "" -#: pretix/control/forms/event.py:1709 +#: pretix/control/forms/event.py:1811 msgid "" "By default, we will ask for names but not require them. You can turn this " "off completely in the settings." msgstr "" -#: pretix/control/forms/event.py:1735 +#: pretix/control/forms/event.py:1837 msgid "Payment via Stripe" msgstr "" -#: pretix/control/forms/event.py:1736 +#: pretix/control/forms/event.py:1838 msgid "" "Stripe is an online payments processor supporting credit cards and lots of " "other payment options. To accept payments via Stripe, you will need to set " @@ -12623,27 +12751,27 @@ msgid "" "simple interface." msgstr "" -#: pretix/control/forms/event.py:1742 +#: pretix/control/forms/event.py:1844 msgid "Payment by bank transfer" msgstr "" -#: pretix/control/forms/event.py:1743 +#: pretix/control/forms/event.py:1845 msgid "" "Your customers will be instructed to wire the money to your account. You can " "then import your bank statements to process the payments within pretix, or " "mark them as paid manually." msgstr "" -#: pretix/control/forms/event.py:1782 +#: pretix/control/forms/event.py:1888 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:45 msgid "Price (optional)" msgstr "" -#: pretix/control/forms/event.py:1787 +#: pretix/control/forms/event.py:1893 msgid "Free" msgstr "" -#: pretix/control/forms/event.py:1792 +#: pretix/control/forms/event.py:1898 msgid "Quantity available" msgstr "" @@ -13371,171 +13499,171 @@ msgid "" "plugins. This will be publicly available. Make sure to keep it up to date!" msgstr "" -#: pretix/control/forms/item.py:98 +#: pretix/control/forms/item.py:99 msgid "" "Products in this category are regular products displayed on the front page." msgstr "" -#: pretix/control/forms/item.py:101 +#: pretix/control/forms/item.py:102 msgid "Add-on product category" msgstr "" -#: pretix/control/forms/item.py:102 +#: pretix/control/forms/item.py:103 msgid "" "Products in this category are add-on products and can only be bought as add-" "ons." msgstr "" -#: pretix/control/forms/item.py:106 +#: pretix/control/forms/item.py:107 msgid "" "Products in this category are regular products, but are only shown in the " "cross-selling step, according to the configuration below." msgstr "" -#: pretix/control/forms/item.py:111 +#: pretix/control/forms/item.py:112 msgid "" "Products in this category are regular products displayed on the front page, " "but are additionally shown in the cross-selling step, according to the " "configuration below." msgstr "" -#: pretix/control/forms/item.py:140 pretix/control/forms/item.py:216 +#: pretix/control/forms/item.py:141 pretix/control/forms/item.py:217 msgid "This field is required" msgstr "" -#: pretix/control/forms/item.py:218 +#: pretix/control/forms/item.py:219 msgid "Dependencies between questions are not supported during check-in." msgstr "" -#: pretix/control/forms/item.py:313 +#: pretix/control/forms/item.py:314 msgid "No products" msgstr "" -#: pretix/control/forms/item.py:353 +#: pretix/control/forms/item.py:354 #: pretix/control/templates/pretixcontrol/items/fragment_quota_availability.html:11 msgid "Unlimited" msgstr "" -#: pretix/control/forms/item.py:381 +#: pretix/control/forms/item.py:382 msgid "The product should exist in multiple variations" msgstr "" -#: pretix/control/forms/item.py:382 +#: pretix/control/forms/item.py:383 msgid "" "Select this option e.g. for t-shirts that come in multiple sizes. You can " "select the variations in the next step." msgstr "" -#: pretix/control/forms/item.py:402 pretix/control/forms/item.py:728 +#: pretix/control/forms/item.py:403 pretix/control/forms/item.py:731 msgid "No category" msgstr "" -#: pretix/control/forms/item.py:410 +#: pretix/control/forms/item.py:411 msgid "Copy product information" msgstr "" -#: pretix/control/forms/item.py:419 +#: pretix/control/forms/item.py:420 msgid "No taxation" msgstr "" -#: pretix/control/forms/item.py:423 +#: pretix/control/forms/item.py:424 msgid "Do not add to a quota now" msgstr "" -#: pretix/control/forms/item.py:424 +#: pretix/control/forms/item.py:425 msgid "Add product to an existing quota" msgstr "" -#: pretix/control/forms/item.py:425 +#: pretix/control/forms/item.py:426 msgid "Create a new quota for this product" msgstr "" -#: pretix/control/forms/item.py:431 +#: pretix/control/forms/item.py:432 msgid "Quota options" msgstr "" -#: pretix/control/forms/item.py:439 +#: pretix/control/forms/item.py:440 msgid "Add to existing quota" msgstr "" -#: pretix/control/forms/item.py:448 +#: pretix/control/forms/item.py:449 msgid "New quota name" msgstr "" -#: pretix/control/forms/item.py:454 +#: pretix/control/forms/item.py:455 msgid "Size" msgstr "" -#: pretix/control/forms/item.py:455 +#: pretix/control/forms/item.py:456 msgid "Number of tickets" msgstr "" -#: pretix/control/forms/item.py:587 +#: pretix/control/forms/item.py:590 msgid "Quota name is required." msgstr "" -#: pretix/control/forms/item.py:592 +#: pretix/control/forms/item.py:595 msgid "Please select a quota." msgstr "" -#: pretix/control/forms/item.py:614 pretix/plugins/badges/forms.py:85 +#: pretix/control/forms/item.py:617 pretix/plugins/badges/forms.py:85 #: pretix/plugins/ticketoutputpdf/forms.py:55 msgid "(Event default)" msgstr "" -#: pretix/control/forms/item.py:624 +#: pretix/control/forms/item.py:627 msgid "Choose automatically depending on event settings" msgstr "" -#: pretix/control/forms/item.py:625 +#: pretix/control/forms/item.py:628 msgid "Yes, if ticket generation is enabled in general" msgstr "" -#: pretix/control/forms/item.py:643 +#: pretix/control/forms/item.py:646 msgid "" "e.g. This reduced price is available for full-time students, jobless and " "people over 65. This ticket includes access to all parts of the event, " "except the VIP area." msgstr "" -#: pretix/control/forms/item.py:687 +#: pretix/control/forms/item.py:690 msgid "" "This option is deprecated. For new products, use the newer option below that " "refers to another product instead of a quota." msgstr "" -#: pretix/control/forms/item.py:698 pretix/control/forms/item.py:714 +#: pretix/control/forms/item.py:701 pretix/control/forms/item.py:717 msgid "Shown independently of other products" msgstr "" -#: pretix/control/forms/item.py:739 +#: pretix/control/forms/item.py:742 msgid "Date chosen by customer" msgstr "" -#: pretix/control/forms/item.py:748 +#: pretix/control/forms/item.py:751 msgid "No membership granted" msgstr "" -#: pretix/control/forms/item.py:767 +#: pretix/control/forms/item.py:770 msgid "" "Gift card products should use a tax rule with a rate of 0 percent since " "sales tax will be applied when the gift card is redeemed." msgstr "" -#: pretix/control/forms/item.py:773 +#: pretix/control/forms/item.py:776 msgid "" "Do not set a specific validity for gift card products as it will not " "restrict the validity of the gift card. A validity of gift cards can be set " "in your organizer settings." msgstr "" -#: pretix/control/forms/item.py:792 pretix/control/forms/item.py:1059 +#: pretix/control/forms/item.py:795 pretix/control/forms/item.py:1062 msgid "" "If a valid membership is required, at least one valid membership type needs " "to be selected." msgstr "" -#: pretix/control/forms/item.py:803 +#: pretix/control/forms/item.py:806 msgid "" "Your product grants a non-transferable membership and should therefore be a " "personalized admission ticket. Otherwise customers might not be able to use " @@ -13543,17 +13671,17 @@ msgid "" "the membership type to be transferable." msgstr "" -#: pretix/control/forms/item.py:812 +#: pretix/control/forms/item.py:815 msgid "The start of validity must be before the end of validity." msgstr "" -#: pretix/control/forms/item.py:819 +#: pretix/control/forms/item.py:822 msgid "" "You have selected dynamic validity but have not entered a time period. This " "would render the tickets unusable." msgstr "" -#: pretix/control/forms/item.py:924 +#: pretix/control/forms/item.py:927 #, python-format msgid "" "The variation \"%s\" cannot be deleted because it has already been ordered " @@ -13561,43 +13689,47 @@ msgid "" "\"inactive\" instead." msgstr "" -#: pretix/control/forms/item.py:1001 +#: pretix/control/forms/item.py:1004 msgid "Use value from product" msgstr "" -#: pretix/control/forms/item.py:1086 +#: pretix/control/forms/item.py:1089 msgid "Add-ons" msgstr "" -#: pretix/control/forms/item.py:1110 +#: pretix/control/forms/item.py:1113 msgid "You added the same add-on category twice" msgstr "" -#: pretix/control/forms/item.py:1155 +#: pretix/control/forms/item.py:1158 msgid "" "Be aware that setting a minimal number makes it impossible to buy this " "product if all available add-ons are sold out." msgstr "" -#: pretix/control/forms/item.py:1162 +#: pretix/control/forms/item.py:1165 msgid "Bundled products" msgstr "" -#: pretix/control/forms/item.py:1212 +#: pretix/control/forms/item.py:1215 msgid "You added the same bundled product twice." msgstr "" -#: pretix/control/forms/item.py:1218 +#: pretix/control/forms/item.py:1221 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:23 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:50 msgid "Bundled product" msgstr "" -#: pretix/control/forms/item.py:1243 pretix/control/forms/orders.py:379 +#: pretix/control/forms/item.py:1246 pretix/control/forms/orders.py:379 #: pretix/control/forms/orders.py:568 msgid "inactive" msgstr "" +#: pretix/control/forms/item.py:1331 +msgid "Program times" +msgstr "" + #: pretix/control/forms/mailsetup.py:42 msgid "Hostname" msgstr "" @@ -14140,11 +14272,6 @@ msgstr "" msgid "I understand that this is not reversible and want to continue" msgstr "" -#: pretix/control/forms/orders.py:1041 -#: pretix/control/templates/pretixcontrol/shredder/download.html:53 -msgid "Confirmation code" -msgstr "" - #: pretix/control/forms/orders.py:1042 msgid "" "We have just emailed you a confirmation code to enter to confirm this action" @@ -14429,7 +14556,7 @@ msgstr "" msgid "Exclude these dates instead of adding them." msgstr "" -#: pretix/control/forms/users.py:122 pretix/control/views/user.py:231 +#: pretix/control/forms/users.py:123 pretix/control/views/user.py:236 msgid "Your changes could not be saved. See below for details." msgstr "" @@ -14765,7 +14892,7 @@ msgid "The check-in of position #{posid} on list \"{list}\" has been reverted." msgstr "" #: pretix/control/logdisplay.py:353 pretix/control/logdisplay.py:355 -#: pretix/control/logdisplay.py:971 pretix/control/logdisplay.py:973 +#: pretix/control/logdisplay.py:983 pretix/control/logdisplay.py:985 msgid "(unknown)" msgstr "" @@ -14815,7 +14942,7 @@ msgstr "" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "" -#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1567 +#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1572 #: pretix/presale/views/order.py:1072 msgid "The order has been canceled." msgstr "" @@ -14854,11 +14981,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:821 +#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:830 msgid "The settings of a payment provider have been changed." msgstr "" -#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:820 +#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:829 msgid "The settings of a ticket output provider have been changed." msgstr "" @@ -14899,11 +15026,11 @@ msgstr "" msgid "The order has been set to require payment before use." msgstr "" -#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1572 +#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1577 msgid "The order has been marked as expired." msgstr "" -#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1471 +#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1476 msgid "The order has been marked as paid." msgstr "" @@ -14915,7 +15042,7 @@ msgstr "" msgid "The order has been refunded." msgstr "" -#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1888 +#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1912 msgid "The order has been reactivated." msgstr "" @@ -14927,7 +15054,7 @@ msgstr "" msgid "The order requires approval before it can continue to be processed." msgstr "" -#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:791 +#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:796 msgid "The order has been approved." msgstr "" @@ -14962,7 +15089,7 @@ msgstr "" msgid "The order locale has been changed." msgstr "" -#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1611 +#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1616 #: pretix/presale/views/order.py:745 pretix/presale/views/order.py:825 msgid "The invoice has been generated." msgstr "" @@ -14971,11 +15098,11 @@ msgstr "" msgid "The invoice could not be generated." msgstr "" -#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1684 +#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1689 msgid "The invoice has been regenerated." msgstr "" -#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1746 +#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1751 #: pretix/presale/views/order.py:845 msgid "The invoice has been reissued." msgstr "" @@ -15032,8 +15159,8 @@ msgstr "" msgid "An unidentified type email has been sent." msgstr "" -#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:723 -#: pretix/control/logdisplay.py:729 pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:738 pretix/control/logdisplay.py:766 msgid "Sending of an email has failed." msgstr "" @@ -15141,782 +15268,808 @@ msgid "The voucher has been deleted." msgstr "" #: pretix/control/logdisplay.py:585 +msgid "Cart positions including the voucher have been deleted." +msgstr "" + +#: pretix/control/logdisplay.py:586 #, python-brace-format msgid "The voucher has been assigned to {email} through the waiting list." msgstr "" -#: pretix/control/logdisplay.py:594 +#: pretix/control/logdisplay.py:595 #, python-brace-format msgid "The voucher has been redeemed in order {order_code}." msgstr "" -#: pretix/control/logdisplay.py:609 +#: pretix/control/logdisplay.py:610 msgid "The category has been added." msgstr "" -#: pretix/control/logdisplay.py:610 +#: pretix/control/logdisplay.py:611 msgid "The category has been deleted." msgstr "" -#: pretix/control/logdisplay.py:611 +#: pretix/control/logdisplay.py:612 msgid "The category has been changed." msgstr "" -#: pretix/control/logdisplay.py:612 +#: pretix/control/logdisplay.py:613 msgid "The category has been reordered." msgstr "" -#: pretix/control/logdisplay.py:619 +#: pretix/control/logdisplay.py:620 msgid "The tax rule has been added." msgstr "" -#: pretix/control/logdisplay.py:620 +#: pretix/control/logdisplay.py:621 msgid "The tax rule has been deleted." msgstr "" -#: pretix/control/logdisplay.py:621 +#: pretix/control/logdisplay.py:622 msgid "The tax rule has been changed." msgstr "" -#: pretix/control/logdisplay.py:633 -#, python-brace-format -msgid "{user} has been added to the team." -msgstr "" - #: pretix/control/logdisplay.py:634 #, python-brace-format -msgid "{user} has been removed from the team." +msgid "{user} has been added to the team." msgstr "" #: pretix/control/logdisplay.py:635 #, python-brace-format -msgid "{user} has been invited to the team." +msgid "{user} has been removed from the team." msgstr "" #: pretix/control/logdisplay.py:636 #, python-brace-format +msgid "{user} has been invited to the team." +msgstr "" + +#: pretix/control/logdisplay.py:637 +#, python-brace-format msgid "Invite for {user} has been resent." msgstr "" -#: pretix/control/logdisplay.py:647 +#: pretix/control/logdisplay.py:648 #, python-brace-format msgid "{user} has joined the team using the invite sent to {email}." msgstr "" -#: pretix/control/logdisplay.py:657 +#: pretix/control/logdisplay.py:658 msgid "Your account settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:660 pretix/control/views/user.py:253 +#: pretix/control/logdisplay.py:661 pretix/control/views/user.py:957 #, python-brace-format msgid "Your email address has been changed to {email}." msgstr "" -#: pretix/control/logdisplay.py:662 pretix/control/views/user.py:250 +#: pretix/control/logdisplay.py:663 pretix/control/views/user.py:847 msgid "Your password has been changed." msgstr "" -#: pretix/control/logdisplay.py:664 +#: pretix/control/logdisplay.py:665 msgid "Your account has been enabled." msgstr "" -#: pretix/control/logdisplay.py:666 +#: pretix/control/logdisplay.py:667 msgid "Your account has been disabled." msgstr "" -#: pretix/control/logdisplay.py:676 +#: pretix/control/logdisplay.py:672 +#, python-brace-format +msgid "Your email address has been changed from {old_email} to {email}." +msgstr "" + +#: pretix/control/logdisplay.py:673 +#, python-brace-format +msgid "Your email address {email} has been confirmed." +msgstr "" + +#: pretix/control/logdisplay.py:685 #, python-brace-format msgid "You impersonated {}." msgstr "" -#: pretix/control/logdisplay.py:677 +#: pretix/control/logdisplay.py:686 #, python-brace-format msgid "You stopped impersonating {}." msgstr "" -#: pretix/control/logdisplay.py:684 +#: pretix/control/logdisplay.py:693 msgid "This object has been created by cloning." msgstr "" -#: pretix/control/logdisplay.py:685 +#: pretix/control/logdisplay.py:694 msgid "The organizer has been changed." msgstr "" -#: pretix/control/logdisplay.py:686 +#: pretix/control/logdisplay.py:695 msgid "The organizer settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:828 +#: pretix/control/logdisplay.py:696 pretix/control/logdisplay.py:837 msgid "The footer links have been changed." msgstr "" -#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 +#: pretix/control/logdisplay.py:697 pretix/control/logdisplay.py:744 msgid "A scheduled export has been added." msgstr "" -#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 +#: pretix/control/logdisplay.py:698 pretix/control/logdisplay.py:745 msgid "A scheduled export has been changed." msgstr "" -#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 +#: pretix/control/logdisplay.py:699 pretix/control/logdisplay.py:746 msgid "A scheduled export has been deleted." msgstr "" -#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 +#: pretix/control/logdisplay.py:700 pretix/control/logdisplay.py:747 msgid "A scheduled export has been executed." msgstr "" -#: pretix/control/logdisplay.py:692 pretix/control/logdisplay.py:739 +#: pretix/control/logdisplay.py:701 pretix/control/logdisplay.py:748 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" -#: pretix/control/logdisplay.py:693 +#: pretix/control/logdisplay.py:702 msgid "Gift card acceptance for another organizer has been added." msgstr "" -#: pretix/control/logdisplay.py:694 +#: pretix/control/logdisplay.py:703 msgid "Gift card acceptance for another organizer has been removed." msgstr "" -#: pretix/control/logdisplay.py:695 +#: pretix/control/logdisplay.py:704 msgid "A new gift card acceptor has been invited." msgstr "" -#: pretix/control/logdisplay.py:696 +#: pretix/control/logdisplay.py:705 msgid "A gift card acceptor has been removed." msgstr "" -#: pretix/control/logdisplay.py:697 +#: pretix/control/logdisplay.py:706 msgid "A gift card issuer has been removed or declined." msgstr "" -#: pretix/control/logdisplay.py:698 +#: pretix/control/logdisplay.py:707 msgid "A new gift card issuer has been accepted." msgstr "" -#: pretix/control/logdisplay.py:699 +#: pretix/control/logdisplay.py:708 msgid "The webhook has been created." msgstr "" -#: pretix/control/logdisplay.py:700 +#: pretix/control/logdisplay.py:709 msgid "The webhook has been changed." msgstr "" -#: pretix/control/logdisplay.py:701 +#: pretix/control/logdisplay.py:710 msgid "The webhook call retry jobs have been manually expedited." msgstr "" -#: pretix/control/logdisplay.py:702 +#: pretix/control/logdisplay.py:711 msgid "The webhook call retry jobs have been dropped." msgstr "" -#: pretix/control/logdisplay.py:703 +#: pretix/control/logdisplay.py:712 msgid "The SSO provider has been created." msgstr "" -#: pretix/control/logdisplay.py:704 +#: pretix/control/logdisplay.py:713 msgid "The SSO provider has been changed." msgstr "" -#: pretix/control/logdisplay.py:705 +#: pretix/control/logdisplay.py:714 msgid "The SSO provider has been deleted." msgstr "" -#: pretix/control/logdisplay.py:706 +#: pretix/control/logdisplay.py:715 msgid "The SSO client has been created." msgstr "" -#: pretix/control/logdisplay.py:707 +#: pretix/control/logdisplay.py:716 msgid "The SSO client has been changed." msgstr "" -#: pretix/control/logdisplay.py:708 +#: pretix/control/logdisplay.py:717 msgid "The SSO client has been deleted." msgstr "" -#: pretix/control/logdisplay.py:709 pretix/control/views/organizer.py:2632 +#: pretix/control/logdisplay.py:718 pretix/control/views/organizer.py:2632 msgid "The membership type has been created." msgstr "" -#: pretix/control/logdisplay.py:710 +#: pretix/control/logdisplay.py:719 msgid "The membership type has been changed." msgstr "" -#: pretix/control/logdisplay.py:711 +#: pretix/control/logdisplay.py:720 msgid "The membership type has been deleted." msgstr "" -#: pretix/control/logdisplay.py:712 pretix/control/views/organizer.py:3472 +#: pretix/control/logdisplay.py:721 pretix/control/views/organizer.py:3472 msgid "The sales channel has been created." msgstr "" -#: pretix/control/logdisplay.py:713 +#: pretix/control/logdisplay.py:722 msgid "The sales channel has been changed." msgstr "" -#: pretix/control/logdisplay.py:714 +#: pretix/control/logdisplay.py:723 msgid "The sales channel has been deleted." msgstr "" -#: pretix/control/logdisplay.py:715 +#: pretix/control/logdisplay.py:724 msgid "The account has been created." msgstr "" -#: pretix/control/logdisplay.py:716 +#: pretix/control/logdisplay.py:725 msgid "The account has been changed." msgstr "" -#: pretix/control/logdisplay.py:717 +#: pretix/control/logdisplay.py:726 msgid "A membership for this account has been added." msgstr "" -#: pretix/control/logdisplay.py:718 +#: pretix/control/logdisplay.py:727 msgid "A membership of this account has been changed." msgstr "" -#: pretix/control/logdisplay.py:719 +#: pretix/control/logdisplay.py:728 msgid "A membership of this account has been deleted." msgstr "" -#: pretix/control/logdisplay.py:720 +#: pretix/control/logdisplay.py:729 msgid "The account has been disabled and anonymized." msgstr "" -#: pretix/control/logdisplay.py:721 +#: pretix/control/logdisplay.py:730 msgid "A new password has been requested." msgstr "" -#: pretix/control/logdisplay.py:722 +#: pretix/control/logdisplay.py:731 msgid "A new password has been set." msgstr "" -#: pretix/control/logdisplay.py:724 +#: pretix/control/logdisplay.py:733 msgid "The reusable medium has been created." msgstr "" -#: pretix/control/logdisplay.py:725 +#: pretix/control/logdisplay.py:734 msgid "The reusable medium has been created automatically." msgstr "" -#: pretix/control/logdisplay.py:726 +#: pretix/control/logdisplay.py:735 msgid "The reusable medium has been changed." msgstr "" -#: pretix/control/logdisplay.py:727 +#: pretix/control/logdisplay.py:736 msgid "The medium has been connected to a new ticket." msgstr "" -#: pretix/control/logdisplay.py:728 +#: pretix/control/logdisplay.py:737 msgid "The medium has been connected to a new gift card." msgstr "" -#: pretix/control/logdisplay.py:730 +#: pretix/control/logdisplay.py:739 msgid "The event's internal comment has been updated." msgstr "" -#: pretix/control/logdisplay.py:731 +#: pretix/control/logdisplay.py:740 msgid "The event has been canceled." msgstr "" -#: pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:741 msgid "An event has been deleted." msgstr "" -#: pretix/control/logdisplay.py:733 +#: pretix/control/logdisplay.py:742 msgid "A removal process for personal data has been started." msgstr "" -#: pretix/control/logdisplay.py:734 +#: pretix/control/logdisplay.py:743 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:740 +#: pretix/control/logdisplay.py:749 msgid "The user has been created." msgstr "" -#: pretix/control/logdisplay.py:741 +#: pretix/control/logdisplay.py:750 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:490 -#: pretix/control/views/user.py:550 pretix/control/views/user.py:609 +#: pretix/control/logdisplay.py:752 pretix/control/views/user.py:477 +#: pretix/control/views/user.py:537 pretix/control/views/user.py:596 msgid "Two-factor authentication has been enabled." msgstr "" -#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:393 -#: pretix/control/views/user.py:625 +#: pretix/control/logdisplay.py:753 pretix/control/views/user.py:380 +#: pretix/control/views/user.py:612 msgid "Two-factor authentication has been disabled." msgstr "" -#: pretix/control/logdisplay.py:745 pretix/control/views/user.py:642 +#: pretix/control/logdisplay.py:754 pretix/control/views/user.py:629 msgid "Your two-factor emergency codes have been regenerated." msgstr "" -#: pretix/control/logdisplay.py:746 +#: pretix/control/logdisplay.py:755 msgid "A two-factor emergency code has been generated." msgstr "" -#: pretix/control/logdisplay.py:747 +#: pretix/control/logdisplay.py:756 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "" -#: pretix/control/logdisplay.py:749 +#: pretix/control/logdisplay.py:758 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "" -#: pretix/control/logdisplay.py:751 +#: pretix/control/logdisplay.py:760 msgid "Notifications have been enabled." msgstr "" -#: pretix/control/logdisplay.py:752 +#: pretix/control/logdisplay.py:761 msgid "Notifications have been disabled." msgstr "" -#: pretix/control/logdisplay.py:753 +#: pretix/control/logdisplay.py:762 msgid "Your notification settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:754 +#: pretix/control/logdisplay.py:763 msgid "This user has been anonymized." msgstr "" -#: pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:767 msgid "Password reset mail sent." msgstr "" -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:768 msgid "The password has been reset." msgstr "" -#: pretix/control/logdisplay.py:760 +#: pretix/control/logdisplay.py:769 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:762 +#: pretix/control/logdisplay.py:771 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:763 pretix/control/logdisplay.py:989 +#: pretix/control/logdisplay.py:772 pretix/control/logdisplay.py:1001 msgid "A voucher has been sent to a person on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:764 +#: pretix/control/logdisplay.py:773 msgid "An entry has been transferred to another waiting list." msgstr "" -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:774 msgid "The team has been created." msgstr "" -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:775 msgid "The team settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:767 +#: pretix/control/logdisplay.py:776 msgid "The team has been deleted." msgstr "" -#: pretix/control/logdisplay.py:768 pretix/control/views/organizer.py:2298 +#: pretix/control/logdisplay.py:777 pretix/control/views/organizer.py:2298 msgid "The gate has been created." msgstr "" -#: pretix/control/logdisplay.py:769 +#: pretix/control/logdisplay.py:778 msgid "The gate has been changed." msgstr "" -#: pretix/control/logdisplay.py:770 +#: pretix/control/logdisplay.py:779 msgid "The gate has been deleted." msgstr "" -#: pretix/control/logdisplay.py:771 +#: pretix/control/logdisplay.py:780 msgctxt "subevent" msgid "The event date has been deleted." msgstr "" -#: pretix/control/logdisplay.py:772 +#: pretix/control/logdisplay.py:781 msgctxt "subevent" msgid "The event date has been canceled." msgstr "" -#: pretix/control/logdisplay.py:773 +#: pretix/control/logdisplay.py:782 msgctxt "subevent" msgid "The event date has been changed." msgstr "" -#: pretix/control/logdisplay.py:774 +#: pretix/control/logdisplay.py:783 msgctxt "subevent" msgid "The event date has been created." msgstr "" -#: pretix/control/logdisplay.py:775 +#: pretix/control/logdisplay.py:784 msgctxt "subevent" msgid "A quota has been added to the event date." msgstr "" -#: pretix/control/logdisplay.py:776 +#: pretix/control/logdisplay.py:785 msgctxt "subevent" msgid "A quota has been changed on the event date." msgstr "" -#: pretix/control/logdisplay.py:777 +#: pretix/control/logdisplay.py:786 msgctxt "subevent" msgid "A quota has been removed from the event date." msgstr "" -#: pretix/control/logdisplay.py:778 +#: pretix/control/logdisplay.py:787 msgid "The device has been created." msgstr "" -#: pretix/control/logdisplay.py:779 +#: pretix/control/logdisplay.py:788 msgid "The device has been changed." msgstr "" -#: pretix/control/logdisplay.py:780 +#: pretix/control/logdisplay.py:789 msgid "Access of the device has been revoked." msgstr "" -#: pretix/control/logdisplay.py:781 +#: pretix/control/logdisplay.py:790 msgid "The device has been initialized." msgstr "" -#: pretix/control/logdisplay.py:782 +#: pretix/control/logdisplay.py:791 msgid "The access token of the device has been regenerated." msgstr "" -#: pretix/control/logdisplay.py:783 +#: pretix/control/logdisplay.py:792 msgid "The device has notified the server of an hardware or software update." msgstr "" -#: pretix/control/logdisplay.py:784 +#: pretix/control/logdisplay.py:793 msgid "The gift card has been created." msgstr "" -#: pretix/control/logdisplay.py:785 pretix/control/views/organizer.py:1925 +#: pretix/control/logdisplay.py:794 pretix/control/views/organizer.py:1925 msgid "The gift card has been changed." msgstr "" -#: pretix/control/logdisplay.py:786 +#: pretix/control/logdisplay.py:795 msgid "A manual transaction has been performed." msgstr "" -#: pretix/control/logdisplay.py:787 +#: pretix/control/logdisplay.py:796 #, python-brace-format msgid "The token \"{name}\" has been created." msgstr "" -#: pretix/control/logdisplay.py:788 +#: pretix/control/logdisplay.py:797 #, python-brace-format msgid "The token \"{name}\" has been revoked." msgstr "" -#: pretix/control/logdisplay.py:789 +#: pretix/control/logdisplay.py:798 msgid "The check-in and print log state has been reset." msgstr "" -#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:805 pretix/control/logdisplay.py:864 msgid "The plugin has been enabled." msgstr "" -#: pretix/control/logdisplay.py:797 pretix/control/logdisplay.py:856 +#: pretix/control/logdisplay.py:806 pretix/control/logdisplay.py:865 #: pretix/control/views/event.py:490 pretix/control/views/organizer.py:753 msgid "The plugin has been disabled." msgstr "" -#: pretix/control/logdisplay.py:800 pretix/control/logdisplay.py:859 +#: pretix/control/logdisplay.py:809 pretix/control/logdisplay.py:868 #, python-brace-format msgid "Plugin {val}" msgstr "" -#: pretix/control/logdisplay.py:815 +#: pretix/control/logdisplay.py:824 msgid "A meta property has been added to this event." msgstr "" -#: pretix/control/logdisplay.py:816 +#: pretix/control/logdisplay.py:825 msgid "A meta property has been removed from this event." msgstr "" -#: pretix/control/logdisplay.py:817 +#: pretix/control/logdisplay.py:826 msgid "A meta property has been changed on this event." msgstr "" -#: pretix/control/logdisplay.py:818 +#: pretix/control/logdisplay.py:827 msgid "The event settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:819 +#: pretix/control/logdisplay.py:828 msgid "The ticket download settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:822 +#: pretix/control/logdisplay.py:831 msgid "The shop has been taken live." msgstr "" -#: pretix/control/logdisplay.py:823 +#: pretix/control/logdisplay.py:832 msgid "The shop has been taken offline." msgstr "" -#: pretix/control/logdisplay.py:824 +#: pretix/control/logdisplay.py:833 msgid "The shop has been taken into test mode." msgstr "" -#: pretix/control/logdisplay.py:825 +#: pretix/control/logdisplay.py:834 msgid "The test mode has been disabled." msgstr "" -#: pretix/control/logdisplay.py:826 +#: pretix/control/logdisplay.py:835 msgid "The event has been created." msgstr "" -#: pretix/control/logdisplay.py:827 +#: pretix/control/logdisplay.py:836 msgid "The event details have been changed." msgstr "" -#: pretix/control/logdisplay.py:829 +#: pretix/control/logdisplay.py:838 msgid "An answer option has been added to the question." msgstr "" -#: pretix/control/logdisplay.py:830 +#: pretix/control/logdisplay.py:839 msgid "An answer option has been removed from the question." msgstr "" -#: pretix/control/logdisplay.py:831 +#: pretix/control/logdisplay.py:840 msgid "An answer option has been changed." msgstr "" -#: pretix/control/logdisplay.py:832 +#: pretix/control/logdisplay.py:841 msgid "A user has been added to the event team." msgstr "" -#: pretix/control/logdisplay.py:833 +#: pretix/control/logdisplay.py:842 msgid "A user has been invited to the event team." msgstr "" -#: pretix/control/logdisplay.py:834 +#: pretix/control/logdisplay.py:843 msgid "A user's permissions have been changed." msgstr "" -#: pretix/control/logdisplay.py:835 +#: pretix/control/logdisplay.py:844 msgid "A user has been removed from the event team." msgstr "" -#: pretix/control/logdisplay.py:842 +#: pretix/control/logdisplay.py:851 msgid "The check-in list has been added." msgstr "" -#: pretix/control/logdisplay.py:843 pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:852 pretix/control/logdisplay.py:853 msgid "The check-in list has been deleted." msgstr "" -#: pretix/control/logdisplay.py:845 +#: pretix/control/logdisplay.py:854 msgid "The check-in list has been changed." msgstr "" -#: pretix/control/logdisplay.py:848 +#: pretix/control/logdisplay.py:857 #, python-brace-format msgid "Check-in list {val}" msgstr "" -#: pretix/control/logdisplay.py:875 +#: pretix/control/logdisplay.py:884 msgid "The product has been created." msgstr "" -#: pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:885 msgid "The product has been changed." msgstr "" -#: pretix/control/logdisplay.py:877 +#: pretix/control/logdisplay.py:886 msgid "The product has been reordered." msgstr "" -#: pretix/control/logdisplay.py:878 +#: pretix/control/logdisplay.py:887 msgid "The product has been deleted." msgstr "" -#: pretix/control/logdisplay.py:879 +#: pretix/control/logdisplay.py:888 msgid "An add-on has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:889 msgid "An add-on has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:881 +#: pretix/control/logdisplay.py:890 msgid "An add-on has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:882 +#: pretix/control/logdisplay.py:891 msgid "A bundled item has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:883 +#: pretix/control/logdisplay.py:892 msgid "A bundled item has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:884 +#: pretix/control/logdisplay.py:893 msgid "A bundled item has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:891 +#: pretix/control/logdisplay.py:894 +msgid "A program time has been added to this product." +msgstr "" + +#: pretix/control/logdisplay.py:895 +msgid "A program time has been changed on this product." +msgstr "" + +#: pretix/control/logdisplay.py:896 +msgid "A program time has been removed from this product." +msgstr "" + +#: pretix/control/logdisplay.py:903 #, python-brace-format msgid "The variation \"{value}\" has been created." msgstr "" -#: pretix/control/logdisplay.py:892 +#: pretix/control/logdisplay.py:904 #, python-brace-format msgid "The variation \"{value}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:893 +#: pretix/control/logdisplay.py:905 #, python-brace-format msgid "The variation \"{value}\" has been changed." msgstr "" -#: pretix/control/logdisplay.py:910 +#: pretix/control/logdisplay.py:922 #, python-brace-format msgid "Payment {local_id} has been confirmed." msgstr "" -#: pretix/control/logdisplay.py:911 +#: pretix/control/logdisplay.py:923 #, python-brace-format msgid "Payment {local_id} has been canceled." msgstr "" -#: pretix/control/logdisplay.py:912 +#: pretix/control/logdisplay.py:924 #, python-brace-format msgid "Canceling payment {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:913 +#: pretix/control/logdisplay.py:925 #, python-brace-format msgid "Payment {local_id} has been started." msgstr "" -#: pretix/control/logdisplay.py:914 +#: pretix/control/logdisplay.py:926 #, python-brace-format msgid "Payment {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:915 +#: pretix/control/logdisplay.py:927 #, python-brace-format msgid "The order could not be marked as paid: {message}" msgstr "" -#: pretix/control/logdisplay.py:916 +#: pretix/control/logdisplay.py:928 msgid "The order has been overpaid." msgstr "" -#: pretix/control/logdisplay.py:917 +#: pretix/control/logdisplay.py:929 #, python-brace-format msgid "Refund {local_id} has been created." msgstr "" -#: pretix/control/logdisplay.py:918 +#: pretix/control/logdisplay.py:930 #, python-brace-format msgid "Refund {local_id} has been created by an external entity." msgstr "" -#: pretix/control/logdisplay.py:919 +#: pretix/control/logdisplay.py:931 msgid "The customer requested you to issue a refund." msgstr "" -#: pretix/control/logdisplay.py:920 +#: pretix/control/logdisplay.py:932 #, python-brace-format msgid "Refund {local_id} has been completed." msgstr "" -#: pretix/control/logdisplay.py:921 +#: pretix/control/logdisplay.py:933 #, python-brace-format msgid "Refund {local_id} has been canceled." msgstr "" -#: pretix/control/logdisplay.py:922 +#: pretix/control/logdisplay.py:934 #, python-brace-format msgid "Refund {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:929 +#: pretix/control/logdisplay.py:941 msgid "The quota has been added." msgstr "" -#: pretix/control/logdisplay.py:930 +#: pretix/control/logdisplay.py:942 msgid "The quota has been deleted." msgstr "" -#: pretix/control/logdisplay.py:931 +#: pretix/control/logdisplay.py:943 msgid "The quota has been changed." msgstr "" -#: pretix/control/logdisplay.py:932 +#: pretix/control/logdisplay.py:944 msgid "The quota has closed." msgstr "" -#: pretix/control/logdisplay.py:933 pretix/control/views/item.py:1081 +#: pretix/control/logdisplay.py:945 pretix/control/views/item.py:1082 msgid "The quota has been re-opened." msgstr "" -#: pretix/control/logdisplay.py:940 +#: pretix/control/logdisplay.py:952 msgid "The question has been added." msgstr "" -#: pretix/control/logdisplay.py:941 +#: pretix/control/logdisplay.py:953 msgid "The question has been deleted." msgstr "" -#: pretix/control/logdisplay.py:942 +#: pretix/control/logdisplay.py:954 msgid "The question has been changed." msgstr "" -#: pretix/control/logdisplay.py:943 +#: pretix/control/logdisplay.py:955 msgid "The question has been reordered." msgstr "" -#: pretix/control/logdisplay.py:950 +#: pretix/control/logdisplay.py:962 msgid "The discount has been added." msgstr "" -#: pretix/control/logdisplay.py:951 +#: pretix/control/logdisplay.py:963 msgid "The discount has been deleted." msgstr "" -#: pretix/control/logdisplay.py:952 +#: pretix/control/logdisplay.py:964 msgid "The discount has been changed." msgstr "" -#: pretix/control/logdisplay.py:976 +#: pretix/control/logdisplay.py:988 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" "\"." msgstr "" -#: pretix/control/logdisplay.py:981 +#: pretix/control/logdisplay.py:993 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." msgstr "" -#: pretix/control/logdisplay.py:990 +#: pretix/control/logdisplay.py:1002 msgid "An entry has been removed from the waiting list." msgstr "" -#: pretix/control/logdisplay.py:991 +#: pretix/control/logdisplay.py:1003 msgid "An entry has been changed on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:992 +#: pretix/control/logdisplay.py:1004 msgid "An entry has been added to the waiting list." msgstr "" @@ -15955,7 +16108,7 @@ msgstr "" #: pretix/control/navigation.py:57 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:890 +#: pretix/control/templates/pretixcontrol/order/index.html:921 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:37 #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/manualpayment/apps.py:39 pretix/plugins/paypal2/apps.py:45 @@ -15966,9 +16119,9 @@ msgstr "" msgid "Payment" msgstr "" -#: pretix/control/navigation.py:73 pretix/control/views/event.py:1610 -#: pretix/control/views/event.py:1612 pretix/control/views/event.py:1644 -#: pretix/control/views/event.py:1649 pretix/control/views/subevents.py:310 +#: pretix/control/navigation.py:73 pretix/control/views/event.py:1619 +#: pretix/control/views/event.py:1621 pretix/control/views/event.py:1653 +#: pretix/control/views/event.py:1658 pretix/control/views/subevents.py:310 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:60 #: pretix/plugins/ticketoutputpdf/apps.py:55 #: pretix/plugins/ticketoutputpdf/exporters.py:68 @@ -15979,9 +16132,11 @@ msgid "Tickets" msgstr "" #: pretix/control/navigation.py:89 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:3 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:5 -msgid "Tax rules" +#: pretix/control/templates/pretixcontrol/event/tax.html:4 +#: pretix/control/templates/pretixcontrol/event/tax.html:6 +#: pretix/control/templates/pretixcontrol/order/index.html:764 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457 +msgid "Taxes" msgstr "" #: pretix/control/navigation.py:97 @@ -16000,7 +16155,7 @@ msgstr "" #: pretix/control/navigation.py:126 pretix/control/navigation.py:435 #: pretix/control/navigation.py:485 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:151 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:152 #: pretix/control/templates/pretixcontrol/event/payment.html:47 #: pretix/control/templates/pretixcontrol/event/plugins.html:117 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:137 @@ -16023,7 +16178,7 @@ msgid "Overview" msgstr "" #: pretix/control/navigation.py:221 -#: pretix/control/templates/pretixcontrol/order/index.html:877 +#: pretix/control/templates/pretixcontrol/order/index.html:908 #: pretix/control/templates/pretixcontrol/orders/refunds.html:7 #: pretix/control/templates/pretixcontrol/orders/refunds.html:9 #: pretix/plugins/reports/accountingreport.py:498 @@ -16063,10 +16218,10 @@ msgid "Search" msgstr "" #: pretix/control/navigation.py:368 -#: pretix/control/templates/pretixcontrol/order/index.html:783 +#: pretix/control/templates/pretixcontrol/order/index.html:814 #: pretix/plugins/reports/accountingreport.py:497 #: pretix/plugins/reports/accountingreport.py:678 -#: pretix/plugins/reports/accountingreport.py:872 +#: pretix/plugins/reports/accountingreport.py:876 msgid "Payments" msgstr "" @@ -16075,7 +16230,7 @@ msgid "User settings" msgstr "" #: pretix/control/navigation.py:387 -#: pretix/control/templates/pretixcontrol/user/settings.html:16 +#: pretix/control/templates/pretixcontrol/user/settings.html:34 msgid "Notifications" msgstr "" @@ -16091,7 +16246,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/history.html:4 #: pretix/control/templates/pretixcontrol/user/history.html:6 #: pretix/control/templates/pretixcontrol/user/history.html:10 -#: pretix/control/templates/pretixcontrol/user/settings.html:70 +#: pretix/control/templates/pretixcontrol/user/settings.html:98 msgid "Account history" msgstr "" @@ -16255,6 +16410,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/shredder/index.html:78 #: pretix/control/templates/pretixcontrol/user/2fa_add.html:14 #: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:79 +#: pretix/control/templates/pretixcontrol/user/change_email.html:25 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:17 #: pretix/control/templates/pretixcontrol/user/reauth.html:32 #: pretix/control/templates/pretixcontrol/user/reauth.html:36 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:11 @@ -16262,7 +16419,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/checkout_addons.html:90 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:126 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:80 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:168 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:140 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:194 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:53 #: pretix/presale/templates/pretixpresale/event/order_change.html:27 @@ -16311,17 +16468,18 @@ msgstr "" msgid "Set new password" msgstr "" -#: pretix/control/templates/pretixcontrol/auth/recover.html:15 +#: pretix/control/templates/pretixcontrol/auth/recover.html:16 #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:124 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:82 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:38 #: pretix/control/templates/pretixcontrol/event/cancel.html:91 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:175 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:176 #: pretix/control/templates/pretixcontrol/event/mail.html:135 #: pretix/control/templates/pretixcontrol/event/payment.html:88 #: pretix/control/templates/pretixcontrol/event/payment_provider.html:36 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:201 -#: pretix/control/templates/pretixcontrol/event/settings.html:494 +#: pretix/control/templates/pretixcontrol/event/settings.html:493 +#: pretix/control/templates/pretixcontrol/event/tax.html:116 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:145 #: pretix/control/templates/pretixcontrol/event/tickets.html:73 #: pretix/control/templates/pretixcontrol/global_settings.html:12 @@ -16354,7 +16512,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/mail.html:73 #: pretix/control/templates/pretixcontrol/organizers/membershiptype_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/plugin_events.html:41 -#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:103 +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:105 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium_edit.html:28 #: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html:28 @@ -16365,10 +16523,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 #: pretix/control/templates/pretixcontrol/subevents/detail.html:289 #: pretix/control/templates/pretixcontrol/user/notifications.html:85 -#: pretix/control/templates/pretixcontrol/user/settings.html:81 +#: pretix/control/templates/pretixcontrol/user/settings.html:109 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:13 #: pretix/control/templates/pretixcontrol/users/create.html:26 -#: pretix/control/templates/pretixcontrol/users/form.html:80 +#: pretix/control/templates/pretixcontrol/users/form.html:81 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:140 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:126 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html:29 @@ -16724,6 +16882,9 @@ msgstr[1] "" #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:18 #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:23 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:17 +#: pretix/control/templates/pretixcontrol/user/change_email.html:22 +#: pretix/control/templates/pretixcontrol/user/change_password.html:18 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:15 #: pretix/control/templates/pretixcontrol/vouchers/delete.html:12 #: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:33 #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:13 @@ -16780,7 +16941,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:16 #: pretix/control/templates/pretixcontrol/waitinglist/delete.html:15 #: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html:36 -#: pretix/control/views/orders.py:388 +#: pretix/control/views/orders.py:391 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html:15 #: pretix/plugins/badges/templates/pretixplugins/badges/delete.html:16 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html:15 @@ -16861,13 +17022,13 @@ msgid "Result" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:432 +#: pretix/control/templates/pretixcontrol/order/index.html:437 #, python-format msgid "Automatically marked not present: %(date)s" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:82 -#: pretix/control/templates/pretixcontrol/order/index.html:437 +#: pretix/control/templates/pretixcontrol/order/index.html:442 #, python-format msgid "Additional entry scan: %(date)s" msgstr "" @@ -16878,7 +17039,7 @@ msgid "Offline scan. Upload time: %(date)s" msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:88 -#: pretix/control/templates/pretixcontrol/order/index.html:439 +#: pretix/control/templates/pretixcontrol/order/index.html:444 #, python-format msgid "Automatically checked in: %(date)s" msgstr "" @@ -17340,10 +17501,28 @@ msgid "Edit value mapping" msgstr "" #: pretix/control/templates/pretixcontrol/datasync/property_mappings_formset.html:76 -#: pretix/control/templates/pretixcontrol/event/settings.html:487 +#: pretix/control/templates/pretixcontrol/event/settings.html:486 msgid "Add property" msgstr "" +#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt:1 +#, python-format +msgid "" +"Hello,\n" +"\n" +"%(reason)s\n" +"\n" +" %(code)s\n" +"\n" +"Please do never give this code to another person. Our support team will " +"never ask for this code.\n" +"\n" +"If this code was not requested by you, please contact us immediately.\n" +"\n" +"Best regards,\n" +"Your pretix team\n" +msgstr "" + #: pretix/control/templates/pretixcontrol/email/email_setup.txt:1 #, python-format msgid "" @@ -17553,7 +17732,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/event/cancel.html:46 -#: pretix/control/templates/pretixcontrol/user/settings.html:29 +#: pretix/control/templates/pretixcontrol/user/settings.html:47 msgid "Change notification settings" msgstr "" @@ -17620,7 +17799,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:5 #: pretix/control/templates/pretixcontrol/event/live.html:131 -#: pretix/control/templates/pretixcontrol/event/settings.html:500 +#: pretix/control/templates/pretixcontrol/event/settings.html:499 msgid "Cancel or delete event" msgstr "" @@ -17727,7 +17906,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:15 #: pretix/control/templates/pretixcontrol/event/settings.html:139 -#: pretix/control/templates/pretixcontrol/event/settings.html:292 +#: pretix/control/templates/pretixcontrol/event/settings.html:291 #: pretix/control/templates/pretixcontrol/items/discount.html:35 #: pretix/control/templates/pretixcontrol/organizers/edit.html:56 #: pretix/control/templates/pretixcontrol/organizers/property_edit.html:32 @@ -17860,7 +18039,7 @@ msgid "Show sync problems" msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:1062 +#: pretix/control/templates/pretixcontrol/order/index.html:1093 msgid "Update comment" msgstr "" @@ -17897,15 +18076,15 @@ msgstr "" msgid "Issuer details" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:63 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:64 msgid "Invoice customization" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:77 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:78 msgid "Invoice transmission" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:79 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:80 msgid "" "pretix can transmit invoices using different transmission methods. Different " "transmission methods might be required depending on country and industry. By " @@ -17913,47 +18092,47 @@ msgid "" "types of transmission can be added by plugins." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:86 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:87 msgid "" "Whether a transmission method listed here is actually selectable for " "customers may depend on the country of the customer or whether the customer " "is entering a business address." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:95 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 msgid "Transmission method" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:111 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:112 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:139 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:109 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:111 msgid "Available" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:113 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 msgid "" "When this type is available for an invoice address, no other type can be " "selected." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:115 msgid "(exclusive)" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:121 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:122 msgid "Unavailable" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:143 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:144 msgid "Not configured" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:165 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:166 msgid "Enable additional invoice transmission plugins" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:172 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:173 msgid "Save and show preview" msgstr "" @@ -18079,9 +18258,10 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/logs.html:86 #: pretix/control/templates/pretixcontrol/event/logs_embed.html:47 #: pretix/control/templates/pretixcontrol/includes/logs.html:42 -#: pretix/control/templates/pretixcontrol/order/index.html:845 -#: pretix/control/templates/pretixcontrol/order/index.html:857 -#: pretix/control/templates/pretixcontrol/order/index.html:962 +#: pretix/control/templates/pretixcontrol/order/index.html:367 +#: pretix/control/templates/pretixcontrol/order/index.html:876 +#: pretix/control/templates/pretixcontrol/order/index.html:888 +#: pretix/control/templates/pretixcontrol/order/index.html:993 #: pretix/control/templates/pretixcontrol/organizers/device_logs.html:42 #: pretix/control/templates/pretixcontrol/organizers/logs.html:72 #: pretix/control/templates/pretixcontrol/search/payments.html:147 @@ -18150,7 +18330,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/mail.html:99 #: pretix/control/templates/pretixcontrol/order/index.html:249 -#: pretix/control/templates/pretixcontrol/order/index.html:584 +#: pretix/control/templates/pretixcontrol/order/index.html:589 msgid "Resend link" msgstr "" @@ -18188,14 +18368,14 @@ msgid "Payment settings" msgstr "" #: pretix/control/templates/pretixcontrol/event/payment.html:23 -#: pretix/control/templates/pretixcontrol/user/settings.html:48 +#: pretix/control/templates/pretixcontrol/user/settings.html:76 #: pretix/plugins/sendmail/models.py:286 msgid "Enabled" msgstr "" #: pretix/control/templates/pretixcontrol/event/payment.html:28 #: pretix/control/templates/pretixcontrol/subevents/index.html:166 -#: pretix/control/templates/pretixcontrol/user/settings.html:53 +#: pretix/control/templates/pretixcontrol/user/settings.html:81 msgid "Disabled" msgstr "" @@ -18258,13 +18438,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/plugins.html:15 #: pretix/control/views/checkin.py:424 pretix/control/views/discounts.py:113 #: pretix/control/views/event.py:246 pretix/control/views/event.py:576 -#: pretix/control/views/event.py:615 pretix/control/views/event.py:778 -#: pretix/control/views/event.py:1007 pretix/control/views/event.py:1380 -#: pretix/control/views/event.py:1420 +#: pretix/control/views/event.py:615 pretix/control/views/event.py:797 +#: pretix/control/views/event.py:1026 pretix/control/views/event.py:1389 +#: pretix/control/views/event.py:1429 #: pretix/control/views/global_settings.py:65 -#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:264 -#: pretix/control/views/item.py:795 pretix/control/views/item.py:1121 -#: pretix/control/views/item.py:1299 pretix/control/views/item.py:1449 +#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:265 +#: pretix/control/views/item.py:796 pretix/control/views/item.py:1122 +#: pretix/control/views/item.py:1300 pretix/control/views/item.py:1451 #: pretix/control/views/mailsetup.py:151 pretix/control/views/mailsetup.py:163 #: pretix/control/views/mailsetup.py:190 pretix/control/views/mailsetup.py:258 #: pretix/control/views/organizer.py:272 pretix/control/views/organizer.py:300 @@ -18284,10 +18464,11 @@ msgstr "" #: pretix/control/views/organizer.py:3356 #: pretix/control/views/organizer.py:3385 #: pretix/control/views/organizer.py:3523 pretix/control/views/subevents.py:542 -#: pretix/control/views/subevents.py:1614 pretix/control/views/user.py:236 -#: pretix/control/views/users.py:114 pretix/control/views/vouchers.py:305 -#: pretix/plugins/autocheckin/views.py:164 pretix/plugins/badges/views.py:157 -#: pretix/plugins/sendmail/views.py:645 pretix/plugins/stripe/views.py:679 +#: pretix/control/views/subevents.py:1614 pretix/control/views/user.py:241 +#: pretix/control/views/user.py:854 pretix/control/views/users.py:114 +#: pretix/control/views/vouchers.py:305 pretix/plugins/autocheckin/views.py:164 +#: pretix/plugins/badges/views.py:157 pretix/plugins/sendmail/views.py:645 +#: pretix/plugins/stripe/views.py:679 #: pretix/plugins/ticketoutputpdf/views.py:172 #: pretix/presale/views/customer.py:542 pretix/presale/views/customer.py:594 msgid "Your changes have been saved." @@ -18373,13 +18554,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:21 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:99 #: pretix/control/templates/pretixcontrol/user/notifications.html:23 -#: pretix/control/templates/pretixcontrol/user/settings.html:55 +#: pretix/control/templates/pretixcontrol/user/settings.html:83 msgid "Enable" msgstr "" #: pretix/control/templates/pretixcontrol/event/quick_setup.html:14 #: pretix/control/templates/pretixcontrol/event/settings_base.html:10 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:18 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:20 msgid "Congratulations!" msgstr "" @@ -18463,7 +18644,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/settings.html:7 #: pretix/control/templates/pretixcontrol/event/settings.html:13 -#: pretix/control/templates/pretixcontrol/user/settings.html:11 +#: pretix/control/templates/pretixcontrol/user/settings.html:29 msgid "General settings" msgstr "" @@ -18564,33 +18745,33 @@ msgstr "" msgid "Product list" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:253 -#: pretix/control/templates/pretixcontrol/event/settings.html:389 +#: pretix/control/templates/pretixcontrol/event/settings.html:252 +#: pretix/control/templates/pretixcontrol/event/settings.html:388 msgid "Incompatible settings" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:254 -#: pretix/control/templates/pretixcontrol/event/settings.html:390 +#: pretix/control/templates/pretixcontrol/event/settings.html:253 +#: pretix/control/templates/pretixcontrol/event/settings.html:389 msgid "" "Customers won't be able to add themselves to the waiting list, because " "\"Hide all products that are sold out\" is enabled." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:261 +#: pretix/control/templates/pretixcontrol/event/settings.html:260 msgctxt "subevents" msgid "Calendar and list views" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:284 +#: pretix/control/templates/pretixcontrol/event/settings.html:283 msgid "Other settings" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:291 +#: pretix/control/templates/pretixcontrol/event/settings.html:290 #: pretix/control/templates/pretixcontrol/organizers/edit.html:55 msgid "Footer links" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:296 +#: pretix/control/templates/pretixcontrol/event/settings.html:295 #: pretix/control/templates/pretixcontrol/organizers/edit.html:60 msgid "" "These links will be shown in the footer of your ticket shop. You could for " @@ -18599,22 +18780,22 @@ msgid "" "do not need to add them here." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:350 +#: pretix/control/templates/pretixcontrol/event/settings.html:349 #: pretix/control/templates/pretixcontrol/organizers/edit.html:119 msgid "Add link" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:357 +#: pretix/control/templates/pretixcontrol/event/settings.html:356 msgid "Cart" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:365 +#: pretix/control/templates/pretixcontrol/event/settings.html:364 msgid "" "The waiting list currently is not compatible with some advanced features of " "pretix such as hidden products, add-on products or product bundles." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:371 +#: pretix/control/templates/pretixcontrol/event/settings.html:370 msgid "" "The waiting list determines availability mainly based on quotas. If you use " "a seating plan and your number of available seats is less than the available " @@ -18622,38 +18803,38 @@ msgid "" "waiting list but still are unable to book a seat." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:378 +#: pretix/control/templates/pretixcontrol/event/settings.html:377 msgid "" "Specifically, this means the waiting list is not safe to use together with " "the minimum distance feature of our seating plan module." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:399 +#: pretix/control/templates/pretixcontrol/event/settings.html:398 msgid "Waiting customers" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:405 +#: pretix/control/templates/pretixcontrol/event/settings.html:404 msgid "Manage waiting list" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:418 +#: pretix/control/templates/pretixcontrol/event/settings.html:417 msgid "Item metadata" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:420 +#: pretix/control/templates/pretixcontrol/event/settings.html:419 msgid "" "You can here define a set of metadata properties (i.e. variables) that you " "can later set for your items and re-use in places like ticket layouts. This " "is an useful timesaver if you create lots and lots of items." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:440 -#: pretix/control/templates/pretixcontrol/event/settings.html:468 +#: pretix/control/templates/pretixcontrol/event/settings.html:439 +#: pretix/control/templates/pretixcontrol/event/settings.html:467 #: pretix/control/templates/pretixcontrol/organizers/properties.html:22 msgid "Property" msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:505 +#: pretix/control/templates/pretixcontrol/event/settings.html:504 #: pretix/control/templates/pretixcontrol/events/index.html:165 #: pretix/control/templates/pretixcontrol/organizers/detail.html:130 msgid "Clone event" @@ -18669,6 +18850,67 @@ msgstr "" msgid "Create a first product" msgstr "" +#: pretix/control/templates/pretixcontrol/event/tax.html:9 +msgid "Tax rules" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:11 +msgid "" +"Tax rules define different taxation scenarios that can then be assigned to " +"the individual products. Each tax rule contains a default tax rate and can " +"optionally contain additional rules that depend on the customer's country " +"and type." +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:21 +msgid "You haven't created any tax rules yet." +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:27 +#: pretix/control/templates/pretixcontrol/event/tax.html:98 +msgid "Create a new tax rule" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:36 +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:20 +msgid "Usage" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:37 +msgid "Rate" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:61 +#: pretix/plugins/badges/templates/pretixplugins/badges/index.html:63 +#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:60 +msgid "Make default" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:67 +#, python-format +msgid "%(count)s product" +msgid_plural "%(count)s products" +msgstr[0] "" +msgstr[1] "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:75 +#, python-format +msgid "incl. %(rate)s %%" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:77 +#, python-format +msgid "excl. %(rate)s %%" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:80 +msgid "with custom rules" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:110 +msgid "Tax settings" +msgstr "" + #: pretix/control/templates/pretixcontrol/event/tax_delete.html:4 #: pretix/control/templates/pretixcontrol/event/tax_delete.html:6 msgid "Delete tax rule" @@ -18740,35 +18982,6 @@ msgstr "" msgid "Change history" msgstr "" -#: pretix/control/templates/pretixcontrol/event/tax_index.html:9 -msgid "You haven't created any tax rules yet." -msgstr "" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:15 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:19 -msgid "Create a new tax rule" -msgstr "" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:28 -msgid "Rate" -msgstr "" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:51 -#: pretix/plugins/badges/templates/pretixplugins/badges/index.html:63 -#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:60 -msgid "Make default" -msgstr "" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:58 -#, python-format -msgid "incl. %(rate)s %%" -msgstr "" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:60 -#, python-format -msgid "excl. %(rate)s %%" -msgstr "" - #: pretix/control/templates/pretixcontrol/event/tickets.html:8 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:14 #: pretix/presale/templates/pretixpresale/event/fragment_downloads.html:7 @@ -19030,34 +19243,6 @@ msgstr "" msgid "Currently available: %(num)s" msgstr "" -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:9 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:81 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:14 -#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 -msgid "Information" -msgstr "" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:10 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:15 -msgid "The following gift cards are available in your customer account:" -msgstr "" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:25 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:29 -msgid "Use gift card" -msgstr "" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:27 -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:32 -msgid "Apply" -msgstr "" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html:4 -#, python-format -msgid "Your gift card %(card)s will be used to pay for this order." -msgstr "" - #: pretix/control/templates/pretixcontrol/global_license.html:8 msgid "" "This page is intended to help you use pretix in compliance with its license." @@ -19494,6 +19679,23 @@ msgstr "" msgid "Add a new bundled product" msgstr "" +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:5 +msgid "" +"With program times, you can set specific dates and times for this product. " +"This is useful if this product represents access to parts of your event that " +"happen at different times than your event in general. This will not affect " +"access control, but will affect calendar invites and ticket output." +msgstr "" + +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:25 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:51 +msgid "Program time" +msgstr "" + +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:68 +msgid "Add a program time" +msgstr "" + #: pretix/control/templates/pretixcontrol/item/include_variations.html:35 #: pretix/control/templates/pretixcontrol/item/include_variations.html:161 #: pretix/control/templates/pretixcontrol/items/discounts.html:105 @@ -19844,19 +20046,19 @@ msgid "Can only be bought using a voucher" msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:149 -#: pretix/control/templates/pretixcontrol/order/index.html:668 -#: pretix/control/templates/pretixcontrol/order/index.html:708 +#: pretix/control/templates/pretixcontrol/order/index.html:673 +#: pretix/control/templates/pretixcontrol/order/index.html:723 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:360 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:415 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:419 #, python-format msgid "plus %(rate)s%% %(taxname)s" msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:153 -#: pretix/control/templates/pretixcontrol/order/index.html:678 -#: pretix/control/templates/pretixcontrol/order/index.html:718 +#: pretix/control/templates/pretixcontrol/order/index.html:683 +#: pretix/control/templates/pretixcontrol/order/index.html:733 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:370 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:425 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:429 #, python-format msgid "incl. %(rate)s%% %(taxname)s" msgstr "" @@ -19907,7 +20109,7 @@ msgid "%% of tickets" msgstr "" #: pretix/control/templates/pretixcontrol/items/question.html:112 -#: pretix/control/templates/pretixcontrol/order/transactions.html:67 +#: pretix/control/templates/pretixcontrol/order/transactions.html:85 #: pretix/plugins/reports/accountingreport.py:409 #: pretix/plugins/reports/accountingreport.py:442 #: pretix/plugins/reports/accountingreport.py:566 @@ -20203,7 +20405,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/oauth/authorized.html:4 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:6 -#: pretix/control/templates/pretixcontrol/user/settings.html:61 +#: pretix/control/templates/pretixcontrol/user/settings.html:89 msgid "Authorized applications" msgstr "" @@ -20405,14 +20607,14 @@ msgid "Validity time" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:247 -#: pretix/control/templates/pretixcontrol/order/index.html:495 +#: pretix/control/templates/pretixcontrol/order/index.html:500 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:107 #, python-format msgid "Valid from %(datetime)s" msgstr "" #: pretix/control/templates/pretixcontrol/order/change.html:255 -#: pretix/control/templates/pretixcontrol/order/index.html:499 +#: pretix/control/templates/pretixcontrol/order/index.html:504 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:111 #, python-format msgid "Valid until %(datetime)s" @@ -20489,7 +20691,7 @@ msgid "Change order information" msgstr "" #: pretix/control/templates/pretixcontrol/order/change_questions.html:25 -#: pretix/control/templates/pretixcontrol/order/index.html:992 +#: pretix/control/templates/pretixcontrol/order/index.html:1023 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:35 #: pretix/presale/templates/pretixpresale/event/order_modify.html:29 @@ -20540,13 +20742,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:46 #: pretix/control/templates/pretixcontrol/orders/index.html:297 -#: pretix/control/views/orders.py:312 +#: pretix/control/views/orders.py:315 msgid "Approve" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:326 +#: pretix/control/views/orders.py:329 msgid "Deny" msgstr "" @@ -20585,7 +20787,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:374 +#: pretix/control/views/orders.py:377 msgid "Refund for overpayment" msgstr "" @@ -20717,97 +20919,92 @@ msgstr "" msgid "Cancel and reissue" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:375 -#: pretix/control/templates/pretixcontrol/order/index.html:387 +#: pretix/control/templates/pretixcontrol/order/index.html:380 +#: pretix/control/templates/pretixcontrol/order/index.html:392 msgid "Generate invoice" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:401 +#: pretix/control/templates/pretixcontrol/order/index.html:406 msgid "Change answers" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:405 +#: pretix/control/templates/pretixcontrol/order/index.html:410 msgid "Change products" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:410 +#: pretix/control/templates/pretixcontrol/order/index.html:415 #: pretix/presale/templates/pretixpresale/event/order.html:197 msgid "Ordered items" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:429 +#: pretix/control/templates/pretixcontrol/order/index.html:434 #, python-format msgid "Denied scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:434 +#: pretix/control/templates/pretixcontrol/order/index.html:439 #, python-format msgid "Exit scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:441 +#: pretix/control/templates/pretixcontrol/order/index.html:446 #, python-format msgid "Entry scan: %(date)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:460 +#: pretix/control/templates/pretixcontrol/order/index.html:465 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55 msgid "Voucher code used:" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:462 +#: pretix/control/templates/pretixcontrol/order/index.html:467 #, python-format msgid "Used %(amount)s discount from budget" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:479 +#: pretix/control/templates/pretixcontrol/order/index.html:484 msgid "" "The price of this product was reduced because of an automatic discount or " "this product was part of the discount calculation for a different product in " "this order." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:491 +#: pretix/control/templates/pretixcontrol/order/index.html:496 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:103 #, python-format msgid "Valid %(datetime_range)s" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:537 +#: pretix/control/templates/pretixcontrol/order/index.html:542 msgid "Ticket page" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:568 -#: pretix/control/templates/pretixcontrol/order/index.html:589 -#: pretix/control/templates/pretixcontrol/order/index.html:598 -#: pretix/control/templates/pretixcontrol/order/index.html:612 -#: pretix/control/templates/pretixcontrol/order/index.html:650 -#: pretix/control/templates/pretixcontrol/order/index.html:657 +#: pretix/control/templates/pretixcontrol/order/index.html:573 +#: pretix/control/templates/pretixcontrol/order/index.html:594 +#: pretix/control/templates/pretixcontrol/order/index.html:603 +#: pretix/control/templates/pretixcontrol/order/index.html:617 +#: pretix/control/templates/pretixcontrol/order/index.html:655 +#: pretix/control/templates/pretixcontrol/order/index.html:662 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:228 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:234 msgid "not answered" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:622 +#: pretix/control/templates/pretixcontrol/order/index.html:627 msgid "This question will be asked during check-in." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:634 +#: pretix/control/templates/pretixcontrol/order/index.html:639 msgid "" "This file has been uploaded by a user and could contain viruses or other " "malicious content." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:635 +#: pretix/control/templates/pretixcontrol/order/index.html:640 msgid "UNSAFE" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:739 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:453 -msgid "Taxes" -msgstr "" - -#: pretix/control/templates/pretixcontrol/order/index.html:748 +#: pretix/control/templates/pretixcontrol/order/index.html:773 #: pretix/control/templates/pretixcontrol/orders/overview.html:89 #: pretix/control/templates/pretixcontrol/orders/overview.html:177 #: pretix/plugins/reports/accountingreport.py:499 @@ -20815,97 +21012,97 @@ msgstr "" #: pretix/plugins/reports/exporters.py:446 #: pretix/plugins/reports/exporters.py:638 #: pretix/plugins/reports/exporters.py:969 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:465 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:469 msgid "Total" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:758 +#: pretix/control/templates/pretixcontrol/order/index.html:789 #: pretix/presale/templates/pretixpresale/event/order.html:210 msgid "Successful payments" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:767 +#: pretix/control/templates/pretixcontrol/order/index.html:798 #: pretix/presale/templates/pretixpresale/event/order.html:219 msgid "Pending total" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:793 +#: pretix/control/templates/pretixcontrol/order/index.html:824 #: pretix/control/templates/pretixcontrol/search/payments.html:88 msgid "Confirmation date" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:806 +#: pretix/control/templates/pretixcontrol/order/index.html:837 #: pretix/control/templates/pretixcontrol/search/payments.html:125 msgid "" "This payment was created with an older version of pretix, therefore accurate " "data might not be available." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:807 +#: pretix/control/templates/pretixcontrol/order/index.html:838 #: pretix/control/templates/pretixcontrol/search/payments.html:126 msgid "MIGRATED" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:819 +#: pretix/control/templates/pretixcontrol/order/index.html:850 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:4 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:8 msgid "Cancel payment" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:824 +#: pretix/control/templates/pretixcontrol/order/index.html:855 msgid "Confirm as paid" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:867 +#: pretix/control/templates/pretixcontrol/order/index.html:898 msgid "Create a refund" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:888 +#: pretix/control/templates/pretixcontrol/order/index.html:919 #: pretix/control/templates/pretixcontrol/orders/refunds.html:60 msgid "Source" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:921 +#: pretix/control/templates/pretixcontrol/order/index.html:952 msgid "Cancel transfer" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:926 +#: pretix/control/templates/pretixcontrol/order/index.html:957 #: pretix/control/templates/pretixcontrol/orders/refunds.html:112 msgid "Confirm as done" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:933 +#: pretix/control/templates/pretixcontrol/order/index.html:964 #: pretix/control/templates/pretixcontrol/orders/refunds.html:118 msgid "Ignore" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:939 +#: pretix/control/templates/pretixcontrol/order/index.html:970 #: pretix/control/templates/pretixcontrol/order/refund_process.html:58 #: pretix/control/templates/pretixcontrol/orders/refunds.html:123 msgid "Process refund" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:987 +#: pretix/control/templates/pretixcontrol/order/index.html:1018 #: pretix/presale/templates/pretixpresale/event/base.html:141 #: pretix/presale/templates/pretixpresale/event/timemachine.html:30 msgid "Change" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1003 +#: pretix/control/templates/pretixcontrol/order/index.html:1034 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90 #: pretix/presale/templates/pretixpresale/event/order.html:318 msgid "ZIP code and city" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1016 +#: pretix/control/templates/pretixcontrol/order/index.html:1047 msgid "Valid EU VAT ID" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1022 +#: pretix/control/templates/pretixcontrol/order/index.html:1053 msgid "Check" msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:1076 +#: pretix/control/templates/pretixcontrol/order/index.html:1107 msgid "Order history" msgstr "" @@ -21177,6 +21374,12 @@ msgid "" "might be inaccurate." msgstr "" +#: pretix/control/templates/pretixcontrol/order/transactions.html:63 +#: pretix/control/templates/pretixcontrol/order/transactions.html:73 +#, python-format +msgid "incl. %(amount)s rounding correction" +msgstr "" + #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:5 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:7 msgid "Modify orders" @@ -21721,12 +21924,12 @@ msgid "Select action" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:358 +#: pretix/control/views/orders.py:361 msgid "Refund overpaid amount" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:343 +#: pretix/control/views/orders.py:346 msgid "Mark as expired if overdue" msgstr "" @@ -22294,6 +22497,12 @@ msgstr "" msgid "Transactions" msgstr "" +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:81 +#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:9 +msgid "Information" +msgstr "" + #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:94 msgid "" "Create a payment on the respective order that cancels out with this " @@ -22543,10 +22752,6 @@ msgstr "" msgid "Property:" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:20 -msgid "Usage" -msgstr "" - #: pretix/control/templates/pretixcontrol/organizers/property_edit.html:26 msgid "Validation" msgstr "" @@ -22563,6 +22768,10 @@ msgstr "" msgid "Add a new value" msgstr "" +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:95 +msgid "Sort alphabetically" +msgstr "" + #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:14 msgid "No media have been created yet." msgstr "" @@ -22881,7 +23090,7 @@ msgid "PDF Editor" msgstr "" #: pretix/control/templates/pretixcontrol/pdf/index.html:36 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 msgid "Code" msgstr "" @@ -22942,6 +23151,11 @@ msgid "" "it to copy and share ticket designs, not to modify the design source code." msgstr "" +#: pretix/control/templates/pretixcontrol/pdf/index.html:156 +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:26 +msgid "Apply" +msgstr "" + #: pretix/control/templates/pretixcontrol/pdf/index.html:164 msgid "Uploading new PDF background…" msgstr "" @@ -23656,7 +23870,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:4 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:4 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:6 -#: pretix/control/templates/pretixcontrol/user/settings.html:45 +#: pretix/control/templates/pretixcontrol/user/settings.html:73 msgid "Two-factor authentication" msgstr "" @@ -23670,7 +23884,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:15 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:38 -#: pretix/control/templates/pretixcontrol/users/form.html:70 +#: pretix/control/templates/pretixcontrol/users/form.html:71 #, python-format msgid "Team \"%(team)s\" of organizer \"%(organizer)s\"" msgstr "" @@ -23780,6 +23994,36 @@ msgstr "" msgid "The old codes will no longer work." msgstr "" +#: pretix/control/templates/pretixcontrol/user/change_email.html:4 +#: pretix/control/templates/pretixcontrol/user/change_email.html:8 +msgid "Change login email address" +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/change_email.html:13 +msgid "" +"This changes the email address used to login to your account, as well as " +"where we send email notifications." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/change_email.html:18 +msgid "" +"We will send a confirmation code to your new email address, which you need " +"to enter in the next step to confirm the email address is correct." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/change_password.html:4 +#: pretix/control/templates/pretixcontrol/user/change_password.html:8 +#: pretix/control/templates/pretixcontrol/user/change_password.html:20 +#: pretix/control/templates/pretixcontrol/user/settings.html:67 +#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:28 +msgid "Change password" +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:4 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:8 +msgid "Enter confirmation code" +msgstr "" + #: pretix/control/templates/pretixcontrol/user/notifications.html:4 #: pretix/control/templates/pretixcontrol/user/notifications.html:6 msgid "Notification settings" @@ -23823,13 +24067,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/notifications.html:70 #: pretix/control/templates/pretixcontrol/user/notifications.html:72 -#: pretix/control/templates/pretixcontrol/user/settings.html:20 +#: pretix/control/templates/pretixcontrol/user/settings.html:38 msgid "On" msgstr "" #: pretix/control/templates/pretixcontrol/user/notifications.html:70 #: pretix/control/templates/pretixcontrol/user/notifications.html:71 -#: pretix/control/templates/pretixcontrol/user/settings.html:24 +#: pretix/control/templates/pretixcontrol/user/settings.html:42 msgid "Off" msgstr "" @@ -23863,23 +24107,34 @@ msgid "Log in as someone else" msgstr "" #: pretix/control/templates/pretixcontrol/user/settings.html:4 -#: pretix/control/templates/pretixcontrol/user/settings.html:6 +#: pretix/control/templates/pretixcontrol/user/settings.html:24 msgid "Account settings" msgstr "" -#: pretix/control/templates/pretixcontrol/user/settings.html:35 +#: pretix/control/templates/pretixcontrol/user/settings.html:9 +msgid "" +"Your email address is not confirmed yet. To secure your account, please " +"confirm your email address using a confirmation code we will send to your " +"email address." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/settings.html:18 +msgid "Send confirmation email" +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/settings.html:53 msgid "Login settings" msgstr "" -#: pretix/control/templates/pretixcontrol/user/settings.html:50 +#: pretix/control/templates/pretixcontrol/user/settings.html:78 msgid "Change two-factor settings" msgstr "" -#: pretix/control/templates/pretixcontrol/user/settings.html:65 +#: pretix/control/templates/pretixcontrol/user/settings.html:93 msgid "Show applications" msgstr "" -#: pretix/control/templates/pretixcontrol/user/settings.html:74 +#: pretix/control/templates/pretixcontrol/user/settings.html:102 msgid "Show account history" msgstr "" @@ -23958,15 +24213,15 @@ msgstr "" msgid "Authentication backend" msgstr "" -#: pretix/control/templates/pretixcontrol/users/form.html:65 +#: pretix/control/templates/pretixcontrol/users/form.html:66 msgid "Team memberships" msgstr "" -#: pretix/control/templates/pretixcontrol/users/form.html:89 +#: pretix/control/templates/pretixcontrol/users/form.html:90 msgid "User history" msgstr "" -#: pretix/control/templates/pretixcontrol/users/form.html:98 +#: pretix/control/templates/pretixcontrol/users/form.html:99 msgid "User created." msgstr "" @@ -24392,49 +24647,49 @@ msgid "" "team." msgstr "" -#: pretix/control/views/auth.py:266 +#: pretix/control/views/auth.py:269 #, python-brace-format msgid "You are now part of the team \"{}\"." msgstr "" -#: pretix/control/views/auth.py:296 +#: pretix/control/views/auth.py:300 #, python-brace-format msgid "Welcome to pretix! You are now part of the team \"{}\"." msgstr "" -#: pretix/control/views/auth.py:357 +#: pretix/control/views/auth.py:361 msgid "" "If the address is registered to valid account, then we have sent you an " "email containing further instructions. Please note that we will send at most " "one email every 24 hours." msgstr "" -#: pretix/control/views/auth.py:360 +#: pretix/control/views/auth.py:364 msgid "" "If the address is registered to valid account, then we have sent you an " "email containing further instructions." msgstr "" -#: pretix/control/views/auth.py:380 +#: pretix/control/views/auth.py:384 msgid "" "You clicked on an invalid link. Please check that you copied the full web " "address into your address bar. Please note that the link is only valid for " "three days and that the link can only be used once." msgstr "" -#: pretix/control/views/auth.py:383 +#: pretix/control/views/auth.py:387 msgid "We were unable to find the user you requested a new password for." msgstr "" -#: pretix/control/views/auth.py:421 +#: pretix/control/views/auth.py:425 msgid "You can now login using your new password." msgstr "" -#: pretix/control/views/auth.py:473 +#: pretix/control/views/auth.py:477 msgid "Please try again." msgstr "" -#: pretix/control/views/auth.py:551 +#: pretix/control/views/auth.py:555 msgid "Invalid code, please try again." msgstr "" @@ -24457,17 +24712,18 @@ msgstr "" #: pretix/control/views/checkin.py:381 pretix/control/views/checkin.py:441 #: pretix/control/views/discounts.py:134 pretix/control/views/discounts.py:182 #: pretix/control/views/event.py:275 pretix/control/views/event.py:579 -#: pretix/control/views/event.py:618 pretix/control/views/event.py:781 -#: pretix/control/views/event.py:973 pretix/control/views/event.py:1333 -#: pretix/control/views/event.py:1399 pretix/control/views/event.py:1551 -#: pretix/control/views/item.py:280 pretix/control/views/item.py:327 -#: pretix/control/views/item.py:805 pretix/control/views/item.py:831 -#: pretix/control/views/item.py:951 pretix/control/views/item.py:1155 -#: pretix/control/views/item.py:1321 pretix/control/views/item.py:1506 +#: pretix/control/views/event.py:618 pretix/control/views/event.py:800 +#: pretix/control/views/event.py:992 pretix/control/views/event.py:1342 +#: pretix/control/views/event.py:1408 pretix/control/views/event.py:1560 +#: pretix/control/views/item.py:281 pretix/control/views/item.py:328 +#: pretix/control/views/item.py:806 pretix/control/views/item.py:832 +#: pretix/control/views/item.py:952 pretix/control/views/item.py:1156 +#: pretix/control/views/item.py:1322 pretix/control/views/item.py:1518 #: pretix/control/views/organizer.py:275 pretix/control/views/organizer.py:303 #: pretix/control/views/organizer.py:1457 pretix/control/views/subevents.py:521 #: pretix/control/views/subevents.py:647 pretix/control/views/subevents.py:1063 -#: pretix/control/views/subevents.py:1522 pretix/control/views/user.py:358 +#: pretix/control/views/subevents.py:1522 pretix/control/views/user.py:345 +#: pretix/control/views/user.py:858 pretix/control/views/user.py:898 #: pretix/control/views/vouchers.py:277 pretix/control/views/vouchers.py:351 #: pretix/control/views/vouchers.py:534 pretix/control/views/waitinglist.py:420 #: pretix/plugins/autocheckin/views.py:112 @@ -24633,8 +24889,8 @@ msgstr "" msgid "The order of discounts has been updated." msgstr "" -#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:190 -#: pretix/control/views/item.py:402 pretix/control/views/item.py:536 +#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:191 +#: pretix/control/views/item.py:403 pretix/control/views/item.py:537 #: pretix/control/views/organizer.py:2558 #: pretix/control/views/organizer.py:3618 msgid "Some of the provided object ids are invalid." @@ -24665,112 +24921,112 @@ msgid "" "This payment provider does not exist or the respective plugin is disabled." msgstr "" -#: pretix/control/views/event.py:820 pretix/control/views/organizer.py:356 +#: pretix/control/views/event.py:839 pretix/control/views/organizer.py:356 #: pretix/control/views/vouchers.py:561 msgid "invalid item" msgstr "" -#: pretix/control/views/event.py:895 +#: pretix/control/views/event.py:914 #, python-format msgid "Your order: %(code)s" msgstr "" -#: pretix/control/views/event.py:904 +#: pretix/control/views/event.py:923 msgid "Unknown email renderer." msgstr "" -#: pretix/control/views/event.py:920 pretix/control/views/orders.py:679 +#: pretix/control/views/event.py:939 pretix/control/views/orders.py:684 #: pretix/presale/views/order.py:1111 pretix/presale/views/order.py:1118 msgid "You requested an invalid ticket output type." msgstr "" -#: pretix/control/views/event.py:1068 +#: pretix/control/views/event.py:1087 msgid "Your shop is live now!" msgstr "" -#: pretix/control/views/event.py:1076 +#: pretix/control/views/event.py:1095 msgid "We've taken your shop down. You can re-enable it whenever you want!" msgstr "" -#: pretix/control/views/event.py:1084 +#: pretix/control/views/event.py:1103 msgid "Your shop is now in test mode!" msgstr "" -#: pretix/control/views/event.py:1101 +#: pretix/control/views/event.py:1120 msgid "" "An order could not be deleted as some constraints (e.g. data created by plug-" "ins) do not allow it." msgstr "" -#: pretix/control/views/event.py:1107 +#: pretix/control/views/event.py:1126 msgid "We've disabled test mode for you. Let's sell some real tickets!" msgstr "" -#: pretix/control/views/event.py:1129 +#: pretix/control/views/event.py:1148 msgid "This event can not be deleted." msgstr "" -#: pretix/control/views/event.py:1152 +#: pretix/control/views/event.py:1171 msgid "The event has been deleted." msgstr "" -#: pretix/control/views/event.py:1155 +#: pretix/control/views/event.py:1174 msgid "" "The event could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." msgstr "" -#: pretix/control/views/event.py:1171 +#: pretix/control/views/event.py:1190 #, python-brace-format msgid "" "Specifically, the following plugins still contain data depends on this " "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:772 +#: pretix/control/views/event.py:1270 pretix/control/views/orders.py:777 msgid "The comment has been updated." msgstr "" -#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:774 +#: pretix/control/views/event.py:1272 pretix/control/views/orders.py:779 msgid "Could not update the comment." msgstr "" -#: pretix/control/views/event.py:1291 pretix/control/views/main.py:337 +#: pretix/control/views/event.py:1300 pretix/control/views/main.py:337 msgid "VAT" msgstr "" -#: pretix/control/views/event.py:1327 +#: pretix/control/views/event.py:1336 msgid "The new tax rule has been created." msgstr "" -#: pretix/control/views/event.py:1350 pretix/control/views/event.py:1413 -#: pretix/control/views/event.py:1459 +#: pretix/control/views/event.py:1359 pretix/control/views/event.py:1422 +#: pretix/control/views/event.py:1468 msgid "The requested tax rule does not exist." msgstr "" -#: pretix/control/views/event.py:1468 +#: pretix/control/views/event.py:1477 msgid "The selected tax rule has been deleted." msgstr "" -#: pretix/control/views/event.py:1470 +#: pretix/control/views/event.py:1479 msgid "The selected tax rule can not be deleted." msgstr "" -#: pretix/control/views/event.py:1521 +#: pretix/control/views/event.py:1530 msgid "Your event is not empty, you need to set it up manually." msgstr "" -#: pretix/control/views/event.py:1656 +#: pretix/control/views/event.py:1665 msgid "" "Your changes have been saved. You can now go on with looking at the details " "or take your event live to start selling!" msgstr "" -#: pretix/control/views/event.py:1675 +#: pretix/control/views/event.py:1684 msgid "Regular ticket" msgstr "" -#: pretix/control/views/event.py:1680 +#: pretix/control/views/event.py:1689 msgid "Reduced ticket" msgstr "" @@ -24850,130 +25106,130 @@ msgid "" "plugin \"{plugin}\" with license \"{license}\"." msgstr "" -#: pretix/control/views/item.py:139 pretix/control/views/item.py:1600 +#: pretix/control/views/item.py:140 pretix/control/views/item.py:1623 msgid "The requested product does not exist." msgstr "" -#: pretix/control/views/item.py:157 +#: pretix/control/views/item.py:158 msgid "The order of items has been updated." msgstr "" -#: pretix/control/views/item.py:225 pretix/control/views/item.py:260 -#: pretix/control/views/item.py:351 +#: pretix/control/views/item.py:226 pretix/control/views/item.py:261 +#: pretix/control/views/item.py:352 msgid "The requested product category does not exist." msgstr "" -#: pretix/control/views/item.py:236 +#: pretix/control/views/item.py:237 msgid "The selected category has been deleted." msgstr "" -#: pretix/control/views/item.py:321 +#: pretix/control/views/item.py:322 msgid "The new category has been created." msgstr "" -#: pretix/control/views/item.py:369 +#: pretix/control/views/item.py:370 msgid "The order of categories has been updated." msgstr "" -#: pretix/control/views/item.py:405 pretix/control/views/item.py:539 +#: pretix/control/views/item.py:406 pretix/control/views/item.py:540 #: pretix/control/views/organizer.py:2561 #: pretix/control/views/organizer.py:3621 msgid "Not all objects have been selected." msgstr "" -#: pretix/control/views/item.py:478 +#: pretix/control/views/item.py:479 msgid "Street" msgstr "" -#: pretix/control/views/item.py:580 pretix/control/views/item.py:759 -#: pretix/control/views/item.py:781 +#: pretix/control/views/item.py:581 pretix/control/views/item.py:760 +#: pretix/control/views/item.py:782 msgid "The requested question does not exist." msgstr "" -#: pretix/control/views/item.py:598 +#: pretix/control/views/item.py:599 msgid "The selected question has been deleted." msgstr "" -#: pretix/control/views/item.py:708 +#: pretix/control/views/item.py:709 msgid "File uploaded" msgstr "" -#: pretix/control/views/item.py:840 +#: pretix/control/views/item.py:841 msgid "The new question has been created." msgstr "" -#: pretix/control/views/item.py:919 +#: pretix/control/views/item.py:920 msgid "The new quota has been created." msgstr "" -#: pretix/control/views/item.py:982 +#: pretix/control/views/item.py:983 msgid "Exit scans" msgstr "" -#: pretix/control/views/item.py:989 +#: pretix/control/views/item.py:990 msgid "Vouchers and waiting list reservations" msgstr "" -#: pretix/control/views/item.py:1004 +#: pretix/control/views/item.py:1005 msgid "Available quota" msgstr "" -#: pretix/control/views/item.py:1010 +#: pretix/control/views/item.py:1011 msgid "Waiting list (pending)" msgstr "" -#: pretix/control/views/item.py:1017 +#: pretix/control/views/item.py:1018 msgid "Currently for sale" msgstr "" -#: pretix/control/views/item.py:1071 pretix/control/views/item.py:1117 -#: pretix/control/views/item.py:1171 +#: pretix/control/views/item.py:1072 pretix/control/views/item.py:1118 +#: pretix/control/views/item.py:1172 msgid "The requested quota does not exist." msgstr "" -#: pretix/control/views/item.py:1092 +#: pretix/control/views/item.py:1093 msgid "The quota has been re-opened and will not close again." msgstr "" -#: pretix/control/views/item.py:1185 +#: pretix/control/views/item.py:1186 msgid "The selected quota has been deleted." msgstr "" -#: pretix/control/views/item.py:1208 +#: pretix/control/views/item.py:1209 msgid "The requested item does not exist." msgstr "" -#: pretix/control/views/item.py:1380 +#: pretix/control/views/item.py:1381 msgid "" "You cannot add add-ons to a product that is only available as an add-on " "itself." msgstr "" -#: pretix/control/views/item.py:1390 +#: pretix/control/views/item.py:1391 msgid "" "You cannot add bundles to a product that is only available as an add-on " "itself." msgstr "" -#: pretix/control/views/item.py:1522 +#: pretix/control/views/item.py:1534 msgid "" "You disabled this item, but it is still part of a product bundle. Your " "participants won't be able to buy the bundle unless you remove this item " "from it." msgstr "" -#: pretix/control/views/item.py:1620 +#: pretix/control/views/item.py:1643 msgid "" "The product could not be deleted as some constraints (e.g. data created by " "plug-ins) did not allow it. Deleting it could break reporting or other " "functionality, so the product has been disabled instead." msgstr "" -#: pretix/control/views/item.py:1624 +#: pretix/control/views/item.py:1647 msgid "The selected product has been deleted." msgstr "" -#: pretix/control/views/item.py:1633 +#: pretix/control/views/item.py:1656 msgid "The selected product has been deactivated." msgstr "" @@ -25067,17 +25323,17 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "" -#: pretix/control/views/orders.py:194 +#: pretix/control/views/orders.py:197 msgid "We could not process your input. See below for details." msgstr "" -#: pretix/control/views/orders.py:267 +#: pretix/control/views/orders.py:270 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:681 pretix/presale/views/order.py:161 +#: pretix/control/views/orders.py:686 pretix/presale/views/order.py:161 #: pretix/presale/views/order.py:243 pretix/presale/views/order.py:337 #: pretix/presale/views/order.py:364 pretix/presale/views/order.py:432 #: pretix/presale/views/order.py:499 pretix/presale/views/order.py:545 @@ -25085,69 +25341,69 @@ msgstr "" #: pretix/presale/views/order.py:936 pretix/presale/views/order.py:951 #: pretix/presale/views/order.py:1000 pretix/presale/views/order.py:1005 #: pretix/presale/views/order.py:1120 pretix/presale/views/order.py:1297 -#: pretix/presale/views/order.py:1689 pretix/presale/views/order.py:1720 +#: pretix/presale/views/order.py:1692 pretix/presale/views/order.py:1723 msgid "Unknown order code or not authorized to access this order." msgstr "" -#: pretix/control/views/orders.py:683 pretix/presale/views/order.py:1125 +#: pretix/control/views/orders.py:688 pretix/presale/views/order.py:1125 msgid "Ticket download is not enabled for this product." msgstr "" -#: pretix/control/views/orders.py:808 +#: pretix/control/views/orders.py:813 msgid "The order has been deleted." msgstr "" -#: pretix/control/views/orders.py:815 +#: pretix/control/views/orders.py:820 msgid "" "The order could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." msgstr "" -#: pretix/control/views/orders.py:823 +#: pretix/control/views/orders.py:828 msgid "Only orders created in test mode can be deleted." msgstr "" -#: pretix/control/views/orders.py:844 +#: pretix/control/views/orders.py:849 msgid "The order has been denied and is therefore now canceled." msgstr "" -#: pretix/control/views/orders.py:884 +#: pretix/control/views/orders.py:889 msgid "This payment has been canceled." msgstr "" -#: pretix/control/views/orders.py:886 +#: pretix/control/views/orders.py:891 msgid "This payment can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:912 +#: pretix/control/views/orders.py:917 msgid "The refund has been canceled." msgstr "" -#: pretix/control/views/orders.py:914 +#: pretix/control/views/orders.py:919 msgid "This refund can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:948 +#: pretix/control/views/orders.py:953 msgid "The refund has been processed." msgstr "" -#: pretix/control/views/orders.py:950 pretix/control/views/orders.py:976 +#: pretix/control/views/orders.py:955 pretix/control/views/orders.py:981 msgid "This refund can not be processed at the moment." msgstr "" -#: pretix/control/views/orders.py:974 +#: pretix/control/views/orders.py:979 msgid "The refund has been marked as done." msgstr "" -#: pretix/control/views/orders.py:1000 +#: pretix/control/views/orders.py:1005 msgid "The request has been removed. If you want, you can now inform the user." msgstr "" -#: pretix/control/views/orders.py:1007 +#: pretix/control/views/orders.py:1012 msgid "Your cancellation request" msgstr "" -#: pretix/control/views/orders.py:1008 +#: pretix/control/views/orders.py:1013 #, python-brace-format msgid "" "Hello,\n" @@ -25158,72 +25414,72 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1064 +#: pretix/control/views/orders.py:1069 msgid "" "The payment has been marked as complete, but we were unable to send a " "confirmation mail." msgstr "" -#: pretix/control/views/orders.py:1067 +#: pretix/control/views/orders.py:1072 msgid "The payment has been marked as complete." msgstr "" -#: pretix/control/views/orders.py:1069 +#: pretix/control/views/orders.py:1074 msgid "This payment can not be confirmed at the moment." msgstr "" -#: pretix/control/views/orders.py:1160 +#: pretix/control/views/orders.py:1165 msgid "" "The refund was prevented due to a refund already being processed at the same " "time. Please have a look at the order details and check if your refund is " "still necessary." msgstr "" -#: pretix/control/views/orders.py:1261 +#: pretix/control/views/orders.py:1266 msgid "You entered an order in an event with a different currency." msgstr "" -#: pretix/control/views/orders.py:1312 +#: pretix/control/views/orders.py:1317 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "" -#: pretix/control/views/orders.py:1317 +#: pretix/control/views/orders.py:1322 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" -#: pretix/control/views/orders.py:1347 +#: pretix/control/views/orders.py:1352 #, python-brace-format msgid "" "One of the refunds failed to be processed. You should retry to refund in a " "different way. The error message was: {}" msgstr "" -#: pretix/control/views/orders.py:1353 +#: pretix/control/views/orders.py:1358 #, python-brace-format msgid "A refund of {} has been processed." msgstr "" -#: pretix/control/views/orders.py:1357 +#: pretix/control/views/orders.py:1362 #, python-brace-format msgid "" "A refund of {} has been saved, but not yet fully executed. You can mark it " "as complete below." msgstr "" -#: pretix/control/views/orders.py:1386 +#: pretix/control/views/orders.py:1391 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1394 +#: pretix/control/views/orders.py:1399 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1396 +#: pretix/control/views/orders.py:1401 #, python-brace-format msgid "" "Hello,\n" @@ -25236,201 +25492,201 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1407 +#: pretix/control/views/orders.py:1412 msgid "The refunds you selected do not match the selected total refund amount." msgstr "" -#: pretix/control/views/orders.py:1537 +#: pretix/control/views/orders.py:1542 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." msgstr "" -#: pretix/control/views/orders.py:1540 +#: pretix/control/views/orders.py:1545 msgid "The payment has been created successfully." msgstr "" -#: pretix/control/views/orders.py:1554 +#: pretix/control/views/orders.py:1559 msgid "" "The order has been canceled. You can now select how you want to transfer the " "money back to the user." msgstr "" -#: pretix/control/views/orders.py:1625 pretix/control/views/orders.py:1629 +#: pretix/control/views/orders.py:1630 pretix/control/views/orders.py:1634 msgid "No VAT ID specified." msgstr "" -#: pretix/control/views/orders.py:1633 +#: pretix/control/views/orders.py:1638 msgid "No country specified." msgstr "" -#: pretix/control/views/orders.py:1637 +#: pretix/control/views/orders.py:1642 msgid "VAT ID could not be checked since this country is not supported." msgstr "" -#: pretix/control/views/orders.py:1648 +#: pretix/control/views/orders.py:1653 msgid "" "The VAT ID could not be checked, as the VAT checking service of the country " "is currently not available." msgstr "" -#: pretix/control/views/orders.py:1651 +#: pretix/control/views/orders.py:1656 msgid "This VAT ID is valid." msgstr "" -#: pretix/control/views/orders.py:1665 pretix/control/views/orders.py:1699 -#: pretix/control/views/orders.py:1731 +#: pretix/control/views/orders.py:1670 pretix/control/views/orders.py:1704 +#: pretix/control/views/orders.py:1736 msgid "Unknown invoice." msgstr "" -#: pretix/control/views/orders.py:1668 +#: pretix/control/views/orders.py:1673 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1670 +#: pretix/control/views/orders.py:1675 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1672 pretix/control/views/orders.py:1734 +#: pretix/control/views/orders.py:1677 pretix/control/views/orders.py:1739 msgid "The invoice has already been canceled." msgstr "" -#: pretix/control/views/orders.py:1674 +#: pretix/control/views/orders.py:1679 msgid "The invoice file has already been exported." msgstr "" -#: pretix/control/views/orders.py:1676 +#: pretix/control/views/orders.py:1681 msgid "The invoice file is too old to be regenerated." msgstr "" -#: pretix/control/views/orders.py:1678 pretix/control/views/orders.py:1736 +#: pretix/control/views/orders.py:1683 pretix/control/views/orders.py:1741 msgid "The invoice has been cleaned of personal data." msgstr "" -#: pretix/control/views/orders.py:1703 +#: pretix/control/views/orders.py:1708 msgid "" "The invoice is currently being transmitted. You can start a new attempt " "after the current one has been completed." msgstr "" -#: pretix/control/views/orders.py:1710 +#: pretix/control/views/orders.py:1715 msgid "The invoice has been scheduled for retransmission." msgstr "" -#: pretix/control/views/orders.py:1767 +#: pretix/control/views/orders.py:1791 msgid "The email has been queued to be sent." msgstr "" -#: pretix/control/views/orders.py:1791 pretix/presale/views/order.py:1306 +#: pretix/control/views/orders.py:1815 pretix/presale/views/order.py:1306 msgid "This invoice has not been found" msgstr "" -#: pretix/control/views/orders.py:1798 pretix/presale/views/order.py:1313 +#: pretix/control/views/orders.py:1822 pretix/presale/views/order.py:1313 msgid "The invoice file is no longer stored on the server." msgstr "" -#: pretix/control/views/orders.py:1803 pretix/presale/views/order.py:1318 +#: pretix/control/views/orders.py:1827 pretix/presale/views/order.py:1318 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." msgstr "" -#: pretix/control/views/orders.py:1831 +#: pretix/control/views/orders.py:1855 msgid "The payment term has been changed." msgstr "" -#: pretix/control/views/orders.py:1836 pretix/control/views/orders.py:1893 +#: pretix/control/views/orders.py:1860 pretix/control/views/orders.py:1917 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "" -#: pretix/control/views/orders.py:1844 +#: pretix/control/views/orders.py:1868 msgid "This action is only allowed for pending orders." msgstr "" -#: pretix/control/views/orders.py:1899 +#: pretix/control/views/orders.py:1923 msgid "This action is only allowed for canceled orders." msgstr "" -#: pretix/control/views/orders.py:2156 pretix/presale/views/order.py:1592 +#: pretix/control/views/orders.py:2181 pretix/presale/views/order.py:1593 msgid "An error occurred. Please see the details below." msgstr "" -#: pretix/control/views/orders.py:2164 +#: pretix/control/views/orders.py:2189 msgid "The order has been changed and the user has been notified." msgstr "" -#: pretix/control/views/orders.py:2166 pretix/control/views/orders.py:2302 -#: pretix/control/views/orders.py:2339 pretix/presale/views/order.py:1627 +#: pretix/control/views/orders.py:2191 pretix/control/views/orders.py:2327 +#: pretix/control/views/orders.py:2364 pretix/presale/views/order.py:1629 msgid "The order has been changed." msgstr "" -#: pretix/control/views/orders.py:2193 pretix/presale/checkoutflow.py:945 +#: pretix/control/views/orders.py:2218 pretix/presale/checkoutflow.py:943 #: pretix/presale/views/order.py:793 pretix/presale/views/order.py:911 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "" -#: pretix/control/views/orders.py:2304 +#: pretix/control/views/orders.py:2329 msgid "Nothing about the order had to be changed." msgstr "" -#: pretix/control/views/orders.py:2385 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2410 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "" -#: pretix/control/views/orders.py:2401 pretix/control/views/orders.py:2471 +#: pretix/control/views/orders.py:2426 pretix/control/views/orders.py:2496 #: pretix/plugins/sendmail/views.py:204 pretix/plugins/sendmail/views.py:671 #, python-brace-format msgid "Subject: {subject}" msgstr "" -#: pretix/control/views/orders.py:2420 pretix/control/views/orders.py:2491 +#: pretix/control/views/orders.py:2445 pretix/control/views/orders.py:2516 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "" -#: pretix/control/views/orders.py:2424 pretix/control/views/orders.py:2494 +#: pretix/control/views/orders.py:2449 pretix/control/views/orders.py:2519 #, python-brace-format msgid "Failed to send mail to the following user: {}" msgstr "" -#: pretix/control/views/orders.py:2547 pretix/presale/views/order.py:1085 +#: pretix/control/views/orders.py:2572 pretix/presale/views/order.py:1085 msgid "" "This link is no longer valid. Please go back, refresh the page, and try " "again." msgstr "" -#: pretix/control/views/orders.py:2628 +#: pretix/control/views/orders.py:2653 msgid "There is no order with the given order code." msgstr "" -#: pretix/control/views/orders.py:2734 pretix/control/views/organizer.py:2074 +#: pretix/control/views/orders.py:2759 pretix/control/views/organizer.py:2074 msgid "The selected exporter was not found." msgstr "" -#: pretix/control/views/orders.py:2744 pretix/control/views/organizer.py:2084 +#: pretix/control/views/orders.py:2769 pretix/control/views/organizer.py:2084 msgid "There was a problem processing your input. See below for error details." msgstr "" -#: pretix/control/views/orders.py:2779 pretix/control/views/organizer.py:2127 +#: pretix/control/views/orders.py:2804 pretix/control/views/organizer.py:2127 #, python-brace-format msgid "" "Your export schedule has been saved. The next export will start around " "{datetime}." msgstr "" -#: pretix/control/views/orders.py:2784 pretix/control/views/organizer.py:2132 +#: pretix/control/views/orders.py:2809 pretix/control/views/organizer.py:2132 msgid "Your export schedule has been saved, but no next export is planned." msgstr "" -#: pretix/control/views/orders.py:2823 pretix/control/views/organizer.py:2172 +#: pretix/control/views/orders.py:2848 pretix/control/views/organizer.py:2172 #, python-brace-format msgid "Export: {title}" msgstr "" -#: pretix/control/views/orders.py:2824 pretix/control/views/organizer.py:2174 +#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2174 #, python-brace-format msgid "" "Hello,\n" @@ -25438,31 +25694,31 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2851 pretix/control/views/organizer.py:2207 +#: pretix/control/views/orders.py:2876 pretix/control/views/organizer.py:2207 msgid "" "Your user account does not have sufficient permission to run this report, " "therefore you cannot schedule it." msgstr "" -#: pretix/control/views/orders.py:2904 pretix/control/views/organizer.py:2259 +#: pretix/control/views/orders.py:2929 pretix/control/views/organizer.py:2259 msgid "" "Your export is queued to start soon. The results will be send via email. " "Depending on system load and type and size of export, this may take a few " "minutes." msgstr "" -#: pretix/control/views/orders.py:2991 pretix/control/views/orders.py:3072 +#: pretix/control/views/orders.py:3016 pretix/control/views/orders.py:3097 msgid "All orders have been canceled." msgstr "" -#: pretix/control/views/orders.py:2993 pretix/control/views/orders.py:3074 +#: pretix/control/views/orders.py:3018 pretix/control/views/orders.py:3099 #, python-brace-format msgid "" "The orders have been canceled. An error occurred with {count} orders, please " "check all uncanceled orders." msgstr "" -#: pretix/control/views/orders.py:3021 pretix/control/views/orders.py:3095 +#: pretix/control/views/orders.py:3046 pretix/control/views/orders.py:3120 msgid "Your input was not valid." msgstr "" @@ -25744,19 +26000,19 @@ msgstr "" msgid "The order of sales channels has been updated." msgstr "" -#: pretix/control/views/pdf.py:83 +#: pretix/control/views/pdf.py:85 msgid "The uploaded PDF file is too large." msgstr "" -#: pretix/control/views/pdf.py:85 +#: pretix/control/views/pdf.py:87 msgid "The uploaded PDF file is too small." msgstr "" -#: pretix/control/views/pdf.py:87 +#: pretix/control/views/pdf.py:89 msgid "Please only upload PDF files." msgstr "" -#: pretix/control/views/pdf.py:228 +#: pretix/control/views/pdf.py:233 #, python-brace-format msgid "Unfortunately, we were unable to process this PDF file ({reason})." msgstr "" @@ -25831,87 +26087,114 @@ msgstr "" msgid "Voucher {}" msgstr "" -#: pretix/control/views/user.py:162 +#: pretix/control/views/user.py:167 msgid "The password you entered was invalid, please try again." msgstr "" -#: pretix/control/views/user.py:350 +#: pretix/control/views/user.py:337 msgid "Security devices are only available if pretix is served via HTTPS." msgstr "" -#: pretix/control/views/user.py:387 +#: pretix/control/views/user.py:374 msgid "A two-factor authentication device has been removed from your account." msgstr "" -#: pretix/control/views/user.py:398 +#: pretix/control/views/user.py:385 msgid "The device has been removed." msgstr "" -#: pretix/control/views/user.py:463 +#: pretix/control/views/user.py:450 msgid "This security device is already registered." msgstr "" -#: pretix/control/views/user.py:482 pretix/control/views/user.py:543 +#: pretix/control/views/user.py:469 pretix/control/views/user.py:530 msgid "A new two-factor authentication device has been added to your account." msgstr "" -#: pretix/control/views/user.py:498 pretix/control/views/user.py:558 +#: pretix/control/views/user.py:485 pretix/control/views/user.py:545 msgid "" "Please note that you still need to enable two-factor authentication for your " "account using the buttons below to make a second factor required for logging " "into your account." msgstr "" -#: pretix/control/views/user.py:501 pretix/control/views/user.py:561 +#: pretix/control/views/user.py:488 pretix/control/views/user.py:548 msgid "The device has been verified and can now be used." msgstr "" -#: pretix/control/views/user.py:504 +#: pretix/control/views/user.py:491 msgid "The registration could not be completed. Please try again." msgstr "" -#: pretix/control/views/user.py:564 +#: pretix/control/views/user.py:551 msgid "" "The code you entered was not valid. If this problem persists, please check " "that the date and time of your phone are configured correctly." msgstr "" -#: pretix/control/views/user.py:584 +#: pretix/control/views/user.py:571 msgid "You have left all teams that require two-factor authentication." msgstr "" -#: pretix/control/views/user.py:598 +#: pretix/control/views/user.py:585 msgid "" "Please configure at least one device before enabling two-factor " "authentication." msgstr "" -#: pretix/control/views/user.py:607 +#: pretix/control/views/user.py:594 msgid "Two-factor authentication is now enabled for your account." msgstr "" -#: pretix/control/views/user.py:623 +#: pretix/control/views/user.py:610 msgid "Two-factor authentication is now disabled for your account." msgstr "" -#: pretix/control/views/user.py:646 +#: pretix/control/views/user.py:633 msgid "" "Your emergency codes have been newly generated. Remember to store them in a " "safe place in case you lose access to your devices." msgstr "" -#: pretix/control/views/user.py:662 +#: pretix/control/views/user.py:649 msgid "Your notifications have been disabled." msgstr "" -#: pretix/control/views/user.py:711 pretix/control/views/user.py:751 +#: pretix/control/views/user.py:698 pretix/control/views/user.py:738 msgid "Your notification settings have been saved." msgstr "" -#: pretix/control/views/user.py:829 +#: pretix/control/views/user.py:816 msgid "Your comment has been saved." msgstr "" +#: pretix/control/views/user.py:905 +msgid "Your email address was already verified." +msgstr "" + +#: pretix/control/views/user.py:927 +#, python-brace-format +msgid "" +"Please enter the confirmation code we sent to your email address " +"{email}." +msgstr "" + +#: pretix/control/views/user.py:947 +msgid "We were unable to verify your confirmation code. Please try again." +msgstr "" + +#: pretix/control/views/user.py:972 +msgid "Your email address has been changed successfully." +msgstr "" + +#: pretix/control/views/user.py:974 +msgid "Your email address has been confirmed successfully." +msgstr "" + +#: pretix/control/views/user.py:978 +msgid "The entered confirmation code is not correct. Please try again." +msgstr "" + #: pretix/control/views/users.py:150 msgid "We sent out an email containing further instructions." msgstr "" @@ -26548,20 +26831,18 @@ msgstr "" #: pretix/plugins/banktransfer/payment.py:97 #: pretix/plugins/banktransfer/payment.py:301 #: pretix/plugins/banktransfer/payment.py:491 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:16 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:15 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:18 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:50 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:6 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:24 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:26 msgid "IBAN" msgstr "" #: pretix/plugins/banktransfer/payment.py:107 #: pretix/plugins/banktransfer/payment.py:302 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:17 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:16 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:19 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:66 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:27 msgid "BIC" msgstr "" @@ -26653,11 +26934,10 @@ msgstr "" #: pretix/plugins/banktransfer/payment.py:300 #: pretix/plugins/banktransfer/payment.py:488 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:15 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:5 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 -#: pretix/plugins/banktransfer/views.py:829 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 +#: pretix/plugins/banktransfer/views.py:831 #: pretix/plugins/stripe/payment.py:1458 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35 @@ -26665,9 +26945,8 @@ msgid "Account holder" msgstr "" #: pretix/plugins/banktransfer/payment.py:303 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:18 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:17 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:26 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:28 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:39 @@ -26698,7 +26977,7 @@ msgstr "" msgid "Your input was invalid, please see below for details." msgstr "" -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:10 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:41 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:9 @@ -26707,7 +26986,7 @@ msgstr "" msgid "Payer" msgstr "" -#: pretix/plugins/banktransfer/refund_export.py:93 +#: pretix/plugins/banktransfer/refund_export.py:90 msgid "Refund" msgstr "" @@ -26729,35 +27008,30 @@ msgstr "" msgid "Currencies do not match." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:7 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:6 msgid "" "After completing your purchase, we will ask you to transfer the money to the " "following bank account, using a personal reference code:" msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:12 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:11 msgid "" "Please do not yet start a payment. We'll assign you a personal reference " "code after you completed the order." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:27 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:26 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:39 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:22 msgid "Reference code (important):" msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:32 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:31 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:30 msgid "" "We will assign you a personal reference code to use after you completed the " "order." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:37 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:35 msgid "" "After completing your purchase, we will ask you to transfer the money to our " "bank account, using a personal reference code." @@ -26905,34 +27179,34 @@ msgstr "" msgid "Review invalid and ignored payments" msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:38 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:27 msgid "Amount:" msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:42 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:35 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:30 msgid "There is no further action required on this website." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:43 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:36 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:31 msgid "We will send you an email as soon as we received your payment." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:57 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:69 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:92 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:50 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:62 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:85 msgid "" "Scan this image with your banking app’s QR-Reader to start the payment " "process." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:90 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:83 msgid "Open BezahlCode in your banking app to start the payment process." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:129 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:122 msgid "Scan the QR code with your banking app" msgstr "" @@ -27154,14 +27428,14 @@ msgstr "" msgid "No currency has been selected." msgstr "" -#: pretix/plugins/banktransfer/views.py:712 +#: pretix/plugins/banktransfer/views.py:713 #, python-brace-format msgid "" "We could not find bank account information for the refund {refund_id}. It " "was marked as failed." msgstr "" -#: pretix/plugins/banktransfer/views.py:745 +#: pretix/plugins/banktransfer/views.py:747 msgid "No valid orders have been found." msgstr "" @@ -27278,7 +27552,7 @@ msgid "Upload time" msgstr "" #: pretix/plugins/checkinlists/exporters.py:830 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:519 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:523 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" @@ -27474,15 +27748,15 @@ msgstr "" msgid "Click here in order to open the window." msgstr "" -#: pretix/plugins/paypal/views.py:107 pretix/plugins/paypal2/views.py:321 +#: pretix/plugins/paypal/views.py:107 pretix/plugins/paypal2/views.py:322 msgid "Invalid response from PayPal received." msgstr "" -#: pretix/plugins/paypal/views.py:123 pretix/plugins/paypal2/views.py:342 +#: pretix/plugins/paypal/views.py:123 pretix/plugins/paypal2/views.py:343 msgid "It looks like you canceled the PayPal payment" msgstr "" -#: pretix/plugins/paypal/views.py:255 pretix/plugins/paypal2/views.py:536 +#: pretix/plugins/paypal/views.py:255 pretix/plugins/paypal2/views.py:537 msgid "Your PayPal account has been disconnected." msgstr "" @@ -27588,7 +27862,7 @@ msgid "" "to send any payments." msgstr "" -#: pretix/plugins/paypal2/payment.py:335 pretix/plugins/paypal2/views.py:250 +#: pretix/plugins/paypal2/payment.py:335 pretix/plugins/paypal2/views.py:251 msgid "An error occurred during connecting with PayPal, please try again." msgstr "" @@ -27765,7 +28039,7 @@ msgid "Please turn on JavaScript." msgstr "" #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:85 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57 msgid "Please select how you want to pay." msgstr "" @@ -27775,31 +28049,31 @@ msgid "" "or contact us." msgstr "" -#: pretix/plugins/paypal2/views.py:223 +#: pretix/plugins/paypal2/views.py:224 msgid "" "An error occurred returning from PayPal: request parameters missing. Please " "try again." msgstr "" -#: pretix/plugins/paypal2/views.py:259 +#: pretix/plugins/paypal2/views.py:260 msgid "" "An error occurred returning from PayPal: result parameters missing. Please " "try again." msgstr "" -#: pretix/plugins/paypal2/views.py:264 +#: pretix/plugins/paypal2/views.py:265 msgid "" "An error occurred returning from PayPal: session parameter not matching. " "Please try again." msgstr "" -#: pretix/plugins/paypal2/views.py:269 +#: pretix/plugins/paypal2/views.py:270 msgid "" "The email address on your PayPal account has not yet been confirmed. You " "will need to do this before you can start accepting payments." msgstr "" -#: pretix/plugins/paypal2/views.py:275 +#: pretix/plugins/paypal2/views.py:276 msgid "" "Your PayPal account is now connected to pretix. You can change the settings " "in detail below." @@ -27838,10 +28112,6 @@ msgstr "" msgid "Split event series by date" msgstr "" -#: pretix/plugins/reports/accountingreport.py:129 -msgid "End" -msgstr "" - #: pretix/plugins/reports/accountingreport.py:140 msgid "Report includes test orders which may be deleted later!" msgstr "" @@ -27874,7 +28144,7 @@ msgstr "" msgid "Gift card transactions (debit)" msgstr "" -#: pretix/plugins/reports/accountingreport.py:883 +#: pretix/plugins/reports/accountingreport.py:889 msgid "Open items" msgstr "" @@ -29223,8 +29493,7 @@ msgstr "" #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html:5 msgid "" "After you submitted your order, we will redirect you to the payment service " -"provider to complete your payment. You will then be redirected back here to " -"get your tickets." +"provider to complete your payment. You will then be redirected back here." msgstr "" #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_card.html:9 @@ -29572,115 +29841,115 @@ msgstr "" msgid "Web Check-in" msgstr "" -#: pretix/presale/checkoutflow.py:119 +#: pretix/presale/checkoutflow.py:117 msgctxt "checkoutflow" msgid "Step" msgstr "" -#: pretix/presale/checkoutflow.py:251 +#: pretix/presale/checkoutflow.py:249 msgctxt "checkoutflow" msgid "Customer account" msgstr "" -#: pretix/presale/checkoutflow.py:338 +#: pretix/presale/checkoutflow.py:336 msgid "We failed to process your authentication request, please try again." msgstr "" -#: pretix/presale/checkoutflow.py:401 +#: pretix/presale/checkoutflow.py:399 msgctxt "checkoutflow" msgid "Membership" msgstr "" -#: pretix/presale/checkoutflow.py:449 pretix/presale/checkoutflow.py:470 +#: pretix/presale/checkoutflow.py:447 pretix/presale/checkoutflow.py:468 msgid "" "Your cart includes a product that requires an active membership to be " "selected." msgstr "" -#: pretix/presale/checkoutflow.py:489 +#: pretix/presale/checkoutflow.py:487 msgctxt "checkoutflow" msgid "Add-on products" msgstr "" -#: pretix/presale/checkoutflow.py:678 pretix/presale/checkoutflow.py:686 +#: pretix/presale/checkoutflow.py:676 pretix/presale/checkoutflow.py:684 #: pretix/presale/views/cart.py:195 pretix/presale/views/cart.py:200 #: pretix/presale/views/cart.py:218 pretix/presale/views/cart.py:231 #: pretix/presale/views/order.py:1514 pretix/presale/views/order.py:1522 msgid "Please enter numbers only." msgstr "" -#: pretix/presale/checkoutflow.py:760 +#: pretix/presale/checkoutflow.py:758 msgctxt "checkoutflow" msgid "Your information" msgstr "" -#: pretix/presale/checkoutflow.py:994 +#: pretix/presale/checkoutflow.py:992 msgid "" "Unfortunately, based on the invoice address you entered, we're not able to " "sell you the selected products for tax-related legal reasons." msgstr "" -#: pretix/presale/checkoutflow.py:1000 +#: pretix/presale/checkoutflow.py:998 msgid "" "Due to the invoice address you entered, we need to apply a different tax " "rate to your purchase and the price of the products in your cart has changed " "accordingly." msgstr "" -#: pretix/presale/checkoutflow.py:1024 pretix/presale/checkoutflow.py:1030 +#: pretix/presale/checkoutflow.py:1022 pretix/presale/checkoutflow.py:1028 msgid "Please enter a valid email address." msgstr "" -#: pretix/presale/checkoutflow.py:1037 +#: pretix/presale/checkoutflow.py:1035 msgid "Please enter your invoicing address." msgstr "" -#: pretix/presale/checkoutflow.py:1041 +#: pretix/presale/checkoutflow.py:1039 msgid "Please enter your name." msgstr "" -#: pretix/presale/checkoutflow.py:1076 pretix/presale/checkoutflow.py:1081 -#: pretix/presale/checkoutflow.py:1086 pretix/presale/checkoutflow.py:1091 -#: pretix/presale/checkoutflow.py:1096 +#: pretix/presale/checkoutflow.py:1074 pretix/presale/checkoutflow.py:1079 +#: pretix/presale/checkoutflow.py:1084 pretix/presale/checkoutflow.py:1089 +#: pretix/presale/checkoutflow.py:1094 msgid "Please fill in answers to all required questions." msgstr "" -#: pretix/presale/checkoutflow.py:1259 +#: pretix/presale/checkoutflow.py:1257 msgctxt "checkoutflow" msgid "Payment" msgstr "" -#: pretix/presale/checkoutflow.py:1372 +#: pretix/presale/checkoutflow.py:1368 #, python-brace-format msgid "" "Your payment method has been applied, but {} still need to be paid. Please " "select a payment method for the remainder." msgstr "" -#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:679 +#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:679 msgid "Please select a payment method." msgstr "" -#: pretix/presale/checkoutflow.py:1424 pretix/presale/checkoutflow.py:1438 -#: pretix/presale/checkoutflow.py:1449 +#: pretix/presale/checkoutflow.py:1425 pretix/presale/checkoutflow.py:1445 +#: pretix/presale/checkoutflow.py:1456 msgid "Please select a payment method to proceed." msgstr "" -#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:438 +#: pretix/presale/checkoutflow.py:1461 pretix/presale/views/order.py:438 #: pretix/presale/views/order.py:505 msgid "The payment information you entered was incomplete." msgstr "" -#: pretix/presale/checkoutflow.py:1499 +#: pretix/presale/checkoutflow.py:1506 msgctxt "checkoutflow" msgid "Review order" msgstr "" -#: pretix/presale/checkoutflow.py:1593 +#: pretix/presale/checkoutflow.py:1604 msgid "You need to check all checkboxes on the bottom of the page." msgstr "" -#: pretix/presale/checkoutflow.py:1648 +#: pretix/presale/checkoutflow.py:1659 msgid "" "There was an error sending the confirmation mail. Please try again later." msgstr "" @@ -29805,8 +30074,8 @@ msgstr "" #: pretix/presale/forms/order.py:113 pretix/presale/forms/order.py:121 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:171 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:311 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:188 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:341 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:204 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:369 #: pretix/presale/templates/pretixpresale/event/voucher.html:198 #: pretix/presale/templates/pretixpresale/event/voucher.html:353 msgid "plus taxes" @@ -29841,21 +30110,38 @@ msgctxt "form" msgid "required" msgstr "" -#: pretix/presale/ical.py:85 pretix/presale/ical.py:141 +#: pretix/presale/ical.py:87 pretix/presale/ical.py:146 +#: pretix/presale/ical.py:182 #, python-brace-format msgid "Tickets: {url}" msgstr "" -#: pretix/presale/ical.py:88 pretix/presale/ical.py:143 +#: pretix/presale/ical.py:90 pretix/presale/ical.py:184 #, python-brace-format msgid "Admission: {datetime}" msgstr "" -#: pretix/presale/ical.py:92 pretix/presale/ical.py:148 +#: pretix/presale/ical.py:94 pretix/presale/ical.py:154 +#: pretix/presale/ical.py:189 #, python-brace-format msgid "Organizer: {organizer}" msgstr "" +#: pretix/presale/ical.py:139 +#, python-brace-format +msgid "{event} - {item}" +msgstr "" + +#: pretix/presale/ical.py:147 +#, python-brace-format +msgid "Start: {datetime}" +msgstr "" + +#: pretix/presale/ical.py:150 +#, python-brace-format +msgid "End: {datetime}" +msgstr "" + #: pretix/presale/templates/pretixpresale/base.html:44 msgctxt "skip-to-main-nav" msgid "Skip link" @@ -30005,7 +30291,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:209 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:121 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:75 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:163 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:135 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:189 #: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:28 #: pretix/presale/templates/pretixpresale/organizers/customer_profile_delete.html:28 @@ -30179,28 +30465,28 @@ msgid "" "product." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:13 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:30 msgid "You already selected the following payment methods:" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:58 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:30 msgid "Remove payment" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:68 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:40 msgid "Remaining balance" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:69 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 msgid "Please select a payment method below." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:54 msgid "Please select how you want to pay the remaining balance:" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:110 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 #: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45 #, python-format msgid "(%(count)s available)" @@ -30208,27 +30494,27 @@ msgid_plural "(%(count)s available)" msgstr[0] "" msgstr[1] "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:129 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:101 msgid "This sales channel does not provide support for test mode." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:131 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:103 msgid "If you continue, you might pay an actual order with non-existing money!" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:139 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:111 msgid "This payment provider does not provide support for test mode." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:141 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:113 msgid "If you continue, actual money might be transferred." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:152 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:124 msgid "There are no payment providers enabled." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:154 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:126 msgid "" "Please go to the payment settings and activate one or more payment providers." msgstr "" @@ -30309,8 +30595,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:64 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:258 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:55 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:279 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:59 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:307 #: pretix/presale/templates/pretixpresale/event/voucher.html:293 #, python-format msgid "minimum amount to order: %(num)s" @@ -30321,9 +30607,9 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:185 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:300 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:325 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:77 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:176 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:329 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:81 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:192 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:357 #: pretix/presale/templates/pretixpresale/event/voucher.html:117 #: pretix/presale/templates/pretixpresale/event/voucher.html:186 #: pretix/presale/templates/pretixpresale/event/voucher.html:341 @@ -30332,31 +30618,31 @@ msgid "free" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:78 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:65 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:69 #, python-format msgid "from %(price)s" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:83 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:70 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:74 #, python-format msgid "from %(from_price)s to %(to_price)s" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:105 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 msgid "Hide variants" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:113 msgid "Show variants" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:129 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:271 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:135 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:290 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:318 #: pretix/presale/templates/pretixpresale/event/voucher.html:147 #: pretix/presale/templates/pretixpresale/event/voucher.html:304 msgid "Original price:" @@ -30364,8 +30650,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:145 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:300 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:161 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:328 #: pretix/presale/templates/pretixpresale/event/voucher.html:157 #: pretix/presale/templates/pretixpresale/event/voucher.html:314 msgid "New price:" @@ -30375,10 +30661,10 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:150 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:289 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:291 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:162 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:164 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:316 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:318 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:178 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:180 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:344 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:346 #: pretix/presale/templates/pretixpresale/event/voucher.html:173 #: pretix/presale/templates/pretixpresale/event/voucher.html:175 #: pretix/presale/templates/pretixpresale/event/voucher.html:328 @@ -30389,9 +30675,9 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:153 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:294 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:167 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:321 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:183 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:349 #: pretix/presale/templates/pretixpresale/event/voucher.html:163 #: pretix/presale/templates/pretixpresale/event/voucher.html:178 #: pretix/presale/templates/pretixpresale/event/voucher.html:333 @@ -30401,8 +30687,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:173 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:313 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:190 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:343 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:206 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:371 #: pretix/presale/templates/pretixpresale/event/voucher.html:200 #: pretix/presale/templates/pretixpresale/event/voucher.html:355 msgid "incl. taxes" @@ -30410,8 +30696,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:176 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:316 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:194 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:347 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:210 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:375 #: pretix/presale/templates/pretixpresale/event/voucher.html:204 #: pretix/presale/templates/pretixpresale/event/voucher.html:359 #, python-format @@ -30420,8 +30706,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:180 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:320 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:200 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:353 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:216 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:381 #: pretix/presale/templates/pretixpresale/event/voucher.html:210 #: pretix/presale/templates/pretixpresale/event/voucher.html:365 #, python-format @@ -30430,8 +30716,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:203 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:349 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:221 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:373 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:237 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:401 #: pretix/presale/templates/pretixpresale/event/voucher.html:230 #: pretix/presale/templates/pretixpresale/event/voucher.html:385 msgctxt "checkbox" @@ -30440,8 +30726,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:208 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:354 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:226 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:378 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:242 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:406 #: pretix/presale/templates/pretixpresale/event/voucher.html:235 #: pretix/presale/templates/pretixpresale/event/voucher.html:390 msgid "Decrease quantity" @@ -30449,8 +30735,8 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:218 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:364 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:237 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:390 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:253 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:418 #: pretix/presale/templates/pretixpresale/event/voucher.html:242 #: pretix/presale/templates/pretixpresale/event/voucher.html:398 msgid "Increase quantity" @@ -30474,17 +30760,17 @@ msgid "Not available any more." msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:23 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:89 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:93 msgid "SOLD OUT" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:25 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:87 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:91 msgid "FULLY BOOKED" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:37 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:97 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:101 #: pretix/presale/templates/pretixpresale/fragment_calendar.html:99 #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:104 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:30 @@ -30620,39 +30906,39 @@ msgstr "" msgid "Current value:" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:467 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:471 #, python-format msgid "One product" msgid_plural "%(num)s products" msgstr[0] "" msgstr[1] "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:481 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:485 #, python-format msgid "incl. %(tax_sum)s taxes" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:501 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505 #, python-format msgid "The items in your cart are reserved for you for %(minutes)s minutes." msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509 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 "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:510 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514 #: pretix/presale/templates/pretixpresale/fragment_modals.html:48 msgid "Renew reservation" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:522 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526 msgid "Reservation renewed" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:528 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:532 msgid "Overview of your ordered products." msgstr "" @@ -30914,40 +31200,48 @@ msgstr "" msgid "Payment pending" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:19 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:21 msgid "Your order qualifies for a discount" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:28 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:30 #: pretix/presale/templates/pretixpresale/event/voucher.html:77 msgid "Uncategorized items" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:40 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:261 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:42 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:277 #: pretix/presale/templates/pretixpresale/event/voucher.html:94 #: pretix/presale/templates/pretixpresale/event/voucher.html:275 #, python-format msgid "Show full-size image of %(item)s" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:193 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:346 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288 +#, python-format +msgid "%(amount)s× in your cart" +msgid_plural "%(amount)s× in your cart" +msgstr[0] "" +msgstr[1] "" + +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374 #: pretix/presale/templates/pretixpresale/event/voucher.html:203 #: pretix/presale/templates/pretixpresale/event/voucher.html:358 #, python-format msgid "%(value)s incl. taxes" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:199 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:352 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:215 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:380 #: pretix/presale/templates/pretixpresale/event/voucher.html:209 #: pretix/presale/templates/pretixpresale/event/voucher.html:364 #, python-format msgid "%(value)s without taxes" msgstr "" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:306 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:334 #: pretix/presale/templates/pretixpresale/event/voucher.html:320 #, python-format msgid "Set price in %(currency)s for %(item)s" @@ -31870,6 +32164,19 @@ msgid "" " " msgstr "" +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:10 +msgid "The following gift cards are available in your customer account:" +msgstr "" + +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:24 +msgid "Use gift card" +msgstr "" + +#: pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html:4 +#, python-format +msgid "Your gift card %(card)s will be used to pay for this order." +msgstr "" + #: pretix/presale/templates/pretixpresale/index.html:7 msgid "Hello!" msgstr "" @@ -31958,10 +32265,6 @@ msgstr "" msgid "Change account information" msgstr "" -#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:28 -msgid "Change password" -msgstr "" - #: pretix/presale/templates/pretixpresale/organizers/customer_base.html:41 msgid "customer account information" msgstr "" @@ -32156,7 +32459,7 @@ msgstr "" msgid "The selected organizer was not found." msgstr "" -#: pretix/presale/views/__init__.py:275 +#: pretix/presale/views/__init__.py:291 #, python-brace-format msgid "" "Your selected payment method can only be used for a payment of at least " @@ -32346,47 +32649,47 @@ msgstr "" msgid "Please click the link we sent you via email to download your tickets." msgstr "" -#: pretix/presale/views/order.py:1619 +#: pretix/presale/views/order.py:1621 #, python-brace-format msgid "" "The order has been changed. You can now proceed by paying the open amount of " "{amount}." msgstr "" -#: pretix/presale/views/order.py:1631 +#: pretix/presale/views/order.py:1633 msgid "You did not make any changes." msgstr "" -#: pretix/presale/views/order.py:1655 +#: pretix/presale/views/order.py:1658 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1657 +#: pretix/presale/views/order.py:1660 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1659 +#: pretix/presale/views/order.py:1662 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1661 +#: pretix/presale/views/order.py:1664 msgid "You may not change your order in a way that would require a refund." msgstr "" -#: pretix/presale/views/order.py:1669 +#: pretix/presale/views/order.py:1672 msgid "" "You may not change your order in a way that increases the total price since " "payments are no longer being accepted for this event." msgstr "" -#: pretix/presale/views/order.py:1675 +#: pretix/presale/views/order.py:1678 msgid "" "You may not change your order in a way that requires additional payment " "while we are processing your current payment. Please check back after your " "current payment has been accepted." msgstr "" -#: pretix/presale/views/order.py:1691 pretix/presale/views/order.py:1722 +#: pretix/presale/views/order.py:1694 pretix/presale/views/order.py:1725 msgid "You cannot change this order." msgstr "" diff --git a/src/pretix/locale/ang/LC_MESSAGES/djangojs.po b/src/pretix/locale/ang/LC_MESSAGES/djangojs.po index 3ad08f20a..e063e394d 100644 --- a/src/pretix/locale/ang/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/ang/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-29 07:55+0000\n" +"POT-Creation-Date: 2025-11-20 10:37+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -344,8 +344,8 @@ msgstr "" msgid "close" msgstr "" -#: pretix/static/pretixbase/js/addressform.js:90 -#: pretix/static/pretixpresale/js/ui/main.js:525 +#: pretix/static/pretixbase/js/addressform.js:98 +#: pretix/static/pretixpresale/js/ui/main.js:529 msgid "required" msgstr "" @@ -622,56 +622,56 @@ msgstr "" msgid "Unknown error." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:292 +#: pretix/static/pretixcontrol/js/ui/main.js:309 msgid "Your color has great contrast and will provide excellent accessibility." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:296 +#: pretix/static/pretixcontrol/js/ui/main.js:313 msgid "" "Your color has decent contrast and is sufficient for minimum accessibility " "requirements." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:300 +#: pretix/static/pretixcontrol/js/ui/main.js:317 msgid "" "Your color has insufficient contrast to white. Accessibility of your site " "will be impacted." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:418 -#: pretix/static/pretixcontrol/js/ui/main.js:438 +#: pretix/static/pretixcontrol/js/ui/main.js:443 +#: pretix/static/pretixcontrol/js/ui/main.js:463 msgid "Search query" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:436 +#: pretix/static/pretixcontrol/js/ui/main.js:461 msgid "All" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:437 +#: pretix/static/pretixcontrol/js/ui/main.js:462 msgid "None" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:441 +#: pretix/static/pretixcontrol/js/ui/main.js:466 msgid "Selected only" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:814 +#: pretix/static/pretixcontrol/js/ui/main.js:839 msgid "Enter page number between 1 and %(max)s." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:817 +#: pretix/static/pretixcontrol/js/ui/main.js:842 msgid "Invalid page number." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:975 +#: pretix/static/pretixcontrol/js/ui/main.js:1000 msgid "Use a different name internally" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1015 +#: pretix/static/pretixcontrol/js/ui/main.js:1040 msgid "Click to close" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1096 +#: pretix/static/pretixcontrol/js/ui/main.js:1121 msgid "You have unsaved changes!" msgstr "" @@ -748,7 +748,7 @@ msgstr "" msgid "Please enter the amount the organizer can keep." msgstr "" -#: pretix/static/pretixpresale/js/ui/main.js:570 +#: pretix/static/pretixpresale/js/ui/main.js:577 msgid "Your local time:" msgstr "" diff --git a/src/pretix/locale/ar/LC_MESSAGES/django.po b/src/pretix/locale/ar/LC_MESSAGES/django.po index bbbf8aeba..df85993e7 100644 --- a/src/pretix/locale/ar/LC_MESSAGES/django.po +++ b/src/pretix/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-29 07:54+0000\n" +"POT-Creation-Date: 2025-11-27 13:57+0000\n" "PO-Revision-Date: 2025-04-08 18:00+0000\n" "Last-Translator: Menaouer Chaabi " "<98581961+DerJimno@users.noreply.github.com>\n" @@ -225,27 +225,27 @@ msgstr "حد على الفعاليات" #: pretix/base/exporters/orderlist.py:1098 #: pretix/base/modelimport_vouchers.py:326 pretix/base/models/orders.py:272 #: pretix/base/models/vouchers.py:295 pretix/control/forms/filter.py:588 -#: pretix/control/templates/pretixcontrol/order/index.html:950 +#: pretix/control/templates/pretixcontrol/order/index.html:981 #: pretix/control/templates/pretixcontrol/organizers/webhooks.html:38 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:21 #: pretix/control/views/vouchers.py:121 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/checkinlists/exporters.py:525 msgid "Comment" msgstr "تعليق" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1471 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1492 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "لم يتم تعيين حصة للمنتج \"{}\"." -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1718 -#: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1724 +#: pretix/base/models/items.py:1916 pretix/base/models/items.py:2202 msgid "One or more items do not belong to this event." msgstr "هناك عنصر أو أكثر لا ينتمي إلى هذه الفعالية." #: pretix/api/serializers/checkin.py:69 pretix/api/serializers/checkin.py:72 -#: pretix/base/models/items.py:2214 pretix/base/models/items.py:2217 +#: pretix/base/models/items.py:2213 pretix/base/models/items.py:2216 #: pretix/base/models/waitinglist.py:310 pretix/base/models/waitinglist.py:313 msgid "The subevent does not belong to this event." msgstr "الفعالية الفرعية لا تنتمي إلى هذه الفعالية." @@ -278,33 +278,62 @@ msgstr "إضافة غير معروفة: '{name}'." msgid "Restricted plugin: '{name}'." msgstr "إضافة مقيدة: '{name}'." -#: pretix/api/serializers/item.py:86 pretix/api/serializers/item.py:148 -#: pretix/api/serializers/item.py:359 +#: pretix/api/serializers/item.py:87 pretix/api/serializers/item.py:149 +#: pretix/api/serializers/item.py:405 #, python-brace-format msgid "Item meta data property '{name}' does not exist." msgstr "خاصية البيانات الوصفية للعنصر '{name}' غير موجودة." -#: pretix/api/serializers/item.py:207 pretix/control/forms/item.py:1274 +#: pretix/api/serializers/item.py:214 pretix/control/forms/item.py:1277 msgid "The bundled item must not be the same item as the bundling one." msgstr "يجب ألا يكون العنصر المجمّع هو نفس عنصر التجميع." -#: pretix/api/serializers/item.py:210 pretix/control/forms/item.py:1276 +#: pretix/api/serializers/item.py:217 pretix/control/forms/item.py:1279 msgid "The bundled item must not have bundles on its own." msgstr "يجب ألا يحتوي العنصر المجمع على حزم بمفرده." -#: pretix/api/serializers/item.py:298 +#: pretix/api/serializers/item.py:235 +#, fuzzy +#| msgid "The payment is too late to be accepted." +msgid "The program start must not be empty." +msgstr "فات الأوان لقبول الدفع." + +#: pretix/api/serializers/item.py:239 +#, fuzzy +#| msgid "The payment is too late to be accepted." +msgid "The program end must not be empty." +msgstr "فات الأوان لقبول الدفع." + +#: pretix/api/serializers/item.py:242 pretix/base/models/items.py:2321 +#, fuzzy +#| msgid "The maximum count needs to be greater than the minimum count." +msgid "The program end must not be before the program start." +msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." + +#: pretix/api/serializers/item.py:247 pretix/base/models/items.py:2315 +#, fuzzy +#| msgid "You can not select a subevent if your event is not an event series." +msgid "You cannot use program times on an event series." +msgstr "" +"لا يمكنك تحديد فعالية فرعية إذا لم تكن الفعالية الخاصة بك سلسلة فعاليات." + +#: pretix/api/serializers/item.py:337 +#, fuzzy +#| msgid "" +#| "Updating add-ons, bundles, or variations via PATCH/PUT is not supported. " +#| "Please use the dedicated nested endpoint." msgid "" -"Updating add-ons, bundles, or variations via PATCH/PUT is not supported. " -"Please use the dedicated nested endpoint." +"Updating add-ons, bundles, program times or variations via PATCH/PUT is not " +"supported. Please use the dedicated nested endpoint." msgstr "" "تحديث الإضافات، أو الحزم، أو المتغيرات عن طريق PATCH/PUT غير مدعوم. الرجاء " "استخدام نقطة نهاية المتداخلة المخصصة." -#: pretix/api/serializers/item.py:306 +#: pretix/api/serializers/item.py:345 msgid "Only admission products can currently be personalized." msgstr "يمكن حاليًا تخصيص منتجات القبول فقط." -#: pretix/api/serializers/item.py:317 +#: pretix/api/serializers/item.py:356 msgid "" "Gift card products should not be associated with non-zero tax rates since " "sales tax will be applied when the gift card is redeemed." @@ -312,11 +341,11 @@ msgstr "" "يجب ألا ترتبط منتجات بطاقات الهدايا بمعدلات ضريبية غير صفرية حيث سيتم تطبيق " "ضريبة المبيعات عند استرداد بطاقة الهدايا." -#: pretix/api/serializers/item.py:322 pretix/control/forms/item.py:781 +#: pretix/api/serializers/item.py:361 pretix/control/forms/item.py:784 msgid "Gift card products should not be admission products at the same time." msgstr "لا يمكن أن تكون منتجات بطاقات الهدايا هي نفس منتجات القبول." -#: pretix/api/serializers/item.py:524 +#: pretix/api/serializers/item.py:573 msgid "" "Updating options via PATCH/PUT is not supported. Please use the dedicated " "nested endpoint." @@ -324,19 +353,19 @@ msgstr "" "خيارات التحديث عبر PATCH/PUT غير مدعومة. الرجاء استخدام نقطة نهاية المتداخلة " "المخصصة." -#: pretix/api/serializers/item.py:538 pretix/control/forms/item.py:176 +#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177 msgid "Question cannot depend on a question asked during check-in." msgstr "لا يمكن أن يعتمد السؤال على سؤال تم طرحه أثناء التسجيل." -#: pretix/api/serializers/item.py:543 pretix/control/forms/item.py:181 +#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182 msgid "Circular dependency between questions detected." msgstr "الأسئلة تدور في حلقة لا متناهية." -#: pretix/api/serializers/item.py:548 pretix/control/forms/item.py:190 +#: pretix/api/serializers/item.py:597 pretix/control/forms/item.py:191 msgid "This type of question cannot be asked during check-in." msgstr "لا يمكن طرح هذا النوع من الأسئلة أثناء تسجيل الدخول." -#: pretix/api/serializers/item.py:551 pretix/control/forms/item.py:198 +#: pretix/api/serializers/item.py:600 pretix/control/forms/item.py:199 msgid "This type of question cannot be shown during check-in." msgstr "لا يمكن عرض هذا النوع من الأسئلة أثناء تسجيل الدخول." @@ -346,23 +375,23 @@ msgid "" "account." msgstr "توجد وسيلة بنفس المعرف والنوع في حساب المنظم الخاص بك." -#: pretix/api/serializers/order.py:81 +#: pretix/api/serializers/order.py:85 #, python-brace-format msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ادخال غير صالحة، يرجى المحاولة مرة أخرى." -#: pretix/api/serializers/order.py:1432 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1619 +#: pretix/api/serializers/order.py:1453 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1642 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "المقعد المحدد \"{seat}\" غير متوفر." -#: pretix/api/serializers/order.py:1458 pretix/api/serializers/order.py:1465 +#: pretix/api/serializers/order.py:1479 pretix/api/serializers/order.py:1486 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "المنتج \"{}\" غير متوفر في هذا التاريخ." -#: pretix/api/serializers/order.py:1480 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1501 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." @@ -400,34 +429,34 @@ msgid "" "The specified voucher has already been used the maximum number of times." msgstr "تم استخدام رمز كود الخصم هذا سابقا لأقصى عدد مسموح به من المرات." -#: pretix/api/views/checkin.py:616 pretix/api/views/checkin.py:623 +#: pretix/api/views/checkin.py:627 pretix/api/views/checkin.py:634 msgid "Medium connected to other event" msgstr "الوسيط متصل بحدث آخر" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:755 +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:764 #, python-brace-format msgid "" "The application \"{application_name}\" has been authorized to access your " "account." msgstr "تم تفويض التطبيق \"{application_name}\" للوصول إلى حسابك." -#: pretix/api/views/order.py:608 pretix/control/views/orders.py:1603 +#: pretix/api/views/order.py:609 pretix/control/views/orders.py:1608 #: pretix/presale/views/order.py:736 pretix/presale/views/order.py:816 msgid "You cannot generate an invoice for this order." msgstr "لا يمكن انشاء فاتورة لهذا الطلب." -#: pretix/api/views/order.py:613 pretix/control/views/orders.py:1605 +#: pretix/api/views/order.py:614 pretix/control/views/orders.py:1610 #: pretix/presale/views/order.py:738 pretix/presale/views/order.py:818 msgid "An invoice for this order already exists." msgstr "توجد فاتورة مصدرة لهذا الطلب مسبقاً." -#: pretix/api/views/order.py:639 pretix/control/views/orders.py:1764 +#: pretix/api/views/order.py:640 pretix/control/views/orders.py:1788 #: pretix/control/views/users.py:145 msgid "There was an error sending the mail. Please try again later." msgstr "حدث خطأ اثناء ارسال البريد الاكتروني. الرجاء المحاولة مرة أخرى لاحقاً." -#: pretix/api/views/order.py:719 pretix/base/services/cart.py:216 -#: pretix/base/services/orders.py:191 pretix/presale/views/order.py:800 +#: pretix/api/views/order.py:720 pretix/base/services/cart.py:216 +#: pretix/base/services/orders.py:195 pretix/presale/views/order.py:800 msgid "One of the selected products is not available in the selected country." msgstr "أحد المنتجات المختارة غير متوفر في البلد المحدد." @@ -446,7 +475,7 @@ msgstr "تم تمييز الطلب على أنه مدفوع" #: pretix/api/webhooks.py:274 pretix/base/models/checkin.py:355 #: pretix/base/notifications.py:251 #: pretix/control/templates/pretixcontrol/event/mail.html:114 -#: pretix/control/views/orders.py:1564 +#: pretix/control/views/orders.py:1569 msgid "Order canceled" msgstr "تم إلغاء الطلب" @@ -671,9 +700,9 @@ msgstr "تم طمس هويتها لهذا المستخدم." #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 #: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1048 #: pretix/base/forms/questions.py:1079 pretix/base/forms/questions.py:1333 -#: pretix/base/payment.py:97 pretix/control/forms/event.py:792 -#: pretix/control/forms/event.py:798 pretix/control/forms/event.py:838 -#: pretix/control/forms/event.py:1455 pretix/control/forms/mailsetup.py:87 +#: pretix/base/payment.py:97 pretix/control/forms/event.py:798 +#: pretix/control/forms/event.py:804 pretix/control/forms/event.py:918 +#: pretix/control/forms/event.py:1554 pretix/control/forms/mailsetup.py:87 #: pretix/control/forms/mailsetup.py:129 pretix/control/forms/subevents.py:181 #: pretix/plugins/banktransfer/payment.py:507 #: pretix/plugins/banktransfer/payment.py:513 @@ -698,10 +727,10 @@ msgstr "{system} اسم المستخدم" #: pretix/base/exporters/orderlist.py:263 #: pretix/base/exporters/orderlist.py:454 #: pretix/base/exporters/orderlist.py:587 -#: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:257 -#: pretix/base/invoicing/email.py:43 pretix/base/models/auth.py:244 +#: pretix/base/exporters/waitinglist.py:110 pretix/base/forms/auth.py:270 +#: pretix/base/invoicing/email.py:43 pretix/base/models/auth.py:247 #: pretix/base/models/customers.py:101 pretix/base/models/notifications.py:46 -#: pretix/base/models/orders.py:246 pretix/base/pdf.py:336 +#: pretix/base/models/orders.py:246 pretix/base/pdf.py:337 #: pretix/control/navigation.py:81 pretix/control/navigation.py:513 #: pretix/control/templates/pretixcontrol/checkin/index.html:107 #: pretix/control/templates/pretixcontrol/event/settings.html:71 @@ -710,7 +739,7 @@ msgstr "{system} اسم المستخدم" #: pretix/control/templates/pretixcontrol/organizers/customers.html:59 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:161 #: pretix/plugins/checkinlists/exporters.py:509 -#: pretix/presale/checkoutflow.py:1542 pretix/presale/forms/checkout.py:57 +#: pretix/presale/checkoutflow.py:1553 pretix/presale/forms/checkout.py:57 #: pretix/presale/forms/customer.py:57 pretix/presale/forms/customer.py:142 #: pretix/presale/forms/customer.py:298 pretix/presale/forms/customer.py:344 #: pretix/presale/forms/customer.py:388 pretix/presale/forms/user.py:40 @@ -720,8 +749,9 @@ msgid "Email" msgstr "البريد الإلكتروني" #: pretix/base/auth.py:157 pretix/base/forms/auth.py:164 -#: pretix/base/forms/auth.py:218 pretix/base/models/auth.py:675 +#: pretix/base/forms/auth.py:226 pretix/base/models/auth.py:750 #: pretix/base/models/customers.py:103 pretix/control/forms/mailsetup.py:57 +#: pretix/control/templates/pretixcontrol/user/settings.html:64 #: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 msgid "Password" msgstr "كلمة المرور" @@ -802,30 +832,16 @@ msgstr "" msgid "You are not requesting \"{scope}\"." msgstr "تسجيل الفعالية الخاصة بك:{code}" -#: pretix/base/customersso/oidc.py:117 -#, python-brace-format -msgid "" -"You are requesting scope \"{scope}\" but provider only supports these: " -"{scopes}." -msgstr "" - -#: pretix/base/customersso/oidc.py:127 -#, python-brace-format -msgid "" -"You are requesting field \"{field}\" but provider only supports these: " -"{fields}." -msgstr "" - -#: pretix/base/customersso/oidc.py:223 pretix/base/customersso/oidc.py:231 -#: pretix/base/customersso/oidc.py:254 pretix/base/customersso/oidc.py:271 -#: pretix/base/customersso/oidc.py:278 pretix/presale/views/customer.py:758 +#: pretix/base/customersso/oidc.py:206 pretix/base/customersso/oidc.py:214 +#: pretix/base/customersso/oidc.py:237 pretix/base/customersso/oidc.py:254 +#: pretix/base/customersso/oidc.py:261 pretix/presale/views/customer.py:758 #: pretix/presale/views/customer.py:768 pretix/presale/views/customer.py:807 #: pretix/presale/views/customer.py:881 #, python-brace-format msgid "Login was not successful. Error message: \"{error}\"." msgstr "" -#: pretix/base/customersso/oidc.py:261 +#: pretix/base/customersso/oidc.py:244 msgid "" "The email address on this account is not yet verified. Please first confirm " "the email address in your customer account." @@ -865,7 +881,7 @@ msgid "Attendee details" msgstr "البريد الإلكتروني للحاضر" #: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66 -#: pretix/base/models/items.py:1767 pretix/control/navigation.py:172 +#: pretix/base/models/items.py:1766 pretix/control/navigation.py:172 #: pretix/control/templates/pretixcontrol/items/questions.html:3 #: pretix/control/templates/pretixcontrol/items/questions.html:5 msgid "Questions" @@ -878,7 +894,7 @@ msgid "Product details" msgstr "اسم المنتج" #: pretix/base/datasync/sourcefields.py:132 -#: pretix/control/templates/pretixcontrol/event/settings.html:280 +#: pretix/control/templates/pretixcontrol/event/settings.html:279 #: pretix/control/templates/pretixcontrol/order/index.html:176 #: pretix/presale/templates/pretixpresale/event/order.html:22 msgid "Order details" @@ -916,11 +932,11 @@ msgstr "إرسال معلومات الاسترداد" #: pretix/base/exporters/orderlist.py:605 #: pretix/base/exporters/orderlist.py:610 pretix/base/forms/questions.py:681 #: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:320 -#: pretix/base/models/orders.py:1504 pretix/base/pdf.py:183 +#: pretix/base/models/orders.py:1530 pretix/base/pdf.py:184 #: pretix/control/forms/filter.py:679 pretix/control/forms/organizer.py:1019 -#: pretix/control/templates/pretixcontrol/order/index.html:566 +#: pretix/control/templates/pretixcontrol/order/index.html:571 #: pretix/control/templates/pretixcontrol/organizers/customer.html:121 -#: pretix/control/views/item.py:442 pretix/plugins/badges/exporters.py:495 +#: pretix/control/views/item.py:443 pretix/plugins/badges/exporters.py:495 #: pretix/plugins/checkinlists/exporters.py:121 #: pretix/plugins/checkinlists/exporters.py:495 #: pretix/plugins/ticketoutputpdf/exporters.py:94 @@ -942,10 +958,10 @@ msgstr "اسم الحاضر" #: pretix/base/datasync/sourcefields.py:207 #: pretix/base/exporters/orderlist.py:612 pretix/base/forms/questions.py:687 -#: pretix/base/models/customers.py:327 pretix/base/models/orders.py:1512 -#: pretix/base/pdf.py:225 -#: pretix/control/templates/pretixcontrol/order/index.html:571 -#: pretix/control/views/item.py:454 +#: pretix/base/models/customers.py:327 pretix/base/models/orders.py:1538 +#: pretix/base/pdf.py:226 +#: pretix/control/templates/pretixcontrol/order/index.html:576 +#: pretix/control/views/item.py:455 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175 msgid "Attendee email" @@ -957,8 +973,9 @@ msgstr "البريد الإلكتروني للحاضر" msgid "Attendee or order email" msgstr "البريد الإلكتروني للحاضر" -#: pretix/base/datasync/sourcefields.py:232 pretix/base/pdf.py:188 -#: pretix/control/templates/pretixcontrol/order/index.html:595 +#: pretix/base/datasync/sourcefields.py:232 +#: pretix/base/exporters/orderlist.py:613 pretix/base/pdf.py:189 +#: pretix/control/templates/pretixcontrol/order/index.html:600 #: pretix/plugins/badges/exporters.py:496 #: pretix/plugins/ticketoutputpdf/exporters.py:95 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182 @@ -990,7 +1007,8 @@ msgstr "عنوان الحاضر" msgid "Attendee address country" msgstr "عنوان الحاضر" -#: pretix/base/datasync/sourcefields.py:279 pretix/base/pdf.py:346 +#: pretix/base/datasync/sourcefields.py:279 +#: pretix/base/exporters/orderlist.py:653 pretix/base/pdf.py:347 msgid "Invoice address company" msgstr "شركة عنوان الفاتورة" @@ -998,27 +1016,27 @@ msgstr "شركة عنوان الفاتورة" #: pretix/base/exporters/orderlist.py:465 #: pretix/base/exporters/orderlist.py:470 #: pretix/base/exporters/orderlist.py:654 -#: pretix/base/exporters/orderlist.py:658 pretix/base/pdf.py:341 +#: pretix/base/exporters/orderlist.py:658 pretix/base/pdf.py:342 msgid "Invoice address name" msgstr "اسم عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:352 msgid "Invoice address street" msgstr "شارع عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:357 msgid "Invoice address ZIP code" msgstr "الرمز البريدي لعنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:362 msgid "Invoice address city" msgstr "مدينة عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:372 msgid "Invoice address country" msgstr "بلد عنوان الفاتورة" @@ -1035,12 +1053,12 @@ msgid "Order email domain" msgstr "اسم المنظم" #: pretix/base/datasync/sourcefields.py:371 -#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:332 #: pretix/base/exporters/orderlist.py:263 #: pretix/base/exporters/orderlist.py:452 #: pretix/base/exporters/orderlist.py:584 #: pretix/base/exporters/orderlist.py:899 pretix/base/models/orders.py:210 -#: pretix/base/notifications.py:199 pretix/base/pdf.py:105 +#: pretix/base/notifications.py:199 pretix/base/pdf.py:106 #: pretix/base/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 #: pretix/control/templates/pretixcontrol/order/index.html:181 @@ -1110,7 +1128,7 @@ msgstr "اسم الحدث" #: pretix/base/exporters/orderlist.py:451 #: pretix/base/exporters/orderlist.py:583 #: pretix/base/exporters/waitinglist.py:117 pretix/base/models/event.py:595 -#: pretix/base/pdf.py:235 pretix/control/forms/filter.py:1279 +#: pretix/base/pdf.py:236 pretix/control/forms/filter.py:1279 #: pretix/control/forms/filter.py:1724 #: pretix/control/templates/pretixcontrol/events/index.html:68 #: pretix/control/templates/pretixcontrol/organizers/detail.html:64 @@ -1118,12 +1136,12 @@ msgid "Event name" msgstr "اسم الفعالية" #: pretix/base/datasync/sourcefields.py:446 -#: pretix/base/exporters/invoices.py:328 +#: pretix/base/exporters/invoices.py:330 msgid "Event start date" msgstr "تاريخ بدء الفعالية" #: pretix/base/datasync/sourcefields.py:455 -#: pretix/base/exporters/invoices.py:352 pretix/base/pdf.py:289 +#: pretix/base/exporters/invoices.py:354 pretix/base/pdf.py:290 msgid "Event end date" msgstr "تاريخ إنتهاء الفعالية" @@ -1141,7 +1159,7 @@ msgstr "تاريخ إنتهاء الفعالية" msgid "Voucher code" msgstr "رمز كود الخصم" -#: pretix/base/datasync/sourcefields.py:473 pretix/base/pdf.py:118 +#: pretix/base/datasync/sourcefields.py:473 pretix/base/pdf.py:119 #, fuzzy #| msgid "Order position number" msgid "Order code and position number" @@ -1216,28 +1234,28 @@ msgid "Question: {name}" msgstr "سؤال: %(name)s" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3588 -#: pretix/base/settings.py:3601 pretix/base/settings.py:3617 -#: pretix/base/settings.py:3667 pretix/base/settings.py:3680 -#: pretix/base/settings.py:3694 pretix/base/settings.py:3747 -#: pretix/base/settings.py:3768 pretix/base/settings.py:3790 +#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3642 +#: pretix/base/settings.py:3655 pretix/base/settings.py:3671 +#: pretix/base/settings.py:3721 pretix/base/settings.py:3734 +#: pretix/base/settings.py:3748 pretix/base/settings.py:3801 +#: pretix/base/settings.py:3822 pretix/base/settings.py:3844 msgid "Given name" msgstr "الاسم الاول" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3589 -#: pretix/base/settings.py:3602 pretix/base/settings.py:3618 -#: pretix/base/settings.py:3634 pretix/base/settings.py:3651 -#: pretix/base/settings.py:3666 pretix/base/settings.py:3681 -#: pretix/base/settings.py:3695 pretix/base/settings.py:3748 -#: pretix/base/settings.py:3769 pretix/base/settings.py:3791 +#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3643 +#: pretix/base/settings.py:3656 pretix/base/settings.py:3672 +#: pretix/base/settings.py:3688 pretix/base/settings.py:3705 +#: pretix/base/settings.py:3720 pretix/base/settings.py:3735 +#: pretix/base/settings.py:3749 pretix/base/settings.py:3802 +#: pretix/base/settings.py:3823 pretix/base/settings.py:3845 msgid "Family name" msgstr "اسم العائلة" -#: pretix/base/email.py:203 pretix/base/exporters/items.py:157 +#: pretix/base/email.py:218 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:205 pretix/base/models/tax.py:381 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:27 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:44 +#: pretix/control/templates/pretixcontrol/event/tax.html:35 +#: pretix/control/templates/pretixcontrol/event/tax.html:54 #: pretix/control/views/main.py:323 pretix/plugins/badges/apps.py:50 #: pretix/plugins/badges/models.py:48 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:35 @@ -1248,7 +1266,7 @@ msgstr "اسم العائلة" msgid "Default" msgstr "افتراضي" -#: pretix/base/email.py:210 +#: pretix/base/email.py:225 msgid "Simple with logo" msgstr "بسيط مع الشعار" @@ -1304,9 +1322,9 @@ msgstr "" #: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:593 #: pretix/base/exporters/orderlist.py:918 #: pretix/base/exporters/orderlist.py:1159 pretix/base/models/checkin.py:58 -#: pretix/base/models/items.py:2067 pretix/base/models/orders.py:1485 -#: pretix/base/models/orders.py:3024 pretix/base/models/vouchers.py:190 -#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1620 +#: pretix/base/models/items.py:2066 pretix/base/models/orders.py:1508 +#: pretix/base/models/orders.py:3090 pretix/base/models/vouchers.py:190 +#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1722 #: pretix/control/forms/filter.py:441 pretix/control/forms/filter.py:1928 #: pretix/control/forms/filter.py:2150 pretix/control/forms/filter.py:2265 #: pretix/control/forms/filter.py:2347 pretix/control/forms/filter.py:2564 @@ -1333,7 +1351,7 @@ msgid "Date" msgstr "تاريخ" #: pretix/base/exporters/answers.py:79 pretix/base/exporters/answers.py:88 -#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1621 +#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1723 #: pretix/control/forms/filter.py:444 pretix/control/forms/filter.py:471 #: pretix/control/forms/filter.py:1931 pretix/control/forms/filter.py:1964 #: pretix/control/forms/filter.py:2153 pretix/control/forms/filter.py:2173 @@ -1398,45 +1416,45 @@ msgstr "معرف داخلي" #: pretix/base/exporters/orderlist.py:588 #: pretix/base/exporters/waitinglist.py:111 #: pretix/base/modelimport_orders.py:87 pretix/base/models/customers.py:102 -#: pretix/base/models/customers.py:416 pretix/base/models/items.py:1659 +#: pretix/base/models/customers.py:416 pretix/base/models/items.py:1658 #: pretix/base/models/orders.py:250 pretix/base/models/waitinglist.py:80 -#: pretix/base/pdf.py:331 +#: pretix/base/pdf.py:332 #: pretix/control/templates/pretixcontrol/order/index.html:257 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:163 #: pretix/control/views/waitinglist.py:314 #: pretix/plugins/checkinlists/exporters.py:510 -#: pretix/presale/checkoutflow.py:1548 pretix/presale/forms/checkout.py:84 +#: pretix/presale/checkoutflow.py:1559 pretix/presale/forms/checkout.py:84 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 msgid "Phone number" msgstr "رقم الجوال" -#: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:246 -#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3295 -#: pretix/base/settings.py:3721 pretix/base/settings.py:3733 +#: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:250 +#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3393 +#: pretix/base/settings.py:3775 pretix/base/settings.py:3787 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "الاسم الكامل" #: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:208 -#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:334 -#: pretix/base/exporters/invoices.py:342 pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:336 +#: pretix/base/exporters/invoices.py:344 pretix/base/exporters/orderlist.py:264 #: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/questions.py:1248 #: pretix/base/models/devices.py:65 pretix/base/models/devices.py:127 -#: pretix/base/models/event.py:1524 pretix/base/models/event.py:1762 -#: pretix/base/models/items.py:2071 pretix/base/models/items.py:2244 +#: pretix/base/models/event.py:1530 pretix/base/models/event.py:1768 +#: pretix/base/models/items.py:2070 pretix/base/models/items.py:2243 #: pretix/base/models/memberships.py:41 pretix/base/models/organizer.py:77 #: pretix/base/models/organizer.py:601 pretix/base/models/seating.py:85 -#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3346 -#: pretix/base/settings.py:3356 pretix/base/settings.py:3710 -#: pretix/control/forms/filter.py:656 pretix/control/forms/item.py:446 +#: pretix/base/models/waitinglist.py:69 pretix/base/settings.py:3400 +#: pretix/base/settings.py:3410 pretix/base/settings.py:3764 +#: pretix/control/forms/filter.py:656 pretix/control/forms/item.py:447 #: pretix/control/forms/organizer.py:950 #: pretix/control/templates/pretixcontrol/checkin/index.html:109 #: pretix/control/templates/pretixcontrol/checkin/lists.html:99 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:26 +#: pretix/control/templates/pretixcontrol/event/tax.html:34 #: pretix/control/templates/pretixcontrol/oauth/app_list.html:12 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:17 -#: pretix/control/templates/pretixcontrol/order/index.html:999 +#: pretix/control/templates/pretixcontrol/order/index.html:1030 #: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:62 #: pretix/control/templates/pretixcontrol/organizers/devices.html:77 @@ -1466,7 +1484,8 @@ msgstr "اسم" msgid "Account active" msgstr "حساب نشط" -#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:107 +#: pretix/base/exporters/customers.py:78 pretix/base/models/auth.py:248 +#: pretix/base/models/customers.py:107 msgid "Verified email address" msgstr "تم التحقق من عنوان البريد الإلكتروني" @@ -1481,9 +1500,9 @@ msgid "Registration date" msgstr "تاريخ التسجيل" #: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:207 -#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:258 +#: pretix/base/exporters/waitinglist.py:121 pretix/base/models/auth.py:262 #: pretix/base/models/customers.py:113 pretix/base/models/exports.py:54 -#: pretix/control/forms/event.py:1626 pretix/control/forms/exports.py:49 +#: pretix/control/forms/event.py:1728 pretix/control/forms/exports.py:49 #: pretix/control/forms/exports.py:88 pretix/control/views/waitinglist.py:315 msgid "Language" msgstr "اللغة" @@ -1498,7 +1517,7 @@ msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:307 pretix/base/exporters/items.py:150 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/items.py:150 #: pretix/base/exporters/items.py:153 pretix/base/exporters/items.py:155 #: pretix/base/exporters/items.py:156 pretix/base/exporters/items.py:157 #: pretix/base/exporters/items.py:158 pretix/base/exporters/items.py:163 @@ -1520,11 +1539,11 @@ msgstr "" #: pretix/base/exporters/orderlist.py:808 #: pretix/base/exporters/orderlist.py:1404 #: pretix/base/exporters/reusablemedia.py:64 pretix/base/modelimport.py:194 -#: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1401 -#: pretix/base/models/orders.py:3441 pretix/control/forms/filter.py:177 +#: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1409 +#: pretix/base/models/orders.py:3539 pretix/control/forms/filter.py:177 #: pretix/control/forms/filter.py:551 pretix/control/forms/filter.py:738 -#: pretix/control/forms/item.py:615 pretix/control/forms/subevents.py:119 -#: pretix/control/views/item.py:733 pretix/control/views/vouchers.py:139 +#: pretix/control/forms/item.py:618 pretix/control/forms/subevents.py:119 +#: pretix/control/views/item.py:734 pretix/control/views/vouchers.py:139 #: pretix/control/views/vouchers.py:140 #: pretix/plugins/checkinlists/exporters.py:602 #: pretix/plugins/checkinlists/exporters.py:605 @@ -1539,17 +1558,17 @@ msgstr "نعم" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:307 pretix/base/exporters/orderlist.py:396 +#: pretix/base/exporters/invoices.py:309 pretix/base/exporters/orderlist.py:396 #: pretix/base/exporters/orderlist.py:401 #: pretix/base/exporters/orderlist.py:776 #: pretix/base/exporters/orderlist.py:808 #: pretix/base/exporters/orderlist.py:1404 #: pretix/base/exporters/reusablemedia.py:64 pretix/base/modelimport.py:193 -#: pretix/base/modelimport.py:203 pretix/base/models/orders.py:1403 -#: pretix/base/models/orders.py:3443 pretix/control/forms/filter.py:177 +#: pretix/base/modelimport.py:203 pretix/base/models/orders.py:1411 +#: pretix/base/models/orders.py:3541 pretix/control/forms/filter.py:177 #: pretix/control/forms/filter.py:552 pretix/control/forms/filter.py:739 -#: pretix/control/forms/item.py:616 pretix/control/forms/subevents.py:120 -#: pretix/control/views/item.py:733 pretix/control/views/vouchers.py:139 +#: pretix/control/forms/item.py:619 pretix/control/forms/subevents.py:120 +#: pretix/control/views/item.py:734 pretix/control/views/vouchers.py:139 #: pretix/control/views/vouchers.py:140 #: pretix/plugins/checkinlists/exporters.py:602 #: pretix/plugins/checkinlists/exporters.py:605 @@ -1639,70 +1658,70 @@ msgstr "المتجر نشط" msgid "Event currency" msgstr "عملة الفعالية" -#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:261 +#: pretix/base/exporters/events.py:61 pretix/base/models/auth.py:265 #: pretix/base/models/exports.py:133 pretix/control/forms/exports.py:93 msgid "Timezone" msgstr "المنطقة الزمنية" #: pretix/base/exporters/events.py:62 pretix/base/models/event.py:618 -#: pretix/base/models/event.py:1526 pretix/base/settings.py:3344 -#: pretix/base/settings.py:3354 pretix/control/forms/subevents.py:484 +#: pretix/base/models/event.py:1532 pretix/base/settings.py:3398 +#: pretix/base/settings.py:3408 pretix/control/forms/subevents.py:484 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:268 msgid "Event start time" msgstr "وقت بداية الفعالية" #: pretix/base/exporters/events.py:63 pretix/base/models/event.py:620 -#: pretix/base/models/event.py:1528 pretix/base/pdf.py:297 +#: pretix/base/models/event.py:1534 pretix/base/pdf.py:298 #: pretix/control/forms/subevents.py:489 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:270 msgid "Event end time" msgstr "وقت نهاية الفعالية" #: pretix/base/exporters/events.py:64 pretix/base/models/event.py:622 -#: pretix/base/models/event.py:1530 pretix/control/forms/subevents.py:494 +#: pretix/base/models/event.py:1536 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 msgid "Admission time" msgstr "وقت قبول التسجيل" #: pretix/base/exporters/events.py:65 pretix/base/models/event.py:634 -#: pretix/base/models/event.py:1539 pretix/control/forms/subevents.py:93 +#: pretix/base/models/event.py:1545 pretix/control/forms/subevents.py:93 msgid "Start of presale" msgstr "بداية عرض ما قبل البيع" #: pretix/base/exporters/events.py:66 pretix/base/models/event.py:628 -#: pretix/base/models/event.py:1533 pretix/control/forms/subevents.py:99 +#: pretix/base/models/event.py:1539 pretix/control/forms/subevents.py:99 msgid "End of presale" msgstr "نهاية عرض ما قبل البيع" -#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:353 -#: pretix/base/models/event.py:640 pretix/base/models/event.py:1545 +#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:355 +#: pretix/base/models/event.py:640 pretix/base/models/event.py:1551 #: pretix/base/templates/pretixbase/email/order_details.html:83 msgid "Location" msgstr "الموقع" #: pretix/base/exporters/events.py:68 pretix/base/models/event.py:648 -#: pretix/base/models/event.py:1548 +#: pretix/base/models/event.py:1554 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:18 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:54 msgid "Latitude" msgstr "خط العرض" #: pretix/base/exporters/events.py:69 pretix/base/models/event.py:656 -#: pretix/base/models/event.py:1556 +#: pretix/base/models/event.py:1562 #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:28 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:64 msgid "Longitude" msgstr "خط الطول" #: pretix/base/exporters/events.py:70 pretix/base/models/event.py:668 -#: pretix/base/models/event.py:1571 +#: pretix/base/models/event.py:1577 #: pretix/control/templates/pretixcontrol/event/index.html:137 -#: pretix/control/templates/pretixcontrol/order/index.html:1049 +#: pretix/control/templates/pretixcontrol/order/index.html:1080 msgid "Internal comment" msgstr "ملاحظة داخلية" -#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753 -#: pretix/base/models/orders.py:2187 pretix/control/forms/filter.py:209 +#: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1779 +#: pretix/base/models/orders.py:2213 pretix/control/forms/filter.py:209 #: pretix/control/forms/filter.py:1055 pretix/control/forms/filter.py:2305 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:9 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:14 @@ -1753,7 +1772,7 @@ msgstr "" #: pretix/base/exporters/invoices.py:193 pretix/base/shredder.py:579 #: pretix/control/templates/pretixcontrol/order/index.html:268 -#: pretix/control/templates/pretixcontrol/order/index.html:381 +#: pretix/control/templates/pretixcontrol/order/index.html:386 #: pretix/control/templates/pretixcontrol/organizers/edit.html:312 #: pretix/presale/templates/pretixpresale/event/order.html:236 #: pretix/presale/templates/pretixpresale/event/order.html:257 @@ -1764,16 +1783,16 @@ msgstr "فواتير" msgid "Invoice lines" msgstr "أسطر الفاتورة" -#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:320 +#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:322 msgid "Invoice number" msgstr "رقم الفاتورة" -#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:331 #: pretix/base/exporters/orderlist.py:1236 #: pretix/base/exporters/orderlist.py:1282 #: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/widgets.py:213 -#: pretix/base/models/items.py:1655 pretix/base/models/orders.py:259 -#: pretix/base/models/orders.py:2999 pretix/base/models/orders.py:3119 +#: pretix/base/models/items.py:1654 pretix/base/models/orders.py:259 +#: pretix/base/models/orders.py:3065 pretix/base/models/orders.py:3204 #: pretix/base/templates/pretixbase/email/order_details.html:70 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:25 #: pretix/control/templates/pretixcontrol/order/transactions.html:19 @@ -1786,7 +1805,7 @@ msgstr "رقم الفاتورة" msgid "Date" msgstr "التاريخ" -#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 +#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:333 #: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59 #: pretix/base/models/customers.py:415 pretix/base/models/waitinglist.py:76 #: pretix/control/forms/filter.py:584 @@ -1795,33 +1814,34 @@ msgstr "التاريخ" msgid "Email address" msgstr "عنوان البريد الإلكتروني" -#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:332 +#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:334 msgid "Invoice type" msgstr "نوع الفاتورة" -#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:333 +#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:335 msgid "Cancellation of" msgstr "إلغاء ل" #: pretix/base/exporters/invoices.py:208 pretix/base/exporters/invoices.py:209 #: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:211 #: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:213 -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:334 -#: pretix/base/exporters/invoices.py:335 pretix/base/exporters/invoices.py:336 -#: pretix/base/exporters/invoices.py:337 pretix/base/exporters/invoices.py:338 -#: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:340 +#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:215 +#: pretix/base/exporters/invoices.py:336 pretix/base/exporters/invoices.py:337 +#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:339 +#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:342 msgid "Invoice sender:" msgstr "مرسل الفاتورة:" -#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:335 +#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:337 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:614 pretix/base/forms/questions.py:706 #: pretix/base/modelimport_orders.py:232 pretix/base/modelimport_orders.py:386 -#: pretix/base/models/customers.py:331 pretix/base/models/orders.py:1539 -#: pretix/base/models/orders.py:3297 pretix/control/forms/filter.py:660 +#: pretix/base/models/customers.py:331 pretix/base/models/orders.py:1565 +#: pretix/base/models/orders.py:3395 pretix/control/forms/filter.py:660 #: pretix/control/forms/filter.py:691 -#: pretix/control/templates/pretixcontrol/order/index.html:1001 +#: pretix/control/templates/pretixcontrol/order/index.html:1032 #: pretix/plugins/checkinlists/exporters.py:536 #: pretix/plugins/reports/exporters.py:852 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 @@ -1829,48 +1849,65 @@ msgstr "مرسل الفاتورة:" msgid "Address" msgstr "العنوان" -#: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:218 -#: pretix/base/exporters/invoices.py:336 pretix/base/exporters/invoices.py:344 +#: pretix/base/exporters/invoices.py:210 pretix/base/exporters/invoices.py:219 +#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:615 pretix/base/forms/questions.py:717 #: pretix/base/modelimport_orders.py:244 pretix/base/modelimport_orders.py:397 -#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1540 -#: pretix/base/models/orders.py:3298 pretix/base/settings.py:1191 +#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1566 +#: pretix/base/models/orders.py:3396 pretix/base/settings.py:1222 #: pretix/control/forms/filter.py:664 pretix/control/forms/filter.py:695 -#: pretix/control/views/item.py:488 +#: pretix/control/views/item.py:489 #: pretix/plugins/checkinlists/exporters.py:537 #: pretix/plugins/reports/exporters.py:853 msgid "ZIP code" msgstr "الرمز البريدي" -#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:219 -#: pretix/base/exporters/invoices.py:337 pretix/base/exporters/invoices.py:345 +#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:220 +#: pretix/base/exporters/invoices.py:339 pretix/base/exporters/invoices.py:347 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:616 pretix/base/forms/questions.py:725 #: pretix/base/modelimport_orders.py:256 pretix/base/modelimport_orders.py:408 -#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1541 -#: pretix/base/models/orders.py:3299 pretix/base/settings.py:1203 +#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1567 +#: pretix/base/models/orders.py:3397 pretix/base/settings.py:1235 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 -#: pretix/control/views/item.py:498 +#: pretix/control/views/item.py:499 #: pretix/plugins/checkinlists/exporters.py:538 #: pretix/plugins/reports/exporters.py:854 msgid "City" msgstr "المدينة" -#: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:220 -#: pretix/base/exporters/invoices.py:338 pretix/base/exporters/invoices.py:346 +#: pretix/base/exporters/invoices.py:212 pretix/base/exporters/invoices.py:222 +#: pretix/base/exporters/invoices.py:349 pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:472 +#: pretix/base/exporters/orderlist.py:618 pretix/base/forms/questions.py:762 +#: pretix/base/forms/questions.py:1198 pretix/base/modelimport_orders.py:295 +#: pretix/base/models/customers.py:335 pretix/base/models/orders.py:1569 +#: pretix/base/models/orders.py:3401 pretix/base/settings.py:1248 +#: pretix/base/views/js_helpers.py:48 pretix/control/forms/event.py:1033 +#: pretix/control/templates/pretixcontrol/order/index.html:1039 +#: pretix/plugins/checkinlists/exporters.py:540 +#: pretix/plugins/reports/exporters.py:855 +#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 +#: pretix/presale/templates/pretixpresale/event/order.html:323 +msgctxt "address" +msgid "State" +msgstr "المنطقة" + +#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:221 +#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/orderlist.py:271 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:617 pretix/base/forms/questions.py:737 #: pretix/base/modelimport_orders.py:274 pretix/base/modelimport_orders.py:425 -#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3300 pretix/base/models/orders.py:3301 -#: pretix/base/settings.py:1212 pretix/control/forms/filter.py:674 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3398 pretix/base/models/orders.py:3399 +#: pretix/base/settings.py:1259 pretix/control/forms/filter.py:674 #: pretix/control/forms/filter.py:705 -#: pretix/control/templates/pretixcontrol/order/index.html:1005 -#: pretix/control/views/item.py:508 +#: pretix/control/templates/pretixcontrol/order/index.html:1036 +#: pretix/control/views/item.py:509 #: pretix/plugins/checkinlists/exporters.py:539 #: pretix/plugins/reports/exporters.py:804 #: pretix/plugins/reports/exporters.py:849 @@ -1880,17 +1917,17 @@ msgstr "المدينة" msgid "Country" msgstr "الدولة" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 +#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:341 msgid "Tax ID" msgstr "الرقم الضريبي" -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:222 -#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/invoices.py:348 +#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:223 +#: pretix/base/exporters/invoices.py:342 pretix/base/exporters/invoices.py:350 #: pretix/base/exporters/orderlist.py:272 #: pretix/base/exporters/orderlist.py:472 #: pretix/base/exporters/orderlist.py:663 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3304 -#: pretix/control/templates/pretixcontrol/order/index.html:1012 +#: pretix/base/models/orders.py:3402 +#: pretix/control/templates/pretixcontrol/order/index.html:1043 #: pretix/plugins/reports/exporters.py:856 #: pretix/plugins/reports/exporters.py:898 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 @@ -1898,28 +1935,26 @@ msgstr "الرقم الضريبي" msgid "VAT ID" msgstr "رقم تعريف ضريبة القيمة المضافة" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:216 -#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:218 -#: pretix/base/exporters/invoices.py:219 pretix/base/exporters/invoices.py:220 -#: pretix/base/exporters/invoices.py:221 pretix/base/exporters/invoices.py:222 -#: pretix/base/exporters/invoices.py:223 pretix/base/exporters/invoices.py:224 -#: pretix/base/exporters/invoices.py:341 pretix/base/exporters/invoices.py:342 +#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:217 +#: pretix/base/exporters/invoices.py:218 pretix/base/exporters/invoices.py:219 +#: pretix/base/exporters/invoices.py:220 pretix/base/exporters/invoices.py:221 +#: pretix/base/exporters/invoices.py:222 pretix/base/exporters/invoices.py:223 +#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:225 #: pretix/base/exporters/invoices.py:343 pretix/base/exporters/invoices.py:344 #: pretix/base/exporters/invoices.py:345 pretix/base/exporters/invoices.py:346 #: pretix/base/exporters/invoices.py:347 pretix/base/exporters/invoices.py:348 #: pretix/base/exporters/invoices.py:349 pretix/base/exporters/invoices.py:350 +#: pretix/base/exporters/invoices.py:351 pretix/base/exporters/invoices.py:352 msgid "Invoice recipient:" msgstr "مستلم الفاتورة:" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:216 pretix/base/exporters/invoices.py:343 #: pretix/base/exporters/orderlist.py:264 -#: pretix/base/exporters/orderlist.py:464 -#: pretix/base/exporters/orderlist.py:613 -#: pretix/base/exporters/orderlist.py:653 pretix/base/forms/questions.py:698 +#: pretix/base/exporters/orderlist.py:464 pretix/base/forms/questions.py:698 #: pretix/base/modelimport_orders.py:199 pretix/base/modelimport_orders.py:375 #: pretix/control/forms/filter.py:652 pretix/control/forms/filter.py:687 -#: pretix/control/templates/pretixcontrol/order/index.html:997 -#: pretix/control/views/item.py:466 +#: pretix/control/templates/pretixcontrol/order/index.html:1028 +#: pretix/control/views/item.py:467 #: pretix/plugins/checkinlists/exporters.py:520 #: pretix/plugins/reports/exporters.py:851 #: pretix/plugins/reports/exporters.py:897 @@ -1928,65 +1963,49 @@ msgstr "مستلم الفاتورة:" msgid "Company" msgstr "الشركة" -#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:343 +#: pretix/base/exporters/invoices.py:218 pretix/base/exporters/invoices.py:345 msgid "Street address" msgstr "عنوان الشارع" -#: pretix/base/exporters/invoices.py:221 pretix/base/exporters/invoices.py:347 -#: pretix/base/exporters/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:472 -#: pretix/base/exporters/orderlist.py:618 pretix/base/forms/questions.py:762 -#: pretix/base/forms/questions.py:1198 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:335 pretix/base/models/orders.py:1543 -#: pretix/base/models/orders.py:3303 pretix/base/views/js_helpers.py:48 -#: pretix/control/templates/pretixcontrol/order/index.html:1008 -#: pretix/plugins/checkinlists/exporters.py:540 -#: pretix/plugins/reports/exporters.py:855 -#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:95 -#: pretix/presale/templates/pretixpresale/event/order.html:323 -msgctxt "address" -msgid "State" -msgstr "المنطقة" - -#: pretix/base/exporters/invoices.py:223 pretix/base/exporters/invoices.py:349 -#: pretix/base/models/orders.py:3313 pretix/base/models/orders.py:3369 +#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:351 +#: pretix/base/models/orders.py:3411 pretix/base/models/orders.py:3467 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "المستفيد" -#: pretix/base/exporters/invoices.py:224 pretix/base/exporters/invoices.py:350 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3308 -#: pretix/control/templates/pretixcontrol/order/index.html:1033 +#: pretix/base/exporters/invoices.py:225 pretix/base/exporters/invoices.py:352 +#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3406 +#: pretix/control/templates/pretixcontrol/order/index.html:1064 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "المرجع الداخلي" -#: pretix/base/exporters/invoices.py:225 pretix/base/models/tax.py:162 -#: pretix/control/forms/event.py:1516 +#: pretix/base/exporters/invoices.py:226 pretix/base/models/tax.py:162 +#: pretix/control/forms/event.py:1615 msgid "Reverse charge" msgstr "التكلفة العكسية" -#: pretix/base/exporters/invoices.py:226 +#: pretix/base/exporters/invoices.py:227 msgid "Shown foreign currency" msgstr "العملات الأجنبية المعروضة" -#: pretix/base/exporters/invoices.py:227 +#: pretix/base/exporters/invoices.py:228 msgid "Foreign currency rate" msgstr "أسعار العملات الأجنبية" -#: pretix/base/exporters/invoices.py:228 +#: pretix/base/exporters/invoices.py:229 msgid "Total value (with taxes)" msgstr "القيمة الإجمالية (مع الضرائب)" -#: pretix/base/exporters/invoices.py:229 +#: pretix/base/exporters/invoices.py:230 msgid "Total value (without taxes)" msgstr "القيمة الإجمالية (بدون الضرائب)" -#: pretix/base/exporters/invoices.py:230 +#: pretix/base/exporters/invoices.py:231 msgid "Payment matching IDs" msgstr "معرفات مطابقة الدفع" -#: pretix/base/exporters/invoices.py:231 pretix/base/exporters/invoices.py:351 +#: pretix/base/exporters/invoices.py:232 pretix/base/exporters/invoices.py:353 #: pretix/base/exporters/orderlist.py:291 #: pretix/base/exporters/orderlist.py:476 #: pretix/base/exporters/orderlist.py:671 pretix/base/plugins.py:139 @@ -1994,11 +2013,11 @@ msgstr "معرفات مطابقة الدفع" msgid "Payment providers" msgstr "مزودي خدمات الدفع" -#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 +#: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 msgid "Cancellation" msgstr "إلغاء" -#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 +#: pretix/base/exporters/invoices.py:288 pretix/base/exporters/invoices.py:392 #: pretix/control/templates/pretixcontrol/event/mail.html:120 #: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/control/templates/pretixcontrol/order/mail_history.html:70 @@ -2006,36 +2025,36 @@ msgstr "إلغاء" msgid "Invoice" msgstr "فاتورة" -#: pretix/base/exporters/invoices.py:321 +#: pretix/base/exporters/invoices.py:323 msgid "Line number" msgstr "رقم السطر" -#: pretix/base/exporters/invoices.py:322 pretix/base/exporters/orderlist.py:459 -#: pretix/base/models/items.py:492 pretix/base/models/items.py:1155 +#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:459 +#: pretix/base/models/items.py:492 pretix/base/models/items.py:1154 #: pretix/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "الوصف" -#: pretix/base/exporters/invoices.py:323 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:325 pretix/control/forms/orders.py:355 msgid "Gross price" msgstr "السعر الإجمالي" -#: pretix/base/exporters/invoices.py:324 +#: pretix/base/exporters/invoices.py:326 msgid "Net price" msgstr "السعر الصافي" -#: pretix/base/exporters/invoices.py:325 pretix/base/exporters/orderlist.py:463 +#: pretix/base/exporters/invoices.py:327 pretix/base/exporters/orderlist.py:463 #: pretix/base/exporters/orderlist.py:604 -#: pretix/base/exporters/orderlist.py:924 pretix/base/models/orders.py:2351 -#: pretix/base/models/orders.py:2523 pretix/base/models/orders.py:3045 +#: pretix/base/exporters/orderlist.py:924 pretix/base/models/orders.py:2380 +#: pretix/base/models/orders.py:2579 pretix/base/models/orders.py:3114 msgid "Tax value" msgstr "قيمة الضريبة" -#: pretix/base/exporters/invoices.py:326 pretix/base/exporters/orderlist.py:461 +#: pretix/base/exporters/invoices.py:328 pretix/base/exporters/orderlist.py:461 #: pretix/base/exporters/orderlist.py:602 -#: pretix/base/exporters/orderlist.py:921 pretix/base/models/orders.py:2338 -#: pretix/base/models/orders.py:2510 pretix/base/models/orders.py:3032 -#: pretix/base/models/orders.py:3132 pretix/base/models/tax.py:348 +#: pretix/base/exporters/orderlist.py:921 pretix/base/models/orders.py:2367 +#: pretix/base/models/orders.py:2566 pretix/base/models/orders.py:3101 +#: pretix/base/models/orders.py:3217 pretix/base/models/tax.py:348 #: pretix/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 #: pretix/plugins/reports/exporters.py:805 @@ -2043,7 +2062,7 @@ msgstr "قيمة الضريبة" msgid "Tax rate" msgstr "معدل الضريبة" -#: pretix/base/exporters/invoices.py:327 +#: pretix/base/exporters/invoices.py:329 msgid "Tax name" msgstr "الاسم الضريبي" @@ -2073,7 +2092,7 @@ msgid "Variation ID" msgstr "النوع" #: pretix/base/exporters/items.py:59 pretix/base/models/items.py:142 -#: pretix/base/pdf.py:153 +#: pretix/base/pdf.py:154 #: pretix/control/templates/pretixcontrol/items/category.html:4 #: pretix/control/templates/pretixcontrol/items/category.html:6 msgid "Product category" @@ -2092,18 +2111,18 @@ msgstr "اسم العنصر" #: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:599 #: pretix/base/exporters/orderlist.py:913 -#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1495 pretix/base/models/orders.py:3017 +#: pretix/base/exporters/waitinglist.py:114 pretix/base/models/items.py:1147 +#: pretix/base/models/orders.py:1518 pretix/base/models/orders.py:3083 #: pretix/plugins/checkinlists/exporters.py:698 msgid "Variation" msgstr "النوع" #: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:49 #: pretix/base/models/customers.py:64 pretix/base/models/customers.py:423 -#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1515 -#: pretix/base/models/items.py:489 pretix/base/models/items.py:1152 -#: pretix/base/models/media.py:77 pretix/base/settings.py:204 -#: pretix/base/settings.py:239 pretix/base/settings.py:270 +#: pretix/base/models/discount.py:60 pretix/base/models/event.py:1521 +#: pretix/base/models/items.py:489 pretix/base/models/items.py:1151 +#: pretix/base/models/media.py:77 pretix/base/settings.py:212 +#: pretix/base/settings.py:247 pretix/base/settings.py:278 #: pretix/control/forms/filter.py:1232 pretix/control/forms/filter.py:2037 #: pretix/control/templates/pretixcontrol/event/plugins.html:25 #: pretix/control/templates/pretixcontrol/event/plugins.html:75 @@ -2114,7 +2133,7 @@ msgid "Active" msgstr "نشط" #: pretix/base/exporters/items.py:72 pretix/base/models/discount.py:77 -#: pretix/control/forms/event.py:977 pretix/control/navigation.py:520 +#: pretix/control/forms/event.py:1076 pretix/control/navigation.py:520 #: pretix/control/templates/pretixcontrol/organizers/channels.html:6 #: pretix/plugins/autocheckin/models.py:64 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/index.html:30 @@ -2122,7 +2141,7 @@ msgid "Sales channels" msgstr "قنوات البيع" #: pretix/base/exporters/items.py:73 pretix/base/models/items.py:497 -#: pretix/base/models/items.py:1166 +#: pretix/base/models/items.py:1165 #: pretix/control/templates/pretixcontrol/items/index.html:44 msgid "Default price" msgstr "السعر الافتراضي" @@ -2132,11 +2151,11 @@ msgstr "السعر الافتراضي" msgid "Free price input" msgstr "إدخال سعر مجاني" -#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:520 +#: pretix/base/exporters/items.py:75 pretix/base/models/items.py:519 msgid "Sales tax" msgstr "ضريبة المبيعات" -#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:525 +#: pretix/base/exporters/items.py:76 pretix/base/models/items.py:524 msgid "Is an admission ticket" msgstr "تذكرة دخول" @@ -2148,22 +2167,22 @@ msgstr "تذكرة دخول" msgid "Personalized ticket" msgstr "إنشاء التذاكر" -#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:539 +#: pretix/base/exporters/items.py:78 pretix/base/models/items.py:538 msgid "Generate tickets" msgstr "إنشاء التذاكر" #: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1156 #: pretix/base/exporters/waitinglist.py:41 pretix/base/shredder.py:367 -#: pretix/control/forms/event.py:1696 pretix/control/navigation.py:237 -#: pretix/control/templates/pretixcontrol/event/settings.html:363 +#: pretix/control/forms/event.py:1798 pretix/control/navigation.py:237 +#: pretix/control/templates/pretixcontrol/event/settings.html:362 #: pretix/control/templates/pretixcontrol/orders/cancel.html:62 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:6 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:9 #: pretix/plugins/sendmail/views.py:448 #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:31 #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:44 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:93 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:100 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:97 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:104 #: pretix/presale/templates/pretixpresale/event/index.html:200 #: pretix/presale/templates/pretixpresale/event/waitinglist.html:3 #: pretix/presale/templates/pretixpresale/event/waitinglist_remove.html:3 @@ -2177,7 +2196,7 @@ msgstr "قائمة الانتظار" #: pretix/base/exporters/items.py:80 pretix/base/models/discount.py:82 #: pretix/base/models/items.py:224 pretix/base/models/items.py:280 -#: pretix/base/models/items.py:562 pretix/base/models/items.py:1205 +#: pretix/base/models/items.py:561 pretix/base/models/items.py:1204 #: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 #: pretix/control/forms/subevents.py:345 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 @@ -2188,7 +2207,7 @@ msgstr "متاح من" #: pretix/base/exporters/items.py:81 pretix/base/models/discount.py:87 #: pretix/base/models/items.py:229 pretix/base/models/items.py:285 -#: pretix/base/models/items.py:572 pretix/base/models/items.py:1215 +#: pretix/base/models/items.py:571 pretix/base/models/items.py:1214 #: pretix/base/payment.py:400 pretix/control/forms/subevents.py:328 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:512 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:177 @@ -2196,70 +2215,70 @@ msgstr "متاح من" msgid "Available until" msgstr "متاح حتى" -#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:609 +#: pretix/base/exporters/items.py:82 pretix/base/models/items.py:608 msgid "This product can only be bought using a voucher." msgstr "لا يمكن شراء هذا المنتج إلا باستخدام كود خصم." -#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:622 +#: pretix/base/exporters/items.py:83 pretix/base/models/items.py:621 msgid "" "This product will only be shown if a voucher matching the product is " "redeemed." msgstr "سيظهر هذا المنتج فقط في حالة استرداد كود خصم مطابقة للمنتج." -#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:615 +#: pretix/base/exporters/items.py:84 pretix/base/models/items.py:614 msgid "Buying this product requires approval" msgstr "شراء هذا المنتج يتطلب موافقة" -#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:628 +#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:627 msgid "Only sell this product as part of a bundle" msgstr "قم ببيع هذا المنتج فقط كجزء من حزمة" -#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:635 +#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:634 msgid "Allow product to be canceled or changed" msgstr "السماح بإلغاء المنتج أو تغييره" -#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:641 +#: pretix/base/exporters/items.py:87 pretix/base/models/items.py:640 msgid "Minimum amount per order" msgstr "الحد الأدنى للمبلغ حسب كل طلب" -#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:648 +#: pretix/base/exporters/items.py:88 pretix/base/models/items.py:647 msgid "Maximum amount per order" msgstr "الحد الأقصى حسب كل طلب" #: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:284 -#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:656 -#: pretix/base/models/items.py:1242 pretix/base/models/orders.py:282 +#: pretix/base/modelimport_orders.py:652 pretix/base/models/items.py:655 +#: pretix/base/models/items.py:1241 pretix/base/models/orders.py:282 #: pretix/plugins/checkinlists/exporters.py:524 msgid "Requires special attention" msgstr "يتطلب اهتماما خاصا" #: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:285 -#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:663 -#: pretix/base/models/items.py:1249 pretix/base/models/orders.py:289 +#: pretix/base/modelimport_orders.py:661 pretix/base/models/items.py:662 +#: pretix/base/models/items.py:1248 pretix/base/models/orders.py:289 #: pretix/plugins/checkinlists/exporters.py:526 #, fuzzy #| msgid "Check-in list" msgid "Check-in text" msgstr "تحقق في قائمة" -#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:668 -#: pretix/base/models/items.py:1169 +#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:667 +#: pretix/base/models/items.py:1168 msgid "Original price" msgstr "السعر الأصلي" -#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:685 +#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:684 msgid "This product is a gift card" msgstr "هذا المنتج هو بطاقة هدية" -#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:691 -#: pretix/base/models/items.py:1190 +#: pretix/base/exporters/items.py:93 pretix/base/models/items.py:690 +#: pretix/base/models/items.py:1189 #: pretix/control/templates/pretixcontrol/item/include_variations.html:41 #: pretix/control/templates/pretixcontrol/item/include_variations.html:167 msgid "Require a valid membership" msgstr "يتتطلب عضوية سارية المفعول" -#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:700 -#: pretix/base/models/items.py:1199 +#: pretix/base/exporters/items.py:94 pretix/base/models/items.py:699 +#: pretix/base/models/items.py:1198 #, fuzzy #| msgid "Require a valid membership" msgid "Hide without a valid membership" @@ -2297,20 +2316,20 @@ msgid "" "position, and one with a line for every additional fee charged in an order." msgstr "" -#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:332 +#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:337 #: pretix/control/navigation.py:255 pretix/control/navigation.py:362 #: pretix/control/templates/pretixcontrol/orders/index.html:8 #: pretix/control/templates/pretixcontrol/orders/index.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer.html:199 #: pretix/plugins/reports/accountingreport.py:671 -#: pretix/plugins/reports/accountingreport.py:863 +#: pretix/plugins/reports/accountingreport.py:865 #: pretix/plugins/reports/exporters.py:669 pretix/plugins/statistics/apps.py:39 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:13 #: pretix/presale/views/customer.py:360 msgid "Orders" msgstr "طلبات" -#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2572 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2631 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "حالات الطلب" @@ -2339,8 +2358,8 @@ msgid "Only include orders created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." #: pretix/base/exporters/orderlist.py:137 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/base/settings.py:1110 -#: pretix/base/settings.py:1121 pretix/plugins/badges/exporters.py:499 +#: pretix/base/pdf.py:246 pretix/base/settings.py:1140 +#: pretix/base/settings.py:1151 pretix/plugins/badges/exporters.py:499 #: pretix/plugins/reports/exporters.py:316 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 @@ -2365,7 +2384,7 @@ msgstr "" #: pretix/base/exporters/orderlist.py:896 #: pretix/base/exporters/orderlist.py:1097 #: pretix/base/exporters/orderlist.py:1282 -#: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1672 +#: pretix/base/exporters/waitinglist.py:116 pretix/control/forms/event.py:1774 #: pretix/control/forms/organizer.py:116 msgid "Event slug" msgstr "رابط الفعالية" @@ -2384,10 +2403,10 @@ msgstr "رابط الفعالية" #: pretix/control/forms/filter.py:2395 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:52 #: pretix/control/templates/pretixcontrol/checkin/index.html:112 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:97 #: pretix/control/templates/pretixcontrol/events/index.html:90 -#: pretix/control/templates/pretixcontrol/order/index.html:795 -#: pretix/control/templates/pretixcontrol/order/index.html:891 +#: pretix/control/templates/pretixcontrol/order/index.html:826 +#: pretix/control/templates/pretixcontrol/order/index.html:922 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 @@ -2415,7 +2434,7 @@ msgstr "حالة" #: pretix/base/exporters/orderlist.py:456 #: pretix/base/exporters/orderlist.py:589 #: pretix/base/exporters/orderlist.py:900 pretix/base/notifications.py:203 -#: pretix/base/settings.py:1111 pretix/base/settings.py:1122 +#: pretix/base/settings.py:1141 pretix/base/settings.py:1152 #: pretix/control/forms/filter.py:2356 #: pretix/control/templates/pretixcontrol/order/index.html:183 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 @@ -2523,8 +2542,8 @@ msgstr "نوع الرسوم" #: pretix/base/exporters/orderlist.py:460 #: pretix/base/exporters/orderlist.py:601 #: pretix/base/exporters/orderlist.py:920 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3028 -#: pretix/base/pdf.py:160 pretix/control/forms/orders.py:638 +#: pretix/base/models/orders.py:1523 pretix/base/models/orders.py:3094 +#: pretix/base/pdf.py:161 pretix/control/forms/orders.py:638 #: pretix/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 #: pretix/control/templates/pretixcontrol/order/change.html:418 @@ -2563,8 +2582,8 @@ msgstr "معرف الحالة" #: pretix/base/forms/questions.py:661 pretix/base/models/memberships.py:145 #: pretix/control/forms/rrule.py:49 #: pretix/control/templates/pretixcontrol/events/index.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:792 -#: pretix/control/templates/pretixcontrol/order/index.html:886 +#: pretix/control/templates/pretixcontrol/order/index.html:823 +#: pretix/control/templates/pretixcontrol/order/index.html:917 #: pretix/control/templates/pretixcontrol/orders/refunds.html:55 #: pretix/control/templates/pretixcontrol/organizers/detail.html:66 #: pretix/control/templates/pretixcontrol/search/payments.html:83 @@ -2592,7 +2611,7 @@ msgstr "تاريخ الإنتهاء" #: pretix/base/exporters/orderlist.py:911 #: pretix/base/exporters/waitinglist.py:112 #: pretix/base/modelimport_orders.py:129 -#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:794 +#: pretix/base/modelimport_vouchers.py:174 pretix/base/models/items.py:793 #: pretix/base/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 #: pretix/control/forms/filter.py:2156 pretix/control/forms/filter.py:2411 #: pretix/control/forms/orders.py:335 pretix/control/forms/vouchers.py:67 @@ -2673,7 +2692,7 @@ msgid "Blocked" msgstr "محجوب" #: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2539 +#: pretix/base/models/orders.py:2598 #: pretix/control/templates/pretixcontrol/organizers/customer.html:118 #: pretix/plugins/checkinlists/exporters.py:533 #: pretix/plugins/checkinlists/exporters.py:707 @@ -2683,7 +2702,7 @@ msgid "Valid from" msgstr "من تاريخ" #: pretix/base/exporters/orderlist.py:629 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2544 +#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2603 #: pretix/base/models/vouchers.py:224 #: pretix/control/templates/pretixcontrol/organizers/customer.html:119 #: pretix/control/views/vouchers.py:119 @@ -2747,8 +2766,8 @@ msgid "Only include transactions created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." #: pretix/base/exporters/orderlist.py:895 pretix/base/models/event.py:695 -#: pretix/base/models/items.py:468 pretix/base/models/items.py:2060 -#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3111 +#: pretix/base/models/items.py:468 pretix/base/models/items.py:2059 +#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3196 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 #: pretix/base/notifications.py:187 #: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 @@ -2769,7 +2788,7 @@ msgstr "فعالية" #: pretix/base/exporters/orderlist.py:1383 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:50 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:34 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:36 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:15 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html:39 @@ -2796,13 +2815,13 @@ msgstr "كود المعاملة" msgid "Old data" msgstr "بيانات الطلب" -#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1554 #: pretix/control/templates/pretixcontrol/order/transactions.html:23 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:207 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:353 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:225 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:377 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:241 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:405 #: pretix/presale/templates/pretixpresale/event/voucher.html:234 #: pretix/presale/templates/pretixpresale/event/voucher.html:389 #, fuzzy @@ -2890,10 +2909,10 @@ msgstr "حالات استعادة المبلغ" #: pretix/base/exporters/orderlist.py:1097 #: pretix/base/exporters/orderlist.py:1239 -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:331 -#: pretix/base/models/orders.py:1740 pretix/base/models/orders.py:2168 -#: pretix/base/models/orders.py:2327 pretix/base/models/orders.py:2499 -#: pretix/base/models/orders.py:2990 +#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:336 +#: pretix/base/models/orders.py:1766 pretix/base/models/orders.py:2194 +#: pretix/base/models/orders.py:2356 pretix/base/models/orders.py:2555 +#: pretix/base/models/orders.py:3056 #: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:23 #: pretix/control/templates/pretixcontrol/organizers/customer.html:120 #: pretix/control/templates/pretixcontrol/search/payments.html:78 @@ -2921,7 +2940,7 @@ msgid "Creation date" msgstr "تاريخ الإنشاء" #: pretix/base/exporters/orderlist.py:1097 -#: pretix/control/templates/pretixcontrol/order/index.html:887 +#: pretix/control/templates/pretixcontrol/order/index.html:918 msgid "Completion date" msgstr "تاريخ الاكتمال" @@ -2931,16 +2950,16 @@ msgstr "رمز الحالة" #: pretix/base/exporters/orderlist.py:1098 #: pretix/base/exporters/orderlist.py:1237 -#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:1736 -#: pretix/base/models/orders.py:2164 pretix/control/forms/filter.py:1082 +#: pretix/base/exporters/orderlist.py:1282 pretix/base/models/orders.py:1762 +#: pretix/base/models/orders.py:2190 pretix/control/forms/filter.py:1082 #: pretix/control/forms/filter.py:1085 -#: pretix/control/templates/pretixcontrol/order/index.html:796 -#: pretix/control/templates/pretixcontrol/order/index.html:892 +#: pretix/control/templates/pretixcontrol/order/index.html:827 +#: pretix/control/templates/pretixcontrol/order/index.html:923 #: pretix/control/templates/pretixcontrol/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 #: pretix/plugins/banktransfer/payment.py:299 #: pretix/plugins/banktransfer/payment.py:308 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Amount" @@ -2949,8 +2968,8 @@ msgstr "المبلغ" #: pretix/base/exporters/orderlist.py:1098 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102 #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:115 -#: pretix/control/templates/pretixcontrol/order/index.html:794 -#: pretix/control/templates/pretixcontrol/order/index.html:889 +#: pretix/control/templates/pretixcontrol/order/index.html:825 +#: pretix/control/templates/pretixcontrol/order/index.html:920 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:85 #: pretix/plugins/reports/accountingreport.py:496 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:29 @@ -2991,11 +3010,11 @@ msgstr "الحصة الإجمالية" #: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 -#: pretix/control/views/item.py:970 +#: pretix/control/views/item.py:971 msgid "Paid orders" msgstr "الطلبات المدفوعة" -#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:975 +#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:976 msgid "Pending orders" msgstr "الطلبات المعلقة" @@ -3003,7 +3022,7 @@ msgstr "الطلبات المعلقة" msgid "Blocking vouchers" msgstr "حظر كود الخصم" -#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:994 +#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:995 msgid "Current user's carts" msgstr "عربات المستخدم الحالية" @@ -3018,7 +3037,7 @@ msgstr "المتوفر حاليا" #: pretix/base/exporters/orderlist.py:1173 #: pretix/base/exporters/orderlist.py:1180 #: pretix/control/templates/pretixcontrol/items/quota.html:58 -#: pretix/control/views/item.py:1001 +#: pretix/control/views/item.py:1002 msgid "Infinite" msgstr "غير محدود" @@ -3043,9 +3062,9 @@ msgstr "" #: pretix/base/exporters/orderlist.py:1234 #: pretix/base/exporters/orderlist.py:1282 #: pretix/base/exporters/orderlist.py:1378 pretix/base/models/giftcards.py:96 -#: pretix/base/payment.py:1485 +#: pretix/base/payment.py:1489 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:4 -#: pretix/control/templates/pretixcontrol/order/index.html:558 +#: pretix/control/templates/pretixcontrol/order/index.html:563 #: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:28 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:56 @@ -3077,7 +3096,7 @@ msgstr "وضع الاختبار" msgid "Organizer" msgstr "منظم" -#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:587 +#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:588 #: pretix/control/templates/pretixcontrol/base.html:281 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 @@ -3125,7 +3144,7 @@ msgstr "جهة الاصدار" #: pretix/control/navigation.py:568 #: pretix/control/templates/pretixcontrol/organizers/customer.html:285 #: pretix/control/templates/pretixcontrol/organizers/edit.html:156 -#: pretix/plugins/reports/accountingreport.py:899 +#: pretix/plugins/reports/accountingreport.py:907 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 #: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 #: pretix/presale/views/customer.py:372 @@ -3271,7 +3290,7 @@ msgid "Identifier" msgstr "معرف داخلي" #: pretix/base/exporters/reusablemedia.py:50 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3123 +#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3208 #: pretix/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" @@ -3374,16 +3393,16 @@ msgstr "" msgid "Keep me logged in" msgstr "احتفظ بتسجيل دخولي" -#: pretix/base/forms/auth.py:65 pretix/base/forms/auth.py:272 +#: pretix/base/forms/auth.py:65 pretix/base/forms/auth.py:285 msgid "This combination of credentials is not known to our system." msgstr "مجموعة بيانات الاعتماد هذه غير معروفة لدى نظامنا." -#: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:57 +#: pretix/base/forms/auth.py:66 pretix/base/forms/user.py:94 #: pretix/presale/forms/customer.py:385 pretix/presale/forms/customer.py:457 msgid "For security reasons, please wait 5 minutes before you try again." msgstr "لأسباب أمنية ، يرجى الانتظار 5 دقائق قبل المحاولة مرة أخرى." -#: pretix/base/forms/auth.py:67 pretix/base/forms/auth.py:273 +#: pretix/base/forms/auth.py:67 pretix/base/forms/auth.py:286 msgid "This account is inactive." msgstr "هذا الحساب غير مفعل." @@ -3395,16 +3414,27 @@ msgstr "" "تسجيل الدخول." #: pretix/base/forms/auth.py:157 pretix/base/forms/auth.py:215 -#: pretix/base/forms/user.py:56 pretix/control/forms/users.py:45 +#: pretix/base/forms/user.py:93 pretix/control/forms/users.py:45 #: pretix/presale/forms/customer.py:295 pretix/presale/forms/customer.py:384 msgid "Please enter the same password twice" msgstr "الرجاء إدخال نفس كلمة المرور مرتين" -#: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:224 +#: pretix/base/forms/auth.py:172 pretix/base/forms/auth.py:234 #: pretix/presale/forms/customer.py:308 pretix/presale/forms/customer.py:403 msgid "Repeat password" msgstr "أعد كلمة السر" +#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99 +#, fuzzy +#| msgid "Email address" +msgid "Your email address" +msgstr "عنوان البريد الإلكتروني" + +#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041 +#: pretix/control/templates/pretixcontrol/shredder/download.html:53 +msgid "Confirmation code" +msgstr "رمز التأكيد" + #: pretix/base/forms/questions.py:137 pretix/base/forms/questions.py:264 #, fuzzy #| msgid "No country specified." @@ -3526,55 +3556,12 @@ msgstr "" msgid "This field is required for the selected type of invoice transmission." msgstr "" -#: pretix/base/forms/user.py:51 pretix/control/forms/users.py:43 -msgid "" -"There already is an account associated with this email address. Please " -"choose a different one." -msgstr "" -"يوجد حساب مرتبط مع عنوان البريد الإلكتروني هذا. الرجاء اختيار بريد إلكتروني " -"مختلف." - -#: pretix/base/forms/user.py:53 -#, fuzzy -#| msgid "" -#| "Please enter your current password if you want to change your email " -#| "address or password." -msgid "" -"Please enter your current password if you want to change your email address " -"or password." -msgstr "" -"الرجاء إدخال كلمة المرور الحالية الخاصة بك إذا كنت ترغب في تغيير عنوان " -"البريد الإلكتروني الخاص بك أو كلمة المرور." - -#: pretix/base/forms/user.py:55 pretix/presale/forms/customer.py:383 -#: pretix/presale/forms/customer.py:456 -msgid "The current password you entered was not correct." -msgstr "كلمة المرور الحالية التي أدخلتها غير صحيحة." - -#: pretix/base/forms/user.py:58 -msgid "Please choose a password different to your current one." -msgstr "" - -#: pretix/base/forms/user.py:63 pretix/presale/forms/customer.py:392 -#: pretix/presale/forms/customer.py:461 -msgid "Your current password" -msgstr "كلمة السر الحالية الخاصة بك" - -#: pretix/base/forms/user.py:67 pretix/control/forms/users.py:50 -#: pretix/presale/forms/customer.py:397 -msgid "New password" -msgstr "كلمة المرور الجديدة" - -#: pretix/base/forms/user.py:71 pretix/control/forms/users.py:54 -msgid "Repeat new password" -msgstr "أعد إدخال كلمة المرور الجديدة" - -#: pretix/base/forms/user.py:75 pretix/control/forms/organizer.py:458 +#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458 #: pretix/control/forms/users.py:58 msgid "Default timezone" msgstr "المنطقة الزمنية الافتراضية" -#: pretix/base/forms/user.py:76 pretix/control/forms/users.py:59 +#: pretix/base/forms/user.py:55 pretix/control/forms/users.py:59 msgid "" "Only used for views that are not bound to an event. For all event views, the " "event timezone is used instead." @@ -3582,22 +3569,71 @@ msgstr "" "تستخدم فقط للمشاهدات غير المرتبطة بفعالية. بالنسبة لجميع الفعاليات، يتم " "استخدام المنطقة الزمنية للفعالية بدلا من ذلك." -#: pretix/base/forms/user.py:175 +#: pretix/base/forms/user.py:77 +#, fuzzy +#| msgid "Attendee email address" +msgid "Change email address" +msgstr "عنوان البريد الإلكتروني للحاضر" + +#: pretix/base/forms/user.py:83 msgid "Device name" msgstr "اسم الجهاز" -#: pretix/base/forms/user.py:176 +#: pretix/base/forms/user.py:84 msgid "Device type" msgstr "نوع الجهاز" -#: pretix/base/forms/user.py:177 +#: pretix/base/forms/user.py:85 msgid "Smartphone with the Authenticator application" msgstr "هاتف ذكي مع تطبيق المصادقة" -#: pretix/base/forms/user.py:178 +#: pretix/base/forms/user.py:86 msgid "WebAuthn-compatible hardware token (e.g. Yubikey)" msgstr "رمز جهاز متوافق مع WebAuthn (مثل Yubikey)" +#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:383 +#: pretix/presale/forms/customer.py:456 +msgid "The current password you entered was not correct." +msgstr "كلمة المرور الحالية التي أدخلتها غير صحيحة." + +#: pretix/base/forms/user.py:95 +msgid "Please choose a password different to your current one." +msgstr "" + +#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:392 +#: pretix/presale/forms/customer.py:461 +msgid "Your current password" +msgstr "كلمة السر الحالية الخاصة بك" + +#: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50 +#: pretix/presale/forms/customer.py:397 +msgid "New password" +msgstr "كلمة المرور الجديدة" + +#: pretix/base/forms/user.py:117 pretix/control/forms/users.py:54 +msgid "Repeat new password" +msgstr "أعد إدخال كلمة المرور الجديدة" + +#: pretix/base/forms/user.py:176 pretix/control/forms/users.py:43 +msgid "" +"There already is an account associated with this email address. Please " +"choose a different one." +msgstr "" +"يوجد حساب مرتبط مع عنوان البريد الإلكتروني هذا. الرجاء اختيار بريد إلكتروني " +"مختلف." + +#: pretix/base/forms/user.py:179 +#, fuzzy +#| msgid "Email address" +msgid "Old email address" +msgstr "عنوان البريد الإلكتروني" + +#: pretix/base/forms/user.py:180 +#, fuzzy +#| msgid "Email address" +msgid "New email address" +msgstr "عنوان البريد الإلكتروني" + #: pretix/base/forms/validators.py:51 msgid "" "There is an error with your placeholder syntax. Please check that the " @@ -3606,7 +3642,7 @@ msgid "" "\"{{\" and \"}}\"." msgstr "" -#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:851 +#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:870 #, fuzzy, python-format #| msgid "Invalid placeholder(s): %(value)s" msgid "Invalid placeholder: {%(value)s}" @@ -3623,7 +3659,7 @@ msgstr "مدينة مثال" msgid "Available placeholders: {list}" msgstr "النائبة المتاحة: {list}" -#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1656 +#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1655 #: pretix/plugins/checkinlists/exporters.py:757 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54 @@ -3700,68 +3736,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:142 +#: pretix/base/invoicing/pdf.py:143 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "صفحة %d من %d" -#: pretix/base/invoicing/pdf.py:383 +#: pretix/base/invoicing/pdf.py:384 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "المقدم الكلاسيكي (pretix 1.0)" -#: pretix/base/invoicing/pdf.py:427 +#: pretix/base/invoicing/pdf.py:428 msgctxt "invoice" msgid "Invoice from" msgstr "فاتورة من طرف" -#: pretix/base/invoicing/pdf.py:433 +#: pretix/base/invoicing/pdf.py:434 msgctxt "invoice" msgid "Invoice to" msgstr "فاتورة إلى" -#: pretix/base/invoicing/pdf.py:470 pretix/base/invoicing/pdf.py:1143 +#: pretix/base/invoicing/pdf.py:471 pretix/base/invoicing/pdf.py:1222 msgctxt "invoice" msgid "Order code" msgstr "رمز الطلب" -#: pretix/base/invoicing/pdf.py:479 pretix/base/invoicing/pdf.py:1156 +#: pretix/base/invoicing/pdf.py:480 pretix/base/invoicing/pdf.py:1235 msgctxt "invoice" msgid "Cancellation number" msgstr "رقم الإلغاء" -#: pretix/base/invoicing/pdf.py:485 pretix/base/invoicing/pdf.py:1158 +#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1237 msgctxt "invoice" msgid "Original invoice" msgstr "فاتورة أصلية" -#: pretix/base/invoicing/pdf.py:490 pretix/base/invoicing/pdf.py:1163 +#: pretix/base/invoicing/pdf.py:491 pretix/base/invoicing/pdf.py:1242 msgctxt "invoice" msgid "Invoice number" msgstr "رقم الفاتورة" -#: pretix/base/invoicing/pdf.py:498 pretix/base/invoicing/pdf.py:1178 +#: pretix/base/invoicing/pdf.py:499 pretix/base/invoicing/pdf.py:1257 msgctxt "invoice" msgid "Cancellation date" msgstr "تاريخ الإلغاء" -#: pretix/base/invoicing/pdf.py:504 +#: pretix/base/invoicing/pdf.py:505 msgctxt "invoice" msgid "Original invoice date" msgstr "تاريخ الفاتورة الأصلي" -#: pretix/base/invoicing/pdf.py:511 pretix/base/invoicing/pdf.py:1180 +#: pretix/base/invoicing/pdf.py:512 pretix/base/invoicing/pdf.py:1259 msgctxt "invoice" msgid "Invoice date" msgstr "تاريخ الفاتورة" -#: pretix/base/invoicing/pdf.py:527 +#: pretix/base/invoicing/pdf.py:528 msgctxt "invoice" msgid "Event" msgstr "الفعالية" -#: pretix/base/invoicing/pdf.py:561 +#: pretix/base/invoicing/pdf.py:562 #, python-brace-format msgctxt "invoice" msgid "" @@ -3771,39 +3807,39 @@ msgstr "" "من {from_date}\n" "حتى {to_date}" -#: pretix/base/invoicing/pdf.py:608 pretix/base/services/mail.py:511 +#: pretix/base/invoicing/pdf.py:609 pretix/base/services/mail.py:512 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "فاتورة {num}" -#: pretix/base/invoicing/pdf.py:660 +#: pretix/base/invoicing/pdf.py:661 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "رقم مرجع العميل: {reference}" -#: pretix/base/invoicing/pdf.py:668 +#: pretix/base/invoicing/pdf.py:669 msgctxt "invoice" msgid "Customer VAT ID" msgstr "معرف ضريبة القيمة المضافة للعميل" -#: pretix/base/invoicing/pdf.py:675 +#: pretix/base/invoicing/pdf.py:676 msgctxt "invoice" msgid "Beneficiary" msgstr "المستفيد" -#: pretix/base/invoicing/pdf.py:708 +#: pretix/base/invoicing/pdf.py:709 msgctxt "invoice" msgid "Tax Invoice" msgstr "فاتورة الضريبة" -#: pretix/base/invoicing/pdf.py:709 +#: pretix/base/invoicing/pdf.py:710 msgctxt "invoice" msgid "Invoice" msgstr "فاتورة" -#: pretix/base/invoicing/pdf.py:710 +#: pretix/base/invoicing/pdf.py:711 #: pretix/control/templates/pretixcontrol/order/index.html:272 #: pretix/control/templates/pretixcontrol/order/mail_history.html:70 #: pretix/presale/templates/pretixpresale/event/order.html:244 @@ -3811,106 +3847,106 @@ msgctxt "invoice" msgid "Cancellation" msgstr "إلغاء" -#: pretix/base/invoicing/pdf.py:732 pretix/base/invoicing/pdf.py:740 +#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 msgctxt "invoice" msgid "Description" msgstr "وصف" -#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 +#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:742 msgctxt "invoice" msgid "Qty" msgstr "الكمية" -#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:960 +#: pretix/base/invoicing/pdf.py:735 pretix/base/invoicing/pdf.py:1039 msgctxt "invoice" msgid "Tax rate" msgstr "معدل الضريبة" -#: pretix/base/invoicing/pdf.py:735 +#: pretix/base/invoicing/pdf.py:736 msgctxt "invoice" msgid "Net" msgstr "الصافي" -#: pretix/base/invoicing/pdf.py:736 +#: pretix/base/invoicing/pdf.py:737 msgctxt "invoice" msgid "Gross" msgstr "الإجمالي" -#: pretix/base/invoicing/pdf.py:742 +#: pretix/base/invoicing/pdf.py:743 msgctxt "invoice" msgid "Amount" msgstr "المبلغ" -#: pretix/base/invoicing/pdf.py:818 +#: pretix/base/invoicing/pdf.py:870 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:842 +#: pretix/base/invoicing/pdf.py:901 #, fuzzy, python-brace-format #| msgid "Original price" msgctxt "invoice" msgid "Single price: {price}" msgstr "السعر الأصلي" -#: pretix/base/invoicing/pdf.py:863 pretix/base/invoicing/pdf.py:869 +#: pretix/base/invoicing/pdf.py:944 pretix/base/invoicing/pdf.py:949 msgctxt "invoice" msgid "Invoice total" msgstr "إجمالي الفاتورة" -#: pretix/base/invoicing/pdf.py:879 +#: pretix/base/invoicing/pdf.py:958 msgctxt "invoice" msgid "Received payments" msgstr "المدفوعات المستلمة" -#: pretix/base/invoicing/pdf.py:884 +#: pretix/base/invoicing/pdf.py:963 msgctxt "invoice" msgid "Outstanding payments" msgstr "المدفوعات المتأخرة" -#: pretix/base/invoicing/pdf.py:901 +#: pretix/base/invoicing/pdf.py:980 #, fuzzy #| msgid "Issued gift cards" msgctxt "invoice" msgid "Paid by gift card" msgstr "بطاقات هدية صدر" -#: pretix/base/invoicing/pdf.py:906 +#: pretix/base/invoicing/pdf.py:985 #, fuzzy #| msgid "Pending amount" msgctxt "invoice" msgid "Remaining amount" msgstr "مبالغ متأخرة" -#: pretix/base/invoicing/pdf.py:930 +#: pretix/base/invoicing/pdf.py:1009 #, fuzzy, python-brace-format #| msgid "Event date range" msgctxt "invoice" msgid "Invoice period: {daterange}" msgstr "نطاق تاريخ الفعالية" -#: pretix/base/invoicing/pdf.py:961 +#: pretix/base/invoicing/pdf.py:1040 msgctxt "invoice" msgid "Net value" msgstr "صافي القيمة" -#: pretix/base/invoicing/pdf.py:962 +#: pretix/base/invoicing/pdf.py:1041 msgctxt "invoice" msgid "Gross value" msgstr "القيمة الإجمالية" -#: pretix/base/invoicing/pdf.py:963 +#: pretix/base/invoicing/pdf.py:1042 msgctxt "invoice" msgid "Tax" msgstr "الضريبة" -#: pretix/base/invoicing/pdf.py:993 +#: pretix/base/invoicing/pdf.py:1072 msgctxt "invoice" msgid "Included taxes" msgstr "الضرائب المدرجة" -#: pretix/base/invoicing/pdf.py:1021 +#: pretix/base/invoicing/pdf.py:1100 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -3924,7 +3960,7 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، وهذا يعادل:" -#: pretix/base/invoicing/pdf.py:1036 +#: pretix/base/invoicing/pdf.py:1115 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -3938,22 +3974,22 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، إجمالي الفاتورة يعادل {total}." -#: pretix/base/invoicing/pdf.py:1050 +#: pretix/base/invoicing/pdf.py:1129 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1139 +#: pretix/base/invoicing/pdf.py:1218 #, fuzzy #| msgid "Please enter a valid state." msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "الرجاء اختيار ولاية صحيحة." -#: pretix/base/invoicing/pdf.py:1186 +#: pretix/base/invoicing/pdf.py:1265 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1205 +#: pretix/base/invoicing/pdf.py:1284 #, fuzzy, python-brace-format #| msgid "Event date range" msgctxt "invoice" @@ -4096,9 +4132,9 @@ msgstr "" msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1174 -#: pretix/control/views/orders.py:1203 pretix/control/views/orders.py:1248 -#: pretix/control/views/orders.py:1283 pretix/control/views/orders.py:1306 +#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1179 +#: pretix/control/views/orders.py:1208 pretix/control/views/orders.py:1253 +#: pretix/control/views/orders.py:1288 pretix/control/views/orders.py:1311 msgid "You entered an invalid number." msgstr "لقد أدخلت رقما غير صالح." @@ -4157,7 +4193,7 @@ msgid "Multiple matching products were found." msgstr "تم العثور على منتجات مطابقة متعددة." #: pretix/base/modelimport_orders.py:160 -#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1257 +#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1256 #: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99 msgid "Product variation" msgstr "نوع المنتج" @@ -4214,7 +4250,7 @@ msgstr "عنوان البريد الإلكتروني للحاضر" #: pretix/control/forms/filter.py:687 pretix/control/forms/filter.py:691 #: pretix/control/forms/filter.py:695 pretix/control/forms/filter.py:700 #: pretix/control/forms/filter.py:705 -#: pretix/control/templates/pretixcontrol/order/index.html:603 +#: pretix/control/templates/pretixcontrol/order/index.html:608 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196 msgid "Attendee address" @@ -4230,7 +4266,7 @@ msgstr "احسب من المنتج" #: pretix/base/modelimport_orders.py:486 #: pretix/control/templates/pretixcontrol/checkin/index.html:111 -#: pretix/control/templates/pretixcontrol/order/index.html:531 +#: pretix/control/templates/pretixcontrol/order/index.html:536 msgid "Ticket code" msgstr "رمز التذكرة" @@ -4287,8 +4323,8 @@ msgstr "المقعد الذي اخترته قد تم شغله مسبقا. الر msgid "You need to select a specific seat." msgstr "يجب أن تختار مقعدا محددا." -#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1671 -#: pretix/base/models/items.py:1766 pretix/control/forms/item.py:147 +#: pretix/base/modelimport_orders.py:691 pretix/base/models/items.py:1670 +#: pretix/base/models/items.py:1765 pretix/control/forms/item.py:148 #: pretix/control/templates/pretixcontrol/items/question_edit.html:10 #: pretix/control/templates/pretixcontrol/items/question_edit.html:17 #: pretix/control/templates/pretixcontrol/items/questions.html:21 @@ -4296,7 +4332,7 @@ msgid "Question" msgstr "سؤال" #: pretix/base/modelimport_orders.py:701 pretix/base/modelimport_orders.py:709 -#: pretix/base/models/items.py:1830 pretix/base/models/items.py:1848 +#: pretix/base/models/items.py:1829 pretix/base/models/items.py:1847 msgid "Invalid option selected." msgstr "تم تحديد خيار غير صحيح." @@ -4366,7 +4402,7 @@ msgstr "قيمة كود الخصم" msgid "It is pointless to set a value without a price mode." msgstr "" -#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2121 +#: pretix/base/modelimport_vouchers.py:237 pretix/base/models/items.py:2120 #: pretix/base/models/vouchers.py:275 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:8 #: pretix/control/templates/pretixcontrol/items/quota_edit.html:15 @@ -4417,37 +4453,37 @@ msgid "" "voucher" msgstr "" -#: pretix/base/models/auth.py:248 +#: pretix/base/models/auth.py:252 msgid "Is active" msgstr "نشط" -#: pretix/base/models/auth.py:250 +#: pretix/base/models/auth.py:254 msgid "Is site admin" msgstr "مشرف الموقع" -#: pretix/base/models/auth.py:252 +#: pretix/base/models/auth.py:256 msgid "Date joined" msgstr "تاريخ الانضمام" -#: pretix/base/models/auth.py:254 +#: pretix/base/models/auth.py:258 #, fuzzy #| msgid "Request a new password" msgid "Force user to select a new password" msgstr "اطلب كلمة مرور جديدة" -#: pretix/base/models/auth.py:264 +#: pretix/base/models/auth.py:268 msgid "Two-factor authentication is required to log in" msgstr "المصادقة الثنائية مطلوبة لتسجيل الدخول" -#: pretix/base/models/auth.py:268 +#: pretix/base/models/auth.py:272 msgid "Receive notifications according to my settings below" msgstr "تلقي الإخطارات وفقا لإعداداتي التالية" -#: pretix/base/models/auth.py:269 +#: pretix/base/models/auth.py:273 msgid "If turned off, you will not get any notifications." msgstr "إذا قمت بإيقاف التشغيل، فلن تتلقى أي إشعارات." -#: pretix/base/models/auth.py:283 +#: pretix/base/models/auth.py:287 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:23 #: pretix/control/templates/pretixcontrol/orders/index.html:135 #: pretix/control/templates/pretixcontrol/search/orders.html:54 @@ -4455,21 +4491,41 @@ msgstr "إذا قمت بإيقاف التشغيل، فلن تتلقى أي إش #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:15 #: pretix/control/templates/pretixcontrol/users/form.html:4 #: pretix/control/templates/pretixcontrol/users/form.html:6 -#: pretix/control/views/organizer.py:170 tests/base/test_mail.py:149 +#: pretix/control/views/organizer.py:170 tests/base/test_mail.py:157 msgid "User" msgstr "المستخدم" -#: pretix/base/models/auth.py:284 pretix/control/navigation.py:411 +#: pretix/base/models/auth.py:288 pretix/control/navigation.py:411 #: pretix/control/templates/pretixcontrol/users/index.html:5 #: pretix/control/templates/pretixcontrol/users/index.html:7 msgid "Users" msgstr "المستخدمون" -#: pretix/base/models/auth.py:342 +#: pretix/base/models/auth.py:346 msgid "Account information changed" msgstr "تغييرت معلومات الحساب" -#: pretix/base/models/auth.py:360 +#: pretix/base/models/auth.py:374 +#, python-brace-format +msgid "" +"to confirm changing your email address from {old_email}\n" +"to {new_email}, use the following code:" +msgstr "" + +#: pretix/base/models/auth.py:378 +#, python-brace-format +msgid "" +"to confirm that your email address {email} belongs to your pretix account, " +"use the following code:" +msgstr "" + +#: pretix/base/models/auth.py:392 +#, fuzzy +#| msgid "Confirmation code" +msgid "pretix confirmation code" +msgstr "رمز التأكيد" + +#: pretix/base/models/auth.py:435 #: pretix/control/templates/pretixcontrol/auth/forgot.html:7 msgid "Password recovery" msgstr "استعادة كلمة السر" @@ -4661,7 +4717,7 @@ msgid "Single-sign-on method" msgstr "طريقة الاسترداد" #: pretix/base/models/customers.py:92 pretix/base/models/devices.py:71 -#: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 +#: pretix/base/models/items.py:1675 pretix/base/models/items.py:1951 msgid "" "You can enter any value here to make it easier to match the data with other " "sources. If you do not input one, we will generate one automatically." @@ -4686,13 +4742,13 @@ msgstr "" msgid "disabled" msgstr "معاق" -#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1538 -#: pretix/base/models/orders.py:3294 pretix/base/settings.py:1179 +#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1564 +#: pretix/base/models/orders.py:3392 pretix/base/settings.py:1210 msgid "Company name" msgstr "اسم الشركة" -#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3301 pretix/base/settings.py:83 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1568 +#: pretix/base/models/orders.py:3399 pretix/base/settings.py:91 #: pretix/plugins/stripe/payment.py:272 msgid "Select country" msgstr "اختر الدولة" @@ -4780,11 +4836,11 @@ msgstr "" msgid "System error, needs manual intervention" msgstr "" -#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1675 +#: pretix/base/models/devices.py:70 pretix/base/models/items.py:1674 msgid "Internal identifier" msgstr "معرف داخلي" -#: pretix/base/models/devices.py:90 pretix/base/models/items.py:1788 +#: pretix/base/models/devices.py:90 pretix/base/models/items.py:1787 msgid "This identifier is already used for a different question." msgstr "هذا المعرف مستخدم مسبقا لسؤال مختلف." @@ -4825,8 +4881,8 @@ msgctxt "subevent" msgid "Each matching product must be for a different date" msgstr "أضف تذاكر لتاريخ مختلف" -#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1161 -#: pretix/base/models/items.py:1481 pretix/base/models/items.py:1708 +#: pretix/base/models/discount.py:69 pretix/base/models/items.py:1160 +#: pretix/base/models/items.py:1480 pretix/base/models/items.py:1707 #: pretix/base/models/organizer.py:619 msgid "Position" msgstr "حالة" @@ -5009,7 +5065,7 @@ msgstr "" msgid "The slug may only contain letters, numbers, dots and dashes." msgstr "يجب أن يحتوي الرابط فقط على أحرف وأرقام ونقاط وشرطات." -#: pretix/base/models/event.py:624 pretix/base/models/event.py:1519 +#: pretix/base/models/event.py:624 pretix/base/models/event.py:1525 msgid "Show in lists" msgstr "أظهرهذا في قوائم" @@ -5021,7 +5077,7 @@ msgstr "" "إذا تم تحديدها، فستظهر هذه الفعالية بشكل عام في قائمة الفعاليات لحساب المنظم " "الخاص بك." -#: pretix/base/models/event.py:629 pretix/base/models/event.py:1534 +#: pretix/base/models/event.py:629 pretix/base/models/event.py:1540 #: pretix/control/forms/subevents.py:100 msgid "" "Optional. No products will be sold after this date. If you do not set this " @@ -5030,7 +5086,7 @@ msgstr "" "اختياري. لن يتم بيع أي منتجات بعد هذا التاريخ. إذا لم تقم بتعيين هذه " "القيمة ، فسينتهي عرض ما قبل البيع بعد تاريخ انتهاء الفعالية الخاصة بك." -#: pretix/base/models/event.py:635 pretix/base/models/event.py:1540 +#: pretix/base/models/event.py:635 pretix/base/models/event.py:1546 #: pretix/control/forms/subevents.py:94 msgid "Optional. No products will be sold before this date." msgstr "اختياري. لن يتم بيع أي منتجات قبل هذا التاريخ." @@ -5050,7 +5106,7 @@ msgstr "" msgid "Plugins" msgstr "الإضافات" -#: pretix/base/models/event.py:672 pretix/base/pdf.py:240 +#: pretix/base/models/event.py:672 pretix/base/pdf.py:241 #: pretix/control/forms/event.py:273 pretix/control/forms/filter.py:1706 #: pretix/control/templates/pretixcontrol/event/index.html:13 #: pretix/control/templates/pretixcontrol/events/index.html:114 @@ -5062,20 +5118,20 @@ msgstr "الإضافات" msgid "Event series" msgstr "فعالية بأوقات مختلفة" -#: pretix/base/models/event.py:676 pretix/base/models/event.py:1568 +#: pretix/base/models/event.py:676 pretix/base/models/event.py:1574 #, fuzzy #| msgid "Settings" msgid "Seating plan" msgstr "الإعدادات" -#: pretix/base/models/event.py:683 pretix/base/models/items.py:675 +#: pretix/base/models/event.py:683 pretix/base/models/items.py:674 #, fuzzy #| msgid "Sales channels" msgid "Sell on all sales channels" msgstr "قنوات البيع" -#: pretix/base/models/event.py:688 pretix/base/models/items.py:680 -#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 +#: pretix/base/models/event.py:688 pretix/base/models/items.py:679 +#: pretix/base/models/items.py:1229 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "يقتصر على قنوات بيع محددة" @@ -5092,14 +5148,14 @@ msgstr "يقتصر على قنوات بيع محددة" msgid "Events" msgstr "فعاليات" -#: pretix/base/models/event.py:1339 +#: pretix/base/models/event.py:1345 msgid "" "You have configured at least one paid product but have not enabled any " "payment methods." msgstr "" "لقد قمت بإعداد منتج مدفوع واحد على الأقل، ولكن لم تقم بتفعيل أي وسيلة سداد." -#: pretix/base/models/event.py:1342 +#: pretix/base/models/event.py:1348 #, fuzzy #| msgid "" #| "You have configured at least one paid product but have not enabled any " @@ -5110,37 +5166,37 @@ msgid "" msgstr "" "لقد قمت بإعداد منتج مدفوع واحد على الأقل، ولكن لم تقم بتفعيل أي وسيلة سداد." -#: pretix/base/models/event.py:1345 +#: pretix/base/models/event.py:1351 msgid "You need to configure at least one quota to sell anything." msgstr "تحتاج إلى إعداد حصة واحدة على الأقل لبيع أي شيء." -#: pretix/base/models/event.py:1350 +#: pretix/base/models/event.py:1356 #, python-brace-format msgid "You need to fill the meta parameter \"{property}\"." msgstr "تحتاج إلى ملء المعلومة الوصفية \"{property}\"." -#: pretix/base/models/event.py:1465 +#: pretix/base/models/event.py:1471 msgid "" "Once created an event cannot change between an series and a single event." msgstr "بمجرد إنشاء فعالية لا يمكن التغيير بين سلسلة فعاليات وفعالية واحدة." -#: pretix/base/models/event.py:1471 +#: pretix/base/models/event.py:1477 msgid "The event slug cannot be changed." msgstr "لا يمكن تغيير رابط الفعالية." -#: pretix/base/models/event.py:1474 +#: pretix/base/models/event.py:1480 msgid "This slug has already been used for a different event." msgstr "لقد تم استخدام هذا الرابط مسبقا لفعالية مختلفة." -#: pretix/base/models/event.py:1480 +#: pretix/base/models/event.py:1486 msgid "The event cannot end before it starts." msgstr "لا يمكن أن تنتهي الفعالية قبل أن تبدأ." -#: pretix/base/models/event.py:1486 +#: pretix/base/models/event.py:1492 msgid "The event's presale cannot end before it starts." msgstr "لا يمكن أن ينتهي العرض المسبق للفعالية قبل أن يبدأ." -#: pretix/base/models/event.py:1516 +#: pretix/base/models/event.py:1522 msgid "" "Only with this checkbox enabled, this date is visible in the frontend to " "users." @@ -5148,7 +5204,7 @@ msgstr "" "يكون هذا التاريخ مرئيا في الواجهة الأمامية للمستخدمين فقط في حال تم تمكين " "مربع الاختيار هذا." -#: pretix/base/models/event.py:1520 +#: pretix/base/models/event.py:1526 msgid "" "If selected, this event will show up publicly on the list of dates for your " "event." @@ -5156,44 +5212,44 @@ msgstr "" "إذا تم الحديد، فستظهر هذه الفعالية بشكل عام في قائمة تواريخ الفعالية الخاصة " "بك." -#: pretix/base/models/event.py:1565 pretix/base/settings.py:3145 +#: pretix/base/models/event.py:1571 pretix/base/settings.py:3199 msgid "Frontpage text" msgstr "نص الصفحة الأولى" -#: pretix/base/models/event.py:1582 +#: pretix/base/models/event.py:1588 msgid "Date in event series" msgstr "التاريخ في سلسلة الفعالية" -#: pretix/base/models/event.py:1583 +#: pretix/base/models/event.py:1589 msgid "Dates in event series" msgstr "التواريخ في سلسلة الفعالية" -#: pretix/base/models/event.py:1724 +#: pretix/base/models/event.py:1730 msgid "One or more variations do not belong to this event." msgstr "عنصر أو أكثر لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/event.py:1754 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1760 pretix/base/models/items.py:2235 msgid "Can not contain spaces or special characters except underscores" msgstr "لا يمكن أن يحتوي على مسافات أو أحرف خاصة باستثناء الشرطات السفلية" -#: pretix/base/models/event.py:1759 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1765 pretix/base/models/items.py:2240 msgid "The property name may only contain letters, numbers and underscores." msgstr "لا يسمح أن يحتوي اسم الملكية إلا على أحرف وأرقام وشرطات سفلية فقط." -#: pretix/base/models/event.py:1764 +#: pretix/base/models/event.py:1770 msgid "Default value" msgstr "القيمة الافتراضية" -#: pretix/base/models/event.py:1766 +#: pretix/base/models/event.py:1772 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "لا يمكن تغييرها إلا من قبل المسؤولين برتبة منظم" -#: pretix/base/models/event.py:1768 +#: pretix/base/models/event.py:1774 msgid "Required for events" msgstr "مطلوب للفعاليات" -#: pretix/base/models/event.py:1769 +#: pretix/base/models/event.py:1775 msgid "" "If checked, an event can only be taken live if the property is set. In event " "series, its always optional to set a value for individual dates" @@ -5201,53 +5257,53 @@ msgstr "" "إذا تم تحديده ، فلا يمكن أن تكون الفعالية مباشرة إلا إذا تم تعيين الخاصية. " "في سلسلة الفعالية، يكون دائما تعيين قيمة للتواريخ الفردية أمرا اختياريا" -#: pretix/base/models/event.py:1775 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1781 pretix/base/models/items.py:2252 msgid "Valid values" msgstr "قيم صالحة" -#: pretix/base/models/event.py:1778 +#: pretix/base/models/event.py:1784 #: pretix/control/templates/pretixcontrol/organizers/properties.html:45 #, fuzzy #| msgid "Show number of tickets left" msgid "Show filter option to customers" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/models/event.py:1779 +#: pretix/base/models/event.py:1785 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1782 pretix/control/forms/organizer.py:269 +#: pretix/base/models/event.py:1788 pretix/control/forms/organizer.py:269 #: pretix/control/forms/organizer.py:273 #, fuzzy #| msgid "Public profile" msgid "Public name" msgstr "حساب عام" -#: pretix/base/models/event.py:1786 +#: pretix/base/models/event.py:1792 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1787 +#: pretix/base/models/event.py:1793 msgid "" "This field will be shown to filter events or reports in the backend, and it " "can also be used for hidden filter parameters in the frontend (e.g. using " "the widget)." msgstr "" -#: pretix/base/models/event.py:1797 +#: pretix/base/models/event.py:1803 msgid "A property can either be required or have a default value, not both." msgstr "يمكن أن تكون الخاصية إما مطلوبة أو لها قيمة افتراضية ، وليس كليهما." -#: pretix/base/models/event.py:1877 pretix/base/models/organizer.py:582 +#: pretix/base/models/event.py:1883 pretix/base/models/organizer.py:582 #, fuzzy #| msgid "Info text" msgid "Link text" msgstr "معلومات النص" -#: pretix/base/models/event.py:1880 pretix/base/models/organizer.py:585 +#: pretix/base/models/event.py:1886 pretix/base/models/organizer.py:585 #, fuzzy #| msgid "Imprint URL" msgid "Link URL" @@ -5265,7 +5321,7 @@ msgid "Additional recipients" msgstr "إعدادات إضافية" #: pretix/base/models/exports.py:61 pretix/base/models/exports.py:66 -#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:989 +#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:1088 #: pretix/control/forms/organizer.py:586 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -5282,9 +5338,9 @@ msgstr "إعدادات إضافية" msgid "Additional recipients (Bcc)" msgstr "إعدادات إضافية" -#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1095 -#: pretix/control/forms/event.py:1169 pretix/control/forms/event.py:1179 -#: pretix/control/forms/event.py:1189 pretix/control/forms/event.py:1204 +#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1194 +#: pretix/control/forms/event.py:1268 pretix/control/forms/event.py:1278 +#: pretix/control/forms/event.py:1288 pretix/control/forms/event.py:1303 #: pretix/control/forms/orders.py:730 pretix/control/forms/orders.py:952 #: pretix/control/forms/orders.py:979 pretix/control/forms/organizer.py:607 #: pretix/control/forms/organizer.py:617 pretix/control/forms/organizer.py:627 @@ -5379,13 +5435,13 @@ msgstr "(غير معروف)" msgid "not transmitted due to test mode" msgstr "في وضع الاختبار الخاص" -#: pretix/base/models/invoices.py:220 +#: pretix/base/models/invoices.py:221 #, python-format msgctxt "invoice" msgid "Tax ID: %s" msgstr "رقم تعريف الضريبة: %s" -#: pretix/base/models/invoices.py:226 pretix/base/services/invoices.py:154 +#: pretix/base/models/invoices.py:240 pretix/base/services/invoices.py:155 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -5420,17 +5476,17 @@ msgstr "" "مصادر قوائم الإضافات." #: pretix/base/models/items.py:114 pretix/base/models/items.py:159 -#: pretix/control/forms/item.py:97 +#: pretix/control/forms/item.py:98 #, fuzzy #| msgid "No category" msgid "Normal category" msgstr "ليس هناك فئة" -#: pretix/base/models/items.py:115 pretix/control/forms/item.py:110 +#: pretix/base/models/items.py:115 pretix/control/forms/item.py:111 msgid "Normal + cross-selling category" msgstr "" -#: pretix/base/models/items.py:116 pretix/control/forms/item.py:105 +#: pretix/base/models/items.py:116 pretix/control/forms/item.py:106 #, fuzzy #| msgid "No category" msgid "Cross-selling category" @@ -5483,12 +5539,12 @@ msgid "Disable product for this date" msgstr "تعطيل المنتج لهذا التاريخ" #: pretix/base/models/items.py:226 pretix/base/models/items.py:282 -#: pretix/base/models/items.py:564 +#: pretix/base/models/items.py:563 msgid "This product will not be sold before the given date." msgstr "لن يتم بيع هذا المنتج قبل التاريخ المعين." #: pretix/base/models/items.py:231 pretix/base/models/items.py:287 -#: pretix/base/models/items.py:574 +#: pretix/base/models/items.py:573 msgid "This product will not be sold after the given date." msgstr "لن يتم بيع هذا المنتج بعد التاريخ المحدد." @@ -5510,21 +5566,21 @@ msgstr "عميل" msgid "Dynamic validity" msgstr "صلاحية بطاقة هدية" -#: pretix/base/models/items.py:444 pretix/control/forms/item.py:668 +#: pretix/base/models/items.py:444 pretix/control/forms/item.py:671 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:3 #, fuzzy #| msgid "Waiting, product unavailable" msgid "Hide product if unavailable" msgstr "الانتظار، المنتج غير متوفر" -#: pretix/base/models/items.py:445 pretix/control/forms/item.py:669 +#: pretix/base/models/items.py:445 pretix/control/forms/item.py:672 #: pretix/control/templates/pretixcontrol/subevents/fragment_unavail_mode_indicator.html:5 #, fuzzy #| msgid "The ordered product \"{item}\" is no longer available." msgid "Show product with info on why it’s unavailable" msgstr "المنتج المطلوب \"{item}\" لم يعد متاحا." -#: pretix/base/models/items.py:456 pretix/base/models/items.py:781 +#: pretix/base/models/items.py:456 pretix/base/models/items.py:780 msgid "Don't use re-usable media, use regular one-off tickets" msgstr "" @@ -5540,7 +5596,7 @@ msgstr "" msgid "Require either an existing or a new medium to be used" msgstr "" -#: pretix/base/models/items.py:475 pretix/base/models/items.py:1458 +#: pretix/base/models/items.py:475 pretix/base/models/items.py:1457 msgid "Category" msgstr "الفئة" @@ -5567,12 +5623,18 @@ msgstr "" "استخدام هذا السعر." #: pretix/base/models/items.py:506 +#, fuzzy +#| msgid "" +#| "If this option is active, your users can choose the price themselves. The " +#| "price configured above is then interpreted as the minimum price a user " +#| "has to enter. You could use this e.g. to collect additional donations for " +#| "your event. This is currently not supported for products that are bought " +#| "as an add-on to other products." msgid "" "If this option is active, your users can choose the price themselves. The " "price configured above is then interpreted as the minimum price a user has " "to enter. You could use this e.g. to collect additional donations for your " -"event. This is currently not supported for products that are bought as an " -"add-on to other products." +"event." msgstr "" "إذا كان هذا الخيار نشطا، يمكن للمستخدمين الخاصين بك اختيار السعر بأنفسهم. ثم " "يتم تفسير السعر الذي تم إعداده أعلاه على أنه الحد الأدنى للسعر الذي يتعين " @@ -5580,13 +5642,13 @@ msgstr "" "لهذه الفعالية الخاصة بك. هذا غير مدعوم حاليا للمنتجات التي تم شراؤها كإضافة " "لمنتجات أخرى." -#: pretix/base/models/items.py:512 pretix/base/models/items.py:1176 +#: pretix/base/models/items.py:511 pretix/base/models/items.py:1175 #, fuzzy #| msgid "Net price" msgid "Suggested price" msgstr "السعر الصافي" -#: pretix/base/models/items.py:513 pretix/base/models/items.py:1177 +#: pretix/base/models/items.py:512 pretix/base/models/items.py:1176 msgid "" "This price will be used as the default value of the input field. The user " "can choose a lower value, but not lower than the price this product would " @@ -5594,52 +5656,52 @@ msgid "" "used that lowers the price." msgstr "" -#: pretix/base/models/items.py:527 +#: pretix/base/models/items.py:526 msgid "Whether or not buying this product allows a person to enter your event" msgstr "سواء تم شراء هذا المنتج أم لا، سيسمح للشخص بدخول الفعالية الخاصة بك" -#: pretix/base/models/items.py:532 +#: pretix/base/models/items.py:531 #, fuzzy #| msgid "Is an admission ticket" msgid "Is a personalized ticket" msgstr "تذكرة دخول" -#: pretix/base/models/items.py:534 +#: pretix/base/models/items.py:533 #, fuzzy #| msgid "" #| "Whether or not buying this product allows a person to enter your event" msgid "Whether or not buying this product allows to enter attendee information" msgstr "سواء تم شراء هذا المنتج أم لا، سيسمح للشخص بدخول الفعالية الخاصة بك" -#: pretix/base/models/items.py:543 +#: pretix/base/models/items.py:542 msgid "Show a waiting list for this ticket" msgstr "عرض قائمة الانتظار لهذه التذكرة" -#: pretix/base/models/items.py:544 +#: pretix/base/models/items.py:543 msgid "This will only work if waiting lists are enabled for this event." msgstr "لن يعمل هذا إلا إذا تم تمكين قوائم الانتظار لهذه الفعالية." -#: pretix/base/models/items.py:548 pretix/base/settings.py:1427 -#: pretix/control/forms/event.py:1691 +#: pretix/base/models/items.py:547 pretix/base/settings.py:1481 +#: pretix/control/forms/event.py:1793 msgid "Show number of tickets left" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/models/items.py:549 +#: pretix/base/models/items.py:548 msgid "Publicly show how many tickets are still available." msgstr "أظهر للجمهور عدد التذاكر التي لا تزال متاحة." -#: pretix/base/models/items.py:556 pretix/control/forms/item.py:633 +#: pretix/base/models/items.py:555 pretix/control/forms/item.py:636 msgid "Product picture" msgstr "صورة المنتج" -#: pretix/base/models/items.py:585 +#: pretix/base/models/items.py:584 #, fuzzy #| msgid "Only show after sellout of" msgctxt "hidden_if_available_legacy" msgid "Only show after sellout of" msgstr "تظهر فقط بعد بيع" -#: pretix/base/models/items.py:586 +#: pretix/base/models/items.py:585 msgid "" "If you select a quota here, this product will only be shown when that quota " "is unavailable. If combined with the option to hide sold-out products, this " @@ -5653,11 +5715,11 @@ msgstr "" "فيها كلا المنتجين مرئيين بينما يتم حجز جميع التذاكر في الحصة المرجعية ، ولكن " "لم يتم بيعها بعد." -#: pretix/base/models/items.py:596 +#: pretix/base/models/items.py:595 msgid "Only show after sellout of" msgstr "تظهر فقط بعد بيع" -#: pretix/base/models/items.py:597 +#: pretix/base/models/items.py:596 #, fuzzy #| msgid "" #| "If you select a quota here, this product will only be shown when that " @@ -5680,7 +5742,7 @@ msgstr "" "فيها كلا المنتجين مرئيين بينما يتم حجز جميع التذاكر في الحصة المرجعية ، ولكن " "لم يتم بيعها بعد." -#: pretix/base/models/items.py:611 +#: pretix/base/models/items.py:610 msgid "" "To buy this product, the user needs a voucher that applies to this product " "either directly or via a quota." @@ -5688,7 +5750,7 @@ msgstr "" "لشراء هذا المنتج ، يحتاج المستخدم إلى كود خصم ينطبق على هذا المنتج إما " "مباشرة أو بواسطة حصة." -#: pretix/base/models/items.py:617 +#: pretix/base/models/items.py:616 msgid "" "If this product is part of an order, the order will be put into an " "\"approval\" state and will need to be confirmed by you before it can be " @@ -5699,7 +5761,7 @@ msgstr "" "عليك تأكيده قبل دفعه وإكماله. يمكنك استخدام هذا على سبيل المثال للتذاكر " "المخصومة المتوفرة فقط لمجموعات محددة." -#: pretix/base/models/items.py:624 +#: pretix/base/models/items.py:623 msgid "" "This product will be hidden from the event page until the user enters a " "voucher that unlocks this product." @@ -5707,7 +5769,7 @@ msgstr "" "سيتم إخفاء هذا المنتج من صفحة الفعالية حتى يقوم المستخدم بإدخال كود خصم يسمح " "بظهور هذا المنتج." -#: pretix/base/models/items.py:630 +#: pretix/base/models/items.py:629 msgid "" "If this option is set, the product will only be sold as part of bundle " "products. Do not check this option if you want to use this " @@ -5717,7 +5779,7 @@ msgstr "" "وليس حدد هذا الخيار إذا كنت تريد استخدام هذا المنتج كمنتج " "إضافي ، ينطبق ذلك على الحزم الثابتة فقط!" -#: pretix/base/models/items.py:637 +#: pretix/base/models/items.py:636 msgid "" "If this is checked, the usual cancellation and order change settings of this " "event apply. If this is unchecked, orders containing this product can not be " @@ -5727,7 +5789,7 @@ msgstr "" "لهذه الفعالية. وإذا لم يتم تحديده ، فلن يمكن إلغاء الطلبات التي تحتوي على " "هذا المنتج من قبل المستخدمين وإنما من قبلك أنت فقط." -#: pretix/base/models/items.py:644 +#: pretix/base/models/items.py:643 msgid "" "This product can only be bought if it is added to the cart at least this " "many times. If you keep the field empty or set it to 0, there is no special " @@ -5737,7 +5799,7 @@ msgstr "" "مرات. إذا احتفظت بالحقل فارغا أو قمت بتحديد قيمة 0 ، فلن يوجد حد خاص لهذا " "المنتج." -#: pretix/base/models/items.py:651 +#: pretix/base/models/items.py:650 msgid "" "This product can only be bought at most this many times within one order. If " "you keep the field empty or set it to 0, there is no special limit for this " @@ -5748,7 +5810,7 @@ msgstr "" "بالحقل فارغا أو قمت بتحديد قيمة 0 ، فلا يوجد حد خاص لهذا المنتج. وعلى كل حال " "يتم تطبيق الحد الأقصى لعدد العناصر في الطلب بالكامل." -#: pretix/base/models/items.py:658 pretix/base/models/items.py:1244 +#: pretix/base/models/items.py:657 pretix/base/models/items.py:1243 msgid "" "If you set this, the check-in app will show a visible warning that this " "ticket requires special attention. You can use this for example for student " @@ -5759,13 +5821,13 @@ msgstr "" "اهتماما خاصا. يمكنك استخدام هذا على سبيل المثال لتذاكر الطلاب لتنبيه موظف " "التسجيل أنه لابد من التحقق من بطاقة هوية الطالب قبل الدخول." -#: pretix/base/models/items.py:665 pretix/base/models/items.py:1251 +#: pretix/base/models/items.py:664 pretix/base/models/items.py:1250 msgid "" "This text will be shown by the check-in app if a ticket of this type is " "scanned." msgstr "" -#: pretix/base/models/items.py:671 pretix/base/models/items.py:1172 +#: pretix/base/models/items.py:670 pretix/base/models/items.py:1171 msgid "" "If set, this will be displayed next to the current price to show that the " "current price is a discounted one. This is just a cosmetic setting and will " @@ -5774,54 +5836,54 @@ msgstr "" "إذا تم تعيينه ، فسيتم عرضه بجوار السعر الحالي لإظهار أن السعر الحالي هو سعر " "مخفض. هذا مجرد إعداد شكلي ولن يؤثر فعليا على الأسعار." -#: pretix/base/models/items.py:681 +#: pretix/base/models/items.py:680 #, fuzzy #| msgid "Only sell tickets for this event on the following sales channels." msgid "Only sell tickets for this product on the selected sales channels." msgstr "قم ببيع التذاكر لهذه الفعالية فقط على قنوات البيع التالية." -#: pretix/base/models/items.py:686 +#: pretix/base/models/items.py:685 msgid "" "When a customer buys this product, they will get a gift card with a value " "corresponding to the product price." msgstr "" "عندما يشتري العميل هذا المنتج ، سيحصل على بطاقة هداية بقيمة تقابل سعر المنتج." -#: pretix/base/models/items.py:696 +#: pretix/base/models/items.py:695 msgid "Allowed membership types" msgstr "أنواع العضوية المسموح بها" -#: pretix/base/models/items.py:701 pretix/base/models/items.py:1200 +#: pretix/base/models/items.py:700 pretix/base/models/items.py:1199 msgid "" "Do not show this unless the customer is logged in and has a valid " "membership. Be aware that this means it will never be visible in the widget." msgstr "" -#: pretix/base/models/items.py:710 +#: pretix/base/models/items.py:709 msgid "This product creates a membership of type" msgstr "هذا المنتج يخلق عضوية من نوع" -#: pretix/base/models/items.py:713 +#: pretix/base/models/items.py:712 msgid "" "The duration of the membership is the same as the duration of the event or " "event series date" msgstr "مدة العضوية هي نفسها مدة الفعالية أو تاريخ سلسلة الفعالية" -#: pretix/base/models/items.py:717 +#: pretix/base/models/items.py:716 msgid "Membership duration in days" msgstr "مدة العضوية بالأيام" -#: pretix/base/models/items.py:721 +#: pretix/base/models/items.py:720 msgid "Membership duration in months" msgstr "مدة العضوية بالأشهر" -#: pretix/base/models/items.py:728 +#: pretix/base/models/items.py:727 #, fuzzy #| msgid "Valid until" msgid "Validity" msgstr "حتى تاريخ" -#: pretix/base/models/items.py:730 +#: pretix/base/models/items.py:729 msgid "" "When setting up a regular event, or an event series with time slots, you " "typically do NOT need to change this value. The default setting means that " @@ -5833,65 +5895,65 @@ msgid "" "change but keep their current validity." msgstr "" -#: pretix/base/models/items.py:738 pretix/control/forms/item.py:736 +#: pretix/base/models/items.py:737 pretix/control/forms/item.py:739 #, fuzzy #| msgid "Gift card validity" msgid "Start of validity" msgstr "صلاحية بطاقة هدية" -#: pretix/base/models/items.py:739 +#: pretix/base/models/items.py:738 #, fuzzy #| msgid "End of presale" msgid "End of validity" msgstr "نهاية عرض ما قبل البيع" -#: pretix/base/models/items.py:742 +#: pretix/base/models/items.py:741 #, fuzzy #| msgid "minutes" msgid "Minutes" msgstr "الدقائق" -#: pretix/base/models/items.py:746 +#: pretix/base/models/items.py:745 msgid "Hours" msgstr "" -#: pretix/base/models/items.py:750 +#: pretix/base/models/items.py:749 msgid "Days" msgstr "" -#: pretix/base/models/items.py:754 +#: pretix/base/models/items.py:753 #, fuzzy #| msgid "Month" msgid "Months" msgstr "شهر" -#: pretix/base/models/items.py:757 +#: pretix/base/models/items.py:756 #, fuzzy #| msgid "Customers can cancel their paid orders" msgid "Customers can select the validity start date" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/models/items.py:758 +#: pretix/base/models/items.py:757 msgid "If not selected, the validity always starts at the time of purchase." msgstr "" -#: pretix/base/models/items.py:763 +#: pretix/base/models/items.py:762 #, fuzzy #| msgid "Maximum order total" msgid "Maximum future start" msgstr "الحد الأقصى لإجمالي الطلب" -#: pretix/base/models/items.py:764 +#: pretix/base/models/items.py:763 #, fuzzy #| msgid "The selected date does not exist in this event series." msgid "The selected start date may only be this many days in the future." msgstr "التاريخ المحدد غير موجود في سلسلة الفعاليات هذه." -#: pretix/base/models/items.py:770 +#: pretix/base/models/items.py:769 msgid "Reusable media policy" msgstr "" -#: pretix/base/models/items.py:772 +#: pretix/base/models/items.py:771 msgid "" "If this product should be stored on a re-usable physical medium, you can " "attach a physical media policy. This is not required for regular tickets, " @@ -5901,20 +5963,20 @@ msgid "" "settings." msgstr "" -#: pretix/base/models/items.py:782 +#: pretix/base/models/items.py:781 msgid "Reusable media type" msgstr "" -#: pretix/base/models/items.py:784 +#: pretix/base/models/items.py:783 msgid "" "Select the type of physical medium that should be used for this product. " "Note that not all media types support all types of products, and not all " "media types are supported across all sales channels or check-in processes." msgstr "" -#: pretix/base/models/items.py:795 pretix/base/models/items.py:1702 +#: pretix/base/models/items.py:794 pretix/base/models/items.py:1701 #: pretix/control/forms/filter.py:437 pretix/control/forms/filter.py:1922 -#: pretix/control/forms/item.py:276 pretix/control/navigation.py:138 +#: pretix/control/forms/item.py:277 pretix/control/navigation.py:138 #: pretix/control/navigation.py:147 #: pretix/control/templates/pretixcontrol/checkin/lists.html:111 #: pretix/control/templates/pretixcontrol/items/base.html:3 @@ -5931,69 +5993,69 @@ msgstr "" msgid "Products" msgstr "منتجات" -#: pretix/base/models/items.py:989 +#: pretix/base/models/items.py:988 msgid "" "If you select a reusable media policy, you also need to select a reusable " "media type." msgstr "" -#: pretix/base/models/items.py:993 +#: pretix/base/models/items.py:992 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "The selected media type is not enabled in your organizer settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/models/items.py:995 +#: pretix/base/models/items.py:994 #, fuzzy #| msgid "The selected item does not belong to this event." msgid "The selected media type does not support usage for tickets currently." msgstr "العنصر المحدد لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/items.py:997 +#: pretix/base/models/items.py:996 #, fuzzy #| msgid "The selected item does not belong to this event." msgid "" "The selected media type does not support usage for gift cards currently." msgstr "العنصر المحدد لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/items.py:999 +#: pretix/base/models/items.py:998 msgid "" "You currently cannot create gift cards with a reusable media policy. " "Instead, gift cards for some reusable media types can be created or re-" "charged directly at the POS." msgstr "" -#: pretix/base/models/items.py:1007 +#: pretix/base/models/items.py:1006 msgid "" "The maximum number per order can not be lower than the minimum number per " "order." msgstr "لا يمكن أن يكون العدد الأقصى لكل طلب أقل من العدد الأدنى للطلب." -#: pretix/base/models/items.py:1013 +#: pretix/base/models/items.py:1012 msgid "The item's category must belong to the same event as the item." msgstr "يجب أن تنتمي فئة العنصر إلى نفس فعالية العنصر." -#: pretix/base/models/items.py:1018 +#: pretix/base/models/items.py:1017 msgid "The item's tax rule must belong to the same event as the item." msgstr "" "يجب أن تنتمي القاعدة الضريبية للعنصر إلى نفس الفعالية التي ينتمي إليها " "العنصر." -#: pretix/base/models/items.py:1024 +#: pretix/base/models/items.py:1023 msgid "The item's availability cannot end before it starts." msgstr "لا يمكن أن ينتهي توفر العنصر قبل أن يبدأ." -#: pretix/base/models/items.py:1156 +#: pretix/base/models/items.py:1155 msgid "This is shown below the variation name in lists." msgstr "يظهر هذا في القوائم أسفل اسم العنصر." -#: pretix/base/models/items.py:1183 +#: pretix/base/models/items.py:1182 #, fuzzy #| msgid "New order requires approval" msgid "Require approval" msgstr "طلب جديد يتطلب الموافقة." -#: pretix/base/models/items.py:1185 +#: pretix/base/models/items.py:1184 #, fuzzy #| msgid "" #| "If this product is part of an order, the order will be put into an " @@ -6010,36 +6072,36 @@ msgstr "" "عليك تأكيده قبل دفعه وإكماله. يمكنك استخدام هذا على سبيل المثال للتذاكر " "المخصومة المتوفرة فقط لمجموعات محددة." -#: pretix/base/models/items.py:1195 pretix/control/navigation.py:591 +#: pretix/base/models/items.py:1194 pretix/control/navigation.py:591 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:4 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:6 msgid "Membership types" msgstr "أنواع العضوية" -#: pretix/base/models/items.py:1207 +#: pretix/base/models/items.py:1206 #, fuzzy #| msgid "This product will not be sold before the given date." msgid "This variation will not be sold before the given date." msgstr "لن يتم بيع هذا المنتج قبل التاريخ المعين." -#: pretix/base/models/items.py:1217 +#: pretix/base/models/items.py:1216 #, fuzzy #| msgid "This product will not be sold after the given date." msgid "This variation will not be sold after the given date." msgstr "لن يتم بيع هذا المنتج بعد التاريخ المحدد." -#: pretix/base/models/items.py:1225 +#: pretix/base/models/items.py:1224 msgid "Sell on all sales channels the product is sold on" msgstr "" -#: pretix/base/models/items.py:1231 +#: pretix/base/models/items.py:1230 msgid "" "The sales channel selection for the product as a whole takes precedence, so " "if a sales channel is selected here but not on product level, the variation " "will not be available." msgstr "" -#: pretix/base/models/items.py:1236 +#: pretix/base/models/items.py:1235 #, fuzzy #| msgid "" #| "This product will only be shown if a voucher matching the product is " @@ -6047,7 +6109,7 @@ msgstr "" msgid "Show only if a matching voucher is redeemed." msgstr "سيظهر هذا المنتج فقط في حالة استرداد كود خصم مطابقة للمنتج." -#: pretix/base/models/items.py:1238 +#: pretix/base/models/items.py:1237 #, fuzzy #| msgid "" #| "This product will be hidden from the event page until the user enters a " @@ -6059,24 +6121,24 @@ msgstr "" "سيتم إخفاء هذا المنتج من صفحة الفعالية حتى يقوم المستخدم بإدخال كود خصم يسمح " "بظهور هذا المنتج." -#: pretix/base/models/items.py:1258 +#: pretix/base/models/items.py:1257 #: pretix/control/templates/pretixcontrol/item/create.html:111 msgid "Product variations" msgstr "أنواع المنتج" -#: pretix/base/models/items.py:1463 +#: pretix/base/models/items.py:1462 msgid "Minimum number" msgstr "العدد الأدنى" -#: pretix/base/models/items.py:1467 +#: pretix/base/models/items.py:1466 msgid "Maximum number" msgstr "العدد الأقصى" -#: pretix/base/models/items.py:1471 +#: pretix/base/models/items.py:1470 msgid "Add-Ons are included in the price" msgstr "تم تضمين قائمة الإضافات في السعر" -#: pretix/base/models/items.py:1472 +#: pretix/base/models/items.py:1471 msgid "" "If selected, adding add-ons to this ticket is free, even if the add-ons " "would normally cost money individually." @@ -6084,44 +6146,44 @@ msgstr "" "إذا تم تحديده ، فإن إضافة القوائم الإضافية إلى هذه التذكرة سيكون مجانيا، حتى " "لو كانت الإضافات تكلف مبالغا إن كانت بشكل فردي." -#: pretix/base/models/items.py:1477 +#: pretix/base/models/items.py:1476 msgid "Allow the same product to be selected multiple times" msgstr "اسمح لنفس المنتج أن يتم اختياره عدة مرات" -#: pretix/base/models/items.py:1496 +#: pretix/base/models/items.py:1495 msgid "The add-on's category must belong to the same event as the item." msgstr "" "يجب أن تنتمي فئة قائمة الإضافة إلى نفس الفعالية كما هو الحال مع العنصر." -#: pretix/base/models/items.py:1501 +#: pretix/base/models/items.py:1500 msgid "The item already has an add-on of this category." msgstr "العنصر يحتوي مسبقا على قائمة إضافة من هذه الفئة." -#: pretix/base/models/items.py:1506 +#: pretix/base/models/items.py:1505 msgid "The minimum count needs to be equal to or greater than zero." msgstr "يجب أن يكون الحد الأدنى للعدد مساويا أو أكبر من الصفر." -#: pretix/base/models/items.py:1511 +#: pretix/base/models/items.py:1510 msgid "The maximum count needs to be equal to or greater than zero." msgstr "يجب أن يكون الحد الأقصى للعدد مساويا للصفر أو أكبر منه." -#: pretix/base/models/items.py:1516 +#: pretix/base/models/items.py:1515 msgid "The maximum count needs to be greater than the minimum count." msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." -#: pretix/base/models/items.py:1543 +#: pretix/base/models/items.py:1542 msgid "Bundled item" msgstr "عنصر تم تجميعه" -#: pretix/base/models/items.py:1549 +#: pretix/base/models/items.py:1548 msgid "Bundled variation" msgstr "صيغة تم تجميعها" -#: pretix/base/models/items.py:1560 +#: pretix/base/models/items.py:1559 msgid "Designated price part" msgstr "جزء السعر المحدد" -#: pretix/base/models/items.py:1561 +#: pretix/base/models/items.py:1560 msgid "" "If set, it will be shown that this bundled item is responsible for the given " "value of the total gross price. This might be important in cases of mixed " @@ -6132,60 +6194,60 @@ msgstr "" "الإجمالي الكلي. قد يكون هذا مهما في حالات الضرائب المختلطة، ولكن يمكن أن تظل " "فارغة. لن يتم إضافة هذه القيمة إلى سعر العنصر الأساسي." -#: pretix/base/models/items.py:1584 +#: pretix/base/models/items.py:1583 msgid "The bundled item must belong to the same event as the item." msgstr "يجب أن ينتمي العنصر المجمع إلى نفس فعالية العنصر." -#: pretix/base/models/items.py:1586 +#: pretix/base/models/items.py:1585 msgid "A variation needs to be set for this item." msgstr "يجب تعيين نوع لهذا العنصر." -#: pretix/base/models/items.py:1588 +#: pretix/base/models/items.py:1587 msgid "The chosen variation does not belong to this item." msgstr "النوع الذي تم اختياره لا ينتمي إلى هذا العنصر." -#: pretix/base/models/items.py:1593 +#: pretix/base/models/items.py:1592 msgid "The count needs to be equal to or greater than zero." msgstr "يجب أن يكون العدد مساويا للصفر أو أكبر منه." -#: pretix/base/models/items.py:1648 +#: pretix/base/models/items.py:1647 msgid "Number" msgstr "رقم" -#: pretix/base/models/items.py:1649 +#: pretix/base/models/items.py:1648 msgid "Text (one line)" msgstr "نص (سطر واحد)" -#: pretix/base/models/items.py:1650 +#: pretix/base/models/items.py:1649 msgid "Multiline text" msgstr "نص متعدد الأسطر" -#: pretix/base/models/items.py:1651 +#: pretix/base/models/items.py:1650 msgid "Yes/No" msgstr "نعم / لا" -#: pretix/base/models/items.py:1652 +#: pretix/base/models/items.py:1651 msgid "Choose one from a list" msgstr "قم باختيار واحد من قائمة" -#: pretix/base/models/items.py:1653 +#: pretix/base/models/items.py:1652 msgid "Choose multiple from a list" msgstr "قم بعدة اختيارات من قائمة" -#: pretix/base/models/items.py:1654 +#: pretix/base/models/items.py:1653 msgid "File upload" msgstr "تحميل الملف" -#: pretix/base/models/items.py:1657 +#: pretix/base/models/items.py:1656 #: pretix/control/templates/pretixcontrol/event/settings.html:240 msgid "Date and time" msgstr "التاريخ و الوقت" -#: pretix/base/models/items.py:1658 +#: pretix/base/models/items.py:1657 msgid "Country code (ISO 3166-1 alpha-2)" msgstr "رمز البلد (ISO 3166-1 alpha-2)" -#: pretix/base/models/items.py:1681 pretix/base/models/items.py:1957 +#: pretix/base/models/items.py:1680 pretix/base/models/items.py:1956 #: pretix/base/models/organizer.py:609 #, fuzzy #| msgid "The property name may only contain letters, numbers and underscores." @@ -6194,82 +6256,82 @@ msgid "" "underscores." msgstr "لا يسمح أن يحتوي اسم الملكية إلا على أحرف وأرقام وشرطات سفلية فقط." -#: pretix/base/models/items.py:1686 +#: pretix/base/models/items.py:1685 msgid "Help text" msgstr "نص للمساعدة" -#: pretix/base/models/items.py:1687 +#: pretix/base/models/items.py:1686 msgid "If the question needs to be explained or clarified, do it here!" msgstr "إذا كان السؤال بحاجة إلى شرح أو توضيح ، فقم ذلك هنا!" -#: pretix/base/models/items.py:1693 +#: pretix/base/models/items.py:1692 msgid "Question type" msgstr "نوع السؤال" -#: pretix/base/models/items.py:1697 +#: pretix/base/models/items.py:1696 #: pretix/control/templates/pretixcontrol/items/questions.html:55 msgid "Required question" msgstr "سؤال مطلوب" -#: pretix/base/models/items.py:1704 +#: pretix/base/models/items.py:1703 msgid "This question will be asked to buyers of the selected products" msgstr "سيتم طرح هذا السؤال على مشتري المنتجات المختارة" -#: pretix/base/models/items.py:1711 +#: pretix/base/models/items.py:1710 msgid "Ask during check-in instead of in the ticket buying process" msgstr "اسأل أثناء التسجيل بدلا من السؤال أثناء عملية شراء التذكرة" -#: pretix/base/models/items.py:1712 pretix/base/models/items.py:1717 +#: pretix/base/models/items.py:1711 pretix/base/models/items.py:1716 msgid "Not supported by all check-in apps for all question types." msgstr "غير مدعوم من قبل جميع تطبيقات التسجيل لجميع أنواع الأسئلة." -#: pretix/base/models/items.py:1716 +#: pretix/base/models/items.py:1715 #, fuzzy #| msgid "Ask during check-in" msgid "Show answer during check-in" msgstr "طرح خلال التسجيل في مكتب الاستقبال" -#: pretix/base/models/items.py:1721 +#: pretix/base/models/items.py:1720 #: pretix/control/templates/pretixcontrol/items/questions.html:66 msgid "Hidden question" msgstr "سؤال مخفي" -#: pretix/base/models/items.py:1722 +#: pretix/base/models/items.py:1721 msgid "This question will only show up in the backend." msgstr "سيظهر هذا السؤال في لوحة التحكم فقط." -#: pretix/base/models/items.py:1726 +#: pretix/base/models/items.py:1725 msgid "Print answer on invoices" msgstr "طباعة الجواب على الفواتير" -#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1740 -#: pretix/base/models/items.py:1746 +#: pretix/base/models/items.py:1733 pretix/base/models/items.py:1739 +#: pretix/base/models/items.py:1745 msgid "Minimum value" msgstr "الحد الأدنى للقيمة" -#: pretix/base/models/items.py:1735 pretix/base/models/items.py:1738 -#: pretix/base/models/items.py:1741 pretix/base/models/items.py:1744 -#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1750 -#: pretix/base/models/items.py:1754 +#: pretix/base/models/items.py:1734 pretix/base/models/items.py:1737 +#: pretix/base/models/items.py:1740 pretix/base/models/items.py:1743 +#: pretix/base/models/items.py:1746 pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1753 msgid "Currently not supported in our apps and during check-in" msgstr "غير مدعوم حاليا في تطبيقاتنا وأثناء التسجيل" -#: pretix/base/models/items.py:1737 pretix/base/models/items.py:1743 -#: pretix/base/models/items.py:1749 +#: pretix/base/models/items.py:1736 pretix/base/models/items.py:1742 +#: pretix/base/models/items.py:1748 msgid "Maximum value" msgstr "القيمة القصوى" -#: pretix/base/models/items.py:1752 +#: pretix/base/models/items.py:1751 #, fuzzy #| msgid "Maximum value" msgid "Maximum length" msgstr "القيمة القصوى" -#: pretix/base/models/items.py:1758 +#: pretix/base/models/items.py:1757 msgid "Validate file to be a portrait" msgstr "تحقق من صحة الملف ليكون صورة" -#: pretix/base/models/items.py:1759 +#: pretix/base/models/items.py:1758 msgid "" "If checked, files must be images with an aspect ratio of 3:4. This is " "commonly used for photos printed on badges." @@ -6277,59 +6339,59 @@ msgstr "" "إذا تم تحديده ، يجب أن تكون الملفات صورا بنسبة عرض إلى ارتفاع 3:4. يستخدم " "هذا بشكل شائع للصور المطبوعة على الشارات." -#: pretix/base/models/items.py:1814 +#: pretix/base/models/items.py:1813 msgid "An answer to this question is required to proceed." msgstr "مطلوب إجابة على هذا السؤال للمتابعة." -#: pretix/base/models/items.py:1824 +#: pretix/base/models/items.py:1823 #, fuzzy #| msgid "Invalid input data." msgid "Invalid input type." msgstr "بيانات الإدخال غير صالحة." -#: pretix/base/models/items.py:1858 +#: pretix/base/models/items.py:1857 msgid "The number is to low." msgstr "الرقم أقبل من المطلوب." -#: pretix/base/models/items.py:1860 +#: pretix/base/models/items.py:1859 msgid "The number is to high." msgstr "الرقم أعلى من المطلوب." -#: pretix/base/models/items.py:1863 +#: pretix/base/models/items.py:1862 msgid "Invalid number input." msgstr "إدخال رقم غير صحيح." -#: pretix/base/models/items.py:1870 pretix/base/models/items.py:1894 +#: pretix/base/models/items.py:1869 pretix/base/models/items.py:1893 msgid "Please choose a later date." msgstr "الرجاء اختيار تاريخ لاحق." -#: pretix/base/models/items.py:1872 pretix/base/models/items.py:1896 +#: pretix/base/models/items.py:1871 pretix/base/models/items.py:1895 msgid "Please choose an earlier date." msgstr "الرجاء اختيار تاريخ سابق." -#: pretix/base/models/items.py:1875 +#: pretix/base/models/items.py:1874 msgid "Invalid date input." msgstr "إدخال تاريخ غير صحيح." -#: pretix/base/models/items.py:1882 +#: pretix/base/models/items.py:1881 msgid "Invalid time input." msgstr "إدخال وقت غير صحيح." -#: pretix/base/models/items.py:1891 +#: pretix/base/models/items.py:1890 msgid "Invalid datetime input." msgstr "إدخال تاريخ ووقت غير صالح." -#: pretix/base/models/items.py:1903 +#: pretix/base/models/items.py:1902 msgid "Unknown country code." msgstr "رمز الدولة غير معروف." -#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923 +#: pretix/base/models/items.py:1920 pretix/base/models/items.py:1922 #, fuzzy #| msgid "The maximum count needs to be greater than the minimum count." msgid "The maximum date must not be before the minimum value." msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من الحد الأدنى للعد." -#: pretix/base/models/items.py:1925 +#: pretix/base/models/items.py:1924 #, fuzzy #| msgid "" #| "The maximum number per order can not be lower than the minimum number per " @@ -6337,57 +6399,57 @@ msgstr "يجب أن يكون الحد الأقصى للعدد أكبر من ال msgid "The maximum value must not be lower than the minimum value." msgstr "لا يمكن أن يكون العدد الأقصى لكل طلب أقل من العدد الأدنى للطلب." -#: pretix/base/models/items.py:1943 +#: pretix/base/models/items.py:1942 msgid "" "The system already contains answers to this question that are not compatible " "with changing the type of question without data loss. Consider hiding this " "question and creating a new one instead." msgstr "" -#: pretix/base/models/items.py:1961 +#: pretix/base/models/items.py:1960 #: pretix/control/templates/pretixcontrol/items/question.html:90 msgid "Answer" msgstr "إجابة" -#: pretix/base/models/items.py:1985 +#: pretix/base/models/items.py:1984 #, python-brace-format msgid "The identifier \"{}\" is already used for a different option." msgstr "المعرف \"{}\" مستخدم سابقا لخيار مختلف." -#: pretix/base/models/items.py:1988 +#: pretix/base/models/items.py:1987 msgid "Question option" msgstr "خيار السؤال" -#: pretix/base/models/items.py:1989 +#: pretix/base/models/items.py:1988 msgid "Question options" msgstr "خيارات السؤال" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1725 +#: pretix/base/models/items.py:2073 pretix/control/forms/event.py:1827 #: pretix/control/templates/pretixcontrol/items/quotas.html:56 msgid "Total capacity" msgstr "السعة الإجمالية" -#: pretix/base/models/items.py:2076 pretix/control/forms/item.py:456 +#: pretix/base/models/items.py:2075 pretix/control/forms/item.py:457 msgid "Leave empty for an unlimited number of tickets." msgstr "اتركه فارغا لعدد غير محدود من التذاكر." -#: pretix/base/models/items.py:2080 pretix/base/models/orders.py:1489 -#: pretix/base/models/orders.py:3011 +#: pretix/base/models/items.py:2079 pretix/base/models/orders.py:1512 +#: pretix/base/models/orders.py:3077 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "بند" -#: pretix/base/models/items.py:2088 pretix/control/forms/item.py:915 +#: pretix/base/models/items.py:2087 pretix/control/forms/item.py:918 #: pretix/plugins/autocheckin/models.py:74 msgid "Variations" msgstr "متغيرات" -#: pretix/base/models/items.py:2092 +#: pretix/base/models/items.py:2091 #: pretix/control/templates/pretixcontrol/items/quotas.html:70 msgid "Ignore this quota when determining event availability" msgstr "تجاهل هذه الحصة إذا أردت تحديد مدى توفر الفعالية" -#: pretix/base/models/items.py:2093 +#: pretix/base/models/items.py:2092 msgid "" "If you enable this, this quota will be ignored when determining event " "availability in your event calendar. This is useful e.g. for merchandise " @@ -6398,11 +6460,11 @@ msgstr "" "تقويم الفعالية الخاص بك. قد يفيد هذا في حالات مثل المشتريات المضافة إلى كل " "فعالية ولكنه يجب ألا يمنع ظهور حالة الفعالية إذا كانت غير متوفرة." -#: pretix/base/models/items.py:2100 +#: pretix/base/models/items.py:2099 msgid "Close this quota permanently once it is sold out" msgstr "أغلق هذه الحصة بشكل دائم بمجرد بيعها" -#: pretix/base/models/items.py:2101 +#: pretix/base/models/items.py:2100 msgid "" "If you enable this, when the quota is sold out once, no more tickets will be " "sold, even if tickets become available again through cancellations or " @@ -6412,11 +6474,11 @@ msgstr "" "التذاكر ، حتى إذا أصبحت التذاكر متاحة مرة أخرى من خلال الإلغاء أو الطلبات " "المنتهية الصلاحية. بالطبع ، يمكنك دائما إعادة الفتح يدويا." -#: pretix/base/models/items.py:2109 +#: pretix/base/models/items.py:2108 msgid "Allow to sell more tickets once people have checked out" msgstr "السماح ببيع المزيد من التذاكر بمجرد قيام الأشخاص بتسجيل الخروج" -#: pretix/base/models/items.py:2110 +#: pretix/base/models/items.py:2109 msgid "" "With this option, quota will be released as soon as people are scanned at an " "exit of your event. This will only happen if they have been scanned both at " @@ -6431,7 +6493,7 @@ msgstr "" "يتم تجاهل قوائم التسجيل إذا تم ضبطها على \"السماح بإعادة الدخول بعد فحص " "الخروج\" لمنع الحجز الزائد غير المقصود." -#: pretix/base/models/items.py:2122 pretix/control/navigation.py:156 +#: pretix/base/models/items.py:2121 pretix/control/navigation.py:156 #: pretix/control/templates/pretixcontrol/items/quotas.html:4 #: pretix/control/templates/pretixcontrol/items/quotas.html:6 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:416 @@ -6440,11 +6502,11 @@ msgstr "" msgid "Quotas" msgstr "الحصص" -#: pretix/base/models/items.py:2195 +#: pretix/base/models/items.py:2194 msgid "All variations must belong to an item contained in the items list." msgstr "يجب أن تنتمي جميع الأنواع إلى عنصر موجود في قائمة العناصر." -#: pretix/base/models/items.py:2206 +#: pretix/base/models/items.py:2205 msgid "" "One or more items has variations but none of these are in the variations " "list." @@ -6452,23 +6514,23 @@ msgstr "" "يحتوي عنصر واحد أو أكثر على أشكال مختلفة ولكن لا يوجد أي منها في قائمة " "المتغيرات." -#: pretix/base/models/items.py:2212 pretix/base/models/waitinglist.py:308 +#: pretix/base/models/items.py:2211 pretix/base/models/waitinglist.py:308 msgid "Subevent cannot be null for event series." msgstr "لا يمكن أن تكون الفعالية الفرعية في سلسلة الفعاليات غير معرفة." -#: pretix/base/models/items.py:2248 +#: pretix/base/models/items.py:2247 #, fuzzy #| msgid "Required for events" msgid "Required for products" msgstr "مطلوب للفعاليات" -#: pretix/base/models/items.py:2249 +#: pretix/base/models/items.py:2248 msgid "" "If checked, this property must be set in each product. Does not apply if a " "default value is set." msgstr "" -#: pretix/base/models/items.py:2254 +#: pretix/base/models/items.py:2253 msgid "" "If you keep this empty, any value is allowed. Otherwise, enter one possible " "value per line." @@ -6476,6 +6538,19 @@ msgstr "" "إذا أبقيت هذا فارغا ، فسيتم السماح بأي قيمة. وإلا ، أدخل قيمة واحدة محتملة " "في كل سطر." +#: pretix/base/models/items.py:2310 +#, fuzzy +#| msgid "Start date" +msgid "Start" +msgstr "تاريخ البداية" + +#: pretix/base/models/items.py:2311 +#: pretix/plugins/reports/accountingreport.py:129 +#, fuzzy +#| msgid "Enabled" +msgid "End" +msgstr "تمكين" + #: pretix/base/models/memberships.py:44 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:28 msgid "Membership is transferable" @@ -6537,7 +6612,7 @@ msgid "pending" msgstr "معلق" #: pretix/base/models/orders.py:203 pretix/base/payment.py:570 -#: pretix/base/services/invoices.py:572 +#: pretix/base/services/invoices.py:581 msgid "paid" msgstr "مدفوع" @@ -6588,7 +6663,7 @@ msgid "" "scanned." msgstr "سيظهر هذا النص في أعلى نموذج عنوان الفاتورة أثناء تسجيل الخروج." -#: pretix/base/models/orders.py:301 pretix/base/models/orders.py:1526 +#: pretix/base/models/orders.py:301 pretix/base/models/orders.py:1552 msgid "Meta information" msgstr "المعلومات الوصفية" @@ -6598,25 +6673,25 @@ msgstr "المعلومات الوصفية" msgid "API meta information" msgstr "المعلومات الوصفية" -#: pretix/base/models/orders.py:414 pretix/plugins/sendmail/forms.py:236 +#: pretix/base/models/orders.py:419 pretix/plugins/sendmail/forms.py:236 #: pretix/plugins/sendmail/forms.py:389 pretix/plugins/sendmail/views.py:269 msgid "approval pending" msgstr "في انتظار الموافقة" -#: pretix/base/models/orders.py:416 +#: pretix/base/models/orders.py:421 #, fuzzy #| msgid "Pending (overdue)" msgctxt "order state" msgid "pending (confirmed)" msgstr "في انتظار (تأخر)" -#: pretix/base/models/orders.py:418 +#: pretix/base/models/orders.py:423 #, fuzzy #| msgid "Canceled (paid fee)" msgid "canceled (paid fee)" msgstr "إلغاء (الرسوم المدفوعة)" -#: pretix/base/models/orders.py:1031 +#: pretix/base/models/orders.py:1036 msgid "" "The payment can not be accepted as the last date of payments configured in " "the payment settings is over." @@ -6624,7 +6699,7 @@ msgstr "" "لا يمكن قبول الدفع نظرا لانتهاء آخر تاريخ للدفعات التي تم إعداده في إعدادات " "السداد." -#: pretix/base/models/orders.py:1033 +#: pretix/base/models/orders.py:1038 msgid "" "The payment can not be accepted as the order is expired and you configured " "that no late payments should be accepted in the payment settings." @@ -6632,124 +6707,124 @@ msgstr "" "لا يمكن قبول الدفع نظرا لانتهاء صلاحية الطلب ولاختيارك عدم قبول المدفوعات " "المتأخرة في إعدادات السداد." -#: pretix/base/models/orders.py:1035 +#: pretix/base/models/orders.py:1040 msgid "This order is not yet approved by the event organizer." msgstr "لم تتم الموافقة على هذا الطلب بعد من قبل منظم الفعالية." -#: pretix/base/models/orders.py:1060 +#: pretix/base/models/orders.py:1065 #, python-brace-format msgid "The ordered product \"{item}\" is no longer available." msgstr "المنتج المطلوب \"{item}\" لم يعد متاحا." -#: pretix/base/models/orders.py:1061 +#: pretix/base/models/orders.py:1066 #, python-brace-format msgid "The seat \"{seat}\" is no longer available." msgstr "المقعد \"{seat}\" لم يعد متاحا." -#: pretix/base/models/orders.py:1062 +#: pretix/base/models/orders.py:1067 #, python-brace-format msgid "The voucher \"{voucher}\" no longer has sufficient budget." msgstr "كود خصم \"{voucher}\" لم يعد به ميزانية كافية." -#: pretix/base/models/orders.py:1063 +#: pretix/base/models/orders.py:1068 #, python-brace-format msgid "The voucher \"{voucher}\" has been used in the meantime." msgstr "يتم استخدام كود الخصم \"{voucher}\"في هذه الأثناء." -#: pretix/base/models/orders.py:1405 +#: pretix/base/models/orders.py:1413 msgid "" msgstr "" -#: pretix/base/models/orders.py:1506 pretix/base/models/orders.py:1514 +#: pretix/base/models/orders.py:1532 pretix/base/models/orders.py:1540 msgid "Empty, if this product is not an admission ticket" msgstr "فارغ ، إذا لم يكن هذا المنتج تذكرة دخول" -#: pretix/base/models/orders.py:1723 +#: pretix/base/models/orders.py:1749 msgctxt "payment_state" msgid "created" msgstr "تم إنشاؤه" -#: pretix/base/models/orders.py:1724 +#: pretix/base/models/orders.py:1750 msgctxt "payment_state" msgid "pending" msgstr "قيد الانتظار" -#: pretix/base/models/orders.py:1725 +#: pretix/base/models/orders.py:1751 msgctxt "payment_state" msgid "confirmed" msgstr "تم التأكيد" -#: pretix/base/models/orders.py:1726 +#: pretix/base/models/orders.py:1752 msgctxt "payment_state" msgid "canceled" msgstr "ملغي" -#: pretix/base/models/orders.py:1727 +#: pretix/base/models/orders.py:1753 msgctxt "payment_state" msgid "failed" msgstr "فشل" -#: pretix/base/models/orders.py:1728 +#: pretix/base/models/orders.py:1754 msgctxt "payment_state" msgid "refunded" msgstr "تم الاسترداد" -#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2195 +#: pretix/base/models/orders.py:1782 pretix/base/models/orders.py:2221 #: pretix/base/shredder.py:633 msgid "Payment information" msgstr "معلومات الدفع" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2162 msgctxt "refund_state" msgid "started externally" msgstr "بدأ من الخارج" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2163 msgctxt "refund_state" msgid "created" msgstr "تم الإنشاء" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2164 msgctxt "refund_state" msgid "in transit" msgstr "قيد الإرسال" -#: pretix/base/models/orders.py:2139 +#: pretix/base/models/orders.py:2165 msgctxt "refund_state" msgid "done" msgstr "منجز" -#: pretix/base/models/orders.py:2140 +#: pretix/base/models/orders.py:2166 msgctxt "refund_state" msgid "failed" msgstr "فشل" -#: pretix/base/models/orders.py:2142 +#: pretix/base/models/orders.py:2168 msgctxt "refund_state" msgid "canceled" msgstr "ألغيت" -#: pretix/base/models/orders.py:2150 +#: pretix/base/models/orders.py:2176 msgctxt "refund_source" msgid "Organizer" msgstr "منظم" -#: pretix/base/models/orders.py:2151 +#: pretix/base/models/orders.py:2177 msgctxt "refund_source" msgid "Customer" msgstr "عميل" -#: pretix/base/models/orders.py:2152 +#: pretix/base/models/orders.py:2178 msgctxt "refund_source" msgid "External" msgstr "خارجي" -#: pretix/base/models/orders.py:2190 +#: pretix/base/models/orders.py:2216 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "سبب استرداد الأموال" -#: pretix/base/models/orders.py:2191 +#: pretix/base/models/orders.py:2217 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:199 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:201 msgid "" @@ -6758,39 +6833,39 @@ msgstr "" "قد يتم عرضها للمستخدم النهائي أو استخدامها على سبيل المثال كجزء من مرجع " "السداد." -#: pretix/base/models/orders.py:2311 +#: pretix/base/models/orders.py:2337 msgid "Service fee" msgstr "رسوم الخدمة" -#: pretix/base/models/orders.py:2312 +#: pretix/base/models/orders.py:2338 msgid "Payment fee" msgstr "رسوم السداد" -#: pretix/base/models/orders.py:2313 +#: pretix/base/models/orders.py:2339 msgid "Shipping fee" msgstr "رسوم الشحن" -#: pretix/base/models/orders.py:2314 +#: pretix/base/models/orders.py:2340 #: pretix/control/templates/pretixcontrol/order/index.html:157 msgid "Cancellation fee" msgstr "رسوم الإلغاء" -#: pretix/base/models/orders.py:2315 +#: pretix/base/models/orders.py:2341 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2316 +#: pretix/base/models/orders.py:2342 #, fuzzy #| msgid "Other fees" msgid "Late fee" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2317 +#: pretix/base/models/orders.py:2343 msgid "Other fees" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2318 pretix/base/payment.py:1374 -#: pretix/base/payment.py:1450 pretix/base/settings.py:992 +#: pretix/base/models/orders.py:2344 pretix/base/payment.py:1378 +#: pretix/base/payment.py:1454 pretix/base/settings.py:1022 #: pretix/control/templates/pretixcontrol/items/index.html:107 #: pretix/control/templates/pretixcontrol/order/index.html:152 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:383 @@ -6799,7 +6874,7 @@ msgstr "رسوم أخرى" msgid "Gift card" msgstr "بطاقة هدايا" -#: pretix/base/models/orders.py:2323 +#: pretix/base/models/orders.py:2349 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:82 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:123 #: pretix/control/views/vouchers.py:120 @@ -6807,60 +6882,60 @@ msgstr "بطاقة هدايا" msgid "Value" msgstr "قيمة" -#: pretix/base/models/orders.py:2571 +#: pretix/base/models/orders.py:2630 msgid "Order position" msgstr "حالة الطلب" -#: pretix/base/models/orders.py:3116 +#: pretix/base/models/orders.py:3201 msgid "Cart ID (e.g. session key)" msgstr "معرف عربة التسوق (مثل مفتاح الجلسة)" -#: pretix/base/models/orders.py:3127 +#: pretix/base/models/orders.py:3212 #, fuzzy #| msgid "Expiration date" msgid "Limit for extending expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/models/orders.py:3156 +#: pretix/base/models/orders.py:3248 msgid "Cart position" msgstr "حالة سلة التسوق" -#: pretix/base/models/orders.py:3157 +#: pretix/base/models/orders.py:3249 msgid "Cart positions" msgstr "حالات سلة التسوق" -#: pretix/base/models/orders.py:3293 +#: pretix/base/models/orders.py:3391 msgid "Business customer" msgstr "عميل قطاع الأعمال" -#: pretix/base/models/orders.py:3309 +#: pretix/base/models/orders.py:3407 msgid "This reference will be printed on your invoice for your convenience." msgstr "ستتم طباعة هذا المرجع على فاتورتك وفقا لما يناسبك." -#: pretix/base/models/orders.py:3436 +#: pretix/base/models/orders.py:3534 #, fuzzy #| msgid "Transaction Code" msgid "Transmission type" msgstr "كود المعاملة" -#: pretix/base/models/orders.py:3534 +#: pretix/base/models/orders.py:3632 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "شارة" -#: pretix/base/models/orders.py:3535 pretix/base/pdf.py:1124 +#: pretix/base/models/orders.py:3633 pretix/base/pdf.py:1141 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 #: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "تذكرة" -#: pretix/base/models/orders.py:3536 +#: pretix/base/models/orders.py:3634 #, fuzzy #| msgid "Verification failed" msgid "Certificate" msgstr "فشل التحقق" -#: pretix/base/models/orders.py:3537 pretix/control/views/event.py:393 +#: pretix/base/models/orders.py:3635 pretix/control/views/event.py:393 #: pretix/control/views/event.py:398 pretix/control/views/organizer.py:649 #: pretix/control/views/organizer.py:654 #, fuzzy @@ -7014,7 +7089,7 @@ msgid "Type" msgstr "نوع" #: pretix/base/models/seating.py:45 pretix/base/models/tax.py:305 -#: pretix/base/pdf.py:1301 +#: pretix/base/pdf.py:1318 msgid "Your layout file is not a valid JSON file." msgstr "ملف التخطيط الخاص بك ليس ملف \"ترميز باستعمال جافا سكريبت\" صالح." @@ -7203,7 +7278,7 @@ msgstr "" msgid "Should be short, e.g. \"VAT\"" msgstr "يجب أن يكون قصيرا، على سبيل المثال VAT" -#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1523 +#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1622 #: pretix/control/templates/pretixcontrol/order/transactions.html:22 #, fuzzy #| msgid "Status code" @@ -7273,12 +7348,12 @@ msgstr "" msgid "You need to set your home country to use the reverse charge feature." msgstr "تحتاج إلى تحديد بلدك لاستخدام ميزة التكلفة العكسية." -#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1570 +#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1672 msgid "" "A combination of this tax code with a non-zero tax rate does not make sense." msgstr "" -#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1574 +#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1676 msgid "" "A combination of this tax code with a zero tax rate does not make sense." msgstr "" @@ -7294,7 +7369,7 @@ msgid "plus {rate}% {name}" msgstr "بالإضافة إلى {rate}% {name}" #: pretix/base/models/tax.py:441 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:63 +#: pretix/control/templates/pretixcontrol/event/tax.html:82 msgid "reverse charge enabled" msgstr "تم تمكين التكلفة العكسية" @@ -7570,9 +7645,9 @@ msgid "Dates" msgstr "تواريخ" #: pretix/base/notifications.py:200 -#: pretix/control/templates/pretixcontrol/order/index.html:730 +#: pretix/control/templates/pretixcontrol/order/index.html:755 #: pretix/plugins/reports/accountingreport.py:318 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:442 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:446 msgid "Net total" msgstr "الإجمالي الصافي" @@ -7584,8 +7659,8 @@ msgstr "مبالغ متأخرة" msgid "Purchased products" msgstr "المنتجات التي تم شراءها" -#: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:384 -#: pretix/base/services/placeholders.py:393 +#: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:415 +#: pretix/base/services/placeholders.py:424 #: pretix/base/templates/pretixbase/email/order_details.html:151 msgid "View order details" msgstr "معاينة تفاصيل الطلب" @@ -7672,24 +7747,24 @@ msgctxt "payment" msgid "Google Pay" msgstr "الروبوت (جوجل اللعب)" -#: pretix/base/payment.py:119 pretix/base/payment.py:1610 +#: pretix/base/payment.py:119 pretix/base/payment.py:1614 msgid "You cannot pay with gift cards when buying a gift card." msgstr "لا يمكنك الدفع ببطاقات الهدايا عند شراء بطاقة هدايا." -#: pretix/base/payment.py:128 pretix/base/payment.py:1620 -#: pretix/base/payment.py:1622 +#: pretix/base/payment.py:128 pretix/base/payment.py:1624 +#: pretix/base/payment.py:1626 msgid "This gift card does not support this currency." msgstr "بطاقة الهدايا هذه لا تدعم هذه العملة." -#: pretix/base/payment.py:130 pretix/base/payment.py:1628 +#: pretix/base/payment.py:130 pretix/base/payment.py:1632 msgid "This gift card can only be used in test mode." msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا في وضع الاختبار." -#: pretix/base/payment.py:132 pretix/base/payment.py:1630 +#: pretix/base/payment.py:132 pretix/base/payment.py:1634 msgid "Only test gift cards can be used in test mode." msgstr "يمكن استخدام بطاقات الهدايا التجريبية فقط في وضع الاختبار." -#: pretix/base/payment.py:134 pretix/base/payment.py:1632 +#: pretix/base/payment.py:134 pretix/base/payment.py:1636 msgid "This gift card is no longer valid." msgstr "بطاقة الهدايا هذه لم تعد صالحة." @@ -7891,18 +7966,18 @@ msgstr "لا يلزم الدفع لأن هذا الطلب يشمل فقط الم msgid "Free of charge" msgstr "معفي من الرسوم" -#: pretix/base/payment.py:1168 +#: pretix/base/payment.py:1172 msgid "Box office" msgstr "شباك التذاكر" -#: pretix/base/payment.py:1216 pretix/base/payment.py:1235 +#: pretix/base/payment.py:1220 pretix/base/payment.py:1239 #: pretix/plugins/manualpayment/apps.py:30 #: pretix/plugins/manualpayment/apps.py:33 #: pretix/plugins/manualpayment/apps.py:39 msgid "Manual payment" msgstr "الدفع اليدوي" -#: pretix/base/payment.py:1221 pretix/plugins/banktransfer/payment.py:196 +#: pretix/base/payment.py:1225 pretix/plugins/banktransfer/payment.py:196 msgid "" "In test mode, you can just manually mark this order as paid in the backend " "after it has been created." @@ -7910,16 +7985,16 @@ msgstr "" "في وضع الاختبار ، يمكنك فقط تحديد هذا الطلب يدويا على أنه مدفوع في لوحة " "التحكم بعد إنشائه." -#: pretix/base/payment.py:1242 pretix/base/payment.py:1458 +#: pretix/base/payment.py:1246 pretix/base/payment.py:1462 #: pretix/plugins/banktransfer/payment.py:150 msgid "Payment method name" msgstr "اسم طريقة الدفع" -#: pretix/base/payment.py:1246 +#: pretix/base/payment.py:1250 msgid "Payment process description during checkout" msgstr "وصف عملية الدفع أثناء تسجيل الخروج" -#: pretix/base/payment.py:1247 +#: pretix/base/payment.py:1251 msgid "" "This text will be shown during checkout when the user selects this payment " "method. It should give a short explanation on this payment method." @@ -7927,11 +8002,11 @@ msgstr "" "سيظهر هذا النص أثناء تسجيل الخروج عندما يختار المستخدم طريقة الدفع هذه. يجب " "أن يتم تقديم شرح موجز عن طريقة الدفع ." -#: pretix/base/payment.py:1252 +#: pretix/base/payment.py:1256 msgid "Payment process description in order confirmation emails" msgstr "وصف عملية الدفع في رسائل البريد الإلكتروني لتأكيد الطلب" -#: pretix/base/payment.py:1253 +#: pretix/base/payment.py:1257 #, python-brace-format msgid "" "This text will be included for the {payment_info} placeholder in order " @@ -7943,11 +8018,11 @@ msgstr "" "المستخدم إلى كيفية متابعة الدفع. {order}, {amount}, {currency} " "و{amount_with_currency}." -#: pretix/base/payment.py:1260 +#: pretix/base/payment.py:1264 msgid "Payment process description for pending orders" msgstr "وصف عملية الدفع للطلبات المعلقة" -#: pretix/base/payment.py:1261 +#: pretix/base/payment.py:1265 #, python-brace-format msgid "" "This text will be shown on the order confirmation page for pending orders. " @@ -7958,7 +8033,7 @@ msgstr "" "المستخدم إلى كيفية متابعة الدفع. يمكنك استخدام العناصر {order}, {amount}, " "{currency} و {amount_with_currency}." -#: pretix/base/payment.py:1269 pretix/plugins/banktransfer/payment.py:145 +#: pretix/base/payment.py:1273 pretix/plugins/banktransfer/payment.py:145 msgid "" "Create an invoice for orders using bank transfer immediately if the event is " "otherwise configured to create invoices after payment is completed." @@ -7966,129 +8041,129 @@ msgstr "" "قم بإنشاء فاتورة للطلبات باستخدام التحويل المصرفي على الفور إذا تم إعداد " "الفعالية بطريقة أخرى تسمح بإنشاء الفواتير بعد إتمام الدفع." -#: pretix/base/payment.py:1320 +#: pretix/base/payment.py:1324 msgid "Offsetting" msgstr "تعويض" -#: pretix/base/payment.py:1334 pretix/control/views/orders.py:1257 +#: pretix/base/payment.py:1338 pretix/control/views/orders.py:1262 msgid "You entered an order that could not be found." msgstr "لقد أدخلت طلبا لا يمكن العثور عليه." -#: pretix/base/payment.py:1363 +#: pretix/base/payment.py:1367 #, python-format msgid "Balanced against orders: %s" msgstr "تم تسويتها مقابل الطلبات: %s" -#: pretix/base/payment.py:1464 +#: pretix/base/payment.py:1468 #, fuzzy #| msgid "Payment method name" msgid "Payment method description" msgstr "اسم طريقة الدفع" -#: pretix/base/payment.py:1494 +#: pretix/base/payment.py:1498 msgid "In test mode, only test cards will work." msgstr "في وضع الاختبار ، ستعمل بطاقات الاختبار فقط." -#: pretix/base/payment.py:1624 +#: pretix/base/payment.py:1628 msgid "This gift card is not accepted by this event organizer." msgstr "لم يتم قبول بطاقة الهدايا هذه من قبل منظم هذه الفعالية." -#: pretix/base/payment.py:1626 +#: pretix/base/payment.py:1630 msgid "This gift card was used in the meantime. Please try again." msgstr "تم استخدام بطاقة الهدايا هذه في هذه الأثناء. حاول مرة اخرى." -#: pretix/base/pdf.py:98 +#: pretix/base/pdf.py:99 msgid "Ticket code (barcode content)" msgstr "رمز التذكرة (محتوى الباركود)" -#: pretix/base/pdf.py:110 +#: pretix/base/pdf.py:111 msgid "Order position number" msgstr "رقم حالة الطلب" -#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1778 +#: pretix/base/pdf.py:124 pretix/control/forms/event.py:1884 #: pretix/control/templates/pretixcontrol/items/index.html:38 msgid "Product name" msgstr "اسم المنتج" -#: pretix/base/pdf.py:124 pretix/base/services/tickets.py:98 -#: pretix/control/views/event.py:888 pretix/control/views/pdf.py:94 +#: pretix/base/pdf.py:125 pretix/base/services/tickets.py:98 +#: pretix/control/views/event.py:907 pretix/control/views/pdf.py:96 msgid "Sample product" msgstr "نموذج منتج" -#: pretix/base/pdf.py:128 +#: pretix/base/pdf.py:129 msgid "Variation name" msgstr "اسم الصنف" -#: pretix/base/pdf.py:129 +#: pretix/base/pdf.py:130 msgid "Sample variation" msgstr "نموذج لنوع ما" -#: pretix/base/pdf.py:133 +#: pretix/base/pdf.py:134 msgid "Product description" msgstr "وصف المنتج" -#: pretix/base/pdf.py:134 pretix/base/services/tickets.py:99 -#: pretix/control/views/event.py:889 pretix/control/views/pdf.py:95 +#: pretix/base/pdf.py:135 pretix/base/services/tickets.py:99 +#: pretix/control/views/event.py:908 pretix/control/views/pdf.py:97 msgid "Sample product description" msgstr "نموذج وصف منتج" -#: pretix/base/pdf.py:138 +#: pretix/base/pdf.py:139 msgid "Product name and variation" msgstr "اسم المنتج ونوعه" -#: pretix/base/pdf.py:139 +#: pretix/base/pdf.py:140 msgid "Sample product – sample variation" msgstr "نموذج - نموذج لنوع معين" -#: pretix/base/pdf.py:146 +#: pretix/base/pdf.py:147 msgid "Product variation description" msgstr "وصف نوع المنتج" -#: pretix/base/pdf.py:147 +#: pretix/base/pdf.py:148 msgid "Sample product variation description" msgstr "نموذج وصف نوع المنتج" -#: pretix/base/pdf.py:154 +#: pretix/base/pdf.py:155 msgid "Ticket category" msgstr "فئة التذكرة" -#: pretix/base/pdf.py:161 pretix/base/pdf.py:166 pretix/base/pdf.py:175 +#: pretix/base/pdf.py:162 pretix/base/pdf.py:167 pretix/base/pdf.py:176 msgid "123.45 EUR" msgstr "123.45 يورو" -#: pretix/base/pdf.py:165 +#: pretix/base/pdf.py:166 #, fuzzy #| msgid "Price including add-ons" msgid "Price including bundled products" msgstr "السعر شاملا الإضافات" -#: pretix/base/pdf.py:174 +#: pretix/base/pdf.py:175 #, fuzzy #| msgid "Price including add-ons" msgid "Price including add-ons and bundled products" msgstr "السعر شاملا الإضافات" -#: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:573 -#: pretix/base/services/placeholders.py:571 -#: pretix/base/services/placeholders.py:653 -#: pretix/base/services/placeholders.py:669 -#: pretix/base/services/placeholders.py:678 pretix/control/views/event.py:890 +#: pretix/base/pdf.py:185 pretix/base/pdf.py:343 +#: pretix/base/services/invoices.py:582 +#: pretix/base/services/placeholders.py:602 +#: pretix/base/services/placeholders.py:687 +#: pretix/base/services/placeholders.py:703 +#: pretix/base/services/placeholders.py:712 pretix/control/views/event.py:909 msgid "John Doe" msgstr "جون دو" -#: pretix/base/pdf.py:189 pretix/base/pdf.py:347 -#: pretix/base/services/tickets.py:116 pretix/control/views/pdf.py:110 -#: pretix/control/views/pdf.py:116 pretix/control/views/pdf.py:123 -#: pretix/control/views/pdf.py:128 +#: pretix/base/pdf.py:190 pretix/base/pdf.py:348 +#: pretix/base/services/tickets.py:116 pretix/control/views/pdf.py:115 +#: pretix/control/views/pdf.py:121 pretix/control/views/pdf.py:128 +#: pretix/control/views/pdf.py:133 msgid "Sample company" msgstr "نموذج شركة" -#: pretix/base/pdf.py:193 +#: pretix/base/pdf.py:194 msgid "Full attendee address" msgstr "عنوان الحاضرالكامل" -#: pretix/base/pdf.py:194 +#: pretix/base/pdf.py:195 msgid "" "John Doe\n" "Sample company\n" @@ -8102,158 +8177,158 @@ msgstr "" "12345 أي مدينة\n" "اتلانتس" -#: pretix/base/pdf.py:198 +#: pretix/base/pdf.py:199 msgid "Attendee street" msgstr "شارع الحاضر" -#: pretix/base/pdf.py:203 +#: pretix/base/pdf.py:204 msgid "Attendee ZIP code" msgstr "الرمز البريدي للحضور" -#: pretix/base/pdf.py:208 +#: pretix/base/pdf.py:209 msgid "Attendee city" msgstr "مدينة الحاضر" -#: pretix/base/pdf.py:213 +#: pretix/base/pdf.py:214 msgid "Attendee state" msgstr "منطقة الحاضر" -#: pretix/base/pdf.py:218 +#: pretix/base/pdf.py:219 msgid "Attendee country" msgstr "بلد الحضور" -#: pretix/base/pdf.py:230 +#: pretix/base/pdf.py:231 #, fuzzy #| msgid "Pseudonymization ID" msgid "Pseudonymization ID (lead scanning)" msgstr "معرف الاسم المستعار" -#: pretix/base/pdf.py:236 pretix/base/pdf.py:241 +#: pretix/base/pdf.py:237 pretix/base/pdf.py:242 msgid "Sample event name" msgstr "مثال اسم فعالية" -#: pretix/base/pdf.py:246 +#: pretix/base/pdf.py:247 msgid "May 31st, 2017" msgstr "31 مايو 2017" -#: pretix/base/pdf.py:250 +#: pretix/base/pdf.py:251 msgid "Event date range" msgstr "نطاق تاريخ الفعالية" -#: pretix/base/pdf.py:251 +#: pretix/base/pdf.py:252 msgid "May 31st – June 4th, 2017" msgstr "31 مايو - 4 يونيو، 2017" -#: pretix/base/pdf.py:255 +#: pretix/base/pdf.py:256 msgid "Event begin date and time" msgstr "تاريخ ووقت بداية الفعالية" -#: pretix/base/pdf.py:256 +#: pretix/base/pdf.py:257 msgid "2017-05-31 20:00" msgstr "20:00 2017-05-31" -#: pretix/base/pdf.py:263 +#: pretix/base/pdf.py:264 msgid "Event begin date" msgstr "تاريخ بداية الفعالية" -#: pretix/base/pdf.py:264 pretix/base/pdf.py:290 pretix/base/pdf.py:399 -#: pretix/base/pdf.py:423 pretix/base/pdf.py:447 pretix/base/pdf.py:471 -#: pretix/base/pdf.py:528 pretix/base/pdf.py:533 +#: pretix/base/pdf.py:265 pretix/base/pdf.py:291 pretix/base/pdf.py:400 +#: pretix/base/pdf.py:424 pretix/base/pdf.py:448 pretix/base/pdf.py:472 +#: pretix/base/pdf.py:535 pretix/base/pdf.py:540 msgid "2017-05-31" msgstr "2017-05-31" -#: pretix/base/pdf.py:271 +#: pretix/base/pdf.py:272 msgid "Event begin time" msgstr "وقت بداية الفعالية" -#: pretix/base/pdf.py:272 +#: pretix/base/pdf.py:273 msgid "20:00" msgstr "20:00" -#: pretix/base/pdf.py:276 +#: pretix/base/pdf.py:277 #, fuzzy #| msgid "Event begin date" msgid "Event begin weekday" msgstr "تاريخ بداية الفعالية" -#: pretix/base/pdf.py:277 pretix/base/pdf.py:306 +#: pretix/base/pdf.py:278 pretix/base/pdf.py:307 #: pretix/base/services/checkin.py:362 pretix/control/forms/filter.py:1271 msgid "Friday" msgstr "يوم الجمعة" -#: pretix/base/pdf.py:281 +#: pretix/base/pdf.py:282 msgid "Event end date and time" msgstr "تاريخ ووقت إنتهاء الفعالية" -#: pretix/base/pdf.py:282 +#: pretix/base/pdf.py:283 msgid "2017-05-31 22:00" msgstr "22:00 2017-05-31" -#: pretix/base/pdf.py:298 +#: pretix/base/pdf.py:299 msgid "22:00" msgstr "22:00" -#: pretix/base/pdf.py:305 +#: pretix/base/pdf.py:306 #, fuzzy #| msgid "Event end date" msgid "Event end weekday" msgstr "تاريخ إنتهاء الفعالية" -#: pretix/base/pdf.py:310 +#: pretix/base/pdf.py:311 msgid "Event admission date and time" msgstr "تاريخ ووقت قبول الفعالية" -#: pretix/base/pdf.py:311 pretix/base/pdf.py:407 pretix/base/pdf.py:431 -#: pretix/base/pdf.py:455 pretix/base/pdf.py:479 pretix/base/pdf.py:522 +#: pretix/base/pdf.py:312 pretix/base/pdf.py:408 pretix/base/pdf.py:432 +#: pretix/base/pdf.py:456 pretix/base/pdf.py:480 pretix/base/pdf.py:529 msgid "2017-05-31 19:00" msgstr "19:00 2017-05-31" -#: pretix/base/pdf.py:318 +#: pretix/base/pdf.py:319 msgid "Event admission time" msgstr "وقت تسجيل الفعالية" -#: pretix/base/pdf.py:319 pretix/base/pdf.py:415 pretix/base/pdf.py:439 -#: pretix/base/pdf.py:463 pretix/base/pdf.py:487 +#: pretix/base/pdf.py:320 pretix/base/pdf.py:416 pretix/base/pdf.py:440 +#: pretix/base/pdf.py:464 pretix/base/pdf.py:488 msgid "19:00" msgstr "19:00" -#: pretix/base/pdf.py:326 +#: pretix/base/pdf.py:327 msgid "Event location" msgstr "موقع الفعالية" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1201 +#: pretix/base/pdf.py:328 pretix/base/settings.py:1233 msgid "Random City" msgstr "مدينة عشوائية" -#: pretix/base/pdf.py:352 +#: pretix/base/pdf.py:353 msgid "Sesame Street 42" msgstr "شارع سيسيم 42" -#: pretix/base/pdf.py:357 +#: pretix/base/pdf.py:358 msgid "12345" msgstr "12345" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:576 +#: pretix/base/pdf.py:363 pretix/base/services/invoices.py:585 msgid "Sample city" msgstr "مدينة مثال" -#: pretix/base/pdf.py:366 +#: pretix/base/pdf.py:367 msgid "Invoice address state" msgstr "منطقة عنوان الفاتورة" -#: pretix/base/pdf.py:367 +#: pretix/base/pdf.py:368 msgid "Sample State" msgstr "منطقة مثال" -#: pretix/base/pdf.py:372 +#: pretix/base/pdf.py:373 msgid "Atlantis" msgstr "اتلانتس" -#: pretix/base/pdf.py:376 +#: pretix/base/pdf.py:377 msgid "List of Add-Ons" msgstr "قائمة الإضافات" -#: pretix/base/pdf.py:377 +#: pretix/base/pdf.py:378 #, fuzzy #| msgid "" #| "Add-on 1\n" @@ -8265,168 +8340,181 @@ msgstr "" "الإضافة 1\n" "الإضافة 2" -#: pretix/base/pdf.py:383 pretix/control/forms/filter.py:1409 +#: pretix/base/pdf.py:384 pretix/control/forms/filter.py:1409 #: pretix/control/forms/filter.py:1411 #: pretix/control/templates/pretixcontrol/organizers/index.html:42 msgid "Organizer name" msgstr "اسم المنظم" -#: pretix/base/pdf.py:384 +#: pretix/base/pdf.py:385 msgid "Event organizer company" msgstr "شركة منظم الفعالية" -#: pretix/base/pdf.py:388 +#: pretix/base/pdf.py:389 msgid "Organizer info text" msgstr "نص معلومات المنظم" -#: pretix/base/pdf.py:389 +#: pretix/base/pdf.py:390 msgid "Event organizer info text" msgstr "نص معلومات منظم الفعالية" -#: pretix/base/pdf.py:393 pretix/base/pdf.py:394 +#: pretix/base/pdf.py:394 pretix/base/pdf.py:395 msgid "Event info text" msgstr "نص معلومات الفعالية" -#: pretix/base/pdf.py:398 +#: pretix/base/pdf.py:399 msgid "Printing date" msgstr "تاريخ الطباعة" -#: pretix/base/pdf.py:406 +#: pretix/base/pdf.py:407 msgid "Printing date and time" msgstr "تاريخ ووقت الطباعة" -#: pretix/base/pdf.py:414 +#: pretix/base/pdf.py:415 msgid "Printing time" msgstr "وقت الطباعة" -#: pretix/base/pdf.py:422 pretix/control/forms/item.py:738 +#: pretix/base/pdf.py:423 pretix/control/forms/item.py:741 #, fuzzy #| msgid "Purchased" msgid "Purchase date" msgstr "اشترى" -#: pretix/base/pdf.py:430 +#: pretix/base/pdf.py:431 #, fuzzy #| msgid "Purchased" msgid "Purchase date and time" msgstr "اشترى" -#: pretix/base/pdf.py:438 +#: pretix/base/pdf.py:439 #, fuzzy #| msgid "Purchased" msgid "Purchase time" msgstr "اشترى" -#: pretix/base/pdf.py:446 +#: pretix/base/pdf.py:447 #, fuzzy #| msgid "Valid until" msgid "Validity start date" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:454 +#: pretix/base/pdf.py:455 #, fuzzy #| msgid "Printing date and time" msgid "Validity start date and time" msgstr "تاريخ ووقت الطباعة" -#: pretix/base/pdf.py:462 +#: pretix/base/pdf.py:463 #, fuzzy #| msgid "Valid until" msgid "Validity start time" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:470 +#: pretix/base/pdf.py:471 #, fuzzy #| msgid "Valid until" msgid "Validity end date" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:478 +#: pretix/base/pdf.py:479 #, fuzzy #| msgid "Event end date and time" msgid "Validity end date and time" msgstr "تاريخ ووقت إنتهاء الفعالية" -#: pretix/base/pdf.py:486 +#: pretix/base/pdf.py:487 #, fuzzy #| msgid "Valid until" msgid "Validity end time" msgstr "حتى تاريخ" -#: pretix/base/pdf.py:494 +#: pretix/base/pdf.py:495 +#, fuzzy +#| msgid "Printing date and time" +msgid "Program times: date and time" +msgstr "تاريخ ووقت الطباعة" + +#: pretix/base/pdf.py:497 +msgid "" +"2017-05-31 10:00 – 12:00\n" +"2017-05-31 14:00 – 16:00\n" +"2017-05-31 14:00 – 2017-06-01 14:00" +msgstr "" + +#: pretix/base/pdf.py:501 msgid "Reusable Medium ID" msgstr "" -#: pretix/base/pdf.py:499 +#: pretix/base/pdf.py:506 msgid "Seat: Full name" msgstr "مقعد: الاسم الكامل" -#: pretix/base/pdf.py:500 +#: pretix/base/pdf.py:507 msgid "Ground floor, Row 3, Seat 4" msgstr "الطابق الأرضي، الصف 3، مقعد 4" -#: pretix/base/pdf.py:502 pretix/base/pdf.py:508 +#: pretix/base/pdf.py:509 pretix/base/pdf.py:515 #: pretix/control/forms/orders.py:344 msgid "General admission" msgstr "التسجيل العام" -#: pretix/base/pdf.py:505 +#: pretix/base/pdf.py:512 msgid "Seat: zone" msgstr "مقعد: المنطقة" -#: pretix/base/pdf.py:506 +#: pretix/base/pdf.py:513 msgid "Ground floor" msgstr "الطابق الأرضي" -#: pretix/base/pdf.py:511 +#: pretix/base/pdf.py:518 msgid "Seat: row" msgstr "مقعد: صف" -#: pretix/base/pdf.py:516 +#: pretix/base/pdf.py:523 msgid "Seat: seat number" msgstr "مقعد: عدد المقاعد" -#: pretix/base/pdf.py:521 +#: pretix/base/pdf.py:528 msgid "Date and time of first scan" msgstr "تاريخ ووقت أول مسح" -#: pretix/base/pdf.py:527 +#: pretix/base/pdf.py:534 #, fuzzy #| msgid "Gift card code" msgid "Gift card: Issuance date" msgstr "رمز بطاقة الهدية" -#: pretix/base/pdf.py:532 +#: pretix/base/pdf.py:539 #, fuzzy #| msgid "Expiration date" msgid "Gift card: Expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/pdf.py:573 pretix/base/pdf.py:611 pretix/base/pdf.py:617 +#: pretix/base/pdf.py:580 pretix/base/pdf.py:618 pretix/base/pdf.py:624 #: pretix/plugins/badges/exporters.py:504 #: pretix/plugins/ticketoutputpdf/exporters.py:102 #, python-brace-format msgid "Question: {question}" msgstr "سؤال: {question}" -#: pretix/base/pdf.py:612 pretix/base/pdf.py:618 +#: pretix/base/pdf.py:619 pretix/base/pdf.py:625 #, python-brace-format msgid "" msgstr "<جواب: {question}>" -#: pretix/base/pdf.py:659 +#: pretix/base/pdf.py:666 #, fuzzy #| msgid "Attendee names" msgid "Attendee name for salutation" msgstr "أسماء الحضور" -#: pretix/base/pdf.py:660 pretix/base/pdf.py:683 -#: pretix/base/services/placeholders.py:696 +#: pretix/base/pdf.py:667 pretix/base/pdf.py:690 +#: pretix/base/services/placeholders.py:730 #: pretix/control/forms/organizer.py:664 msgid "Mr Doe" msgstr "السيد دو" -#: pretix/base/pdf.py:666 pretix/base/pdf.py:673 +#: pretix/base/pdf.py:673 pretix/base/pdf.py:680 #: pretix/plugins/badges/exporters.py:501 #: pretix/plugins/checkinlists/exporters.py:125 #: pretix/plugins/checkinlists/exporters.py:499 @@ -8435,18 +8523,18 @@ msgstr "السيد دو" msgid "Attendee name: {part}" msgstr "اسم الحاضر: {part}" -#: pretix/base/pdf.py:682 +#: pretix/base/pdf.py:689 #, fuzzy #| msgid "Invoice address explanation" msgid "Invoice address name for salutation" msgstr "شرح عنوان الفاتورة" -#: pretix/base/pdf.py:689 +#: pretix/base/pdf.py:696 #, python-brace-format msgid "Invoice address name: {part}" msgstr "اسم عنوان الفاتورة: {part}" -#: pretix/base/pdf.py:1310 +#: pretix/base/pdf.py:1327 #, fuzzy, python-brace-format #| msgid "Your layout file is not a valid seating plan. Error message: {}" msgid "Your layout file is not a valid layout. Error message: {}" @@ -8557,7 +8645,7 @@ msgid "Bulk-refund confirmation" msgstr "إنشاء التكوين" #: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:247 -#: pretix/base/services/orders.py:155 +#: pretix/base/services/orders.py:159 msgid "" "We were not able to process your request completely as the server was too " "busy. Please try again." @@ -8577,7 +8665,7 @@ msgctxt "subevent" msgid "No date was specified." msgstr "لم يتم تحديد تاريخ." -#: pretix/base/services/cart.py:108 pretix/base/services/orders.py:192 +#: pretix/base/services/cart.py:108 pretix/base/services/orders.py:196 msgid "You selected a product which is not available for sale." msgstr "لقد اخترت منتجا غير متوفر للبيع." @@ -8621,7 +8709,7 @@ msgstr "" "بعض المنتجات التي اخترتها لم تعد متوفرة بالكمية التي حددتها. انظر أدناه " "للحصول على التفاصيل." -#: pretix/base/services/cart.py:127 +#: pretix/base/services/cart.py:127 pretix/base/services/orders.py:150 #, fuzzy, python-format #| msgid "You cannot select more than %s items per order." msgid "You cannot select more than %s item per order." @@ -8633,7 +8721,7 @@ msgstr[3] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب. msgstr[4] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." msgstr[5] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." -#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1628 +#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1651 #, fuzzy, python-format #| msgid "" #| "You cannot select more than %(max)s items of the product %(product)s." @@ -8647,7 +8735,7 @@ msgstr[3] "لا يمكنك تحديد أكثر من %(max)s عناصر من ال msgstr[4] "لا يمكنك تحديد أكثر من %(max)s عناصر من المنتج %(product)s." msgstr[5] "لا يمكنك تحديد أكثر من %(max)s عناصر من المنتج %(product)s." -#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1633 +#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1656 #, fuzzy, python-format #| msgid "" #| "You need to select at least %(min)s items of the product %(product)s." @@ -8691,7 +8779,7 @@ msgstr[5] "" "أزلنا %(product)s من عربة التسوق الخاصة بك كما لا يمكنك شراء أقل من %(min)s " "عناصر من المنتج." -#: pretix/base/services/cart.py:145 pretix/base/services/orders.py:158 +#: pretix/base/services/cart.py:145 pretix/base/services/orders.py:162 #: pretix/presale/templates/pretixpresale/event/index.html:170 #: pretix/presale/views/waiting.py:145 pretix/presale/views/widget.py:809 #, fuzzy @@ -8725,7 +8813,7 @@ msgstr "" "لم تبدأ فترة عرض ما قبل البيع لهذه الفعالية بعد. تمت إزالة العناصر المتأثرة " "من عربة التسوق الخاصة بك." -#: pretix/base/services/cart.py:152 pretix/base/services/orders.py:186 +#: pretix/base/services/cart.py:152 pretix/base/services/orders.py:190 #, fuzzy #| msgid "" #| "The presale period for one of the events in your cart has ended. The " @@ -8751,7 +8839,7 @@ msgstr "السعر الذي تم إدخاله مرتفع جدا." msgid "This voucher code is not known in our database." msgstr "رمز كود الخصم هذا غير معروف في قاعدة البيانات الخاصة بنا." -#: pretix/base/services/cart.py:158 pretix/base/services/orders.py:161 +#: pretix/base/services/cart.py:158 pretix/base/services/orders.py:165 #, python-format msgid "" "The voucher code \"%(voucher)s\" can only be used if you select at least " @@ -8859,15 +8947,15 @@ msgctxt "subevent" msgid "The selected event date is not active." msgstr "تاريخ الفعالية المحدد غير نشط." -#: pretix/base/services/cart.py:195 pretix/base/services/orders.py:193 +#: pretix/base/services/cart.py:195 pretix/base/services/orders.py:197 msgid "You can not select an add-on for the selected product." msgstr "لا يمكنك اختيار إضافة للمنتج المحدد." -#: pretix/base/services/cart.py:196 pretix/base/services/orders.py:194 +#: pretix/base/services/cart.py:196 pretix/base/services/orders.py:198 msgid "You can not select two variations of the same add-on product." msgstr "لا يمكنك تحديد نوعين مختلفين من نفس منتج قائمة الإضافة." -#: pretix/base/services/cart.py:198 pretix/base/services/orders.py:196 +#: pretix/base/services/cart.py:198 pretix/base/services/orders.py:200 #, fuzzy, python-format #| msgid "" #| "You can select at most %(max)s add-ons from the category %(cat)s for the " @@ -8891,7 +8979,7 @@ msgstr[4] "" msgstr[5] "" "يمكنك الاختيار على الأكثر %(max)s من الإضافات لفئة %(cat)s للمنتج %(base)s." -#: pretix/base/services/cart.py:203 pretix/base/services/orders.py:201 +#: pretix/base/services/cart.py:203 pretix/base/services/orders.py:205 #, fuzzy, python-format #| msgid "" #| "You need to select at least %(min)s add-ons from the category %(cat)s for " @@ -8915,7 +9003,7 @@ msgstr[4] "" msgstr[5] "" "تحتاج إلى اختيار على الأقل %(min)s من الإضافات لفئة %(cat)s للمنتج %(base)s." -#: pretix/base/services/cart.py:207 pretix/base/services/orders.py:205 +#: pretix/base/services/cart.py:207 pretix/base/services/orders.py:209 #, fuzzy, python-format #| msgid "" #| "You can select every add-ons from the category %(cat)s for the product " @@ -9197,13 +9285,13 @@ msgstr "تم رفض طلب الإذن" msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:115 +#: pretix/base/services/invoices.py:116 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "يرجى إتمام عملية الدفع قبل {expire_date}." -#: pretix/base/services/invoices.py:127 +#: pretix/base/services/invoices.py:128 #, python-brace-format msgctxt "invoice" msgid "" @@ -9219,52 +9307,52 @@ msgstr "" "{i.zipcode} {i.city} {state}\n" "{country}" -#: pretix/base/services/invoices.py:237 pretix/base/services/invoices.py:274 +#: pretix/base/services/invoices.py:238 pretix/base/services/invoices.py:281 #, fuzzy, python-brace-format #| msgid "Event location" msgctxt "invoice" msgid "Event location: {location}" msgstr "موقع الفعالية" -#: pretix/base/services/invoices.py:253 +#: pretix/base/services/invoices.py:254 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "الحاضر: {name}" -#: pretix/base/services/invoices.py:271 pretix/plugins/reports/exporters.py:309 +#: pretix/base/services/invoices.py:278 pretix/plugins/reports/exporters.py:309 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "تاريخ: {}" -#: pretix/base/services/invoices.py:566 +#: pretix/base/services/invoices.py:575 msgid "A payment provider specific text might appear here." msgstr "قد يظهر نص محدد لمزود خدمة الدفع هنا." -#: pretix/base/services/invoices.py:574 +#: pretix/base/services/invoices.py:583 msgid "214th Example Street" msgstr "مثال شارع رقم 214" -#: pretix/base/services/invoices.py:575 +#: pretix/base/services/invoices.py:584 msgid "012345" msgstr "012345" -#: pretix/base/services/invoices.py:592 +#: pretix/base/services/invoices.py:601 #, python-brace-format msgid "Sample product {}" msgstr "نموذج منتج {}" -#: pretix/base/services/invoices.py:602 +#: pretix/base/services/invoices.py:611 msgid "Sample product A" msgstr "نموذج منتج أ" -#: pretix/base/services/invoices.py:662 +#: pretix/base/services/invoices.py:671 #, python-brace-format msgid "New invoice: {number}" msgstr "فاتورة جديدة: {number}" -#: pretix/base/services/invoices.py:664 +#: pretix/base/services/invoices.py:673 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -9315,7 +9403,7 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "أنت تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا ل {event}." -#: pretix/base/services/mail.py:494 +#: pretix/base/services/mail.py:495 #, fuzzy #| msgid "resend invite" msgctxt "attachment_filename" @@ -9454,7 +9542,7 @@ msgstr "" "\": {message}" #: pretix/base/services/modelimport.py:92 -#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1637 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1660 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" @@ -9522,7 +9610,7 @@ msgstr "" msgid "Your cart is empty." msgstr "عربة التسوق الخاصة بك فارغة." -#: pretix/base/services/orders.py:150 +#: pretix/base/services/orders.py:154 #, fuzzy, python-format #| msgid "" #| "You cannot select more than %(max)s items of the product %(product)s. We " @@ -9552,13 +9640,13 @@ msgstr[5] "" "لا يمكنك تحديد أكثر من %(max)s وحدة من المنتج %(product)s. قمنا بإزالة " "العناصر الزائدة في سلة التسوق الخاصة بك." -#: pretix/base/services/orders.py:159 +#: pretix/base/services/orders.py:163 #, fuzzy #| msgid "The presale period has ended." msgid "The booking period has ended." msgstr "انتهت فترة عرض ما قبل البيع." -#: pretix/base/services/orders.py:165 +#: pretix/base/services/orders.py:169 msgid "" "The voucher code used for one of the items in your cart is not known in our " "database." @@ -9566,7 +9654,7 @@ msgstr "" "رمز كود الخصم المستخدم لأحد العناصر الموجودة في سلة التسوق الخاصة بك غير " "معروف في قاعدة البيانات الخاصة بنا." -#: pretix/base/services/orders.py:167 +#: pretix/base/services/orders.py:171 msgid "" "The voucher code used for one of the items in your cart has already been " "used the maximum number of times allowed. We removed this item from your " @@ -9576,7 +9664,7 @@ msgstr "" "بك سابقا وتجاوز عدد المرات المسموح به. أزلنا هذا العنصر من سلة التسوق الخاصة " "بك." -#: pretix/base/services/orders.py:171 +#: pretix/base/services/orders.py:175 msgid "" "The voucher code used for one of the items in your cart has already been too " "often. We adjusted the price of the item in your cart." @@ -9584,7 +9672,7 @@ msgstr "" "رمز كود الخصم المستخدم لأحد العناصر في سلة التسوق الخاصة بك تم استخدامه " "كثيرا في السابق. قمنا بتعديل سعر العنصر في سلة التسوق الخاصة بك." -#: pretix/base/services/orders.py:175 +#: pretix/base/services/orders.py:179 msgid "" "The voucher code used for one of the items in your cart is expired. We " "removed this item from your cart." @@ -9592,7 +9680,7 @@ msgstr "" "انتهت صلاحية رمز كود الخصم المستخدم لأحد العناصر الموجودة في سلة التسوق " "الخاصة بك. أزلنا هذا العنصر من سلة التسوق الخاصة بك." -#: pretix/base/services/orders.py:178 +#: pretix/base/services/orders.py:182 msgid "" "The voucher code used for one of the items in your cart is not valid for " "this item. We removed this item from your cart." @@ -9600,13 +9688,13 @@ msgstr "" "رمز كود الخصم المستخدم لأحد العناصر الموجودة في سلة التسوق الخاصة بك غير " "صالح لهذا العنصر. أزلنا هذا العنصر من سلة التسوق الخاصة بك." -#: pretix/base/services/orders.py:180 +#: pretix/base/services/orders.py:184 #, fuzzy #| msgid "You need a valid voucher code to order this product." msgid "You need a valid voucher code to order one of the products." msgstr "تحتاج إلى رمز كود خصم صالح لطلب هذا المنتج." -#: pretix/base/services/orders.py:182 +#: pretix/base/services/orders.py:186 #, fuzzy #| msgid "" #| "The presale period for one of the events in your cart has not yet " @@ -9618,7 +9706,7 @@ msgstr "" "لم تبدأ فترة عرض ما قبل البيع لإحدى الفعاليات في عربة التسوق الخاصة بك بعد. " "تمت إزالة العناصر المتأثرة من عربة التسوق الخاصة بك." -#: pretix/base/services/orders.py:189 +#: pretix/base/services/orders.py:193 msgid "" "One of the seats in your order was invalid, we removed the position from " "your cart." @@ -9626,7 +9714,7 @@ msgstr "" "كان أحد المقاعد في طلبك غير صالح ، قمنا بإزالة العنصر من عربة التسوق الخاصة " "بك." -#: pretix/base/services/orders.py:190 +#: pretix/base/services/orders.py:194 msgid "" "One of the seats in your order has been taken in the meantime, we removed " "the position from your cart." @@ -9634,7 +9722,7 @@ msgstr "" "تم أخذ أحد المقاعد في طلبك في هذه الأثناء، وقمنا بإزالة العنصر من عربة " "التسوق الخاصة بك." -#: pretix/base/services/orders.py:206 +#: pretix/base/services/orders.py:210 #, fuzzy, python-format #| msgid "" #| "You cannot delete the product %(item)s because it " @@ -9644,32 +9732,32 @@ msgid "" "in." msgstr "لا يمكنك حذف المنتج على %(item)s لأنه بالفعل قد أمرت." -#: pretix/base/services/orders.py:207 +#: pretix/base/services/orders.py:211 #, fuzzy #| msgid "This gift card does not support this currency." msgid "Paid products not supported without a valid currency." msgstr "بطاقة الهدايا هذه لا تدعم هذه العملة." -#: pretix/base/services/orders.py:223 +#: pretix/base/services/orders.py:227 #, fuzzy #| msgid "The order has been canceled." msgid "The order was not canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/base/services/orders.py:283 pretix/control/forms/orders.py:126 +#: pretix/base/services/orders.py:287 pretix/control/forms/orders.py:126 msgid "The new expiry date needs to be in the future." msgstr "يجب أن يكون تاريخ إنتهاء الصلاحية الجديد في المستقبل." -#: pretix/base/services/orders.py:383 pretix/base/services/orders.py:481 +#: pretix/base/services/orders.py:387 pretix/base/services/orders.py:485 msgid "This order is not pending approval." msgstr "هذا الطلب ليس في انتظار الموافقة." -#: pretix/base/services/orders.py:543 pretix/presale/views/order.py:953 +#: pretix/base/services/orders.py:547 pretix/presale/views/order.py:953 #: pretix/presale/views/order.py:1007 msgid "You cannot cancel this order." msgstr "لا يمكنك إلغاء هذا الطلب." -#: pretix/base/services/orders.py:555 +#: pretix/base/services/orders.py:559 #, python-brace-format msgid "" "This order can not be canceled since the gift card {card} purchased in this " @@ -9678,7 +9766,7 @@ msgstr "" "لا يمكن إلغاء هذا الطلب لأنه تم بالفعل استرداد قيمة بطاقة الهدايا {card} " "المشتراة لهذا الطلب." -#: pretix/base/services/orders.py:618 pretix/control/forms/orders.py:219 +#: pretix/base/services/orders.py:622 pretix/control/forms/orders.py:219 #, fuzzy #| msgid "" #| "The cancellation fee cannot be higher than the payment credit of this " @@ -9687,13 +9775,13 @@ msgid "" "The cancellation fee cannot be higher than the total amount of this order." msgstr "لا يمكن أن تكون رسوم الإلغاء أعلى من رصيد الدفع لهذا الطلب." -#: pretix/base/services/orders.py:1024 +#: pretix/base/services/orders.py:1048 #, fuzzy #| msgid "This payment method does not support automatic refunds." msgid "The selected payment methods do not cover the total balance." msgstr "طريقة الدفع هذه لا يدعم استرداد التلقائي." -#: pretix/base/services/orders.py:1092 +#: pretix/base/services/orders.py:1114 msgid "" "While trying to place your order, we noticed that the order total has " "changed. Either one of the prices changed just now, or a gift card you used " @@ -9703,31 +9791,31 @@ msgstr "" "الأسعار الآن ، أو أن بطاقة الهدايا التي استخدمتها جاري استعمالها في الوقت " "الحالي. يرجى التحقق من الأسعار أدناه والمحاولة مرة أخرى." -#: pretix/base/services/orders.py:1607 +#: pretix/base/services/orders.py:1630 msgid "You need to select a variation of the product." msgstr "تحتاج إلى تحديد نوع من المنتج." -#: pretix/base/services/orders.py:1608 +#: pretix/base/services/orders.py:1631 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "الحصة {name} لم يتبق لديها سعة كافية لإجراء العملية." -#: pretix/base/services/orders.py:1609 +#: pretix/base/services/orders.py:1632 msgid "There is no quota defined that allows this operation." msgstr "لا توجد حصة محددة تسمح بهذه العملية." -#: pretix/base/services/orders.py:1610 +#: pretix/base/services/orders.py:1633 msgid "The selected product is not active or has no price set." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/services/orders.py:1611 +#: pretix/base/services/orders.py:1634 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "سيترك هذا الإجراء الطلب فارغا. يرجى إلغاء الطلب نفسه بدلا من ذلك." -#: pretix/base/services/orders.py:1613 +#: pretix/base/services/orders.py:1636 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." @@ -9735,23 +9823,23 @@ msgstr "" "ستجعل هذه العملية الطلب مجانيا وبالتالي يتم دفعه على الفور ، إلا أنه لا " "تتوفر حصة." -#: pretix/base/services/orders.py:1616 +#: pretix/base/services/orders.py:1639 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "هذا منتج إضافي ، يرجى تحديد العنصر الأساسي الذي تجب الإضافة إليه." -#: pretix/base/services/orders.py:1617 +#: pretix/base/services/orders.py:1640 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "لا يسمح لك العنصر المختار بإضافة هذا المنتج كقائمة مضافة." -#: pretix/base/services/orders.py:1618 +#: pretix/base/services/orders.py:1641 msgid "You need to choose a subevent for the new position." msgstr "تحتاج إلى اختيار فعالية فرعية للعنصر الجديد." -#: pretix/base/services/orders.py:1621 +#: pretix/base/services/orders.py:1644 #, python-brace-format msgid "" "You selected seat \"{seat}\" for a date that does not match the selected " @@ -9760,25 +9848,25 @@ msgstr "" "لقد حددت المقعد \"{seat}\" لتاريخ لا يتطابق مع تاريخ التذكرة المحدد. الرجاء " "اختيار مقعد مرة أخرى." -#: pretix/base/services/orders.py:1623 +#: pretix/base/services/orders.py:1646 msgid "The selected product requires you to select a seat." msgstr "المنتج المحدد يتطلب منك اختيار مقعد." -#: pretix/base/services/orders.py:1624 +#: pretix/base/services/orders.py:1647 msgid "The selected product does not allow to select a seat." msgstr "المنتج المحدد لا يسمح باختيار مقعد." -#: pretix/base/services/orders.py:1625 +#: pretix/base/services/orders.py:1648 msgid "The selected country is blocked by your tax rule." msgstr "تم حظر البلد المحدد من خلال القاعدة الضريبية الخاصة بك." -#: pretix/base/services/orders.py:1626 +#: pretix/base/services/orders.py:1649 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "لا يمكنك تغيير سعر العنصر الذي تم استخدامه لإصدار بطاقة هدايا." -#: pretix/base/services/orders.py:2451 pretix/base/services/orders.py:2468 +#: pretix/base/services/orders.py:2480 pretix/base/services/orders.py:2497 #, python-brace-format msgid "" "A position can not be canceled since the gift card {card} purchased in this " @@ -9787,7 +9875,7 @@ msgstr "" "لا يمكن إلغاء العنصر نظرا لأنه تم بالفعل استرداد قيمة بطاقة الهدايا {card} " "المشتراة في هذا الطلب." -#: pretix/base/services/orders.py:3182 +#: pretix/base/services/orders.py:3244 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." @@ -9795,33 +9883,33 @@ msgstr "" "حدث خطأ أثناء محاولة إعادة الأموال إليك. يرجى الاتصال بمنظم الفعالية لمزيد " "من المعلومات." -#: pretix/base/services/placeholders.py:469 -#: pretix/base/services/placeholders.py:478 +#: pretix/base/services/placeholders.py:500 +#: pretix/base/services/placeholders.py:509 #: pretix/base/templates/pretixbase/email/order_details.html:49 msgid "View registration details" msgstr "عرض تفاصيل التسجيل" -#: pretix/base/services/placeholders.py:575 +#: pretix/base/services/placeholders.py:606 msgid "Sample Corporation" msgstr "نموذج لشركة" -#: pretix/base/services/placeholders.py:615 +#: pretix/base/services/placeholders.py:647 msgid "Sample Admission Ticket" msgstr "نموذج لتذكرة الدخول" -#: pretix/base/services/placeholders.py:657 +#: pretix/base/services/placeholders.py:691 msgid "An individual text with a reason can be inserted here." msgstr "يمكن إدراج نص فردي مع سبب هنا." -#: pretix/base/services/placeholders.py:661 +#: pretix/base/services/placeholders.py:695 msgid "The amount has been charged to your card." msgstr "تم خصم المبلغ من بطاقتك." -#: pretix/base/services/placeholders.py:665 +#: pretix/base/services/placeholders.py:699 msgid "Please transfer money to this bank account: 9999-9999-9999-9999" msgstr "يرجى تحويل المبلغ إلى هذا الحساب المصرفي: 9999-9999-9999-9999" -#: pretix/base/services/placeholders.py:765 +#: pretix/base/services/placeholders.py:799 #: pretix/control/views/organizer.py:348 msgid "This value will be replaced based on dynamic parameters." msgstr "سيتم استبدال هذه القيمة استنادا إلى معايير ديناميكية." @@ -9905,7 +9993,7 @@ msgstr "" "ضريبة القيمة المضافة في بلدك قدمت نتيجة غير صحيحة. لذلك سنحتاج إلى فرض ضريبة " "القيمة المضافة على فاتورتك. يرجى الاتصال بالدعم لحل هذا الأمر يدويا." -#: pretix/base/services/tickets.py:100 pretix/control/views/pdf.py:96 +#: pretix/base/services/tickets.py:100 pretix/control/views/pdf.py:98 msgid "Sample workshop" msgstr "نموذج ورشة عمل" @@ -9959,15 +10047,27 @@ msgstr "المكونات الإضافية: %s" msgid "The voucher has been sent to {recipient}." msgstr "تم إرسال كود الخصم إلى {recipient}." -#: pretix/base/settings.py:126 +#: pretix/base/settings.py:82 +msgid "Compute taxes for every line individually" +msgstr "" + +#: pretix/base/settings.py:83 +msgid "Compute taxes based on net total" +msgstr "" + +#: pretix/base/settings.py:84 +msgid "Compute taxes based on net total with stable gross prices" +msgstr "" + +#: pretix/base/settings.py:134 msgid "Allow usage of restricted plugins" msgstr "" -#: pretix/base/settings.py:159 +#: pretix/base/settings.py:167 msgid "Allow customers to create accounts" msgstr "السماح للعملاء بإنشاء حسابات" -#: pretix/base/settings.py:160 +#: pretix/base/settings.py:168 msgid "" "This will allow customers to sign up for an account on your ticket shop. " "This is a prerequisite for some advanced features like memberships." @@ -9975,83 +10075,85 @@ msgstr "" "سيسمح هذا الخيار للعملاء بالتسجيل للحصول على حساب في متجر التذاكر الخاص بك. " "هذا شرط أساسي لبعض الميزات المتقدمة مثل العضويات." -#: pretix/base/settings.py:170 +#: pretix/base/settings.py:178 #, fuzzy #| msgid "We have not found an account with this email address and password." msgid "Allow customers to log in with email address and password" msgstr "لم نعثر على حساب بعنوان البريد الإلكتروني وكلمة المرور هذه." -#: pretix/base/settings.py:171 +#: pretix/base/settings.py:179 msgid "" "If disabled, you will need to connect one or more single-sign-on providers." msgstr "" -#: pretix/base/settings.py:181 +#: pretix/base/settings.py:189 #, fuzzy #| msgid "Verified email address" msgid "Match orders based on email address" msgstr "ربط الطلبات بعنوان البريد الإلكتروني" -#: pretix/base/settings.py:182 +#: pretix/base/settings.py:190 msgid "" "This will allow registered customers to access orders made with the same " "email address, even if the customer was not logged in during the purchase." msgstr "" -#: pretix/base/settings.py:192 +#: pretix/base/settings.py:200 #, fuzzy #| msgid "Disable selected" msgid "Activate re-usable media" msgstr "تعطيل المختارة" -#: pretix/base/settings.py:193 +#: pretix/base/settings.py:201 msgid "" "The re-usable media feature allows you to connect tickets and gift cards " "with physical media such as wristbands or chip cards that may be re-used for " "different tickets or gift cards later." msgstr "" -#: pretix/base/settings.py:219 +#: pretix/base/settings.py:227 #, fuzzy #| msgid "Length of gift card codes" msgid "Length of barcodes" msgstr "طول رموز بطاقات الهدايا" -#: pretix/base/settings.py:248 +#: pretix/base/settings.py:256 msgid "" "Automatically create a new gift card if a previously unknown chip is seen" msgstr "" -#: pretix/base/settings.py:261 pretix/base/settings.py:292 +#: pretix/base/settings.py:269 pretix/base/settings.py:300 #, fuzzy #| msgid "Gift card code" msgid "Gift card currency" msgstr "رمز بطاقة الهدية" -#: pretix/base/settings.py:279 +#: pretix/base/settings.py:287 msgid "Automatically create a new gift card if a new chip is encoded" msgstr "" -#: pretix/base/settings.py:301 +#: pretix/base/settings.py:309 msgid "Use UID protection feature of NFC chip" msgstr "" -#: pretix/base/settings.py:317 +#: pretix/base/settings.py:325 msgid "Maximum number of items per order" msgstr "الحد الأقصى لعدد العناصر لكل طلب" -#: pretix/base/settings.py:318 +#: pretix/base/settings.py:326 msgid "Add-on products will not be counted." msgstr "لن يتم احتساب المنتجات الإضافية." -#: pretix/base/settings.py:327 -msgid "" -"Show net prices instead of gross prices in the product list (not " -"recommended!)" +#: pretix/base/settings.py:335 +#, fuzzy +#| msgid "" +#| "Show net prices instead of gross prices in the product list (not " +#| "recommended!)" +msgid "Show net prices instead of gross prices in the product list" msgstr "" "عرض صافي الأسعار بدلا من الأسعار الإجمالية في قائمة المنتجات (غير مستحسن!)" -#: pretix/base/settings.py:328 +#: pretix/base/settings.py:336 msgid "" "Independent of your choice, the cart will show gross prices as this is the " "price that needs to be paid." @@ -10059,11 +10161,11 @@ msgstr "" "بغض النظر عن اختيارك ، ستعرض عربة التسوق الأسعار الإجمالية لأن هذا هو السعر " "الذي يجب دفعه." -#: pretix/base/settings.py:339 +#: pretix/base/settings.py:347 msgid "Hide prices on attendee ticket page" msgstr "" -#: pretix/base/settings.py:340 +#: pretix/base/settings.py:348 msgid "" "If a person buys multiple tickets and you send emails to all of the " "attendees, with this option the ticket price will not be shown on the ticket " @@ -10071,29 +10173,29 @@ msgid "" "price." msgstr "" -#: pretix/base/settings.py:358 +#: pretix/base/settings.py:366 msgid "Ask for attendee names" msgstr "اسأل عن أسماء الحضور" -#: pretix/base/settings.py:359 +#: pretix/base/settings.py:367 #, fuzzy #| msgid "Ask for a name for all tickets which include admission to the event." msgid "Ask for a name for all personalized tickets." msgstr "اطلب اسما لجميع التذاكر التي تشمل الدخول إلى الفعالية." -#: pretix/base/settings.py:368 +#: pretix/base/settings.py:376 msgid "Require attendee names" msgstr "اطلب أسماء الحضور" -#: pretix/base/settings.py:369 +#: pretix/base/settings.py:377 msgid "Require customers to fill in the names of all attendees." msgstr "مطالبة العملاء بملء أسماء جميع الحضور." -#: pretix/base/settings.py:379 +#: pretix/base/settings.py:387 msgid "Ask for email addresses per ticket" msgstr "اسأل عن عناوين البريد الإلكتروني للتذكرة الواحدة" -#: pretix/base/settings.py:380 +#: pretix/base/settings.py:388 #, fuzzy #| msgid "" #| "Normally, pretix asks for one email address per order and the order " @@ -10122,11 +10224,11 @@ msgstr "" "البريد الإلكتروني الأساسي الوحيد ، ليس لعناوين كل حاضر. ومع ذلك ، يمكنك " "تمكين هذا في إعدادات البريد الإلكتروني." -#: pretix/base/settings.py:394 +#: pretix/base/settings.py:402 msgid "Require email addresses per ticket" msgstr "يتطلب عناوين البريد الإلكتروني لكل تذكرة" -#: pretix/base/settings.py:395 +#: pretix/base/settings.py:403 #, fuzzy #| msgid "" #| "Require customers to fill in individual email addresses for all admission " @@ -10141,117 +10243,130 @@ msgstr "" "انظر الخيار أعلاه لمزيد من التفاصيل. سيطلب عنوان بريد إلكتروني واحد لتأكيد " "الطلب دائما بغض النظر عن هذا الإعداد." -#: pretix/base/settings.py:407 +#: pretix/base/settings.py:415 msgid "Ask for company per ticket" msgstr "اسأل عن شركة لكل تذكرة" -#: pretix/base/settings.py:416 +#: pretix/base/settings.py:424 msgid "Require company per ticket" msgstr "مطلوب شركة لكل تذكرة" -#: pretix/base/settings.py:426 +#: pretix/base/settings.py:434 msgid "Ask for postal addresses per ticket" msgstr "اسأل عن العناوين البريدية لكل تذكرة" -#: pretix/base/settings.py:435 +#: pretix/base/settings.py:443 msgid "Require postal addresses per ticket" msgstr "يتطلب العناوين البريدية لكل تذكرة" -#: pretix/base/settings.py:445 +#: pretix/base/settings.py:453 msgid "Ask for the order email address twice" msgstr "اطلب عنوان البريد الإلكتروني مرتين للطلب" -#: pretix/base/settings.py:446 +#: pretix/base/settings.py:454 msgid "" "Require customers to fill in the primary email address twice to avoid errors." msgstr "" "اطلب من العملاء ملء عنوان البريد الإلكتروني الأساسي مرتين لتجنب الأخطاء." -#: pretix/base/settings.py:455 +#: pretix/base/settings.py:463 msgid "Ask for a phone number per order" msgstr "اطلب رقم هاتف لكل طلب" -#: pretix/base/settings.py:464 +#: pretix/base/settings.py:472 msgid "Require a phone number per order" msgstr "يتطلب رقم هاتف لكل طلب" -#: pretix/base/settings.py:474 +#: pretix/base/settings.py:482 +#, fuzzy +#| msgid "including all taxes" +msgid "Rounding of taxes" +msgstr "بما في ذلك جميع الضرائب" + +#: pretix/base/settings.py:486 +msgid "" +"Note that if you transfer your sales data from pretix to an external system " +"for tax reporting, you need to make sure to account for possible rounding " +"differences if your external system rounds differently than pretix." +msgstr "" + +#: pretix/base/settings.py:501 msgid "Ask for invoice address" msgstr "اطلب عنوان الفاتورة" -#: pretix/base/settings.py:483 +#: pretix/base/settings.py:510 msgid "Do not ask for invoice address if an order is free" msgstr "لا تسأل عن عنوان الفاتورة إذا كان الطلب مجانيا" -#: pretix/base/settings.py:492 +#: pretix/base/settings.py:519 msgid "Require customer name" msgstr "مطلوب اسم العميل" -#: pretix/base/settings.py:501 +#: pretix/base/settings.py:528 msgid "Show attendee names on invoices" msgstr "إظهار أسماء الحضور في الفواتير" -#: pretix/base/settings.py:510 +#: pretix/base/settings.py:537 #, fuzzy #| msgid "Show free products on invoices" msgid "Show event location on invoices" msgstr "عرض المنتجات المجانية على الفواتير" -#: pretix/base/settings.py:511 +#: pretix/base/settings.py:538 msgid "" "The event location will be shown below the list of products if it is the " "same for all lines. It will be shown on every line if there are different " "locations." msgstr "" -#: pretix/base/settings.py:521 +#: pretix/base/settings.py:548 #, fuzzy #| msgid "Show event end date" msgid "Show exchange rates" msgstr "إظهار تاريخ انتهاء الفعالية" -#: pretix/base/settings.py:524 pretix/base/settings.py:532 -#: pretix/control/forms/item.py:626 +#: pretix/base/settings.py:551 pretix/base/settings.py:559 +#: pretix/control/forms/item.py:629 msgid "Never" msgstr "أبدا" -#: pretix/base/settings.py:525 pretix/base/settings.py:533 +#: pretix/base/settings.py:552 pretix/base/settings.py:560 msgid "" "Based on European Central Bank daily rates, whenever the invoice recipient " "is in an EU country that uses a different currency." msgstr "" -#: pretix/base/settings.py:527 pretix/base/settings.py:535 +#: pretix/base/settings.py:554 pretix/base/settings.py:562 msgid "" "Based on Czech National Bank daily rates, whenever the invoice amount is not " "in CZK." msgstr "" -#: pretix/base/settings.py:545 +#: pretix/base/settings.py:572 msgid "Require invoice address" msgstr "مطلوب عنوان الفاتورة" -#: pretix/base/settings.py:555 +#: pretix/base/settings.py:582 #, fuzzy #| msgid "Require a business addresses" msgid "Require a business address" msgstr "مطلوب عناوين العمل" -#: pretix/base/settings.py:556 +#: pretix/base/settings.py:583 msgid "This will require users to enter a company name." msgstr "سيتطلب هذا من المستخدمين إدخال اسم الشركة." -#: pretix/base/settings.py:566 +#: pretix/base/settings.py:593 msgid "Ask for beneficiary" msgstr "اسأل عن المستفيد" -#: pretix/base/settings.py:576 +#: pretix/base/settings.py:603 #, fuzzy #| msgid "Custom address field" msgid "Custom recipient field label" msgstr "حقل العنوان المخصص" -#: pretix/base/settings.py:578 +#: pretix/base/settings.py:605 #, fuzzy #| msgid "" #| "If you want to add a custom text field, e.g. for a country-specific " @@ -10271,24 +10386,24 @@ msgstr "" "التصنيف لمطالبة المستخدم بإدخال التفاصيل الخاصة به وكذلك لعرض القيمة على " "الفاتورة. لن يكون الحقل مطلوبا." -#: pretix/base/settings.py:591 +#: pretix/base/settings.py:618 #, fuzzy #| msgid "Custom address field" msgid "Custom recipient field help text" msgstr "حقل العنوان المخصص" -#: pretix/base/settings.py:593 +#: pretix/base/settings.py:620 msgid "" "If you use the custom recipient field, you can specify a help text which " "will be displayed underneath the field. It will not be displayed on the " "invoice." msgstr "" -#: pretix/base/settings.py:603 +#: pretix/base/settings.py:630 msgid "Ask for VAT ID" msgstr "اطلب رقم ضريبة القيمة المضافة" -#: pretix/base/settings.py:605 +#: pretix/base/settings.py:632 #, python-brace-format msgid "" "Only works if an invoice address is asked for. VAT ID is never required and " @@ -10296,19 +10411,19 @@ msgid "" "{countries}" msgstr "" -#: pretix/base/settings.py:618 +#: pretix/base/settings.py:645 msgid "Invoice address explanation" msgstr "شرح عنوان الفاتورة" -#: pretix/base/settings.py:621 +#: pretix/base/settings.py:648 msgid "This text will be shown above the invoice address form during checkout." msgstr "سيظهر هذا النص في أعلى نموذج عنوان الفاتورة أثناء تسجيل الخروج." -#: pretix/base/settings.py:630 +#: pretix/base/settings.py:657 msgid "Show paid amount on partially paid invoices" msgstr "إظهار المبلغ المدفوع في الفواتير المدفوعة جزئيا" -#: pretix/base/settings.py:631 +#: pretix/base/settings.py:658 msgid "" "If an invoice has already been paid partially, this option will add the paid " "and pending amount to the invoice." @@ -10316,11 +10431,11 @@ msgstr "" "إذا تم دفع الفاتورة جزئيا مسبقا ، فسيضيف هذا الخيار المبلغ المدفوع والمتأخر " "إلى الفاتورة." -#: pretix/base/settings.py:641 +#: pretix/base/settings.py:668 msgid "Show free products on invoices" msgstr "عرض المنتجات المجانية على الفواتير" -#: pretix/base/settings.py:642 +#: pretix/base/settings.py:669 msgid "" "Note that invoices will never be generated for orders that contain only free " "products." @@ -10328,21 +10443,21 @@ msgstr "" "لاحظ أنه لن يتم إنشاء فواتير مطلقا للطلبات التي لا تحتوي إلا على منتجات " "مجانية." -#: pretix/base/settings.py:652 +#: pretix/base/settings.py:679 msgid "Show expiration date of order" msgstr "إظهار تاريخ إنتهاء صلاحية الطلب" -#: pretix/base/settings.py:653 +#: pretix/base/settings.py:680 msgid "" "The expiration date will not be shown if the invoice is generated after the " "order is paid." msgstr "لن يظهر تاريخ إنتهاء الصلاحية إذا تم إنشاء الفاتورة بعد سداد الطلب." -#: pretix/base/settings.py:663 +#: pretix/base/settings.py:690 msgid "Minimum length of invoice number after prefix" msgstr "الحد الأدنى لطول رقم الفاتورة بعد الاختصار" -#: pretix/base/settings.py:664 +#: pretix/base/settings.py:691 msgid "" "The part of your invoice number after your prefix will be filled up with " "leading zeros up to this length, e.g. INV-001 or INV-00001." @@ -10350,20 +10465,20 @@ msgstr "" "سيتم ملء الجزء من رقم الفاتورة بعد رمز الاختصار الخاص بك بالأصفار حتى هذا " "النحو ، على سبيل المثال فاتورة-001 أو فاتورة -00001." -#: pretix/base/settings.py:675 +#: pretix/base/settings.py:703 msgid "Generate invoices with consecutive numbers" msgstr "إنشاء فواتير بأرقام متتالية" -#: pretix/base/settings.py:676 +#: pretix/base/settings.py:704 msgid "If deactivated, the order code will be used in the invoice number." msgstr "" "إذا تم إلغاء تفعيل هذا الخيار ، فسيتم استخدام رمز الطلب في رقم الفاتورة." -#: pretix/base/settings.py:685 +#: pretix/base/settings.py:713 msgid "Invoice number prefix" msgstr "الرمز الذي يسبق رقم الفاتورة" -#: pretix/base/settings.py:686 +#: pretix/base/settings.py:714 msgid "" "This will be prepended to invoice numbers. If you leave this field empty, " "your event slug will be used followed by a dash. Attention: If multiple " @@ -10381,17 +10496,17 @@ msgstr "" "استخدام %Y (مع السنة) %y (بدون السنة) لإدخال سنة الفاتورة أو %m و %d ليوم من " "الشهر." -#: pretix/base/settings.py:698 pretix/base/settings.py:720 +#: pretix/base/settings.py:726 pretix/base/settings.py:749 #, fuzzy, python-brace-format #| msgid "Please enter a shorter name." msgid "Please only use the characters {allowed} in this field." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/settings.py:711 +#: pretix/base/settings.py:740 msgid "Invoice number prefix for cancellations" msgstr "رمز رقم الفاتورة للإلغاء" -#: pretix/base/settings.py:712 +#: pretix/base/settings.py:741 msgid "" "This will be prepended to invoice numbers of cancellations. If you leave " "this field empty, the same numbering scheme will be used that you configured " @@ -10400,44 +10515,44 @@ msgstr "" "سيتم إضافة هذا مسبقا إلى أرقام فواتير الإلغاءات. إذا تركت هذا الحقل فارغا ، " "فسيتم استخدام نفس نظام الترقيم الذي قمت بإعداده للفواتير العادية." -#: pretix/base/settings.py:733 +#: pretix/base/settings.py:763 msgid "Highlight order code to make it stand out visibly" msgstr "" -#: pretix/base/settings.py:734 pretix/base/settings.py:745 +#: pretix/base/settings.py:764 pretix/base/settings.py:775 #, fuzzy #| msgid "Only respected by modern browsers." msgid "Only respected by some invoice renderers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:744 pretix/base/settings.py:2988 +#: pretix/base/settings.py:774 pretix/base/settings.py:3042 #: pretix/control/templates/pretixcontrol/pdf/index.html:436 msgid "Font" msgstr "الخط" -#: pretix/base/settings.py:770 +#: pretix/base/settings.py:800 msgid "Length of ticket codes" msgstr "طول رموز التذاكر" -#: pretix/base/settings.py:797 +#: pretix/base/settings.py:827 msgid "Reservation period" msgstr "فترة الحجز" -#: pretix/base/settings.py:799 +#: pretix/base/settings.py:829 msgid "" "The number of minutes the items in a user's cart are reserved for this user." msgstr "عدد الدقائق المحجوزة للعناصر الموجودة في عربة التسوق لهذا المستخدم." -#: pretix/base/settings.py:808 +#: pretix/base/settings.py:838 msgid "" "Directly redirect to check-out after a product has been added to the cart." msgstr "إعادة التوجيه مباشرة لتسجيل الخروج بعد إضافة منتج إلى سلة التسوق." -#: pretix/base/settings.py:817 +#: pretix/base/settings.py:847 msgid "End of presale text" msgstr "نهاية النص الخاص بعرض ما قبل البيع" -#: pretix/base/settings.py:820 +#: pretix/base/settings.py:850 msgid "" "This text will be shown above the ticket shop once the designated sales " "timeframe for this event is over. You can use it to describe other options " @@ -10447,11 +10562,11 @@ msgstr "" "لهذه الفعالية. يمكنك استخدامه لوصف الخيارات الأخرى للحصول على تذكرة ، على " "سبيل المثال شباك التذاكر." -#: pretix/base/settings.py:834 +#: pretix/base/settings.py:864 msgid "Guidance text" msgstr "نص للتوجيه" -#: pretix/base/settings.py:835 +#: pretix/base/settings.py:865 msgid "" "This text will be shown above the payment options. You can explain the " "choices to the user here, if you want." @@ -10459,19 +10574,19 @@ msgstr "" "سيظهر هذا النص فوق خيارات الدفع. يمكنك شرح الاختيارات للمستخدم هنا ، إذا كنت " "تريد." -#: pretix/base/settings.py:846 pretix/base/settings.py:855 +#: pretix/base/settings.py:876 pretix/base/settings.py:885 msgid "in days" msgstr "بالأيام" -#: pretix/base/settings.py:847 pretix/base/settings.py:856 +#: pretix/base/settings.py:877 pretix/base/settings.py:886 msgid "in minutes" msgstr "بالدقائق" -#: pretix/base/settings.py:851 +#: pretix/base/settings.py:881 msgid "Set payment term" msgstr "تعيين مدة السداد" -#: pretix/base/settings.py:858 +#: pretix/base/settings.py:888 msgid "" "If using days, the order will expire at the end of the last day. Using " "minutes is more exact, but should only be used for real-time payment methods." @@ -10479,11 +10594,11 @@ msgstr "" "في حالة استخدام الأيام ، ستنتهي صلاحية الطلب في نهاية اليوم الأخير. يعد " "استخدام الدقائق أكثر دقة ، ولكن يجب استخدامه فقط لطرق الدفع الفوري." -#: pretix/base/settings.py:868 +#: pretix/base/settings.py:898 msgid "Payment term in days" msgstr "مدة السداد بالأيام" -#: pretix/base/settings.py:875 +#: pretix/base/settings.py:905 msgid "" "The number of days after placing an order the user has to pay to preserve " "their reservation. If you use slow payment methods like bank transfer, we " @@ -10495,11 +10610,11 @@ msgstr "" "نوصي ب 14 يوما. إذا كنت تستخدم طرق الدفع الفوري فقط ، فإننا نوصي بالاستمرار " "في تحديد يومين أو ثلاثة أيام للسماح للأشخاص بإعادة محاولة الدفع الفاشل." -#: pretix/base/settings.py:893 +#: pretix/base/settings.py:923 msgid "Only end payment terms on weekdays" msgstr "إنهاء مدة الدفع في أيام العمل الأسبوعية فقط" -#: pretix/base/settings.py:894 +#: pretix/base/settings.py:924 msgid "" "If this is activated and the payment term of any order ends on a Saturday or " "Sunday, it will be moved to the next Monday instead. This is required in " @@ -10510,11 +10625,11 @@ msgstr "" "نقله إلى يوم الاثنين التالي بدلا من ذلك. هذا مطلوب في بعض البلدان بموجب " "القانون المدني. لن يؤثر هذا على آخر تاريخ للمدفوعات التي تم إعدادها أدناه." -#: pretix/base/settings.py:910 +#: pretix/base/settings.py:940 msgid "Payment term in minutes" msgstr "مدة السداد بالدقائق" -#: pretix/base/settings.py:911 +#: pretix/base/settings.py:941 msgid "" "The number of minutes after placing an order the user has to pay to preserve " "their reservation. Only use this if you exclusively offer real-time payment " @@ -10526,11 +10641,11 @@ msgstr "" "أنه لأسباب فنية ، قد يكون الإطار الزمني الفعلي أطول ببضع دقائق قبل أن يتم " "وضع علامة على الطلب على أنه منتهي الصلاحية." -#: pretix/base/settings.py:934 +#: pretix/base/settings.py:964 msgid "Last date of payments" msgstr "آخر موعد للمدفوعات" -#: pretix/base/settings.py:935 +#: pretix/base/settings.py:965 msgid "" "The last date any payments are accepted. This has precedence over the terms " "configured above. If you use the event series feature and an order contains " @@ -10540,11 +10655,11 @@ msgstr "" "إعدادها أعلاه. إذا كنت تستخدم ميزة سلسلة الفعاليات وكان الطلب يحتوي على " "تذاكر لتواريخ متعددة ، فسيتم استخدام أقرب تاريخ." -#: pretix/base/settings.py:946 +#: pretix/base/settings.py:976 msgid "Automatically expire unpaid orders" msgstr "إنهاء الطلبات غير المسددة تلقائيا" -#: pretix/base/settings.py:947 +#: pretix/base/settings.py:977 msgid "" "If checked, all unpaid orders will automatically go from 'pending' to " "'expired' after the end of their payment deadline. This means that those " @@ -10554,13 +10669,13 @@ msgstr "" "إلى \"منتهية الصلاحية\" بعد إنتهاء الموعد النهائي للدفع. هذا يعني أن هذه " "التذاكر تعود إلى الموقع ويمكن لأشخاص آخرين طلبها." -#: pretix/base/settings.py:958 +#: pretix/base/settings.py:988 #, fuzzy #| msgid "Expiration date" msgid "Expiration delay" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/settings.py:959 +#: pretix/base/settings.py:989 msgid "" "The order will only actually expire this many days after the expiration date " "communicated to the customer. If you select \"Only end payment terms on " @@ -10569,11 +10684,11 @@ msgid "" "enforced." msgstr "" -#: pretix/base/settings.py:980 +#: pretix/base/settings.py:1010 msgid "Hide \"payment pending\" state on customer-facing pages" msgstr "إخفاء حالة \"الدفع المعلق\" من الصفحات التي تظهر للعملاء" -#: pretix/base/settings.py:981 +#: pretix/base/settings.py:1011 msgid "" "The payment instructions panel will still be shown to the primary customer, " "but no indication of missing payment will be visible on the ticket pages of " @@ -10582,7 +10697,7 @@ msgstr "" "ستظل لوحة تعليمات الدفع معروضة للعميل الأساسي ، ولكن لن تظهر أي إشارة لفقدان " "السداد على صفحات تذاكر الحاضرين الذين لم يشتروا التذكرة بأنفسهم." -#: pretix/base/settings.py:997 +#: pretix/base/settings.py:1027 msgid "" "If you have a gift card, please enter the gift card code here. If the gift " "card does not have enough credit to pay for the full order, you will be " @@ -10593,11 +10708,11 @@ msgstr "" "هديةرصيد كاف لدفع للنظام كامل، وسوف يعرض لك هذه الصفحة مرة أخرى ويمكنك " "إمااستبدال بطاقة هدية أخرى أو تحديد طريقة دفع مختلفة للفرق." -#: pretix/base/settings.py:1013 +#: pretix/base/settings.py:1043 msgid "Accept late payments" msgstr "قبول المدفوعات المتأخرة" -#: pretix/base/settings.py:1014 +#: pretix/base/settings.py:1044 msgid "" "Accept payments for orders even when they are in 'expired' state as long as " "enough capacity is available. No payments will ever be accepted after the " @@ -10607,124 +10722,124 @@ msgstr "" "متوفرة. لن يتم قبول أي مدفوعات بعد \"آخر تاريخ للدفعات\" والذي تم إعداده " "أعلاه." -#: pretix/base/settings.py:1025 +#: pretix/base/settings.py:1055 msgid "Show start date" msgstr "عرض تاريخ البداية" -#: pretix/base/settings.py:1026 +#: pretix/base/settings.py:1056 msgid "Show the presale start date before presale has started." msgstr "اعرض تاريخ بداية البيع المسبق قبل أن بدايته." -#: pretix/base/settings.py:1037 pretix/base/settings.py:1045 -#: pretix/base/settings.py:1059 pretix/base/settings.py:1068 +#: pretix/base/settings.py:1067 pretix/base/settings.py:1075 +#: pretix/base/settings.py:1089 pretix/base/settings.py:1098 #, fuzzy #| msgid "Default price" msgid "Use default tax rate" msgstr "السعر الافتراضي" -#: pretix/base/settings.py:1038 pretix/base/settings.py:1046 -#: pretix/base/settings.py:1057 pretix/base/settings.py:1066 +#: pretix/base/settings.py:1068 pretix/base/settings.py:1076 +#: pretix/base/settings.py:1087 pretix/base/settings.py:1096 #, fuzzy msgid "Charge no taxes" msgstr "تم تحديث الرسوم." -#: pretix/base/settings.py:1042 +#: pretix/base/settings.py:1072 #, fuzzy #| msgid "Tax rule for payment fees" msgid "Tax handling on payment fees" msgstr "حكم الضرائب لدفع الرسوم" -#: pretix/base/settings.py:1058 pretix/base/settings.py:1067 +#: pretix/base/settings.py:1088 pretix/base/settings.py:1097 msgid "Use same taxes as order positions (split according to net prices)" msgstr "" -#: pretix/base/settings.py:1063 +#: pretix/base/settings.py:1093 #, fuzzy #| msgid "Keep a fixed cancellation fee" msgid "Tax handling on cancellation fees" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1079 pretix/base/settings.py:1091 +#: pretix/base/settings.py:1109 pretix/base/settings.py:1121 msgid "Do not generate invoices" msgstr "لا تصدر فواتير" -#: pretix/base/settings.py:1080 pretix/base/settings.py:1096 +#: pretix/base/settings.py:1110 pretix/base/settings.py:1126 msgid "Only manually in admin panel" msgstr "فقط يدويا في لوحة الإدارة" -#: pretix/base/settings.py:1081 pretix/base/settings.py:1094 +#: pretix/base/settings.py:1111 pretix/base/settings.py:1124 msgid "Automatically on user request" msgstr "تلقائيا بناء على طلب المستخدم" -#: pretix/base/settings.py:1082 pretix/base/settings.py:1095 +#: pretix/base/settings.py:1112 pretix/base/settings.py:1125 #, fuzzy #| msgid "Automatically on user request" msgid "Automatically on user request for paid orders" msgstr "تلقائيا بناء على طلب المستخدم" -#: pretix/base/settings.py:1083 +#: pretix/base/settings.py:1113 msgid "Automatically for all created orders" msgstr "تلقائيا لجميع الطلبات التي تم إنشاؤها" -#: pretix/base/settings.py:1084 +#: pretix/base/settings.py:1114 msgid "Automatically on payment or when required by payment method" msgstr "تلقائيا عند الدفع أو عند الطلب بواسطة طريقة السداد" -#: pretix/base/settings.py:1088 +#: pretix/base/settings.py:1118 msgid "Generate invoices" msgstr "إنشاء الفواتير" -#: pretix/base/settings.py:1092 +#: pretix/base/settings.py:1122 #, fuzzy #| msgid "Automatically on payment or when required by payment method" msgid "Automatically after payment or when required by payment method" msgstr "تلقائيا عند الدفع أو عند الطلب بواسطة طريقة السداد" -#: pretix/base/settings.py:1093 +#: pretix/base/settings.py:1123 #, fuzzy #| msgid "Automatically for all created orders" msgid "Automatically before payment for all created orders" msgstr "تلقائيا لجميع الطلبات التي تم إنشاؤها" -#: pretix/base/settings.py:1098 +#: pretix/base/settings.py:1128 msgid "Invoices will never be automatically generated for free orders." msgstr "لن يتم إنشاء الفواتير تلقائيا للطلبات المجانية." -#: pretix/base/settings.py:1108 pretix/base/settings.py:1119 +#: pretix/base/settings.py:1138 pretix/base/settings.py:1149 msgid "" "Automatic based on ticket-specific validity, membership validity, event " "series date, or event date" msgstr "" -#: pretix/base/settings.py:1109 pretix/base/settings.py:1120 +#: pretix/base/settings.py:1139 pretix/base/settings.py:1150 msgid "Automatic, but prefer invoice date over event date" msgstr "" -#: pretix/base/settings.py:1112 pretix/base/settings.py:1123 +#: pretix/base/settings.py:1142 pretix/base/settings.py:1153 #, fuzzy #| msgctxt "invoice" #| msgid "Invoice date" msgid "Invoice date" msgstr "تاريخ الفاتورة" -#: pretix/base/settings.py:1116 +#: pretix/base/settings.py:1146 #, fuzzy #| msgctxt "subevent" #| msgid "Date ordering" msgid "Date of service" msgstr "ترتيب التاريخ" -#: pretix/base/settings.py:1125 +#: pretix/base/settings.py:1155 msgid "" "This controls what dates are shown on the invoice, but is especially " "important for electronic invoicing." msgstr "" -#: pretix/base/settings.py:1136 +#: pretix/base/settings.py:1166 msgid "Automatically cancel and reissue invoice on address changes" msgstr "إلغاء الفاتورة تلقائيا عند تغيير العنوان وإعادة إصدارها" -#: pretix/base/settings.py:1137 +#: pretix/base/settings.py:1167 msgid "" "If customers change their invoice address on an existing order, the invoice " "will automatically be canceled and a new invoice will be issued. This " @@ -10734,50 +10849,50 @@ msgstr "" "الفاتورة تلقائيا وسيتم إصدار فاتورة جديدة. لن يؤثر هذا الإعداد على التعديلات " "في لوحة التحكم." -#: pretix/base/settings.py:1148 +#: pretix/base/settings.py:1178 msgid "Allow to update existing invoices" msgstr "" -#: pretix/base/settings.py:1149 +#: pretix/base/settings.py:1179 msgid "" "By default, invoices can never again be changed once they are issued. In " "most countries, we recommend to leave this option turned off and always " "issue a new invoice if a change needs to be made." msgstr "" -#: pretix/base/settings.py:1164 +#: pretix/base/settings.py:1194 msgid "Address line" msgstr "العنوان" -#: pretix/base/settings.py:1168 +#: pretix/base/settings.py:1198 msgid "Albert Einstein Road 52" msgstr "شارع ألبرت أينشتاين 52" -#: pretix/base/settings.py:1220 +#: pretix/base/settings.py:1272 msgid "Domestic tax ID" msgstr "معرف الضريبة المحلية" -#: pretix/base/settings.py:1221 +#: pretix/base/settings.py:1273 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "على سبيل المثال الرقم الضريبي في ألمانيا ، رقم العمل الأسترالي،…" -#: pretix/base/settings.py:1230 +#: pretix/base/settings.py:1283 msgid "EU VAT ID" msgstr "رقم ضريبة القيمة المضافة في الاتحاد الأوروبي" -#: pretix/base/settings.py:1243 +#: pretix/base/settings.py:1297 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "على سبيل المثال باستخدام هذا المستند ، أرسلنا إليك فاتورة طلب تذكرتك." -#: pretix/base/settings.py:1246 +#: pretix/base/settings.py:1300 msgid "Introductory text" msgstr "نص تمهيدي" -#: pretix/base/settings.py:1247 +#: pretix/base/settings.py:1301 msgid "Will be printed on every invoice above the invoice rows." msgstr "ستتم طباعتها على كل فاتورة فوق صفوف الفاتورة." -#: pretix/base/settings.py:1260 +#: pretix/base/settings.py:1314 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." @@ -10785,15 +10900,15 @@ msgstr "" "مثلا شكرا لك على الشراء! يمكنك العثور على مزيد من المعلومات حول هذه الفعالية " "في ..." -#: pretix/base/settings.py:1263 +#: pretix/base/settings.py:1317 msgid "Additional text" msgstr "نص إضافي" -#: pretix/base/settings.py:1264 +#: pretix/base/settings.py:1318 msgid "Will be printed on every invoice below the invoice total." msgstr "ستتم الطباعة على كل فاتورة تحت إجمالي الفاتورة." -#: pretix/base/settings.py:1277 +#: pretix/base/settings.py:1331 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." @@ -10801,21 +10916,21 @@ msgstr "" "مثلا تفاصيل حسابك المصرفي، التفاصيل القانونية مثل معرف ضريبة القيمة المضافة، " "أرقام التسجيل، الخ." -#: pretix/base/settings.py:1280 +#: pretix/base/settings.py:1334 msgid "Footer" msgstr "تذييل" -#: pretix/base/settings.py:1281 +#: pretix/base/settings.py:1335 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "ستتم طباعتها في المنتصف وبخط أصغر في نهاية كل صفحة فاتورة." -#: pretix/base/settings.py:1294 +#: pretix/base/settings.py:1348 msgid "Attach invoices to emails" msgstr "إرفق الفواتير في رسائل البريد الإلكتروني" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1349 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -10826,11 +10941,11 @@ msgstr "" "الطلب. إذا تم إنشاؤها تلقائيا عند الدفع ، فسيتم إرفاقها ببريد تأكيد الدفع. " "إذا لم يتم إنشاؤها تلقائيا ، فلن يتم إرفاقها برسائل البريد الإلكتروني." -#: pretix/base/settings.py:1307 +#: pretix/base/settings.py:1361 msgid "Email address to receive a copy of each invoice" msgstr "عنوان البريد الإلكتروني لتلقي نسخة من كل فاتورة" -#: pretix/base/settings.py:1308 +#: pretix/base/settings.py:1362 msgid "" "Each newly created invoice will be sent to this email address shortly after " "creation. You can use this for an automated import of invoices to your " @@ -10840,28 +10955,28 @@ msgstr "" "وقت قصير من إنشائها. يمكنك استخدام هذا للاستيراد الآلي للفواتير إلى نظام " "المحاسبة الخاص بك. ستكون الفاتورة هي المرفق الوحيد بالبريد الإلكتروني." -#: pretix/base/settings.py:1323 +#: pretix/base/settings.py:1377 msgid "Show items outside presale period" msgstr "إظهار العناصر خارج فترة عرض ما قبل البيع" -#: pretix/base/settings.py:1324 +#: pretix/base/settings.py:1378 msgid "" "Show item details before presale has started and after presale has ended" msgstr "إظهار تفاصيل العنصر قبل بداية البيع المسبق وبعد انتهائه" -#: pretix/base/settings.py:1344 +#: pretix/base/settings.py:1398 msgid "Available languages" msgstr "اللغات المتاحة" -#: pretix/base/settings.py:1360 pretix/control/forms/event.py:139 +#: pretix/base/settings.py:1414 pretix/control/forms/event.py:139 msgid "Default language" msgstr "اللغة الافتراضية" -#: pretix/base/settings.py:1370 +#: pretix/base/settings.py:1424 msgid "Region" msgstr "منطقة" -#: pretix/base/settings.py:1371 +#: pretix/base/settings.py:1425 msgid "" "Will be used to determine date and time formatting as well as default " "country for customer addresses and phone numbers. For formatting, this takes " @@ -10873,13 +10988,13 @@ msgstr "" "من اللغة وبالتالي فهو مناسب في الغالب للغات المستخدمة في مناطق مختلفة على " "مستوى العالم (مثل اللغة الإنجليزية)." -#: pretix/base/settings.py:1383 +#: pretix/base/settings.py:1437 #, fuzzy #| msgid "This is not an event series." msgid "This shop represents an event" msgstr "هذه ليست سلسلة فعالية." -#: pretix/base/settings.py:1385 +#: pretix/base/settings.py:1439 msgid "" "Uncheck this box if you are only selling something that has no specific " "date, such as gift cards or a ticket that can be used any time. The system " @@ -10888,19 +11003,19 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1398 +#: pretix/base/settings.py:1452 msgid "Show event end date" msgstr "إظهار تاريخ انتهاء الفعالية" -#: pretix/base/settings.py:1399 +#: pretix/base/settings.py:1453 msgid "If disabled, only event's start date will be displayed to the public." msgstr "إذا تم تعطيل هذا الخيار، فسيظهر للجمهور تاريخ بداية الفعالية فقط." -#: pretix/base/settings.py:1408 +#: pretix/base/settings.py:1462 msgid "Show dates with time" msgstr "عرض التواريخ مع الوقت" -#: pretix/base/settings.py:1409 +#: pretix/base/settings.py:1463 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." @@ -10908,27 +11023,27 @@ msgstr "" "إذا تم تعطيل هذا الخيار ، فسيتم عرض تاريخ بداية الفعالية وانتهائها بدون " "توقيت اليوم." -#: pretix/base/settings.py:1418 +#: pretix/base/settings.py:1472 msgid "Hide all products that are sold out" msgstr "إخفاء جميع المنتجات التي تم بيعها" -#: pretix/base/settings.py:1428 pretix/control/forms/event.py:1692 +#: pretix/base/settings.py:1482 pretix/control/forms/event.py:1794 msgid "Publicly show how many tickets of a certain type are still available." msgstr "اعرض علنا عدد التذاكر من نوع معين والتي لا تزال متاحة." -#: pretix/base/settings.py:1437 +#: pretix/base/settings.py:1491 msgid "Ask search engines not to index the ticket shop" msgstr "اطلب من محركات البحث عدم فهرسة متجر التذاكر" -#: pretix/base/settings.py:1446 +#: pretix/base/settings.py:1500 msgid "Show variations of a product expanded by default" msgstr "إظهار الأشكال المختلفة للمنتج موسعة بشكل افتراضي" -#: pretix/base/settings.py:1455 +#: pretix/base/settings.py:1509 msgid "Enable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1456 pretix/control/forms/event.py:1697 +#: pretix/base/settings.py:1510 pretix/control/forms/event.py:1799 #, fuzzy msgid "" "Once a ticket is sold out, people can add themselves to a waiting list. As " @@ -10940,11 +11055,11 @@ msgstr "" "تصبح التذكرة متاحة مرة أخرى ، سيتم حجزها لأول شخص في قائمة الانتظار وسيتلقى " "هذا الشخص إشعارا بالبريد الإلكتروني مع قسيمة يمكن استخدامها لشراء تذكرة." -#: pretix/base/settings.py:1467 +#: pretix/base/settings.py:1521 msgid "Automatic waiting list assignments" msgstr "مهام قائمة الانتظار التلقائية" -#: pretix/base/settings.py:1468 +#: pretix/base/settings.py:1522 #, fuzzy msgid "" "If ticket capacity becomes free, automatically create a voucher and send it " @@ -10958,11 +11073,11 @@ msgstr "" "البريد الإلكتروني تلقائيا ولكن يمكنك إرسالها يدويا عبر لوحة التحكم. إذا قمت " "بتعطيل قائمة الانتظار مع إبقاء هذا الخيار مفعلا ، فسيستمر إرسال التذاكر." -#: pretix/base/settings.py:1484 +#: pretix/base/settings.py:1538 msgid "Waiting list response time" msgstr "وقت استجابة قائمة الانتظار" -#: pretix/base/settings.py:1487 +#: pretix/base/settings.py:1541 #, fuzzy msgid "" "If a ticket voucher is sent to a person on the waiting list, it has to be " @@ -10973,13 +11088,13 @@ msgstr "" "خلال هذا العدد من الساعات حتى تنتهي صلاحيتها ويمكن إعادة تخصيصها إلى الشخص " "التالي في القائمة." -#: pretix/base/settings.py:1498 +#: pretix/base/settings.py:1552 #, fuzzy #| msgid "Enable waiting list" msgid "Disable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1499 +#: pretix/base/settings.py:1553 msgid "" "The waiting list will be fully disabled after this date. This means that " "nobody can add themselves to the waiting list any more, but also that " @@ -10988,56 +11103,56 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1511 +#: pretix/base/settings.py:1565 msgid "Ask for a name" msgstr "اطلب الاسم" -#: pretix/base/settings.py:1512 +#: pretix/base/settings.py:1566 msgid "Ask for a name when signing up to the waiting list." msgstr "اطلب اسما عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1521 +#: pretix/base/settings.py:1575 msgid "Require name" msgstr "اطلب اسم" -#: pretix/base/settings.py:1522 +#: pretix/base/settings.py:1576 msgid "Require a name when signing up to the waiting list.." msgstr "طلب اسم عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1532 +#: pretix/base/settings.py:1586 msgid "Ask for a phone number" msgstr "اطلب رقم هاتف" -#: pretix/base/settings.py:1533 +#: pretix/base/settings.py:1587 msgid "Ask for a phone number when signing up to the waiting list." msgstr "اطلب رقم هاتف عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1542 +#: pretix/base/settings.py:1596 msgid "Require phone number" msgstr "يلزم رقم الهاتف" -#: pretix/base/settings.py:1543 +#: pretix/base/settings.py:1597 msgid "Require a phone number when signing up to the waiting list.." msgstr "طلب رقم هاتف عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1553 +#: pretix/base/settings.py:1607 msgid "Phone number explanation" msgstr "تفسير رقم الهاتف" -#: pretix/base/settings.py:1556 +#: pretix/base/settings.py:1610 msgid "" "If you ask for a phone number, explain why you do so and what you will use " "the phone number for." msgstr "" "إذا طلبت رقم هاتف ، اشرح سبب قيامك بذلك وما الذي ستستخدم رقم الهاتف لأجله." -#: pretix/base/settings.py:1568 +#: pretix/base/settings.py:1622 #, fuzzy #| msgid "Maximum number of items per order" msgid "Maximum number of entries per email address for the same product" msgstr "الحد الأقصى لعدد العناصر لكل طلب" -#: pretix/base/settings.py:1572 +#: pretix/base/settings.py:1626 msgid "" "With an increased limit, a customer may request more than one ticket for a " "specific product using the same, unique email address. However, regardless " @@ -11046,13 +11161,13 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1584 +#: pretix/base/settings.py:1638 #, fuzzy #| msgid "Show number of tickets left" msgid "Show number of check-ins to customer" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/settings.py:1585 +#: pretix/base/settings.py:1639 msgid "" "With this option enabled, your customers will be able to see how many times " "they entered the event. This is usually not necessary, but might be useful " @@ -11062,19 +11177,19 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1598 +#: pretix/base/settings.py:1652 msgid "Allow users to download tickets" msgstr "السماح للمستخدمين بتحميل التذاكر" -#: pretix/base/settings.py:1599 +#: pretix/base/settings.py:1653 msgid "If this is off, nobody can download a ticket." msgstr "إذا تم تعطيل هذا الخيار، فلا يمكن لأي شخص تنزيل تذكرة." -#: pretix/base/settings.py:1608 +#: pretix/base/settings.py:1662 msgid "Download date" msgstr "تاريخ التنزيل" -#: pretix/base/settings.py:1609 +#: pretix/base/settings.py:1663 msgid "" "Ticket download will be offered after this date. If you use the event series " "feature and an order contains tickets for multiple event dates, download of " @@ -11084,13 +11199,13 @@ msgstr "" "الفعاليات وكان الطلب يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيكون تنزيل " "جميع التذاكر متاحا إذا سمح بذلك أحد تواريخ الفعالية على الأقل." -#: pretix/base/settings.py:1620 +#: pretix/base/settings.py:1674 #, fuzzy #| msgid "Generate tickets for add-on products" msgid "Generate tickets for add-on products and bundled products" msgstr "إنشاء تذاكر للمنتجات الإضافية" -#: pretix/base/settings.py:1621 +#: pretix/base/settings.py:1675 #, fuzzy #| msgid "" #| "By default, tickets are only issued for products selected individually, " @@ -11105,11 +11220,11 @@ msgstr "" "للمنتجات الإضافية. باستخدام هذا الخيار ، يتم إصدار تذكرة منفصلة لكل منتج " "إضافي أيضا." -#: pretix/base/settings.py:1634 +#: pretix/base/settings.py:1688 msgid "Generate tickets for all products" msgstr "إنشاء تذاكر لجميع المنتجات" -#: pretix/base/settings.py:1635 +#: pretix/base/settings.py:1689 msgid "" "If turned off, tickets are only issued for products that are marked as an " "\"admission ticket\"in the product settings. You can also turn off ticket " @@ -11119,11 +11234,11 @@ msgstr "" "\"بطاقة دخول\" عليها في إعدادات المنتج. يمكنك أيضا إيقاف تشغيل إصدار التذاكر " "لكل منتج على حدة." -#: pretix/base/settings.py:1647 +#: pretix/base/settings.py:1701 msgid "Generate tickets for pending orders" msgstr "إصدار تذاكر للطلبات المعلقة" -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1702 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." @@ -11131,11 +11246,11 @@ msgstr "" "إذا تم إيقاف تشغيل هذا الخيار، فلن يكون تنزيل التذاكر ممكنا إلا بعد وضع " "علامة على الطلب على أنه مدفوع." -#: pretix/base/settings.py:1659 +#: pretix/base/settings.py:1713 msgid "Do not issue ticket before email address is validated" msgstr "لا تصدر تذكرة قبل التحقق من صحة عنوان البريد الإلكتروني" -#: pretix/base/settings.py:1660 +#: pretix/base/settings.py:1714 msgid "" "If turned on, tickets will not be offered for download directly after " "purchase. They will be attached to the payment confirmation email (if the " @@ -11148,13 +11263,13 @@ msgstr "" "جدا)، وسيتمكن العميل من تنزيلها من الصفحة بمجرد النقر على الرابط في البريد " "الإلكتروني. لا يؤثر على الطلبات المنفذة من خلال قنوات البيع الأخرى." -#: pretix/base/settings.py:1676 +#: pretix/base/settings.py:1730 #, fuzzy #| msgid "Quota availabilities" msgid "Low availability threshold" msgstr "توافر الحصة" -#: pretix/base/settings.py:1677 +#: pretix/base/settings.py:1731 msgid "" "If the availability of tickets falls below this percentage, the event (or a " "date, if it is an event series) will be highlighted to have low availability " @@ -11162,11 +11277,11 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1691 +#: pretix/base/settings.py:1745 msgid "Show availability in event overviews" msgstr "إظهار التوفر في \"نبذة عن الفعالية\"" -#: pretix/base/settings.py:1692 +#: pretix/base/settings.py:1746 msgid "" "If checked, the list of events will show if events are sold out. This might " "make for longer page loading times if you have lots of events and the shown " @@ -11176,24 +11291,24 @@ msgstr "" "يؤدي هذا إلى إطالة وقت تحميل الصفحات إذا كان لديك الكثير من الفعاليات وقد " "تكون الحالة المعروضة قديمة لمدة تصل إلى دقيقتين." -#: pretix/base/settings.py:1705 pretix/base/settings.py:1713 +#: pretix/base/settings.py:1759 pretix/base/settings.py:1767 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "قائمة" -#: pretix/base/settings.py:1706 pretix/base/settings.py:1714 +#: pretix/base/settings.py:1760 pretix/base/settings.py:1768 msgid "Week calendar" msgstr "تقويم الأسبوع" -#: pretix/base/settings.py:1707 pretix/base/settings.py:1715 +#: pretix/base/settings.py:1761 pretix/base/settings.py:1769 msgid "Month calendar" msgstr "تقويم الشهر" -#: pretix/base/settings.py:1711 +#: pretix/base/settings.py:1765 msgid "Default overview style" msgstr "نمط النظرة العامة الافتراضي" -#: pretix/base/settings.py:1717 +#: pretix/base/settings.py:1771 msgid "" "If your event series has more than 50 dates in the future, only the month or " "week calendar can be used." @@ -11201,13 +11316,13 @@ msgstr "" "إذا كانت سلسلة الفعاليات الخاصة بك تحتوي على أكثر من 50 تاريخا في المستقبل ، " "فيمكن استخدام تقويم الشهر أو الأسبوع فقط." -#: pretix/base/settings.py:1726 +#: pretix/base/settings.py:1780 #, fuzzy #| msgid "Hide all unavailable dates from calendar or list views" msgid "Show filter options for calendar or list view" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1727 +#: pretix/base/settings.py:1781 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "" @@ -11215,57 +11330,57 @@ msgid "" "settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1790 msgid "Hide all unavailable dates from calendar or list views" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1737 pretix/base/settings.py:1748 +#: pretix/base/settings.py:1791 pretix/base/settings.py:1802 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1747 +#: pretix/base/settings.py:1801 #, fuzzy #| msgid "Hide all unavailable dates from calendar or list views" msgid "Hide all past dates from calendar" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1759 pretix/base/settings.py:1768 +#: pretix/base/settings.py:1813 pretix/base/settings.py:1822 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1760 pretix/base/settings.py:1769 +#: pretix/base/settings.py:1814 pretix/base/settings.py:1823 #, fuzzy #| msgid "Only pending or paid orders can be changed." msgid "Only the person who ordered can make changes" msgstr "يمكن فقط تغيير الطلبات المعلقة أو المدفوعة." -#: pretix/base/settings.py:1761 pretix/base/settings.py:1770 +#: pretix/base/settings.py:1815 pretix/base/settings.py:1824 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1765 +#: pretix/base/settings.py:1819 #, fuzzy #| msgid "Allow customers to modify their information after they checked in." msgid "Allow customers to modify their information" msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1780 +#: pretix/base/settings.py:1834 msgid "Allow customers to modify their information after they checked in." msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1781 +#: pretix/base/settings.py:1835 msgid "" "By default, no more modifications are possible for an order as soon as one " "of the tickets in the order has been checked in." msgstr "" -#: pretix/base/settings.py:1791 +#: pretix/base/settings.py:1845 msgid "Last date of modifications" msgstr "آخر موعد لإجراء التعديلات" -#: pretix/base/settings.py:1792 +#: pretix/base/settings.py:1846 msgid "" "The last date users can modify details of their orders, such as attendee " "names or answers to questions. If you use the event series feature and an " @@ -11276,58 +11391,58 @@ msgstr "" "الحضور أو إجابات الأسئلة. إذا كنت تستخدم ميزة سلسلة الفعاليات وكان الطلب " "يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيتم استخدام أقرب تاريخ." -#: pretix/base/settings.py:1803 +#: pretix/base/settings.py:1857 msgid "Customers can change the variation of the products they purchased" msgstr "يمكن للعملاء تغيير تنوع المنتجات التي قاموا بشرائها" -#: pretix/base/settings.py:1812 +#: pretix/base/settings.py:1866 #, fuzzy #| msgid "Customers can cancel their paid orders" msgid "Customers can change their selected add-on products" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:1822 pretix/base/settings.py:1833 +#: pretix/base/settings.py:1876 pretix/base/settings.py:1887 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى أو يساوي السعر السابق." -#: pretix/base/settings.py:1823 pretix/base/settings.py:1834 +#: pretix/base/settings.py:1877 pretix/base/settings.py:1888 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1824 pretix/base/settings.py:1835 +#: pretix/base/settings.py:1878 pretix/base/settings.py:1889 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1825 pretix/base/settings.py:1836 +#: pretix/base/settings.py:1879 pretix/base/settings.py:1890 msgid "" "Allow changes regardless of price, as long as no refund is required (i.e. " "the resulting price is not lower than what has already been paid)." msgstr "" -#: pretix/base/settings.py:1827 pretix/base/settings.py:1838 +#: pretix/base/settings.py:1881 pretix/base/settings.py:1892 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" "السماح بالتغييرات بغض النظر عن السعر ، حتى لو أدى ذلك إلى استرداد الأموال." -#: pretix/base/settings.py:1831 +#: pretix/base/settings.py:1885 msgid "Requirement for changed prices" msgstr "شرط تغيير الأسعار" -#: pretix/base/settings.py:1849 +#: pretix/base/settings.py:1903 msgid "Do not allow changes after" msgstr "لا تسمح بالتغييرات بعد" -#: pretix/base/settings.py:1858 +#: pretix/base/settings.py:1912 #, fuzzy #| msgid "The payment for this invoice has already been received." msgid "Allow change even though the ticket has already been checked in" msgstr "تم إستلام قيمة هذه الفاتورة مسبقا." -#: pretix/base/settings.py:1859 +#: pretix/base/settings.py:1913 msgid "" "By default, order changes are disabled after any ticket in the order has " "been checked in. If you check this box, this requirement is lifted. It is " @@ -11336,11 +11451,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:1871 +#: pretix/base/settings.py:1925 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:1872 +#: pretix/base/settings.py:1926 msgid "" "By default, only the person who ordered the tickets can make any changes. If " "you check this box, individual attendees can also make changes. However, " @@ -11349,45 +11464,45 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:1884 +#: pretix/base/settings.py:1938 msgid "Customers can cancel their unpaid orders" msgstr "يمكن للعملاء إلغاء طلباتهم غير المدفوعة" -#: pretix/base/settings.py:1896 +#: pretix/base/settings.py:1950 #, fuzzy #| msgid "Keep a fixed cancellation fee" msgid "Charge a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1897 pretix/base/settings.py:1908 -#: pretix/base/settings.py:1922 +#: pretix/base/settings.py:1951 pretix/base/settings.py:1962 +#: pretix/base/settings.py:1976 msgid "" "Only affects orders pending payments, a cancellation fee for free orders is " "never charged. Note that it will be your responsibility to claim the " "cancellation fee from the user." msgstr "" -#: pretix/base/settings.py:1907 +#: pretix/base/settings.py:1961 #, fuzzy #| msgid "Keep payment, shipping and service fees" msgid "Charge payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:1921 +#: pretix/base/settings.py:1975 #, fuzzy #| msgid "Keep a percentual cancellation fee" msgid "Charge a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:1932 pretix/base/settings.py:2071 +#: pretix/base/settings.py:1986 pretix/base/settings.py:2125 msgid "Do not allow cancellations after" msgstr "لا تسمح بالإلغاء بعد" -#: pretix/base/settings.py:1941 +#: pretix/base/settings.py:1995 msgid "Customers can cancel their paid orders" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:1942 +#: pretix/base/settings.py:1996 msgid "" "Paid money will be automatically paid back if the payment method allows it. " "Otherwise, a manual refund will be created for you to process manually." @@ -11395,29 +11510,29 @@ msgstr "" "سيتم رد الأموال المدفوعة تلقائيا إذا كانت طريقة الدفع تسمح بذلك. وبخلاف " "ذلك ، سيتم إنشاء استرداد يدوي لتتم معالجته يدويا." -#: pretix/base/settings.py:1955 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:2009 pretix/control/forms/orders.py:909 msgid "Keep a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1964 +#: pretix/base/settings.py:2018 msgid "Keep payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:1976 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:2030 pretix/control/forms/orders.py:920 msgid "Keep a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:1985 +#: pretix/base/settings.py:2039 msgid "Allow customers to voluntarily choose a lower refund" msgstr "السماح للعملاء طواعية باختيار استرداد أقل" -#: pretix/base/settings.py:1986 +#: pretix/base/settings.py:2040 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "مع تمكين هذا الخيار ، يمكن لعملائك اختيار استرداد مبلغ أصغر لدعمك." -#: pretix/base/settings.py:1991 +#: pretix/base/settings.py:2045 msgid "" "However, if you want us to help keep the lights on here, please consider " "using the slider below to request a smaller refund. Thank you!" @@ -11425,12 +11540,12 @@ msgstr "" "إذا كنت تريد منا المساعدة في استمرار النشاط، فيرجى استخدام شريط التمرير " "أدناه لطلب استرداد مبلغ أقل. شكرا لك!" -#: pretix/base/settings.py:1998 +#: pretix/base/settings.py:2052 #, fuzzy msgid "Voluntary lower refund explanation" msgstr "تبرير تخفيض المبلغ الطوعي" -#: pretix/base/settings.py:2001 +#: pretix/base/settings.py:2055 msgid "" "This text will be shown in between the explanation of how the refunds work " "and the slider which your customers can use to choose the amount they would " @@ -11441,11 +11556,11 @@ msgstr "" "الذي يمكن لعملائك استخدامه لاختيار المبلغ الذي يرغبون في استلامه. يمكنك " "استخدامه على سبيل المثال لشرح اختيار استرداد أقل مما سيساعد مؤسستك." -#: pretix/base/settings.py:2016 +#: pretix/base/settings.py:2070 msgid "Step size for reduction amount" msgstr "حجم مبلغ التخفيض" -#: pretix/base/settings.py:2017 +#: pretix/base/settings.py:2071 msgid "" "By default, customers can choose an arbitrary amount for you to keep. If you " "set this to e.g. 10, they will only be able to choose values in increments " @@ -11455,7 +11570,7 @@ msgstr "" "ذلك على سبيل المثال 10 ، سيكونون قادرين فقط على اختيار القيم بزيادات قدرها " "10." -#: pretix/base/settings.py:2027 +#: pretix/base/settings.py:2081 msgid "" "Customers can only request a cancellation that needs to be approved by the " "event organizer before the order is canceled and a refund is issued." @@ -11463,68 +11578,68 @@ msgstr "" "يمكن للعملاء فقط طلب الإلغاء الذي يحتاج إلى موافقة منظم الفالية قبل إلغاء " "الطلب وإصدار أمر الاسترداد." -#: pretix/base/settings.py:2037 +#: pretix/base/settings.py:2091 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2046 pretix/base/settings.py:2056 +#: pretix/base/settings.py:2100 pretix/base/settings.py:2110 msgid "All refunds are issued to the original payment method" msgstr "يتم إصدار جميع المبالغ المستردة بطريقة الدفع الأصلية" -#: pretix/base/settings.py:2047 pretix/base/settings.py:2057 +#: pretix/base/settings.py:2101 pretix/base/settings.py:2111 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" "يمكن للعملاء الاختيار بين بطاقة هدايا واسترداد الأموال بطريقة الدفع الخاصة " "بهم" -#: pretix/base/settings.py:2048 pretix/base/settings.py:2058 +#: pretix/base/settings.py:2102 pretix/base/settings.py:2112 msgid "All refunds are issued as gift cards" msgstr "يتم إصدار جميع المبالغ المستردة كبطاقات هدايا" -#: pretix/base/settings.py:2049 pretix/base/settings.py:2059 +#: pretix/base/settings.py:2103 pretix/base/settings.py:2113 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2054 +#: pretix/base/settings.py:2108 #: pretix/control/templates/pretixcontrol/order/index.html:149 msgid "Refund method" msgstr "طريقة الاسترداد" -#: pretix/base/settings.py:2080 pretix/base/settings.py:2093 +#: pretix/base/settings.py:2134 pretix/base/settings.py:2147 #, fuzzy #| msgid "Generate cancellation" msgid "Terms of cancellation" msgstr "توليد إلغاء" -#: pretix/base/settings.py:2083 +#: pretix/base/settings.py:2137 msgid "" "This text will be shown when cancellation is allowed for a paid order. Leave " "empty if you want pretix to automatically generate the terms of cancellation " "based on your settings." msgstr "" -#: pretix/base/settings.py:2096 +#: pretix/base/settings.py:2150 msgid "" "This text will be shown when cancellation is allowed for an unpaid or free " "order. Leave empty if you want pretix to automatically generate the terms of " "cancellation based on your settings." msgstr "" -#: pretix/base/settings.py:2106 pretix/control/forms/event.py:1720 +#: pretix/base/settings.py:2160 pretix/control/forms/event.py:1822 msgid "Contact address" msgstr "عنوان الإتصال" -#: pretix/base/settings.py:2107 pretix/control/forms/event.py:1722 +#: pretix/base/settings.py:2161 pretix/control/forms/event.py:1824 msgid "We'll show this publicly to allow attendees to contact you." msgstr "سيظهر هذا علنا للسماح للحاضرين بالاتصال بك." -#: pretix/base/settings.py:2115 pretix/control/forms/event.py:1714 +#: pretix/base/settings.py:2169 pretix/control/forms/event.py:1816 msgid "Imprint URL" msgstr "رابط موقع مقدم الخدمة" -#: pretix/base/settings.py:2116 pretix/control/forms/event.py:1715 +#: pretix/base/settings.py:2170 pretix/control/forms/event.py:1817 msgid "" "This should point e.g. to a part of your website that has your contact " "details and legal information." @@ -11532,11 +11647,11 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2126 +#: pretix/base/settings.py:2180 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2127 +#: pretix/base/settings.py:2181 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -11548,13 +11663,13 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2138 +#: pretix/base/settings.py:2192 #, fuzzy #| msgid "Account information" msgid "Accessibility information URL" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2139 +#: pretix/base/settings.py:2193 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -11566,7 +11681,7 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2146 +#: pretix/base/settings.py:2200 #: pretix/presale/templates/pretixpresale/event/base.html:228 #: pretix/presale/templates/pretixpresale/event/base.html:233 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -11577,23 +11692,23 @@ msgstr "" msgid "Accessibility information" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2150 +#: pretix/base/settings.py:2204 #, fuzzy #| msgid "Account information" msgid "Accessibility information title" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2160 +#: pretix/base/settings.py:2214 #, fuzzy #| msgid "Account information" msgid "Accessibility information text" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2181 +#: pretix/base/settings.py:2235 msgid "Attach ticket files" msgstr "إرفق ملفات التذكرة" -#: pretix/base/settings.py:2183 +#: pretix/base/settings.py:2237 #, python-brace-format msgid "" "Tickets will never be attached if they're larger than {size} to avoid email " @@ -11602,36 +11717,36 @@ msgstr "" "لن يتم إرفاق التذاكر أبدا إذا كان حجمها أكبر من {size} لتجنب مشاكل إرسال " "البريد الإلكتروني." -#: pretix/base/settings.py:2194 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2248 pretix/plugins/sendmail/forms.py:201 #: pretix/plugins/sendmail/models.py:270 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:66 msgid "Attach calendar files" msgstr "إرفق ملفات التقويم" -#: pretix/base/settings.py:2195 +#: pretix/base/settings.py:2249 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" "في حالة التمكين، سنرفق ملف تقويم ics. لرسائل البريد الإلكتروني لتأكيد الطلب." -#: pretix/base/settings.py:2204 +#: pretix/base/settings.py:2258 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2205 +#: pretix/base/settings.py:2259 msgid "" "Use this if you e.g. put a private access link into the calendar file to " "make sure people only receive it after their payment was confirmed." msgstr "" -#: pretix/base/settings.py:2214 +#: pretix/base/settings.py:2268 #, fuzzy #| msgid "Product description" msgid "Event description" msgstr "وصف المنتج" -#: pretix/base/settings.py:2217 +#: pretix/base/settings.py:2271 msgid "" "You can use this to share information with your attendees, such as travel " "information or the link to a digital event. If you keep it empty, we will " @@ -11641,11 +11756,11 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2230 +#: pretix/base/settings.py:2284 msgid "Subject prefix" msgstr "الرمز الذي يسبق الموضوع" -#: pretix/base/settings.py:2231 +#: pretix/base/settings.py:2285 msgid "" "This will be prepended to the subject of all outgoing emails, formatted as " "[prefix]. Choose, for example, a short form of your event name." @@ -11653,23 +11768,23 @@ msgstr "" "سيتم إضافة هذا مسبقا إلى موضوع جميع رسائل البريد الإلكتروني الصادرة ، محدد " "مثل [prefix]. اختر ، على سبيل المثال ، مسمى قصير لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2245 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2299 pretix/control/forms/mailsetup.py:37 #: pretix/control/forms/mailsetup.py:119 #: pretix/control/templates/pretixcontrol/event/mail.html:39 #: pretix/control/templates/pretixcontrol/organizers/mail.html:40 msgid "Sender address" msgstr "عنوان المرسل" -#: pretix/base/settings.py:2246 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2300 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "عنوان المرسل لرسائل البريد الإلكتروني الصادرة" -#: pretix/base/settings.py:2255 +#: pretix/base/settings.py:2309 msgid "Sender name" msgstr "اسم المرسل" -#: pretix/base/settings.py:2256 +#: pretix/base/settings.py:2310 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." @@ -11677,20 +11792,20 @@ msgstr "" "يتم استخدام اسم المرسل مع عنوان المرسل لرسائل البريد الإلكتروني الصادرة. " "افتراضات لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2274 pretix/base/settings.py:2331 -#: pretix/base/settings.py:2348 pretix/base/settings.py:2366 +#: pretix/base/settings.py:2328 pretix/base/settings.py:2385 +#: pretix/base/settings.py:2402 pretix/base/settings.py:2420 #, python-brace-format msgid "Your order: {code}" msgstr "طلبك هو: {code}" -#: pretix/base/settings.py:2278 pretix/base/settings.py:2311 -#: pretix/base/settings.py:2416 pretix/base/settings.py:2649 -#: pretix/base/settings.py:2686 +#: pretix/base/settings.py:2332 pretix/base/settings.py:2365 +#: pretix/base/settings.py:2470 pretix/base/settings.py:2703 +#: pretix/base/settings.py:2740 #, python-brace-format msgid "Your event registration: {code}" msgstr "تسجيل الفعالية الخاصة بك:{code}" -#: pretix/base/settings.py:2282 +#: pretix/base/settings.py:2336 #, python-brace-format msgid "" "Hello,\n" @@ -11715,12 +11830,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2295 +#: pretix/base/settings.py:2349 #, python-brace-format msgid "Your orders for {event}" msgstr "طلباتكم ل{event}" -#: pretix/base/settings.py:2299 +#: pretix/base/settings.py:2353 #, python-brace-format msgid "" "Hello,\n" @@ -11743,7 +11858,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2315 +#: pretix/base/settings.py:2369 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11766,7 +11881,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2335 +#: pretix/base/settings.py:2389 #, python-brace-format msgid "" "Hello,\n" @@ -11791,7 +11906,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2352 +#: pretix/base/settings.py:2406 #, python-brace-format msgid "" "Hello,\n" @@ -11818,7 +11933,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2370 +#: pretix/base/settings.py:2424 #, python-brace-format msgid "" "Hello,\n" @@ -11848,13 +11963,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2388 +#: pretix/base/settings.py:2442 #, fuzzy #| msgid "Split into new order" msgid "Attachment for new orders" msgstr "تنقسم إلى النظام الجديد" -#: pretix/base/settings.py:2393 +#: pretix/base/settings.py:2447 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -11866,7 +11981,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2420 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11889,12 +12004,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2432 +#: pretix/base/settings.py:2486 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "تم تغيير طلبك: {code}" -#: pretix/base/settings.py:2436 +#: pretix/base/settings.py:2490 #, python-brace-format msgid "" "Hello,\n" @@ -11917,12 +12032,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2448 +#: pretix/base/settings.py:2502 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2452 +#: pretix/base/settings.py:2506 #, python-brace-format msgid "" "Hello,\n" @@ -11949,12 +12064,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2470 +#: pretix/base/settings.py:2524 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "تم تأكيد تسجيل الفعالية: {code}" -#: pretix/base/settings.py:2474 +#: pretix/base/settings.py:2528 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11977,12 +12092,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2491 pretix/control/forms/event.py:1130 -#: pretix/control/forms/event.py:1244 pretix/plugins/sendmail/models.py:275 +#: pretix/base/settings.py:2545 pretix/control/forms/event.py:1229 +#: pretix/control/forms/event.py:1343 pretix/plugins/sendmail/models.py:275 msgid "Number of days" msgstr "عدد الأيام" -#: pretix/base/settings.py:2493 pretix/control/forms/event.py:1133 +#: pretix/base/settings.py:2547 pretix/control/forms/event.py:1232 msgid "" "This email will be sent out this many days before the order expires. If the " "value is 0, the mail will never be sent." @@ -11990,12 +12105,12 @@ msgstr "" "سيتم إرسال هذا البريد الإلكتروني من هذا عدة أيام قبل انتهاء صلاحية النظام. " "إذا كانت القيمة 0، لن يتم إرسال البريد." -#: pretix/base/settings.py:2501 +#: pretix/base/settings.py:2555 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "طلبك على وشك الانتهاء: {code}" -#: pretix/base/settings.py:2505 +#: pretix/base/settings.py:2559 #, python-brace-format msgid "" "Hello,\n" @@ -12022,12 +12137,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2519 +#: pretix/base/settings.py:2573 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "طلبك في انتظار الدفع: {code}" -#: pretix/base/settings.py:2523 +#: pretix/base/settings.py:2577 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12065,13 +12180,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2536 +#: pretix/base/settings.py:2590 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Incomplete payment received: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2540 +#: pretix/base/settings.py:2594 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12112,13 +12227,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2556 +#: pretix/base/settings.py:2610 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Payment failed for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2560 +#: pretix/base/settings.py:2614 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12159,12 +12274,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2574 +#: pretix/base/settings.py:2628 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "لقد تم اختيارك من قائمة الانتظار ل{event}" -#: pretix/base/settings.py:2578 +#: pretix/base/settings.py:2632 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12236,12 +12351,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2607 +#: pretix/base/settings.py:2661 #, python-brace-format msgid "Order canceled: {code}" msgstr "تم إلغاء الطلب: {code}" -#: pretix/base/settings.py:2611 +#: pretix/base/settings.py:2665 #, python-brace-format msgid "" "Hello,\n" @@ -12268,12 +12383,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2625 +#: pretix/base/settings.py:2679 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "تمت الموافقة على الطلب وفي انتظار الدفع: {code}" -#: pretix/base/settings.py:2629 +#: pretix/base/settings.py:2683 #, python-brace-format msgid "" "Hello,\n" @@ -12303,7 +12418,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2653 pretix/base/settings.py:2690 +#: pretix/base/settings.py:2707 pretix/base/settings.py:2744 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12336,12 +12451,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2665 +#: pretix/base/settings.py:2719 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "تمت الموافقة على الطلب وتأكيده: {code}" -#: pretix/base/settings.py:2669 +#: pretix/base/settings.py:2723 #, python-brace-format msgid "" "Hello,\n" @@ -12366,12 +12481,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2702 +#: pretix/base/settings.py:2756 #, python-brace-format msgid "Order denied: {code}" msgstr "الطلب مرفوض: {code}" -#: pretix/base/settings.py:2706 +#: pretix/base/settings.py:2760 #, python-brace-format msgid "" "Hello,\n" @@ -12400,7 +12515,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2721 +#: pretix/base/settings.py:2775 #, python-brace-format msgid "" "Hello,\n" @@ -12419,13 +12534,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2731 +#: pretix/base/settings.py:2785 #, fuzzy, python-brace-format #| msgid "Invoice number" msgid "Invoice {invoice_number}" msgstr "رقم الفاتورة" -#: pretix/base/settings.py:2735 +#: pretix/base/settings.py:2789 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12457,12 +12572,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2753 pretix/base/settings.py:2769 +#: pretix/base/settings.py:2807 pretix/base/settings.py:2823 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "تذكرتك جاهزة للتنزيل: {code}" -#: pretix/base/settings.py:2757 +#: pretix/base/settings.py:2811 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12495,7 +12610,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2773 +#: pretix/base/settings.py:2827 #, python-brace-format msgid "" "Hello,\n" @@ -12518,12 +12633,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2785 +#: pretix/base/settings.py:2839 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "قم بتفعيل حسابك على {organizer}" -#: pretix/base/settings.py:2789 +#: pretix/base/settings.py:2843 #, python-brace-format msgid "" "Hello {name},\n" @@ -12558,12 +12673,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2807 +#: pretix/base/settings.py:2861 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "تأكيد عنوان البريد الإلكتروني لحسابك على {organizer}" -#: pretix/base/settings.py:2811 +#: pretix/base/settings.py:2865 #, python-brace-format msgid "" "Hello {name},\n" @@ -12598,12 +12713,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2829 +#: pretix/base/settings.py:2883 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "قم بتعيين كلمة مرور جديدة لحسابك على {organizer}" -#: pretix/base/settings.py:2833 +#: pretix/base/settings.py:2887 #, python-brace-format msgid "" "Hello {name},\n" @@ -12638,57 +12753,57 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2885 pretix/base/settings.py:2892 -#: pretix/base/settings.py:2906 pretix/base/settings.py:2914 -#: pretix/base/settings.py:2928 pretix/base/settings.py:2936 -#: pretix/base/settings.py:2950 pretix/base/settings.py:2957 +#: pretix/base/settings.py:2939 pretix/base/settings.py:2946 +#: pretix/base/settings.py:2960 pretix/base/settings.py:2968 +#: pretix/base/settings.py:2982 pretix/base/settings.py:2990 +#: pretix/base/settings.py:3004 pretix/base/settings.py:3011 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "الرجاء إدخال رمز عشري للون على سبيل المثال # 990000." -#: pretix/base/settings.py:2889 +#: pretix/base/settings.py:2943 msgid "Primary color" msgstr "لون أساسي" -#: pretix/base/settings.py:2910 +#: pretix/base/settings.py:2964 msgid "Accent color for success" msgstr "درجة لون لنجاح العملية" -#: pretix/base/settings.py:2911 +#: pretix/base/settings.py:2965 msgid "We strongly suggest to use a shade of green." msgstr "نقترح بشدة استخدام الظل الأخضر." -#: pretix/base/settings.py:2932 +#: pretix/base/settings.py:2986 msgid "Accent color for errors" msgstr "درجة لون الأخطاء" -#: pretix/base/settings.py:2933 +#: pretix/base/settings.py:2987 msgid "We strongly suggest to use a shade of red." msgstr "نقترح بشدة استخدام الظل الأحمر." -#: pretix/base/settings.py:2954 +#: pretix/base/settings.py:3008 msgid "Page background color" msgstr "لون خلفية الصفحة" -#: pretix/base/settings.py:2969 +#: pretix/base/settings.py:3023 msgid "Use round edges" msgstr "استخدم حواف مستديرة" -#: pretix/base/settings.py:2978 +#: pretix/base/settings.py:3032 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:2989 +#: pretix/base/settings.py:3043 msgid "Only respected by modern browsers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:3000 pretix/base/settings.py:3044 +#: pretix/base/settings.py:3054 pretix/base/settings.py:3098 #: pretix/control/forms/organizer.py:523 msgid "Header image" msgstr "صورة رأسية" -#: pretix/base/settings.py:3003 +#: pretix/base/settings.py:3057 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your event name " @@ -12708,26 +12823,26 @@ msgstr "" "120 بكسل. يمكنك زيادة الحجم من خلال الإعداد أدناه. نوصي بعدم استخدام " "التفاصيل الصغيرة على الصورة حيث سيتغير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:3024 pretix/base/settings.py:3067 +#: pretix/base/settings.py:3078 pretix/base/settings.py:3121 msgid "Use header image in its full size" msgstr "استخدم الصورة الرأسية بحجمها الكامل" -#: pretix/base/settings.py:3025 pretix/base/settings.py:3068 +#: pretix/base/settings.py:3079 pretix/base/settings.py:3122 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "نوصي بتحميل صورة لا يقل عرضها عن 1170 بكسل." -#: pretix/base/settings.py:3034 +#: pretix/base/settings.py:3088 msgid "Show event title even if a header image is present" msgstr "أعرض عنوان الفعالية حتى إذا كانت الصورة الرأسية موجودة" -#: pretix/base/settings.py:3035 +#: pretix/base/settings.py:3089 msgid "" "The title will only be shown on the event front page. If no header image is " "uploaded for the event, but the header image from the organizer profile is " "used, this option will be ignored and the event title will always be shown." msgstr "" -#: pretix/base/settings.py:3047 pretix/control/forms/organizer.py:527 +#: pretix/base/settings.py:3101 pretix/control/forms/organizer.py:527 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your " @@ -12747,15 +12862,15 @@ msgstr "" "الحجم من الإعداد أدناه. نوصي بعدم استخدام التفاصيل الصغيرة على الصورة حيث " "سيتم تغيير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:3077 +#: pretix/base/settings.py:3131 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3085 +#: pretix/base/settings.py:3139 msgid "Favicon" msgstr "فافيكون" -#: pretix/base/settings.py:3088 +#: pretix/base/settings.py:3142 msgid "" "If you provide a favicon, we will show it instead of the default pretix " "icon. We recommend a size of at least 200x200px to accommodate most devices." @@ -12763,11 +12878,11 @@ msgstr "" "إذا قمت بتوفير فافيكون، وسوف نعرض بدلا من الافتراضي pretix رمز. نوصي حجم " "200x200px على الأقل لاستيعاب معظم الأجهزة." -#: pretix/base/settings.py:3104 +#: pretix/base/settings.py:3158 msgid "Social media image" msgstr "صورة وسائل التواصل الاجتماعي" -#: pretix/base/settings.py:3107 +#: pretix/base/settings.py:3161 msgid "" "This picture will be used as a preview if you post links to your ticket shop " "on social media. Facebook advises to use a picture size of 1200 x 630 " @@ -12781,19 +12896,19 @@ msgstr "" "لذلك نوصي بالتأكد من أنها لا تزال تبدو جيدة في حال كان المربع الأوسط هو الذي " "يظهر فقط. إذا لم تقم بملء هذا ، فسنستخدم الشعار المقدم أعلاه." -#: pretix/base/settings.py:3125 +#: pretix/base/settings.py:3179 msgid "Logo image" msgstr "صورة الشعار" -#: pretix/base/settings.py:3129 +#: pretix/base/settings.py:3183 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "سنعرض شعارك بارتفاع وعرض 2.5 سم كحد أقصى." -#: pretix/base/settings.py:3155 pretix/base/settings.py:3261 +#: pretix/base/settings.py:3209 pretix/base/settings.py:3315 msgid "Info text" msgstr "معلومات النص" -#: pretix/base/settings.py:3158 pretix/base/settings.py:3263 +#: pretix/base/settings.py:3212 pretix/base/settings.py:3317 msgid "" "Not displayed anywhere by default, but if you want to, you can use this e.g. " "in ticket templates." @@ -12801,11 +12916,11 @@ msgstr "" "لا يتم عرضه في أي مكان بشكل افتراضي ، ولكن إذا كنت ترغب في ذلك ، يمكنك " "استخدام هذا على سبيل المثال في قوالب التذاكر." -#: pretix/base/settings.py:3167 +#: pretix/base/settings.py:3221 msgid "Banner text (top)" msgstr "نص الشعار (أعلى)" -#: pretix/base/settings.py:3170 +#: pretix/base/settings.py:3224 msgid "" "This text will be shown above every page of your shop. Please only use this " "for very important messages." @@ -12813,11 +12928,11 @@ msgstr "" "سيظهر هذا النص فوق كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3180 +#: pretix/base/settings.py:3234 msgid "Banner text (bottom)" msgstr "نص الشعار (أسفل)" -#: pretix/base/settings.py:3183 +#: pretix/base/settings.py:3237 msgid "" "This text will be shown below every page of your shop. Please only use this " "for very important messages." @@ -12825,11 +12940,11 @@ msgstr "" "سيظهر هذا النص أسفل كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3193 +#: pretix/base/settings.py:3247 msgid "Voucher explanation" msgstr "تفسير لكود الخصم" -#: pretix/base/settings.py:3196 +#: pretix/base/settings.py:3250 msgid "" "This text will be shown next to the input for a voucher code. You can use it " "e.g. to explain how to obtain a voucher code." @@ -12837,11 +12952,11 @@ msgstr "" "سيظهر هذا النص بجانب إدخال رمز كود الخصم. يمكنك استخدامه على سبيل المثال " "لشرح كيفية الحصول على رمز قسيمة." -#: pretix/base/settings.py:3206 +#: pretix/base/settings.py:3260 msgid "Attendee data explanation" msgstr "شرح بيانات الحضور" -#: pretix/base/settings.py:3209 +#: pretix/base/settings.py:3263 #, fuzzy #| msgid "" #| "This text will be shown above the questions asked for every admission " @@ -12854,11 +12969,11 @@ msgstr "" "سيتم عرض هذا النص فوق الأسئلة المطروحة لكل منتج مدخل. يمكنك استخدامه على " "سبيل المثال لشرح سبب حاجتك إلى معلومات منهم." -#: pretix/base/settings.py:3219 +#: pretix/base/settings.py:3273 msgid "Additional success message" msgstr "رسالة نجاح إضافية" -#: pretix/base/settings.py:3220 +#: pretix/base/settings.py:3274 msgid "" "This message will be shown after an order has been created successfully. It " "will be shown in additional to the default text." @@ -12866,11 +12981,11 @@ msgstr "" "ستظهر هذه الرسالة بعد إنشاء الطلب بنجاح. سيتم عرضه بالإضافة إلى النص " "الافتراضي." -#: pretix/base/settings.py:3232 +#: pretix/base/settings.py:3286 msgid "Help text of the phone number field" msgstr "نص المساعدة لحقل رقم الهاتف" -#: pretix/base/settings.py:3239 +#: pretix/base/settings.py:3293 msgid "" "Make sure to enter a valid email address. We will send you an order " "confirmation including a link that you need to access your order later." @@ -12878,15 +12993,15 @@ msgstr "" "تأكد من إدخال عنوان بريد إلكتروني صالح. سنرسل إليك تأكيدا لطلبك يتضمن رابطا " "تحتاجه للوصول إلى طلبك لاحقا." -#: pretix/base/settings.py:3246 +#: pretix/base/settings.py:3300 msgid "Help text of the email field" msgstr "نص المساعدة لحقل البريد الإلكتروني" -#: pretix/base/settings.py:3272 +#: pretix/base/settings.py:3326 msgid "Allow creating a new team during event creation" msgstr "السماح بإنشاء فريق جديد أثناء إنشاء الفعالية" -#: pretix/base/settings.py:3273 +#: pretix/base/settings.py:3327 msgid "" "Users that do not have access to all events under this organizer, must " "select one of their teams to have access to the created event. This setting " @@ -12898,36 +13013,36 @@ msgstr "" "الإعداد للمستخدمين بإنشاء فريق محدد للفعاية أثناء التنقل ، حتى عندما لا يكون " "لديهم إذن \"إمكانية تغيير الفرق والتصاريح\"." -#: pretix/base/settings.py:3345 pretix/base/settings.py:3355 +#: pretix/base/settings.py:3399 pretix/base/settings.py:3409 msgid "Event start time (descending)" msgstr "وقت بدء الفعالية (تنازلي)" -#: pretix/base/settings.py:3347 pretix/base/settings.py:3357 +#: pretix/base/settings.py:3401 pretix/base/settings.py:3411 msgid "Name (descending)" msgstr "الاسم (تنازلي)" -#: pretix/base/settings.py:3352 +#: pretix/base/settings.py:3406 msgctxt "subevent" msgid "Date ordering" msgstr "ترتيب التاريخ" -#: pretix/base/settings.py:3368 +#: pretix/base/settings.py:3422 msgid "Link back to organizer overview on all event pages" msgstr "قم بنظرة عامة للمنظم للاطلاع على جميع صفحات الفعالية" -#: pretix/base/settings.py:3377 +#: pretix/base/settings.py:3431 msgid "Homepage text" msgstr "نص الصفحة الرئيسية" -#: pretix/base/settings.py:3379 +#: pretix/base/settings.py:3433 msgid "This will be displayed on the organizer homepage." msgstr "سيتم عرض هذا على الصفحة الرئيسية للمنظم." -#: pretix/base/settings.py:3394 +#: pretix/base/settings.py:3448 msgid "Length of gift card codes" msgstr "طول رموز بطاقات الهدايا" -#: pretix/base/settings.py:3395 +#: pretix/base/settings.py:3449 #, python-brace-format msgid "" "The system generates by default {}-character long gift card codes. However, " @@ -12936,11 +13051,11 @@ msgstr "" "ينشئ النظام افتراضيا رموز بطاقات هدايا طويلة مكونة من {}-حرف. ومع ذلك ، إذا " "تم طلب طول مختلف، فيمكن تعيينه هنا." -#: pretix/base/settings.py:3411 +#: pretix/base/settings.py:3465 msgid "Validity of gift card codes in years" msgstr "صلاحية رموز بطاقات الهدايا بالسنوات" -#: pretix/base/settings.py:3412 +#: pretix/base/settings.py:3466 msgid "" "If you set a number here, gift cards will by default expire at the end of " "the year after this many years. If you keep it empty, gift cards do not have " @@ -12950,23 +13065,23 @@ msgstr "" "العام بعد هذه السنوات العديدة. إذا أبقيت الخانة فارغة ، فلن يكون لبطاقات " "الهدايا تاريخ انتهاء صلاحية صريح." -#: pretix/base/settings.py:3423 +#: pretix/base/settings.py:3477 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3429 +#: pretix/base/settings.py:3483 msgid "" "By clicking \"Accept all cookies\", you agree to the storing of cookies and " "use of similar technologies on your device." msgstr "" -#: pretix/base/settings.py:3436 +#: pretix/base/settings.py:3490 #, fuzzy #| msgid "Additional text" msgid "Dialog text" msgstr "نص إضافي" -#: pretix/base/settings.py:3443 +#: pretix/base/settings.py:3497 msgid "" "We use cookies and similar technologies to gather data that allows us to " "improve this website and our offerings. If you do not agree, we will only " @@ -12974,49 +13089,49 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3451 +#: pretix/base/settings.py:3505 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3457 +#: pretix/base/settings.py:3511 #, fuzzy #| msgid "Price settings" msgid "Privacy settings" msgstr "ضبط الأسعار" -#: pretix/base/settings.py:3462 +#: pretix/base/settings.py:3516 #, fuzzy #| msgid "Allowed titles" msgid "Dialog title" msgstr "عناوين سمح" -#: pretix/base/settings.py:3468 +#: pretix/base/settings.py:3522 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3473 +#: pretix/base/settings.py:3527 #, fuzzy #| msgid "Product variation description" msgid "\"Accept\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3479 +#: pretix/base/settings.py:3533 #, fuzzy #| msgid "Required question" msgid "Required cookies only" msgstr "سؤال مطلوب" -#: pretix/base/settings.py:3484 +#: pretix/base/settings.py:3538 #, fuzzy #| msgid "Product variation description" msgid "\"Reject\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3494 +#: pretix/base/settings.py:3548 msgid "Customers can choose their own seats" msgstr "يمكن للعملاء اختيار مقاعدهم الخاصة" -#: pretix/base/settings.py:3495 +#: pretix/base/settings.py:3549 msgid "" "If disabled, you will need to manually assign seats in the backend. Note " "that this can mean people will not know their seat after their purchase and " @@ -13026,159 +13141,159 @@ msgstr "" "لاحظ أن هذا قد يعني أن الأشخاص لن يعرفوا مقعدهم بعد شرائه وقد لا يكون مكتوبا " "على تذكرتهم." -#: pretix/base/settings.py:3521 +#: pretix/base/settings.py:3575 msgid "Show button to copy user input from other products" msgstr "أظهر الزر لنسخ مدخلات المستخدم من المنتجات الأخرى" -#: pretix/base/settings.py:3531 +#: pretix/base/settings.py:3585 msgid "Most common English titles" msgstr "العناوين الإنجليزية الأكثر شيوعا" -#: pretix/base/settings.py:3541 +#: pretix/base/settings.py:3595 msgid "Most common German titles" msgstr "العناوين الألمانية الأكثر شيوعا" -#: pretix/base/settings.py:3554 +#: pretix/base/settings.py:3608 msgctxt "person_name_salutation" msgid "Ms" msgstr "آنسة" -#: pretix/base/settings.py:3555 +#: pretix/base/settings.py:3609 msgctxt "person_name_salutation" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3556 +#: pretix/base/settings.py:3610 msgctxt "person_name_salutation" msgid "Mx" msgstr "السيد\\السيدة" -#: pretix/base/settings.py:3593 pretix/base/settings.py:3609 -#: pretix/base/settings.py:3625 pretix/base/settings.py:3640 -#: pretix/base/settings.py:3658 pretix/base/settings.py:3673 -#: pretix/base/settings.py:3703 pretix/base/settings.py:3727 -#: pretix/base/settings.py:3759 pretix/base/settings.py:3781 -#: pretix/base/settings.py:3812 +#: pretix/base/settings.py:3647 pretix/base/settings.py:3663 +#: pretix/base/settings.py:3679 pretix/base/settings.py:3694 +#: pretix/base/settings.py:3712 pretix/base/settings.py:3727 +#: pretix/base/settings.py:3757 pretix/base/settings.py:3781 +#: pretix/base/settings.py:3813 pretix/base/settings.py:3835 +#: pretix/base/settings.py:3866 msgctxt "person_name_sample" msgid "John" msgstr "جون" -#: pretix/base/settings.py:3594 pretix/base/settings.py:3610 -#: pretix/base/settings.py:3626 pretix/base/settings.py:3642 -#: pretix/base/settings.py:3660 pretix/base/settings.py:3674 -#: pretix/base/settings.py:3704 pretix/base/settings.py:3760 -#: pretix/base/settings.py:3782 pretix/base/settings.py:3813 +#: pretix/base/settings.py:3648 pretix/base/settings.py:3664 +#: pretix/base/settings.py:3680 pretix/base/settings.py:3696 +#: pretix/base/settings.py:3714 pretix/base/settings.py:3728 +#: pretix/base/settings.py:3758 pretix/base/settings.py:3814 +#: pretix/base/settings.py:3836 pretix/base/settings.py:3867 msgctxt "person_name_sample" msgid "Doe" msgstr "دو" -#: pretix/base/settings.py:3600 pretix/base/settings.py:3616 -#: pretix/base/settings.py:3648 pretix/base/settings.py:3767 -#: pretix/base/settings.py:3789 +#: pretix/base/settings.py:3654 pretix/base/settings.py:3670 +#: pretix/base/settings.py:3702 pretix/base/settings.py:3821 +#: pretix/base/settings.py:3843 msgctxt "person_name" msgid "Title" msgstr "عنوان" -#: pretix/base/settings.py:3608 pretix/base/settings.py:3624 -#: pretix/base/settings.py:3657 pretix/base/settings.py:3780 -#: pretix/base/settings.py:3811 +#: pretix/base/settings.py:3662 pretix/base/settings.py:3678 +#: pretix/base/settings.py:3711 pretix/base/settings.py:3834 +#: pretix/base/settings.py:3865 msgctxt "person_name_sample" msgid "Dr" msgstr "الدكتور" -#: pretix/base/settings.py:3632 pretix/base/settings.py:3649 +#: pretix/base/settings.py:3686 pretix/base/settings.py:3703 msgid "First name" msgstr "الاسم الاول" -#: pretix/base/settings.py:3633 pretix/base/settings.py:3650 +#: pretix/base/settings.py:3687 pretix/base/settings.py:3704 msgid "Middle name" msgstr "الاسم الأوسط" -#: pretix/base/settings.py:3714 pretix/base/settings.py:3726 +#: pretix/base/settings.py:3768 pretix/base/settings.py:3780 #: pretix/control/forms/organizer.py:658 msgctxt "person_name_sample" msgid "John Doe" msgstr "جون دو" -#: pretix/base/settings.py:3720 +#: pretix/base/settings.py:3774 msgid "Calling name" msgstr "اسم النداء" -#: pretix/base/settings.py:3734 +#: pretix/base/settings.py:3788 msgid "Latin transcription" msgstr "الإملاء بالحروف اللاتينية" -#: pretix/base/settings.py:3746 pretix/base/settings.py:3766 -#: pretix/base/settings.py:3788 +#: pretix/base/settings.py:3800 pretix/base/settings.py:3820 +#: pretix/base/settings.py:3842 msgctxt "person_name" msgid "Salutation" msgstr "تحية" -#: pretix/base/settings.py:3758 pretix/base/settings.py:3779 -#: pretix/base/settings.py:3810 +#: pretix/base/settings.py:3812 pretix/base/settings.py:3833 +#: pretix/base/settings.py:3864 msgctxt "person_name_sample" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3792 +#: pretix/base/settings.py:3846 msgctxt "person_name" msgid "Degree (after name)" msgstr "الدرجة (بعد الاسم)" -#: pretix/base/settings.py:3814 +#: pretix/base/settings.py:3868 msgctxt "person_name_sample" msgid "MA" msgstr "MA" -#: pretix/base/settings.py:3840 pretix/base/settings.py:3842 +#: pretix/base/settings.py:3894 pretix/base/settings.py:3896 #, fuzzy #| msgid "Product name" msgctxt "address" msgid "Province" msgstr "اسم المنتج" -#: pretix/base/settings.py:3841 +#: pretix/base/settings.py:3895 #, fuzzy #| msgid "Use feature" msgctxt "address" msgid "Prefecture" msgstr "استخدام ميزة" -#: pretix/base/settings.py:3930 pretix/control/forms/event.py:228 +#: pretix/base/settings.py:3984 pretix/control/forms/event.py:228 msgid "" "Your default locale must also be enabled for your event (see box above)." msgstr "يجب أيضا تمكين لغتك الافتراضية للفعالية الخاصة بك (انظر المربع أعلاه)." -#: pretix/base/settings.py:3934 +#: pretix/base/settings.py:3988 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "لا يمكنك طلب تحديد أسماء الحضور إذا لم تطلبها." -#: pretix/base/settings.py:3938 +#: pretix/base/settings.py:3992 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" "عليك أن تطلب رسائل البريد الإلكتروني للحضور إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:3942 +#: pretix/base/settings.py:3996 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "عليك أن تطلب عناوين الفواتير إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:3946 +#: pretix/base/settings.py:4000 msgid "You have to require invoice addresses to require for company names." msgstr "عليك أن تطلب عنوان الفاتورة لطلب أسماء الشركات." -#: pretix/base/settings.py:3953 +#: pretix/base/settings.py:4021 msgid "The last payment date cannot be before the end of presale." msgstr "لا يمكن أن يكون تاريخ الدفع الأخير قبل نهاية فترة عرض البيع المسبق." -#: pretix/base/settings.py:3961 +#: pretix/base/settings.py:4029 #, fuzzy, python-brace-format #| msgid "Please enter a valid sales channel." msgid "The value \"{identifier}\" is not a valid sales channel." msgstr "الرجاء إدخال قناة بيع صالحة." -#: pretix/base/settings.py:3976 +#: pretix/base/settings.py:4044 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -14180,7 +14295,7 @@ msgid "" "You already used this slug for a different event. Please choose a new one." msgstr "استخدمته بالفعل هذا سبيكة لحدث آخر. الرجاء اختيار واحدة جديدة." -#: pretix/control/forms/event.py:135 pretix/control/forms/event.py:519 +#: pretix/control/forms/event.py:135 pretix/control/forms/event.py:526 msgid "Event timezone" msgstr "توقيت الحدث" @@ -14221,7 +14336,7 @@ msgstr "" msgid "Create a new team for this event with me as the only member" msgstr "" -#: pretix/control/forms/event.py:207 pretix/control/forms/event.py:378 +#: pretix/control/forms/event.py:207 pretix/control/forms/event.py:385 msgid "" "Sample Conference Center\n" "Heidelberg, Germany" @@ -14245,50 +14360,54 @@ msgid "Copy configuration from" msgstr "تكوين نسخة من" #: pretix/control/forms/event.py:317 pretix/control/forms/event.py:320 -#: pretix/control/forms/item.py:413 +#: pretix/control/forms/item.py:414 msgid "Do not copy" msgstr "لا تنسخ" -#: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1301 +#: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1304 #: pretix/control/forms/subevents.py:411 #, python-brace-format msgid "Default ({value})" msgstr "تلقائي ({value})" -#: pretix/control/forms/event.py:384 pretix/control/forms/event.py:397 +#: pretix/control/forms/event.py:380 +msgid "The currency cannot be changed because orders already exist." +msgstr "" + +#: pretix/control/forms/event.py:391 pretix/control/forms/event.py:404 msgid "Domain" msgstr "" -#: pretix/control/forms/event.py:388 +#: pretix/control/forms/event.py:395 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "You can configure this in your organizer settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/control/forms/event.py:398 +#: pretix/control/forms/event.py:405 #, fuzzy #| msgid "You can now login using your new password." msgid "You can add more domains in your organizer account." msgstr "يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة." -#: pretix/control/forms/event.py:399 +#: pretix/control/forms/event.py:406 #, fuzzy #| msgid "Organizer account" msgid "Same as organizer account" msgstr "حساب منظم" -#: pretix/control/forms/event.py:504 +#: pretix/control/forms/event.py:511 #, python-brace-format msgid "" "A validation error has occurred on a setting that is not part of this form: " "{error}" msgstr "" -#: pretix/control/forms/event.py:522 pretix/control/forms/organizer.py:461 +#: pretix/control/forms/event.py:529 pretix/control/forms/organizer.py:461 msgid "Name format" msgstr "تنسيق اسم" -#: pretix/control/forms/event.py:523 pretix/control/forms/organizer.py:462 +#: pretix/control/forms/event.py:530 pretix/control/forms/organizer.py:462 msgid "" "This defines how pretix will ask for human names. Changing this after you " "already received orders might lead to unexpected behavior when sorting or " @@ -14297,11 +14416,11 @@ msgstr "" "هذا يعرف كيف pretix سيطلب أسماء الإنسان. تغيير هذا بعد تلقي أوامر بالفعل قد " "يؤدي إلى سلوك غير متوقع عندما يكون الترتيب أو تغيير أسماء." -#: pretix/control/forms/event.py:528 pretix/control/forms/organizer.py:467 +#: pretix/control/forms/event.py:535 pretix/control/forms/organizer.py:467 msgid "Allowed titles" msgstr "عناوين سمح" -#: pretix/control/forms/event.py:529 pretix/control/forms/organizer.py:468 +#: pretix/control/forms/event.py:536 pretix/control/forms/organizer.py:468 msgid "" "If the naming scheme you defined above allows users to input a title, you " "can use this to restrict the set of selectable titles." @@ -14309,40 +14428,91 @@ msgstr "" "إذا كان نظام تسمية قمت بتعريفه فوق يتيح للمستخدمين إدخال العنوان، يمكنك " "استخدام هذا للحد من مجموعة من العناوين اختيار." -#: pretix/control/forms/event.py:648 pretix/control/forms/organizer.py:542 +#: pretix/control/forms/event.py:654 pretix/control/forms/organizer.py:542 #, python-brace-format msgid "Ask for {fields}, display like {example}" msgstr "طلب {fields}، العرض مثل {example}" -#: pretix/control/forms/event.py:654 pretix/control/forms/organizer.py:548 +#: pretix/control/forms/event.py:660 pretix/control/forms/organizer.py:548 msgid "Free text input" msgstr "إدخال النص الحر" -#: pretix/control/forms/event.py:690 +#: pretix/control/forms/event.py:696 msgid "Do not ask" msgstr "لا تسأل" -#: pretix/control/forms/event.py:691 +#: pretix/control/forms/event.py:697 msgid "Ask, but do not require input" msgstr "" -#: pretix/control/forms/event.py:692 +#: pretix/control/forms/event.py:698 #: pretix/control/templates/pretixcontrol/event/settings.html:76 msgid "Ask and require input" msgstr "" -#: pretix/control/forms/event.py:770 +#: pretix/control/forms/event.py:776 #, python-brace-format msgid "" "You have configured gift cards to be valid {} years plus the year the gift " "card is issued in." msgstr "" -#: pretix/control/forms/event.py:888 +#: pretix/control/forms/event.py:813 +#, fuzzy +#| msgid "including all taxes" +msgid "Prices including tax" +msgstr "بما في ذلك جميع الضرائب" + +#: pretix/control/forms/event.py:814 +msgid "Recommended if you sell tickets at least partly to consumers." +msgstr "" + +#: pretix/control/forms/event.py:818 +#, fuzzy +#| msgid "including all taxes" +msgid "Prices excluding tax" +msgstr "بما في ذلك جميع الضرائب" + +#: pretix/control/forms/event.py:819 +msgid "Recommended only if you sell tickets primarily to business customers." +msgstr "" + +#: pretix/control/forms/event.py:855 +#, fuzzy +#| msgid "Canceled by customer" +msgid "Prices shown to customer" +msgstr "تم الإلغاء من قبل العميل" + +#: pretix/control/forms/event.py:859 +msgid "" +"Recommended when e-invoicing is not required. Each product will be sold with " +"the advertised net and gross price. However, in orders of more than one " +"product, the total tax amount can differ from when it would be computed from " +"the order total." +msgstr "" + +#: pretix/control/forms/event.py:864 +msgid "" +"Recommended for e-invoicing when you primarily sell to business customers " +"and show prices to customers excluding tax. The gross price of some products " +"may be changed to ensure correct rounding, while the net prices will be kept " +"as configured. This may cause the actual payment amount to differ." +msgstr "" + +#: pretix/control/forms/event.py:870 +msgid "" +"Recommended for e-invoicing when you primarily sell to consumers. The gross " +"or net price of some products may be changed automatically to ensure correct " +"rounding of the order total. The system attempts to keep gross prices as " +"configured whenever possible. Gross prices may still change if they are " +"impossible to derive from a rounded net price." +msgstr "" + +#: pretix/control/forms/event.py:969 msgid "Generate invoices for Sales channels" msgstr "توليد الفواتير للقنوات المبيعات" -#: pretix/control/forms/event.py:891 +#: pretix/control/forms/event.py:972 msgid "" "If you have enabled invoice generation in the previous setting, you can " "limit it here to specific sales channels." @@ -14350,107 +14520,107 @@ msgstr "" "إذا قمت بتمكين الجيل الفاتورة في الإعداد السابق، يمكنك تحديد هنا لقنوات " "البيع المحددة." -#: pretix/control/forms/event.py:895 +#: pretix/control/forms/event.py:976 msgid "Invoice style" msgstr "النمط فاتورة" -#: pretix/control/forms/event.py:901 +#: pretix/control/forms/event.py:982 msgid "Invoice language" msgstr "اللغة فاتورة" -#: pretix/control/forms/event.py:902 pretix/control/forms/event.py:917 +#: pretix/control/forms/event.py:983 pretix/control/forms/event.py:998 msgid "The user's language" msgstr "لغة المستخدم" -#: pretix/control/forms/event.py:925 +#: pretix/control/forms/event.py:1004 #, python-brace-format msgid "" "An invoice will be issued before payment if the customer selects one of the " "following payment methods: {list}" msgstr "" -#: pretix/control/forms/event.py:929 +#: pretix/control/forms/event.py:1008 msgid "" "None of the currently configured payment methods will cause an invoice to be " "issued before payment." msgstr "" -#: pretix/control/forms/event.py:938 +#: pretix/control/forms/event.py:1017 #, fuzzy #| msgid "Split into new order" msgid "Recommended" msgstr "تنقسم إلى النظام الجديد" -#: pretix/control/forms/event.py:950 +#: pretix/control/forms/event.py:1049 msgid "The online shop must be selected to receive these emails." msgstr "" -#: pretix/control/forms/event.py:966 +#: pretix/control/forms/event.py:1065 #, fuzzy #| msgid "Sales channels to automatically check in" msgid "Sales channels for checkout emails" msgstr "قنوات البيع للبريد الإلكتروني الخاص بالدفع" -#: pretix/control/forms/event.py:967 +#: pretix/control/forms/event.py:1066 msgid "" "The order placed and paid emails will only be send to orders from these " "sales channels. The online shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:978 +#: pretix/control/forms/event.py:1077 msgid "" "This email will only be send to orders from these sales channels. The online " "shop must be enabled." msgstr "" -#: pretix/control/forms/event.py:986 pretix/control/forms/organizer.py:583 +#: pretix/control/forms/event.py:1085 pretix/control/forms/organizer.py:583 msgid "Bcc address" msgstr "عنوان مخفية" -#: pretix/control/forms/event.py:988 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:1087 pretix/control/forms/organizer.py:585 #, fuzzy #| msgid "All emails will be sent to this address as a Bcc copy" msgid "All emails will be sent to this address as a Bcc copy." msgstr "سيتم إرسال جميع رسائل البريد الإلكتروني إلى هذا العنوان كنسخة مخفية" -#: pretix/control/forms/event.py:996 pretix/control/forms/organizer.py:593 +#: pretix/control/forms/event.py:1095 pretix/control/forms/organizer.py:593 msgid "Signature" msgstr "التوقيع" -#: pretix/control/forms/event.py:999 +#: pretix/control/forms/event.py:1098 #, python-brace-format msgid "This will be attached to every email. Available placeholders: {event}" msgstr "وسيلحق هذا على كل البريد الإلكتروني. النائبة المتاحة: {event}" -#: pretix/control/forms/event.py:1004 pretix/control/forms/organizer.py:601 +#: pretix/control/forms/event.py:1103 pretix/control/forms/organizer.py:601 msgid "e.g. your contact details" msgstr "مثلا تفاصيل الاتصال الخاصة بك" -#: pretix/control/forms/event.py:1009 +#: pretix/control/forms/event.py:1108 msgid "HTML mail renderer" msgstr "HTML العارض الإلكتروني" -#: pretix/control/forms/event.py:1014 pretix/control/forms/event.py:1041 -#: pretix/control/forms/event.py:1068 pretix/control/forms/event.py:1218 +#: pretix/control/forms/event.py:1113 pretix/control/forms/event.py:1140 +#: pretix/control/forms/event.py:1167 pretix/control/forms/event.py:1317 #, fuzzy #| msgid "Text sent to order contact address" msgid "Subject sent to order contact address" msgstr "إرسالها إلى عنوان النص أمر الاتصال" -#: pretix/control/forms/event.py:1019 pretix/control/forms/event.py:1046 -#: pretix/control/forms/event.py:1073 pretix/control/forms/event.py:1223 +#: pretix/control/forms/event.py:1118 pretix/control/forms/event.py:1145 +#: pretix/control/forms/event.py:1172 pretix/control/forms/event.py:1322 msgid "Text sent to order contact address" msgstr "إرسالها إلى عنوان النص أمر الاتصال" -#: pretix/control/forms/event.py:1024 pretix/control/forms/event.py:1051 -#: pretix/control/forms/event.py:1078 pretix/control/forms/event.py:1228 -#: pretix/control/forms/event.py:1273 pretix/control/forms/event.py:1303 +#: pretix/control/forms/event.py:1123 pretix/control/forms/event.py:1150 +#: pretix/control/forms/event.py:1177 pretix/control/forms/event.py:1327 +#: pretix/control/forms/event.py:1372 pretix/control/forms/event.py:1402 msgid "Send an email to attendees" msgstr "إرسال بريد إلكتروني إلى الحضور" -#: pretix/control/forms/event.py:1025 pretix/control/forms/event.py:1052 -#: pretix/control/forms/event.py:1079 pretix/control/forms/event.py:1229 -#: pretix/control/forms/event.py:1274 pretix/control/forms/event.py:1304 +#: pretix/control/forms/event.py:1124 pretix/control/forms/event.py:1151 +#: pretix/control/forms/event.py:1178 pretix/control/forms/event.py:1328 +#: pretix/control/forms/event.py:1373 pretix/control/forms/event.py:1403 msgid "" "If the order contains attendees with email addresses different from the " "person who orders the tickets, the following email will be sent out to the " @@ -14459,23 +14629,23 @@ msgstr "" "إذا كان النظام يحتوي على الحضور مع عناوين البريد الإلكتروني المختلفة من " "الشخص الذي يأمر التذاكر، سيتم إرسال البريد الإلكتروني التالي إلى الحضور." -#: pretix/control/forms/event.py:1030 pretix/control/forms/event.py:1057 -#: pretix/control/forms/event.py:1084 pretix/control/forms/event.py:1234 -#: pretix/control/forms/event.py:1279 pretix/control/forms/event.py:1309 +#: pretix/control/forms/event.py:1129 pretix/control/forms/event.py:1156 +#: pretix/control/forms/event.py:1183 pretix/control/forms/event.py:1333 +#: pretix/control/forms/event.py:1378 pretix/control/forms/event.py:1408 #, fuzzy #| msgid "Text sent to attendees" msgid "Subject sent to attendees" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1035 pretix/control/forms/event.py:1062 -#: pretix/control/forms/event.py:1089 pretix/control/forms/event.py:1239 -#: pretix/control/forms/event.py:1284 pretix/control/forms/event.py:1314 +#: pretix/control/forms/event.py:1134 pretix/control/forms/event.py:1161 +#: pretix/control/forms/event.py:1188 pretix/control/forms/event.py:1338 +#: pretix/control/forms/event.py:1383 pretix/control/forms/event.py:1413 msgid "Text sent to attendees" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1100 pretix/control/forms/event.py:1174 -#: pretix/control/forms/event.py:1184 pretix/control/forms/event.py:1194 -#: pretix/control/forms/event.py:1199 pretix/control/forms/event.py:1211 +#: pretix/control/forms/event.py:1199 pretix/control/forms/event.py:1273 +#: pretix/control/forms/event.py:1283 pretix/control/forms/event.py:1293 +#: pretix/control/forms/event.py:1298 pretix/control/forms/event.py:1310 #: pretix/control/forms/organizer.py:612 pretix/control/forms/organizer.py:622 #: pretix/control/forms/organizer.py:632 #: pretix/control/templates/pretixcontrol/event/mail.html:88 @@ -14483,61 +14653,61 @@ msgstr "إرسالها النص إلى الحضور" msgid "Text" msgstr "نص" -#: pretix/control/forms/event.py:1105 +#: pretix/control/forms/event.py:1204 #, fuzzy #| msgid "Text (sent by admin)" msgid "Subject (sent by admin)" msgstr "النص (أرسلت بواسطة admin)" -#: pretix/control/forms/event.py:1110 +#: pretix/control/forms/event.py:1209 #, fuzzy #| msgid "Text sent to attendees" msgid "Subject (sent by admin to attendee)" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1115 +#: pretix/control/forms/event.py:1214 msgid "Text (sent by admin)" msgstr "النص (أرسلت بواسطة admin)" -#: pretix/control/forms/event.py:1120 +#: pretix/control/forms/event.py:1219 #, fuzzy #| msgid "Text (requested by user)" msgid "Subject (requested by user)" msgstr "النص (عن طريق المستخدم المطلوب)" -#: pretix/control/forms/event.py:1125 +#: pretix/control/forms/event.py:1224 msgid "Text (requested by user)" msgstr "النص (عن طريق المستخدم المطلوب)" -#: pretix/control/forms/event.py:1137 +#: pretix/control/forms/event.py:1236 msgid "Text (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1142 +#: pretix/control/forms/event.py:1241 msgid "Subject (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1147 +#: pretix/control/forms/event.py:1246 msgid "Text (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1152 +#: pretix/control/forms/event.py:1251 msgid "Subject (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1157 +#: pretix/control/forms/event.py:1256 #, fuzzy #| msgid "Payment received for your order: {code}" msgid "Subject (if an incomplete payment was received)" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/control/forms/event.py:1162 +#: pretix/control/forms/event.py:1261 #, fuzzy #| msgid "Payment received for your order: {code}" msgid "Text (if an incomplete payment was received)" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/control/forms/event.py:1165 +#: pretix/control/forms/event.py:1264 #, fuzzy #| msgid "This plugin allows you to receive payments via bank transfer." msgid "" @@ -14545,13 +14715,13 @@ msgid "" "payments, such as bank transfer." msgstr "يسمح لك هذا المكون الإضافي بتلقي المدفوعات عبر التحويل المصرفي." -#: pretix/control/forms/event.py:1207 pretix/control/forms/event.py:1214 +#: pretix/control/forms/event.py:1306 pretix/control/forms/event.py:1313 msgid "" "This will only be used if the invoice is sent to a different email address " "or at a different time than the order confirmation." msgstr "" -#: pretix/control/forms/event.py:1247 +#: pretix/control/forms/event.py:1346 msgid "" "This email will be sent out this many days before the order event starts. If " "the field is empty, the mail will never be sent." @@ -14559,31 +14729,31 @@ msgstr "" "سيتم إرسال هذا البريد الإلكتروني من هذا عدة أيام قبل أن يبدأ الحدث النظام. " "إذا كان الحقل فارغا، لن يتم إرسال البريد." -#: pretix/control/forms/event.py:1251 +#: pretix/control/forms/event.py:1350 #, fuzzy #| msgid "Received order" msgid "Subject for received order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1256 +#: pretix/control/forms/event.py:1355 #, fuzzy #| msgid "Received order" msgid "Text for received order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1261 +#: pretix/control/forms/event.py:1360 #, fuzzy #| msgid "Yes, approve order" msgid "Subject for approved order" msgstr "نعم، والموافقة على النظام" -#: pretix/control/forms/event.py:1266 +#: pretix/control/forms/event.py:1365 #, fuzzy #| msgid "Yes, approve order" msgid "Text for approved order" msgstr "نعم، والموافقة على النظام" -#: pretix/control/forms/event.py:1269 pretix/control/forms/event.py:1287 +#: pretix/control/forms/event.py:1368 pretix/control/forms/event.py:1386 msgid "" "This will only be sent out for non-free orders. Free orders will receive the " "free order template from below instead." @@ -14591,19 +14761,19 @@ msgstr "" "سيتم ارسال هذا للطلبات غير المجانية فقط. وسوف يتلقى أصحاب الطلبات المجانية " "بدلا من ذلك نموذج الطلب المجاني كما هو في الأسفل." -#: pretix/control/forms/event.py:1291 +#: pretix/control/forms/event.py:1390 #, fuzzy #| msgid "Approved free order" msgid "Subject for approved free order" msgstr "طلب مجاني معتمد" -#: pretix/control/forms/event.py:1296 +#: pretix/control/forms/event.py:1395 #, fuzzy #| msgid "Approved free order" msgid "Text for approved free order" msgstr "طلب مجاني معتمد" -#: pretix/control/forms/event.py:1299 pretix/control/forms/event.py:1317 +#: pretix/control/forms/event.py:1398 pretix/control/forms/event.py:1416 msgid "" "This will only be sent out for free orders. Non-free orders will receive the " "non-free order template from above instead." @@ -14611,103 +14781,103 @@ msgstr "" "سيتم ارسال هذا إلى الطلبات المجانية فقط. سيستلم أصحاب الطلبات غير المجانية " "نموذج الطلب غير المجاني كما هو في الأعلى." -#: pretix/control/forms/event.py:1321 +#: pretix/control/forms/event.py:1420 #, fuzzy #| msgid "Received order" msgid "Subject for denied order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1326 +#: pretix/control/forms/event.py:1425 #, fuzzy #| msgid "Denied order" msgid "Text for denied order" msgstr "أمر مرفوض" -#: pretix/control/forms/event.py:1421 +#: pretix/control/forms/event.py:1520 #, fuzzy #| msgid "Ticket code" msgid "Ticket code generator" msgstr "إنشاء رمز التذكرة" -#: pretix/control/forms/event.py:1422 +#: pretix/control/forms/event.py:1521 msgid "For advanced users, usually does not need to be changed." msgstr "" -#: pretix/control/forms/event.py:1479 +#: pretix/control/forms/event.py:1578 msgid "Any country" msgstr "أي بلد" -#: pretix/control/forms/event.py:1480 +#: pretix/control/forms/event.py:1579 msgid "European Union" msgstr "الإتحاد الأوربي" -#: pretix/control/forms/event.py:1506 +#: pretix/control/forms/event.py:1605 msgid "Any customer" msgstr "أي زبون" -#: pretix/control/forms/event.py:1507 +#: pretix/control/forms/event.py:1606 msgid "Individual" msgstr "فرد" -#: pretix/control/forms/event.py:1508 +#: pretix/control/forms/event.py:1607 msgid "Business" msgstr "اعمال" -#: pretix/control/forms/event.py:1509 +#: pretix/control/forms/event.py:1608 msgid "Business with valid VAT ID" msgstr "العمل مع معرف الضريبة على القيمة المضافة" -#: pretix/control/forms/event.py:1515 +#: pretix/control/forms/event.py:1614 msgid "Charge VAT" msgstr "تكلفة ضريبة القيمة المضافة" -#: pretix/control/forms/event.py:1517 +#: pretix/control/forms/event.py:1616 msgid "No VAT" msgstr "لا ضريبه للقيمه المضافه" -#: pretix/control/forms/event.py:1518 +#: pretix/control/forms/event.py:1617 msgid "Sale not allowed" msgstr "غير مسموح بالبيع" -#: pretix/control/forms/event.py:1519 +#: pretix/control/forms/event.py:1618 #, fuzzy #| msgid "New order requires approval" msgid "Order requires approval" msgstr "طلب جديد يتطلب الموافقة." -#: pretix/control/forms/event.py:1524 +#: pretix/control/forms/event.py:1623 #, fuzzy #| msgid "Default price" msgid "Default tax code" msgstr "السعر الافتراضي" -#: pretix/control/forms/event.py:1528 +#: pretix/control/forms/event.py:1627 pretix/control/forms/event.py:1631 #, fuzzy #| msgid "Sales tax rate" msgid "Deviating tax rate" msgstr "معدل ضريبة المبيعات" -#: pretix/control/forms/event.py:1533 pretix/control/forms/event.py:1537 +#: pretix/control/forms/event.py:1635 pretix/control/forms/event.py:1639 msgid "Text on invoice" msgstr "النص على الفاتورة" -#: pretix/control/forms/event.py:1557 +#: pretix/control/forms/event.py:1659 msgid "" "A combination of this calculation mode with a non-zero tax rate does not " "make sense." msgstr "" -#: pretix/control/forms/event.py:1562 pretix/control/forms/event.py:1566 +#: pretix/control/forms/event.py:1664 pretix/control/forms/event.py:1668 #, fuzzy #| msgid "This combination of credentials is not known to our system." msgid "This combination of calculation mode and tax code does not make sense." msgstr "مجموعة بيانات الاعتماد هذه غير معروفة لدى نظامنا." -#: pretix/control/forms/event.py:1631 +#: pretix/control/forms/event.py:1733 msgid "Pre-selected voucher" msgstr "قسيمة المختارة مسبقا" -#: pretix/control/forms/event.py:1633 +#: pretix/control/forms/event.py:1735 msgid "" "If set, the widget will show products as if this voucher has been entered " "and when a product is bought via the widget, this voucher will be used. This " @@ -14718,11 +14888,11 @@ msgstr "" "شراء المنتج عن طريق القطعة، سيتم استخدام هذه القسائم. يمكن استخدام هذا يمكن " "على سبيل المثال لتوفير الحاجيات التي تعطي تخفيض أو إلغاء المنتجات سرية." -#: pretix/control/forms/event.py:1638 +#: pretix/control/forms/event.py:1740 msgid "Compatibility mode" msgstr "وضع التوافق" -#: pretix/control/forms/event.py:1640 +#: pretix/control/forms/event.py:1742 msgid "" "Our regular widget doesn't work in all website builders. If you run into " "trouble, try using this compatibility mode." @@ -14730,28 +14900,28 @@ msgstr "" "لا تعمل لدينا القطعة العادية في جميع بناة الموقع. إذا واجهت مشكلة، حاول " "استخدام هذا الوضع التوافق." -#: pretix/control/forms/event.py:1661 +#: pretix/control/forms/event.py:1763 msgid "The given voucher code does not exist." msgstr "لا وجود رمز قسيمة معين." -#: pretix/control/forms/event.py:1668 pretix/control/forms/organizer.py:112 +#: pretix/control/forms/event.py:1770 pretix/control/forms/organizer.py:112 #: pretix/control/views/shredder.py:179 msgid "The slug you entered was not correct." msgstr "وكانت سبيكة التي أدخلتها غير صحيحة." -#: pretix/control/forms/event.py:1703 +#: pretix/control/forms/event.py:1805 msgid "Ticket downloads" msgstr "التنزيلات تذكرة" -#: pretix/control/forms/event.py:1704 +#: pretix/control/forms/event.py:1806 msgid "Your customers will be able to download their tickets in PDF format." msgstr "زبائنك سوف تكون قادرة على تحميل تذاكرهم في شكل PDF." -#: pretix/control/forms/event.py:1708 +#: pretix/control/forms/event.py:1810 msgid "Require all attendees to fill in their names" msgstr "يتطلب من جميع الحضور لملء في أسمائها" -#: pretix/control/forms/event.py:1709 +#: pretix/control/forms/event.py:1811 msgid "" "By default, we will ask for names but not require them. You can turn this " "off completely in the settings." @@ -14759,11 +14929,11 @@ msgstr "" "افتراضيا، ونحن سوف تسأل عن الأسماء ولكن لا تتطلب منهم. يمكنك إيقاف هذا تماما " "في الإعدادات." -#: pretix/control/forms/event.py:1735 +#: pretix/control/forms/event.py:1837 msgid "Payment via Stripe" msgstr "الدفع عن طريق الشريط" -#: pretix/control/forms/event.py:1736 +#: pretix/control/forms/event.py:1838 msgid "" "Stripe is an online payments processor supporting credit cards and lots of " "other payment options. To accept payments via Stripe, you will need to set " @@ -14774,11 +14944,11 @@ msgstr "" "خيارات الدفع الأخرى. لقبول الدفع عن طريق الشريط، وسوف تحتاج إلى إعداد حساب " "معهم، والتي تأخذ أقل من خمس دقائق باستخدام واجهة بسيطة بهم." -#: pretix/control/forms/event.py:1742 +#: pretix/control/forms/event.py:1844 msgid "Payment by bank transfer" msgstr "الدفع عن طريق التحويل المصرفي" -#: pretix/control/forms/event.py:1743 +#: pretix/control/forms/event.py:1845 msgid "" "Your customers will be instructed to wire the money to your account. You can " "then import your bank statements to process the payments within pretix, or " @@ -14788,16 +14958,16 @@ msgstr "" "المصرفية الخاصة بك لمعالجة المدفوعات في غضون pretix، أو وضع علامة عليها كما " "تدفع يدويا." -#: pretix/control/forms/event.py:1782 +#: pretix/control/forms/event.py:1888 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:45 msgid "Price (optional)" msgstr "السعر (اختياري)" -#: pretix/control/forms/event.py:1787 +#: pretix/control/forms/event.py:1893 msgid "Free" msgstr "حر" -#: pretix/control/forms/event.py:1792 +#: pretix/control/forms/event.py:1898 msgid "Quantity available" msgstr "الكمية متاحة" @@ -15596,20 +15766,20 @@ msgid "" "plugins. This will be publicly available. Make sure to keep it up to date!" msgstr "" -#: pretix/control/forms/item.py:98 +#: pretix/control/forms/item.py:99 #, fuzzy #| msgid "Products in this category are add-on products" msgid "" "Products in this category are regular products displayed on the front page." msgstr "المنتجات في هذه الفئة هي منتجات إضافية" -#: pretix/control/forms/item.py:101 +#: pretix/control/forms/item.py:102 #, fuzzy #| msgid "Product category" msgid "Add-on product category" msgstr "فئة المنتج" -#: pretix/control/forms/item.py:102 +#: pretix/control/forms/item.py:103 #, fuzzy #| msgid "Products in this category are add-on products" msgid "" @@ -15617,43 +15787,43 @@ msgid "" "ons." msgstr "المنتجات في هذه الفئة هي منتجات إضافية" -#: pretix/control/forms/item.py:106 +#: pretix/control/forms/item.py:107 msgid "" "Products in this category are regular products, but are only shown in the " "cross-selling step, according to the configuration below." msgstr "" -#: pretix/control/forms/item.py:111 +#: pretix/control/forms/item.py:112 msgid "" "Products in this category are regular products displayed on the front page, " "but are additionally shown in the cross-selling step, according to the " "configuration below." msgstr "" -#: pretix/control/forms/item.py:140 pretix/control/forms/item.py:216 +#: pretix/control/forms/item.py:141 pretix/control/forms/item.py:217 msgid "This field is required" msgstr "هذه الخانة مطلوبه" -#: pretix/control/forms/item.py:218 +#: pretix/control/forms/item.py:219 msgid "Dependencies between questions are not supported during check-in." msgstr "غير معتمدة تبعيات بين الأسئلة أثناء التسجيل في مكتب الاستقبال." -#: pretix/control/forms/item.py:313 +#: pretix/control/forms/item.py:314 #, fuzzy #| msgid "All products" msgid "No products" msgstr "جميع المنتجات" -#: pretix/control/forms/item.py:353 +#: pretix/control/forms/item.py:354 #: pretix/control/templates/pretixcontrol/items/fragment_quota_availability.html:11 msgid "Unlimited" msgstr "غير محدود" -#: pretix/control/forms/item.py:381 +#: pretix/control/forms/item.py:382 msgid "The product should exist in multiple variations" msgstr "يجب أن تكون موجودة المنتج في أشكال مختلفة" -#: pretix/control/forms/item.py:382 +#: pretix/control/forms/item.py:383 msgid "" "Select this option e.g. for t-shirts that come in multiple sizes. You can " "select the variations in the next step." @@ -15661,72 +15831,72 @@ msgstr "" "حدد هذا الخيار على سبيل المثال للالقمصان التي تأتي في أحجام متعددة. يمكنك " "تحديد الاختلافات في الخطوة التالية." -#: pretix/control/forms/item.py:402 pretix/control/forms/item.py:728 +#: pretix/control/forms/item.py:403 pretix/control/forms/item.py:731 msgid "No category" msgstr "ليس هناك فئة" -#: pretix/control/forms/item.py:410 +#: pretix/control/forms/item.py:411 msgid "Copy product information" msgstr "معلومات عن المنتج نسخة" -#: pretix/control/forms/item.py:419 +#: pretix/control/forms/item.py:420 msgid "No taxation" msgstr "لا ضرائب" -#: pretix/control/forms/item.py:423 +#: pretix/control/forms/item.py:424 msgid "Do not add to a quota now" msgstr "لا تضيف إلى الحصة الآن" -#: pretix/control/forms/item.py:424 +#: pretix/control/forms/item.py:425 msgid "Add product to an existing quota" msgstr "إضافة منتج إلى الحصة الحالية" -#: pretix/control/forms/item.py:425 +#: pretix/control/forms/item.py:426 msgid "Create a new quota for this product" msgstr "إنشاء حصص جديدة لهذا المنتج" -#: pretix/control/forms/item.py:431 +#: pretix/control/forms/item.py:432 msgid "Quota options" msgstr "خيارات الحصص" -#: pretix/control/forms/item.py:439 +#: pretix/control/forms/item.py:440 msgid "Add to existing quota" msgstr "إضافة إلى الحصص الحالية" -#: pretix/control/forms/item.py:448 +#: pretix/control/forms/item.py:449 msgid "New quota name" msgstr "اسم الحصص الجديد" -#: pretix/control/forms/item.py:454 +#: pretix/control/forms/item.py:455 msgid "Size" msgstr "بحجم" -#: pretix/control/forms/item.py:455 +#: pretix/control/forms/item.py:456 msgid "Number of tickets" msgstr "عدد التذاكر" -#: pretix/control/forms/item.py:587 +#: pretix/control/forms/item.py:590 msgid "Quota name is required." msgstr "مطلوب اسم الحصص." -#: pretix/control/forms/item.py:592 +#: pretix/control/forms/item.py:595 msgid "Please select a quota." msgstr "يرجى تحديد الحصص." -#: pretix/control/forms/item.py:614 pretix/plugins/badges/forms.py:85 +#: pretix/control/forms/item.py:617 pretix/plugins/badges/forms.py:85 #: pretix/plugins/ticketoutputpdf/forms.py:55 msgid "(Event default)" msgstr "(الافتراضي الأحداث)" -#: pretix/control/forms/item.py:624 +#: pretix/control/forms/item.py:627 msgid "Choose automatically depending on event settings" msgstr "اختيار تلقائيا اعتمادا على إعدادات الحدث" -#: pretix/control/forms/item.py:625 +#: pretix/control/forms/item.py:628 msgid "Yes, if ticket generation is enabled in general" msgstr "نعم، يتم تمكين إذا الجيل تذكرة في عام" -#: pretix/control/forms/item.py:643 +#: pretix/control/forms/item.py:646 msgid "" "e.g. This reduced price is available for full-time students, jobless and " "people over 65. This ticket includes access to all parts of the event, " @@ -15735,27 +15905,27 @@ msgstr "" "مثلا هذا السعر المخفض متاح للطلاب بدوام كامل، والعاطلين عن العمل والناس على " "65. هذه التذكرة تشمل الوصول إلى جميع أجزاء من هذا الحدث، باستثناء منطقة VIP." -#: pretix/control/forms/item.py:687 +#: pretix/control/forms/item.py:690 msgid "" "This option is deprecated. For new products, use the newer option below that " "refers to another product instead of a quota." msgstr "" -#: pretix/control/forms/item.py:698 pretix/control/forms/item.py:714 +#: pretix/control/forms/item.py:701 pretix/control/forms/item.py:717 msgid "Shown independently of other products" msgstr "" -#: pretix/control/forms/item.py:739 +#: pretix/control/forms/item.py:742 #, fuzzy #| msgid "Canceled by customer" msgid "Date chosen by customer" msgstr "تم الإلغاء من قبل العميل" -#: pretix/control/forms/item.py:748 +#: pretix/control/forms/item.py:751 msgid "No membership granted" msgstr "" -#: pretix/control/forms/item.py:767 +#: pretix/control/forms/item.py:770 #, fuzzy #| msgid "" #| "Gift card products should not be associated with non-zero tax rates since " @@ -15767,20 +15937,20 @@ msgstr "" "يجب ألا ترتبط منتجات بطاقات الهدايا بمعدلات ضريبية غير صفرية حيث سيتم تطبيق " "ضريبة المبيعات عند استرداد بطاقة الهدايا." -#: pretix/control/forms/item.py:773 +#: pretix/control/forms/item.py:776 msgid "" "Do not set a specific validity for gift card products as it will not " "restrict the validity of the gift card. A validity of gift cards can be set " "in your organizer settings." msgstr "" -#: pretix/control/forms/item.py:792 pretix/control/forms/item.py:1059 +#: pretix/control/forms/item.py:795 pretix/control/forms/item.py:1062 msgid "" "If a valid membership is required, at least one valid membership type needs " "to be selected." msgstr "" -#: pretix/control/forms/item.py:803 +#: pretix/control/forms/item.py:806 msgid "" "Your product grants a non-transferable membership and should therefore be a " "personalized admission ticket. Otherwise customers might not be able to use " @@ -15788,19 +15958,19 @@ msgid "" "the membership type to be transferable." msgstr "" -#: pretix/control/forms/item.py:812 +#: pretix/control/forms/item.py:815 #, fuzzy #| msgid "The last payment date cannot be before the end of presale." msgid "The start of validity must be before the end of validity." msgstr "لا يمكن أن يكون تاريخ الدفع الأخير قبل نهاية فترة عرض البيع المسبق." -#: pretix/control/forms/item.py:819 +#: pretix/control/forms/item.py:822 msgid "" "You have selected dynamic validity but have not entered a time period. This " "would render the tickets unusable." msgstr "" -#: pretix/control/forms/item.py:924 +#: pretix/control/forms/item.py:927 #, python-format msgid "" "The variation \"%s\" cannot be deleted because it has already been ordered " @@ -15810,21 +15980,21 @@ msgstr "" "الاختلاف \"%s\" لا يمكن حذفها لأنه قد تم بالفعل أمر بذلك من قبل مستخدم أو " "حاليا هي في عربة المستخدم. الرجاء ضبط التباين بأنه \"غير نشطة\" بدلا من ذلك." -#: pretix/control/forms/item.py:1001 +#: pretix/control/forms/item.py:1004 #, fuzzy #| msgid "Calculate from product" msgid "Use value from product" msgstr "احسب من المنتج" -#: pretix/control/forms/item.py:1086 +#: pretix/control/forms/item.py:1089 msgid "Add-ons" msgstr "إضافات" -#: pretix/control/forms/item.py:1110 +#: pretix/control/forms/item.py:1113 msgid "You added the same add-on category twice" msgstr "لقد قمت بإضافة نفس إضافة على فئة مرتين" -#: pretix/control/forms/item.py:1155 +#: pretix/control/forms/item.py:1158 msgid "" "Be aware that setting a minimal number makes it impossible to buy this " "product if all available add-ons are sold out." @@ -15832,25 +16002,31 @@ msgstr "" "كن على علم أن تحديد أقل عدد ممكن يجعل من المستحيل لشراء هذا المنتج إذا بعت " "كل ما هو متاح من الإضافات بها." -#: pretix/control/forms/item.py:1162 +#: pretix/control/forms/item.py:1165 msgid "Bundled products" msgstr "المنتجات المجمعة" -#: pretix/control/forms/item.py:1212 +#: pretix/control/forms/item.py:1215 msgid "You added the same bundled product twice." msgstr "لقد قمت بإضافة نفس حزمة المنتج مرتين" -#: pretix/control/forms/item.py:1218 +#: pretix/control/forms/item.py:1221 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:23 #: pretix/control/templates/pretixcontrol/item/include_bundles.html:50 msgid "Bundled product" msgstr "المنتجات المجمعة" -#: pretix/control/forms/item.py:1243 pretix/control/forms/orders.py:379 +#: pretix/control/forms/item.py:1246 pretix/control/forms/orders.py:379 #: pretix/control/forms/orders.py:568 msgid "inactive" msgstr "غير نشط" +#: pretix/control/forms/item.py:1331 +#, fuzzy +#| msgid "Printing time" +msgid "Program times" +msgstr "وقت الطباعة" + #: pretix/control/forms/mailsetup.py:42 msgid "Hostname" msgstr "اسم المضيف" @@ -16467,11 +16643,6 @@ msgstr "" msgid "I understand that this is not reversible and want to continue" msgstr "" -#: pretix/control/forms/orders.py:1041 -#: pretix/control/templates/pretixcontrol/shredder/download.html:53 -msgid "Confirmation code" -msgstr "رمز التأكيد" - #: pretix/control/forms/orders.py:1042 msgid "" "We have just emailed you a confirmation code to enter to confirm this action" @@ -16801,7 +16972,7 @@ msgstr "متاحة حتى" msgid "Exclude these dates instead of adding them." msgstr "استبعاد هذه التواريخ بدلا من إضافتها." -#: pretix/control/forms/users.py:122 pretix/control/views/user.py:231 +#: pretix/control/forms/users.py:123 pretix/control/views/user.py:236 msgid "Your changes could not be saved. See below for details." msgstr "لا يمكن حفظ التغييرات. انظر أدناه للحصول على التفاصيل." @@ -17201,7 +17372,7 @@ msgid "The check-in of position #{posid} on list \"{list}\" has been reverted." msgstr "في الاختيار من موقف # {posid} على قائمة \"{list}\" وقد عادت." #: pretix/control/logdisplay.py:353 pretix/control/logdisplay.py:355 -#: pretix/control/logdisplay.py:971 pretix/control/logdisplay.py:973 +#: pretix/control/logdisplay.py:983 pretix/control/logdisplay.py:985 msgid "(unknown)" msgstr "(غير معروف)" @@ -17256,7 +17427,7 @@ msgstr "أكد المستخدم الرسالة التالية: \"{}\"" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "تم رفض الطلب." -#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1567 +#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1572 #: pretix/presale/views/order.py:1072 msgid "The order has been canceled." msgstr "تم إلغاء هذا الأمر." @@ -17297,11 +17468,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:821 +#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:830 msgid "The settings of a payment provider have been changed." msgstr "تم تغيير الإعدادات من مقدم الدفع." -#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:820 +#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:829 msgid "The settings of a ticket output provider have been changed." msgstr "تم تغيير إعدادات مزود الناتج التذاكر." @@ -17348,11 +17519,11 @@ msgstr "تم وضع علامة على الترتيب كما المدفوعة." msgid "The order has been set to require payment before use." msgstr "تم إرسال كود الخصم إلى {recipient}." -#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1572 +#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1577 msgid "The order has been marked as expired." msgstr "تم وضع علامة على النظام ومنتهية الصلاحية." -#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1471 +#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1476 msgid "The order has been marked as paid." msgstr "تم وضع علامة على الترتيب كما المدفوعة." @@ -17364,7 +17535,7 @@ msgstr "تم حذف طلب الإلغاء." msgid "The order has been refunded." msgstr "وقد تم ترتيب ردها." -#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1888 +#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1912 msgid "The order has been reactivated." msgstr "تم إعادة تنشيط الطلب." @@ -17376,7 +17547,7 @@ msgstr "تم إنشاء هذا الأمر." msgid "The order requires approval before it can continue to be processed." msgstr "الأمر يتطلب موافقة قبل أن تتمكن من الاستمرار في معالجتها." -#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:791 +#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:796 msgid "The order has been approved." msgstr "تمت الموافقة على النظام." @@ -17413,7 +17584,7 @@ msgstr "تم تغيير حساب العميل." msgid "The order locale has been changed." msgstr "تم تغيير لغة النظام." -#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1611 +#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1616 #: pretix/presale/views/order.py:745 pretix/presale/views/order.py:825 msgid "The invoice has been generated." msgstr "تم إنشاء الفاتورة." @@ -17424,11 +17595,11 @@ msgstr "تم إنشاء الفاتورة." msgid "The invoice could not be generated." msgstr "تم إنشاء الفاتورة." -#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1684 +#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1689 msgid "The invoice has been regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1746 +#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1751 #: pretix/presale/views/order.py:845 msgid "The invoice has been reissued." msgstr "تم إعادة إصدار الفاتورة." @@ -17492,8 +17663,8 @@ msgstr "وقد بدأ دفعة جديدة {local_id} بدلا من سابقته msgid "An unidentified type email has been sent." msgstr "تم ارسال نوع البريد الإلكتروني مجهول." -#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:723 -#: pretix/control/logdisplay.py:729 pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:738 pretix/control/logdisplay.py:766 msgid "Sending of an email has failed." msgstr "ارسال بريد الكتروني قد فشلت." @@ -17621,844 +17792,883 @@ msgid "The voucher has been deleted." msgstr "تم حذف قسيمة." #: pretix/control/logdisplay.py:585 +#, fuzzy +#| msgid "The selected voucher has been deleted." +msgid "Cart positions including the voucher have been deleted." +msgstr "تم حذف قسيمة المحدد." + +#: pretix/control/logdisplay.py:586 #, fuzzy, python-brace-format #| msgid "A voucher has been sent to a person on the waiting list." msgid "The voucher has been assigned to {email} through the waiting list." msgstr "تم إرسال قسيمة لشخص على قائمة الانتظار." -#: pretix/control/logdisplay.py:594 +#: pretix/control/logdisplay.py:595 #, python-brace-format msgid "The voucher has been redeemed in order {order_code}." msgstr "تم استبدال القسيمة من أجل {order_code}." -#: pretix/control/logdisplay.py:609 +#: pretix/control/logdisplay.py:610 msgid "The category has been added." msgstr "تمت إضافة فئة." -#: pretix/control/logdisplay.py:610 +#: pretix/control/logdisplay.py:611 msgid "The category has been deleted." msgstr "تم حذف الفئة." -#: pretix/control/logdisplay.py:611 +#: pretix/control/logdisplay.py:612 msgid "The category has been changed." msgstr "تم تغيير الفئة." -#: pretix/control/logdisplay.py:612 +#: pretix/control/logdisplay.py:613 #, fuzzy #| msgid "The category has been deleted." msgid "The category has been reordered." msgstr "تم حذف الفئة." -#: pretix/control/logdisplay.py:619 +#: pretix/control/logdisplay.py:620 msgid "The tax rule has been added." msgstr "تمت إضافة القاعدة الضريبية." -#: pretix/control/logdisplay.py:620 +#: pretix/control/logdisplay.py:621 msgid "The tax rule has been deleted." msgstr "تم حذف حكم الضرائب." -#: pretix/control/logdisplay.py:621 +#: pretix/control/logdisplay.py:622 msgid "The tax rule has been changed." msgstr "تم تغيير القاعدة الضريبية." -#: pretix/control/logdisplay.py:633 +#: pretix/control/logdisplay.py:634 #, python-brace-format msgid "{user} has been added to the team." msgstr "{user} قد أضيفت إلى الفريق." -#: pretix/control/logdisplay.py:634 +#: pretix/control/logdisplay.py:635 #, python-brace-format msgid "{user} has been removed from the team." msgstr "{user} تمت إزالته من الفريق." -#: pretix/control/logdisplay.py:635 +#: pretix/control/logdisplay.py:636 #, python-brace-format msgid "{user} has been invited to the team." msgstr "{user} وقد وجهت الدعوة للفريق." -#: pretix/control/logdisplay.py:636 +#: pretix/control/logdisplay.py:637 #, python-brace-format msgid "Invite for {user} has been resent." msgstr "دعوة ل{user} لديه كان يستاء." -#: pretix/control/logdisplay.py:647 +#: pretix/control/logdisplay.py:648 #, python-brace-format msgid "{user} has joined the team using the invite sent to {email}." msgstr "{user} انضم إلى الفريق باستخدام دعوة إرسالها إلى {email}." -#: pretix/control/logdisplay.py:657 +#: pretix/control/logdisplay.py:658 msgid "Your account settings have been changed." msgstr "تم تغيير إعدادات حسابك." -#: pretix/control/logdisplay.py:660 pretix/control/views/user.py:253 +#: pretix/control/logdisplay.py:661 pretix/control/views/user.py:957 #, python-brace-format msgid "Your email address has been changed to {email}." msgstr "تم تغيير عنوان البريد الإلكتروني الخاص بك إلى {email}." -#: pretix/control/logdisplay.py:662 pretix/control/views/user.py:250 +#: pretix/control/logdisplay.py:663 pretix/control/views/user.py:847 msgid "Your password has been changed." msgstr "تم تغيير كلمة السر الخاصة بك." -#: pretix/control/logdisplay.py:664 +#: pretix/control/logdisplay.py:665 msgid "Your account has been enabled." msgstr "تم تمكين حسابك." -#: pretix/control/logdisplay.py:666 +#: pretix/control/logdisplay.py:667 msgid "Your account has been disabled." msgstr "تم تعطيل حسابك." -#: pretix/control/logdisplay.py:676 +#: pretix/control/logdisplay.py:672 +#, fuzzy, python-brace-format +#| msgid "" +#| "The email address has been changed from \"{old_email}\" to \"{new_email}" +#| "\"." +msgid "Your email address has been changed from {old_email} to {email}." +msgstr "" +"تم تغيير عنوان البريد الإلكتروني من \"{old_email}\" إلى \"{new_email}\"." + +#: pretix/control/logdisplay.py:673 +#, fuzzy, python-brace-format +#| msgid "Your email address has been updated." +msgid "Your email address {email} has been confirmed." +msgstr "تم تحديث عنوان بريدك الإلكتروني." + +#: pretix/control/logdisplay.py:685 #, python-brace-format msgid "You impersonated {}." msgstr "كنت انتحاله {}." -#: pretix/control/logdisplay.py:677 +#: pretix/control/logdisplay.py:686 #, python-brace-format msgid "You stopped impersonating {}." msgstr "قمت بإيقاف انتحال {}." -#: pretix/control/logdisplay.py:684 +#: pretix/control/logdisplay.py:693 msgid "This object has been created by cloning." msgstr "تم إنشاء هذا الكائن عبر النسخ." -#: pretix/control/logdisplay.py:685 +#: pretix/control/logdisplay.py:694 msgid "The organizer has been changed." msgstr "تم تغيير المنظم." -#: pretix/control/logdisplay.py:686 +#: pretix/control/logdisplay.py:695 msgid "The organizer settings have been changed." msgstr "تم تغيير إعدادات المنظم." -#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:828 +#: pretix/control/logdisplay.py:696 pretix/control/logdisplay.py:837 #, fuzzy #| msgid "The order details have been changed." msgid "The footer links have been changed." msgstr "تم تغيير تفاصيل النظام." -#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 +#: pretix/control/logdisplay.py:697 pretix/control/logdisplay.py:744 #, fuzzy #| msgid "The quota has been added." msgid "A scheduled export has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 +#: pretix/control/logdisplay.py:698 pretix/control/logdisplay.py:745 #, fuzzy #| msgid "The product has been changed." msgid "A scheduled export has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 +#: pretix/control/logdisplay.py:699 pretix/control/logdisplay.py:746 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 +#: pretix/control/logdisplay.py:700 pretix/control/logdisplay.py:747 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been executed." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:692 pretix/control/logdisplay.py:739 +#: pretix/control/logdisplay.py:701 pretix/control/logdisplay.py:748 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" -#: pretix/control/logdisplay.py:693 +#: pretix/control/logdisplay.py:702 msgid "Gift card acceptance for another organizer has been added." msgstr "تم إضافة قبول بطاقة الهدية لمنظم آخر." -#: pretix/control/logdisplay.py:694 +#: pretix/control/logdisplay.py:703 msgid "Gift card acceptance for another organizer has been removed." msgstr "تم إزالة قبول بطاقة هدية لمنظم آخر." -#: pretix/control/logdisplay.py:695 +#: pretix/control/logdisplay.py:704 #, fuzzy #| msgid "The gift card has been created." msgid "A new gift card acceptor has been invited." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:696 +#: pretix/control/logdisplay.py:705 #, fuzzy #| msgid "The gift card has been created." msgid "A gift card acceptor has been removed." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:697 +#: pretix/control/logdisplay.py:706 #, fuzzy #| msgid "The selected gift card issuer has been removed." msgid "A gift card issuer has been removed or declined." msgstr "تمت إزالة مصدر البطاقة هدية المحدد." -#: pretix/control/logdisplay.py:698 +#: pretix/control/logdisplay.py:707 #, fuzzy #| msgid "The selected gift card issuer has been added." msgid "A new gift card issuer has been accepted." msgstr "تمت إضافة مصدر البطاقة هدية المحدد." -#: pretix/control/logdisplay.py:699 +#: pretix/control/logdisplay.py:708 msgid "The webhook has been created." msgstr "تم إنشاء خطاف الويب." -#: pretix/control/logdisplay.py:700 +#: pretix/control/logdisplay.py:709 msgid "The webhook has been changed." msgstr "تم تغيير خطاف الويب." -#: pretix/control/logdisplay.py:701 +#: pretix/control/logdisplay.py:710 msgid "The webhook call retry jobs have been manually expedited." msgstr "" -#: pretix/control/logdisplay.py:702 +#: pretix/control/logdisplay.py:711 #, fuzzy #| msgid "The webhook has been created." msgid "The webhook call retry jobs have been dropped." msgstr "تم إنشاء خطاف الويب." -#: pretix/control/logdisplay.py:703 +#: pretix/control/logdisplay.py:712 #, fuzzy #| msgid "The order has been created." msgid "The SSO provider has been created." msgstr "تم إنشاء هذا الأمر." -#: pretix/control/logdisplay.py:704 +#: pretix/control/logdisplay.py:713 #, fuzzy #| msgid "The order has been changed." msgid "The SSO provider has been changed." msgstr "تم تغيير النظام." -#: pretix/control/logdisplay.py:705 +#: pretix/control/logdisplay.py:714 #, fuzzy #| msgid "The order has been deleted." msgid "The SSO provider has been deleted." msgstr "تم حذف هذا الأمر." -#: pretix/control/logdisplay.py:706 +#: pretix/control/logdisplay.py:715 #, fuzzy #| msgid "The event has been created." msgid "The SSO client has been created." msgstr "تم إنشاء هذا الحدث." -#: pretix/control/logdisplay.py:707 +#: pretix/control/logdisplay.py:716 #, fuzzy #| msgid "The account has been changed." msgid "The SSO client has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:708 +#: pretix/control/logdisplay.py:717 #, fuzzy #| msgid "The event has been deleted." msgid "The SSO client has been deleted." msgstr "الحدث تم الغائه." -#: pretix/control/logdisplay.py:709 pretix/control/views/organizer.py:2632 +#: pretix/control/logdisplay.py:718 pretix/control/views/organizer.py:2632 msgid "The membership type has been created." msgstr "تم انشاء نوع العضوية." -#: pretix/control/logdisplay.py:710 +#: pretix/control/logdisplay.py:719 msgid "The membership type has been changed." msgstr "تم تغيير نوع العضوية." -#: pretix/control/logdisplay.py:711 +#: pretix/control/logdisplay.py:720 msgid "The membership type has been deleted." msgstr "تم حذف نوع العضوية." -#: pretix/control/logdisplay.py:712 pretix/control/views/organizer.py:3472 +#: pretix/control/logdisplay.py:721 pretix/control/views/organizer.py:3472 #, fuzzy #| msgctxt "subevent" #| msgid "The new date has been created." msgid "The sales channel has been created." msgstr "تم إنشاء الموعد الجديد." -#: pretix/control/logdisplay.py:713 +#: pretix/control/logdisplay.py:722 #, fuzzy #| msgid "The device has been changed." msgid "The sales channel has been changed." msgstr "تم تغيير الجهاز." -#: pretix/control/logdisplay.py:714 +#: pretix/control/logdisplay.py:723 #, fuzzy #| msgid "The selected list has been deleted." msgid "The sales channel has been deleted." msgstr "تم حذف القائمة المحددة." -#: pretix/control/logdisplay.py:715 +#: pretix/control/logdisplay.py:724 msgid "The account has been created." msgstr "تم إنشاء الحساب." -#: pretix/control/logdisplay.py:716 +#: pretix/control/logdisplay.py:725 msgid "The account has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:717 +#: pretix/control/logdisplay.py:726 msgid "A membership for this account has been added." msgstr "تم إضافة عضوية لهذا الحساب." -#: pretix/control/logdisplay.py:718 +#: pretix/control/logdisplay.py:727 msgid "A membership of this account has been changed." msgstr "تم تغيير العضوية لهذا الحساب." -#: pretix/control/logdisplay.py:719 +#: pretix/control/logdisplay.py:728 msgid "A membership of this account has been deleted." msgstr "تم حذف عضوية هذا الحساب." -#: pretix/control/logdisplay.py:720 +#: pretix/control/logdisplay.py:729 #, fuzzy #| msgid "Your account has been disabled." msgid "The account has been disabled and anonymized." msgstr "تم تعطيل الحساب وأصبح مجهول المصدر." -#: pretix/control/logdisplay.py:721 +#: pretix/control/logdisplay.py:730 msgid "A new password has been requested." msgstr "تم طلب تعيين كلمة المرور جديدة." -#: pretix/control/logdisplay.py:722 +#: pretix/control/logdisplay.py:731 msgid "A new password has been set." msgstr "تم تعيين كلمة المرور جديدة." -#: pretix/control/logdisplay.py:724 +#: pretix/control/logdisplay.py:733 #, fuzzy #| msgid "The team has been created." msgid "The reusable medium has been created." msgstr "تم إنشاء فريق." -#: pretix/control/logdisplay.py:725 +#: pretix/control/logdisplay.py:734 #, fuzzy #| msgid "The payment has been created successfully." msgid "The reusable medium has been created automatically." msgstr "تم إنشاء دفع بنجاح." -#: pretix/control/logdisplay.py:726 +#: pretix/control/logdisplay.py:735 #, fuzzy #| msgid "The tax rule has been changed." msgid "The reusable medium has been changed." msgstr "تم تغيير القاعدة الضريبية." -#: pretix/control/logdisplay.py:727 +#: pretix/control/logdisplay.py:736 #, fuzzy #| msgid "The email has been queued to be sent." msgid "The medium has been connected to a new ticket." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/logdisplay.py:728 +#: pretix/control/logdisplay.py:737 #, fuzzy #| msgid "The email has been queued to be sent." msgid "The medium has been connected to a new gift card." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/logdisplay.py:730 +#: pretix/control/logdisplay.py:739 msgid "The event's internal comment has been updated." msgstr "تم تحديث التعليق الداخلي للحدث." -#: pretix/control/logdisplay.py:731 +#: pretix/control/logdisplay.py:740 msgid "The event has been canceled." msgstr "تم إلغاء الفعالية." -#: pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:741 msgid "An event has been deleted." msgstr "تم حذف فعالية." -#: pretix/control/logdisplay.py:733 +#: pretix/control/logdisplay.py:742 msgid "A removal process for personal data has been started." msgstr "" -#: pretix/control/logdisplay.py:734 +#: pretix/control/logdisplay.py:743 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:740 +#: pretix/control/logdisplay.py:749 msgid "The user has been created." msgstr "تم إنشاء المستخدم." -#: pretix/control/logdisplay.py:741 +#: pretix/control/logdisplay.py:750 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:490 -#: pretix/control/views/user.py:550 pretix/control/views/user.py:609 +#: pretix/control/logdisplay.py:752 pretix/control/views/user.py:477 +#: pretix/control/views/user.py:537 pretix/control/views/user.py:596 msgid "Two-factor authentication has been enabled." msgstr "تم تمكين مصادقة اثنين عامل." -#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:393 -#: pretix/control/views/user.py:625 +#: pretix/control/logdisplay.py:753 pretix/control/views/user.py:380 +#: pretix/control/views/user.py:612 msgid "Two-factor authentication has been disabled." msgstr "تم تعطيل المصادقة اثنين عامل." -#: pretix/control/logdisplay.py:745 pretix/control/views/user.py:642 +#: pretix/control/logdisplay.py:754 pretix/control/views/user.py:629 msgid "Your two-factor emergency codes have been regenerated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:746 +#: pretix/control/logdisplay.py:755 #, fuzzy #| msgid "Your two-factor emergency codes have been regenerated." msgid "A two-factor emergency code has been generated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:747 +#: pretix/control/logdisplay.py:756 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "A اثنين عامل جهاز التوثيق جديد \"{name}\" قد أضيفت إلى حسابك." -#: pretix/control/logdisplay.py:749 +#: pretix/control/logdisplay.py:758 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "الجهاز اثنين عامل التوثيق \"{name}\" تمت إزالة من حسابك." -#: pretix/control/logdisplay.py:751 +#: pretix/control/logdisplay.py:760 msgid "Notifications have been enabled." msgstr "تم تمكين الإشعارات." -#: pretix/control/logdisplay.py:752 +#: pretix/control/logdisplay.py:761 msgid "Notifications have been disabled." msgstr "تم تعطيل الإشعارات." -#: pretix/control/logdisplay.py:753 +#: pretix/control/logdisplay.py:762 msgid "Your notification settings have been changed." msgstr "تم تغيير إعدادات الإشعار." -#: pretix/control/logdisplay.py:754 +#: pretix/control/logdisplay.py:763 msgid "This user has been anonymized." msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:767 msgid "Password reset mail sent." msgstr "إرسال كلمة المرور الإلكتروني إعادة تعيين." -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:768 msgid "The password has been reset." msgstr "وقد تم إعادة تعيين كلمة المرور." -#: pretix/control/logdisplay.py:760 +#: pretix/control/logdisplay.py:769 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:762 +#: pretix/control/logdisplay.py:771 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "منظم \"{name}\" تم حذفها." -#: pretix/control/logdisplay.py:763 pretix/control/logdisplay.py:989 +#: pretix/control/logdisplay.py:772 pretix/control/logdisplay.py:1001 msgid "A voucher has been sent to a person on the waiting list." msgstr "تم إرسال قسيمة لشخص على قائمة الانتظار." -#: pretix/control/logdisplay.py:764 +#: pretix/control/logdisplay.py:773 #, fuzzy #| msgid "An entry has been added to the waiting list." msgid "An entry has been transferred to another waiting list." msgstr "تمت إضافة إدخال إلى قائمة الانتظار." -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:774 msgid "The team has been created." msgstr "تم إنشاء فريق." -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:775 msgid "The team settings have been changed." msgstr "تم تغيير إعدادات الفريق." -#: pretix/control/logdisplay.py:767 +#: pretix/control/logdisplay.py:776 msgid "The team has been deleted." msgstr "تم حذف الفريق." -#: pretix/control/logdisplay.py:768 pretix/control/views/organizer.py:2298 +#: pretix/control/logdisplay.py:777 pretix/control/views/organizer.py:2298 msgid "The gate has been created." msgstr "تم إنشاء البوابة." -#: pretix/control/logdisplay.py:769 +#: pretix/control/logdisplay.py:778 msgid "The gate has been changed." msgstr "تم تغيير البوابة." -#: pretix/control/logdisplay.py:770 +#: pretix/control/logdisplay.py:779 msgid "The gate has been deleted." msgstr "تم حذف البوابة." -#: pretix/control/logdisplay.py:771 +#: pretix/control/logdisplay.py:780 msgctxt "subevent" msgid "The event date has been deleted." msgstr "تم حذف تاريخ الحدث." -#: pretix/control/logdisplay.py:772 +#: pretix/control/logdisplay.py:781 msgctxt "subevent" msgid "The event date has been canceled." msgstr "تم تغيير تاريخ الفعالية." -#: pretix/control/logdisplay.py:773 +#: pretix/control/logdisplay.py:782 msgctxt "subevent" msgid "The event date has been changed." msgstr "تم تغيير تاريخ الحدث." -#: pretix/control/logdisplay.py:774 +#: pretix/control/logdisplay.py:783 msgctxt "subevent" msgid "The event date has been created." msgstr "تم إنشاء تاريخ الحدث." -#: pretix/control/logdisplay.py:775 +#: pretix/control/logdisplay.py:784 msgctxt "subevent" msgid "A quota has been added to the event date." msgstr "تمت إضافة الحصص لتاريخ الحدث." -#: pretix/control/logdisplay.py:776 +#: pretix/control/logdisplay.py:785 msgctxt "subevent" msgid "A quota has been changed on the event date." msgstr "تم تغيير الحصص في تاريخ الحدث." -#: pretix/control/logdisplay.py:777 +#: pretix/control/logdisplay.py:786 msgctxt "subevent" msgid "A quota has been removed from the event date." msgstr "تمت إزالة حصة من تاريخ الحدث." -#: pretix/control/logdisplay.py:778 +#: pretix/control/logdisplay.py:787 msgid "The device has been created." msgstr "تم إنشاء الجهاز." -#: pretix/control/logdisplay.py:779 +#: pretix/control/logdisplay.py:788 msgid "The device has been changed." msgstr "تم تغيير الجهاز." -#: pretix/control/logdisplay.py:780 +#: pretix/control/logdisplay.py:789 msgid "Access of the device has been revoked." msgstr "تم إبطال الوصول للجهاز." -#: pretix/control/logdisplay.py:781 +#: pretix/control/logdisplay.py:790 msgid "The device has been initialized." msgstr "تم تهيئة الجهاز." -#: pretix/control/logdisplay.py:782 +#: pretix/control/logdisplay.py:791 msgid "The access token of the device has been regenerated." msgstr "تم إعادة إنشاء الوصول رمزية للجهاز." -#: pretix/control/logdisplay.py:783 +#: pretix/control/logdisplay.py:792 msgid "The device has notified the server of an hardware or software update." msgstr "وقد أخطرت جهاز الخادم من تحديث الأجهزة أو البرامج." -#: pretix/control/logdisplay.py:784 +#: pretix/control/logdisplay.py:793 msgid "The gift card has been created." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:785 pretix/control/views/organizer.py:1925 +#: pretix/control/logdisplay.py:794 pretix/control/views/organizer.py:1925 msgid "The gift card has been changed." msgstr "تم تغيير بطاقة الهدية." -#: pretix/control/logdisplay.py:786 +#: pretix/control/logdisplay.py:795 msgid "A manual transaction has been performed." msgstr "تم إجراء عملية يدوية." -#: pretix/control/logdisplay.py:787 +#: pretix/control/logdisplay.py:796 #, python-brace-format msgid "The token \"{name}\" has been created." msgstr "ورمزي \"{name}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:788 +#: pretix/control/logdisplay.py:797 #, python-brace-format msgid "The token \"{name}\" has been revoked." msgstr "ورمزي \"{name}\" تم إبطال." -#: pretix/control/logdisplay.py:789 +#: pretix/control/logdisplay.py:798 #, fuzzy #| msgid "The check-in list has been deleted." msgid "The check-in and print log state has been reset." msgstr "تم حذف الاختيار في القائمة." -#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:805 pretix/control/logdisplay.py:864 #, fuzzy #| msgid "A plugin has been enabled." msgid "The plugin has been enabled." msgstr "تم تمكين البرنامج المساعد." -#: pretix/control/logdisplay.py:797 pretix/control/logdisplay.py:856 +#: pretix/control/logdisplay.py:806 pretix/control/logdisplay.py:865 #: pretix/control/views/event.py:490 pretix/control/views/organizer.py:753 #, fuzzy #| msgid "A plugin has been disabled." msgid "The plugin has been disabled." msgstr "تم تعطيل البرنامج المساعد." -#: pretix/control/logdisplay.py:800 pretix/control/logdisplay.py:859 +#: pretix/control/logdisplay.py:809 pretix/control/logdisplay.py:868 #, fuzzy, python-brace-format #| msgid "Question {val}" msgid "Plugin {val}" msgstr "سؤال{val}" -#: pretix/control/logdisplay.py:815 +#: pretix/control/logdisplay.py:824 #, fuzzy #| msgid "A user has been added to the event team." msgid "A meta property has been added to this event." msgstr "تمت إضافة المستخدم إلى فريق الحدث." -#: pretix/control/logdisplay.py:816 +#: pretix/control/logdisplay.py:825 #, fuzzy #| msgid "A user has been removed from the event team." msgid "A meta property has been removed from this event." msgstr "تمت إزالة مستخدم من فريق الحدث." -#: pretix/control/logdisplay.py:817 +#: pretix/control/logdisplay.py:826 #, fuzzy #| msgctxt "subevent" #| msgid "A quota has been changed on the event date." msgid "A meta property has been changed on this event." msgstr "تم تغيير الحصص في تاريخ الحدث." -#: pretix/control/logdisplay.py:818 +#: pretix/control/logdisplay.py:827 msgid "The event settings have been changed." msgstr "تم تغيير إعدادات الحدث." -#: pretix/control/logdisplay.py:819 +#: pretix/control/logdisplay.py:828 msgid "The ticket download settings have been changed." msgstr "تم تغيير إعدادات تذكرة تنزيل." -#: pretix/control/logdisplay.py:822 +#: pretix/control/logdisplay.py:831 msgid "The shop has been taken live." msgstr "وقد اتخذت المحل الحية." -#: pretix/control/logdisplay.py:823 +#: pretix/control/logdisplay.py:832 msgid "The shop has been taken offline." msgstr "وقد اتخذت المحل حاليا." -#: pretix/control/logdisplay.py:824 +#: pretix/control/logdisplay.py:833 msgid "The shop has been taken into test mode." msgstr "وقد اتخذت المحل في وضع الاختبار." -#: pretix/control/logdisplay.py:825 +#: pretix/control/logdisplay.py:834 msgid "The test mode has been disabled." msgstr "تم تعطيل وضع الاختبار." -#: pretix/control/logdisplay.py:826 +#: pretix/control/logdisplay.py:835 msgid "The event has been created." msgstr "تم إنشاء هذا الحدث." -#: pretix/control/logdisplay.py:827 +#: pretix/control/logdisplay.py:836 msgid "The event details have been changed." msgstr "تم تغيير تفاصيل الفعالية." -#: pretix/control/logdisplay.py:829 +#: pretix/control/logdisplay.py:838 msgid "An answer option has been added to the question." msgstr "تمت إضافة خيار الإجابة على السؤال." -#: pretix/control/logdisplay.py:830 +#: pretix/control/logdisplay.py:839 msgid "An answer option has been removed from the question." msgstr "تمت إزالة خيار الإجابة عن السؤال." -#: pretix/control/logdisplay.py:831 +#: pretix/control/logdisplay.py:840 msgid "An answer option has been changed." msgstr "تم تغيير خيار الإجابة." -#: pretix/control/logdisplay.py:832 +#: pretix/control/logdisplay.py:841 msgid "A user has been added to the event team." msgstr "تمت إضافة المستخدم إلى فريق الحدث." -#: pretix/control/logdisplay.py:833 +#: pretix/control/logdisplay.py:842 msgid "A user has been invited to the event team." msgstr "وقد وجهت الدعوة للمستخدم لفريق الحدث." -#: pretix/control/logdisplay.py:834 +#: pretix/control/logdisplay.py:843 msgid "A user's permissions have been changed." msgstr "تم تغيير الأذونات للمستخدم." -#: pretix/control/logdisplay.py:835 +#: pretix/control/logdisplay.py:844 msgid "A user has been removed from the event team." msgstr "تمت إزالة مستخدم من فريق الحدث." -#: pretix/control/logdisplay.py:842 +#: pretix/control/logdisplay.py:851 msgid "The check-in list has been added." msgstr "تمت إضافة الاختيار في القائمة." -#: pretix/control/logdisplay.py:843 pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:852 pretix/control/logdisplay.py:853 msgid "The check-in list has been deleted." msgstr "تم حذف الاختيار في القائمة." -#: pretix/control/logdisplay.py:845 +#: pretix/control/logdisplay.py:854 msgid "The check-in list has been changed." msgstr "تم تغيير الاختيار في القائمة." -#: pretix/control/logdisplay.py:848 +#: pretix/control/logdisplay.py:857 #, fuzzy, python-brace-format #| msgid "Check-in list" msgid "Check-in list {val}" msgstr "تحقق في قائمة" -#: pretix/control/logdisplay.py:875 +#: pretix/control/logdisplay.py:884 msgid "The product has been created." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:885 msgid "The product has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:877 +#: pretix/control/logdisplay.py:886 #, fuzzy #| msgid "The product has been created." msgid "The product has been reordered." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:878 +#: pretix/control/logdisplay.py:887 msgid "The product has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:879 +#: pretix/control/logdisplay.py:888 msgid "An add-on has been added to this product." msgstr "تمت إضافة وظيفة إضافية على هذا المنتج." -#: pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:889 msgid "An add-on has been removed from this product." msgstr "تمت إزالة وظيفة إضافية على من هذا المنتج." -#: pretix/control/logdisplay.py:881 +#: pretix/control/logdisplay.py:890 msgid "An add-on has been changed on this product." msgstr "تم تغيير وظيفة إضافية على على هذا المنتج." -#: pretix/control/logdisplay.py:882 +#: pretix/control/logdisplay.py:891 msgid "A bundled item has been added to this product." msgstr "تمت إضافة بند المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:883 +#: pretix/control/logdisplay.py:892 msgid "A bundled item has been removed from this product." msgstr "تمت إزالة عنصر المجمعة من هذا المنتج." -#: pretix/control/logdisplay.py:884 +#: pretix/control/logdisplay.py:893 msgid "A bundled item has been changed on this product." msgstr "تم تغيير عنصر المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:891 +#: pretix/control/logdisplay.py:894 +#, fuzzy +#| msgid "An add-on has been added to this product." +msgid "A program time has been added to this product." +msgstr "تمت إضافة وظيفة إضافية على هذا المنتج." + +#: pretix/control/logdisplay.py:895 +#, fuzzy +#| msgid "An add-on has been changed on this product." +msgid "A program time has been changed on this product." +msgstr "تم تغيير وظيفة إضافية على على هذا المنتج." + +#: pretix/control/logdisplay.py:896 +#, fuzzy +#| msgid "An add-on has been removed from this product." +msgid "A program time has been removed from this product." +msgstr "تمت إزالة وظيفة إضافية على من هذا المنتج." + +#: pretix/control/logdisplay.py:903 #, python-brace-format msgid "The variation \"{value}\" has been created." msgstr "الاختلاف \"{value}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:892 +#: pretix/control/logdisplay.py:904 #, python-brace-format msgid "The variation \"{value}\" has been deleted." msgstr "الاختلاف \"{value}\" تم حذفها." -#: pretix/control/logdisplay.py:893 +#: pretix/control/logdisplay.py:905 #, python-brace-format msgid "The variation \"{value}\" has been changed." msgstr "الاختلاف \"{value}\" تم تغيير." -#: pretix/control/logdisplay.py:910 +#: pretix/control/logdisplay.py:922 #, python-brace-format msgid "Payment {local_id} has been confirmed." msgstr "وقد تم تأكيد الدفع {local_id}." -#: pretix/control/logdisplay.py:911 +#: pretix/control/logdisplay.py:923 #, python-brace-format msgid "Payment {local_id} has been canceled." msgstr "تم إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:912 +#: pretix/control/logdisplay.py:924 #, python-brace-format msgid "Canceling payment {local_id} has failed." msgstr "فشل إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:913 +#: pretix/control/logdisplay.py:925 #, python-brace-format msgid "Payment {local_id} has been started." msgstr "وقد بدأ الدفع {local_id}." -#: pretix/control/logdisplay.py:914 +#: pretix/control/logdisplay.py:926 #, python-brace-format msgid "Payment {local_id} has failed." msgstr "فشلت الدفع {local_id}." -#: pretix/control/logdisplay.py:915 +#: pretix/control/logdisplay.py:927 #, python-brace-format msgid "The order could not be marked as paid: {message}" msgstr "لا يمكن أن تكون وضعت النظام كما المدفوعة: {message}" -#: pretix/control/logdisplay.py:916 +#: pretix/control/logdisplay.py:928 msgid "The order has been overpaid." msgstr "وقد تم ترتيب زائدة." -#: pretix/control/logdisplay.py:917 +#: pretix/control/logdisplay.py:929 #, python-brace-format msgid "Refund {local_id} has been created." msgstr "تم إنشاء استرداد {local_id}." -#: pretix/control/logdisplay.py:918 +#: pretix/control/logdisplay.py:930 #, python-brace-format msgid "Refund {local_id} has been created by an external entity." msgstr "تم إنشاء استرداد {local_id} كيان خارجي." -#: pretix/control/logdisplay.py:919 +#: pretix/control/logdisplay.py:931 msgid "The customer requested you to issue a refund." msgstr "طلب لك العملاء لإصدار رد." -#: pretix/control/logdisplay.py:920 +#: pretix/control/logdisplay.py:932 #, python-brace-format msgid "Refund {local_id} has been completed." msgstr "وقد تم الانتهاء استرداد {local_id}." -#: pretix/control/logdisplay.py:921 +#: pretix/control/logdisplay.py:933 #, python-brace-format msgid "Refund {local_id} has been canceled." msgstr "تم إلغاء استرداد {local_id}." -#: pretix/control/logdisplay.py:922 +#: pretix/control/logdisplay.py:934 #, python-brace-format msgid "Refund {local_id} has failed." msgstr "فشل استرداد {local_id}." -#: pretix/control/logdisplay.py:929 +#: pretix/control/logdisplay.py:941 msgid "The quota has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:930 +#: pretix/control/logdisplay.py:942 msgid "The quota has been deleted." msgstr "تم حذف الحصص." -#: pretix/control/logdisplay.py:931 +#: pretix/control/logdisplay.py:943 msgid "The quota has been changed." msgstr "تم تغيير الحصص." -#: pretix/control/logdisplay.py:932 +#: pretix/control/logdisplay.py:944 msgid "The quota has closed." msgstr "وقد أغلقت الحصص." -#: pretix/control/logdisplay.py:933 pretix/control/views/item.py:1081 +#: pretix/control/logdisplay.py:945 pretix/control/views/item.py:1082 msgid "The quota has been re-opened." msgstr "وكانت الحصة إعادة فتح." -#: pretix/control/logdisplay.py:940 +#: pretix/control/logdisplay.py:952 msgid "The question has been added." msgstr "تمت إضافة هذا السؤال." -#: pretix/control/logdisplay.py:941 +#: pretix/control/logdisplay.py:953 msgid "The question has been deleted." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:942 +#: pretix/control/logdisplay.py:954 msgid "The question has been changed." msgstr "تم تغيير السؤال." -#: pretix/control/logdisplay.py:943 +#: pretix/control/logdisplay.py:955 #, fuzzy #| msgid "The question has been deleted." msgid "The question has been reordered." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:950 +#: pretix/control/logdisplay.py:962 #, fuzzy #| msgid "The quota has been added." msgid "The discount has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:951 +#: pretix/control/logdisplay.py:963 #, fuzzy #| msgid "The product has been deleted." msgid "The discount has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:952 +#: pretix/control/logdisplay.py:964 #, fuzzy #| msgid "The account has been changed." msgid "The discount has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:976 +#: pretix/control/logdisplay.py:988 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" @@ -18466,7 +18676,7 @@ msgid "" msgstr "" "وقد تم التحقق من موقف # {posid} في يدويا في{datetime} على قائمة \"{list}\"." -#: pretix/control/logdisplay.py:981 +#: pretix/control/logdisplay.py:993 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." @@ -18474,15 +18684,15 @@ msgstr "" "وقد تم التحقق من موقف # {posid} الدخول مرة أخرى في{datetime} على قائمة " "\"{list}\"." -#: pretix/control/logdisplay.py:990 +#: pretix/control/logdisplay.py:1002 msgid "An entry has been removed from the waiting list." msgstr "تمت إزالة إدخال من قائمة الانتظار." -#: pretix/control/logdisplay.py:991 +#: pretix/control/logdisplay.py:1003 msgid "An entry has been changed on the waiting list." msgstr "تم تغيير دخول على قائمة الانتظار." -#: pretix/control/logdisplay.py:992 +#: pretix/control/logdisplay.py:1004 msgid "An entry has been added to the waiting list." msgstr "تمت إضافة إدخال إلى قائمة الانتظار." @@ -18521,7 +18731,7 @@ msgstr "جنرال لواء" #: pretix/control/navigation.py:57 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:890 +#: pretix/control/templates/pretixcontrol/order/index.html:921 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:37 #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/manualpayment/apps.py:39 pretix/plugins/paypal2/apps.py:45 @@ -18532,9 +18742,9 @@ msgstr "جنرال لواء" msgid "Payment" msgstr "دفع" -#: pretix/control/navigation.py:73 pretix/control/views/event.py:1610 -#: pretix/control/views/event.py:1612 pretix/control/views/event.py:1644 -#: pretix/control/views/event.py:1649 pretix/control/views/subevents.py:310 +#: pretix/control/navigation.py:73 pretix/control/views/event.py:1619 +#: pretix/control/views/event.py:1621 pretix/control/views/event.py:1653 +#: pretix/control/views/event.py:1658 pretix/control/views/subevents.py:310 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html:60 #: pretix/plugins/ticketoutputpdf/apps.py:55 #: pretix/plugins/ticketoutputpdf/exporters.py:68 @@ -18545,10 +18755,12 @@ msgid "Tickets" msgstr "تذاكر" #: pretix/control/navigation.py:89 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:3 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:5 -msgid "Tax rules" -msgstr "القواعد الضريبية" +#: pretix/control/templates/pretixcontrol/event/tax.html:4 +#: pretix/control/templates/pretixcontrol/event/tax.html:6 +#: pretix/control/templates/pretixcontrol/order/index.html:764 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:457 +msgid "Taxes" +msgstr "الضرائب" #: pretix/control/navigation.py:97 msgid "Invoicing" @@ -18566,7 +18778,7 @@ msgstr "القطعة" #: pretix/control/navigation.py:126 pretix/control/navigation.py:435 #: pretix/control/navigation.py:485 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:151 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:152 #: pretix/control/templates/pretixcontrol/event/payment.html:47 #: pretix/control/templates/pretixcontrol/event/plugins.html:117 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:137 @@ -18591,7 +18803,7 @@ msgid "Overview" msgstr "نظرة عامة" #: pretix/control/navigation.py:221 -#: pretix/control/templates/pretixcontrol/order/index.html:877 +#: pretix/control/templates/pretixcontrol/order/index.html:908 #: pretix/control/templates/pretixcontrol/orders/refunds.html:7 #: pretix/control/templates/pretixcontrol/orders/refunds.html:9 #: pretix/plugins/reports/accountingreport.py:498 @@ -18635,10 +18847,10 @@ msgid "Search" msgstr "بحث" #: pretix/control/navigation.py:368 -#: pretix/control/templates/pretixcontrol/order/index.html:783 +#: pretix/control/templates/pretixcontrol/order/index.html:814 #: pretix/plugins/reports/accountingreport.py:497 #: pretix/plugins/reports/accountingreport.py:678 -#: pretix/plugins/reports/accountingreport.py:872 +#: pretix/plugins/reports/accountingreport.py:876 msgid "Payments" msgstr "المدفوعات" @@ -18647,7 +18859,7 @@ msgid "User settings" msgstr "إعدادات المستخدم" #: pretix/control/navigation.py:387 -#: pretix/control/templates/pretixcontrol/user/settings.html:16 +#: pretix/control/templates/pretixcontrol/user/settings.html:34 msgid "Notifications" msgstr "إخطارات" @@ -18663,7 +18875,7 @@ msgstr "التطبيقات المعتمدة" #: pretix/control/templates/pretixcontrol/user/history.html:4 #: pretix/control/templates/pretixcontrol/user/history.html:6 #: pretix/control/templates/pretixcontrol/user/history.html:10 -#: pretix/control/templates/pretixcontrol/user/settings.html:70 +#: pretix/control/templates/pretixcontrol/user/settings.html:98 msgid "Account history" msgstr "تاريخ الحساب" @@ -18842,6 +19054,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/shredder/index.html:78 #: pretix/control/templates/pretixcontrol/user/2fa_add.html:14 #: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:79 +#: pretix/control/templates/pretixcontrol/user/change_email.html:25 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:17 #: pretix/control/templates/pretixcontrol/user/reauth.html:32 #: pretix/control/templates/pretixcontrol/user/reauth.html:36 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:11 @@ -18849,7 +19063,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/event/checkout_addons.html:90 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:126 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:80 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:168 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:140 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:194 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:53 #: pretix/presale/templates/pretixpresale/event/order_change.html:27 @@ -18902,17 +19116,18 @@ msgstr "خطأ:" msgid "Set new password" msgstr "كلمة المرور الجديدة تعيين" -#: pretix/control/templates/pretixcontrol/auth/recover.html:15 +#: pretix/control/templates/pretixcontrol/auth/recover.html:16 #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:124 #: pretix/control/templates/pretixcontrol/email_setup_simple.html:82 #: pretix/control/templates/pretixcontrol/email_setup_smtp.html:38 #: pretix/control/templates/pretixcontrol/event/cancel.html:91 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:175 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:176 #: pretix/control/templates/pretixcontrol/event/mail.html:135 #: pretix/control/templates/pretixcontrol/event/payment.html:88 #: pretix/control/templates/pretixcontrol/event/payment_provider.html:36 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:201 -#: pretix/control/templates/pretixcontrol/event/settings.html:494 +#: pretix/control/templates/pretixcontrol/event/settings.html:493 +#: pretix/control/templates/pretixcontrol/event/tax.html:116 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:145 #: pretix/control/templates/pretixcontrol/event/tickets.html:73 #: pretix/control/templates/pretixcontrol/global_settings.html:12 @@ -18945,7 +19160,7 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/organizers/mail.html:73 #: pretix/control/templates/pretixcontrol/organizers/membershiptype_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/plugin_events.html:41 -#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:103 +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:105 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium_edit.html:28 #: pretix/control/templates/pretixcontrol/organizers/ssoclient_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/ssoprovider_edit.html:28 @@ -18956,10 +19171,10 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 #: pretix/control/templates/pretixcontrol/subevents/detail.html:289 #: pretix/control/templates/pretixcontrol/user/notifications.html:85 -#: pretix/control/templates/pretixcontrol/user/settings.html:81 +#: pretix/control/templates/pretixcontrol/user/settings.html:109 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:13 #: pretix/control/templates/pretixcontrol/users/create.html:26 -#: pretix/control/templates/pretixcontrol/users/form.html:80 +#: pretix/control/templates/pretixcontrol/users/form.html:81 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:140 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:126 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/add.html:29 @@ -19359,6 +19574,9 @@ msgstr[5] "" #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:18 #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:23 #: pretix/control/templates/pretixcontrol/user/2fa_regenemergency.html:17 +#: pretix/control/templates/pretixcontrol/user/change_email.html:22 +#: pretix/control/templates/pretixcontrol/user/change_password.html:18 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:15 #: pretix/control/templates/pretixcontrol/vouchers/delete.html:12 #: pretix/control/templates/pretixcontrol/vouchers/delete_bulk.html:33 #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:13 @@ -19415,7 +19633,7 @@ msgstr "قم بالإلغاء" #: pretix/control/templates/pretixcontrol/vouchers/delete_carts.html:16 #: pretix/control/templates/pretixcontrol/waitinglist/delete.html:15 #: pretix/control/templates/pretixcontrol/waitinglist/delete_bulk.html:36 -#: pretix/control/views/orders.py:388 +#: pretix/control/views/orders.py:391 #: pretix/plugins/autocheckin/templates/pretixplugins/autocheckin/delete.html:15 #: pretix/plugins/badges/templates/pretixplugins/badges/delete.html:16 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_delete.html:15 @@ -19502,14 +19720,14 @@ msgid "Result" msgstr "النتيجة" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:78 -#: pretix/control/templates/pretixcontrol/order/index.html:432 +#: pretix/control/templates/pretixcontrol/order/index.html:437 #, fuzzy, python-format #| msgid "Automatically checked in: %(date)s" msgid "Automatically marked not present: %(date)s" msgstr "التحقق تلقائيا في: %(date)s" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:82 -#: pretix/control/templates/pretixcontrol/order/index.html:437 +#: pretix/control/templates/pretixcontrol/order/index.html:442 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Additional entry scan: %(date)s" @@ -19522,7 +19740,7 @@ msgid "Offline scan. Upload time: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:88 -#: pretix/control/templates/pretixcontrol/order/index.html:439 +#: pretix/control/templates/pretixcontrol/order/index.html:444 #, python-format msgid "Automatically checked in: %(date)s" msgstr "التحقق تلقائيا في: %(date)s" @@ -20058,10 +20276,28 @@ msgid "Edit value mapping" msgstr "" #: pretix/control/templates/pretixcontrol/datasync/property_mappings_formset.html:76 -#: pretix/control/templates/pretixcontrol/event/settings.html:487 +#: pretix/control/templates/pretixcontrol/event/settings.html:486 msgid "Add property" msgstr "إضافة خاصية" +#: pretix/control/templates/pretixcontrol/email/confirmation_code.txt:1 +#, python-format +msgid "" +"Hello,\n" +"\n" +"%(reason)s\n" +"\n" +" %(code)s\n" +"\n" +"Please do never give this code to another person. Our support team will " +"never ask for this code.\n" +"\n" +"If this code was not requested by you, please contact us immediately.\n" +"\n" +"Best regards,\n" +"Your pretix team\n" +msgstr "" + #: pretix/control/templates/pretixcontrol/email/email_setup.txt:1 #, python-format msgid "" @@ -20326,7 +20562,7 @@ msgstr "" "اليدوي. ومع ذلك، كنت قد تحولت حاليا من الإشعارات لهذا الحدث." #: pretix/control/templates/pretixcontrol/event/cancel.html:46 -#: pretix/control/templates/pretixcontrol/user/settings.html:29 +#: pretix/control/templates/pretixcontrol/user/settings.html:47 msgid "Change notification settings" msgstr "إعدادات تغيير الإعلام" @@ -20393,7 +20629,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:5 #: pretix/control/templates/pretixcontrol/event/live.html:131 -#: pretix/control/templates/pretixcontrol/event/settings.html:500 +#: pretix/control/templates/pretixcontrol/event/settings.html:499 msgid "Cancel or delete event" msgstr "إلغاء أو حذف فعالية" @@ -20510,7 +20746,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/fragment_geodata.html:15 #: pretix/control/templates/pretixcontrol/event/settings.html:139 -#: pretix/control/templates/pretixcontrol/event/settings.html:292 +#: pretix/control/templates/pretixcontrol/event/settings.html:291 #: pretix/control/templates/pretixcontrol/items/discount.html:35 #: pretix/control/templates/pretixcontrol/organizers/edit.html:56 #: pretix/control/templates/pretixcontrol/organizers/property_edit.html:32 @@ -20663,7 +20899,7 @@ msgid "Show sync problems" msgstr "" #: pretix/control/templates/pretixcontrol/event/index.html:151 -#: pretix/control/templates/pretixcontrol/order/index.html:1062 +#: pretix/control/templates/pretixcontrol/order/index.html:1093 msgid "Update comment" msgstr "تحديث تعليق" @@ -20700,17 +20936,17 @@ msgstr "شكل عنوان" msgid "Issuer details" msgstr "تفاصيل المصدر" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:63 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:64 msgid "Invoice customization" msgstr "فاتورة التخصيص" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:77 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:78 #, fuzzy #| msgid "Invoice generation" msgid "Invoice transmission" msgstr "جيل فاتورة" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:79 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:80 msgid "" "pretix can transmit invoices using different transmission methods. Different " "transmission methods might be required depending on country and industry. By " @@ -20718,56 +20954,56 @@ msgid "" "types of transmission can be added by plugins." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:86 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:87 msgid "" "Whether a transmission method listed here is actually selectable for " "customers may depend on the country of the customer or whether the customer " "is entering a business address." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:95 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 #, fuzzy #| msgid "Transaction Code" msgid "Transmission method" msgstr "كود المعاملة" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:111 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:112 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:139 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:109 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:111 msgid "Available" msgstr "متاح" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:113 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 msgid "" "When this type is available for an invoice address, no other type can be " "selected." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:115 msgid "(exclusive)" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:121 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:122 #, fuzzy #| msgid "Available" msgid "Unavailable" msgstr "متاح" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:143 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:144 #, fuzzy #| msgctxt "payment_state" #| msgid "confirmed" msgid "Not configured" msgstr "تم التأكيد" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:165 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:166 #, fuzzy #| msgid "Enable waiting list" msgid "Enable additional invoice transmission plugins" msgstr "تمكين قائمة الانتظار" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:172 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:173 msgid "Save and show preview" msgstr "حفظ وعرض المعاينة" @@ -20908,9 +21144,10 @@ msgstr "تم إجراء هذا التغيير من قبل مسؤول pretix." #: pretix/control/templates/pretixcontrol/event/logs.html:86 #: pretix/control/templates/pretixcontrol/event/logs_embed.html:47 #: pretix/control/templates/pretixcontrol/includes/logs.html:42 -#: pretix/control/templates/pretixcontrol/order/index.html:845 -#: pretix/control/templates/pretixcontrol/order/index.html:857 -#: pretix/control/templates/pretixcontrol/order/index.html:962 +#: pretix/control/templates/pretixcontrol/order/index.html:367 +#: pretix/control/templates/pretixcontrol/order/index.html:876 +#: pretix/control/templates/pretixcontrol/order/index.html:888 +#: pretix/control/templates/pretixcontrol/order/index.html:993 #: pretix/control/templates/pretixcontrol/organizers/device_logs.html:42 #: pretix/control/templates/pretixcontrol/organizers/logs.html:72 #: pretix/control/templates/pretixcontrol/search/payments.html:147 @@ -20985,7 +21222,7 @@ msgstr "طلب مجاني" #: pretix/control/templates/pretixcontrol/event/mail.html:99 #: pretix/control/templates/pretixcontrol/order/index.html:249 -#: pretix/control/templates/pretixcontrol/order/index.html:584 +#: pretix/control/templates/pretixcontrol/order/index.html:589 msgid "Resend link" msgstr "رابط إعادة إرسال" @@ -21027,14 +21264,14 @@ msgid "Payment settings" msgstr "إعدادات الدفع" #: pretix/control/templates/pretixcontrol/event/payment.html:23 -#: pretix/control/templates/pretixcontrol/user/settings.html:48 +#: pretix/control/templates/pretixcontrol/user/settings.html:76 #: pretix/plugins/sendmail/models.py:286 msgid "Enabled" msgstr "تمكين" #: pretix/control/templates/pretixcontrol/event/payment.html:28 #: pretix/control/templates/pretixcontrol/subevents/index.html:166 -#: pretix/control/templates/pretixcontrol/user/settings.html:53 +#: pretix/control/templates/pretixcontrol/user/settings.html:81 msgid "Disabled" msgstr "معاق" @@ -21108,13 +21345,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/plugins.html:15 #: pretix/control/views/checkin.py:424 pretix/control/views/discounts.py:113 #: pretix/control/views/event.py:246 pretix/control/views/event.py:576 -#: pretix/control/views/event.py:615 pretix/control/views/event.py:778 -#: pretix/control/views/event.py:1007 pretix/control/views/event.py:1380 -#: pretix/control/views/event.py:1420 +#: pretix/control/views/event.py:615 pretix/control/views/event.py:797 +#: pretix/control/views/event.py:1026 pretix/control/views/event.py:1389 +#: pretix/control/views/event.py:1429 #: pretix/control/views/global_settings.py:65 -#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:264 -#: pretix/control/views/item.py:795 pretix/control/views/item.py:1121 -#: pretix/control/views/item.py:1299 pretix/control/views/item.py:1449 +#: pretix/control/views/global_settings.py:88 pretix/control/views/item.py:265 +#: pretix/control/views/item.py:796 pretix/control/views/item.py:1122 +#: pretix/control/views/item.py:1300 pretix/control/views/item.py:1451 #: pretix/control/views/mailsetup.py:151 pretix/control/views/mailsetup.py:163 #: pretix/control/views/mailsetup.py:190 pretix/control/views/mailsetup.py:258 #: pretix/control/views/organizer.py:272 pretix/control/views/organizer.py:300 @@ -21134,10 +21371,11 @@ msgstr "" #: pretix/control/views/organizer.py:3356 #: pretix/control/views/organizer.py:3385 #: pretix/control/views/organizer.py:3523 pretix/control/views/subevents.py:542 -#: pretix/control/views/subevents.py:1614 pretix/control/views/user.py:236 -#: pretix/control/views/users.py:114 pretix/control/views/vouchers.py:305 -#: pretix/plugins/autocheckin/views.py:164 pretix/plugins/badges/views.py:157 -#: pretix/plugins/sendmail/views.py:645 pretix/plugins/stripe/views.py:679 +#: pretix/control/views/subevents.py:1614 pretix/control/views/user.py:241 +#: pretix/control/views/user.py:854 pretix/control/views/users.py:114 +#: pretix/control/views/vouchers.py:305 pretix/plugins/autocheckin/views.py:164 +#: pretix/plugins/badges/views.py:157 pretix/plugins/sendmail/views.py:645 +#: pretix/plugins/stripe/views.py:679 #: pretix/plugins/ticketoutputpdf/views.py:172 #: pretix/presale/views/customer.py:542 pretix/presale/views/customer.py:594 msgid "Your changes have been saved." @@ -21237,13 +21475,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/user/2fa_enable.html:21 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:99 #: pretix/control/templates/pretixcontrol/user/notifications.html:23 -#: pretix/control/templates/pretixcontrol/user/settings.html:55 +#: pretix/control/templates/pretixcontrol/user/settings.html:83 msgid "Enable" msgstr "مكن" #: pretix/control/templates/pretixcontrol/event/quick_setup.html:14 #: pretix/control/templates/pretixcontrol/event/settings_base.html:10 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:18 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:20 msgid "Congratulations!" msgstr "تهانينا!" @@ -21347,7 +21585,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/settings.html:7 #: pretix/control/templates/pretixcontrol/event/settings.html:13 -#: pretix/control/templates/pretixcontrol/user/settings.html:11 +#: pretix/control/templates/pretixcontrol/user/settings.html:29 msgid "General settings" msgstr "الاعدادات العامة" @@ -21459,39 +21697,39 @@ msgstr "عرض" msgid "Product list" msgstr "تاريخ المنتج" -#: pretix/control/templates/pretixcontrol/event/settings.html:253 -#: pretix/control/templates/pretixcontrol/event/settings.html:389 +#: pretix/control/templates/pretixcontrol/event/settings.html:252 +#: pretix/control/templates/pretixcontrol/event/settings.html:388 #, fuzzy #| msgid "Invoice settings" msgid "Incompatible settings" msgstr "ضبط فاتورة" -#: pretix/control/templates/pretixcontrol/event/settings.html:254 -#: pretix/control/templates/pretixcontrol/event/settings.html:390 +#: pretix/control/templates/pretixcontrol/event/settings.html:253 +#: pretix/control/templates/pretixcontrol/event/settings.html:389 msgid "" "Customers won't be able to add themselves to the waiting list, because " "\"Hide all products that are sold out\" is enabled." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:261 +#: pretix/control/templates/pretixcontrol/event/settings.html:260 #, fuzzy #| msgid "resend invite" msgctxt "subevents" msgid "Calendar and list views" msgstr "إعادة إرسال دعوة" -#: pretix/control/templates/pretixcontrol/event/settings.html:284 +#: pretix/control/templates/pretixcontrol/event/settings.html:283 msgid "Other settings" msgstr "إعدادات أخرى" -#: pretix/control/templates/pretixcontrol/event/settings.html:291 +#: pretix/control/templates/pretixcontrol/event/settings.html:290 #: pretix/control/templates/pretixcontrol/organizers/edit.html:55 #, fuzzy #| msgid "Voucher link" msgid "Footer links" msgstr "رابط قسيمة" -#: pretix/control/templates/pretixcontrol/event/settings.html:296 +#: pretix/control/templates/pretixcontrol/event/settings.html:295 #: pretix/control/templates/pretixcontrol/organizers/edit.html:60 msgid "" "These links will be shown in the footer of your ticket shop. You could for " @@ -21500,24 +21738,24 @@ msgid "" "do not need to add them here." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:350 +#: pretix/control/templates/pretixcontrol/event/settings.html:349 #: pretix/control/templates/pretixcontrol/organizers/edit.html:119 #, fuzzy #| msgid "Address line" msgid "Add link" msgstr "العنوان" -#: pretix/control/templates/pretixcontrol/event/settings.html:357 +#: pretix/control/templates/pretixcontrol/event/settings.html:356 msgid "Cart" msgstr "عربة التسوق" -#: pretix/control/templates/pretixcontrol/event/settings.html:365 +#: pretix/control/templates/pretixcontrol/event/settings.html:364 msgid "" "The waiting list currently is not compatible with some advanced features of " "pretix such as hidden products, add-on products or product bundles." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:371 +#: pretix/control/templates/pretixcontrol/event/settings.html:370 msgid "" "The waiting list determines availability mainly based on quotas. If you use " "a seating plan and your number of available seats is less than the available " @@ -21525,29 +21763,29 @@ msgid "" "waiting list but still are unable to book a seat." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:378 +#: pretix/control/templates/pretixcontrol/event/settings.html:377 msgid "" "Specifically, this means the waiting list is not safe to use together with " "the minimum distance feature of our seating plan module." msgstr "" -#: pretix/control/templates/pretixcontrol/event/settings.html:399 +#: pretix/control/templates/pretixcontrol/event/settings.html:398 #, fuzzy #| msgid "Waiting" msgid "Waiting customers" msgstr "انتظار" -#: pretix/control/templates/pretixcontrol/event/settings.html:405 +#: pretix/control/templates/pretixcontrol/event/settings.html:404 #, fuzzy #| msgid "Enable waiting list" msgid "Manage waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/control/templates/pretixcontrol/event/settings.html:418 +#: pretix/control/templates/pretixcontrol/event/settings.html:417 msgid "Item metadata" msgstr "عنصر بيانات وصفية" -#: pretix/control/templates/pretixcontrol/event/settings.html:420 +#: pretix/control/templates/pretixcontrol/event/settings.html:419 msgid "" "You can here define a set of metadata properties (i.e. variables) that you " "can later set for your items and re-use in places like ticket layouts. This " @@ -21557,15 +21795,15 @@ msgstr "" "لاحقا للوحدات أو تعيد استخدامها في أماكن مثل تخطيطات التذاكر. وهذا الخيار " "سيكون منقذا ومفيدا إذا قمت بإنشاء الكثير والكثير من الوحدات." -#: pretix/control/templates/pretixcontrol/event/settings.html:440 -#: pretix/control/templates/pretixcontrol/event/settings.html:468 +#: pretix/control/templates/pretixcontrol/event/settings.html:439 +#: pretix/control/templates/pretixcontrol/event/settings.html:467 #: pretix/control/templates/pretixcontrol/organizers/properties.html:22 #, fuzzy #| msgid "Add property" msgid "Property" msgstr "إضافة خاصية" -#: pretix/control/templates/pretixcontrol/event/settings.html:505 +#: pretix/control/templates/pretixcontrol/event/settings.html:504 #: pretix/control/templates/pretixcontrol/events/index.html:165 #: pretix/control/templates/pretixcontrol/organizers/detail.html:130 msgid "Clone event" @@ -21583,6 +21821,78 @@ msgstr "" msgid "Create a first product" msgstr "إنشاء أول منتج" +#: pretix/control/templates/pretixcontrol/event/tax.html:9 +msgid "Tax rules" +msgstr "القواعد الضريبية" + +#: pretix/control/templates/pretixcontrol/event/tax.html:11 +msgid "" +"Tax rules define different taxation scenarios that can then be assigned to " +"the individual products. Each tax rule contains a default tax rate and can " +"optionally contain additional rules that depend on the customer's country " +"and type." +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/tax.html:21 +msgid "You haven't created any tax rules yet." +msgstr "لم تقم بإنشاء أي القواعد الضريبية حتى الان." + +#: pretix/control/templates/pretixcontrol/event/tax.html:27 +#: pretix/control/templates/pretixcontrol/event/tax.html:98 +msgid "Create a new tax rule" +msgstr "إنشاء قاعدة ضريبية جديدة" + +#: pretix/control/templates/pretixcontrol/event/tax.html:36 +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:20 +#, fuzzy +#| msgid "Usages" +msgid "Usage" +msgstr "مرات الإستخدام" + +#: pretix/control/templates/pretixcontrol/event/tax.html:37 +msgid "Rate" +msgstr "معدل" + +#: pretix/control/templates/pretixcontrol/event/tax.html:61 +#: pretix/plugins/badges/templates/pretixplugins/badges/index.html:63 +#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:60 +msgid "Make default" +msgstr "وضع افتراضي" + +#: pretix/control/templates/pretixcontrol/event/tax.html:67 +#, fuzzy, python-format +#| msgid "%(count)s elements" +msgid "%(count)s product" +msgid_plural "%(count)s products" +msgstr[0] "%(count)s العناصر" +msgstr[1] "%(count)s العناصر" +msgstr[2] "%(count)s العناصر" +msgstr[3] "%(count)s العناصر" +msgstr[4] "%(count)s العناصر" +msgstr[5] "%(count)s العناصر" + +#: pretix/control/templates/pretixcontrol/event/tax.html:75 +#, python-format +msgid "incl. %(rate)s %%" +msgstr "بما في ذلك %(rate)s%%" + +#: pretix/control/templates/pretixcontrol/event/tax.html:77 +#, python-format +msgid "excl. %(rate)s %%" +msgstr "بما في ذلك%(rate)s%%" + +#: pretix/control/templates/pretixcontrol/event/tax.html:80 +#, fuzzy +#| msgid "Customers" +msgid "with custom rules" +msgstr "عملاء" + +#: pretix/control/templates/pretixcontrol/event/tax.html:110 +#, fuzzy +#| msgid "Base settings" +msgid "Tax settings" +msgstr "ضبط قاعدة" + #: pretix/control/templates/pretixcontrol/event/tax_delete.html:4 #: pretix/control/templates/pretixcontrol/event/tax_delete.html:6 msgid "Delete tax rule" @@ -21677,35 +21987,6 @@ msgstr "إضافة قاعدة جديدة" msgid "Change history" msgstr "تغيير السجل" -#: pretix/control/templates/pretixcontrol/event/tax_index.html:9 -msgid "You haven't created any tax rules yet." -msgstr "لم تقم بإنشاء أي القواعد الضريبية حتى الان." - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:15 -#: pretix/control/templates/pretixcontrol/event/tax_index.html:19 -msgid "Create a new tax rule" -msgstr "إنشاء قاعدة ضريبية جديدة" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:28 -msgid "Rate" -msgstr "معدل" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:51 -#: pretix/plugins/badges/templates/pretixplugins/badges/index.html:63 -#: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:60 -msgid "Make default" -msgstr "وضع افتراضي" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:58 -#, python-format -msgid "incl. %(rate)s %%" -msgstr "بما في ذلك %(rate)s%%" - -#: pretix/control/templates/pretixcontrol/event/tax_index.html:60 -#, python-format -msgid "excl. %(rate)s %%" -msgstr "بما في ذلك%(rate)s%%" - #: pretix/control/templates/pretixcontrol/event/tickets.html:8 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:14 #: pretix/presale/templates/pretixpresale/event/fragment_downloads.html:7 @@ -22004,39 +22285,6 @@ msgstr "أرقام اعتبارا من %(date)s" msgid "Currently available: %(num)s" msgstr "المتاحة حاليا: %(num)s" -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:9 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:81 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:14 -#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 -#, fuzzy -#| msgid "Confirmations" -msgid "Information" -msgstr "تأكيدات" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:10 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:15 -msgid "The following gift cards are available in your customer account:" -msgstr "" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:25 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:29 -#, fuzzy -#| msgid "Issued gift cards" -msgid "Use gift card" -msgstr "بطاقات هدية صدر" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout.html:27 -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:32 -msgid "Apply" -msgstr "تطبيق" - -#: pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html:4 -#, fuzzy, python-format -#| msgid "This gift card can only be used in test mode." -msgid "Your gift card %(card)s will be used to pay for this order." -msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا في وضع الاختبار." - #: pretix/control/templates/pretixcontrol/global_license.html:8 msgid "" "This page is intended to help you use pretix in compliance with its license." @@ -22541,6 +22789,27 @@ msgstr "" msgid "Add a new bundled product" msgstr "إضافة منتج جديد المجمعة" +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:5 +msgid "" +"With program times, you can set specific dates and times for this product. " +"This is useful if this product represents access to parts of your event that " +"happen at different times than your event in general. This will not affect " +"access control, but will affect calendar invites and ticket output." +msgstr "" + +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:25 +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:51 +#, fuzzy +#| msgid "Printing time" +msgid "Program time" +msgstr "وقت الطباعة" + +#: pretix/control/templates/pretixcontrol/item/include_program_times.html:68 +#, fuzzy +#| msgid "Add a new ticket type" +msgid "Add a program time" +msgstr "إضافة نوع تذكرة جديدة" + #: pretix/control/templates/pretixcontrol/item/include_variations.html:35 #: pretix/control/templates/pretixcontrol/item/include_variations.html:161 #: pretix/control/templates/pretixcontrol/items/discounts.html:105 @@ -22958,19 +23227,19 @@ msgid "Can only be bought using a voucher" msgstr "لا يمكن إلا أن يكون اشترى استخدام قسيمة" #: pretix/control/templates/pretixcontrol/items/index.html:149 -#: pretix/control/templates/pretixcontrol/order/index.html:668 -#: pretix/control/templates/pretixcontrol/order/index.html:708 +#: pretix/control/templates/pretixcontrol/order/index.html:673 +#: pretix/control/templates/pretixcontrol/order/index.html:723 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:360 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:415 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:419 #, python-format msgid "plus %(rate)s%% %(taxname)s" msgstr " زائد %(rate)s%% %(taxname)s" #: pretix/control/templates/pretixcontrol/items/index.html:153 -#: pretix/control/templates/pretixcontrol/order/index.html:678 -#: pretix/control/templates/pretixcontrol/order/index.html:718 +#: pretix/control/templates/pretixcontrol/order/index.html:683 +#: pretix/control/templates/pretixcontrol/order/index.html:733 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:370 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:425 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:429 #, python-format msgid "incl. %(rate)s%% %(taxname)s" msgstr "بما في ذلك %(rate)s%% %(taxname)s" @@ -23023,7 +23292,7 @@ msgid "%% of tickets" msgstr "عدد التذاكر" #: pretix/control/templates/pretixcontrol/items/question.html:112 -#: pretix/control/templates/pretixcontrol/order/transactions.html:67 +#: pretix/control/templates/pretixcontrol/order/transactions.html:85 #: pretix/plugins/reports/accountingreport.py:409 #: pretix/plugins/reports/accountingreport.py:442 #: pretix/plugins/reports/accountingreport.py:566 @@ -23357,7 +23626,7 @@ msgstr "إبطال" #: pretix/control/templates/pretixcontrol/oauth/authorized.html:4 #: pretix/control/templates/pretixcontrol/oauth/authorized.html:6 -#: pretix/control/templates/pretixcontrol/user/settings.html:61 +#: pretix/control/templates/pretixcontrol/user/settings.html:89 msgid "Authorized applications" msgstr "تطبيقات أذن" @@ -23584,7 +23853,7 @@ msgid "Validity time" msgstr "حتى تاريخ" #: pretix/control/templates/pretixcontrol/order/change.html:247 -#: pretix/control/templates/pretixcontrol/order/index.html:495 +#: pretix/control/templates/pretixcontrol/order/index.html:500 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:107 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" @@ -23592,7 +23861,7 @@ msgid "Valid from %(datetime)s" msgstr "القبول: %(datetime)s" #: pretix/control/templates/pretixcontrol/order/change.html:255 -#: pretix/control/templates/pretixcontrol/order/index.html:499 +#: pretix/control/templates/pretixcontrol/order/index.html:504 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:111 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" @@ -23676,7 +23945,7 @@ msgid "Change order information" msgstr "المعلومات تغيير النظام" #: pretix/control/templates/pretixcontrol/order/change_questions.html:25 -#: pretix/control/templates/pretixcontrol/order/index.html:992 +#: pretix/control/templates/pretixcontrol/order/index.html:1023 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:35 #: pretix/presale/templates/pretixpresale/event/order_modify.html:29 @@ -23729,13 +23998,13 @@ msgstr "تفاصيل الطلب: %(code)s" #: pretix/control/templates/pretixcontrol/order/index.html:46 #: pretix/control/templates/pretixcontrol/orders/index.html:297 -#: pretix/control/views/orders.py:312 +#: pretix/control/views/orders.py:315 msgid "Approve" msgstr "يوافق" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:326 +#: pretix/control/views/orders.py:329 msgid "Deny" msgstr "أنكر" @@ -23780,7 +24049,7 @@ msgstr "" "المجانية، يمكنك وضع علامة على أنها منتهية الصلاحية يدويا." #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:374 +#: pretix/control/views/orders.py:377 #, fuzzy #| msgid "Refund order" msgid "Refund for overpayment" @@ -23952,89 +24221,89 @@ msgstr "توليد إلغاء" msgid "Cancel and reissue" msgstr "إلغاء وإعادة إصدار" -#: pretix/control/templates/pretixcontrol/order/index.html:375 -#: pretix/control/templates/pretixcontrol/order/index.html:387 +#: pretix/control/templates/pretixcontrol/order/index.html:380 +#: pretix/control/templates/pretixcontrol/order/index.html:392 msgid "Generate invoice" msgstr "توليد فاتورة" -#: pretix/control/templates/pretixcontrol/order/index.html:401 +#: pretix/control/templates/pretixcontrol/order/index.html:406 msgid "Change answers" msgstr "الإجابات التغيير" -#: pretix/control/templates/pretixcontrol/order/index.html:405 +#: pretix/control/templates/pretixcontrol/order/index.html:410 msgid "Change products" msgstr "منتجات التغيير" -#: pretix/control/templates/pretixcontrol/order/index.html:410 +#: pretix/control/templates/pretixcontrol/order/index.html:415 #: pretix/presale/templates/pretixpresale/event/order.html:197 msgid "Ordered items" msgstr "تفاصيل الطلب" -#: pretix/control/templates/pretixcontrol/order/index.html:429 +#: pretix/control/templates/pretixcontrol/order/index.html:434 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Denied scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:434 +#: pretix/control/templates/pretixcontrol/order/index.html:439 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Exit scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:441 +#: pretix/control/templates/pretixcontrol/order/index.html:446 #, fuzzy, python-format #| msgid "First scanned: %(date)s" msgid "Entry scan: %(date)s" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/templates/pretixcontrol/order/index.html:460 +#: pretix/control/templates/pretixcontrol/order/index.html:465 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55 msgid "Voucher code used:" msgstr "كود القسيمة المستخدمة:" -#: pretix/control/templates/pretixcontrol/order/index.html:462 +#: pretix/control/templates/pretixcontrol/order/index.html:467 #, fuzzy, python-format #| msgid "Maximum discount budget" msgid "Used %(amount)s discount from budget" msgstr "الحد الأقصى للخصم" -#: pretix/control/templates/pretixcontrol/order/index.html:479 +#: pretix/control/templates/pretixcontrol/order/index.html:484 msgid "" "The price of this product was reduced because of an automatic discount or " "this product was part of the discount calculation for a different product in " "this order." msgstr "" -#: pretix/control/templates/pretixcontrol/order/index.html:491 +#: pretix/control/templates/pretixcontrol/order/index.html:496 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:103 #, fuzzy, python-format #| msgid "Admission: %(datetime)s" msgid "Valid %(datetime_range)s" msgstr "القبول: %(datetime)s" -#: pretix/control/templates/pretixcontrol/order/index.html:537 +#: pretix/control/templates/pretixcontrol/order/index.html:542 #, fuzzy #| msgid "Client secret" msgid "Ticket page" msgstr "كلمة سر الزبون" -#: pretix/control/templates/pretixcontrol/order/index.html:568 -#: pretix/control/templates/pretixcontrol/order/index.html:589 -#: pretix/control/templates/pretixcontrol/order/index.html:598 -#: pretix/control/templates/pretixcontrol/order/index.html:612 -#: pretix/control/templates/pretixcontrol/order/index.html:650 -#: pretix/control/templates/pretixcontrol/order/index.html:657 +#: pretix/control/templates/pretixcontrol/order/index.html:573 +#: pretix/control/templates/pretixcontrol/order/index.html:594 +#: pretix/control/templates/pretixcontrol/order/index.html:603 +#: pretix/control/templates/pretixcontrol/order/index.html:617 +#: pretix/control/templates/pretixcontrol/order/index.html:655 +#: pretix/control/templates/pretixcontrol/order/index.html:662 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:228 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:234 msgid "not answered" msgstr "بلا جواب" -#: pretix/control/templates/pretixcontrol/order/index.html:622 +#: pretix/control/templates/pretixcontrol/order/index.html:627 msgid "This question will be asked during check-in." msgstr "سوف يتم طرح هذا السؤال أثناء التسجيل في مكتب الاستقبال." -#: pretix/control/templates/pretixcontrol/order/index.html:634 +#: pretix/control/templates/pretixcontrol/order/index.html:639 msgid "" "This file has been uploaded by a user and could contain viruses or other " "malicious content." @@ -24042,16 +24311,11 @@ msgstr "" "وقد تم تحميل هذا الملف من قبل المستخدم، ويمكن أن تحتوي على فيروسات أو غيرها " "من المحتويات الضارة." -#: pretix/control/templates/pretixcontrol/order/index.html:635 +#: pretix/control/templates/pretixcontrol/order/index.html:640 msgid "UNSAFE" msgstr "UNSAFE" -#: pretix/control/templates/pretixcontrol/order/index.html:739 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:453 -msgid "Taxes" -msgstr "الضرائب" - -#: pretix/control/templates/pretixcontrol/order/index.html:748 +#: pretix/control/templates/pretixcontrol/order/index.html:773 #: pretix/control/templates/pretixcontrol/orders/overview.html:89 #: pretix/control/templates/pretixcontrol/orders/overview.html:177 #: pretix/plugins/reports/accountingreport.py:499 @@ -24059,26 +24323,26 @@ msgstr "الضرائب" #: pretix/plugins/reports/exporters.py:446 #: pretix/plugins/reports/exporters.py:638 #: pretix/plugins/reports/exporters.py:969 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:465 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:469 msgid "Total" msgstr "المجموع" -#: pretix/control/templates/pretixcontrol/order/index.html:758 +#: pretix/control/templates/pretixcontrol/order/index.html:789 #: pretix/presale/templates/pretixpresale/event/order.html:210 msgid "Successful payments" msgstr "المدفوعات ناجحة" -#: pretix/control/templates/pretixcontrol/order/index.html:767 +#: pretix/control/templates/pretixcontrol/order/index.html:798 #: pretix/presale/templates/pretixpresale/event/order.html:219 msgid "Pending total" msgstr "مجموعه انتظار" -#: pretix/control/templates/pretixcontrol/order/index.html:793 +#: pretix/control/templates/pretixcontrol/order/index.html:824 #: pretix/control/templates/pretixcontrol/search/payments.html:88 msgid "Confirmation date" msgstr "تاريخ تأكيدا" -#: pretix/control/templates/pretixcontrol/order/index.html:806 +#: pretix/control/templates/pretixcontrol/order/index.html:837 #: pretix/control/templates/pretixcontrol/search/payments.html:125 msgid "" "This payment was created with an older version of pretix, therefore accurate " @@ -24087,71 +24351,71 @@ msgstr "" "تم إنشاء هذا المبلغ مع نسخة قديمة من pretix، وبالتالي قد لا تكون البيانات " "دقيقة المتاحة." -#: pretix/control/templates/pretixcontrol/order/index.html:807 +#: pretix/control/templates/pretixcontrol/order/index.html:838 #: pretix/control/templates/pretixcontrol/search/payments.html:126 msgid "MIGRATED" msgstr "هاجر" -#: pretix/control/templates/pretixcontrol/order/index.html:819 +#: pretix/control/templates/pretixcontrol/order/index.html:850 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:4 #: pretix/control/templates/pretixcontrol/order/pay_cancel.html:8 msgid "Cancel payment" msgstr "الغاء الدفع" -#: pretix/control/templates/pretixcontrol/order/index.html:824 +#: pretix/control/templates/pretixcontrol/order/index.html:855 msgid "Confirm as paid" msgstr "تأكيد كما المدفوعة" -#: pretix/control/templates/pretixcontrol/order/index.html:867 +#: pretix/control/templates/pretixcontrol/order/index.html:898 msgid "Create a refund" msgstr "إنشاء استرداد" -#: pretix/control/templates/pretixcontrol/order/index.html:888 +#: pretix/control/templates/pretixcontrol/order/index.html:919 #: pretix/control/templates/pretixcontrol/orders/refunds.html:60 msgid "Source" msgstr "مصدر" -#: pretix/control/templates/pretixcontrol/order/index.html:921 +#: pretix/control/templates/pretixcontrol/order/index.html:952 msgid "Cancel transfer" msgstr "إلغاء نقل" -#: pretix/control/templates/pretixcontrol/order/index.html:926 +#: pretix/control/templates/pretixcontrol/order/index.html:957 #: pretix/control/templates/pretixcontrol/orders/refunds.html:112 msgid "Confirm as done" msgstr "تأكيد كما القيام به" -#: pretix/control/templates/pretixcontrol/order/index.html:933 +#: pretix/control/templates/pretixcontrol/order/index.html:964 #: pretix/control/templates/pretixcontrol/orders/refunds.html:118 msgid "Ignore" msgstr "تجاهل" -#: pretix/control/templates/pretixcontrol/order/index.html:939 +#: pretix/control/templates/pretixcontrol/order/index.html:970 #: pretix/control/templates/pretixcontrol/order/refund_process.html:58 #: pretix/control/templates/pretixcontrol/orders/refunds.html:123 msgid "Process refund" msgstr "عملية استرداد الأموال" -#: pretix/control/templates/pretixcontrol/order/index.html:987 +#: pretix/control/templates/pretixcontrol/order/index.html:1018 #: pretix/presale/templates/pretixpresale/event/base.html:141 #: pretix/presale/templates/pretixpresale/event/timemachine.html:30 msgid "Change" msgstr "يتغيرون" -#: pretix/control/templates/pretixcontrol/order/index.html:1003 +#: pretix/control/templates/pretixcontrol/order/index.html:1034 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:90 #: pretix/presale/templates/pretixpresale/event/order.html:318 msgid "ZIP code and city" msgstr "الرمز البريدي والمدينة" -#: pretix/control/templates/pretixcontrol/order/index.html:1016 +#: pretix/control/templates/pretixcontrol/order/index.html:1047 msgid "Valid EU VAT ID" msgstr "صحيح معرف ضريبة القيمة المضافة في الاتحاد الأوروبي" -#: pretix/control/templates/pretixcontrol/order/index.html:1022 +#: pretix/control/templates/pretixcontrol/order/index.html:1053 msgid "Check" msgstr "التحقق من" -#: pretix/control/templates/pretixcontrol/order/index.html:1076 +#: pretix/control/templates/pretixcontrol/order/index.html:1107 msgid "Order history" msgstr "تاريخ الطلب" @@ -24465,6 +24729,12 @@ msgstr "" "تم إنشاء هذا المبلغ مع نسخة قديمة من pretix، وبالتالي قد لا تكون البيانات " "دقيقة المتاحة." +#: pretix/control/templates/pretixcontrol/order/transactions.html:63 +#: pretix/control/templates/pretixcontrol/order/transactions.html:73 +#, python-format +msgid "incl. %(amount)s rounding correction" +msgstr "" + #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:5 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:7 #, fuzzy @@ -25100,14 +25370,14 @@ msgid "Select action" msgstr "اختر ولايه" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:358 +#: pretix/control/views/orders.py:361 #, fuzzy #| msgid "Refund full paid amount" msgid "Refund overpaid amount" msgstr "برد المبلغ المدفوع كاملا" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:343 +#: pretix/control/views/orders.py:346 msgid "Mark as expired if overdue" msgstr "" @@ -25775,6 +26045,14 @@ msgstr "أصدرت من خلال بيع" msgid "Transactions" msgstr "المعاملات" +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:81 +#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:9 +#, fuzzy +#| msgid "Confirmations" +msgid "Information" +msgstr "تأكيدات" + #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:94 msgid "" "Create a payment on the respective order that cancels out with this " @@ -26083,12 +26361,6 @@ msgstr "هل أنت متأكد أنك تريد حذف الفريق؟" msgid "Property:" msgstr "إضافة خاصية" -#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:20 -#, fuzzy -#| msgid "Usages" -msgid "Usage" -msgstr "مرات الإستخدام" - #: pretix/control/templates/pretixcontrol/organizers/property_edit.html:26 #, fuzzy #| msgid "Variation" @@ -26111,6 +26383,10 @@ msgstr "" msgid "Add a new value" msgstr "إضافة قاعدة جديدة" +#: pretix/control/templates/pretixcontrol/organizers/property_edit.html:95 +msgid "Sort alphabetically" +msgstr "" + #: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:14 #, fuzzy #| msgid "No exports have been created yet." @@ -26482,7 +26758,7 @@ msgid "PDF Editor" msgstr "PDF محرر" #: pretix/control/templates/pretixcontrol/pdf/index.html:36 -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 msgid "Code" msgstr "الشفرة" @@ -26551,6 +26827,11 @@ msgstr "" "والغرض من هذه الميزة فقط للمستخدمين المتقدمين. من المستحسن استخدامه فقط لنسخ " "والتصاميم حصة التذاكر، وليس لتعديل التعليمات البرمجية المصدر التصميم." +#: pretix/control/templates/pretixcontrol/pdf/index.html:156 +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:26 +msgid "Apply" +msgstr "تطبيق" + #: pretix/control/templates/pretixcontrol/pdf/index.html:164 msgid "Uploading new PDF background…" msgstr "تحميل خلفية PDF جديدة ..." @@ -27391,7 +27672,7 @@ msgstr "يرجى التأكد من طباعة أو نسخ الرموز الطو #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:4 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:4 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:6 -#: pretix/control/templates/pretixcontrol/user/settings.html:45 +#: pretix/control/templates/pretixcontrol/user/settings.html:73 msgid "Two-factor authentication" msgstr "توثيق ذو عاملين" @@ -27409,7 +27690,7 @@ msgstr "هل أنت متأكد أنك تريد حذف التواريخ التا #: pretix/control/templates/pretixcontrol/user/2fa_leaveteams.html:15 #: pretix/control/templates/pretixcontrol/user/2fa_main.html:38 -#: pretix/control/templates/pretixcontrol/users/form.html:70 +#: pretix/control/templates/pretixcontrol/users/form.html:71 #, python-format msgid "Team \"%(team)s\" of organizer \"%(organizer)s\"" msgstr "فريق \"%(team)s\" منظم \"%(organizer)s\"" @@ -27532,6 +27813,40 @@ msgstr "هل تريد حقا أن تجديد رموز الطوارئ الخاص msgid "The old codes will no longer work." msgstr "سوف الرموز القديمة لم تعد تعمل." +#: pretix/control/templates/pretixcontrol/user/change_email.html:4 +#: pretix/control/templates/pretixcontrol/user/change_email.html:8 +#, fuzzy +#| msgid "Verified email address" +msgid "Change login email address" +msgstr "تم التحقق من عنوان البريد الإلكتروني" + +#: pretix/control/templates/pretixcontrol/user/change_email.html:13 +msgid "" +"This changes the email address used to login to your account, as well as " +"where we send email notifications." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/change_email.html:18 +msgid "" +"We will send a confirmation code to your new email address, which you need " +"to enter in the next step to confirm the email address is correct." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/change_password.html:4 +#: pretix/control/templates/pretixcontrol/user/change_password.html:8 +#: pretix/control/templates/pretixcontrol/user/change_password.html:20 +#: pretix/control/templates/pretixcontrol/user/settings.html:67 +#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:28 +msgid "Change password" +msgstr "قم بتغيير كلمة المرور" + +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:4 +#: pretix/control/templates/pretixcontrol/user/confirmation_code_dialog.html:8 +#, fuzzy +#| msgid "Confirmation code" +msgid "Enter confirmation code" +msgstr "رمز التأكيد" + #: pretix/control/templates/pretixcontrol/user/notifications.html:4 #: pretix/control/templates/pretixcontrol/user/notifications.html:6 msgid "Notification settings" @@ -27575,13 +27890,13 @@ msgstr "عالمي" #: pretix/control/templates/pretixcontrol/user/notifications.html:70 #: pretix/control/templates/pretixcontrol/user/notifications.html:72 -#: pretix/control/templates/pretixcontrol/user/settings.html:20 +#: pretix/control/templates/pretixcontrol/user/settings.html:38 msgid "On" msgstr "على" #: pretix/control/templates/pretixcontrol/user/notifications.html:70 #: pretix/control/templates/pretixcontrol/user/notifications.html:71 -#: pretix/control/templates/pretixcontrol/user/settings.html:24 +#: pretix/control/templates/pretixcontrol/user/settings.html:42 msgid "Off" msgstr "إيقاف" @@ -27618,23 +27933,36 @@ msgid "Log in as someone else" msgstr "تسجيل الدخول باسم شخص آخر" #: pretix/control/templates/pretixcontrol/user/settings.html:4 -#: pretix/control/templates/pretixcontrol/user/settings.html:6 +#: pretix/control/templates/pretixcontrol/user/settings.html:24 msgid "Account settings" msgstr "إعدادت الحساب" -#: pretix/control/templates/pretixcontrol/user/settings.html:35 +#: pretix/control/templates/pretixcontrol/user/settings.html:9 +msgid "" +"Your email address is not confirmed yet. To secure your account, please " +"confirm your email address using a confirmation code we will send to your " +"email address." +msgstr "" + +#: pretix/control/templates/pretixcontrol/user/settings.html:18 +#, fuzzy +#| msgid "Send information via email" +msgid "Send confirmation email" +msgstr "أرسل المعلومات إلى البريد الإلكتروني" + +#: pretix/control/templates/pretixcontrol/user/settings.html:53 msgid "Login settings" msgstr "إعدادات تسجيل الدخول" -#: pretix/control/templates/pretixcontrol/user/settings.html:50 +#: pretix/control/templates/pretixcontrol/user/settings.html:78 msgid "Change two-factor settings" msgstr "تغيير إعدادات اثنين عامل" -#: pretix/control/templates/pretixcontrol/user/settings.html:65 +#: pretix/control/templates/pretixcontrol/user/settings.html:93 msgid "Show applications" msgstr "مشاهدة التطبيقات" -#: pretix/control/templates/pretixcontrol/user/settings.html:74 +#: pretix/control/templates/pretixcontrol/user/settings.html:102 msgid "Show account history" msgstr "مشاهدة حساب التاريخ" @@ -27718,15 +28046,15 @@ msgstr "المستخدم انتحال" msgid "Authentication backend" msgstr "المصادقة الخلفية" -#: pretix/control/templates/pretixcontrol/users/form.html:65 +#: pretix/control/templates/pretixcontrol/users/form.html:66 msgid "Team memberships" msgstr "عضوية فريق" -#: pretix/control/templates/pretixcontrol/users/form.html:89 +#: pretix/control/templates/pretixcontrol/users/form.html:90 msgid "User history" msgstr "التاريخ المستخدم" -#: pretix/control/templates/pretixcontrol/users/form.html:98 +#: pretix/control/templates/pretixcontrol/users/form.html:99 msgid "User created." msgstr "المستخدمين التي تم إنشاؤها." @@ -28245,17 +28573,17 @@ msgid "" "team." msgstr "لا يمكنك قبول الدعوة ل \"{}\" كما كنت بالفعل جزءا من هذا الفريق." -#: pretix/control/views/auth.py:266 +#: pretix/control/views/auth.py:269 #, python-brace-format msgid "You are now part of the team \"{}\"." msgstr "أنت الآن جزءا من الفريق \"{}\"." -#: pretix/control/views/auth.py:296 +#: pretix/control/views/auth.py:300 #, python-brace-format msgid "Welcome to pretix! You are now part of the team \"{}\"." msgstr "مرحبا بكم في pretix! أنت الآن جزءا من الفريق \"{}\"." -#: pretix/control/views/auth.py:357 +#: pretix/control/views/auth.py:361 #, fuzzy #| msgid "" #| "If the address is registered to valid account, then we have sent you an e-" @@ -28270,7 +28598,7 @@ msgstr "" "تحتوي على مزيد من التعليمات. يرجى ملاحظة أننا سوف ترسل في معظم بريد إلكتروني " "واحد كل 24 ساعة." -#: pretix/control/views/auth.py:360 +#: pretix/control/views/auth.py:364 #, fuzzy #| msgid "" #| "If the address is registered to valid account, then we have sent you an e-" @@ -28282,7 +28610,7 @@ msgstr "" "إذا تم REGISTRED العنوان لحساب صالح، ثم لقد قمنا بإرسال رسالة بريد إلكتروني " "تحتوي على مزيد من التعليمات." -#: pretix/control/views/auth.py:380 +#: pretix/control/views/auth.py:384 msgid "" "You clicked on an invalid link. Please check that you copied the full web " "address into your address bar. Please note that the link is only valid for " @@ -28292,19 +28620,19 @@ msgstr "" "شريط العنوان. يرجى ملاحظة أن هذا العنوان هو صالح فقط لمدة ثلاثة أيام وذلك " "على الرابط يمكن استخدامها مرة واحدة فقط." -#: pretix/control/views/auth.py:383 +#: pretix/control/views/auth.py:387 msgid "We were unable to find the user you requested a new password for." msgstr "لم نتمكن من العثور على المستخدم الذي طلب كلمة مرور جديدة ل." -#: pretix/control/views/auth.py:421 +#: pretix/control/views/auth.py:425 msgid "You can now login using your new password." msgstr "يمكنك الآن تسجيل الدخول باستخدام كلمة المرور الجديدة." -#: pretix/control/views/auth.py:473 +#: pretix/control/views/auth.py:477 msgid "Please try again." msgstr "حاول مرة اخرى." -#: pretix/control/views/auth.py:551 +#: pretix/control/views/auth.py:555 msgid "Invalid code, please try again." msgstr "رمز غير صالح، يرجى المحاولة مرة أخرى." @@ -28329,17 +28657,18 @@ msgstr "تم إنشاء الاختيار في قائمة جديدة." #: pretix/control/views/checkin.py:381 pretix/control/views/checkin.py:441 #: pretix/control/views/discounts.py:134 pretix/control/views/discounts.py:182 #: pretix/control/views/event.py:275 pretix/control/views/event.py:579 -#: pretix/control/views/event.py:618 pretix/control/views/event.py:781 -#: pretix/control/views/event.py:973 pretix/control/views/event.py:1333 -#: pretix/control/views/event.py:1399 pretix/control/views/event.py:1551 -#: pretix/control/views/item.py:280 pretix/control/views/item.py:327 -#: pretix/control/views/item.py:805 pretix/control/views/item.py:831 -#: pretix/control/views/item.py:951 pretix/control/views/item.py:1155 -#: pretix/control/views/item.py:1321 pretix/control/views/item.py:1506 +#: pretix/control/views/event.py:618 pretix/control/views/event.py:800 +#: pretix/control/views/event.py:992 pretix/control/views/event.py:1342 +#: pretix/control/views/event.py:1408 pretix/control/views/event.py:1560 +#: pretix/control/views/item.py:281 pretix/control/views/item.py:328 +#: pretix/control/views/item.py:806 pretix/control/views/item.py:832 +#: pretix/control/views/item.py:952 pretix/control/views/item.py:1156 +#: pretix/control/views/item.py:1322 pretix/control/views/item.py:1518 #: pretix/control/views/organizer.py:275 pretix/control/views/organizer.py:303 #: pretix/control/views/organizer.py:1457 pretix/control/views/subevents.py:521 #: pretix/control/views/subevents.py:647 pretix/control/views/subevents.py:1063 -#: pretix/control/views/subevents.py:1522 pretix/control/views/user.py:358 +#: pretix/control/views/subevents.py:1522 pretix/control/views/user.py:345 +#: pretix/control/views/user.py:858 pretix/control/views/user.py:898 #: pretix/control/views/vouchers.py:277 pretix/control/views/vouchers.py:351 #: pretix/control/views/vouchers.py:534 pretix/control/views/waitinglist.py:420 #: pretix/plugins/autocheckin/views.py:112 @@ -28537,8 +28866,8 @@ msgstr "تم إنشاء الموعد الجديد." msgid "The order of discounts has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:190 -#: pretix/control/views/item.py:402 pretix/control/views/item.py:536 +#: pretix/control/views/discounts.py:260 pretix/control/views/item.py:191 +#: pretix/control/views/item.py:403 pretix/control/views/item.py:537 #: pretix/control/views/organizer.py:2558 #: pretix/control/views/organizer.py:3618 #, fuzzy @@ -28576,39 +28905,39 @@ msgid "" "This payment provider does not exist or the respective plugin is disabled." msgstr "عدم وجود هذا مزود خدمة الدفع أو تعطيل البرنامج المساعد المعني." -#: pretix/control/views/event.py:820 pretix/control/views/organizer.py:356 +#: pretix/control/views/event.py:839 pretix/control/views/organizer.py:356 #: pretix/control/views/vouchers.py:561 msgid "invalid item" msgstr "البند غير صالح" -#: pretix/control/views/event.py:895 +#: pretix/control/views/event.py:914 #, fuzzy, python-format #| msgid "Your order: {code}" msgid "Your order: %(code)s" msgstr "طلبك هو: {code}" -#: pretix/control/views/event.py:904 +#: pretix/control/views/event.py:923 msgid "Unknown email renderer." msgstr "غير معروف العارض البريد الإلكتروني." -#: pretix/control/views/event.py:920 pretix/control/views/orders.py:679 +#: pretix/control/views/event.py:939 pretix/control/views/orders.py:684 #: pretix/presale/views/order.py:1111 pretix/presale/views/order.py:1118 msgid "You requested an invalid ticket output type." msgstr "لقد طلبت صالح نوع الانتاج التذاكر." -#: pretix/control/views/event.py:1068 +#: pretix/control/views/event.py:1087 msgid "Your shop is live now!" msgstr "متجرك مباشرة الآن!" -#: pretix/control/views/event.py:1076 +#: pretix/control/views/event.py:1095 msgid "We've taken your shop down. You can re-enable it whenever you want!" msgstr "لقد اتخذنا متجر أسفل الخاص بك. يمكنك إعادة تمكينها وقتما تشاء!" -#: pretix/control/views/event.py:1084 +#: pretix/control/views/event.py:1103 msgid "Your shop is now in test mode!" msgstr "متجر الخاص بك هو الآن في وضع الاختبار!" -#: pretix/control/views/event.py:1101 +#: pretix/control/views/event.py:1120 msgid "" "An order could not be deleted as some constraints (e.g. data created by plug-" "ins) do not allow it." @@ -28616,19 +28945,19 @@ msgstr "" "لا يمكن حذف أمر وبعض القيود (مثل البيانات التي تم إنشاؤها من قبل المكونات " "الإضافية) لا تسمح بذلك." -#: pretix/control/views/event.py:1107 +#: pretix/control/views/event.py:1126 msgid "We've disabled test mode for you. Let's sell some real tickets!" msgstr "لقد تعطيل وضع الاختبار بالنسبة لك. دعونا بيع بعض التذاكر الحقيقية!" -#: pretix/control/views/event.py:1129 +#: pretix/control/views/event.py:1148 msgid "This event can not be deleted." msgstr "لا يمكن حذف هذا الحدث." -#: pretix/control/views/event.py:1152 +#: pretix/control/views/event.py:1171 msgid "The event has been deleted." msgstr "الحدث تم الغائه." -#: pretix/control/views/event.py:1155 +#: pretix/control/views/event.py:1174 msgid "" "The event could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." @@ -28636,47 +28965,47 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/event.py:1171 +#: pretix/control/views/event.py:1190 #, python-brace-format msgid "" "Specifically, the following plugins still contain data depends on this " "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:772 +#: pretix/control/views/event.py:1270 pretix/control/views/orders.py:777 msgid "The comment has been updated." msgstr "تم تحديث التعليق." -#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:774 +#: pretix/control/views/event.py:1272 pretix/control/views/orders.py:779 msgid "Could not update the comment." msgstr "لا يمكن تحديث للتعليق." -#: pretix/control/views/event.py:1291 pretix/control/views/main.py:337 +#: pretix/control/views/event.py:1300 pretix/control/views/main.py:337 msgid "VAT" msgstr "ضريبة" -#: pretix/control/views/event.py:1327 +#: pretix/control/views/event.py:1336 msgid "The new tax rule has been created." msgstr "تم إنشاء القاعدة الضريبية الجديدة." -#: pretix/control/views/event.py:1350 pretix/control/views/event.py:1413 -#: pretix/control/views/event.py:1459 +#: pretix/control/views/event.py:1359 pretix/control/views/event.py:1422 +#: pretix/control/views/event.py:1468 msgid "The requested tax rule does not exist." msgstr "عدم وجود حكم الضرائب المطلوبة." -#: pretix/control/views/event.py:1468 +#: pretix/control/views/event.py:1477 msgid "The selected tax rule has been deleted." msgstr "تم حذف قاعدة الضريبة المحدد." -#: pretix/control/views/event.py:1470 +#: pretix/control/views/event.py:1479 msgid "The selected tax rule can not be deleted." msgstr "لا يمكن حذف القاعدة الضريبية المحدد." -#: pretix/control/views/event.py:1521 +#: pretix/control/views/event.py:1530 msgid "Your event is not empty, you need to set it up manually." msgstr "لم يتم تفريغ هذا الحدث الخاص بك، تحتاج إلى إعداده يدويا." -#: pretix/control/views/event.py:1656 +#: pretix/control/views/event.py:1665 msgid "" "Your changes have been saved. You can now go on with looking at the details " "or take your event live to start selling!" @@ -28684,11 +29013,11 @@ msgstr "" "تم حفظ التغييرات. يمكنك الذهاب الآن فصاعدا مع النظر في التفاصيل أو يأخذ " "الحدث على الهواء مباشرة لبدء بيع!" -#: pretix/control/views/event.py:1675 +#: pretix/control/views/event.py:1684 msgid "Regular ticket" msgstr "تذكرة العادية" -#: pretix/control/views/event.py:1680 +#: pretix/control/views/event.py:1689 msgid "Reduced ticket" msgstr "تذكرة مخفضة" @@ -28768,32 +29097,32 @@ msgid "" "plugin \"{plugin}\" with license \"{license}\"." msgstr "" -#: pretix/control/views/item.py:139 pretix/control/views/item.py:1600 +#: pretix/control/views/item.py:140 pretix/control/views/item.py:1623 msgid "The requested product does not exist." msgstr "المنتج المطلوب غير موجود." -#: pretix/control/views/item.py:157 +#: pretix/control/views/item.py:158 msgid "The order of items has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/item.py:225 pretix/control/views/item.py:260 -#: pretix/control/views/item.py:351 +#: pretix/control/views/item.py:226 pretix/control/views/item.py:261 +#: pretix/control/views/item.py:352 msgid "The requested product category does not exist." msgstr "لا وجود فئة من فئات المنتجات المطلوبة." -#: pretix/control/views/item.py:236 +#: pretix/control/views/item.py:237 msgid "The selected category has been deleted." msgstr "تم حذف الفئة المختارة." -#: pretix/control/views/item.py:321 +#: pretix/control/views/item.py:322 msgid "The new category has been created." msgstr "تم إنشاء فئة جديدة." -#: pretix/control/views/item.py:369 +#: pretix/control/views/item.py:370 msgid "The order of categories has been updated." msgstr "تم تحديث ترتيب الفئات." -#: pretix/control/views/item.py:405 pretix/control/views/item.py:539 +#: pretix/control/views/item.py:406 pretix/control/views/item.py:540 #: pretix/control/views/organizer.py:2561 #: pretix/control/views/organizer.py:3621 #, fuzzy @@ -28801,86 +29130,86 @@ msgstr "تم تحديث ترتيب الفئات." msgid "Not all objects have been selected." msgstr "تم حذف السؤال." -#: pretix/control/views/item.py:478 +#: pretix/control/views/item.py:479 #, fuzzy #| msgid "Street address" msgid "Street" msgstr "عنوان الشارع" -#: pretix/control/views/item.py:580 pretix/control/views/item.py:759 -#: pretix/control/views/item.py:781 +#: pretix/control/views/item.py:581 pretix/control/views/item.py:760 +#: pretix/control/views/item.py:782 msgid "The requested question does not exist." msgstr "عدم وجود مسألة المطلوبة." -#: pretix/control/views/item.py:598 +#: pretix/control/views/item.py:599 msgid "The selected question has been deleted." msgstr "تم حذف السؤال المحدد." -#: pretix/control/views/item.py:708 +#: pretix/control/views/item.py:709 msgid "File uploaded" msgstr "ملف مرفوع" -#: pretix/control/views/item.py:840 +#: pretix/control/views/item.py:841 msgid "The new question has been created." msgstr "تم إنشاء سؤالا جديدا." -#: pretix/control/views/item.py:919 +#: pretix/control/views/item.py:920 msgid "The new quota has been created." msgstr "تم إنشاء نظام الحصص الجديدة." -#: pretix/control/views/item.py:982 +#: pretix/control/views/item.py:983 #, fuzzy #| msgid "First scanned: %(date)s" msgid "Exit scans" msgstr "الممسوحة ضوئيا أولا: %(date)s" -#: pretix/control/views/item.py:989 +#: pretix/control/views/item.py:990 msgid "Vouchers and waiting list reservations" msgstr "القسائم وانتظار التحفظات القائمة" -#: pretix/control/views/item.py:1004 +#: pretix/control/views/item.py:1005 msgid "Available quota" msgstr "الحصة المتاحة" -#: pretix/control/views/item.py:1010 +#: pretix/control/views/item.py:1011 msgid "Waiting list (pending)" msgstr "قائمة الانتظار (انتظار)" -#: pretix/control/views/item.py:1017 +#: pretix/control/views/item.py:1018 msgid "Currently for sale" msgstr "للبيع حاليا" -#: pretix/control/views/item.py:1071 pretix/control/views/item.py:1117 -#: pretix/control/views/item.py:1171 +#: pretix/control/views/item.py:1072 pretix/control/views/item.py:1118 +#: pretix/control/views/item.py:1172 msgid "The requested quota does not exist." msgstr "عدم وجود الحصص المطلوبة." -#: pretix/control/views/item.py:1092 +#: pretix/control/views/item.py:1093 msgid "The quota has been re-opened and will not close again." msgstr "وكانت الحصة إعادة فتحها وسوف يتم إغلاق مرة أخرى." -#: pretix/control/views/item.py:1185 +#: pretix/control/views/item.py:1186 msgid "The selected quota has been deleted." msgstr "تم حذف حصص المحدد." -#: pretix/control/views/item.py:1208 +#: pretix/control/views/item.py:1209 msgid "The requested item does not exist." msgstr "عدم وجود العنصر المطلوب." -#: pretix/control/views/item.py:1380 +#: pretix/control/views/item.py:1381 msgid "" "You cannot add add-ons to a product that is only available as an add-on " "itself." msgstr "" "لا يمكنك إضافة من الإضافات إلى المنتجات التي لا تتوفر إلا كإضافة على نفسها." -#: pretix/control/views/item.py:1390 +#: pretix/control/views/item.py:1391 msgid "" "You cannot add bundles to a product that is only available as an add-on " "itself." msgstr "لا يمكنك إضافة حزم إلى المنتجات التي لا تتوفر إلا كإضافة على نفسها." -#: pretix/control/views/item.py:1522 +#: pretix/control/views/item.py:1534 msgid "" "You disabled this item, but it is still part of a product bundle. Your " "participants won't be able to buy the bundle unless you remove this item " @@ -28889,7 +29218,7 @@ msgstr "" "قمت بتعطيل هذا البند، لكنه لا يزال جزءا من حزمة المنتج. سيقوم المشاركون " "الخاصة بك لن تكون قادرة على شراء حزمة إلا إذا قمت بإزالة هذا البند من ذلك." -#: pretix/control/views/item.py:1620 +#: pretix/control/views/item.py:1643 #, fuzzy #| msgid "" #| "The order could not be deleted as some constraints (e.g. data created by " @@ -28902,11 +29231,11 @@ msgstr "" "لا يمكن حذف النظام كما بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/item.py:1624 +#: pretix/control/views/item.py:1647 msgid "The selected product has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/views/item.py:1633 +#: pretix/control/views/item.py:1656 msgid "The selected product has been deactivated." msgstr "تم إلغاء تنشيط المنتج المحدد." @@ -29015,19 +29344,19 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "تم إبطال وصول التطبيق المحدد." -#: pretix/control/views/orders.py:194 +#: pretix/control/views/orders.py:197 #, fuzzy #| msgid "We could not save your changes. See below for details." msgid "We could not process your input. See below for details." msgstr "لم نتمكن من حفظ التغييرات الخاصة بك. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/orders.py:267 +#: pretix/control/views/orders.py:270 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:681 pretix/presale/views/order.py:161 +#: pretix/control/views/orders.py:686 pretix/presale/views/order.py:161 #: pretix/presale/views/order.py:243 pretix/presale/views/order.py:337 #: pretix/presale/views/order.py:364 pretix/presale/views/order.py:432 #: pretix/presale/views/order.py:499 pretix/presale/views/order.py:545 @@ -29035,19 +29364,19 @@ msgstr "" #: pretix/presale/views/order.py:936 pretix/presale/views/order.py:951 #: pretix/presale/views/order.py:1000 pretix/presale/views/order.py:1005 #: pretix/presale/views/order.py:1120 pretix/presale/views/order.py:1297 -#: pretix/presale/views/order.py:1689 pretix/presale/views/order.py:1720 +#: pretix/presale/views/order.py:1692 pretix/presale/views/order.py:1723 msgid "Unknown order code or not authorized to access this order." msgstr "كود أجل غير معروف أو غير مخول للوصول إلى هذا النظام." -#: pretix/control/views/orders.py:683 pretix/presale/views/order.py:1125 +#: pretix/control/views/orders.py:688 pretix/presale/views/order.py:1125 msgid "Ticket download is not enabled for this product." msgstr "لم يتم تمكين حمل تذكرة لهذا المنتج." -#: pretix/control/views/orders.py:808 +#: pretix/control/views/orders.py:813 msgid "The order has been deleted." msgstr "تم حذف هذا الأمر." -#: pretix/control/views/orders.py:815 +#: pretix/control/views/orders.py:820 msgid "" "The order could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." @@ -29055,55 +29384,55 @@ msgstr "" "لا يمكن حذف النظام كما بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/orders.py:823 +#: pretix/control/views/orders.py:828 msgid "Only orders created in test mode can be deleted." msgstr "أوامر الوحيدة التي تم إنشاؤها في وضع الاختبار يمكن حذفها." -#: pretix/control/views/orders.py:844 +#: pretix/control/views/orders.py:849 msgid "The order has been denied and is therefore now canceled." msgstr "تم رفض الطلب، وبالتالي يتم إلغاء الآن." -#: pretix/control/views/orders.py:884 +#: pretix/control/views/orders.py:889 msgid "This payment has been canceled." msgstr "تم إلغاء هذا الدفع." -#: pretix/control/views/orders.py:886 +#: pretix/control/views/orders.py:891 msgid "This payment can not be canceled at the moment." msgstr "لا يمكن إلغاء هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:912 +#: pretix/control/views/orders.py:917 msgid "The refund has been canceled." msgstr "تم إلغاء استرداد." -#: pretix/control/views/orders.py:914 +#: pretix/control/views/orders.py:919 msgid "This refund can not be canceled at the moment." msgstr "لا يمكن إلغاء هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:948 +#: pretix/control/views/orders.py:953 msgid "The refund has been processed." msgstr "تم معالجة استرداد." -#: pretix/control/views/orders.py:950 pretix/control/views/orders.py:976 +#: pretix/control/views/orders.py:955 pretix/control/views/orders.py:981 msgid "This refund can not be processed at the moment." msgstr "لا يمكن معالجة هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:974 +#: pretix/control/views/orders.py:979 msgid "The refund has been marked as done." msgstr "تم وضع علامة على المبلغ في القيام به." -#: pretix/control/views/orders.py:1000 +#: pretix/control/views/orders.py:1005 #, fuzzy #| msgid "The device has been verified and can now be used." msgid "The request has been removed. If you want, you can now inform the user." msgstr "تم التحقق من الجهاز ويمكن الآن أن تستخدم." -#: pretix/control/views/orders.py:1007 +#: pretix/control/views/orders.py:1012 #, fuzzy #| msgid "Cancellation fee" msgid "Your cancellation request" msgstr "رسوم الإلغاء" -#: pretix/control/views/orders.py:1008 +#: pretix/control/views/orders.py:1013 #, python-brace-format msgid "" "Hello,\n" @@ -29119,7 +29448,7 @@ msgstr "" "\n" "فريق فعاليتك{event}" -#: pretix/control/views/orders.py:1064 +#: pretix/control/views/orders.py:1069 msgid "" "The payment has been marked as complete, but we were unable to send a " "confirmation mail." @@ -29127,41 +29456,41 @@ msgstr "" "تم وضع علامة الدفع على النحو الكامل، ولكن لم نتمكن من إرسال البريد " "الإلكتروني تأكيد." -#: pretix/control/views/orders.py:1067 +#: pretix/control/views/orders.py:1072 msgid "The payment has been marked as complete." msgstr "تم وضع علامة الدفع على النحو الكامل." -#: pretix/control/views/orders.py:1069 +#: pretix/control/views/orders.py:1074 msgid "This payment can not be confirmed at the moment." msgstr "لا يمكن تأكيد هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:1160 +#: pretix/control/views/orders.py:1165 msgid "" "The refund was prevented due to a refund already being processed at the same " "time. Please have a look at the order details and check if your refund is " "still necessary." msgstr "" -#: pretix/control/views/orders.py:1261 +#: pretix/control/views/orders.py:1266 #, fuzzy #| msgid "You entered an order that could not be found." msgid "You entered an order in an event with a different currency." msgstr "لقد أدخلت طلبا لا يمكن العثور عليه." -#: pretix/control/views/orders.py:1312 +#: pretix/control/views/orders.py:1317 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "لا يمكنك استرداد أكثر من مبلغ الدفعة التي لم يتم ردها حتى الان." -#: pretix/control/views/orders.py:1317 +#: pretix/control/views/orders.py:1322 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" "لقد حددت استرداد جزئي لطريقة الدفع التي تدعم فقط المبالغ المستردة كامل." -#: pretix/control/views/orders.py:1347 +#: pretix/control/views/orders.py:1352 #, python-brace-format msgid "" "One of the refunds failed to be processed. You should retry to refund in a " @@ -29170,12 +29499,12 @@ msgstr "" "فشل في معالجتها واحدة من المبالغ المستردة. يجب عليك إعادة المحاولة لاسترداد " "بطريقة مختلفة. وكانت رسالة الخطأ: {}" -#: pretix/control/views/orders.py:1353 +#: pretix/control/views/orders.py:1358 #, python-brace-format msgid "A refund of {} has been processed." msgstr "وقد تم تجهيز واسترداد {}." -#: pretix/control/views/orders.py:1357 +#: pretix/control/views/orders.py:1362 #, python-brace-format msgid "" "A refund of {} has been saved, but not yet fully executed. You can mark it " @@ -29184,16 +29513,16 @@ msgstr "" "تم حفظ استرداد {}، ولكن لم يتم تنفيذها بالكامل. يمكنك وضع علامة على أنها " "كاملة أدناه." -#: pretix/control/views/orders.py:1386 +#: pretix/control/views/orders.py:1391 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1394 +#: pretix/control/views/orders.py:1399 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1396 +#: pretix/control/views/orders.py:1401 #, python-brace-format msgid "" "Hello,\n" @@ -29206,22 +29535,22 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1407 +#: pretix/control/views/orders.py:1412 msgid "The refunds you selected do not match the selected total refund amount." msgstr "المبالغ المستردة التي حددتها لا تتطابق إجمالي استرداد المبلغ المحدد." -#: pretix/control/views/orders.py:1537 +#: pretix/control/views/orders.py:1542 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." msgstr "" "تم وضع علامة على النظام ودفع، ولكن لم نتمكن من إرسال البريد الإلكتروني تأكيد." -#: pretix/control/views/orders.py:1540 +#: pretix/control/views/orders.py:1545 msgid "The payment has been created successfully." msgstr "تم إنشاء دفع بنجاح." -#: pretix/control/views/orders.py:1554 +#: pretix/control/views/orders.py:1559 msgid "" "The order has been canceled. You can now select how you want to transfer the " "money back to the user." @@ -29229,22 +29558,22 @@ msgstr "" "تم إلغاء هذا الأمر. يمكنك الآن تحديد كيف تريد لنقل الجزء الخلفي المال " "للمستخدم." -#: pretix/control/views/orders.py:1625 pretix/control/views/orders.py:1629 +#: pretix/control/views/orders.py:1630 pretix/control/views/orders.py:1634 msgid "No VAT ID specified." msgstr "يتم تحديد معرف ضريبة القيمة المضافة." -#: pretix/control/views/orders.py:1633 +#: pretix/control/views/orders.py:1638 msgid "No country specified." msgstr "تحديد أي بلد." -#: pretix/control/views/orders.py:1637 +#: pretix/control/views/orders.py:1642 #, fuzzy #| msgid "" #| "VAT ID could not be checked since a non-EU country has been specified." msgid "VAT ID could not be checked since this country is not supported." msgstr "ولم يتسن التحقق VAT ID منذ تم تحديد بلد خارج الاتحاد الأوروبي." -#: pretix/control/views/orders.py:1648 +#: pretix/control/views/orders.py:1653 msgid "" "The VAT ID could not be checked, as the VAT checking service of the country " "is currently not available." @@ -29252,68 +29581,68 @@ msgstr "" "ولم يتسن التحقق من هوية ضريبة القيمة المضافة، مثل خدمة فحص ضريبة القيمة " "المضافة من البلاد غير متوفرة حاليا." -#: pretix/control/views/orders.py:1651 +#: pretix/control/views/orders.py:1656 msgid "This VAT ID is valid." msgstr "هذا ID VAT صالح." -#: pretix/control/views/orders.py:1665 pretix/control/views/orders.py:1699 -#: pretix/control/views/orders.py:1731 +#: pretix/control/views/orders.py:1670 pretix/control/views/orders.py:1704 +#: pretix/control/views/orders.py:1736 msgid "Unknown invoice." msgstr "فاتورة غير معروفة." -#: pretix/control/views/orders.py:1668 +#: pretix/control/views/orders.py:1673 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1670 +#: pretix/control/views/orders.py:1675 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1672 pretix/control/views/orders.py:1734 +#: pretix/control/views/orders.py:1677 pretix/control/views/orders.py:1739 msgid "The invoice has already been canceled." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1674 +#: pretix/control/views/orders.py:1679 #, fuzzy #| msgid "The invoice has already been canceled." msgid "The invoice file has already been exported." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1676 +#: pretix/control/views/orders.py:1681 #, fuzzy #| msgid "The invoice has been regenerated." msgid "The invoice file is too old to be regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/views/orders.py:1678 pretix/control/views/orders.py:1736 +#: pretix/control/views/orders.py:1683 pretix/control/views/orders.py:1741 msgid "The invoice has been cleaned of personal data." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1703 +#: pretix/control/views/orders.py:1708 msgid "" "The invoice is currently being transmitted. You can start a new attempt " "after the current one has been completed." msgstr "" -#: pretix/control/views/orders.py:1710 +#: pretix/control/views/orders.py:1715 #, fuzzy #| msgid "The invoice has been cleaned of personal data." msgid "The invoice has been scheduled for retransmission." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1767 +#: pretix/control/views/orders.py:1791 msgid "The email has been queued to be sent." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/views/orders.py:1791 pretix/presale/views/order.py:1306 +#: pretix/control/views/orders.py:1815 pretix/presale/views/order.py:1306 msgid "This invoice has not been found" msgstr "لم يتم العثور على هذه الفاتورة" -#: pretix/control/views/orders.py:1798 pretix/presale/views/order.py:1313 +#: pretix/control/views/orders.py:1822 pretix/presale/views/order.py:1313 msgid "The invoice file is no longer stored on the server." msgstr "لم يعد تخزين الملف فاتورة على الخادم." -#: pretix/control/views/orders.py:1803 pretix/presale/views/order.py:1318 +#: pretix/control/views/orders.py:1827 pretix/presale/views/order.py:1318 msgid "" "The invoice file has not yet been generated, we will generate it for you " "now. Please try again in a few seconds." @@ -29321,107 +29650,107 @@ msgstr "" "لم يتم إنشاء ملف الفاتورة، وسوف تولد لانها لكم الآن. يرجى المحاولة مرة أخرى " "في بضع ثوان." -#: pretix/control/views/orders.py:1831 +#: pretix/control/views/orders.py:1855 msgid "The payment term has been changed." msgstr "تم تغيير مصطلح الدفع." -#: pretix/control/views/orders.py:1836 pretix/control/views/orders.py:1893 +#: pretix/control/views/orders.py:1860 pretix/control/views/orders.py:1917 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "لم نكن قادرين على معالجة الطلب تماما كما كان الملقم مشغول جدا." -#: pretix/control/views/orders.py:1844 +#: pretix/control/views/orders.py:1868 msgid "This action is only allowed for pending orders." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/views/orders.py:1899 +#: pretix/control/views/orders.py:1923 #, fuzzy #| msgid "This action is only allowed for pending orders." msgid "This action is only allowed for canceled orders." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/views/orders.py:2156 pretix/presale/views/order.py:1592 +#: pretix/control/views/orders.py:2181 pretix/presale/views/order.py:1593 msgid "An error occurred. Please see the details below." msgstr "حدث خطأ. يرجى الاطلاع على التفاصيل أدناه." -#: pretix/control/views/orders.py:2164 +#: pretix/control/views/orders.py:2189 msgid "The order has been changed and the user has been notified." msgstr "تم تغيير النظام وتم إعلام المستخدم." -#: pretix/control/views/orders.py:2166 pretix/control/views/orders.py:2302 -#: pretix/control/views/orders.py:2339 pretix/presale/views/order.py:1627 +#: pretix/control/views/orders.py:2191 pretix/control/views/orders.py:2327 +#: pretix/control/views/orders.py:2364 pretix/presale/views/order.py:1629 msgid "The order has been changed." msgstr "تم تغيير النظام." -#: pretix/control/views/orders.py:2193 pretix/presale/checkoutflow.py:945 +#: pretix/control/views/orders.py:2218 pretix/presale/checkoutflow.py:943 #: pretix/presale/views/order.py:793 pretix/presale/views/order.py:911 msgid "" "We had difficulties processing your input. Please review the errors below." msgstr "كان لدينا صعوبات معالجة المدخلات الخاصة بك. يرجى مراجعة الأخطاء أدناه." -#: pretix/control/views/orders.py:2304 +#: pretix/control/views/orders.py:2329 msgid "Nothing about the order had to be changed." msgstr "كان شيئا عن هذا الأمر يجب أن يتغير." -#: pretix/control/views/orders.py:2385 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2410 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "لم نتمكن من إرسال البريد الإلكتروني. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/orders.py:2401 pretix/control/views/orders.py:2471 +#: pretix/control/views/orders.py:2426 pretix/control/views/orders.py:2496 #: pretix/plugins/sendmail/views.py:204 pretix/plugins/sendmail/views.py:671 #, python-brace-format msgid "Subject: {subject}" msgstr "الموضوع: {subject}" -#: pretix/control/views/orders.py:2420 pretix/control/views/orders.py:2491 +#: pretix/control/views/orders.py:2445 pretix/control/views/orders.py:2516 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "وقد اصطف رسالتك وسوف يتم ارسالهم الى {}." -#: pretix/control/views/orders.py:2424 pretix/control/views/orders.py:2494 +#: pretix/control/views/orders.py:2449 pretix/control/views/orders.py:2519 #, python-brace-format msgid "Failed to send mail to the following user: {}" msgstr "فشل في إرسال البريد الإلكتروني للمستخدم التالية: {}" -#: pretix/control/views/orders.py:2547 pretix/presale/views/order.py:1085 +#: pretix/control/views/orders.py:2572 pretix/presale/views/order.py:1085 msgid "" "This link is no longer valid. Please go back, refresh the page, and try " "again." msgstr "هذا الرابط لم يعد صالحا. يرجى العودة، بتحديث الصفحة وحاول مرة أخرى." -#: pretix/control/views/orders.py:2628 +#: pretix/control/views/orders.py:2653 msgid "There is no order with the given order code." msgstr "لا يوجد أي ترتيب مع رمز ترتيب معين." -#: pretix/control/views/orders.py:2734 pretix/control/views/organizer.py:2074 +#: pretix/control/views/orders.py:2759 pretix/control/views/organizer.py:2074 msgid "The selected exporter was not found." msgstr "لم يتم العثور على مصدر المحدد." -#: pretix/control/views/orders.py:2744 pretix/control/views/organizer.py:2084 +#: pretix/control/views/orders.py:2769 pretix/control/views/organizer.py:2084 msgid "There was a problem processing your input. See below for error details." msgstr "" "كانت هناك مشكلة معالجة المدخلات الخاصة بك. انظر أدناه للحصول على تفاصيل " "الخطأ." -#: pretix/control/views/orders.py:2779 pretix/control/views/organizer.py:2127 +#: pretix/control/views/orders.py:2804 pretix/control/views/organizer.py:2127 #, python-brace-format msgid "" "Your export schedule has been saved. The next export will start around " "{datetime}." msgstr "" -#: pretix/control/views/orders.py:2784 pretix/control/views/organizer.py:2132 +#: pretix/control/views/orders.py:2809 pretix/control/views/organizer.py:2132 msgid "Your export schedule has been saved, but no next export is planned." msgstr "" -#: pretix/control/views/orders.py:2823 pretix/control/views/organizer.py:2172 +#: pretix/control/views/orders.py:2848 pretix/control/views/organizer.py:2172 #, fuzzy, python-brace-format #| msgid "Export date" msgid "Export: {title}" msgstr "تاريخ التصدير" -#: pretix/control/views/orders.py:2824 pretix/control/views/organizer.py:2174 +#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2174 #, python-brace-format msgid "" "Hello,\n" @@ -29429,7 +29758,7 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2851 pretix/control/views/organizer.py:2207 +#: pretix/control/views/orders.py:2876 pretix/control/views/organizer.py:2207 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -29437,27 +29766,27 @@ msgid "" "therefore you cannot schedule it." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/control/views/orders.py:2904 pretix/control/views/organizer.py:2259 +#: pretix/control/views/orders.py:2929 pretix/control/views/organizer.py:2259 msgid "" "Your export is queued to start soon. The results will be send via email. " "Depending on system load and type and size of export, this may take a few " "minutes." msgstr "" -#: pretix/control/views/orders.py:2991 pretix/control/views/orders.py:3072 +#: pretix/control/views/orders.py:3016 pretix/control/views/orders.py:3097 #, fuzzy #| msgid "The order has been canceled." msgid "All orders have been canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/control/views/orders.py:2993 pretix/control/views/orders.py:3074 +#: pretix/control/views/orders.py:3018 pretix/control/views/orders.py:3099 #, python-brace-format msgid "" "The orders have been canceled. An error occurred with {count} orders, please " "check all uncanceled orders." msgstr "" -#: pretix/control/views/orders.py:3021 pretix/control/views/orders.py:3095 +#: pretix/control/views/orders.py:3046 pretix/control/views/orders.py:3120 #, fuzzy #| msgid "Your input was invalid, please try again." msgid "Your input was not valid." @@ -29807,23 +30136,23 @@ msgstr "" msgid "The order of sales channels has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/views/pdf.py:83 +#: pretix/control/views/pdf.py:85 #, fuzzy #| msgid "The uploaded PDF file is to large." msgid "The uploaded PDF file is too large." msgstr "ملف PDF مرفوع هو كبير." -#: pretix/control/views/pdf.py:85 +#: pretix/control/views/pdf.py:87 #, fuzzy #| msgid "The uploaded PDF file is to small." msgid "The uploaded PDF file is too small." msgstr "ملف PDF مرفوع هو صغير." -#: pretix/control/views/pdf.py:87 +#: pretix/control/views/pdf.py:89 msgid "Please only upload PDF files." msgstr "يرجى فقط تحميل الملفات PDF." -#: pretix/control/views/pdf.py:228 +#: pretix/control/views/pdf.py:233 #, python-brace-format msgid "Unfortunately, we were unable to process this PDF file ({reason})." msgstr "" @@ -29907,31 +30236,31 @@ msgstr "طلب {}" msgid "Voucher {}" msgstr "إيصال {}" -#: pretix/control/views/user.py:162 +#: pretix/control/views/user.py:167 msgid "The password you entered was invalid, please try again." msgstr "وكانت كلمة المرور التي أدخلتها غير صالحة، يرجى المحاولة مرة أخرى." -#: pretix/control/views/user.py:350 +#: pretix/control/views/user.py:337 msgid "Security devices are only available if pretix is served via HTTPS." msgstr "تتوفر فقط إذا يتم تقديم pretix عبر HTTPS الأجهزة الأمنية." -#: pretix/control/views/user.py:387 +#: pretix/control/views/user.py:374 msgid "A two-factor authentication device has been removed from your account." msgstr "تمت إزالة جهاز المصادقة اثنين عامل من حسابك." -#: pretix/control/views/user.py:398 +#: pretix/control/views/user.py:385 msgid "The device has been removed." msgstr "تمت إزالة الجهاز." -#: pretix/control/views/user.py:463 +#: pretix/control/views/user.py:450 msgid "This security device is already registered." msgstr "مسجلة بالفعل هذا الجهاز الأمني." -#: pretix/control/views/user.py:482 pretix/control/views/user.py:543 +#: pretix/control/views/user.py:469 pretix/control/views/user.py:530 msgid "A new two-factor authentication device has been added to your account." msgstr "تمت إضافة جهاز جديد اثنين عامل التوثيق إلى حسابك." -#: pretix/control/views/user.py:498 pretix/control/views/user.py:558 +#: pretix/control/views/user.py:485 pretix/control/views/user.py:545 msgid "" "Please note that you still need to enable two-factor authentication for your " "account using the buttons below to make a second factor required for logging " @@ -29940,15 +30269,15 @@ msgstr "" "يرجى الملاحظة التي لا تزال بحاجة لتمكين مصادقة اثنين عامل لحسابك باستخدام " "الأزرار أدناه لجعل العامل الثاني المطلوبة لتسجيل الدخول إلى حسابك." -#: pretix/control/views/user.py:501 pretix/control/views/user.py:561 +#: pretix/control/views/user.py:488 pretix/control/views/user.py:548 msgid "The device has been verified and can now be used." msgstr "تم التحقق من الجهاز ويمكن الآن أن تستخدم." -#: pretix/control/views/user.py:504 +#: pretix/control/views/user.py:491 msgid "The registration could not be completed. Please try again." msgstr "تعذر إكمال التسجيل. حاول مرة اخرى." -#: pretix/control/views/user.py:564 +#: pretix/control/views/user.py:551 msgid "" "The code you entered was not valid. If this problem persists, please check " "that the date and time of your phone are configured correctly." @@ -29956,27 +30285,27 @@ msgstr "" "كان الرمز الذي أدخلته غير صالح. إذا كانت هذه المشكلة قائمة، فيرجى التأكد من " "أن يتم تكوين التاريخ والوقت من الهاتف الخاص بك بشكل صحيح." -#: pretix/control/views/user.py:584 +#: pretix/control/views/user.py:571 #, fuzzy #| msgid "Do you really want to enable two-factor authentication?" msgid "You have left all teams that require two-factor authentication." msgstr "هل تريد حقا أن تمكين مصادقة اثنين عامل؟" -#: pretix/control/views/user.py:598 +#: pretix/control/views/user.py:585 msgid "" "Please configure at least one device before enabling two-factor " "authentication." msgstr "يرجى تكوين جهاز واحد على الأقل قبل تمكين مصادقة اثنين عامل." -#: pretix/control/views/user.py:607 +#: pretix/control/views/user.py:594 msgid "Two-factor authentication is now enabled for your account." msgstr "يتم تمكين مصادقة اثنين عامل الآن لحسابك." -#: pretix/control/views/user.py:623 +#: pretix/control/views/user.py:610 msgid "Two-factor authentication is now disabled for your account." msgstr "يتم تعطيل المصادقة اثنين عامل الآن لحسابك." -#: pretix/control/views/user.py:646 +#: pretix/control/views/user.py:633 msgid "" "Your emergency codes have been newly generated. Remember to store them in a " "safe place in case you lose access to your devices." @@ -29984,18 +30313,58 @@ msgstr "" "تم إنشاء حديثا رموز الطوارئ الخاصة بك. تذكر لتخزينها في مكان آمن في حالة " "فقدان الوصول إلى الأجهزة الخاصة بك." -#: pretix/control/views/user.py:662 +#: pretix/control/views/user.py:649 msgid "Your notifications have been disabled." msgstr "تم تعطيل الإشعارات." -#: pretix/control/views/user.py:711 pretix/control/views/user.py:751 +#: pretix/control/views/user.py:698 pretix/control/views/user.py:738 msgid "Your notification settings have been saved." msgstr "تم حفظ إعدادات الإشعار." -#: pretix/control/views/user.py:829 +#: pretix/control/views/user.py:816 msgid "Your comment has been saved." msgstr "تم حفظ تعليقك." +#: pretix/control/views/user.py:905 +#, fuzzy +#| msgid "Your email address has been updated." +msgid "Your email address was already verified." +msgstr "تم تحديث عنوان بريدك الإلكتروني." + +#: pretix/control/views/user.py:927 +#, python-brace-format +msgid "" +"Please enter the confirmation code we sent to your email address " +"{email}." +msgstr "" + +#: pretix/control/views/user.py:947 +#, fuzzy +#| msgid "" +#| "We were not able to process your request completely as the server was too " +#| "busy. Please try again." +msgid "We were unable to verify your confirmation code. Please try again." +msgstr "" +"لم نتمكن من معالجة طلبك بالكامل لأن الخادم كان مشغولا للغاية. حاول مرة اخرى." + +#: pretix/control/views/user.py:972 +#, fuzzy +#| msgid "Your email address has been changed to {email}." +msgid "Your email address has been changed successfully." +msgstr "تم تغيير عنوان البريد الإلكتروني الخاص بك إلى {email}." + +#: pretix/control/views/user.py:974 +#, fuzzy +#| msgid "Your email address has been changed to {email}." +msgid "Your email address has been confirmed successfully." +msgstr "تم تغيير عنوان البريد الإلكتروني الخاص بك إلى {email}." + +#: pretix/control/views/user.py:978 +#, fuzzy +#| msgid "The registration could not be completed. Please try again." +msgid "The entered confirmation code is not correct. Please try again." +msgstr "تعذر إكمال التسجيل. حاول مرة اخرى." + #: pretix/control/views/users.py:150 msgid "We sent out an email containing further instructions." msgstr "أرسلنا رسالة بريد إلكتروني تحتوي على مزيد من التعليمات." @@ -30725,20 +31094,18 @@ msgstr "" #: pretix/plugins/banktransfer/payment.py:97 #: pretix/plugins/banktransfer/payment.py:301 #: pretix/plugins/banktransfer/payment.py:491 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:16 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:15 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:18 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:50 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:6 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:24 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:26 msgid "IBAN" msgstr "رقم الحساب المصرفي الدولي IBAN" #: pretix/plugins/banktransfer/payment.py:107 #: pretix/plugins/banktransfer/payment.py:302 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:17 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:16 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:19 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:66 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:27 msgid "BIC" msgstr "رمز معرف الأعمال BIC" @@ -30851,11 +31218,10 @@ msgstr "يرجى تحويل المبلغ كاملا إلى الحساب المص #: pretix/plugins/banktransfer/payment.py:300 #: pretix/plugins/banktransfer/payment.py:488 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:15 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:5 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 -#: pretix/plugins/banktransfer/views.py:829 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 +#: pretix/plugins/banktransfer/views.py:831 #: pretix/plugins/stripe/payment.py:1458 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35 @@ -30863,9 +31229,8 @@ msgid "Account holder" msgstr "صاحب الحساب" #: pretix/plugins/banktransfer/payment.py:303 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:18 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:17 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:26 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:28 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:39 @@ -30896,7 +31261,7 @@ msgstr "رقم BIC (اختياري)" msgid "Your input was invalid, please see below for details." msgstr "الإدخالات الخاصة بك غير صالحة ، الرجاء انظر أدناه للحصول على التفاصيل." -#: pretix/plugins/banktransfer/refund_export.py:46 +#: pretix/plugins/banktransfer/refund_export.py:47 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:10 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:41 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:9 @@ -30905,7 +31270,7 @@ msgstr "الإدخالات الخاصة بك غير صالحة ، الرجاء msgid "Payer" msgstr "المسدد" -#: pretix/plugins/banktransfer/refund_export.py:93 +#: pretix/plugins/banktransfer/refund_export.py:90 msgid "Refund" msgstr "إعادة مال" @@ -30929,7 +31294,6 @@ msgstr "تم إلغاء الطلب سابقا." msgid "Currencies do not match." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:7 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:6 msgid "" "After completing your purchase, we will ask you to transfer the money to the " @@ -30938,7 +31302,6 @@ msgstr "" "بعد إتمام عملية الشراء ، سنطلب منك تحويل الأموال إلى الحساب المصرفي التالي ، " "باستخدام رمز مرجعي شخصي:" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:12 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:11 #, fuzzy #| msgid "" @@ -30949,21 +31312,18 @@ msgid "" "code after you completed the order." msgstr "سنخصص لك رمزا مرجعيا شخصيا لاستخدامه بعد إتمام الطلب." -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:27 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:26 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:39 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:22 msgid "Reference code (important):" msgstr "الرمز المرجعي (مهم):" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:32 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:31 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:30 msgid "" "We will assign you a personal reference code to use after you completed the " "order." msgstr "سنخصص لك رمزا مرجعيا شخصيا لاستخدامه بعد إتمام الطلب." -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:37 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:35 #, fuzzy #| msgid "" #| "After completing your purchase, we will ask you to transfer the money to " @@ -31129,17 +31489,17 @@ msgstr "المدفوعات المتجاهلة" msgid "Review invalid and ignored payments" msgstr "مراجعة المدفوعات غير الصالحة والمتجاهلة" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:38 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:27 msgid "Amount:" msgstr "مبلغ:" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:42 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:35 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:30 msgid "There is no further action required on this website." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:43 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:36 #: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:31 #, fuzzy #| msgid "" @@ -31151,19 +31511,19 @@ msgstr "" "سنرسل إليك بريدا إلكترونيا بمجرد أن يوافق منظم الفعالية على طلبك أو يرفضه. " "إذا تمت الموافقة على طلبك ، فسنرسل لك رابطا يمكنك استخدامه للدفع." -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:57 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:69 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:92 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:50 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:62 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:85 msgid "" "Scan this image with your banking app’s QR-Reader to start the payment " "process." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:90 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:83 msgid "Open BezahlCode in your banking app to start the payment process." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:129 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:122 msgid "Scan the QR code with your banking app" msgstr "" @@ -31410,7 +31770,7 @@ msgstr "تحتاج إلى تحديد العمود الذي يحتوي على م msgid "No currency has been selected." msgstr "تم حذف السؤال." -#: pretix/plugins/banktransfer/views.py:712 +#: pretix/plugins/banktransfer/views.py:713 #, python-brace-format msgid "" "We could not find bank account information for the refund {refund_id}. It " @@ -31419,7 +31779,7 @@ msgstr "" "لم نتمكن من العثور على معلومات الحساب المصرفي لعملية استرداد المبالغ " "{refund_id}. تم وضع علامة عليه على أنه لم يتم." -#: pretix/plugins/banktransfer/views.py:745 +#: pretix/plugins/banktransfer/views.py:747 msgid "No valid orders have been found." msgstr "لم يتم العثور على طلبات صالحة." @@ -31550,7 +31910,7 @@ msgid "Upload time" msgstr "وقت التنزيل" #: pretix/plugins/checkinlists/exporters.py:830 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:519 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:523 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" @@ -31773,15 +32133,15 @@ msgstr "لم يتم فتح نافذة إدخال بيانات الدفع الخ msgid "Click here in order to open the window." msgstr "انقر هنا لفتح النافذة." -#: pretix/plugins/paypal/views.py:107 pretix/plugins/paypal2/views.py:321 +#: pretix/plugins/paypal/views.py:107 pretix/plugins/paypal2/views.py:322 msgid "Invalid response from PayPal received." msgstr "تم استلام رد غير صالح من PayPal." -#: pretix/plugins/paypal/views.py:123 pretix/plugins/paypal2/views.py:342 +#: pretix/plugins/paypal/views.py:123 pretix/plugins/paypal2/views.py:343 msgid "It looks like you canceled the PayPal payment" msgstr "يبدو أنك قد ألغيت عملية السداد عبر PayPal" -#: pretix/plugins/paypal/views.py:255 pretix/plugins/paypal2/views.py:536 +#: pretix/plugins/paypal/views.py:255 pretix/plugins/paypal2/views.py:537 msgid "Your PayPal account has been disconnected." msgstr "تم قطع اتصال حساب PayPal الخاص بك." @@ -31907,7 +32267,7 @@ msgstr "" "هذا يعني أنه يجب إنشاء حساب PayPal المستلم وكذلك حساب المرسل في نفس البلد " "واستخدام نفس العملة. لن تتمكن الحسابات خارج الدولة من إرسال أي مدفوعات." -#: pretix/plugins/paypal2/payment.py:335 pretix/plugins/paypal2/views.py:250 +#: pretix/plugins/paypal2/payment.py:335 pretix/plugins/paypal2/views.py:251 msgid "An error occurred during connecting with PayPal, please try again." msgstr "حدث خطأ أثناء الاتصال ب PayPal ، يرجى المحاولة مرة أخرى." @@ -32118,7 +32478,7 @@ msgid "Please turn on JavaScript." msgstr "حاول مرة اخرى." #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:85 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57 msgid "Please select how you want to pay." msgstr "يرجى اختيار طريقة الدفع." @@ -32134,7 +32494,7 @@ msgstr "" "فشلت محاولتنا لتنفيذ عملية الدفع الخاصة بك عبر PayPal. يرجى المحاولة مرة " "أخرى أو الاتصال بنا." -#: pretix/plugins/paypal2/views.py:223 +#: pretix/plugins/paypal2/views.py:224 #, fuzzy #| msgid "An error occurred during connecting with PayPal, please try again." msgid "" @@ -32142,7 +32502,7 @@ msgid "" "try again." msgstr "حدث خطأ أثناء الاتصال ب PayPal ، يرجى المحاولة مرة أخرى." -#: pretix/plugins/paypal2/views.py:259 +#: pretix/plugins/paypal2/views.py:260 #, fuzzy #| msgid "An error occurred during connecting with PayPal, please try again." msgid "" @@ -32150,7 +32510,7 @@ msgid "" "try again." msgstr "حدث خطأ أثناء الاتصال ب PayPal ، يرجى المحاولة مرة أخرى." -#: pretix/plugins/paypal2/views.py:264 +#: pretix/plugins/paypal2/views.py:265 #, fuzzy #| msgid "An error occurred during connecting with PayPal, please try again." msgid "" @@ -32158,13 +32518,13 @@ msgid "" "Please try again." msgstr "حدث خطأ أثناء الاتصال ب PayPal ، يرجى المحاولة مرة أخرى." -#: pretix/plugins/paypal2/views.py:269 +#: pretix/plugins/paypal2/views.py:270 msgid "" "The email address on your PayPal account has not yet been confirmed. You " "will need to do this before you can start accepting payments." msgstr "" -#: pretix/plugins/paypal2/views.py:275 +#: pretix/plugins/paypal2/views.py:276 msgid "" "Your PayPal account is now connected to pretix. You can change the settings " "in detail below." @@ -32214,12 +32574,6 @@ msgstr "عرض كل أوامر وضع الاختبار" msgid "Split event series by date" msgstr "تمت إضافة تاريخ سلسلة الفعاليات" -#: pretix/plugins/reports/accountingreport.py:129 -#, fuzzy -#| msgid "Enabled" -msgid "End" -msgstr "تمكين" - #: pretix/plugins/reports/accountingreport.py:140 msgid "Report includes test orders which may be deleted later!" msgstr "" @@ -32257,7 +32611,7 @@ msgstr "استرداد بطاقة هدية" msgid "Gift card transactions (debit)" msgstr "استرداد بطاقة هدية" -#: pretix/plugins/reports/accountingreport.py:883 +#: pretix/plugins/reports/accountingreport.py:889 #, fuzzy #| msgid "Ordered items" msgid "Open items" @@ -33872,10 +34226,14 @@ msgstr "صاحب الحساب" #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html:7 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html:13 #: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html:5 +#, fuzzy +#| msgid "" +#| "After you submitted your order, we will redirect you to the payment " +#| "service provider to complete your payment. You will then be redirected " +#| "back here to get your tickets." msgid "" "After you submitted your order, we will redirect you to the payment service " -"provider to complete your payment. You will then be redirected back here to " -"get your tickets." +"provider to complete your payment. You will then be redirected back here." msgstr "" "بعد تقديم طلبك ، سنعيد توجيهك إلى مزود خدمة الدفع لإتمام عملية الدفع. ستتم " "إعادة توجيهك بعد ذلك إلى هنا للحصول على تذاكرك." @@ -34274,17 +34632,17 @@ msgstr "" msgid "Web Check-in" msgstr "التسجيل عبر الويب" -#: pretix/presale/checkoutflow.py:119 +#: pretix/presale/checkoutflow.py:117 msgctxt "checkoutflow" msgid "Step" msgstr "خطوة" -#: pretix/presale/checkoutflow.py:251 +#: pretix/presale/checkoutflow.py:249 msgctxt "checkoutflow" msgid "Customer account" msgstr "حساب العميل" -#: pretix/presale/checkoutflow.py:338 +#: pretix/presale/checkoutflow.py:336 #, fuzzy #| msgid "" #| "We were not able to process your request completely as the server was too " @@ -34293,35 +34651,35 @@ msgid "We failed to process your authentication request, please try again." msgstr "" "لم نتمكن من معالجة طلبك بالكامل لأن الخادم كان مشغولا للغاية. حاول مرة اخرى." -#: pretix/presale/checkoutflow.py:401 +#: pretix/presale/checkoutflow.py:399 msgctxt "checkoutflow" msgid "Membership" msgstr "عضوية" -#: pretix/presale/checkoutflow.py:449 pretix/presale/checkoutflow.py:470 +#: pretix/presale/checkoutflow.py:447 pretix/presale/checkoutflow.py:468 msgid "" "Your cart includes a product that requires an active membership to be " "selected." msgstr "تتضمن سلة التسوق الخاصة بك منتجا يتطلب تحديد عضوية نشطة." -#: pretix/presale/checkoutflow.py:489 +#: pretix/presale/checkoutflow.py:487 msgctxt "checkoutflow" msgid "Add-on products" msgstr "المنتجات الإضافية" -#: pretix/presale/checkoutflow.py:678 pretix/presale/checkoutflow.py:686 +#: pretix/presale/checkoutflow.py:676 pretix/presale/checkoutflow.py:684 #: pretix/presale/views/cart.py:195 pretix/presale/views/cart.py:200 #: pretix/presale/views/cart.py:218 pretix/presale/views/cart.py:231 #: pretix/presale/views/order.py:1514 pretix/presale/views/order.py:1522 msgid "Please enter numbers only." msgstr "الرجاء إدخال أرقام فقط." -#: pretix/presale/checkoutflow.py:760 +#: pretix/presale/checkoutflow.py:758 msgctxt "checkoutflow" msgid "Your information" msgstr "معلوماتك" -#: pretix/presale/checkoutflow.py:994 +#: pretix/presale/checkoutflow.py:992 msgid "" "Unfortunately, based on the invoice address you entered, we're not able to " "sell you the selected products for tax-related legal reasons." @@ -34329,7 +34687,7 @@ msgstr "" "للأسف ، بناء على عنوان الفاتورة التي أدخلتها ، لا يمكننا بيع المنتجات " "المحددة لك لأسباب قانونية متعلقة بالضرائب." -#: pretix/presale/checkoutflow.py:1000 +#: pretix/presale/checkoutflow.py:998 msgid "" "Due to the invoice address you entered, we need to apply a different tax " "rate to your purchase and the price of the products in your cart has changed " @@ -34338,30 +34696,30 @@ msgstr "" "نظرا لعنوان الفاتورة الذي أدخلته ، نحتاج إلى تطبيق معدل ضريبة مختلف على " "مشترياتك وتغير سعر المنتجات في سلة التسوق وفقا لذلك." -#: pretix/presale/checkoutflow.py:1024 pretix/presale/checkoutflow.py:1030 +#: pretix/presale/checkoutflow.py:1022 pretix/presale/checkoutflow.py:1028 msgid "Please enter a valid email address." msgstr "الرجاء قم بإدخال بريد الكتروني صحيح." -#: pretix/presale/checkoutflow.py:1037 +#: pretix/presale/checkoutflow.py:1035 msgid "Please enter your invoicing address." msgstr "الرجاء إدخال عنوان الفواتير الخاص بك." -#: pretix/presale/checkoutflow.py:1041 +#: pretix/presale/checkoutflow.py:1039 msgid "Please enter your name." msgstr "يرجى إدخال اسمك." -#: pretix/presale/checkoutflow.py:1076 pretix/presale/checkoutflow.py:1081 -#: pretix/presale/checkoutflow.py:1086 pretix/presale/checkoutflow.py:1091 -#: pretix/presale/checkoutflow.py:1096 +#: pretix/presale/checkoutflow.py:1074 pretix/presale/checkoutflow.py:1079 +#: pretix/presale/checkoutflow.py:1084 pretix/presale/checkoutflow.py:1089 +#: pretix/presale/checkoutflow.py:1094 msgid "Please fill in answers to all required questions." msgstr "يرجى ملء الإجابات على جميع الأسئلة المطلوبة." -#: pretix/presale/checkoutflow.py:1259 +#: pretix/presale/checkoutflow.py:1257 msgctxt "checkoutflow" msgid "Payment" msgstr "المبلغ" -#: pretix/presale/checkoutflow.py:1372 +#: pretix/presale/checkoutflow.py:1368 #, fuzzy, python-brace-format #| msgid "" #| "Your gift card has been applied, but {} still need to be paid. Please " @@ -34373,32 +34731,32 @@ msgstr "" "تم استعمال بطاقة الهدايا الخاصة بك، ولكن {} لا تزال بحاجة إلى أن يتم سدادها. " "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:679 +#: pretix/presale/checkoutflow.py:1393 pretix/presale/views/order.py:679 msgid "Please select a payment method." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1424 pretix/presale/checkoutflow.py:1438 -#: pretix/presale/checkoutflow.py:1449 +#: pretix/presale/checkoutflow.py:1425 pretix/presale/checkoutflow.py:1445 +#: pretix/presale/checkoutflow.py:1456 #, fuzzy #| msgid "Please select a payment method." msgid "Please select a payment method to proceed." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:438 +#: pretix/presale/checkoutflow.py:1461 pretix/presale/views/order.py:438 #: pretix/presale/views/order.py:505 msgid "The payment information you entered was incomplete." msgstr "معلومات الدفع التي أدخلتها غير مكتملة." -#: pretix/presale/checkoutflow.py:1499 +#: pretix/presale/checkoutflow.py:1506 msgctxt "checkoutflow" msgid "Review order" msgstr "مراجعة الطلب" -#: pretix/presale/checkoutflow.py:1593 +#: pretix/presale/checkoutflow.py:1604 msgid "You need to check all checkboxes on the bottom of the page." msgstr "تحتاج إلى تحديد جميع مربعات الاختيار أسفل الصفحة." -#: pretix/presale/checkoutflow.py:1648 +#: pretix/presale/checkoutflow.py:1659 msgid "" "There was an error sending the confirmation mail. Please try again later." msgstr "حدث خطأ في إرسال بريد التأكيد. الرجاء معاودة المحاولة في وقت لاحق." @@ -34558,8 +34916,8 @@ msgstr "" #: pretix/presale/forms/order.py:113 pretix/presale/forms/order.py:121 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:171 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:311 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:188 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:341 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:204 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:369 #: pretix/presale/templates/pretixpresale/event/voucher.html:198 #: pretix/presale/templates/pretixpresale/event/voucher.html:353 msgid "plus taxes" @@ -34596,21 +34954,40 @@ msgctxt "form" msgid "required" msgstr "مطلوب" -#: pretix/presale/ical.py:85 pretix/presale/ical.py:141 +#: pretix/presale/ical.py:87 pretix/presale/ical.py:146 +#: pretix/presale/ical.py:182 #, python-brace-format msgid "Tickets: {url}" msgstr "تذاكر: {url}" -#: pretix/presale/ical.py:88 pretix/presale/ical.py:143 +#: pretix/presale/ical.py:90 pretix/presale/ical.py:184 #, python-brace-format msgid "Admission: {datetime}" msgstr "القبول: {datetime}" -#: pretix/presale/ical.py:92 pretix/presale/ical.py:148 +#: pretix/presale/ical.py:94 pretix/presale/ical.py:154 +#: pretix/presale/ical.py:189 #, python-brace-format msgid "Organizer: {organizer}" msgstr "منظم: {organizer}" +#: pretix/presale/ical.py:139 +#, python-brace-format +msgid "{event} - {item}" +msgstr "" + +#: pretix/presale/ical.py:147 +#, fuzzy, python-brace-format +#| msgid "Start date" +msgid "Start: {datetime}" +msgstr "تاريخ البداية" + +#: pretix/presale/ical.py:150 +#, fuzzy, python-brace-format +#| msgid "Admission: {datetime}" +msgid "End: {datetime}" +msgstr "القبول: {datetime}" + #: pretix/presale/templates/pretixpresale/base.html:44 #, fuzzy #| msgid "Send links" @@ -34797,7 +35174,7 @@ msgstr "ملاحظات الطلب" #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:209 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:121 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:75 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:163 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:135 #: pretix/presale/templates/pretixpresale/event/checkout_questions.html:189 #: pretix/presale/templates/pretixpresale/organizers/customer_address_delete.html:28 #: pretix/presale/templates/pretixpresale/organizers/customer_profile_delete.html:28 @@ -35006,39 +35383,39 @@ msgid "" "product." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:13 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:30 #, fuzzy #| msgid "Please confirm the following payment details." msgid "You already selected the following payment methods:" msgstr "يرجى تأكيد تفاصيل الدفع التالية." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:58 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:30 #, fuzzy #| msgctxt "invoice" #| msgid "Received payments" msgid "Remove payment" msgstr "المدفوعات المستلمة" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:68 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:40 #, fuzzy #| msgid "Pending amount" msgid "Remaining balance" msgstr "مبالغ متأخرة" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:69 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 #, fuzzy #| msgid "Please select a payment method." msgid "Please select a payment method below." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:54 #, fuzzy #| msgid "Please select how you want to pay." msgid "Please select how you want to pay the remaining balance:" msgstr "يرجى اختيار طريقة الدفع." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:110 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 #: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45 #, fuzzy, python-format #| msgid "%(num)s available" @@ -35051,27 +35428,27 @@ msgstr[3] "%(num)s هو متاح" msgstr[4] "%(num)s هو متاح" msgstr[5] "%(num)s هو متاح" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:129 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:101 msgid "This sales channel does not provide support for test mode." msgstr "لا توفر قناة المبيعات هذه دعما لوضع الاختبار." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:131 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:103 msgid "If you continue, you might pay an actual order with non-existing money!" msgstr "إذا تابعت ، فقد تدفع طلبا فعليا بمبلغ غير موجود!" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:139 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:111 msgid "This payment provider does not provide support for test mode." msgstr "لا يوفر مزود الدفع هذا دعما لوضع الاختبار." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:141 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:113 msgid "If you continue, actual money might be transferred." msgstr "إذا قمت بالمتابعة، قد يتم تحويل المبلغ الفعلي." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:152 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:124 msgid "There are no payment providers enabled." msgstr "لم يتم تمكين مزودي الدفع." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:154 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:126 msgid "" "Please go to the payment settings and activate one or more payment providers." msgstr "يرجى الذهاب إلى إعدادات الدفع وتفعيل واحد أو أكثر من مزودي الدفع." @@ -35172,8 +35549,8 @@ msgstr "يمكنك الاختيار بين%(min_count)s و %(max_count)s من ه #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:64 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:258 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:55 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:279 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:59 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:307 #: pretix/presale/templates/pretixpresale/event/voucher.html:293 #, python-format msgid "minimum amount to order: %(num)s" @@ -35184,9 +35561,9 @@ msgstr "المبلغ الأدنى للطلب: %(num)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:185 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:300 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:325 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:77 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:176 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:329 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:81 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:192 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:357 #: pretix/presale/templates/pretixpresale/event/voucher.html:117 #: pretix/presale/templates/pretixpresale/event/voucher.html:186 #: pretix/presale/templates/pretixpresale/event/voucher.html:341 @@ -35195,34 +35572,34 @@ msgid "free" msgstr "" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:78 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:65 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:69 #, python-format msgid "from %(price)s" msgstr "من %(price)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:83 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:70 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:74 #, fuzzy, python-format #| msgid "from %(minprice)s" msgid "from %(from_price)s to %(to_price)s" msgstr "من %(minprice)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:98 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:105 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 #, fuzzy #| msgid "Show variants" msgid "Hide variants" msgstr "قم بعرض الأنواع" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:102 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:109 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:113 msgid "Show variants" msgstr "قم بعرض الأنواع" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:129 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:271 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:135 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:290 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:318 #: pretix/presale/templates/pretixpresale/event/voucher.html:147 #: pretix/presale/templates/pretixpresale/event/voucher.html:304 #, fuzzy @@ -35232,8 +35609,8 @@ msgstr "السعر الأصلي" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:145 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:300 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:161 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:328 #: pretix/presale/templates/pretixpresale/event/voucher.html:157 #: pretix/presale/templates/pretixpresale/event/voucher.html:314 #, fuzzy @@ -35245,10 +35622,10 @@ msgstr "السعر الصافي" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:150 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:289 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:291 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:162 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:164 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:316 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:318 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:178 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:180 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:344 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:346 #: pretix/presale/templates/pretixpresale/event/voucher.html:173 #: pretix/presale/templates/pretixpresale/event/voucher.html:175 #: pretix/presale/templates/pretixpresale/event/voucher.html:328 @@ -35260,9 +35637,9 @@ msgstr "تعديل السعر ل%(item)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:153 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:294 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:151 #: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:167 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:321 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:183 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:349 #: pretix/presale/templates/pretixpresale/event/voucher.html:163 #: pretix/presale/templates/pretixpresale/event/voucher.html:178 #: pretix/presale/templates/pretixpresale/event/voucher.html:333 @@ -35272,8 +35649,8 @@ msgstr "تعديل السعر ل%(item)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:173 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:313 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:190 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:343 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:206 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:371 #: pretix/presale/templates/pretixpresale/event/voucher.html:200 #: pretix/presale/templates/pretixpresale/event/voucher.html:355 msgid "incl. taxes" @@ -35281,8 +35658,8 @@ msgstr "بما في ذلك. الضرائب" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:176 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:316 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:194 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:347 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:210 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:375 #: pretix/presale/templates/pretixpresale/event/voucher.html:204 #: pretix/presale/templates/pretixpresale/event/voucher.html:359 #, python-format @@ -35291,8 +35668,8 @@ msgstr " زائد %(rate)s%% %(name)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:180 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:320 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:200 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:353 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:216 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:381 #: pretix/presale/templates/pretixpresale/event/voucher.html:210 #: pretix/presale/templates/pretixpresale/event/voucher.html:365 #, python-format @@ -35301,8 +35678,8 @@ msgstr "بما في ذلك %(rate)s%% %(name)s" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:203 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:349 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:221 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:373 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:237 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:401 #: pretix/presale/templates/pretixpresale/event/voucher.html:230 #: pretix/presale/templates/pretixpresale/event/voucher.html:385 #, fuzzy @@ -35314,8 +35691,8 @@ msgstr "اختر ولايه" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:208 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:354 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:226 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:378 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:242 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:406 #: pretix/presale/templates/pretixpresale/event/voucher.html:235 #: pretix/presale/templates/pretixpresale/event/voucher.html:390 #, fuzzy @@ -35325,8 +35702,8 @@ msgstr "كمية" #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:218 #: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:364 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:237 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:390 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:253 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:418 #: pretix/presale/templates/pretixpresale/event/voucher.html:242 #: pretix/presale/templates/pretixpresale/event/voucher.html:398 #, fuzzy @@ -35358,17 +35735,17 @@ msgid "Not available any more." msgstr "غير متاح" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:23 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:89 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:93 msgid "SOLD OUT" msgstr "تم بيعه" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:25 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:87 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:91 msgid "FULLY BOOKED" msgstr "محجوزة بالكامل" #: pretix/presale/templates/pretixpresale/event/fragment_availability.html:37 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:97 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:101 #: pretix/presale/templates/pretixpresale/fragment_calendar.html:99 #: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:104 #: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:30 @@ -35539,7 +35916,7 @@ msgstr "" msgid "Current value:" msgstr "القيمة الحالية" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:467 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:471 #, python-format msgid "One product" msgid_plural "%(num)s products" @@ -35550,19 +35927,19 @@ msgstr[3] "بضعة منتجات %(num)s" msgstr[4] "العديد من المنتجات %(num)s" msgstr[5] "عدد %(num)s" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:481 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:485 #, python-format msgid "incl. %(tax_sum)s taxes" msgstr "يشمل ضرائب %(tax_sum)s" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:501 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505 #, fuzzy, python-format #| msgid "The items in your cart are reserved for you for %(minutes)s minutes." msgid "The items in your cart are reserved for you for %(minutes)s minutes." msgstr "" "العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك لمدة %(minutes)s دقائق." -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:505 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:509 #, fuzzy #| msgid "The items in your cart are no longer reserved for you." msgid "" @@ -35570,20 +35947,20 @@ msgid "" "complete your order as long as they’re available." msgstr "لم تعد العناصر الموجودة في عربة التسوق الخاصة بك محجوزة لك." -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:510 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514 #: pretix/presale/templates/pretixpresale/fragment_modals.html:48 #, fuzzy #| msgid "Product description" msgid "Renew reservation" msgstr "وصف المنتج" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:522 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526 #, fuzzy #| msgid "Reservation period" msgid "Reservation renewed" msgstr "فترة الحجز" -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:528 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:532 msgid "Overview of your ordered products." msgstr "" @@ -35887,29 +36264,42 @@ msgstr "تم التأكيد" msgid "Payment pending" msgstr "انتظار الدفع" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:19 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:21 #, fuzzy #| msgid "Your orders for {event}" msgid "Your order qualifies for a discount" msgstr "طلباتكم ل{event}" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:28 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:30 #: pretix/presale/templates/pretixpresale/event/voucher.html:77 #, fuzzy #| msgid "Uncategorized" msgid "Uncategorized items" msgstr "غير مصنف" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:40 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:261 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:42 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:277 #: pretix/presale/templates/pretixpresale/event/voucher.html:94 #: pretix/presale/templates/pretixpresale/event/voucher.html:275 #, python-format msgid "Show full-size image of %(item)s" msgstr "أظهر صورة بالحجم الكبير ل %(item)s" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:193 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:346 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288 +#, fuzzy, python-format +#| msgid "%(count)s elements" +msgid "%(amount)s× in your cart" +msgid_plural "%(amount)s× in your cart" +msgstr[0] "%(count)s العناصر" +msgstr[1] "%(count)s العناصر" +msgstr[2] "%(count)s العناصر" +msgstr[3] "%(count)s العناصر" +msgstr[4] "%(count)s العناصر" +msgstr[5] "%(count)s العناصر" + +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374 #: pretix/presale/templates/pretixpresale/event/voucher.html:203 #: pretix/presale/templates/pretixpresale/event/voucher.html:358 #, fuzzy, python-format @@ -35917,8 +36307,8 @@ msgstr "أظهر صورة بالحجم الكبير ل %(item)s" msgid "%(value)s incl. taxes" msgstr "(شامل الضرائب)" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:199 -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:352 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:215 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:380 #: pretix/presale/templates/pretixpresale/event/voucher.html:209 #: pretix/presale/templates/pretixpresale/event/voucher.html:364 #, fuzzy, python-format @@ -35926,7 +36316,7 @@ msgstr "(شامل الضرائب)" msgid "%(value)s without taxes" msgstr "القيمة الإجمالية (بدون الضرائب)" -#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:306 +#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:334 #: pretix/presale/templates/pretixpresale/event/voucher.html:320 #, fuzzy, python-format #| msgid "Modify price for %(item)s" @@ -37014,6 +37404,22 @@ msgstr "" " من %(start_date)s\n" " " +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:10 +msgid "The following gift cards are available in your customer account:" +msgstr "" + +#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:24 +#, fuzzy +#| msgid "Issued gift cards" +msgid "Use gift card" +msgstr "بطاقات هدية صدر" + +#: pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html:4 +#, fuzzy, python-format +#| msgid "This gift card can only be used in test mode." +msgid "Your gift card %(card)s will be used to pay for this order." +msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا في وضع الاختبار." + #: pretix/presale/templates/pretixpresale/index.html:7 msgid "Hello!" msgstr "مرحبا!" @@ -37121,10 +37527,6 @@ msgstr "حسابك" msgid "Change account information" msgstr "قم بتغيير معلومات الحساب" -#: pretix/presale/templates/pretixpresale/organizers/customer_base.html:28 -msgid "Change password" -msgstr "قم بتغيير كلمة المرور" - #: pretix/presale/templates/pretixpresale/organizers/customer_base.html:41 #, fuzzy #| msgid "Submit registration" @@ -37357,7 +37759,7 @@ msgstr "لم يتم تمكين هذه الميزة." msgid "The selected organizer was not found." msgstr "لم يتم العثور على المنظم المحدد." -#: pretix/presale/views/__init__.py:275 +#: pretix/presale/views/__init__.py:291 #, python-brace-format msgid "" "Your selected payment method can only be used for a payment of at least " @@ -37572,7 +37974,7 @@ msgstr "" "الرجاء الضغط على الرابط الذي أرسلناه لك عبر البريد الإلكتروني لتنزيل التذاكر " "الخاصة بك." -#: pretix/presale/views/order.py:1619 +#: pretix/presale/views/order.py:1621 #, python-brace-format msgid "" "The order has been changed. You can now proceed by paying the open amount of " @@ -37580,44 +37982,44 @@ msgid "" msgstr "" "تم تغيير الطلب. يمكنك الآن المضي قدما بدفع المبلغ المفتوح وقدره{amount}." -#: pretix/presale/views/order.py:1631 +#: pretix/presale/views/order.py:1633 #, fuzzy #| msgid "Your search did not match any vouchers." msgid "You did not make any changes." msgstr "بحثك لم تطابق اي القسائم." -#: pretix/presale/views/order.py:1655 +#: pretix/presale/views/order.py:1658 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1657 +#: pretix/presale/views/order.py:1660 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1659 +#: pretix/presale/views/order.py:1662 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1661 +#: pretix/presale/views/order.py:1664 #, fuzzy #| msgid "You can cancel this order, but you will not receive a refund." msgid "You may not change your order in a way that would require a refund." msgstr "يمكنك إلغاء هذا الطلب ، لكنك لن تسترد المبلغ." -#: pretix/presale/views/order.py:1669 +#: pretix/presale/views/order.py:1672 msgid "" "You may not change your order in a way that increases the total price since " "payments are no longer being accepted for this event." msgstr "" -#: pretix/presale/views/order.py:1675 +#: pretix/presale/views/order.py:1678 msgid "" "You may not change your order in a way that requires additional payment " "while we are processing your current payment. Please check back after your " "current payment has been accepted." msgstr "" -#: pretix/presale/views/order.py:1691 pretix/presale/views/order.py:1722 +#: pretix/presale/views/order.py:1694 pretix/presale/views/order.py:1725 msgid "You cannot change this order." msgstr "لا يمكنك تغيير هذا الطلب." @@ -37727,6 +38129,17 @@ msgstr "الوصول إلى الكتابة" msgid "Kosovo" msgstr "كوسوفو" +#, fuzzy +#~| msgid "" +#~| "Please enter your current password if you want to change your email " +#~| "address or password." +#~ msgid "" +#~ "Please enter your current password if you want to change your email " +#~ "address or password." +#~ msgstr "" +#~ "الرجاء إدخال كلمة المرور الحالية الخاصة بك إذا كنت ترغب في تغيير عنوان " +#~ "البريد الإلكتروني الخاص بك أو كلمة المرور." + #~ msgid "" #~ "You are receiving this email because you placed an order for the " #~ "following event:" diff --git a/src/pretix/locale/ar/LC_MESSAGES/djangojs.po b/src/pretix/locale/ar/LC_MESSAGES/djangojs.po index e244d0342..caa777ef8 100644 --- a/src/pretix/locale/ar/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/ar/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-29 07:55+0000\n" +"POT-Creation-Date: 2025-11-20 10:37+0000\n" "PO-Revision-Date: 2021-09-15 11:22+0000\n" "Last-Translator: Mohamed Tawfiq \n" "Language-Team: Arabic \n" "Language-Team: Azerbaijani
- {% if settings.bank_details_type == "sepa" %} -
-
{% trans "Account holder" %}:
{{ settings.bank_details_sepa_name }} -
{% trans "IBAN" %}:
{{ settings.bank_details_sepa_iban|ibanformat }} -
{% trans "BIC" %}:
{{ settings.bank_details_sepa_bic }} -
{% trans "Bank" %}:
{{ settings.bank_details_sepa_bank }} - {% if details %} -
- {% endif %} - {% endif %} - {% if details %} - {{ details | rich_text }} -
- {% endif %} - {% if not settings.bank_details_type == "sepa" and not details %} -
- {% endif %} -
{% trans "Amount:" %}
{{ amount|money:event.currency }}
+
{% trans "Reference code (important):" %}
{{ code }}
+
{% trans "Amount:" %}
{{ amount|money:event.currency }}
+ {% if settings.bank_details_type == "sepa" %} +
{% trans "Account holder" %}:
{{ settings.bank_details_sepa_name }} +
{% trans "IBAN" %}:
{{ settings.bank_details_sepa_iban|ibanformat }} +
{% trans "BIC" %}:
{{ settings.bank_details_sepa_bic }} +
{% trans "Bank" %}:
{{ settings.bank_details_sepa_bank }} + {% endif %}
+ {% if details %} + {{ details | rich_text }} + {% endif %}

{% trans "There is no further action required on this website." %} {% trans "We will send you an email as soon as we received your payment." %} @@ -133,4 +126,4 @@ SCT

{% if swiss_qrbill %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index ed3492cf8..3875c934b 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -674,6 +674,7 @@ def _unite_transaction_rows(transaction_rows): united_transactions_rows.append({ "iban": iban, "bic": bic, + "locale": rows[0].get('locale', 'en'), "id": ", ".join(sorted(set(r['id'] for r in rows))), "payer": ", ".join(sorted(set(r['payer'] for r in rows))), "amount": sum(r['amount'] for r in rows), @@ -726,6 +727,7 @@ class RefundExportListView(ListView): "amount": refund.amount, "id": refund.full_id, "comment": refund.comment, + "locale": refund.order.locale, **{key: data.get(key) for key in ("payer", "iban", "bic")} }) refund.done(user=self.request.user) diff --git a/src/pretix/plugins/paypal2/views.py b/src/pretix/plugins/paypal2/views.py index 89cf81eaa..336239a18 100644 --- a/src/pretix/plugins/paypal2/views.py +++ b/src/pretix/plugins/paypal2/views.py @@ -73,7 +73,7 @@ from pretix.plugins.paypal2.payment import ( PaypalMethod, PaypalMethod as Paypal, PaypalWallet, ) from pretix.plugins.paypal.models import ReferencedPayPalObject -from pretix.presale.views import get_cart, get_cart_total +from pretix.presale.views import get_cart from pretix.presale.views.cart import cart_session logger = logging.getLogger('pretix.plugins.paypal2') @@ -147,7 +147,7 @@ class XHRView(View): cart_total = order.pending_sum + fee else: - cart_total = get_cart_total(request) + cart = get_cart(request) cart_payments = cart_session(request).get('payments', []) multi_use_cart_payments = [p for p in cart_payments if p.get('multi_use_supported')] simulated_payments = multi_use_cart_payments + [{ @@ -159,12 +159,13 @@ class XHRView(View): }] try: - for fee in get_fees(request.event, request, cart_total, None, simulated_payments, get_cart(request)): - cart_total += fee.value + fees = get_fees(event=request.event, request=request, invoice_address=None, + payments=simulated_payments, positions=cart) except TaxRule.SaleNotAllowed: # ignore for now, will fail on order creation - pass + fees = [] + cart_total = sum([c.price for c in cart]) + sum([f.value for f in fees]) total_remaining = cart_total for p in multi_use_cart_payments: if p.get('min_value') and total_remaining < Decimal(p['min_value']): diff --git a/src/pretix/plugins/reports/accountingreport.py b/src/pretix/plugins/reports/accountingreport.py index 0cef64663..1c9d34ebf 100644 --- a/src/pretix/plugins/reports/accountingreport.py +++ b/src/pretix/plugins/reports/accountingreport.py @@ -858,50 +858,58 @@ class ReportExporter(ReportlabExportMixin, BaseExporter): for c in currencies: c_head = f" [{c}]" if len(currencies) > 1 else "" - story += [ - Spacer(0, 3 * mm), - FontFallbackParagraph(_("Orders") + c_head, style_h2), - Spacer(0, 3 * mm), - *self._table_transactions(form_data, c), - ] + s = self._table_transactions(form_data, c) + if s: + story += [ + Spacer(0, 3 * mm), + FontFallbackParagraph(_("Orders") + c_head, style_h2), + Spacer(0, 3 * mm), + *s + ] for c in currencies: c_head = f" [{c}]" if len(currencies) > 1 else "" - story += [ - Spacer(0, 8 * mm), - FontFallbackParagraph(_("Payments") + c_head, style_h2), - Spacer(0, 3 * mm), - *self._table_payments(form_data, c), - ] + s = self._table_payments(form_data, c) + if s: + story += [ + Spacer(0, 8 * mm), + FontFallbackParagraph(_("Payments") + c_head, style_h2), + Spacer(0, 3 * mm), + *s + ] for c in currencies: c_head = f" [{c}]" if len(currencies) > 1 else "" - story += [ - Spacer(0, 8 * mm), - KeepTogether( - [ - FontFallbackParagraph(_("Open items") + c_head, style_h2), - Spacer(0, 3 * mm), - *self._table_open_items(form_data, c), - ] - ), - ] + s = self._table_open_items(form_data, c) + if s: + story += [ + Spacer(0, 8 * mm), + KeepTogether( + [ + FontFallbackParagraph(_("Open items") + c_head, style_h2), + Spacer(0, 3 * mm), + *s + ] + ), + ] if ( self.is_multievent and self.events.count() == self.organizer.events.count() ): for c in currencies: c_head = f" [{c}]" if len(currencies) > 1 else "" - story += [ - Spacer(0, 8 * mm), - KeepTogether( - [ - FontFallbackParagraph(_("Gift cards") + c_head, style_h2), - Spacer(0, 3 * mm), - *self._table_gift_cards(form_data, c), - ] - ), - ] + s = self._table_gift_cards(form_data, c) + if s: + story += [ + Spacer(0, 8 * mm), + KeepTogether( + [ + FontFallbackParagraph(_("Gift cards") + c_head, style_h2), + Spacer(0, 3 * mm), + *s, + ] + ), + ] doc.build(story, canvasmaker=self.canvas_class(doc)) f.seek(0) diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 325884a9f..2e447a5d3 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -423,7 +423,7 @@ class StripeSettingsHolder(BasePaymentProvider): ('method_revolut_pay', forms.BooleanField( label='Revolut Pay', - disabled=self.event.currency not in ['EUR', 'GBP'], + disabled=self.event.currency not in ['EUR', 'GBP', 'RON', 'HUF', 'PLN', 'DKK'], help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account ' 'before they work properly.'), required=False, diff --git a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html index cf555653a..bc9abba5e 100644 --- a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html +++ b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html @@ -23,7 +23,7 @@ {% else %}

{% blocktrans trimmed %} After you submitted your order, we will redirect you to the payment service provider to complete your payment. - You will then be redirected back here to get your tickets. + You will then be redirected back here. {% endblocktrans %}

{% trans "Payment method" %}
diff --git a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html index 600d4160e..86da80f0c 100644 --- a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html +++ b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple.html @@ -6,5 +6,5 @@ {% bootstrap_form form layout='horizontal' %}

{% blocktrans trimmed %} After you submitted your order, we will redirect you to the payment service provider to complete your payment. - You will then be redirected back here to get your tickets. + You will then be redirected back here. {% endblocktrans %}

diff --git a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html index 5ba063f73..e1c8e2a0d 100644 --- a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html +++ b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_messaging_noform.html @@ -11,8 +11,8 @@

{% blocktrans trimmed %} - After you submitted your order, we will redirect you to the payment service provider to complete your - payment. You will then be redirected back here to get your tickets. + After you submitted your order, we will redirect you to the payment service provider to complete your payment. + You will then be redirected back here. {% endblocktrans %}

diff --git a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html index 8546203ae..88f9c090f 100644 --- a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html +++ b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form_simple_noform.html @@ -4,5 +4,5 @@ {% endif %}

{% blocktrans trimmed %} After you submitted your order, we will redirect you to the payment service provider to complete your payment. - You will then be redirected back here to get your tickets. + You will then be redirected back here. {% endblocktrans %}

diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index 31a130b0f..0629af00f 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -91,9 +91,7 @@ from pretix.presale.signals import ( question_form_fields_overrides, ) from pretix.presale.utils import customer_login -from pretix.presale.views import ( - CartMixin, get_cart, get_cart_is_free, get_cart_total, -) +from pretix.presale.views import CartMixin, get_cart, get_cart_is_free from pretix.presale.views.cart import ( _items_from_post_data, cart_session, create_empty_cart_id, get_or_create_cart_id, @@ -1262,18 +1260,16 @@ class PaymentStep(CartMixin, TemplateFlowStep): @cached_property def _total_order_value(self): cart = get_cart(self.request) - total = get_cart_total(self.request) try: - total += sum([ - f.value for f in get_fees( - self.request.event, self.request, total, self.invoice_address, - [p for p in self.cart_session.get('payments', []) if p.get('multi_use_supported')], - cart, - ) - ]) + fees = get_fees( + event=self.request.event, request=self.request, invoice_address=self.invoice_address, + payments=[p for p in self.cart_session.get('payments', []) if p.get('multi_use_supported')], + positions=cart, + ) except TaxRule.SaleNotAllowed: # ignore for now, will fail on order creation - pass + fees = [] + total = sum([c.price for c in cart]) + sum([f.value for f in fees]) return Decimal(total) @cached_property @@ -1399,7 +1395,13 @@ class PaymentStep(CartMixin, TemplateFlowStep): def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) - ctx['current_payments'] = [p for p in self.current_selected_payments(self._total_order_value) if p.get('multi_use_supported')] + ctx['cart'] = self.get_cart() + ctx['current_payments'] = [ + p for p in self.current_selected_payments( + ctx['cart']['raw'], ctx['cart']['fees'], ctx['cart']['invoice_address'], + ) + if p.get('multi_use_supported') + ] ctx['remaining'] = self._total_order_value - sum(p['payment_amount'] for p in ctx['current_payments']) + sum(p['fee'] for p in ctx['current_payments']) ctx['providers'] = self.provider_forms ctx['show_fees'] = any(p['fee'] for p in self.provider_forms) @@ -1412,7 +1414,6 @@ class PaymentStep(CartMixin, TemplateFlowStep): ctx['selected'] = self.single_use_payment['provider'] else: ctx['selected'] = '' - ctx['cart'] = self.get_cart() return ctx def _is_allowed(self, prov, request): @@ -1425,14 +1426,20 @@ class PaymentStep(CartMixin, TemplateFlowStep): return False cart = get_cart(self.request) - total = get_cart_total(self.request) try: - total += sum([f.value for f in get_fees(self.request.event, self.request, total, self.invoice_address, - self.cart_session.get('payments', []), cart)]) + fees = get_fees( + event=self.request.event, + request=self.request, + invoice_address=self.invoice_address, + payments=self.cart_session.get('payments', []), + positions=cart + ) except TaxRule.SaleNotAllowed: # ignore for now, will fail on order creation - pass - selected = self.current_selected_payments(total, warn=warn, total_includes_payment_fees=True) + fees = [] + total = sum([c.price for c in cart]) + sum([f.value for f in fees]) + + selected = self.current_selected_payments(cart, fees, self.invoice_address, warn=warn) if sum(p['payment_amount'] for p in selected) != total: if warn: messages.error(request, _('Please select a payment method to proceed.')) @@ -1516,7 +1523,11 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep): ctx = super().get_context_data(**kwargs) ctx['cart'] = self.get_cart(answers=True) - selected_payments = self.current_selected_payments(ctx['cart']['total'], total_includes_payment_fees=True) + selected_payments = self.current_selected_payments( + ctx['cart']['raw'], + ctx['cart']['fees'], + ctx['cart']['invoice_address'], + ) ctx['payments'] = [] for p in selected_payments: if p['provider'] == 'free': diff --git a/src/pretix/presale/ical.py b/src/pretix/presale/ical.py index cb5940a41..14a1ec9ea 100644 --- a/src/pretix/presale/ical.py +++ b/src/pretix/presale/ical.py @@ -20,10 +20,12 @@ # . # import datetime +from collections import namedtuple from urllib.parse import urlparse import vobject from django.conf import settings +from django.db.models import prefetch_related_objects from django.utils.formats import date_format from django.utils.translation import gettext as _ @@ -122,61 +124,109 @@ def get_private_icals(event, positions): creation_time = datetime.datetime.now(datetime.timezone.utc) calobjects = [] + calentries = set() # using set for automatic deduplication of CalEntries + CalEntry = namedtuple('CalEntry', ['summary', 'description', 'location', 'dtstart', 'dtend', 'uid']) - evs = set(p.subevent or event for p in positions) - for ev in evs: - if isinstance(ev, Event): + # collecting the positions' calendar entries, preferring the most exact date and time available (positions > subevent > event) + prefetch_related_objects(positions, 'item__program_times') + for p in positions: + ev = p.subevent or event + program_times = p.item.program_times.all() + if program_times: + # if program times have been configured, they are preferred for the position's calendar entries url = build_absolute_uri(event, 'presale:event.index') + for index, pt in enumerate(program_times): + summary = _('{event} - {item}').format(event=ev, item=p.item.name) + if event.settings.mail_attach_ical_description: + ctx = get_email_context(event=event, event_or_subevent=ev) + description = format_map(str(event.settings.mail_attach_ical_description), ctx) + else: + # Default description + descr = [] + descr.append(_('Tickets: {url}').format(url=url)) + descr.append(str(_('Start: {datetime}')).format( + datetime=date_format(pt.start.astimezone(tz), 'SHORT_DATETIME_FORMAT') + )) + descr.append(str(_('End: {datetime}')).format( + datetime=date_format(pt.end.astimezone(tz), 'SHORT_DATETIME_FORMAT') + )) + # Actual ical organizer field is not useful since it will cause "your invitation was accepted" emails to the organizer + descr.append(_('Organizer: {organizer}').format(organizer=event.organizer.name)) + description = '\n'.join(descr) + location = None + dtstart = pt.start.astimezone(tz) + dtend = pt.end.astimezone(tz) + uid = 'pretix-{}-{}-{}-{}@{}'.format( + event.organizer.slug, + event.slug, + p.item.id, + index, + urlparse(url).netloc + ) + calentries.add(CalEntry(summary, description, location, dtstart, dtend, uid)) else: - url = build_absolute_uri(event, 'presale:event.index', { - 'subevent': ev.pk - }) + # without program times, the subevent or event times are used for calendar entries, preferring subevents + if p.subevent: + url = build_absolute_uri(event, 'presale:event.index', { + 'subevent': p.subevent.pk + }) + else: + url = build_absolute_uri(event, 'presale:event.index') - if event.settings.mail_attach_ical_description: - ctx = get_email_context(event=event, event_or_subevent=ev) - description = format_map(str(event.settings.mail_attach_ical_description), ctx) - else: - # Default description - descr = [] - descr.append(_('Tickets: {url}').format(url=url)) - if ev.date_admission: - descr.append(str(_('Admission: {datetime}')).format( - datetime=date_format(ev.date_admission.astimezone(tz), 'SHORT_DATETIME_FORMAT') - )) + if event.settings.mail_attach_ical_description: + ctx = get_email_context(event=event, event_or_subevent=ev) + description = format_map(str(event.settings.mail_attach_ical_description), ctx) + else: + # Default description + descr = [] + descr.append(_('Tickets: {url}').format(url=url)) + if ev.date_admission: + descr.append(str(_('Admission: {datetime}')).format( + datetime=date_format(ev.date_admission.astimezone(tz), 'SHORT_DATETIME_FORMAT') + )) - # Actual ical organizer field is not useful since it will cause "your invitation was accepted" emails to the organizer - descr.append(_('Organizer: {organizer}').format(organizer=event.organizer.name)) - description = '\n'.join(descr) + # Actual ical organizer field is not useful since it will cause "your invitation was accepted" emails to the organizer + descr.append(_('Organizer: {organizer}').format(organizer=event.organizer.name)) + description = '\n'.join(descr) + summary = str(ev.name) + if ev.location: + location = ", ".join(l.strip() for l in str(ev.location).splitlines() if l.strip()) + else: + location = None + if event.settings.show_times: + dtstart = ev.date_from.astimezone(tz) + else: + dtstart = ev.date_from.astimezone(tz).date() + if event.settings.show_date_to and ev.date_to: + if event.settings.show_times: + dtend = ev.date_to.astimezone(tz) + else: + # with full-day events date_to in pretix is included (e.g. last day) + # whereas dtend in vcalendar is non-inclusive => add one day for export + dtend = ev.date_to.astimezone(tz).date() + datetime.timedelta(days=1) + else: + dtend = None + uid = 'pretix-{}-{}-{}@{}'.format( + event.organizer.slug, + event.slug, + ev.pk if p.subevent else '0', + urlparse(url).netloc + ) + calentries.add(CalEntry(summary, description, location, dtstart, dtend, uid)) + for calentry in calentries: cal = vobject.iCalendar() cal.add('prodid').value = '-//pretix//{}//'.format(settings.PRETIX_INSTANCE_NAME.replace(" ", "_")) vevent = cal.add('vevent') - vevent.add('summary').value = str(ev.name) - vevent.add('description').value = description + vevent.add('summary').value = calentry.summary + vevent.add('description').value = calentry.description vevent.add('dtstamp').value = creation_time - if ev.location: - vevent.add('location').value = ", ".join(l.strip() for l in str(ev.location).splitlines() if l.strip()) - - vevent.add('uid').value = 'pretix-{}-{}-{}@{}'.format( - event.organizer.slug, - event.slug, - ev.pk if not isinstance(ev, Event) else '0', - urlparse(url).netloc - ) - - if event.settings.show_times: - vevent.add('dtstart').value = ev.date_from.astimezone(tz) - else: - vevent.add('dtstart').value = ev.date_from.astimezone(tz).date() - - if event.settings.show_date_to and ev.date_to: - if event.settings.show_times: - vevent.add('dtend').value = ev.date_to.astimezone(tz) - else: - # with full-day events date_to in pretix is included (e.g. last day) - # whereas dtend in vcalendar is non-inclusive => add one day for export - vevent.add('dtend').value = ev.date_to.astimezone(tz).date() + datetime.timedelta(days=1) - + if calentry.location: + vevent.add('location').value = calentry.location + vevent.add('uid').value = calentry.uid + vevent.add('dtstart').value = calentry.dtstart + if calentry.dtend: + vevent.add('dtend').value = calentry.dtend calobjects.append(cal) return calobjects diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html index 3aac8dc43..224d2d2f2 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html @@ -9,34 +9,6 @@ {% endblock %} {% block inner %}

{% trans "Payment" %}

- {% if customer_gift_cards %} -

- {% trans "Information" %} - {% trans "The following gift cards are available in your customer account:" %} -

- - {% csrf_token %} -
    - {% for c in customer_gift_cards %} -
  • -
    - {{ c }} -
    -
    - {{ c.value|money:c.currency }} -
    -
    - -
    -
  • - {% endfor %} -
- - {% endif %} {% if current_payments %}

{% trans "You already selected the following payment methods:" %}

diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html index 9a16865eb..361dcca76 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html @@ -395,7 +395,11 @@ {% for fee in cart.fees %}
- {{ fee.get_fee_type_display }} + {% if fee.fee_type == "other" and fee.description %} + {{ fee.description }} + {% else %} + {{ fee.get_fee_type_display }} + {% endif %}
{% if download %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html b/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html index 42d402975..682434ae0 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_downloads.html @@ -88,7 +88,7 @@

{% endif %}
-{% elif not can_download and plugins_allow_ticket_download and ticket_download_date %} +{% elif not can_download and plugins_allow_ticket_download and ticket_download_date and event.settings.ticket_download %} {% if order.status == 'p' %}
{% blocktrans trimmed with date=ticket_download_date|date:"SHORT_DATE_FORMAT" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html index 8b782e709..febcba9eb 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html @@ -3,6 +3,8 @@ {% load eventurl %} {% load money %} {% load thumb %} +{% load icon %} +{% load getitem %} {% load eventsignal %} {% load rich_text %} {% for tup in items_by_category %}{% with category=tup.0 items=tup.1 form_prefix=tup.2 %} @@ -43,7 +45,9 @@ {% endif %}
- {{ item.name }} + + {{ item.name }} + {% if item.description %}
{{ item.description|localize|rich_text }} @@ -119,7 +123,19 @@ data-price="{% if event.settings.display_net_prices %}{{ var.display_price.net|unlocalize }}{% else %}{{ var.display_price.gross|unlocalize }}{% endif %}" {% endif %}>
- {{ var }} + + {{ var }} + {% if cart.itemvarsums|getitem:var %} + + {% icon "shopping-cart" %} + {% blocktrans trimmed count amount=cart.itemvarsums|getitem:var %} + {{ amount }}× in your cart + {% plural %} + {{ amount }}× in your cart + {% endblocktrans %} + + {% endif %} + {% if var.description %}
{{ var.description|localize|rich_text }} @@ -264,7 +280,19 @@ {% endif %}
- {{ item.name }} + + {{ item.name }} + {% if cart.itemvarsums|getitem:item %} + + {% icon "shopping-cart" %} + {% blocktrans trimmed count amount=cart.itemvarsums|getitem:item %} + {{ amount }}× in your cart + {% plural %} + {{ amount }}× in your cart + {% endblocktrans %} + + {% endif %} + {% if item.description %}
{{ item.description|localize|rich_text }} diff --git a/src/pretix/presale/templates/pretixpresale/giftcard/checkout.html b/src/pretix/presale/templates/pretixpresale/giftcard/checkout.html new file mode 100644 index 000000000..563101df0 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/giftcard/checkout.html @@ -0,0 +1,33 @@ +{% load i18n %} +{% load bootstrap3 %} +{% load money %} +{% load rich_text %} + +{{ request.event.settings.payment_giftcard_public_description|rich_text }} +{% if customer_gift_cards %} +

+ {% trans "Information" %} + {% trans "The following gift cards are available in your customer account:" %} +

+ {% csrf_token %} +
    + {% for c in customer_gift_cards %} +
  • +
    + {{ c }} +
    +
    + {{ c.value|money:c.currency }} +
    +
    + +
    +
  • + {% endfor %} +
+{% endif %} +{% bootstrap_form form layout='checkout' %} diff --git a/src/pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html similarity index 100% rename from src/pretix/control/templates/pretixcontrol/giftcards/checkout_confirm.html rename to src/pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index 3ed42cad7..77a7d2dfb 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -32,7 +32,8 @@ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under the License. import copy -from collections import defaultdict +import warnings +from collections import Counter, defaultdict from datetime import datetime, timedelta from decimal import Decimal from functools import wraps @@ -50,10 +51,11 @@ from django_scopes import scopes_disabled from pretix.base.i18n import get_language_without_region from pretix.base.middleware import get_supported_language from pretix.base.models import ( - CartPosition, Customer, InvoiceAddress, ItemAddOn, Question, + CartPosition, Customer, InvoiceAddress, ItemAddOn, OrderFee, Question, QuestionAnswer, QuestionOption, TaxRule, ) from pretix.base.services.cart import get_fees +from pretix.base.services.pricing import apply_rounding from pretix.base.templatetags.money import money_filter from pretix.helpers.cookies import set_cookie_without_samesite from pretix.multidomain.urlreverse import eventreverse @@ -147,6 +149,30 @@ class CartMixin: 'question': value.label }) + if order: + fees = order.fees.all() + elif lcp: + try: + fees = get_fees( + event=self.request.event, + request=self.request, + invoice_address=self.invoice_address, + payments=payments if payments is not None else self.cart_session.get('payments', []), + positions=cartpos, + ) + except TaxRule.SaleNotAllowed: + # ignore for now, will fail on order creation + fees = [] + else: + fees = [] + + if not order: + apply_rounding(self.request.event.settings.tax_rounding, self.request.event.currency, [*lcp, *fees]) + + total = sum([c.price for c in lcp]) + sum([f.value for f in fees]) + net_total = sum(p.price - p.tax_value for p in lcp) + sum([f.net_value for f in fees]) + tax_total = sum(p.tax_value for p in lcp) + sum([f.tax_value for f in fees]) + # Group items of the same variation # We do this by list manipulations instead of a GROUP BY query, as # Django is unable to join related models in a .values() query @@ -177,7 +203,7 @@ class CartMixin: pos.subevent_id, pos.item_id, pos.variation_id, - pos.price, + pos.net_price if self.request.event.settings.display_net_prices else pos.price, (pos.voucher_id or 0), (pos.seat_id or 0), pos.valid_from, @@ -204,29 +230,6 @@ class CartMixin: group.additional_answers = pos_additional_fields.get(group.pk) positions.append(group) - total = sum(p.total for p in positions) - net_total = sum(p.net_total for p in positions) - tax_total = sum(p.total - p.net_total for p in positions) - - if order: - fees = order.fees.all() - elif positions: - try: - fees = get_fees( - self.request.event, self.request, total, self.invoice_address, - payments if payments is not None else self.cart_session.get('payments', []), - cartpos - ) - except TaxRule.SaleNotAllowed: - # ignore for now, will fail on order creation - fees = [] - else: - fees = [] - - total += sum([f.value for f in fees]) - net_total += sum([f.net_value for f in fees]) - tax_total += sum([f.tax_value for f in fees]) - try: first_expiry = min(p.expires for p in positions) if positions else now() max_expiry_extend = min((p.max_extend for p in positions if p.max_extend), default=None) @@ -239,6 +242,10 @@ class CartMixin: minutes_left = None seconds_left = None + itemvarsums = Counter() + for p in cartpos: + itemvarsums[p.variation or p.item] += 1 + return { 'positions': positions, 'invoice_address': self.invoice_address, @@ -255,20 +262,29 @@ class CartMixin: 'max_expiry_extend': max_expiry_extend, 'is_ordered': bool(order), 'itemcount': sum(c.count for c in positions if not c.addon_to), - 'current_selected_payments': [p for p in self.current_selected_payments(total) if p.get('multi_use_supported')] + 'itemvarsums': itemvarsums, + 'current_selected_payments': [ + p for p in self.current_selected_payments(positions, fees, self.invoice_address) + if p.get('multi_use_supported') + ] } - def current_selected_payments(self, total, warn=False, total_includes_payment_fees=False): + def current_selected_payments(self, positions, fees, invoice_address, *, warn=False): raw_payments = copy.deepcopy(self.cart_session.get('payments', [])) + fees = [f for f in fees if f.fee_type != OrderFee.FEE_TYPE_PAYMENT] # we re-compute these here + + apply_rounding(self.request.event.settings.tax_rounding, self.request.event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) + payments = [] - total_remaining = total + payments_assigned = Decimal("0.00") for p in raw_payments: # This algorithm of treating min/max values and fees needs to stay in sync between the following # places in the code base: # - pretix.base.services.cart.get_fees # - pretix.base.services.orders._get_fees # - pretix.presale.views.CartMixin.current_selected_payments - if p.get('min_value') and total_remaining < Decimal(p['min_value']): + if p.get('min_value') and total - payments_assigned < Decimal(p['min_value']): if warn: messages.warning( self.request, @@ -279,7 +295,7 @@ class CartMixin: self._remove_payment(p['id']) continue - to_pay = total_remaining + to_pay = max(total - payments_assigned, Decimal("0.00")) if p.get('max_value') and to_pay > Decimal(p['max_value']): to_pay = min(to_pay, Decimal(p['max_value'])) @@ -288,12 +304,36 @@ class CartMixin: self._remove_payment(p['id']) continue - if not total_includes_payment_fees: - fee = pprov.calculate_fee(to_pay) - total_remaining += fee - to_pay += fee - else: - fee = Decimal('0.00') + payment_fee = pprov.calculate_fee(to_pay) + if payment_fee: + if self.request.event.settings.tax_rule_payment == "default": + payment_fee_tax_rule = self.request.event.cached_default_tax_rule or TaxRule.zero() + else: + payment_fee_tax_rule = TaxRule.zero() + try: + payment_fee_tax = payment_fee_tax_rule.tax(payment_fee, base_price_is='gross', invoice_address=invoice_address) + except TaxRule.SaleNotAllowed: + # Replicate behavior from elsewhere, will fail later at the order stage + payment_fee = Decimal("0.00") + payment_fee_tax = TaxRule.zero().tax(payment_fee) + pf = OrderFee( + fee_type=OrderFee.FEE_TYPE_PAYMENT, + value=payment_fee, + tax_rate=payment_fee_tax.rate, + tax_value=payment_fee_tax.tax, + tax_code=payment_fee_tax.code, + tax_rule=payment_fee_tax_rule + ) + fees.append(pf) + + # Re-apply rounding as grand total has changed + apply_rounding(self.request.event.settings.tax_rounding, self.request.event.currency, [*positions, *fees]) + total = sum([c.price for c in positions]) + sum([f.value for f in fees]) + + # Re-calculate to_pay as grand total has changed + to_pay = max(total - payments_assigned, Decimal("0.00")) + if p.get('max_value') and to_pay > Decimal(p['max_value']): + to_pay = min(to_pay, Decimal(p['max_value'])) if p.get('max_value') and to_pay > Decimal(p['max_value']): to_pay = min(to_pay, Decimal(p['max_value'])) @@ -301,8 +341,8 @@ class CartMixin: p['payment_amount'] = to_pay p['provider_name'] = pprov.public_name p['pprov'] = pprov - p['fee'] = fee - total_remaining -= to_pay + p['fee'] = payment_fee + payments_assigned += to_pay payments.append(p) return payments @@ -373,6 +413,21 @@ def get_cart(request): def get_cart_total(request): + """ + Use the following pattern instead:: + + cart = get_cart(request) + fees = get_fees( + event=request.event, + request=request, + invoice_address=cached_invoice_address(request), + payments=None, + positions=cart, + ) + total = sum([c.price for c in cart]) + sum([f.value for f in fees]) + """ + warnings.warn('get_cart_total is deprecated and will be removed in a future release', + DeprecationWarning) from pretix.presale.views.cart import get_or_create_cart_id if not hasattr(request, '_cart_total_cache'): @@ -409,13 +464,14 @@ def get_cart_is_free(request): cs = cart_session(request) pos = get_cart(request) ia = get_cart_invoice_address(request) - total = get_cart_total(request) try: - fees = get_fees(request.event, request, total, ia, cs.get('payments', []), pos) + fees = get_fees(event=request.event, request=request, invoice_address=ia, + payments=cs.get('payments', []), positions=pos) except TaxRule.SaleNotAllowed: # ignore for now, will fail on order creation fees = [] - request._cart_free_cache = total + sum(f.value for f in fees) == Decimal('0.00') + + request._cart_free_cache = sum(p.price for p in pos) + sum(f.value for f in fees) == Decimal('0.00') return request._cart_free_cache diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 43dec358a..0c9e2bbe8 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -689,7 +689,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView): self._set_month_year() tz = self.request.event.timezone _, ndays = calendar.monthrange(self.year, self.month) - before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=tz) - timedelta(days=1) + before = datetime(self.year, self.month, 1, 23, 59, 59, tzinfo=tz) - timedelta(days=1) after = datetime(self.year, self.month, ndays, 0, 0, 0, tzinfo=tz) + timedelta(days=1) if self.request.event.settings.event_calendar_future_only: @@ -750,7 +750,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView): tz = self.request.event.timezone week = isoweek.Week(self.year, self.week) before = datetime( - week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=tz + week.monday().year, week.monday().month, week.monday().day, 23, 59, 59, tzinfo=tz ) - timedelta(days=1) after = datetime( week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0, tzinfo=tz diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 291e4a129..dc8182dd6 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -1552,6 +1552,7 @@ class OrderChangeMixin: def post(self, request, *args, **kwargs): was_paid = self.order.status == Order.STATUS_PAID + original_total = self.order.total ocm = OrderChangeManager( self.order, notify=True, @@ -1603,7 +1604,8 @@ class OrderChangeMixin: except OrderError as e: messages.error(self.request, str(e)) else: - if self.order.pending_sum < Decimal('0.00') and ocm._totaldiff < Decimal('0.00'): + totaldiff = self.order.total - original_total + if self.order.pending_sum < Decimal('0.00') and totaldiff < Decimal('0.00'): auto_refund = ( not self.request.event.settings.cancel_allow_user_paid_require_approval and self.request.event.settings.cancel_allow_user_paid_refund_as_giftcard != "manually" @@ -1631,7 +1633,7 @@ class OrderChangeMixin: messages.info(self.request, _('You did not make any changes.')) return redirect(self.get_self_url()) else: - new_pending_sum = self.order.pending_sum + ocm._totaldiff + new_pending_sum = self.order.pending_sum + ocm.guess_totaldiff() can_auto_refund = False if new_pending_sum < Decimal('0.00'): proposals = self.order.propose_auto_refunds(Decimal('-1.00') * new_pending_sum) @@ -1639,7 +1641,7 @@ class OrderChangeMixin: return render(request, self.confirm_template_name, { 'operations': ocm._operations, - 'totaldiff': ocm._totaldiff, + 'totaldiff': ocm.guess_totaldiff(), 'order': self.order, 'payment_refund_sum': self.order.payment_refund_sum, 'new_pending_sum': new_pending_sum, @@ -1651,16 +1653,17 @@ class OrderChangeMixin: def _validate_total_diff(self, ocm): pr = self.get_price_requirement() - if ocm._totaldiff < Decimal('0.00') and pr == 'gte': + totaldiff = ocm.guess_totaldiff() + if totaldiff < Decimal('0.00') and pr == 'gte': raise OrderError(_('You may not change your order in a way that reduces the total price.')) - if ocm._totaldiff <= Decimal('0.00') and pr == 'gt': + if totaldiff <= Decimal('0.00') and pr == 'gt': raise OrderError(_('You may only change your order in a way that increases the total price.')) - if ocm._totaldiff != Decimal('0.00') and pr == 'eq': + if totaldiff != Decimal('0.00') and pr == 'eq': raise OrderError(_('You may not change your order in a way that changes the total price.')) - if ocm._totaldiff < Decimal('0.00') and self.order.total + ocm._totaldiff < self.order.payment_refund_sum and pr == 'gte_paid': + if totaldiff < Decimal('0.00') and self.order.total + totaldiff < self.order.payment_refund_sum and pr == 'gte_paid': raise OrderError(_('You may not change your order in a way that would require a refund.')) - if ocm._totaldiff > Decimal('0.00') and self.order.status == Order.STATUS_PAID: + if totaldiff > Decimal('0.00') and self.order.status == Order.STATUS_PAID: self.order.set_expires( now(), self.order.event.subevents.filter(id__in=self.order.positions.values_list('subevent_id', flat=True)) @@ -1669,7 +1672,7 @@ class OrderChangeMixin: raise OrderError(_('You may not change your order in a way that increases the total price since ' 'payments are no longer being accepted for this event.')) - if ocm._totaldiff > Decimal('0.00') and self.order.status == Order.STATUS_PENDING: + if totaldiff > Decimal('0.00') and self.order.status == Order.STATUS_PENDING: for p in self.order.payments.filter(state=OrderPayment.PAYMENT_STATE_PENDING): if not p.payment_provider.abort_pending_allowed: raise OrderError(_('You may not change your order in a way that requires additional payment while ' diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index d46c2ef6c..ecc123a05 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -768,7 +768,7 @@ class CalendarView(OrganizerViewMixin, EventListMixin, TemplateView): raise Http404() tz = get_current_timezone() - before = datetime(self.year, self.month, 1, 0, 0, 0, tzinfo=tz) - timedelta(days=1) + before = datetime(self.year, self.month, 1, 23, 59, 59, tzinfo=tz) - timedelta(days=1) after = datetime(self.year, self.month, ndays, 0, 0, 0, tzinfo=tz) + timedelta(days=1) ctx['date'] = date(self.year, self.month, 1) @@ -854,7 +854,7 @@ class WeekCalendarView(OrganizerViewMixin, EventListMixin, TemplateView): tz = get_current_timezone() week = isoweek.Week(self.year, self.week) before = datetime( - week.monday().year, week.monday().month, week.monday().day, 0, 0, 0, tzinfo=tz, + week.monday().year, week.monday().month, week.monday().day, 23, 59, 59, tzinfo=tz, ) - timedelta(days=1) after = datetime( week.sunday().year, week.sunday().month, week.sunday().day, 0, 0, 0, tzinfo=tz, @@ -1001,7 +1001,7 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView): tz = get_current_timezone() before = datetime( - self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=tz, + self.date.year, self.date.month, self.date.day, 23, 59, 59, tzinfo=tz, ) - timedelta(days=1) after = datetime( self.date.year, self.date.month, self.date.day, 0, 0, 0, tzinfo=tz, diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index 1cf6b981a..12bac1172 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -8,10 +8,10 @@ "name": "pretix", "version": "0.0.0", "dependencies": { - "@babel/core": "^7.28.4", - "@babel/preset-env": "^7.28.3", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-node-resolve": "^16.0.1", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@rollup/plugin-babel": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", "rollup": "^2.79.1", "rollup-plugin-vue": "^5.0.1", "vue": "^2.7.16", @@ -33,27 +33,27 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -89,12 +89,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -348,10 +348,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "engines": { "node": ">=6.9.0" } @@ -392,11 +391,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -406,13 +405,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -603,9 +601,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -648,16 +646,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -683,12 +681,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -775,10 +773,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -868,10 +865,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -930,15 +926,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1025,15 +1020,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1074,10 +1069,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", - "license": "MIT", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1152,9 +1146,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1336,15 +1330,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@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", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -1357,42 +1351,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@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.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@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", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1454,16 +1448,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -1471,12 +1465,12 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1523,9 +1517,9 @@ } }, "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz", + "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@rollup/pluginutils": "^5.0.1" @@ -1548,10 +1542,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", - "license": "MIT", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -3790,24 +3783,24 @@ } }, "@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" }, "@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "requires": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -3829,12 +3822,12 @@ } }, "@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "requires": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -4011,9 +4004,9 @@ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" }, "@babel/helper-validator-option": { "version": "7.27.1", @@ -4040,20 +4033,20 @@ } }, "@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "requires": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "requires": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-bugfix-safari-class-field-initializer-scope": { @@ -4159,9 +4152,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -4185,16 +4178,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "requires": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" } }, "@babel/plugin-transform-computed-properties": { @@ -4207,12 +4200,12 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "requires": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-transform-dotall-regex": { @@ -4259,9 +4252,9 @@ } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -4310,9 +4303,9 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -4344,14 +4337,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "requires": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" } }, "@babel/plugin-transform-modules-umd": { @@ -4397,15 +4390,15 @@ } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "requires": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" } }, "@babel/plugin-transform-object-super": { @@ -4426,9 +4419,9 @@ } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "requires": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -4470,9 +4463,9 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "requires": { "@babel/helper-plugin-utils": "^7.27.1" } @@ -4571,15 +4564,15 @@ } }, "@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "requires": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@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", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -4592,42 +4585,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@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.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@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", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -4675,26 +4668,26 @@ } }, "@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "requires": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "requires": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" } }, "@jridgewell/gen-mapping": { @@ -4735,18 +4728,18 @@ } }, "@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz", + "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==", "requires": { "@babel/helper-module-imports": "^7.18.6", "@rollup/pluginutils": "^5.0.1" } }, "@rollup/plugin-node-resolve": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "requires": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index 1738d134e..21d74efa0 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -4,10 +4,10 @@ "private": true, "scripts": {}, "dependencies": { - "@babel/core": "^7.28.4", - "@babel/preset-env": "^7.28.3", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-node-resolve": "^16.0.1", + "@babel/core": "^7.28.5", + "@babel/preset-env": "^7.28.5", + "@rollup/plugin-babel": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", "vue": "^2.7.16", "rollup": "^2.79.1", "rollup-plugin-vue": "^5.0.1", diff --git a/src/pretix/static/pretixbase/js/addressform.js b/src/pretix/static/pretixbase/js/addressform.js index b1aa04e76..1dee56fe2 100644 --- a/src/pretix/static/pretixbase/js/addressform.js +++ b/src/pretix/static/pretixbase/js/addressform.js @@ -5,6 +5,14 @@ $(function () { // to prevent fetching the same thing many times. var responseCache = {}; + const cleanName = (name) => { + // Remove form prefix + name = name.split("-").pop(); + // Remove settings prefix + name = name.replace(/^invoice_address_from_/, ""); + return name + } + $("[data-address-information-url]").each(function () { let xhr; const form = $(this); @@ -22,7 +30,7 @@ $(function () { }; form.find("select[name*=transmission_], textarea[name*=transmission_], input[name*=transmission_]").each(function () { - dependents[$(this).attr("name").split("-").pop()] = $(this) + dependents[cleanName($(this).attr("name"))] = $(this) }) if (!Object.values(dependents).some((el) => el.length)) { @@ -109,7 +117,7 @@ $(function () { if (($(this).attr("type") === "radio" || $(this).attr("type") === "checkbox") && !$(this).prop("checked")) { return } - url.searchParams.append($(this).attr("name").split("-").pop(), $(this).val()); + url.searchParams.append(cleanName($(this).attr("name")), $(this).val()); }) if (dependents.transmission_type) { url.searchParams.append("transmission_type_required", !dependents.transmission_type.find("option[value='-']").length); diff --git a/src/pretix/static/pretixbase/scss/_theme.scss b/src/pretix/static/pretixbase/scss/_theme.scss index 3a5423d41..eb32d06ec 100644 --- a/src/pretix/static/pretixbase/scss/_theme.scss +++ b/src/pretix/static/pretixbase/scss/_theme.scss @@ -263,3 +263,11 @@ svg.svg-icon { @include table-row-variant('warning', var(--pretix-brand-warning-lighten-40), var(--pretix-brand-warning-lighten-35)); @include table-row-variant('danger', var(--pretix-brand-danger-lighten-30), var(--pretix-brand-danger-lighten-25)); +.confirmation-code-input { + font-size: 200%; + font-family: monospace; + font-stretch: expanded; + text-align: center; + height: 50px; + margin: 10px 0; +} diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index a1928bbca..ed24303c2 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -80,6 +80,23 @@ var form_handlers = function (el) { el.find("[data-formset]").on("formAdded", "div", function (event) { form_handlers($(event.target)); }); + el.find("[data-formset] [data-formset-sort]").on("click", function (event) { + // Sort forms alphabetically by their first field + var $formset = $(this).closest("[data-formset]"); + var $forms = $formset.find("[data-formset-form]").not("[data-formset-form-deleted]") + var compareForms = function(form_a, form_b) { + var a = $(form_a).find('input:not([name*=-ORDER]):not([name*=-DELETE]):not([name*=-id])').val(); + var b = $(form_b).find('input:not([name*=-ORDER]):not([name*=-DELETE]):not([name*=-id])').val(); + return a.localeCompare(b); + } + $forms = $forms.sort(compareForms); + $forms.each(function(i, form) { + var $order = $(form).find('[name*=-ORDER]'); + $order.val(i + 1); + }); + // Trigger visual reorder + $formset.find("[name*=-ORDER]").first().trigger("change"); + }); // Vouchers el.find("#voucher-bulk-codes-generate").click(function () { @@ -398,16 +415,24 @@ var form_handlers = function (el) { el.find("input[data-required-if], select[data-required-if], textarea[data-required-if]").each(function () { var dependent = $(this), - dependency = $($(this).attr("data-required-if")), + dependencies = $($(this).attr("data-required-if")), update = function (ev) { - var enabled = (dependency.attr("type") === 'checkbox' || dependency.attr("type") === 'radio') ? dependency.prop('checked') : !!dependency.val(); + var enabled = true; + dependencies.each(function () { + var dependency = $(this); + var e = (dependency.attr("type") === 'checkbox' || dependency.attr("type") === 'radio') ? dependency.prop('checked') : !!dependency.val(); + enabled = enabled && e; + }); dependent.prop('required', enabled).closest('.form-group').toggleClass('required', enabled).find('.optional').stop().animate({ 'opacity': enabled ? 0 : 1 }, ev ? 500 : 1); }; update(); - dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("change", update); - dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("dp.change", update); + dependencies.each(function () { + var dependency = $(this); + dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("change", update); + dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("dp.change", update); + }); }); el.find("div.scrolling-choice:not(.no-search)").each(function () { diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index f6f2d55f9..a80c9d515 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -938,3 +938,25 @@ details { } } } + + +@media (min-width: $screen-lg-min) { + .centered-form { + margin: 80px auto; + max-width: 800px; + border: 1px solid #ddd; + padding: 20px 40px 0; + border-radius: 4px; + box-shadow: 2px 2px 2px #eee; + } + + .form.centered-form .submit-group { + margin: 25px -40px 0 !important; + padding-right: 40px; + padding-left: 40px; + } + + .centered-form p { + margin: 20px 0; + } +} diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index c83eb3409..5cf8efa19 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -514,13 +514,17 @@ $(function () { $("input[data-required-if], select[data-required-if], textarea[data-required-if]").each(function () { var dependent = $(this), dependentLabel = $("label[for="+this.id+"]"), - dependency = $($(this).attr("data-required-if")), + dependencies = $($(this).attr("data-required-if")), update = function (ev) { - var enabled = (dependency.attr("type") === 'checkbox' || dependency.attr("type") === 'radio') ? dependency.prop('checked') : !!dependency.val(); + var enabled = true; + dependencies.each(function () { + var dependency = $(this); + var e = (dependency.attr("type") === 'checkbox' || dependency.attr("type") === 'radio') ? dependency.prop('checked') : !!dependency.val(); + enabled = enabled && e; + }); if (!dependent.is("[data-no-required-attr]")) { dependent.prop('required', enabled); } - dependent.closest('.form-group').toggleClass('required', enabled); if (enabled) { dependentLabel.append('' + gettext('required') + ''); } @@ -529,8 +533,11 @@ $(function () { } }; update(); - dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("change", update); - dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("dp.change", update); + dependencies.each(function () { + var dependency = $(this); + dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("change", update); + dependency.closest('.form-group').find('input[name=' + dependency.attr("name") + ']').on("dp.change", update); + }); }); $("input[data-display-dependency], div[data-display-dependency], select[data-display-dependency], textarea[data-display-dependency]").each(function () { diff --git a/src/pretix/static/pretixpresale/scss/_forms.scss b/src/pretix/static/pretixpresale/scss/_forms.scss index 0cff5dca4..89f19417c 100644 --- a/src/pretix/static/pretixpresale/scss/_forms.scss +++ b/src/pretix/static/pretixpresale/scss/_forms.scss @@ -173,7 +173,7 @@ output { } } @media (min-width: $screen-md-min) { - .form-group:not(:has(.checkbox)) { + .form-group:not(:has(.checkbox)), .form-group:has(.checkbox + .checkbox) { .label-required { display: block; } diff --git a/src/pretix/static/pretixpresale/scss/main.scss b/src/pretix/static/pretixpresale/scss/main.scss index 97c54c975..66ce9924d 100644 --- a/src/pretix/static/pretixpresale/scss/main.scss +++ b/src/pretix/static/pretixpresale/scss/main.scss @@ -574,6 +574,7 @@ h2 .label { .textbubble-success, .textbubble-success-warning, .textbubble-info, .textbubble-warning, .textbubble-danger { + display: inline-block; padding: 0 .4em; border-radius: $border-radius-base; font-weight: bold; diff --git a/src/tests/api/test_checkin.py b/src/tests/api/test_checkin.py index fd18b497d..1dc696e6f 100644 --- a/src/tests/api/test_checkin.py +++ b/src/tests/api/test_checkin.py @@ -236,6 +236,21 @@ TEST_LIST_RES = { "rules": {} } +TEST_HISTORY_RES = { + "successful": True, + "error_reason": None, + "error_explanation": None, + "position": 1234, + "datetime": "2017-12-25T12:45:23Z", + "created": "2017-12-25T12:45:23Z", + "list": 2, + "auto_checked_in": False, + "gate": None, + "device": None, + "device_id": None, + "type": "entry", +} + @pytest.fixture def clist(event, item): @@ -1366,3 +1381,57 @@ def test_expand(token_client, organizer, event, clist, clist_all, item, other_it )) assert resp.status_code == 200 assert 'value' in resp.data['results'][0]['variation'] + + +@pytest.mark.django_db +def test_history(token_client, organizer, event, clist, order): + with scopes_disabled(): + ci = order.positions.first().checkins.create(list=clist, type=Checkin.TYPE_ENTRY, datetime=now()) + res = dict(TEST_HISTORY_RES) + res["id"] = ci.pk + res["datetime"] = ci.datetime.isoformat().replace('+00:00', 'Z') + res["created"] = ci.created.isoformat().replace('+00:00', 'Z') + res["list"] = clist.pk + res["position"] = ci.position_id + + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/'.format( + organizer.slug, event.slug, + )) + assert resp.status_code == 200 + assert res == resp.data['results'][0] + + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?auto_checked_in=false'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 1 + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?auto_checked_in=true'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 0 + + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?successful=true'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 1 + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?successful=false'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 0 + + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?type=entry'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 1 + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?type=exit'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 0 + + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?created_before=2099-01-01T00:00:00Z'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 1 + resp = token_client.get('/api/v1/organizers/{}/events/{}/checkins/?created_before=2017-01-01T00:00:00Z'.format( + organizer.slug, event.slug, + )) + assert len(resp.data['results']) == 0 diff --git a/src/tests/api/test_invoices.py b/src/tests/api/test_invoices.py index 37c3db609..3c2ccd706 100644 --- a/src/tests/api/test_invoices.py +++ b/src/tests/api/test_invoices.py @@ -197,6 +197,7 @@ TEST_INVOICE_RES = { "invoice_from": "", "invoice_from_zipcode": "", "invoice_from_city": "", + "invoice_from_state": "", "invoice_from_country": None, "invoice_from_tax_id": "", "invoice_from_vat_id": "", diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index 4b10b80bf..3353cd5ed 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -46,7 +46,8 @@ from tests.const import SAMPLE_PNG from pretix.base.models import ( CartPosition, InvoiceAddress, Item, ItemAddOn, ItemBundle, ItemCategory, - ItemVariation, Order, OrderPosition, Question, QuestionOption, Quota, + ItemProgramTime, ItemVariation, Order, OrderPosition, Question, + QuestionOption, Quota, ) from pretix.base.models.orders import OrderFee @@ -331,6 +332,7 @@ TEST_ITEM_RES = { "variations": [], "addons": [], "bundles": [], + "program_times": [], "show_quota_left": None, "original_price": None, "free_price_suggestion": None, @@ -509,6 +511,24 @@ def test_item_detail_bundles(token_client, organizer, event, team, item, categor assert res == resp.data +@pytest.mark.django_db +def test_item_detail_program_times(token_client, organizer, event, team, item, category): + with scopes_disabled(): + item.program_times.create(item=item, start=datetime(2017, 12, 27, 0, 0, 0, tzinfo=timezone.utc), + end=datetime(2017, 12, 28, 0, 0, 0, tzinfo=timezone.utc)) + res = dict(TEST_ITEM_RES) + + res["id"] = item.pk + res["program_times"] = [{ + "start": "2017-12-27T00:00:00Z", + "end": "2017-12-28T00:00:00Z", + }] + resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, + item.pk)) + assert resp.status_code == 200 + assert res == resp.data + + @pytest.mark.django_db def test_item_create(token_client, organizer, event, item, category, taxrule, membership_type): resp = token_client.post( @@ -1072,6 +1092,57 @@ def test_item_create_with_bundle(token_client, organizer, event, item, category, assert resp.content.decode() == '{"bundles":["The chosen variation does not belong to this item."]}' +@pytest.mark.django_db +def test_item_create_with_product_time(token_client, organizer, event, item, category, taxrule): + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug), + { + "category": category.pk, + "name": { + "en": "Ticket" + }, + "active": True, + "description": None, + "default_price": "23.00", + "free_price": False, + "tax_rate": "19.00", + "tax_rule": taxrule.pk, + "admission": True, + "issue_giftcard": False, + "position": 0, + "picture": None, + "available_from": None, + "available_until": None, + "require_voucher": False, + "hide_without_voucher": False, + "allow_cancel": True, + "min_per_order": None, + "max_per_order": None, + "checkin_attention": False, + "checkin_text": None, + "has_variations": False, + "program_times": [ + { + "start": "2017-12-27T00:00:00Z", + "end": "2017-12-28T00:00:00Z", + }, + { + "start": "2017-12-29T00:00:00Z", + "end": "2017-12-30T00:00:00Z", + } + ] + }, + format='json' + ) + assert resp.status_code == 201 + with scopes_disabled(): + new_item = Item.objects.get(pk=resp.data['id']) + assert new_item.program_times.first().start == datetime(2017, 12, 27, 0, 0, 0, tzinfo=timezone.utc) + assert new_item.program_times.first().end == datetime(2017, 12, 28, 0, 0, 0, tzinfo=timezone.utc) + assert new_item.program_times.last().start == datetime(2017, 12, 29, 0, 0, 0, tzinfo=timezone.utc) + assert new_item.program_times.last().end == datetime(2017, 12, 30, 0, 0, 0, tzinfo=timezone.utc) + + @pytest.mark.django_db(transaction=True) def test_item_update(token_client, organizer, event, item, category, item2, category2, taxrule2): resp = token_client.patch( @@ -1147,8 +1218,8 @@ def test_item_update(token_client, organizer, event, item, category, item2, cate format='json' ) assert resp.status_code == 400 - assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, or variations via PATCH/PUT is not supported. Please use ' \ - 'the dedicated nested endpoint."]}' + assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, program times or variations via ' \ + 'PATCH/PUT is not supported. Please use the dedicated nested endpoint."]}' resp = token_client.patch( '/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk), @@ -1165,8 +1236,8 @@ def test_item_update(token_client, organizer, event, item, category, item2, cate format='json' ) assert resp.status_code == 400 - assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, or variations via PATCH/PUT is not supported. Please use ' \ - 'the dedicated nested endpoint."]}' + assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, program times or variations via ' \ + 'PATCH/PUT is not supported. Please use the dedicated nested endpoint."]}' item.personalized = True item.admission = True @@ -1322,8 +1393,8 @@ def test_item_update_with_variation(token_client, organizer, event, item): format='json' ) assert resp.status_code == 400 - assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, or variations via PATCH/PUT is not supported. Please use ' \ - 'the dedicated nested endpoint."]}' + assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, program times or variations via ' \ + 'PATCH/PUT is not supported. Please use the dedicated nested endpoint."]}' @pytest.mark.django_db @@ -1345,8 +1416,8 @@ def test_item_update_with_addon(token_client, organizer, event, item, category): format='json' ) assert resp.status_code == 400 - assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, or variations via PATCH/PUT is not supported. Please use ' \ - 'the dedicated nested endpoint."]}' + assert resp.content.decode() == '{"non_field_errors":["Updating add-ons, bundles, program times or variations via ' \ + 'PATCH/PUT is not supported. Please use the dedicated nested endpoint."]}' @pytest.mark.django_db @@ -1881,6 +1952,123 @@ def test_addons_delete(token_client, organizer, event, item, addon): assert not item.addons.filter(pk=addon.id).exists() +@pytest.fixture +def program_time(item, category): + return item.program_times.create(start=datetime(2017, 12, 27, 0, 0, 0, tzinfo=timezone.utc), + end=datetime(2017, 12, 28, 0, 0, 0, tzinfo=timezone.utc)) + + +@pytest.fixture +def program_time2(item, category): + return item.program_times.create(start=datetime(2017, 12, 29, 0, 0, 0, tzinfo=timezone.utc), + end=datetime(2017, 12, 30, 0, 0, 0, tzinfo=timezone.utc)) + + +TEST_PROGRAM_TIMES_RES = { + 0: { + "start": "2017-12-27T00:00:00Z", + "end": "2017-12-28T00:00:00Z", + }, + 1: { + "start": "2017-12-29T00:00:00Z", + "end": "2017-12-30T00:00:00Z", + } +} + + +@pytest.mark.django_db +def test_program_times_list(token_client, organizer, event, item, program_time, program_time2): + res = dict(TEST_PROGRAM_TIMES_RES) + res[0]["id"] = program_time.pk + res[1]["id"] = program_time2.pk + resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, + item.pk)) + assert resp.status_code == 200 + assert res[0]['start'] == resp.data['results'][0]['start'] + assert res[0]['end'] == resp.data['results'][0]['end'] + assert res[0]['id'] == resp.data['results'][0]['id'] + assert res[1]['start'] == resp.data['results'][1]['start'] + assert res[1]['end'] == resp.data['results'][1]['end'] + assert res[1]['id'] == resp.data['results'][1]['id'] + + +@pytest.mark.django_db +def test_program_times_detail(token_client, organizer, event, item, program_time): + res = dict(TEST_PROGRAM_TIMES_RES) + res[0]["id"] = program_time.pk + resp = token_client.get( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/{}/'.format(organizer.slug, event.slug, + item.pk, program_time.pk)) + assert resp.status_code == 200 + assert res[0] == resp.data + + +@pytest.mark.django_db +def test_program_times_create(token_client, organizer, event, item): + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, item.pk), + { + "start": "2017-12-27T00:00:00Z", + "end": "2017-12-28T00:00:00Z" + }, + format='json' + ) + assert resp.status_code == 201 + with scopes_disabled(): + program_time = ItemProgramTime.objects.get(pk=resp.data['id']) + assert datetime(2017, 12, 27, 0, 0, 0, tzinfo=timezone.utc) == program_time.start + assert datetime(2017, 12, 28, 0, 0, 0, tzinfo=timezone.utc) == program_time.end + + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, item.pk), + { + "start": "2017-12-28T00:00:00Z", + "end": "2017-12-27T00:00:00Z" + }, + format='json' + ) + assert resp.status_code == 400 + assert resp.content.decode() == '{"non_field_errors":["The program end must not be before the program start."]}' + + +@pytest.mark.django_db +def test_program_times_update(token_client, organizer, event, item, program_time): + resp = token_client.patch( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/{}/'.format(organizer.slug, event.slug, item.pk, + program_time.pk), + { + "start": "2017-12-26T00:00:00Z" + }, + format='json' + ) + assert resp.status_code == 200 + with scopes_disabled(): + program_time = ItemProgramTime.objects.get(pk=resp.data['id']) + assert datetime(2017, 12, 26, 0, 0, 0, tzinfo=timezone.utc) == program_time.start + assert datetime(2017, 12, 28, 0, 0, 0, tzinfo=timezone.utc) == program_time.end + + resp = token_client.patch( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/{}/'.format(organizer.slug, event.slug, item.pk, + program_time.pk), + { + "start": "2017-12-30T00:00:00Z" + }, + format='json' + ) + assert resp.status_code == 400 + assert resp.content.decode() == '{"non_field_errors":["The program end must not be before the program start."]}' + + +@pytest.mark.django_db +def test_program_times_delete(token_client, organizer, event, item, program_time): + resp = token_client.delete( + '/api/v1/organizers/{}/events/{}/items/{}/program_times/{}/'.format(organizer.slug, event.slug, + item.pk, program_time.pk)) + assert resp.status_code == 204 + with scopes_disabled(): + assert not item.program_times.filter(pk=program_time.id).exists() + + @pytest.fixture def quota(event, item): q = event.quotas.create(name="Budget Quota", size=200) diff --git a/src/tests/api/test_order_change.py b/src/tests/api/test_order_change.py index 0e628d20a..4cff389cf 100644 --- a/src/tests/api/test_order_change.py +++ b/src/tests/api/test_order_change.py @@ -578,6 +578,7 @@ def test_order_create_invoice(token_client, organizer, event, order): "invoice_from": "", "invoice_from_zipcode": "", "invoice_from_city": "", + "invoice_from_state": "", "invoice_from_country": None, "invoice_from_tax_id": "", "invoice_from_vat_id": "", diff --git a/src/tests/api/test_order_create.py b/src/tests/api/test_order_create.py index e954da047..f3f1d7e3e 100644 --- a/src/tests/api/test_order_create.py +++ b/src/tests/api/test_order_create.py @@ -420,6 +420,7 @@ def test_order_create_simulate(token_client, organizer, event, item, quota, ques } ], 'total': '21.75', + 'tax_rounding_mode': 'line', 'comment': '', 'api_meta': {}, "custom_followup_at": None, @@ -3259,3 +3260,79 @@ def test_order_create_auto_pricing_explicit_discount_not_allowed(token_client, o } ] } + + +@pytest.mark.django_db +def test_order_create_rounding_mode(token_client, organizer, event, item, quota, question, taxrule): + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res["tax_rounding_mode"] = "sum_by_net" + res['fees'][0]['_split_taxes_like_products'] = True + res['fees'][0]['value'] = Decimal("100.00") + res['positions'] = [ + { + "item": item.pk, + "price": "100.00", + } + ] * 4 + + for simulate in (True, False): + res["simulate"] = simulate + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert resp.data["total"] == "499.98" + assert resp.data["positions"][0]["price"] == "99.99" + assert resp.data["positions"][-1]["price"] == "100.00" + + res["tax_rounding_mode"] = "sum_by_net_keep_gross" + for simulate in (True, False): + res["simulate"] = simulate + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert resp.data["total"] == "500.00" + assert resp.data["positions"][0]["tax_value"] == "15.96" + assert resp.data["positions"][-1]["tax_value"] == "15.97" + + +@pytest.mark.django_db +def test_order_create_rounding_default_pretixpos_fallback(device, device_client, organizer, event, item, quota, question, taxrule): + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['fees'][0]['_split_taxes_like_products'] = True + res['fees'][0]['value'] = Decimal("100.00") + res['positions'] = [ + { + "item": item.pk, + "price": "100.00", + } + ] * 4 + + event.settings.tax_rounding = "sum_by_net" + + resp = device_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert resp.data["total"] == "499.98" + assert resp.data["positions"][0]["price"] == "99.99" + assert resp.data["positions"][-1]["price"] == "100.00" + + device.software_brand = "pretixPOS Android" + device.save() + resp = device_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert resp.data["total"] == "500.00" + assert resp.data["positions"][0]["price"] == "100.00" + assert resp.data["positions"][-1]["price"] == "100.00" diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index 08b7bd16b..6f41ac82b 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -306,6 +306,7 @@ TEST_ORDER_RES = { "url": "http://example.com/dummy/dummy/order/FOO/k24fiuwvu8kxz3y1/", "payment_provider": "banktransfer", "total": "23.00", + "tax_rounding_mode": "line", "comment": "", "api_meta": {}, "custom_followup_at": None, @@ -1995,7 +1996,7 @@ def test_pdf_data(token_client, organizer, event, order, django_assert_max_num_q assert not resp.data['positions'][0].get('pdf_data') # order list - with django_assert_max_num_queries(32): + with django_assert_max_num_queries(33): resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?pdf_data=true'.format( organizer.slug, event.slug )) diff --git a/src/tests/api/test_permissions.py b/src/tests/api/test_permissions.py index 91249dd75..15da07f72 100644 --- a/src/tests/api/test_permissions.py +++ b/src/tests/api/test_permissions.py @@ -54,6 +54,7 @@ event_urls = [ (None, 'taxrules/'), ('can_view_orders', 'waitinglistentries/'), ('can_view_orders', 'checkinlists/'), + ('can_view_orders', 'checkins/'), (None, 'seats/'), ] @@ -176,6 +177,8 @@ event_permission_sub_urls = [ ('post', 'can_change_orders', 'orders/ABC12/refunds/1/done/', 404), ('get', 'can_view_orders', 'checkinlists/', 200), ('post', 'can_change_orders', 'checkinlists/1/failed_checkins/', 400), + ('get', 'can_view_orders', 'checkins/', 200), + ('get', 'can_view_orders', 'checkins/1/', 404), ('post', 'can_change_event_settings', 'checkinlists/', 400), ('put', 'can_change_event_settings', 'checkinlists/1/', 404), ('patch', 'can_change_event_settings', 'checkinlists/1/', 404), diff --git a/src/tests/base/test_customer_oidc_rp.py b/src/tests/base/test_customer_oidc_rp.py index 80ffb4b68..0dc628ff9 100644 --- a/src/tests/base/test_customer_oidc_rp.py +++ b/src/tests/base/test_customer_oidc_rp.py @@ -175,12 +175,6 @@ def test_incompatible(): oidc_validate_and_complete_config(config) assert "not requesting" in str(e.value) - config["scope"] = "openid foo" - - with pytest.raises(ValidationError) as e: - oidc_validate_and_complete_config(config) - assert "requesting scope" in str(e.value) - @responses.activate def test_compatible(): diff --git a/src/tests/base/test_event_clone.py b/src/tests/base/test_event_clone.py index c01339be7..784bd079a 100644 --- a/src/tests/base/test_event_clone.py +++ b/src/tests/base/test_event_clone.py @@ -39,7 +39,9 @@ import pytest from django.utils.timezone import now from django_scopes import scopes_disabled -from pretix.base.models import Event, Organizer, Question, SeatingPlan +from pretix.base.models import ( + Event, ItemProgramTime, Organizer, Question, SeatingPlan, +) from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue @@ -78,6 +80,10 @@ def test_full_clone_same_organizer(): # todo: test that item pictures are copied, not linked ItemMetaValue.objects.create(item=item1, property=item_meta, value="Foo") assert item1.meta_data + ItemProgramTime.objects.create(item=item1, + start=datetime.datetime(2017, 12, 27, 0, 0, 0, tzinfo=datetime.timezone.utc), + end=datetime.datetime(2017, 12, 28, 0, 0, 0, tzinfo=datetime.timezone.utc)) + assert item1.program_times item2 = event.items.create(category=category, tax_rule=tax_rule, name="T-shirt", default_price=15, hidden_if_item_available=item1) item2v = item2.variations.create(value="red", default_price=15, all_sales_channels=False) @@ -161,6 +167,8 @@ def test_full_clone_same_organizer(): assert copied_item1.category == copied_event.categories.get(name='Tickets') assert copied_item1.limit_sales_channels.get() == sc assert copied_item1.meta_data == item1.meta_data + assert copied_item1.program_times.first().start == item1.program_times.first().start + assert copied_item1.program_times.first().end == item1.program_times.first().end assert copied_item2.variations.get().meta_data == item2v.meta_data assert copied_item1.hidden_if_available == copied_q2 assert copied_item1.grant_membership_type == membership_type diff --git a/src/tests/base/test_mail.py b/src/tests/base/test_mail.py index a9ca4f20e..1e15460a1 100644 --- a/src/tests/base/test_mail.py +++ b/src/tests/base/test_mail.py @@ -33,6 +33,8 @@ # License for the specific language governing permissions and limitations under the License. import os +import re +from email.mime.text import MIMEText import pytest from django.conf import settings @@ -40,7 +42,9 @@ from django.core import mail as djmail from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django_scopes import scope +from i18nfield.strings import LazyI18nString +from pretix.base.email import get_email_context from pretix.base.models import Event, Organizer, User from pretix.base.services.mail import mail @@ -48,10 +52,14 @@ from pretix.base.services.mail import mail @pytest.fixture def env(): o = Organizer.objects.create(name='Dummy', slug='dummy') + prop1 = o.meta_properties.get_or_create(name="Test")[0] + prop2 = o.meta_properties.get_or_create(name="Website")[0] event = Event.objects.create( organizer=o, name='Dummy', slug='dummy', date_from=now() ) + event.meta_values.update_or_create(property=prop1, defaults={'value': "*Beep*"}) + event.meta_values.update_or_create(property=prop2, defaults={'value': "https://example.com"}) user = User.objects.create_user('dummy@dummy.dummy', 'dummy') user.email = 'dummy@dummy.dummy' user.save() @@ -158,8 +166,109 @@ def test_send_mail_with_user_locale(env): def test_sendmail_placeholder(env): djmail.outbox = [] event, user, organizer = env - mail('dummy@dummy.dummy', '{event} Test subject', 'mailtest.txt', {"event": event}, event) + mail('dummy@dummy.dummy', '{event} Test subject', 'mailtest.txt', {"event": event.name}, event) assert len(djmail.outbox) == 1 assert djmail.outbox[0].to == [user.email] assert djmail.outbox[0].subject == 'Dummy Test subject' + + +def _extract_html(mail): + for content, mimetype in mail.alternatives: + if "multipart/related" in mimetype: + for sp in content._payload: + if isinstance(sp, MIMEText): + return sp._payload + break + elif "text/html" in mimetype: + return content + + +@pytest.mark.django_db +def test_placeholder_html_rendering_from_template(env): + djmail.outbox = [] + event, user, organizer = env + event.name = "event & co. kg" + event.save() + mail('dummy@dummy.dummy', '{event} Test subject', 'mailtest.txt', get_email_context( + event=event, + payment_info="**IBAN**: 123 \n**BIC**: 456", + ), event) + + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].to == [user.email] + assert 'Event name: event & co. kg' in djmail.outbox[0].body + assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body + assert '**Meta**: *Beep*' in djmail.outbox[0].body + assert 'Event website: [event & co. kg](https://example.org/dummy)' in djmail.outbox[0].body + assert 'Other website: [event & co. kg](https://example.com)' in djmail.outbox[0].body + assert '<' not in djmail.outbox[0].body + assert '&' not in djmail.outbox[0].body + html = _extract_html(djmail.outbox[0]) + + assert 'event' not in html + assert 'Event name: <strong>event & co. kg</strong>' in html + assert 'IBAN: 123
\nBIC: 456' in html + assert 'Meta: Beep' in html + assert re.search( + r'Event website: <strong>event & co. kg</strong>', + html + ) + assert re.search( + r'Other website: <strong>event & co. kg</strong>', + html + ) + + +@pytest.mark.django_db +def test_placeholder_html_rendering_from_string(env): + template = LazyI18nString({ + "en": "Event name: {event}\n\nPayment info:\n{payment_info}\n\n**Meta**: {meta_Test}\n\n" + "Event website: [{event}](https://example.org/{event_slug})\n\n" + "Other website: [{event}]({meta_Website})\n\n" + "URL: {url}\n\n" + "URL with text: Test" + }) + djmail.outbox = [] + event, user, organizer = env + event.name = "event & co. kg" + event.save() + ctx = get_email_context( + event=event, + payment_info="**IBAN**: 123 \n**BIC**: 456", + ) + ctx["url"] = "https://google.com" + mail('dummy@dummy.dummy', '{event} Test subject', template, ctx, event) + + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].to == [user.email] + assert 'Event name: event & co. kg' in djmail.outbox[0].body + assert 'Event website: [event & co. kg](https://example.org/dummy)' in djmail.outbox[0].body + assert 'Other website: [event & co. kg](https://example.com)' in djmail.outbox[0].body + assert '**IBAN**: 123 \n**BIC**: 456' in djmail.outbox[0].body + assert '**Meta**: *Beep*' in djmail.outbox[0].body + assert 'URL: https://google.com' in djmail.outbox[0].body + assert 'URL with text: Test' in djmail.outbox[0].body + assert '<' not in djmail.outbox[0].body + assert '&' not in djmail.outbox[0].body + html = _extract_html(djmail.outbox[0]) + assert 'event' not in html + assert 'Event name: <strong>event & co. kg</strong>' in html + assert 'IBAN: 123
\nBIC: 456' in html + assert 'Meta: Beep' in html + assert re.search( + r'Event website: <strong>event & co. kg</strong>', + html + ) + assert re.search( + r'Other website: <strong>event & co. kg</strong>', + html + ) + assert re.search( + r'URL: https://google.com', + html + ) + assert re.search( + r'URL with text: Test', + html + ) diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 032c648c8..486fb24a7 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -1820,6 +1820,63 @@ class OrderChangeManagerTests(TestCase): assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price + @classscope(attr='o') + def test_change_price_with_rounding_change_impossible(self): + # Order starts with 2*100€ tickets, but rounding corrects it to 199€. Then, the user tries to force both prices + # to 100€. No luck. + self.order.status = Order.STATUS_PAID + self.order.tax_rounding_mode = "sum_by_net" + self.order.save() + self.op1.price = Decimal("100.00") + self.op1._calculate_tax(tax_rule=self.tr19) + self.op1.save() + self.op2.price = Decimal("100.00") + self.op2._calculate_tax(tax_rule=self.tr19) + self.op2.save() + self.order.refresh_from_db() + self.ocm.regenerate_secret(self.op1) + self.ocm.commit() # Force re-rounding + self.order.refresh_from_db() + self.ocm = OrderChangeManager(self.order, None) + assert self.order.total == Decimal("199.99") + + self.ocm.change_price(self.op1, Decimal('100.00')) + self.ocm.change_price(self.op2, Decimal('100.00')) + self.ocm.commit() + self.op1.refresh_from_db() + self.op2.refresh_from_db() + self.order.refresh_from_db() + assert self.order.total == Decimal("199.99") + assert self.op1.price == Decimal('99.99') + assert self.op2.price == Decimal('100.00') + + @classscope(attr='o') + def test_change_price_with_rounding_change_autocorrected(self): + self.order.status = Order.STATUS_PAID + self.order.tax_rounding_mode = "sum_by_net" + self.order.save() + self.op1.price = Decimal("0.00") + self.op1._calculate_tax(tax_rule=self.tr19) + self.op1.save() + self.op2.price = Decimal("100.00") + self.op2._calculate_tax(tax_rule=self.tr19) + self.op2.save() + self.order.refresh_from_db() + self.ocm.regenerate_secret(self.op1) + self.ocm.commit() # Force re-rounding + self.order.refresh_from_db() + self.ocm = OrderChangeManager(self.order, None) + assert self.order.total == Decimal("100.00") + + self.ocm.change_price(self.op1, Decimal('100.00')) + self.ocm.commit() + self.op1.refresh_from_db() + self.op2.refresh_from_db() + self.order.refresh_from_db() + assert self.order.total == Decimal("199.99") + assert self.op1.price == Decimal('99.99') + assert self.op2.price == Decimal('100.00') + @classscope(attr='o') def test_change_price_net_success(self): self.tr7.price_includes_tax = False @@ -2408,6 +2465,24 @@ class OrderChangeManagerTests(TestCase): assert nop.price == Decimal('12.00') assert nop.subevent == se1 + @classscope(attr='o') + def test_add_item_with_rounding(self): + self.order.tax_rounding_mode = "sum_by_net" + self.order.save() + self.ocm.add_position(self.ticket, None, None, None) + self.ocm.commit() + self.order.refresh_from_db() + assert self.order.positions.count() == 3 + op1, op2, op3 = self.order.positions.all() + assert op1.price == Decimal("23.01") + assert op1.price_includes_rounding_correction == Decimal("0.01") + assert op2.price == Decimal("23.01") + assert op2.price_includes_rounding_correction == Decimal("0.01") + assert op3.price == Decimal("23.00") + assert op3.price_includes_rounding_correction == Decimal("0.00") + assert self.order.total == Decimal("69.02") + assert self.order.transactions.count() == 7 + @classscope(attr='o') def test_reissue_invoice(self): generate_invoice(self.order) @@ -2522,7 +2597,7 @@ class OrderChangeManagerTests(TestCase): def test_recalculate_country_rate(self): prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) - self.ocm._recalculate_total_and_payment_fee() + self.ocm._recalculate_rounding_total_and_payment_fee() assert self.order.total == Decimal('46.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) @@ -2554,7 +2629,7 @@ class OrderChangeManagerTests(TestCase): def test_recalculate_country_rate_keep_gross(self): prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) - self.ocm._recalculate_total_and_payment_fee() + self.ocm._recalculate_rounding_total_and_payment_fee() assert self.order.total == Decimal('46.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) @@ -2584,7 +2659,7 @@ class OrderChangeManagerTests(TestCase): def test_recalculate_reverse_charge(self): prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) - self.ocm._recalculate_total_and_payment_fee() + self.ocm._recalculate_rounding_total_and_payment_fee() assert self.order.total == Decimal('46.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) @@ -2815,6 +2890,61 @@ class OrderChangeManagerTests(TestCase): assert p.amount == Decimal('23.00') assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED + @classscope(attr='o') + def test_split_with_rounding_change(self): + # Order starts with 2*100€ tickets, but rounding corrects it to 199€. Then, it gets split, so its now 100 + 100 + # and 1€ is pending. Nasty, but we didn't choose the EN16931 rounding method… + self.order.status = Order.STATUS_PAID + self.order.tax_rounding_mode = "sum_by_net" + self.order.save() + self.op1.price = Decimal("100.00") + self.op1._calculate_tax(tax_rule=self.tr19) + self.op1.save() + self.op2.price = Decimal("100.00") + self.op2._calculate_tax(tax_rule=self.tr19) + self.op2.save() + self.order.refresh_from_db() + self.ocm.regenerate_secret(self.op1) + self.ocm.commit() # Force re-rounding + self.order.refresh_from_db() + self.ocm = OrderChangeManager(self.order, None) + + assert self.order.total == Decimal("199.99") + self.order.payments.create( + provider='manual', + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + amount=self.order.total, + ) + + # Split + self.ocm.split(self.op2) + self.ocm.commit() + self.order.refresh_from_db() + self.op2.refresh_from_db() + + # First order + assert self.order.total == Decimal('100.00') + assert not self.order.fees.exists() + assert self.order.pending_sum == Decimal('0.01') + assert self.order.status == Order.STATUS_PENDING + r = self.order.refunds.last() + assert r.provider == 'offsetting' + assert r.amount == Decimal('100.00') + assert r.state == OrderRefund.REFUND_STATE_DONE + + # New order + assert self.op2.order != self.order + o2 = self.op2.order + assert o2.total == Decimal('100.00') + assert o2.status == Order.STATUS_PAID + assert o2.positions.count() == 1 + assert o2.fees.count() == 0 + assert o2.pending_sum == Decimal('0.00') + p = o2.payments.last() + assert p.provider == 'offsetting' + assert p.amount == Decimal('100.00') + assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED + @classscope(attr='o') def test_split_and_change_higher(self): self.order.status = Order.STATUS_PAID diff --git a/src/tests/base/test_pricing_rounding.py b/src/tests/base/test_pricing_rounding.py new file mode 100644 index 000000000..ffe9eaea1 --- /dev/null +++ b/src/tests/base/test_pricing_rounding.py @@ -0,0 +1,247 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-today pretix GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# +from decimal import Decimal + +import pytest + +from pretix.base.models import InvoiceAddress, OrderPosition, TaxRule +from pretix.base.services.pricing import apply_rounding + + +@pytest.fixture +def sample_lines(): + lines = [OrderPosition( + price=Decimal("100.00"), + tax_value=Decimal("15.97"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) for _ in range(5)] + return lines + + +def _validate_sample_lines(sample_lines, rounding_mode): + corrections = [ + (line.tax_value_includes_rounding_correction, line.price_includes_rounding_correction) + for line in sample_lines + ] + changed = apply_rounding(rounding_mode, "EUR", sample_lines) + for line, original in zip(sample_lines, corrections): + if (line.tax_value_includes_rounding_correction, line.price_includes_rounding_correction) != original: + assert line in changed + else: + assert line not in changed + + if rounding_mode == "line": + for line in sample_lines: + assert line.price == Decimal("100.00") + assert line.tax_value == Decimal("15.97") + assert line.tax_rate == Decimal("19.00") + assert sum(line.price for line in sample_lines) == Decimal("500.00") + assert sum(line.tax_value for line in sample_lines) == Decimal("79.85") + elif rounding_mode == "sum_by_net": + for line in sample_lines: + # gross price may vary + assert line.price - line.tax_value == Decimal("84.03") + assert line.tax_rate == Decimal("19.00") + assert sum(line.price for line in sample_lines) == Decimal("499.98") + assert sum(line.tax_value for line in sample_lines) == Decimal("79.83") + assert sum(line.price - line.tax_value for line in sample_lines) == Decimal("420.15") + elif rounding_mode == "sum_by_net_keep_gross": + for line in sample_lines: + assert line.price == Decimal("100.00") + # net price may vary + assert line.tax_rate == Decimal("19.00") + assert sum(line.price for line in sample_lines) == Decimal("500.00") + assert sum(line.tax_value for line in sample_lines) == Decimal("79.83") + assert sum(line.price - line.tax_value for line in sample_lines) == Decimal("420.17") + + +@pytest.mark.django_db +def test_simple_case_by_line(sample_lines): + _validate_sample_lines(sample_lines, "line") + + +@pytest.mark.django_db +def test_simple_case_by_net(sample_lines): + _validate_sample_lines(sample_lines, "sum_by_net") + + +@pytest.mark.django_db +def test_simple_case_by_gross(sample_lines): + _validate_sample_lines(sample_lines, "sum_by_net_keep_gross") + + +@pytest.mark.django_db +def test_simple_case_switch_rounding(sample_lines): + _validate_sample_lines(sample_lines, "sum_by_net") + _validate_sample_lines(sample_lines, "sum_by_net_keep_gross") + _validate_sample_lines(sample_lines, "line") + _validate_sample_lines(sample_lines, "sum_by_net") + + +@pytest.mark.django_db +def test_revert_net_rounding_to_single_line(sample_lines): + l = OrderPosition( + price=Decimal("100.01"), + price_includes_rounding_correction=Decimal("0.01"), + tax_value=Decimal("15.98"), + tax_value_includes_rounding_correction=Decimal("0.01"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) + apply_rounding("sum_by_net", "EUR", [l]) + assert l.price == Decimal("100.00") + assert l.price_includes_rounding_correction == Decimal("0.00") + assert l.tax_value == Decimal("15.97") + assert l.tax_value_includes_rounding_correction == Decimal("0.00") + assert l.tax_rate == Decimal("19.00") + + +@pytest.mark.django_db +def test_revert_net_keep_gross_rounding_to_single_line(sample_lines): + l = OrderPosition( + price=Decimal("100.00"), + price_includes_rounding_correction=Decimal("0.00"), + tax_value=Decimal("15.96"), + tax_value_includes_rounding_correction=Decimal("-0.01"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) + apply_rounding("sum_by_net_keep_gross", "EUR", [l]) + assert l.price == Decimal("100.00") + assert l.price_includes_rounding_correction == Decimal("0.00") + assert l.tax_value == Decimal("15.97") + assert l.tax_value_includes_rounding_correction == Decimal("0.00") + assert l.tax_rate == Decimal("19.00") + + +@pytest.mark.django_db +@pytest.mark.parametrize("rounding_mode", [ + "sum_by_net", + "sum_by_net_keep_gross", +]) +def test_rounding_of_impossible_gross_price(rounding_mode): + l = OrderPosition( + price=Decimal("23.00"), + ) + l._calculate_tax(tax_rule=TaxRule(rate=Decimal("7.00")), invoice_address=InvoiceAddress()) + apply_rounding(rounding_mode, "EUR", [l]) + assert l.price == Decimal("23.01") + assert l.price_includes_rounding_correction == Decimal("0.01") + assert l.tax_value == Decimal("1.51") + assert l.tax_value_includes_rounding_correction == Decimal("0.01") + assert l.tax_rate == Decimal("7.00") + + +@pytest.mark.django_db +def test_round_down(): + lines = [OrderPosition( + price=Decimal("100.00"), + tax_value=Decimal("15.97"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) for _ in range(5)] + assert sum(l.price for l in lines) == Decimal("500.00") + assert sum(l.tax_value for l in lines) == Decimal("79.85") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.15") + + apply_rounding("sum_by_net", "EUR", lines) + assert sum(l.price for l in lines) == Decimal("499.98") + assert sum(l.tax_value for l in lines) == Decimal("79.83") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.15") + + apply_rounding("sum_by_net_keep_gross", "EUR", lines) + assert sum(l.price for l in lines) == Decimal("500.00") + assert sum(l.tax_value for l in lines) == Decimal("79.83") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.17") + + +@pytest.mark.django_db +def test_round_up(): + lines = [OrderPosition( + price=Decimal("99.98"), + tax_value=Decimal("15.96"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) for _ in range(5)] + assert sum(l.price for l in lines) == Decimal("499.90") + assert sum(l.tax_value for l in lines) == Decimal("79.80") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.10") + + apply_rounding("sum_by_net", "EUR", lines) + assert sum(l.price for l in lines) == Decimal("499.92") + assert sum(l.tax_value for l in lines) == Decimal("79.82") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.10") + + apply_rounding("sum_by_net_keep_gross", "EUR", lines) + assert sum(l.price for l in lines) == Decimal("499.90") + assert sum(l.tax_value for l in lines) == Decimal("79.82") + assert sum(l.price - l.tax_value for l in lines) == Decimal("420.08") + + +@pytest.mark.django_db +def test_round_currency_without_decimals(): + lines = [OrderPosition( + price=Decimal("9998.00"), + tax_value=Decimal("1596.00"), + tax_rate=Decimal("19.00"), + tax_code="S", + ) for _ in range(5)] + assert sum(l.price for l in lines) == Decimal("49990.00") + assert sum(l.tax_value for l in lines) == Decimal("7980.00") + assert sum(l.price - l.tax_value for l in lines) == Decimal("42010.00") + + apply_rounding("sum_by_net", "JPY", lines) + assert sum(l.price for l in lines) == Decimal("49992.00") + assert sum(l.tax_value for l in lines) == Decimal("7982.00") + assert sum(l.price - l.tax_value for l in lines) == Decimal("42010.00") + + apply_rounding("sum_by_net_keep_gross", "JPY", lines) + assert sum(l.price for l in lines) == Decimal("49990.00") + assert sum(l.tax_value for l in lines) == Decimal("7982.00") + assert sum(l.price - l.tax_value for l in lines) == Decimal("42008.00") + + +@pytest.mark.django_db +@pytest.mark.parametrize("rounding_mode", [ + "sum_by_net", + "sum_by_net_keep_gross", +]) +def test_do_not_touch_free(rounding_mode): + l1 = OrderPosition( + price=Decimal("0.00"), + ) + l1._calculate_tax(tax_rule=TaxRule(rate=Decimal("7.00")), invoice_address=InvoiceAddress()) + l2 = OrderPosition( + price=Decimal("23.00"), + ) + l2._calculate_tax(tax_rule=TaxRule(rate=Decimal("7.00")), invoice_address=InvoiceAddress()) + apply_rounding(rounding_mode, "EUR", [l1, l2]) + assert l2.price == Decimal("23.01") + assert l2.price_includes_rounding_correction == Decimal("0.01") + assert l2.tax_value == Decimal("1.51") + assert l2.tax_value_includes_rounding_correction == Decimal("0.01") + assert l2.tax_rate == Decimal("7.00") + assert l1.price == Decimal("0.00") + assert l1.price_includes_rounding_correction == Decimal("0.00") + assert l1.tax_value == Decimal("0.00") + assert l1.tax_value_includes_rounding_correction == Decimal("0.00") diff --git a/src/tests/base/test_taxrules.py b/src/tests/base/test_taxrules.py index 095d0276b..e3cf813d6 100644 --- a/src/tests/base/test_taxrules.py +++ b/src/tests/base/test_taxrules.py @@ -60,6 +60,19 @@ def test_from_gross_price(event): assert tp.rate == Decimal('10.00') assert tp.code == 'S/standard' + tr = TaxRule( + event=event, + rate=Decimal('19.00'), + code=None, + price_includes_tax=True, + ) + tp = tr.tax(Decimal('99.99')) + assert tp.gross == Decimal('99.99') + assert tp.net == Decimal('84.03') + assert tp.tax == Decimal('15.96') + assert tp.rate == Decimal('19.00') + assert tp.code is None + @pytest.mark.django_db def test_from_net_price(event): @@ -978,7 +991,7 @@ def test_split_fees(event): op2 = OrderPosition(price=Decimal("10.70"), item=item) op2._calculate_tax(tax_rule=tr7, invoice_address=InvoiceAddress()) of1 = OrderFee(value=Decimal("5.00"), fee_type=OrderFee.FEE_TYPE_SHIPPING) - of1._calculate_tax(tax_rule=tr7, invoice_address=InvoiceAddress()) + of1._calculate_tax(tax_rule=tr7, invoice_address=InvoiceAddress(), event=event) # Example of a 10% service fee assert split_fee_for_taxes([op1, op2], Decimal("2.26"), event) == [ diff --git a/src/tests/control/test_auth.py b/src/tests/control/test_auth.py index 8500c77f3..8af46263d 100644 --- a/src/tests/control/test_auth.py +++ b/src/tests/control/test_auth.py @@ -1134,7 +1134,7 @@ class PasswordChangeRequiredTest(TestCase): super().setUp() self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') - def test_redirect_to_settings(self): + def test_redirect_to_password_change(self): self.user.needs_password_change = True self.user.save() self.client.login(email='dummy@dummy.dummy', password='dummy') @@ -1143,9 +1143,9 @@ class PasswordChangeRequiredTest(TestCase): self.assertEqual(response.status_code, 302) assert self.user.needs_password_change is True - self.assertIn('/control/settings?next=/control/events/', response['Location']) + self.assertIn('/control/settings/password/change?next=/control/events/', response['Location']) - def test_redirect_to_2fa_to_settings(self): + def test_redirect_to_2fa_to_password_change(self): self.user.require_2fa = True self.user.needs_password_change = True self.user.save() @@ -1168,4 +1168,4 @@ class PasswordChangeRequiredTest(TestCase): response = self.client.get('/control/events/') self.assertEqual(response.status_code, 302) - self.assertIn('/control/settings?next=/control/events/', response['Location']) + self.assertIn('/control/settings/password/change?next=/control/events/', response['Location']) diff --git a/src/tests/control/test_checkins.py b/src/tests/control/test_checkins.py index bad7b5303..a3afce9e8 100644 --- a/src/tests/control/test_checkins.py +++ b/src/tests/control/test_checkins.py @@ -526,6 +526,19 @@ class CheckinListFormTest(SoupTest): cl.refresh_from_db() assert cl.exit_all_at == datetime(2020, 1, 3, 3, 0, tzinfo=self.event1.timezone) + @freeze_time("2020-10-25 17:00:00+02:00") + def test_update_exit_all_at_current_day_dst(self): + with scopes_disabled(): + cl = self.event1.checkin_lists.create(name='All', all_products=True) + doc = self.get_doc('/control/event/%s/%s/checkinlists/%s/change' % (self.orga1.slug, self.event1.slug, cl.id)) + form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + form_data['exit_all_at'] = '02:03:00' + doc = self.post_doc('/control/event/%s/%s/checkinlists/%s/change' % (self.orga1.slug, self.event1.slug, cl.id), + form_data) + assert doc.select(".alert-success") + cl.refresh_from_db() + assert cl.exit_all_at.astimezone(self.event1.timezone).isoformat() == '2020-10-26T02:03:00+01:00' + def test_delete(self): with scopes_disabled(): cl = self.event1.checkin_lists.create(name='All', all_products=True) diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index ef938206d..b3b4c0057 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -681,6 +681,10 @@ class ItemsTest(ItemFormTest): self.var2.save() prop = self.event1.item_meta_properties.create(name="Foo") self.item2.meta_values.create(property=prop, value="Bar") + self.item2.program_times.create(start=datetime.datetime(2017, 12, 27, 0, 0, 0, + tzinfo=datetime.timezone.utc), + end=datetime.datetime(2017, 12, 28, 0, 0, 0, + tzinfo=datetime.timezone.utc)) doc = self.get_doc('/control/event/%s/%s/items/add?copy_from=%d' % (self.orga1.slug, self.event1.slug, self.item2.pk)) data = extract_form_fields(doc.select("form")[0]) @@ -709,6 +713,8 @@ class ItemsTest(ItemFormTest): assert i_new.meta_data == i_old.meta_data == {"Foo": "Bar"} assert set(i_new.questions.all()) == set(i_old.questions.all()) assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()]) + assert i_old.program_times.first().start == i_new.program_times.first().start + assert i_old.program_times.first().end == i_new.program_times.first().end def test_add_to_existing_quota(self): with scopes_disabled(): diff --git a/src/tests/control/test_user.py b/src/tests/control/test_user.py index 8c80ac280..95d9023a5 100644 --- a/src/tests/control/test_user.py +++ b/src/tests/control/test_user.py @@ -19,22 +19,11 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # - -# This file is based on an earlier version of pretix which was released under the Apache License 2.0. The full text of -# the Apache License 2.0 can be obtained at . -# -# This file may have since been changed and any changes are released under the terms of AGPLv3 as described above. A -# full history of changes and contributors is available at . -# -# This file contains Apache-licensed contributions copyrighted by: Jason Estibeiro -# -# Unless required by applicable law or agreed to in writing, software distributed under the Apache License 2.0 is -# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under the License. - +import re import time import pytest +from django.core import mail as djmail from django.utils.timezone import now from django_otp.oath import TOTP from django_otp.plugins.otp_static.models import StaticDevice @@ -53,10 +42,10 @@ from pretix.testutils.mock import mocker_context class UserSettingsTest(SoupTest): def setUp(self): super().setUp() - self.user = User.objects.create_user('dummy@dummy.dummy', 'barfoofoo') - self.client.login(email='dummy@dummy.dummy', password='barfoofoo') + self.user = User.objects.create_user('dummy@dummy.dummy', 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') + self.client.login(email='dummy@dummy.dummy', password='old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') doc = self.get_doc('/control/settings') - self.form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + self.form_data = extract_form_fields(doc.select('form[data-testid="usersettingsform"]')[0]) def save(self, data): form_data = self.form_data.copy() @@ -71,39 +60,126 @@ class UserSettingsTest(SoupTest): self.user = User.objects.get(pk=self.user.pk) assert self.user.fullname == 'Peter Miller' - def test_change_email_require_password(self): + def test_set_locale_and_timezone(self): doc = self.save({ - 'email': 'foo@example.com', + 'locale': 'fr', + 'timezone': 'Europe/Paris', }) - assert doc.select(".alert-danger") + assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) - assert self.user.email == 'dummy@dummy.dummy' + assert self.user.locale == 'fr' + assert self.user.timezone == 'Europe/Paris' + + +class UserEmailChangeTest(SoupTest): + def setUp(self): + super().setUp() + self.user = User.objects.create_user('dummy@dummy.dummy', 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') + self.client.login(email='dummy@dummy.dummy', password='old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') + session = self.client.session + session['pretix_auth_login_time'] = int(time.time()) + session.save() + doc = self.get_doc('/control/settings/email/change') + self.form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + + def test_require_reauth(self): + session = self.client.session + session['pretix_auth_login_time'] = int(time.time()) - 3600 * 2 + session.save() + + response = self.client.get('/control/settings/email/change') + self.assertIn('/control/reauth', response['Location']) + self.assertEqual(response.status_code, 302) + + response = self.client.post('/control/reauth/?next=/control/settings/email/change', { + 'password': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9' + }) + self.assertIn('/control/settings/email/change', response['Location']) + self.assertEqual(response.status_code, 302) + + def submit_step_1(self, data): + form_data = self.form_data.copy() + form_data.update(data) + return self.post_doc('/control/settings/email/change', form_data) + + def submit_step_2(self, data): + form_data = self.form_data.copy() + form_data.update(data) + return self.post_doc('/control/settings/email/confirm?reason=email_change', form_data) def test_change_email_success(self): - doc = self.save({ - 'email': 'foo@example.com', - 'old_pw': 'barfoofoo' + djmail.outbox = [] + doc = self.submit_step_1({ + 'new_email': 'foo@example.com', + }) + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].to == ['foo@example.com'] + code = re.search("[0-9]{7}", djmail.outbox[0].body).group(0) + doc = self.submit_step_2({ + 'code': code, }) assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) assert self.user.email == 'foo@example.com' - def test_change_email_no_duplicates(self): - User.objects.create_user('foo@example.com', 'foo') - doc = self.save({ - 'email': 'foo@example.com', - 'old_pw': 'barfoofoo' + def test_change_email_wrong_code(self): + djmail.outbox = [] + doc = self.submit_step_1({ + 'new_email': 'foo@example.com', + }) + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].to == ['foo@example.com'] + code = re.search("[0-9]{7}", djmail.outbox[0].body).group(0) + wrong_code = '0000000' if code == '1234567' else '1234567' + doc = self.submit_step_2({ + 'code': wrong_code, }) assert doc.select(".alert-danger") self.user = User.objects.get(pk=self.user.pk) assert self.user.email == 'dummy@dummy.dummy' - def test_change_password_require_password(self): - doc = self.save({ - 'new_pw': 'foo', - 'new_pw_repeat': 'foo', + def test_change_email_no_duplicates(self): + User.objects.create_user('foo@example.com', 'foo') + doc = self.submit_step_1({ + 'new_email': 'foo@example.com', }) assert doc.select(".alert-danger") + self.user = User.objects.get(pk=self.user.pk) + assert self.user.email == 'dummy@dummy.dummy' + + +class UserPasswordChangeTest(SoupTest): + def setUp(self): + super().setUp() + self.user = User.objects.create_user('dummy@dummy.dummy', 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') + self.client.login(email='dummy@dummy.dummy', password='old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9') + doc = self.get_doc('/control/settings/password/change') + self.form_data = extract_form_fields(doc.select('.container-fluid form')[0]) + + def save(self, data): + form_data = self.form_data.copy() + form_data.update(data) + return self.post_doc('/control/settings/password/change', form_data) + + def test_change_password_require_password(self): + doc = self.save({ + 'new_pw': 'f00barbarbar', + 'new_pw_repeat': 'f00barbarbar', + }) + assert doc.select(".alert-danger") + assert "This field is required." in doc.select(".has-error")[0].text + pw = self.user.password + self.user = User.objects.get(pk=self.user.pk) + assert self.user.password == pw + + def test_change_password_old_password_wrong(self): + doc = self.save({ + 'new_pw': 'f00barbarbar', + 'new_pw_repeat': 'f00barbarbar', + 'old_pw': 'lolwrong', + }) + assert doc.select(".alert-danger") + assert "The current password you entered was not correct." in doc.select(".has-error")[0].text pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw @@ -114,7 +190,7 @@ class UserSettingsTest(SoupTest): self.save({ 'new_pw': 'f00barbarbar', 'new_pw_repeat': 'f00barbarbar', - 'old_pw': 'barfoofoo', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) pw = self.user.password self.user = User.objects.get(pk=self.user.pk) @@ -124,7 +200,7 @@ class UserSettingsTest(SoupTest): doc = self.save({ 'new_pw': 'f00barbarbar', 'new_pw_repeat': 'f00barbarbar', - 'old_pw': 'barfoofoo', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) assert doc.select(".alert-success") self.user = User.objects.get(pk=self.user.pk) @@ -134,9 +210,10 @@ class UserSettingsTest(SoupTest): doc = self.save({ 'new_pw': 'foo', 'new_pw_repeat': 'foo', - 'old_pw': 'barfoofoo', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) assert doc.select(".alert-danger") + assert "This password is too short." in doc.select(".has-error")[0].text pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw @@ -145,37 +222,40 @@ class UserSettingsTest(SoupTest): doc = self.save({ 'new_pw': 'dummy123', 'new_pw_repeat': 'dummy123', - 'old_pw': 'barfoofoo', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) assert doc.select(".alert-danger") + assert "The password is too similar to the Email." in doc.select(".has-error")[0].text pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw def test_change_password_require_repeat(self): doc = self.save({ - 'new_pw': 'foooooooooooooo', - 'new_pw_repeat': 'baaaaaaaaaaaar', - 'old_pw': 'barfoofoo', + 'new_pw': 'foooooooooooooo1234', + 'new_pw_repeat': 'baaaaaaaaaaaar1234', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) assert doc.select(".alert-danger") + assert "Please enter the same password twice" in doc.select(".has-error")[0].text pw = self.user.password self.user = User.objects.get(pk=self.user.pk) assert self.user.password == pw def test_change_password_require_new(self): doc = self.save({ - 'new_pw': 'barfoofoo', - 'new_pw_repeat': 'barfoofoo', - 'old_pw': 'barfoofoo', + 'new_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', + 'new_pw_repeat': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) - assert doc.select(".alert-danger") + assert doc.select(".has-error") + assert "Your password may not be the same as" in doc.select(".has-error")[0].text def test_change_password_history(self): doc = self.save({ 'new_pw': 'qvuSpukdKWUV7m7PoRrWwpCd2Taij9', 'new_pw_repeat': 'qvuSpukdKWUV7m7PoRrWwpCd2Taij9', - 'old_pw': 'barfoofoo', + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9', }) assert doc.select(".alert-success") @@ -192,18 +272,7 @@ class UserSettingsTest(SoupTest): 'old_pw': '9UQl4lSwHLMVUIMgw0L1X8XEFmyvdn', }) assert doc.select(".alert-danger") - - def test_needs_password_change(self): - self.user.needs_password_change = True - self.user.save() - doc = self.save({ - 'email': 'foo@example.com', - 'old_pw': 'barfoofoo' - }) - assert doc.select(".alert-success") - assert doc.select(".alert-warning") - self.user.refresh_from_db() - assert self.user.needs_password_change is True + assert "Your password may not be the same as one of your 4 previous passwords." in doc.select(".has-error")[0].text def test_needs_password_change_changed(self): self.user.needs_password_change = True @@ -211,7 +280,7 @@ class UserSettingsTest(SoupTest): self.save({ 'new_pw': 'f00barbarbar', 'new_pw_repeat': 'f00barbarbar', - 'old_pw': 'barfoofoo' + 'old_pw': 'old_qvuSpukdKWUV7m7PoRrWwpCd2Taij9' }) self.user.refresh_from_db() assert self.user.needs_password_change is False diff --git a/src/tests/helpers/test_format.py b/src/tests/helpers/test_format.py index 5ab5c2569..5ed3ac9b1 100644 --- a/src/tests/helpers/test_format.py +++ b/src/tests/helpers/test_format.py @@ -40,6 +40,5 @@ def test_format_alternatives(): ) } - assert format_map("Foo {bar}", ctx, mode=SafeFormatter.MODE_IGNORE_RICH) == "Foo {bar}" assert format_map("Foo {bar}", ctx, mode=SafeFormatter.MODE_RICH_TO_PLAIN) == "Foo plain text" assert format_map("Foo {bar}", ctx, mode=SafeFormatter.MODE_RICH_TO_HTML) == "Foo HTML version" diff --git a/src/tests/plugins/banktransfer/test_refund_export.py b/src/tests/plugins/banktransfer/test_refund_export.py index b054afff7..360310cdc 100644 --- a/src/tests/plugins/banktransfer/test_refund_export.py +++ b/src/tests/plugins/banktransfer/test_refund_export.py @@ -185,6 +185,7 @@ def test_unite_transaction_rows(): 'iban': 'DE12345678901234567890', 'bic': 'HARKE9000', 'id': "ROLLA-R-1", + 'locale': "en", 'comment': None, 'amount': Decimal("42.23"), }, @@ -193,6 +194,7 @@ def test_unite_transaction_rows(): 'iban': 'DE111111111111111111111', 'bic': 'ikswez2020', 'id': "PARTY-R-1", + 'locale': "en", 'comment': None, 'amount': Decimal("6.50"), } @@ -206,6 +208,7 @@ def test_unite_transaction_rows(): 'iban': 'DE12345678901234567890', 'bic': 'HARKE9000', 'id': "ROLLA-R-1", + 'locale': "en", 'comment': None, 'amount': Decimal("7.77"), }, @@ -214,6 +217,7 @@ def test_unite_transaction_rows(): 'iban': 'DE111111111111111111111', 'bic': 'ikswez2020', 'id': "PARTY-R-2", + 'locale': "en", 'comment': None, 'amount': Decimal("13.50"), } @@ -225,6 +229,7 @@ def test_unite_transaction_rows(): 'iban': 'DE12345678901234567890', 'bic': 'HARKE9000', 'id': "ROLLA-R-1", + 'locale': "en", 'comment': None, 'amount': Decimal("50.00"), }, @@ -233,6 +238,7 @@ def test_unite_transaction_rows(): 'iban': 'DE111111111111111111111', 'bic': 'ikswez2020', 'id': 'PARTY-R-1, PARTY-R-2', + 'locale': "en", 'comment': None, 'amount': Decimal('20.00'), }], key=_row_key_func) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 2241e4300..17d43e9d9 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -77,7 +77,7 @@ class BaseCheckoutTestCase: plugins='pretix.plugins.stripe,pretix.plugins.banktransfer,tests.testdummy', live=True ) - self.tr19 = self.event.tax_rules.create(rate=19) + self.tr19 = self.event.tax_rules.create(rate=19, default=True) self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0) self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=5) self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', @@ -501,6 +501,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase): assert cr1.price == Decimal('23.00') def test_custom_tax_rules_blocked_on_fee(self): + self.tr19.default = False + self.tr19.save() self.tr7 = self.event.tax_rules.create(rate=7, default=True) self.tr7.custom_rules = json.dumps([ {'country': 'AT', 'address_type': 'business_vat_id', 'action': 'reverse'}, @@ -2352,6 +2354,252 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase): self.assertRedirects(response, '/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), target_status_code=200) + def test_rounding_sum_by_net(self): + self.event.settings.tax_rounding = "sum_by_net" + self.event.settings.set('payment_banktransfer__enabled', True) + self.ticket.default_price = Decimal("100.00") + self.ticket.save() + with scopes_disabled(): + cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web")) + cm.add_new_items([{ + 'item': self.ticket.pk, + 'variation': None, + 'count': 2 + }]) + cm.commit() + + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert b"199.99" in response.content + assert b"200.00" not in response.content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'banktransfer', + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + assert response.context_data['cart']['total'] == Decimal('199.99') + assert response.context_data['cart']['net_total'] == Decimal('84.03') * 2 + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + p1 = o.payments.get() + assert p1.amount == Decimal('199.99') + assert o.total == Decimal("199.99") + op1, op2 = o.positions.all() + assert op1.price == Decimal("99.99") + assert op1.price_includes_rounding_correction == Decimal("-0.01") + assert op1.tax_value == Decimal("15.96") + assert op1.tax_value_includes_rounding_correction == Decimal("-0.01") + assert op2.price == Decimal("100.00") + assert op2.price_includes_rounding_correction == Decimal("0.00") + assert op2.tax_value == Decimal("15.97") + assert op2.tax_value_includes_rounding_correction == Decimal("0.00") + + def test_rounding_sum_by_net_keep_gross(self): + self.event.settings.tax_rounding = "sum_by_net_keep_gross" + self.event.settings.set('payment_banktransfer__enabled', True) + self.ticket.default_price = Decimal("100.00") + self.ticket.save() + with scopes_disabled(): + cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web")) + cm.add_new_items([{ + 'item': self.ticket.pk, + 'variation': None, + 'count': 2 + }]) + cm.commit() + + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert b"199.99" not in response.content + assert b"200.00" in response.content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'banktransfer', + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + assert response.context_data['cart']['total'] == Decimal('200.00') + assert response.context_data['cart']['net_total'] == Decimal('84.03') + Decimal('84.04') + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + p1 = o.payments.get() + assert p1.amount == Decimal('200.00') + assert o.total == Decimal("200.00") + op1, op2 = o.positions.all() + assert op1.price == Decimal("100.00") + assert op1.price_includes_rounding_correction == Decimal("0.00") + assert op1.tax_value == Decimal("15.96") + assert op1.tax_value_includes_rounding_correction == Decimal("-0.01") + assert op2.price == Decimal("100.00") + assert op2.price_includes_rounding_correction == Decimal("0.00") + assert op2.tax_value == Decimal("15.97") + assert op2.tax_value_includes_rounding_correction == Decimal("0.00") + + def test_rounding_line(self): + self.event.settings.tax_rounding = "line" + self.event.settings.set('payment_banktransfer__enabled', True) + self.ticket.default_price = Decimal("100.00") + self.ticket.save() + with scopes_disabled(): + cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web")) + cm.add_new_items([{ + 'item': self.ticket.pk, + 'variation': None, + 'count': 2 + }]) + cm.commit() + + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert b"199.99" not in response.content + assert b"200.00" in response.content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'banktransfer', + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + assert response.context_data['cart']['total'] == Decimal('200.00') + assert response.context_data['cart']['net_total'] == Decimal('84.03') * 2 + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + p1 = o.payments.get() + assert p1.amount == Decimal('200.00') + assert o.total == Decimal("200.00") + op1, op2 = o.positions.all() + assert op1.price == Decimal("100.00") + assert op1.price_includes_rounding_correction == Decimal("0.00") + assert op1.tax_value == Decimal("15.97") + assert op1.tax_value_includes_rounding_correction == Decimal("0.00") + assert op2.price == Decimal("100.00") + assert op2.price_includes_rounding_correction == Decimal("0.00") + assert op2.tax_value == Decimal("15.97") + assert op2.tax_value_includes_rounding_correction == Decimal("0.00") + + def test_rounding_sum_by_net_with_payment_fee(self): + self.event.settings.tax_rounding = "sum_by_net" + self.event.settings.tax_rule_payment = "default" + self.event.settings.set('payment_banktransfer__enabled', True) + self.event.settings.set('payment_banktransfer__fee_abs', Decimal("100.00")) + self.ticket.default_price = Decimal("100.00") + self.ticket.save() + with scopes_disabled(): + cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web")) + cm.add_new_items([{ + 'item': self.ticket.pk, + 'variation': None, + 'count': 1 + }]) + cm.commit() + + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert b"100.00" in response.content + assert b"99.99" not in response.content + assert b"199.99" not in response.content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'banktransfer', + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + assert response.context_data['cart']['total'] == Decimal('199.99') + assert response.context_data['cart']['net_total'] == Decimal('84.03') * 2 + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + p1 = o.payments.get() + assert p1.amount == Decimal('199.99') + assert o.total == Decimal("199.99") + op1 = o.positions.get() + of1 = o.fees.get() + assert op1.price == Decimal("99.99") + assert op1.price_includes_rounding_correction == Decimal("-0.01") + assert op1.tax_value == Decimal("15.96") + assert op1.tax_value_includes_rounding_correction == Decimal("-0.01") + assert of1.price == Decimal("100.00") + assert of1.price_includes_rounding_correction == Decimal("0.00") + assert of1.tax_value == Decimal("15.97") + assert of1.tax_value_includes_rounding_correction == Decimal("0.00") + + def test_rounding_sum_by_net_with_payment_fee_that_makes_card_insufficient(self): + # Our built-in gift card payment does not actually support setting a payment fee, but we still want to + # test the core behavior in case a gift-card plugin does + gc = self.orga.issued_gift_cards.create(currency="EUR") + gc.transactions.create(value=199.96, acceptor=self.orga) + self.event.settings.set('payment_banktransfer__enabled', True) + self.event.settings.set('payment_giftcard__fee_abs', "99.98") + self.event.settings.set('payment_giftcard__fee_reverse_calc', False) + self.event.settings.tax_rounding = "sum_by_net" + self.event.settings.tax_rule_payment = "default" + self.ticket.default_price = Decimal("99.98") + self.ticket.save() + with scopes_disabled(): + cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web")) + cm.add_new_items([{ + 'item': self.ticket.pk, + 'variation': None, + 'count': 1 + }]) + cm.commit() + + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert b"99.98" in response.content + assert b"99.99" not in response.content + assert b"199.97" not in response.content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'giftcard', + 'payment_giftcard-code': gc.secret + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'banktransfer', + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + assert response.context_data['cart']['total'] == Decimal('199.97') + assert response.context_data['cart']['net_total'] == Decimal('84.02') * 2 + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + p1, p2 = o.payments.all() + assert p1.amount == Decimal('199.96') + assert p2.amount == Decimal('0.01') + assert o.total == Decimal("199.97") + op1 = o.positions.get() + of1 = o.fees.get() + assert op1.price == Decimal("99.99") + assert op1.price_includes_rounding_correction == Decimal("0.01") + assert op1.tax_value == Decimal("15.97") + assert op1.tax_value_includes_rounding_correction == Decimal("0.01") + assert of1.price == Decimal("99.98") + assert of1.price_includes_rounding_correction == Decimal("0.00") + assert of1.tax_value == Decimal("15.96") + assert of1.tax_value_includes_rounding_correction == Decimal("0.00") + def test_subevent(self): self.event.has_subevents = True self.event.save() @@ -3377,6 +3625,47 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase): self.assertEqual(Order.objects.count(), 1) self.assertEqual(OrderPosition.objects.count(), 1) + def test_max_items_per_order_failed(self): + self.event.settings.max_items_per_order = 2 + self.ticket.save() + with scopes_disabled(): + ItemAddOn.objects.create(base_item=self.ticket, addon_category=self.workshopcat) + cp = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10), + ) + CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.workshop1, addon_to=cp, + price=12, expires=now() + timedelta(minutes=10), + ) + CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10), + ) + to_delete = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10), + ) + self._set_payment() + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + with scopes_disabled(): + self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key).count(), 4) + self.assertEqual(len(doc.select(".alert-danger")), 1) + self.assertFalse(Order.objects.exists()) + + with scopes_disabled(): + to_delete.delete() + self.client.get('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug)) # required for session['shown_total'] + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.content.decode(), "lxml") + with scopes_disabled(): + self.assertEqual(len(doc.select(".thank-you")), 1) + self.assertEqual(Order.objects.count(), 1) + self.assertEqual(OrderPosition.objects.count(), 3) + def test_subevent_confirm_expired_partial(self): self.event.has_subevents = True self.event.save() diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index be4d7d033..d2ad44e71 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -1334,6 +1334,56 @@ class OrdersTest(BaseOrdersTest): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CREATED + def test_change_paymentmethod_with_rounding_change(self): + tr19 = self.event.tax_rules.create( + name='VAT', + rate=Decimal('19.00'), + default=True + ) + self.ticket.tax_rule = tr19 + self.ticket.save() + self.ticket_pos.price = Decimal("100.00") + self.ticket_pos.tax_rule = tr19 + self.ticket_pos._calculate_tax() + self.ticket_pos.save() + self.order.total = Decimal("100.00") + self.order.tax_rounding_mode = "sum_by_net" + self.order.save() + + self.event.settings.tax_rounding = "sum_by_net" + self.event.settings.set('payment_banktransfer__enabled', True) + self.event.settings.set('payment_testdummy__enabled', True) + self.event.settings.set('payment_testdummy__fee_reverse_calc', False) + self.event.settings.set('payment_testdummy__fee_abs', '100.00') + + response = self.client.get( + '/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + ) + assert 'Test dummy' in response.content.decode() + assert '+ €100.00' in response.content.decode() + response = self.client.post( + '/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + { + 'payment': 'testdummy' + }, follow=True + ) + assert 'Total: €199.99' in response.content.decode() + self.order.refresh_from_db() + with scopes_disabled(): + assert self.order.payments.last().provider == 'testdummy' + fee = self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).last() + assert fee.value == Decimal('100.00') + assert fee.tax_value == Decimal('15.97') + self.ticket_pos.refresh_from_db() + assert self.ticket_pos.price == Decimal("99.99") + assert self.ticket_pos.price_includes_rounding_correction == Decimal("-0.01") + self.order.refresh_from_db() + assert self.order.total == Decimal('199.99') + p = self.order.payments.last() + assert p.provider == 'testdummy' + assert p.state == OrderPayment.PAYMENT_STATE_CREATED + assert p.amount == Decimal('199.99') + def test_change_paymentmethod_to_same(self): with scopes_disabled(): p_old = self.order.payments.create( diff --git a/src/tests/templates/mailtest.txt b/src/tests/templates/mailtest.txt index 71139e00c..1bc1487d3 100644 --- a/src/tests/templates/mailtest.txt +++ b/src/tests/templates/mailtest.txt @@ -1,4 +1,13 @@ {% load i18n %} This is a test file for sending mails. +Event name: {event} {% get_current_language as LANGUAGE_CODE %} The language code used for rendering this email is {{ LANGUAGE_CODE }}. + +Payment info: +{payment_info} + +**Meta**: {meta_Test} + +Event website: [{event}](https://example.org/{event_slug}) +Other website: [{event}]({meta_Website}) \ No newline at end of file diff --git a/src/tests/testdummy/payment.py b/src/tests/testdummy/payment.py index 827ce3de9..d348c269e 100644 --- a/src/tests/testdummy/payment.py +++ b/src/tests/testdummy/payment.py @@ -35,7 +35,7 @@ class DummyPaymentProvider(BasePaymentProvider): abort_pending_allowed = False def payment_is_valid_session(self, request: HttpRequest) -> bool: - pass + return True def checkout_confirm_render(self, request) -> str: pass