diff --git a/.licenseheader b/.licenseheader index 39009128b..5cbdfddde 100644 --- a/.licenseheader +++ b/.licenseheader @@ -1,7 +1,7 @@ This file is part of pretix (Community Edition). -Copyright (C) 2014-2020 Raphael Michel and contributors -Copyright (C) 2020-2021 rami.io GmbH and contributors +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. diff --git a/doc/api/resources/invoices.rst b/doc/api/resources/invoices.rst index 9188b73c2..de9245941 100644 --- a/doc/api/resources/invoices.rst +++ b/doc/api/resources/invoices.rst @@ -80,17 +80,12 @@ lines list of objects The actual invo for all invoice lines created before this field was introduced as well as for all lines not created by a fee (e.g. a product). -├ event_date_from datetime Start date of the (sub)event this line was created for as it - was set during invoice creation. Can be ``null`` for all invoice - lines created before this was introduced as well as for lines in - an event series not created by a product (e.g. shipping or - cancellation fees). -├ event_date_to datetime End date of the (sub)event this line was created for as it - was set during invoice creation. Can be ``null`` for all invoice - lines created before this was introduced as well as for lines in - an event series not created by a product (e.g. shipping or - cancellation fees) as well as whenever the respective (sub)event - has no end date set. +├ period_start datetime Start date of the service or delivery period of the invoice line. + Can be ``null`` if not known. +├ period_end datetime End date of the service or delivery period of the invoice line. + Can be ``null`` if not known. +├ event_date_from datetime Deprecated alias of ``period_start``. +├ event_date_to datetime Deprecated alias of ``period_end``. ├ event_location string Location of the (sub)event this line was created for as it was set during invoice creation. Can be ``null`` for all invoice lines created before this was introduced as well as for lines in @@ -274,6 +269,8 @@ List of all invoices "fee_internal_type": null, "event_date_from": "2017-12-27T10:00:00Z", "event_date_to": null, + "period_start": "2017-12-27T10:00:00Z", + "period_end": "2017-12-27T10:00:00Z", "event_location": "Heidelberg", "attendee_name": null, "gross_value": "23.00", @@ -420,6 +417,8 @@ Fetching individual invoices "fee_internal_type": null, "event_date_from": "2017-12-27T10:00:00Z", "event_date_to": null, + "period_start": "2017-12-27T10:00:00Z", + "period_end": "2017-12-27T10:00:00Z", "event_location": "Heidelberg", "attendee_name": null, "gross_value": "23.00", diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index dc9efef72..2894d16c6 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -1030,8 +1030,8 @@ Creating orders * ``internal_reference`` * ``vat_id`` * ``vat_id_validated`` (optional) – If you need support for reverse charge (rarely the case), you need to check - yourself if the passed VAT ID is a valid EU VAT ID. In that case, set this to ``true``. Only valid VAT IDs will - trigger reverse charge taxation. Don't forget to set ``is_business`` as well! + yourself if the passed VAT ID is a valid EU VAT ID. In that case, set this to ``true``. Only valid VAT IDs will + trigger reverse charge taxation. Don't forget to set ``is_business`` as well! * ``transmission_type`` (optional, defaults to ``email``) * ``transmission_info`` (optional, see also :ref:`rest-transmission-types`) @@ -1058,6 +1058,7 @@ Creating orders * ``valid_until`` (optional, if both ``valid_from`` and ``valid_until`` are **missing** (not ``null``) the availability will be computed from the given product) * ``requested_valid_from`` (optional, can be set **instead** of ``valid_from`` and ``valid_until`` to signal a user choice for the start time that may or may not be respected) * ``use_reusable_medium`` (optional, causes the new ticket to take over the given reusable medium, identified by its ID) + * ``discount`` (optional, only possible if ``price`` is set; attention: if this is set to not-``null`` on any position, automatic calculation of discounts will not run) * ``answers`` * ``question`` @@ -2508,6 +2509,7 @@ Order payment endpoints { "amount": "23.00", + "comment": "Overpayment", "mark_canceled": false } diff --git a/doc/development/api/general.rst b/doc/development/api/general.rst index 636de683c..ce0bcf0dc 100644 --- a/doc/development/api/general.rst +++ b/doc/development/api/general.rst @@ -23,7 +23,7 @@ There are multiple signals that will be sent out in the ordering cycle: .. automodule:: pretix.base.signals :no-index: - :members: validate_cart, validate_cart_addons, validate_order, order_valid_if_pending, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_expiry_changed, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, invoice_line_text + :members: validate_cart, validate_cart_addons, validate_order, order_valid_if_pending, order_fee_calculation, order_paid, order_placed, order_canceled, order_reactivated, order_expired, order_expiry_changed, order_modified, order_changed, order_approved, order_denied, order_fee_type_name, allow_ticket_download, order_split, order_gracefully_delete, build_invoice_data, invoice_line_text Check-ins """"""""" diff --git a/pyproject.toml b/pyproject.toml index e6e5bf13d..c1a12ddf8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ dependencies = [ "arabic-reshaper==3.0.0", # Support for Arabic in reportlab "babel", - "BeautifulSoup4==4.13.*", + "BeautifulSoup4==4.14.*", "bleach==6.2.*", "celery==5.5.*", "chardet==5.2.*", @@ -76,12 +76,12 @@ dependencies = [ "phonenumberslite==9.0.*", "Pillow==11.3.*", "pretix-plugin-build", - "protobuf==6.32.*", + "protobuf==6.33.*", "psycopg2-binary", "pycountry", "pycparser==2.23", "pycryptodome==3.23.*", - "pypdf==6.0.*", + "pypdf==6.1.*", "python-bidi==0.6.*", # Support for Arabic in reportlab "python-dateutil==2.9.*", "pytz", @@ -91,8 +91,8 @@ dependencies = [ "redis==6.4.*", "reportlab==4.4.*", "requests==2.32.*", - "sentry-sdk==2.38.*", - "sepaxml==2.6.*", + "sentry-sdk==2.42.*", + "sepaxml==2.7.*", "stripe==7.9.*", "text-unidecode==1.*", "tlds>=2020041600", @@ -107,13 +107,13 @@ dependencies = [ [project.optional-dependencies] memcached = ["pylibmc"] dev = [ - "aiohttp==3.12.*", + "aiohttp==3.13.*", "coverage", "coveralls", - "fakeredis==2.31.*", + "fakeredis==2.32.*", "flake8==7.3.*", "freezegun", - "isort==6.0.*", + "isort==6.1.*", "pep8-naming==0.15.*", "potypo", "pytest-asyncio>=0.24", diff --git a/src/manage.py b/src/manage.py index 58e32fac2..8b393c449 100755 --- a/src/manage.py +++ b/src/manage.py @@ -2,8 +2,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 1c6c57b98..ac9cd86de 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -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.8.0" +__version__ = "2025.9.0" diff --git a/src/pretix/__main__.py b/src/pretix/__main__.py index 53231751d..f064608c0 100644 --- a/src/pretix/__main__.py +++ b/src/pretix/__main__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/_base_settings.py b/src/pretix/_base_settings.py index 97d79b036..2931c7e41 100644 --- a/src/pretix/_base_settings.py +++ b/src/pretix/_base_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/_build.py b/src/pretix/_build.py index 884384a37..de9e2900c 100644 --- a/src/pretix/_build.py +++ b/src/pretix/_build.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/_build_settings.py b/src/pretix/_build_settings.py index c03f56a1a..5c04e511d 100644 --- a/src/pretix/_build_settings.py +++ b/src/pretix/_build_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/__init__.py b/src/pretix/api/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/api/__init__.py +++ b/src/pretix/api/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/apps.py b/src/pretix/api/apps.py index 2af7c6175..9f06f9128 100644 --- a/src/pretix/api/apps.py +++ b/src/pretix/api/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/__init__.py b/src/pretix/api/auth/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/api/auth/__init__.py +++ b/src/pretix/api/auth/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/device.py b/src/pretix/api/auth/device.py index dd9b4c287..00fc03ba0 100644 --- a/src/pretix/api/auth/device.py +++ b/src/pretix/api/auth/device.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/devicesecurity.py b/src/pretix/api/auth/devicesecurity.py index d6be03e72..18a99336b 100644 --- a/src/pretix/api/auth/devicesecurity.py +++ b/src/pretix/api/auth/devicesecurity.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/permission.py b/src/pretix/api/auth/permission.py index e023a1495..802781d00 100644 --- a/src/pretix/api/auth/permission.py +++ b/src/pretix/api/auth/permission.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/session.py b/src/pretix/api/auth/session.py index 431741963..7b2eff806 100644 --- a/src/pretix/api/auth/session.py +++ b/src/pretix/api/auth/session.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/auth/token.py b/src/pretix/api/auth/token.py index cb00462b5..ed0d1829e 100644 --- a/src/pretix/api/auth/token.py +++ b/src/pretix/api/auth/token.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/exception.py b/src/pretix/api/exception.py index ec6b317df..0358fba9a 100644 --- a/src/pretix/api/exception.py +++ b/src/pretix/api/exception.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/filters.py b/src/pretix/api/filters.py index e9217139f..c3dc68ea1 100644 --- a/src/pretix/api/filters.py +++ b/src/pretix/api/filters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/middleware.py b/src/pretix/api/middleware.py index ff4d37c8f..53bae03b4 100644 --- a/src/pretix/api/middleware.py +++ b/src/pretix/api/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/models.py b/src/pretix/api/models.py index 39787fc30..a6c202e57 100644 --- a/src/pretix/api/models.py +++ b/src/pretix/api/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/oauth.py b/src/pretix/api/oauth.py index fa93e1647..f1482c4d7 100644 --- a/src/pretix/api/oauth.py +++ b/src/pretix/api/oauth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/pagination.py b/src/pretix/api/pagination.py index 4f8a55579..8cc331775 100644 --- a/src/pretix/api/pagination.py +++ b/src/pretix/api/pagination.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/__init__.py b/src/pretix/api/serializers/__init__.py index 76933c4e6..ea435914a 100644 --- a/src/pretix/api/serializers/__init__.py +++ b/src/pretix/api/serializers/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/cart.py b/src/pretix/api/serializers/cart.py index 38d064684..74dc5242b 100644 --- a/src/pretix/api/serializers/cart.py +++ b/src/pretix/api/serializers/cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/checkin.py b/src/pretix/api/serializers/checkin.py index c28dfada9..63759c016 100644 --- a/src/pretix/api/serializers/checkin.py +++ b/src/pretix/api/serializers/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/discount.py b/src/pretix/api/serializers/discount.py index 9cf4ae748..e6f5d5f0a 100644 --- a/src/pretix/api/serializers/discount.py +++ b/src/pretix/api/serializers/discount.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index e271ecc9c..680d1bd5d 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -805,6 +805,7 @@ class EventSettingsSerializer(SettingsSerializer): 'invoice_reissue_after_modify', 'invoice_include_free', 'invoice_generate', + 'invoice_period', 'invoice_numbers_consecutive', 'invoice_numbers_prefix', 'invoice_numbers_prefix_cancellations', diff --git a/src/pretix/api/serializers/exporters.py b/src/pretix/api/serializers/exporters.py index 785e607a0..b5f99ad46 100644 --- a/src/pretix/api/serializers/exporters.py +++ b/src/pretix/api/serializers/exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/fields.py b/src/pretix/api/serializers/fields.py index db8858a22..d3cc5f1b8 100644 --- a/src/pretix/api/serializers/fields.py +++ b/src/pretix/api/serializers/fields.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/forms.py b/src/pretix/api/serializers/forms.py index a7817471c..d577851cc 100644 --- a/src/pretix/api/serializers/forms.py +++ b/src/pretix/api/serializers/forms.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/i18n.py b/src/pretix/api/serializers/i18n.py index 3fc91e041..56700d279 100644 --- a/src/pretix/api/serializers/i18n.py +++ b/src/pretix/api/serializers/i18n.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/item.py b/src/pretix/api/serializers/item.py index 1c40eb13c..3b1dd9d9b 100644 --- a/src/pretix/api/serializers/item.py +++ b/src/pretix/api/serializers/item.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -550,7 +550,7 @@ class QuestionSerializer(I18nAwareModelSerializer): if full_data.get('show_during_checkin') and full_data.get('type') in Question.SHOW_DURING_CHECKIN_UNSUPPORTED: raise ValidationError(_('This type of question cannot be shown during check-in.')) - Question.clean_items(event, full_data.get('items')) + Question.clean_items(event, full_data.get('items') or []) return data def validate_options(self, value): @@ -566,7 +566,7 @@ class QuestionSerializer(I18nAwareModelSerializer): @transaction.atomic def create(self, validated_data): options_data = validated_data.pop('options') if 'options' in validated_data else [] - items = validated_data.pop('items') + items = validated_data.pop('items', []) question = Question.objects.create(**validated_data) question.items.set(items) diff --git a/src/pretix/api/serializers/media.py b/src/pretix/api/serializers/media.py index e4b3d09c1..8285fade4 100644 --- a/src/pretix/api/serializers/media.py +++ b/src/pretix/api/serializers/media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 68c7f7e9f..b58754ed9 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1005,7 +1005,7 @@ class OrderPositionCreateSerializer(I18nAwareModelSerializer): fields = ('positionid', 'item', 'variation', 'price', 'attendee_name', 'attendee_name_parts', 'attendee_email', 'company', 'street', 'zipcode', 'city', 'country', 'state', 'is_bundled', 'secret', 'addon_to', 'subevent', 'answers', 'seat', 'voucher', 'valid_from', 'valid_until', - 'requested_valid_from', 'use_reusable_medium') + 'requested_valid_from', 'use_reusable_medium', 'discount') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -1101,6 +1101,10 @@ class OrderPositionCreateSerializer(I18nAwareModelSerializer): {'state': ['"{}" is not a known subdivision of the country "{}".'.format(data.get('state'), cc)]} ) + if data.get('price') is None and data.get('discount'): + raise ValidationError( + {'discount': ['You can only specify a discount if you do the price computation, but price is not set.']} + ) return data @@ -1160,6 +1164,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['positions'].child.fields['voucher'].queryset = self.context['event'].vouchers.all() + self.fields['positions'].child.fields['discount'].queryset = self.context['event'].discounts.all() self.fields['customer'].queryset = self.context['event'].organizer.customers.all() self.fields['expires'].required = False self.fields["sales_channel"].queryset = self.context["event"].organizer.sales_channels.all() @@ -1567,19 +1572,22 @@ class OrderCreateSerializer(I18nAwareModelSerializer): pos.voucher_budget_use = max(listed_price - price_after_voucher, Decimal('0.00')) order_positions = [pos_data['__instance'] for pos_data in positions_data] - discount_results = apply_discounts( - self.context['event'], - order.sales_channel, - [ - (cp.item_id, cp.subevent_id, cp.subevent.date_from if cp.subevent_id else None, cp.price, - bool(cp.addon_to), cp.is_bundled, pos._voucher_discount) - for cp in order_positions - ] - ) - for cp, (new_price, discount) in zip(order_positions, discount_results): - if new_price != pos.price and pos._auto_generated_price: - pos.price = new_price - pos.discount = discount + if not any([p.get("discount") for p in positions_data]): + # If any discount is set by the client (i.e. pretixPOS), we do not recalculate but believe the client + # to avoid differences in end results. + discount_results = apply_discounts( + self.context['event'], + order.sales_channel, + [ + (cp.item_id, cp.subevent_id, cp.subevent.date_from if cp.subevent_id else None, cp.price, + bool(cp.addon_to), cp.is_bundled, pos._voucher_discount) + for cp in order_positions + ] + ) + for cp, (new_price, discount) in zip(order_positions, discount_results): + if new_price != pos.price and pos._auto_generated_price: + pos.price = new_price + pos.discount = discount # Save instances for pos_data in positions_data: @@ -1757,12 +1765,14 @@ class LinePositionField(serializers.IntegerField): class InlineInvoiceLineSerializer(I18nAwareModelSerializer): position = LinePositionField(read_only=True) + event_date_from = serializers.DateTimeField(read_only=True, source="period_start") + event_date_to = serializers.DateTimeField(read_only=True, source="period_end") class Meta: model = InvoiceLine fields = ('position', 'description', 'item', 'variation', 'subevent', 'attendee_name', 'event_date_from', - 'event_date_to', 'gross_value', 'tax_value', 'tax_rate', 'tax_code', 'tax_name', 'fee_type', - 'fee_internal_type', 'event_location') + 'event_date_to', 'period_start', 'period_end', 'gross_value', 'tax_value', 'tax_rate', 'tax_code', + 'tax_name', 'fee_type', 'fee_internal_type', 'event_location') class InvoiceSerializer(I18nAwareModelSerializer): diff --git a/src/pretix/api/serializers/orderchange.py b/src/pretix/api/serializers/orderchange.py index e8fb7820d..10e84daf3 100644 --- a/src/pretix/api/serializers/orderchange.py +++ b/src/pretix/api/serializers/orderchange.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index 58deb71dc..aee83af95 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/settings.py b/src/pretix/api/serializers/settings.py index cb9a31080..435b964db 100644 --- a/src/pretix/api/serializers/settings.py +++ b/src/pretix/api/serializers/settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/shredders.py b/src/pretix/api/serializers/shredders.py index 6a574af15..385029e0a 100644 --- a/src/pretix/api/serializers/shredders.py +++ b/src/pretix/api/serializers/shredders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/voucher.py b/src/pretix/api/serializers/voucher.py index 425df1eb8..038c32e8a 100644 --- a/src/pretix/api/serializers/voucher.py +++ b/src/pretix/api/serializers/voucher.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/waitinglist.py b/src/pretix/api/serializers/waitinglist.py index 6dbf6891b..9cc47b012 100644 --- a/src/pretix/api/serializers/waitinglist.py +++ b/src/pretix/api/serializers/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/serializers/webhooks.py b/src/pretix/api/serializers/webhooks.py index 756f15611..7849d91ae 100644 --- a/src/pretix/api/serializers/webhooks.py +++ b/src/pretix/api/serializers/webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/signals.py b/src/pretix/api/signals.py index 1f69fad60..763b7ffc7 100644 --- a/src/pretix/api/signals.py +++ b/src/pretix/api/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/urls.py b/src/pretix/api/urls.py index b1cb10edd..15c654567 100644 --- a/src/pretix/api/urls.py +++ b/src/pretix/api/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/__init__.py b/src/pretix/api/views/__init__.py index 04728f638..7bcaf8f26 100644 --- a/src/pretix/api/views/__init__.py +++ b/src/pretix/api/views/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/cart.py b/src/pretix/api/views/cart.py index 8339822da..9a02a86db 100644 --- a/src/pretix/api/views/cart.py +++ b/src/pretix/api/views/cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index ec31e3b50..02304446d 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/device.py b/src/pretix/api/views/device.py index 6db8e5a56..7482d1be7 100644 --- a/src/pretix/api/views/device.py +++ b/src/pretix/api/views/device.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/discount.py b/src/pretix/api/views/discount.py index d3545d4be..4504d0381 100644 --- a/src/pretix/api/views/discount.py +++ b/src/pretix/api/views/discount.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/event.py b/src/pretix/api/views/event.py index 19b2fb7d2..b61771bdb 100644 --- a/src/pretix/api/views/event.py +++ b/src/pretix/api/views/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/exporters.py b/src/pretix/api/views/exporters.py index af21077c2..63344b21e 100644 --- a/src/pretix/api/views/exporters.py +++ b/src/pretix/api/views/exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/idempotency.py b/src/pretix/api/views/idempotency.py index 4cbe83dd5..54ac143a4 100644 --- a/src/pretix/api/views/idempotency.py +++ b/src/pretix/api/views/idempotency.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/item.py b/src/pretix/api/views/item.py index 83e0dc19b..19661c60e 100644 --- a/src/pretix/api/views/item.py +++ b/src/pretix/api/views/item.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/media.py b/src/pretix/api/views/media.py index 4954a9fe0..1569ee289 100644 --- a/src/pretix/api/views/media.py +++ b/src/pretix/api/views/media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/oauth.py b/src/pretix/api/views/oauth.py index 88c45fb53..acd8b94c0 100644 --- a/src/pretix/api/views/oauth.py +++ b/src/pretix/api/views/oauth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index faded5bec..f818192ae 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -743,7 +743,7 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet): user=request.user if request.user.is_authenticated else None, auth=request.auth, ) - order_placed.send(self.request.event, order=order) + order_placed.send(self.request.event, order=order, bulk=False) if order.status == Order.STATUS_PAID: order_paid.send(self.request.event, order=order) order.log_action( @@ -764,7 +764,13 @@ class EventOrderViewSet(OrderViewSetMixin, viewsets.ModelViewSet): ) and not order.invoices.last() invoice = None if gen_invoice: - invoice = generate_invoice(order, trigger_pdf=True) + try: + invoice = generate_invoice(order, trigger_pdf=True) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) # Refresh serializer only after running signals prefetch_related_objects([order], self._positions_prefetch(request)) @@ -1663,6 +1669,9 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): else: mark_refunded = request.data.get('mark_canceled', False) + if not isinstance(request.data.get("comment", ""), str): + return Response({'comment': 'Invalid type.'}, status=status.HTTP_400_BAD_REQUEST) + if payment.state != OrderPayment.PAYMENT_STATE_CONFIRMED: return Response({'detail': 'Invalid state of payment.'}, status=status.HTTP_400_BAD_REQUEST) @@ -1689,6 +1698,7 @@ class PaymentViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): amount=amount, provider=payment.provider, info='{}', + comment=request.data.get("comment"), ) payment.order.log_action('pretix.event.order.refund.created', { 'local_id': r.local_id, diff --git a/src/pretix/api/views/organizer.py b/src/pretix/api/views/organizer.py index bf73d51cd..f600086e1 100644 --- a/src/pretix/api/views/organizer.py +++ b/src/pretix/api/views/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/shredders.py b/src/pretix/api/views/shredders.py index 353ca0cf1..acb34fa83 100644 --- a/src/pretix/api/views/shredders.py +++ b/src/pretix/api/views/shredders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/upload.py b/src/pretix/api/views/upload.py index bd75a7d98..e6426de64 100644 --- a/src/pretix/api/views/upload.py +++ b/src/pretix/api/views/upload.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/user.py b/src/pretix/api/views/user.py index 361ca46a2..142563ecd 100644 --- a/src/pretix/api/views/user.py +++ b/src/pretix/api/views/user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/version.py b/src/pretix/api/views/version.py index 9aea65a98..2ac2edb02 100644 --- a/src/pretix/api/views/version.py +++ b/src/pretix/api/views/version.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/voucher.py b/src/pretix/api/views/voucher.py index 3fcb235e2..c0c0c1016 100644 --- a/src/pretix/api/views/voucher.py +++ b/src/pretix/api/views/voucher.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/waitinglist.py b/src/pretix/api/views/waitinglist.py index 2683e496a..f645a5e56 100644 --- a/src/pretix/api/views/waitinglist.py +++ b/src/pretix/api/views/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/views/webhooks.py b/src/pretix/api/views/webhooks.py index b2d18971e..f0c781523 100644 --- a/src/pretix/api/views/webhooks.py +++ b/src/pretix/api/views/webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 2dcf525e9..b14bd7139 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -439,8 +439,12 @@ def register_default_webhook_events(sender, **kwargs): def notify_webhooks(logentry_ids: list): if not isinstance(logentry_ids, list): logentry_ids = [logentry_ids] - qs = LogEntry.all.select_related('event', 'event__organizer', 'organizer').filter(id__in=logentry_ids) - _org, _at, webhooks = None, None, None + qs = LogEntry.all.select_related( + 'event', 'event__organizer', 'organizer' + ).order_by( + 'action_type', 'organizer_id', 'event_id', + ).filter(id__in=logentry_ids) + _org, _at, _ev, webhooks = None, None, None, None for logentry in qs: if not logentry.organizer: break # We need to know the organizer @@ -450,7 +454,7 @@ def notify_webhooks(logentry_ids: list): if not notification_type: break # Ignore, no webhooks for this event type - if _org != logentry.organizer or _at != logentry.action_type or webhooks is None: + if _org != logentry.organizer or _at != logentry.action_type or _ev != logentry.event_id or webhooks is None: _org = logentry.organizer _at = logentry.action_type diff --git a/src/pretix/base/__init__.py b/src/pretix/base/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/__init__.py +++ b/src/pretix/base/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/addressvalidation.py b/src/pretix/base/addressvalidation.py index aa5550e19..9a2959f76 100644 --- a/src/pretix/base/addressvalidation.py +++ b/src/pretix/base/addressvalidation.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/apps.py b/src/pretix/base/apps.py index 66baca9ab..1852c0c35 100644 --- a/src/pretix/base/apps.py +++ b/src/pretix/base/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/auth.py b/src/pretix/base/auth.py index 6750ea825..f504729ee 100644 --- a/src/pretix/base/auth.py +++ b/src/pretix/base/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/banlist.py b/src/pretix/base/banlist.py index 6b26ee1ec..e22f34e21 100644 --- a/src/pretix/base/banlist.py +++ b/src/pretix/base/banlist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/cache.py b/src/pretix/base/cache.py index e2702628c..d1829b411 100644 --- a/src/pretix/base/cache.py +++ b/src/pretix/base/cache.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/channels.py b/src/pretix/base/channels.py index c9ad7cf38..6f6bcab2d 100644 --- a/src/pretix/base/channels.py +++ b/src/pretix/base/channels.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/context.py b/src/pretix/base/context.py index ce1addb1f..475dfd4f1 100644 --- a/src/pretix/base/context.py +++ b/src/pretix/base/context.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/customersso/__init__.py b/src/pretix/base/customersso/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/customersso/__init__.py +++ b/src/pretix/base/customersso/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/customersso/oidc.py b/src/pretix/base/customersso/oidc.py index 3e20d0ffd..b093c0125 100644 --- a/src/pretix/base/customersso/oidc.py +++ b/src/pretix/base/customersso/oidc.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/datasync/__init__.py b/src/pretix/base/datasync/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/datasync/__init__.py +++ b/src/pretix/base/datasync/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/datasync/datasync.py b/src/pretix/base/datasync/datasync.py index a953be317..cb5bf01b3 100644 --- a/src/pretix/base/datasync/datasync.py +++ b/src/pretix/base/datasync/datasync.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -106,7 +106,7 @@ class OutboundSyncProvider: return str(cls.identifier) @classmethod - def enqueue_order(cls, order, triggered_by, not_before=None): + def enqueue_order(cls, order, triggered_by, not_before=None, immediate=False): """ Adds an order to the sync queue. May only be called on derived classes which define an ``identifier`` attribute. @@ -119,10 +119,14 @@ class OutboundSyncProvider: :param order: the Order that should be synced :param triggered_by: the reason why the order should be synced, e.g. name of the signal (currently only used internally for logging) + :param immediate: whether a new sync task should run immediately for this order, instead + of waiting for the next periodic_task interval + :return: Return a tuple (queue_item, created), where created is a boolean + specifying whether a new queue item was created. """ if not hasattr(cls, 'identifier'): raise TypeError('Call this method on a derived class that defines an "identifier" attribute.') - OrderSyncQueue.objects.update_or_create( + queue_item, created = OrderSyncQueue.objects.update_or_create( order=order, sync_provider=cls.identifier, in_flight=False, @@ -133,6 +137,10 @@ class OutboundSyncProvider: "need_manual_retry": None, }, ) + if immediate: + from pretix.base.services.datasync import sync_single + sync_single.apply_async(args=(queue_item.pk,)) + return queue_item, created @classmethod def get_external_link_info(cls, event, external_link_href, external_link_display_name): @@ -383,7 +391,7 @@ class OutboundSyncProvider: def sync_order(self, order): if not self.should_sync_order(order): logger.debug("Skipping order %r", order) - return + return {} logger.debug("Syncing order %r", order) positions = list( diff --git a/src/pretix/base/datasync/sourcefields.py b/src/pretix/base/datasync/sourcefields.py index 816f9d5cb..156145cb8 100644 --- a/src/pretix/base/datasync/sourcefields.py +++ b/src/pretix/base/datasync/sourcefields.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/datasync/utils.py b/src/pretix/base/datasync/utils.py index 05aab054a..ecfd948c5 100644 --- a/src/pretix/base/datasync/utils.py +++ b/src/pretix/base/datasync/utils.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/decimal.py b/src/pretix/base/decimal.py index 1d8a747f0..a34215a8a 100644 --- a/src/pretix/base/decimal.py +++ b/src/pretix/base/decimal.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index b17f5b266..e1efce0b0 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index fb85dc3ab..2a40dabc9 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -105,6 +105,18 @@ class BaseExporter: """ return False + @property + def repeatable_read(self) -> bool: + """ + If ``True``, this exporter will be run in a REPEATABLE READ transaction. This ensures consistent results for + all queries performed by the exporter, but creates a performance burden on the database server. We recommend to + disable this for exporters that take very long to run and do not rely on this behavior, such as export of lists + to CSV files. + + Defaults to ``True`` for now, but default may change in future versions. + """ + return True + @property def identifier(self) -> str: """ diff --git a/src/pretix/base/exporters/__init__.py b/src/pretix/base/exporters/__init__.py index 49c8b6437..4260f07fe 100644 --- a/src/pretix/base/exporters/__init__.py +++ b/src/pretix/base/exporters/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/answers.py b/src/pretix/base/exporters/answers.py index 521376fee..9eb3b9d13 100644 --- a/src/pretix/base/exporters/answers.py +++ b/src/pretix/base/exporters/answers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/customers.py b/src/pretix/base/exporters/customers.py index 642f8f18f..7aa748093 100644 --- a/src/pretix/base/exporters/customers.py +++ b/src/pretix/base/exporters/customers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/dekodi.py b/src/pretix/base/exporters/dekodi.py index 4f6e6a32a..d77efed11 100644 --- a/src/pretix/base/exporters/dekodi.py +++ b/src/pretix/base/exporters/dekodi.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/events.py b/src/pretix/base/exporters/events.py index bd27c36ea..a53e153d8 100644 --- a/src/pretix/base/exporters/events.py +++ b/src/pretix/base/exporters/events.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/invoices.py b/src/pretix/base/exporters/invoices.py index 0cc9b6903..8aa3dba22 100644 --- a/src/pretix/base/exporters/invoices.py +++ b/src/pretix/base/exporters/invoices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -125,6 +125,7 @@ class InvoiceExporter(InvoiceExporterMixin, BaseExporter): identifier = 'invoices' verbose_name = _('All invoices') description = _('Download all invoices created by the system as a ZIP file of PDF files.') + repeatable_read = False def render(self, form_data: dict, output_file=None): qs = self.invoices_queryset(form_data).filter(shredded=False) @@ -180,6 +181,7 @@ class InvoiceDataExporter(InvoiceExporterMixin, MultiSheetListExporter): 'includes two sheets, one with a line for every invoice, and one with a line for every position of ' 'every invoice.') featured = True + repeatable_read = False @property def additional_form_fields(self): diff --git a/src/pretix/base/exporters/items.py b/src/pretix/base/exporters/items.py index fdff516e4..fba449768 100644 --- a/src/pretix/base/exporters/items.py +++ b/src/pretix/base/exporters/items.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/json.py b/src/pretix/base/exporters/json.py index 4c80e0a63..5791a2fa4 100644 --- a/src/pretix/base/exporters/json.py +++ b/src/pretix/base/exporters/json.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/mail.py b/src/pretix/base/exporters/mail.py index b7f7716f9..36c32c53d 100644 --- a/src/pretix/base/exporters/mail.py +++ b/src/pretix/base/exporters/mail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index 77501780f..e7b51cd7b 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -89,7 +89,8 @@ class OrderListExporter(MultiSheetListExporter): description = gettext_lazy('Download a spreadsheet of all orders. The spreadsheet will include three sheets, one ' 'with a line for every order, one with a line for every order position, and one with ' 'a line for every additional fee charged in an order.') - featured = False + featured = True + repeatable_read = False @cached_property def providers(self): @@ -842,6 +843,7 @@ class TransactionListExporter(ListExporter): description = gettext_lazy('Download a spreadsheet of all substantial changes to orders, i.e. all changes to ' 'products, prices or tax rates. The information is only accurate for changes made with ' 'pretix versions released after October 2021.') + repeatable_read = False @cached_property def providers(self): @@ -1020,6 +1022,7 @@ class PaymentListExporter(ListExporter): category = pgettext_lazy('export_category', 'Order data') description = gettext_lazy('Download a spreadsheet of all payments or refunds of every order.') featured = True + repeatable_read = False @property def additional_form_fields(self): @@ -1159,7 +1162,7 @@ class QuotaListExporter(ListExporter): yield headers quotas = list(self.event.quotas.select_related('subevent')) - qa = QuotaAvailability(full_results=True) + qa = QuotaAvailability(full_results=True, allow_repeatable_read=True) qa.queue(*quotas) qa.compute() @@ -1200,6 +1203,7 @@ class GiftcardTransactionListExporter(OrganizerLevelExportMixin, ListExporter): organizer_required_permission = 'can_manage_gift_cards' category = pgettext_lazy('export_category', 'Gift cards') description = gettext_lazy('Download a spreadsheet of all gift card transactions.') + repeatable_read = False @property def additional_form_fields(self): @@ -1258,6 +1262,7 @@ class GiftcardRedemptionListExporter(ListExporter): verbose_name = gettext_lazy('Gift card redemptions') category = pgettext_lazy('export_category', 'Order data') description = gettext_lazy('Download a spreadsheet of all payments or refunds that involve gift cards.') + repeatable_read = False def iterate_list(self, form_data): payments = OrderPayment.objects.filter( diff --git a/src/pretix/base/exporters/reusablemedia.py b/src/pretix/base/exporters/reusablemedia.py index f73f1913a..83182c2df 100644 --- a/src/pretix/base/exporters/reusablemedia.py +++ b/src/pretix/base/exporters/reusablemedia.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -34,6 +34,7 @@ class ReusableMediaExporter(OrganizerLevelExportMixin, ListExporter): verbose_name = _('Reusable media') category = pgettext_lazy('export_category', 'Reusable media') description = _('Download a spread sheet with the data of all reusable medias on your account.') + repeatable_read = False def iterate_list(self, form_data): media = ReusableMedium.objects.filter( diff --git a/src/pretix/base/exporters/waitinglist.py b/src/pretix/base/exporters/waitinglist.py index 1b1cf1faf..978c80e8c 100644 --- a/src/pretix/base/exporters/waitinglist.py +++ b/src/pretix/base/exporters/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -41,6 +41,7 @@ class WaitingListExporter(ListExporter): verbose_name = _('Waiting list') category = pgettext_lazy('export_category', 'Waiting list') description = _('Download a spread sheet with all your waiting list data.') + repeatable_read = False # map selected status to label and queryset-filter status_filters = [ diff --git a/src/pretix/base/forms/__init__.py b/src/pretix/base/forms/__init__.py index 1f733dd0b..09f65259a 100644 --- a/src/pretix/base/forms/__init__.py +++ b/src/pretix/base/forms/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/forms/auth.py b/src/pretix/base/forms/auth.py index 4fc801c4f..dd44bb9a6 100644 --- a/src/pretix/base/forms/auth.py +++ b/src/pretix/base/forms/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index be8811d34..bb56ceb9c 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -77,7 +77,9 @@ from pretix.base.forms.widgets import ( from pretix.base.i18n import ( get_babel_locale, get_language_without_region, language, ) -from pretix.base.invoicing.transmission import get_transmission_types +from pretix.base.invoicing.transmission import ( + get_transmission_types, transmission_types, +) from pretix.base.models import InvoiceAddress, Item, Question, QuestionOption from pretix.base.models.tax import ask_for_vat_id from pretix.base.services.tax import ( @@ -1142,9 +1144,11 @@ class BaseInvoiceAddressForm(forms.ModelForm): if (not kwargs.get('instance') or not kwargs['instance'].country) and not kwargs["initial"].get("country"): kwargs['initial']['country'] = guess_country_from_request(self.request, self.event) - if kwargs.get('instance'): - kwargs['initial'].update(kwargs['instance'].transmission_info or {}) - kwargs['initial']['transmission_type'] = kwargs['instance'].transmission_type + if kwargs.get('instance') and kwargs['instance'].transmission_type: + ttype, meta = transmission_types.get(identifier=kwargs['instance'].transmission_type) + if ttype: + kwargs['initial'].update(ttype.transmission_info_to_form_data(kwargs['instance'].transmission_info or {})) + kwargs['initial']['transmission_type'] = ttype.identifier super().__init__(*args, **kwargs) @@ -1394,9 +1398,7 @@ class BaseInvoiceAddressForm(forms.ModelForm): raise ValidationError({r: _("This field is required for the selected type of invoice transmission.")}) self.instance.transmission_type = transmission_type.identifier - self.instance.transmission_info = { - k: data.get(k) for k in transmission_type.invoice_address_form_fields - } + self.instance.transmission_info = transmission_type.form_data_to_transmission_info(data) elif transmission_type.exclusive: if transmission_type.is_available(self.event, data.get("country"), data.get("is_business")): raise ValidationError({ diff --git a/src/pretix/base/forms/user.py b/src/pretix/base/forms/user.py index e52bc51a4..10a904322 100644 --- a/src/pretix/base/forms/user.py +++ b/src/pretix/base/forms/user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/forms/validators.py b/src/pretix/base/forms/validators.py index 35f7323ba..5a420b93e 100644 --- a/src/pretix/base/forms/validators.py +++ b/src/pretix/base/forms/validators.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/forms/widgets.py b/src/pretix/base/forms/widgets.py index 69620b201..2acf7dd53 100644 --- a/src/pretix/base/forms/widgets.py +++ b/src/pretix/base/forms/widgets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/i18n.py b/src/pretix/base/i18n.py index ba7186ba0..7c510aa5d 100644 --- a/src/pretix/base/i18n.py +++ b/src/pretix/base/i18n.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/invoice.py b/src/pretix/base/invoice.py index 5efbee054..090b167c5 100644 --- a/src/pretix/base/invoice.py +++ b/src/pretix/base/invoice.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/invoicing/__init__.py b/src/pretix/base/invoicing/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/invoicing/__init__.py +++ b/src/pretix/base/invoicing/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/invoicing/email.py b/src/pretix/base/invoicing/email.py index 97d47d96f..d3064af77 100644 --- a/src/pretix/base/invoicing/email.py +++ b/src/pretix/base/invoicing/email.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -77,7 +77,7 @@ class EmailTransmissionType(TransmissionType): } def form_data_to_transmission_info(self, form_data: dict) -> dict: - if form_data.get("transmission_email_other") and form_data.get("transmission_email_address"): + if form_data.get("is_business") and form_data.get("transmission_email_other") and form_data.get("transmission_email_address"): return { "transmission_email_address": form_data["transmission_email_address"], } diff --git a/src/pretix/base/invoicing/national.py b/src/pretix/base/invoicing/national.py index b8c71fa55..47601145f 100644 --- a/src/pretix/base/invoicing/national.py +++ b/src/pretix/base/invoicing/national.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/invoicing/pdf.py b/src/pretix/base/invoicing/pdf.py index a6cbea7ea..2f2f36ed5 100644 --- a/src/pretix/base/invoicing/pdf.py +++ b/src/pretix/base/invoicing/pdf.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -19,6 +19,7 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # +import datetime import logging import math import re @@ -526,6 +527,20 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): textobject.textLine(self._normalize(self._upper(pgettext('invoice', 'Event')))) canvas.drawText(textobject) + def _date_range_in_header(self): + if self.invoice.event.has_subevents or not self.invoice.event.settings.show_dates_on_frontpage: + return None, None + tz = self.invoice.event.timezone + show_end_date = ( + self.invoice.event.settings.show_date_to and + self.invoice.event.date_to and + self.invoice.event.date_to.astimezone(tz).date() != self.invoice.event.date_from.astimezone(tz).date() + ) + if show_end_date: + return self.invoice.event.date_from.astimezone(tz).date(), self.invoice.event.date_to.astimezone(tz).date() + else: + return self.invoice.event.date_from.astimezone(tz).date(), None + def _draw_event(self, canvas): def shorten(txt): txt = str(txt) @@ -539,25 +554,17 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): p_size = p.wrap(self.event_width, self.event_height) return txt - if not self.invoice.event.has_subevents and self.invoice.event.settings.show_dates_on_frontpage: - tz = self.invoice.event.timezone - show_end_date = ( - self.invoice.event.settings.show_date_to and - self.invoice.event.date_to and - self.invoice.event.date_to.astimezone(tz).date() != self.invoice.event.date_from.astimezone(tz).date() + d_from, d_to = self._date_range_in_header() + if d_from and d_to: + p_str = ( + shorten(self.invoice.event.name) + '\n' + + pgettext('invoice', '{from_date}\nuntil {to_date}').format( + from_date=date_format(d_from, "DATE_FORMAT"), + to_date=date_format(d_to, "DATE_FORMAT"), + ) ) - if show_end_date: - p_str = ( - shorten(self.invoice.event.name) + '\n' + - pgettext('invoice', '{from_date}\nuntil {to_date}').format( - from_date=self.invoice.event.get_date_from_display(show_times=False), - to_date=self.invoice.event.get_date_to_display(show_times=False) - ) - ) - else: - p_str = ( - shorten(self.invoice.event.name) + '\n' + self.invoice.event.get_date_from_display(show_times=False) - ) + elif d_from: + p_str = shorten(self.invoice.event.name) + '\n' + date_format(d_from, "DATE_FORMAT") else: p_str = shorten(self.invoice.event.name) @@ -685,7 +692,14 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): return story def _get_story(self, doc): - has_taxes = any(il.tax_value for il in self.invoice.lines.all()) or self.invoice.reverse_charge + all_lines = list(self.invoice.lines.all()) + has_taxes = any(il.tax_value for il in all_lines) or self.invoice.reverse_charge + header_dates = self._date_range_in_header() + tz = self.invoice.event.timezone + has_multiple_service_dates = len(set( + (il.period_start, il.period_end) for il in all_lines + )) > 1 + request_show_service_date = False story = [ NextPageTemplate('FirstPage'), @@ -729,15 +743,75 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): )] def _group_key(line): - return (line.description, line.tax_rate, line.tax_name, line.net_value, line.gross_value, line.subevent_id, - line.event_date_from, line.event_date_to) + return (line.description, line.tax_rate, line.tax_name, line.net_value, line.gross_value, line.subevent, + line.period_start, line.period_end) + + def day(dt: datetime.datetime) -> datetime.date: + if dt is None: + return None + return dt.astimezone(tz).date() total = Decimal('0.00') - for (description, tax_rate, tax_name, net_value, gross_value, *ignored), lines in addon_aware_groupby( - self.invoice.lines.all(), + 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(" +"), ): + # 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 + # (b) due to not respecting the show_date_to setting of events in cases where we could have respected it. + # Still, we want to show the date explicitly if its different to the event or invoice date. + period_start_day = day(period_start) + period_end_day = day(period_end) + if period_start and period_end and period_end_day != period_start_day: + # It's a multi-day period, such as the validity of the ticket or an event date period + + if period_start_day == header_dates[0] and period_end_day == header_dates[1]: + # This is the exact event period we already printed in the header, no need to repeat it. + period_line = "" + + elif (self.event.has_subevents and subevent and day(subevent.date_from) == period_start_day and + day(subevent.date_to) == period_end_day): + # For subevents, build_invoice already includes the date in the description in the event-default format. + period_line = "" + + else: + period_line = f"{date_format(period_start_day, 'SHORT_DATE_FORMAT')} – {date_format(period_end_day, 'SHORT_DATE_FORMAT')}" + + elif period_start or period_end: + # It's a single-day period + + delivery_day = period_end_day or period_start_day + if delivery_day in header_dates: + # This is the event date we already printed in the header, no need to repeat it. + period_line = "" + + elif self.event.has_subevents and subevent and delivery_day in (day(subevent.date_from), day(subevent.date_to)): + # For subevents, build_invoice already includes the date in the description in the event-default format. + period_line = "" + + elif (delivery_day == self.invoice.date) and header_dates[0] is None: + # This is a shop that doesn't show the date of the event in the header, and the period is the invoice + # date. We assume that this is an 'everything is executed immediately' situation and do not want to + # confuse with showing additional dates on the invoice. This is the case that is not guaranteed to be + # correct in all cases and might need to change in the future. If customers have legal concerns, a + # quick fix is including a sentence like "Delivery date is the invoice date unless otherwise indicated:" + # in a custom text on the invoice. + period_line = "" + + else: + period_line = date_format(delivery_day, 'SHORT_DATE_FORMAT') + else: + # No period known + period_line = "" + + if not has_multiple_service_dates and period_line: + # Group together at the end of the invoice + request_show_service_date = period_line + elif period_line: + description += "\n" + period_line + lines = list(lines) if has_taxes: if len(lines) > 1: @@ -746,6 +820,7 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): gross_price=money_filter(gross_value, self.invoice.event.currency), ) description = description + "\n" + single_price_line + tdata.append(( FontFallbackParagraph( self._clean_text(description, tags=['br']), @@ -850,6 +925,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): story.append(Spacer(1, 10 * mm)) + if request_show_service_date: + story.append(FontFallbackParagraph( + self._normalize(pgettext('invoice', 'Invoice period: {daterange}').format(daterange=request_show_service_date)), + self.stylesheet['Normal'] + )) + if self.invoice.payment_provider_text: story.append(FontFallbackParagraph( self._normalize(self.invoice.payment_provider_text), diff --git a/src/pretix/base/invoicing/peppol.py b/src/pretix/base/invoicing/peppol.py index b31b3e645..c8a28752a 100644 --- a/src/pretix/base/invoicing/peppol.py +++ b/src/pretix/base/invoicing/peppol.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/invoicing/transmission.py b/src/pretix/base/invoicing/transmission.py index 584a056e5..6b7d39831 100644 --- a/src/pretix/base/invoicing/transmission.py +++ b/src/pretix/base/invoicing/transmission.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -99,7 +99,9 @@ class TransmissionType: return {} def form_data_to_transmission_info(self, form_data: dict) -> dict: - return form_data + return { + k: form_data.get(k) for k in self.invoice_address_form_fields + } def transmission_info_to_form_data(self, transmission_info: dict) -> dict: return transmission_info diff --git a/src/pretix/base/logentrytype_registry.py b/src/pretix/base/logentrytype_registry.py index 696ff24b6..71576d3f3 100644 --- a/src/pretix/base/logentrytype_registry.py +++ b/src/pretix/base/logentrytype_registry.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/logentrytypes.py b/src/pretix/base/logentrytypes.py index 32c464d5a..449b1ac06 100644 --- a/src/pretix/base/logentrytypes.py +++ b/src/pretix/base/logentrytypes.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/__init__.py b/src/pretix/base/management/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/management/__init__.py +++ b/src/pretix/base/management/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/__init__.py b/src/pretix/base/management/commands/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/management/commands/__init__.py +++ b/src/pretix/base/management/commands/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/_migrations.py b/src/pretix/base/management/commands/_migrations.py index 521525be1..b631db5df 100644 --- a/src/pretix/base/management/commands/_migrations.py +++ b/src/pretix/base/management/commands/_migrations.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/check_order_transactions.py b/src/pretix/base/management/commands/check_order_transactions.py index d059d001e..d3d6eeb8c 100644 --- a/src/pretix/base/management/commands/check_order_transactions.py +++ b/src/pretix/base/management/commands/check_order_transactions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/create_order_transactions.py b/src/pretix/base/management/commands/create_order_transactions.py index ed65cca9f..55ffac2ff 100644 --- a/src/pretix/base/management/commands/create_order_transactions.py +++ b/src/pretix/base/management/commands/create_order_transactions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/export.py b/src/pretix/base/management/commands/export.py index a398413ce..74c578ece 100644 --- a/src/pretix/base/management/commands/export.py +++ b/src/pretix/base/management/commands/export.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/makemessages.py b/src/pretix/base/management/commands/makemessages.py index bcbc67389..ed040813a 100644 --- a/src/pretix/base/management/commands/makemessages.py +++ b/src/pretix/base/management/commands/makemessages.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/makemigrations.py b/src/pretix/base/management/commands/makemigrations.py index 5a3bb65f0..7b88011fb 100644 --- a/src/pretix/base/management/commands/makemigrations.py +++ b/src/pretix/base/management/commands/makemigrations.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/migrate.py b/src/pretix/base/management/commands/migrate.py index 799696647..f027d1573 100644 --- a/src/pretix/base/management/commands/migrate.py +++ b/src/pretix/base/management/commands/migrate.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/rebuild.py b/src/pretix/base/management/commands/rebuild.py index 3161dc69b..839103f09 100644 --- a/src/pretix/base/management/commands/rebuild.py +++ b/src/pretix/base/management/commands/rebuild.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/runperiodic.py b/src/pretix/base/management/commands/runperiodic.py index 639b9b69b..b3e99ab9b 100644 --- a/src/pretix/base/management/commands/runperiodic.py +++ b/src/pretix/base/management/commands/runperiodic.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/management/commands/shell_scoped.py b/src/pretix/base/management/commands/shell_scoped.py index d5b67f90e..3438b3bb5 100644 --- a/src/pretix/base/management/commands/shell_scoped.py +++ b/src/pretix/base/management/commands/shell_scoped.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/media.py b/src/pretix/base/media.py index 0808e6869..47a1be987 100644 --- a/src/pretix/base/media.py +++ b/src/pretix/base/media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/metrics.py b/src/pretix/base/metrics.py index c7db66f31..f0d024f8d 100755 --- a/src/pretix/base/metrics.py +++ b/src/pretix/base/metrics.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/middleware.py b/src/pretix/base/middleware.py index 82132665c..7e326d90f 100644 --- a/src/pretix/base/middleware.py +++ b/src/pretix/base/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/migrations/0289_invoiceline_period.py b/src/pretix/base/migrations/0289_invoiceline_period.py new file mode 100644 index 000000000..56f68b8b3 --- /dev/null +++ b/src/pretix/base/migrations/0289_invoiceline_period.py @@ -0,0 +1,78 @@ +# Generated by Django 4.2.17 on 2025-09-08 08:14 +from django.core.cache import cache +from django.db import migrations + + +def set_invoice_period(apps, schema_editor): + EventSettingsStore = apps.get_model("pretixbase", "Event_SettingsStore") + ev_seen = set() + insert_queue = [] + flush_queue = [] + + def store(): + EventSettingsStore.objects.bulk_create( + insert_queue, + update_conflicts=True, + update_fields=["value"], + unique_fields=["object", "key"], + ) + cache.delete_many(flush_queue) + flush_queue.clear() + insert_queue.clear() + + # Existing events that use pretix-zugferd and have explicitly disabled delivery dates + for setting in EventSettingsStore.objects.filter(key="zugferd_include_delivery_date", value="False"): + flush_queue.append("hierarkey_{}_{}".format("event", setting.object_id)) + insert_queue.append( + EventSettingsStore( + object_id=setting.object_id, + key="invoice_period", + value="invoice_date", + ) + ) + ev_seen.add(setting.object_id) + + if len(insert_queue) > 1000: + store() + + # Existing events that previously hid their date on invoices + for setting in EventSettingsStore.objects.filter(key="show_dates_on_frontpage", value="False"): + if setting.object_id in ev_seen: + continue + + flush_queue.append("hierarkey_{}_{}".format("event", setting.object_id)) + insert_queue.append( + EventSettingsStore( + object_id=setting.object_id, + key="invoice_period", + value="auto_no_event", + ) + ) + + if len(insert_queue) > 1000: + store() + + store() + + +class Migration(migrations.Migration): + dependencies = [ + ("pretixbase", "0288_invoice_transmission"), + ] + + operations = [ + migrations.RenameField( + model_name="invoiceline", + old_name="event_date_to", + new_name="period_end", + ), + migrations.RenameField( + model_name="invoiceline", + old_name="event_date_from", + new_name="period_start", + ), + migrations.RunPython( + set_invoice_period, + migrations.RunPython.noop, + ) + ] diff --git a/src/pretix/base/migrations/0290_invoice_plugin_data.py b/src/pretix/base/migrations/0290_invoice_plugin_data.py new file mode 100644 index 000000000..ca0f9d4e1 --- /dev/null +++ b/src/pretix/base/migrations/0290_invoice_plugin_data.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.17 on 2025-09-09 09:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0289_invoiceline_period"), + ] + + operations = [ + migrations.AddField( + model_name="invoice", + name="plugin_data", + field=models.JSONField(default=dict), + ), + ] diff --git a/src/pretix/base/migrations/0291_alter_logentry_object_id.py b/src/pretix/base/migrations/0291_alter_logentry_object_id.py new file mode 100644 index 000000000..6be090cb8 --- /dev/null +++ b/src/pretix/base/migrations/0291_alter_logentry_object_id.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.16 on 2025-10-06 16:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0290_invoice_plugin_data"), + ] + + operations = [ + migrations.AlterField( + model_name="logentry", + name="object_id", + field=models.PositiveBigIntegerField(db_index=True), + ), + ] diff --git a/src/pretix/base/migrations/0292_giftcard_customer.py b/src/pretix/base/migrations/0292_giftcard_customer.py new file mode 100644 index 000000000..5ee6b7dd4 --- /dev/null +++ b/src/pretix/base/migrations/0292_giftcard_customer.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.19 on 2025-05-19 11:06 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0291_alter_logentry_object_id'), + ] + + operations = [ + migrations.AddField( + model_name='giftcard', + name='customer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='customer_gift_cards', to='pretixbase.customer'), + ), + ] diff --git a/src/pretix/base/modelimport.py b/src/pretix/base/modelimport.py index f700c349f..43b956e1a 100644 --- a/src/pretix/base/modelimport.py +++ b/src/pretix/base/modelimport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/modelimport_orders.py b/src/pretix/base/modelimport_orders.py index f87a24f2d..144cdf613 100644 --- a/src/pretix/base/modelimport_orders.py +++ b/src/pretix/base/modelimport_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -175,7 +175,7 @@ class Variation(ImportColumn): if value: matches = [ p for p in self.items - if str(p.pk) == value or any((v and v == value) for v in i18n_flat(p.value)) and p.item_id == previous_values['item'].pk + if (str(p.pk) == value or any((v and v == value) for v in i18n_flat(p.value))) and p.item_id == previous_values['item'].pk ] if len(matches) == 0: raise ValidationError(_("No matching variation was found.")) diff --git a/src/pretix/base/modelimport_vouchers.py b/src/pretix/base/modelimport_vouchers.py index c48c06fcd..a9e2199ff 100644 --- a/src/pretix/base/modelimport_vouchers.py +++ b/src/pretix/base/modelimport_vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/__init__.py b/src/pretix/base/models/__init__.py index d3e68f6bd..944737501 100644 --- a/src/pretix/base/models/__init__.py +++ b/src/pretix/base/models/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/_transactions.py b/src/pretix/base/models/_transactions.py index 5fecab2b2..1aaf2919b 100644 --- a/src/pretix/base/models/_transactions.py +++ b/src/pretix/base/models/_transactions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index 27e0ee696..31871dadb 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/base.py b/src/pretix/base/models/base.py index c1c1fb553..d8154aa8f 100644 --- a/src/pretix/base/models/base.py +++ b/src/pretix/base/models/base.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/checkin.py b/src/pretix/base/models/checkin.py index e9e160d4b..0926cedee 100644 --- a/src/pretix/base/models/checkin.py +++ b/src/pretix/base/models/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/currencies.py b/src/pretix/base/models/currencies.py index b8f1c79c9..dd6c6775b 100644 --- a/src/pretix/base/models/currencies.py +++ b/src/pretix/base/models/currencies.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/customers.py b/src/pretix/base/models/customers.py index 019f6fa87..942ae5918 100644 --- a/src/pretix/base/models/customers.py +++ b/src/pretix/base/models/customers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -19,6 +19,8 @@ # 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 pycountry from django.conf import settings from django.contrib.auth.hashers import ( @@ -27,7 +29,11 @@ from django.contrib.auth.hashers import ( from django.core.validators import RegexValidator, URLValidator from django.db import models from django.db.models import F, Q +from django.db.models.aggregates import Sum +from django.db.models.expressions import OuterRef, Subquery +from django.db.models.functions.comparison import Coalesce from django.utils.crypto import get_random_string, salted_hmac +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_scopes import ScopedManager, scopes_disabled from i18nfield.fields import I18nCharField @@ -36,6 +42,7 @@ from phonenumber_field.modelfields import PhoneNumberField from pretix.base.banlist import banned from pretix.base.models.base import LoggedModel from pretix.base.models.fields import MultiStringField +from pretix.base.models.giftcards import GiftCardTransaction from pretix.base.models.organizer import Organizer from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.helpers.countries import FastCountryField @@ -288,6 +295,19 @@ class Customer(LoggedModel): organizer=self.organizer, ) + def usable_gift_cards(self, used_cards=[]): + s = GiftCardTransaction.objects.filter( + card=OuterRef('pk') + ).order_by().values('card').annotate(s=Sum('value')).values('s') + qs = self.customer_gift_cards.annotate( + cached_value=Coalesce(Subquery(s), Decimal('0.00')), + ) + ne_qs = qs.filter( + Q(expires__isnull=True) | Q(expires__gte=now()), + ) + ex_qs = ne_qs.exclude(id__in=used_cards) + return ex_qs.filter(cached_value__gt=0) + class AttendeeProfile(models.Model): customer = models.ForeignKey( diff --git a/src/pretix/base/models/datasync.py b/src/pretix/base/models/datasync.py index 065832403..e6b2bbd22 100644 --- a/src/pretix/base/models/datasync.py +++ b/src/pretix/base/models/datasync.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/devices.py b/src/pretix/base/models/devices.py index 71c614159..c94cf6827 100644 --- a/src/pretix/base/models/devices.py +++ b/src/pretix/base/models/devices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/discount.py b/src/pretix/base/models/discount.py index dc99e4bda..9c09edc65 100644 --- a/src/pretix/base/models/discount.py +++ b/src/pretix/base/models/discount.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 5a1cdd4b2..c96ee870d 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1639,20 +1639,16 @@ class SubEvent(EventMixin, LoggedModel): @cached_property def item_overrides(self): - from .items import SubEventItem - return { si.item_id: si - for si in SubEventItem.objects.filter(subevent=self) + for si in self.subeventitem_set.all() } @cached_property def var_overrides(self): - from .items import SubEventItemVariation - return { si.variation_id: si - for si in SubEventItemVariation.objects.filter(subevent=self) + for si in self.subeventitemvariation_set.all() } @property diff --git a/src/pretix/base/models/exports.py b/src/pretix/base/models/exports.py index 6104ff2b1..a539f371b 100644 --- a/src/pretix/base/models/exports.py +++ b/src/pretix/base/models/exports.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/fields.py b/src/pretix/base/models/fields.py index 218a7c668..73ad7badf 100644 --- a/src/pretix/base/models/fields.py +++ b/src/pretix/base/models/fields.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/giftcards.py b/src/pretix/base/models/giftcards.py index 905469737..409bf4a1c 100644 --- a/src/pretix/base/models/giftcards.py +++ b/src/pretix/base/models/giftcards.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -80,6 +80,13 @@ class GiftCard(LoggedModel): null=True, blank=True, verbose_name=_('Owned by ticket holder') ) + customer = models.ForeignKey( + 'Customer', + related_name='customer_gift_cards', + on_delete=models.PROTECT, + null=True, blank=True, + verbose_name=_('Owned by customer account') + ) issuance = models.DateTimeField( auto_now_add=True, ) @@ -195,20 +202,21 @@ class GiftCardTransaction(models.Model): return response if self.order_id: - if not self.text: - if not customer_facing: - return format_html( - '{}', - reverse( - "control:event.order", - kwargs={ - "event": self.order.event.slug, - "organizer": self.order.event.organizer.slug, - "code": self.order.code, - } - ), - self.order.full_code - ) + if not customer_facing: + return format_html( + '{} {}', + reverse( + "control:event.order", + kwargs={ + "event": self.order.event.slug, + "organizer": self.order.event.organizer.slug, + "code": self.order.code, + } + ), + self.order.full_code, + self.text or "", + ) + elif not self.text: return self.order.full_code else: return self.text diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index 0dfde5d57..602e062d8 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -33,6 +33,7 @@ # License for the specific language governing permissions and limitations under the License. import string +import warnings from decimal import Decimal import pycountry @@ -201,6 +202,7 @@ class Invoice(models.Model): transmission_info = models.JSONField(null=True, blank=True) file = models.FileField(null=True, blank=True, upload_to=invoice_filename, max_length=255) + plugin_data = models.JSONField(default=dict) objects = ScopedManager(organizer='event__organizer') @@ -404,10 +406,10 @@ class InvoiceLine(models.Model): :type tax_name: str :param subevent: The subevent this line refers to :type subevent: SubEvent - :param event_date_from: Event date of the (sub)event at the time the invoice was created - :type event_date_from: datetime - :param event_date_to: Event end date of the (sub)event at the time the invoice was created - :type event_date_to: datetime + :param period_start: Start if service period invoiced + :type period_start: datetime + :param period_end: End of service period invoiced + :type period_end: datetime :param event_location: Event location of the (sub)event at the time the invoice was created :type event_location: str :param item: The item this line refers to @@ -426,8 +428,8 @@ class InvoiceLine(models.Model): tax_name = models.CharField(max_length=190) tax_code = models.CharField(max_length=190, null=True, blank=True) subevent = models.ForeignKey('SubEvent', null=True, blank=True, on_delete=models.PROTECT) - event_date_from = models.DateTimeField(null=True) - event_date_to = models.DateTimeField(null=True) + period_start = models.DateTimeField(null=True) + period_end = models.DateTimeField(null=True) event_location = models.TextField(null=True, blank=True) item = models.ForeignKey('Item', null=True, blank=True, on_delete=models.PROTECT) variation = models.ForeignKey('ItemVariation', null=True, blank=True, on_delete=models.PROTECT) @@ -444,3 +446,35 @@ class InvoiceLine(models.Model): def __str__(self): return 'Line {} of invoice {}'.format(self.position, self.invoice) + + @property + def event_date_from(self): + warnings.warn( + 'InvoiceLine.event_date_from is deprecated, use period_start instead,', + category=DeprecationWarning, + ) + return self.period_start + + @event_date_from.setter + def event_date_from(self, value): + warnings.warn( + 'InvoiceLine.event_date_from is deprecated, use period_start instead,', + category=DeprecationWarning, + ) + self.period_start = value + + @property + def event_date_to(self): + warnings.warn( + 'InvoiceLine.event_date_to is deprecated, use period_end instead,', + category=DeprecationWarning, + ) + return self.period_end + + @event_date_to.setter + def event_date_to(self, value): + warnings.warn( + 'InvoiceLine.event_date_to is deprecated, use period_end instead,', + category=DeprecationWarning, + ) + self.period_to = value diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index c13d4f859..7e42f2cb7 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/log.py b/src/pretix/base/models/log.py index 368bd99f1..2ccf5c20e 100644 --- a/src/pretix/base/models/log.py +++ b/src/pretix/base/models/log.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -66,7 +66,7 @@ class LogEntry(models.Model): :type data: str """ content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField(db_index=True) + object_id = models.PositiveBigIntegerField(db_index=True) content_object = GenericForeignKey('content_type', 'object_id') datetime = models.DateTimeField(auto_now_add=True) user = models.ForeignKey('User', null=True, blank=True, on_delete=models.PROTECT) diff --git a/src/pretix/base/models/media.py b/src/pretix/base/models/media.py index eedf71390..be8a0af9d 100644 --- a/src/pretix/base/models/media.py +++ b/src/pretix/base/models/media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/memberships.py b/src/pretix/base/models/memberships.py index 14640b2cf..f2d5fd5cb 100644 --- a/src/pretix/base/models/memberships.py +++ b/src/pretix/base/models/memberships.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/notifications.py b/src/pretix/base/models/notifications.py index 6b23c9260..5af7c4148 100644 --- a/src/pretix/base/models/notifications.py +++ b/src/pretix/base/models/notifications.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index f48e7dd63..adcb69bcc 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1840,6 +1840,10 @@ class OrderPayment(models.Model): )) return False + if locked_instance.state == OrderPayment.PAYMENT_STATE_CANCELED: + # Never send mails when the payment was already canceled intentionally + send_mail = False + if isinstance(info, str): locked_instance.info = info elif info: @@ -1855,6 +1859,10 @@ class OrderPayment(models.Model): 'data': log_data, }, user=user, auth=auth) + if self.order.status in (Order.STATUS_PAID, Order.STATUS_CANCELED, Order.STATUS_EXPIRED): + # No reason to send mail, as the payment is no longer really expected + send_mail = False + if send_mail: with language(self.order.locale, self.order.event.settings.region): email_subject = self.order.event.settings.mail_subject_order_payment_failed @@ -1961,14 +1969,20 @@ class OrderPayment(models.Model): self.order.invoice_dirty ) if gen_invoice: - if invoices: - last_i = self.order.invoices.filter(is_cancellation=False).last() - if not last_i.canceled: - generate_cancellation(last_i) - invoice = generate_invoice( - self.order, - trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment - ) + try: + if invoices: + last_i = self.order.invoices.filter(is_cancellation=False).last() + if not last_i.canceled: + generate_cancellation(last_i) + invoice = generate_invoice( + self.order, + trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment + ) + except Exception as e: + logger.exception("Could not generate invoice.") + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) transmit_invoice_task = invoice_transmission_separately(invoice) transmit_invoice_mail = not transmit_invoice_task and self.order.event.settings.invoice_email_attachment and self.order.email diff --git a/src/pretix/base/models/organizer.py b/src/pretix/base/models/organizer.py index 757bf3457..71cc083f4 100644 --- a/src/pretix/base/models/organizer.py +++ b/src/pretix/base/models/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/seating.py b/src/pretix/base/models/seating.py index 372131d66..70ac0b892 100644 --- a/src/pretix/base/models/seating.py +++ b/src/pretix/base/models/seating.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/tax.py b/src/pretix/base/models/tax.py index 1058934cd..cab647049 100644 --- a/src/pretix/base/models/tax.py +++ b/src/pretix/base/models/tax.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index 9dc8afe3d..a1531e987 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/models/waitinglist.py b/src/pretix/base/models/waitinglist.py index f7cf0ff8e..1eedd4ab3 100644 --- a/src/pretix/base/models/waitinglist.py +++ b/src/pretix/base/models/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/notifications.py b/src/pretix/base/notifications.py index f4f661786..b95d48406 100644 --- a/src/pretix/base/notifications.py +++ b/src/pretix/base/notifications.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index b73fecd1a..72f127770 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -38,6 +38,7 @@ import json import logging from collections import OrderedDict from decimal import ROUND_HALF_UP, Decimal +from functools import cached_property from typing import Any, Dict, Union from zoneinfo import ZoneInfo @@ -57,8 +58,8 @@ from i18nfield.strings import LazyI18nString from pretix.base.forms import I18nMarkdownTextarea, PlaceholderValidator from pretix.base.models import ( - CartPosition, Event, GiftCard, InvoiceAddress, Order, OrderPayment, - OrderRefund, Quota, TaxRule, + CartPosition, Customer, Event, GiftCard, InvoiceAddress, Order, + OrderPayment, OrderRefund, Quota, TaxRule, ) from pretix.base.reldate import RelativeDateField, RelativeDateWrapper from pretix.base.settings import SettingsSandbox @@ -99,6 +100,7 @@ class PaymentProviderForm(Form): class GiftCardPaymentForm(PaymentProviderForm): def __init__(self, *args, **kwargs): + self.customer_gift_cards = kwargs.pop('customer_gift_cards') if 'customer_gift_cards' in kwargs else None self.event = kwargs.pop('event') self.testmode = kwargs.pop('testmode') self.positions = kwargs.pop('positions') @@ -1373,6 +1375,31 @@ class GiftCardPayment(BasePaymentProvider): payment_form_class = GiftCardPaymentForm payment_form_template_name = 'pretixcontrol/giftcards/checkout.html' + @cached_property + def customer_gift_cards(self): + if not self.request: + return None + if not self.used_cards: + self.used_cards = [] + cs = None + if 'checkout' in self.request.resolver_match.url_name: + cs = cart_session(self.request) + customer = getattr(self.request, "customer", None) + if customer: + return customer.usable_gift_cards(self.used_cards) + elif cs and cs.get('customer_mode', 'guest') == 'login': + try: + customer = self.request.organizer.customers.get(pk=cs["customer"]) + return customer.usable_gift_cards(self.used_cards) + except Customer.DoesNotExist: + return None + + def payment_form_render(self, request: HttpRequest, total: Decimal, order: Order = None) -> str: + form = self.payment_form(request) + template = get_template(self.payment_form_template_name) + ctx = {'request': request, 'form': form, 'customer_gift_cards': form.customer_gift_cards, } + return template.render(ctx) + def payment_form(self, request: HttpRequest) -> Form: # Unfortunately, in payment_form we do not know if we're in checkout # or in an existing order. But we need to do the validation logic in the @@ -1392,8 +1419,12 @@ class GiftCardPayment(BasePaymentProvider): positions = order.positions.all() testmode = order.testmode + self.request = request + self.used_cards = used_cards + form = self.payment_form_class( event=self.event, + customer_gift_cards=self.customer_gift_cards, used_cards=used_cards, positions=positions, testmode=testmode, @@ -1627,6 +1658,7 @@ class GiftCardPayment(BasePaymentProvider): order=refund.order, refund=refund, acceptor=self.event.organizer, + text=refund.comment, ) refund.info_data = { 'gift_card': gc.pk, diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index 21414055b..ed00d9231 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/plugins.py b/src/pretix/base/plugins.py index f26eb7747..4f32b6682 100644 --- a/src/pretix/base/plugins.py +++ b/src/pretix/base/plugins.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -29,6 +29,7 @@ from django.apps import AppConfig, apps from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.utils.translation import gettext_lazy as _ +from django_scopes import scope from packaging.requirements import Requirement PLUGIN_LEVEL_EVENT = 'event' @@ -71,7 +72,8 @@ def get_all_plugins(*, event=None, organizer=None) -> List[type]: continue elif organizer and hasattr(app, 'is_available'): if not event_fallback_used: - event_fallback = organizer.events.first() + with scope(organizer=organizer): + event_fallback = organizer.events.first() event_fallback_used = True if not event_fallback or not app.is_available(event_fallback): continue diff --git a/src/pretix/base/reldate.py b/src/pretix/base/reldate.py index 79d49b82f..3b67610d5 100644 --- a/src/pretix/base/reldate.py +++ b/src/pretix/base/reldate.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/secretgenerators/__init__.py b/src/pretix/base/secretgenerators/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/secretgenerators/__init__.py +++ b/src/pretix/base/secretgenerators/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/secretgenerators/pretix_sig1_pb2.py b/src/pretix/base/secretgenerators/pretix_sig1_pb2.py index 4748a7e20..06b6a9059 100644 --- a/src/pretix/base/secretgenerators/pretix_sig1_pb2.py +++ b/src/pretix/base/secretgenerators/pretix_sig1_pb2.py @@ -2,8 +2,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/secrets.py b/src/pretix/base/secrets.py index 32f64c21e..da253e531 100644 --- a/src/pretix/base/secrets.py +++ b/src/pretix/base/secrets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/__init__.py b/src/pretix/base/services/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/services/__init__.py +++ b/src/pretix/base/services/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/auth.py b/src/pretix/base/services/auth.py index b66447a80..0aae4abd9 100644 --- a/src/pretix/base/services/auth.py +++ b/src/pretix/base/services/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/cancelevent.py b/src/pretix/base/services/cancelevent.py index 3f14c91dc..89d0d82b6 100644 --- a/src/pretix/base/services/cancelevent.py +++ b/src/pretix/base/services/cancelevent.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -24,6 +24,7 @@ from decimal import Decimal from django.db import transaction from django.db.models import Count, Exists, IntegerField, OuterRef, Q, Subquery +from django.utils.crypto import get_random_string from django.utils.translation import gettext from i18nfield.strings import LazyI18nString @@ -41,6 +42,7 @@ from pretix.base.services.orders import ( ) from pretix.base.services.tasks import ProfiledEventTask from pretix.base.services.tax import split_fee_for_taxes +from pretix.base.templatetags.money import money_filter from pretix.celery_app import app from pretix.helpers import OF_SELF from pretix.helpers.format import format_map @@ -112,7 +114,7 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, manual_refund: bool=False, send: bool=False, send_subject: dict=None, send_message: dict=None, send_waitinglist: bool=False, send_waitinglist_subject: dict={}, send_waitinglist_message: dict={}, user: int=None, refund_as_giftcard: bool=False, giftcard_expires=None, giftcard_conditions=None, - subevents_from: str=None, subevents_to: str=None): + subevents_from: str=None, subevents_to: str=None, dry_run=False): send_subject = LazyI18nString(send_subject) send_message = LazyI18nString(send_message) send_waitinglist_subject = LazyI18nString(send_waitinglist_subject) @@ -161,32 +163,72 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, has_subevent=True, has_other_subevent=False, has_blocked=False ) - for se in subevents: - se.log_action( - 'pretix.subevent.canceled', user=user, - ) - se.active = False - se.save(update_fields=['active']) - se.log_action( - 'pretix.subevent.changed', user=user, data={'active': False, '_source': 'cancel_event'} - ) + if not dry_run: + for se in subevents: + se.log_action( + 'pretix.subevent.canceled', user=user, + data={ + "auto_refund": auto_refund, + "keep_fee_fixed": keep_fee_fixed, + "keep_fee_per_ticket": keep_fee_per_ticket, + "keep_fee_percentage": keep_fee_percentage, + "keep_fees": keep_fees, + "manual_refund": manual_refund, + "send": send, + "send_subject": send_subject, + "send_message": send_message, + "send_waitinglist": send_waitinglist, + "send_waitinglist_subject": send_waitinglist_subject, + "send_waitinglist_message": send_waitinglist_message, + "refund_as_giftcard": refund_as_giftcard, + "giftcard_expires": str(giftcard_expires), + "giftcard_conditions": giftcard_conditions, + } + ) + se.active = False + se.save(update_fields=['active']) + se.log_action( + 'pretix.subevent.changed', user=user, data={'active': False, '_source': 'cancel_event'} + ) else: subevents = None subevent_ids = set() orders_to_change = orders_to_cancel.filter(has_blocked=True) orders_to_cancel = orders_to_cancel.filter(has_blocked=False) - event.log_action( - 'pretix.event.canceled', user=user, - ) - for i in event.items.filter(active=True): - i.active = False - i.save(update_fields=['active']) - i.log_action( - 'pretix.event.item.changed', user=user, data={'active': False, '_source': 'cancel_event'} + if not dry_run: + event.log_action( + 'pretix.event.canceled', user=user, + data={ + "auto_refund": auto_refund, + "keep_fee_fixed": keep_fee_fixed, + "keep_fee_per_ticket": keep_fee_per_ticket, + "keep_fee_percentage": keep_fee_percentage, + "keep_fees": keep_fees, + "manual_refund": manual_refund, + "send": send, + "send_subject": send_subject, + "send_message": send_message, + "send_waitinglist": send_waitinglist, + "send_waitinglist_subject": send_waitinglist_subject, + "send_waitinglist_message": send_waitinglist_message, + "refund_as_giftcard": refund_as_giftcard, + "giftcard_expires": str(giftcard_expires), + "giftcard_conditions": giftcard_conditions, + } ) + + for i in event.items.filter(active=True): + i.active = False + i.save(update_fields=['active']) + i.log_action( + 'pretix.event.item.changed', user=user, data={'active': False, '_source': 'cancel_event'} + ) failed = 0 - total = orders_to_cancel.count() + orders_to_change.count() + refund_total = Decimal("0.00") + cancel_full_total = orders_to_cancel.count() + cancel_partial_total = orders_to_change.count() + total = cancel_full_total + cancel_partial_total qs_wl = event.waitinglistentries.filter(voucher__isnull=True).select_related('subevent') if subevents: qs_wl = qs_wl.filter(subevent__in=subevents) @@ -199,6 +241,7 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, ) for o in orders_to_cancel.only('id', 'total').iterator(): + payment_refund_sum = o.payment_refund_sum # cache to avoid multiple computations try: fee = Decimal('0.00') fee_sum = Decimal('0.00') @@ -217,20 +260,24 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, for p in o.positions.all(): if p.addon_to_id is None: fee += min(p.price, Decimal(keep_fee_per_ticket)) - fee = round_decimal(min(fee, o.payment_refund_sum), event.currency) + fee = round_decimal(min(fee, payment_refund_sum), event.currency) - _cancel_order(o.pk, user, send_mail=False, cancellation_fee=fee, keep_fees=keep_fee_objects) - refund_amount = o.payment_refund_sum + if dry_run: + refund_total += max(Decimal("0.00"), min(payment_refund_sum, o.total - fee)) + else: + _cancel_order(o.pk, user, send_mail=False, cancellation_fee=fee, keep_fees=keep_fee_objects) + refund_amount = payment_refund_sum + refund_amount += refund_total - try: - if auto_refund or manual_refund: - _try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True, - source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard, - giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions, - comment=gettext('Event canceled')) - finally: - if send: - _send_mail(o, send_subject, send_message, subevent, refund_amount, user, o.positions.all()) + try: + if auto_refund or manual_refund: + _try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True, + source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard, + giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions, + comment=gettext('Event canceled')) + finally: + if send: + _send_mail(o, send_subject, send_message, subevent, refund_amount, user, o.positions.all()) counter += 1 if not self.request.called_directly and counter % max(10, total // 100) == 0: @@ -247,12 +294,16 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, for o in orders_to_change.values_list('id', flat=True).iterator(): with transaction.atomic(): - o = event.orders.select_for_update(of=OF_SELF).get(pk=o) + if dry_run: + o = event.orders.get(pk=o) + else: + o = event.orders.select_for_update(of=OF_SELF).get(pk=o) total = Decimal('0.00') fee = Decimal('0.00') positions = [] ocm = OrderChangeManager(o, user=user, notify=False) + payment_refund_sum = o.payment_refund_sum # cache to avoid multiple computations for p in o.positions.all(): if (not event.has_subevents or p.subevent_id in subevent_ids) and not p.blocked: total += p.price @@ -267,7 +318,7 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, fee += Decimal(keep_fee_fixed) if keep_fee_percentage: fee += Decimal(keep_fee_percentage) / Decimal('100.00') * total - fee = round_decimal(min(fee, o.payment_refund_sum), event.currency) + fee = round_decimal(min(fee, payment_refund_sum), event.currency) if fee: tax_rule_zero = TaxRule.zero() if event.settings.tax_rule_cancellation == "default": @@ -298,17 +349,21 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, ) ocm.add_fee(f) - ocm.commit() - refund_amount = o.payment_refund_sum - o.total + if dry_run: + refund_total += max(payment_refund_sum - (o.total + ocm._totaldiff), Decimal("0.00")) + else: + ocm.commit() + refund_amount = payment_refund_sum - o.total + refund_total += refund_amount - if auto_refund or manual_refund: - _try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True, - source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard, - giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions, - comment=gettext('Event canceled')) + if auto_refund or manual_refund: + _try_auto_refund(o.pk, auto_refund=auto_refund, manual_refund=manual_refund, allow_partial=True, + source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard, + giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions, + comment=gettext('Event canceled')) - if send: - _send_mail(o, send_subject, send_message, subevent, refund_amount, user, positions) + if send: + _send_mail(o, send_subject, send_message, subevent, refund_amount, user, positions) counter += 1 if not self.request.called_directly and counter % max(10, total // 100) == 0: @@ -319,7 +374,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, if send_waitinglist: for wle in qs_wl: - _send_wle_mail(wle, send_waitinglist_subject, send_waitinglist_message, wle.subevent) + if not dry_run: + _send_wle_mail(wle, send_waitinglist_subject, send_waitinglist_message, wle.subevent) counter += 1 if not self.request.called_directly and counter % max(10, total // 100) == 0: @@ -327,4 +383,30 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, state='PROGRESS', meta={'value': round(counter / total * 100 if total else 0, 2)} ) - return failed + + confirmation_code = None + if dry_run and user and refund_total > Decimal('100.00'): + confirmation_code = get_random_string(8, allowed_chars="01234567890") + mail( + user.email, + subject=gettext('Bulk-refund confirmation'), + template='pretixbase/email/cancel_confirm.txt', + context={ + "event": str(event), + "amount": money_filter(refund_total, event.currency), + "confirmation_code": confirmation_code, + }, + locale=user.locale, + ) + + return { + "dry_run": dry_run, + "id": self.request.id, + "failed": failed, + "refund_total": refund_total, + "cancel_full_total": cancel_full_total, + "cancel_partial_total": cancel_partial_total, + "confirmation_code": confirmation_code, + "args": self.request.args, + "kwargs": self.request.kwargs, + } diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 3b256bd62..efffda374 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/checkin.py b/src/pretix/base/services/checkin.py index 7c2e6237f..ecf4cf7a9 100644 --- a/src/pretix/base/services/checkin.py +++ b/src/pretix/base/services/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/cleanup.py b/src/pretix/base/services/cleanup.py index 9190b0ab2..6667b2c3f 100644 --- a/src/pretix/base/services/cleanup.py +++ b/src/pretix/base/services/cleanup.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/cross_selling.py b/src/pretix/base/services/cross_selling.py index fe48d1e01..0a234dd8b 100644 --- a/src/pretix/base/services/cross_selling.py +++ b/src/pretix/base/services/cross_selling.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/currencies.py b/src/pretix/base/services/currencies.py index ad0464c49..620f88b12 100644 --- a/src/pretix/base/services/currencies.py +++ b/src/pretix/base/services/currencies.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/datasync.py b/src/pretix/base/services/datasync.py index c4d48da7e..f98d7514e 100644 --- a/src/pretix/base/services/datasync.py +++ b/src/pretix/base/services/datasync.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -32,6 +32,7 @@ from django_scopes import scope, scopes_disabled from pretix.base.datasync.datasync import datasync_providers from pretix.base.models.datasync import OrderSyncQueue +from pretix.base.services.tasks import TransactionAwareTask from pretix.base.signals import periodic_task from pretix.celery_app import app @@ -89,7 +90,7 @@ def sync_all(): run_sync(queue) -@app.task() +@app.task(base=TransactionAwareTask) def sync_single(queue_item_id: int): with scopes_disabled(): queue = ( diff --git a/src/pretix/base/services/export.py b/src/pretix/base/services/export.py index ee076cd8d..c1fbe0664 100644 --- a/src/pretix/base/services/export.py +++ b/src/pretix/base/services/export.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -49,7 +49,7 @@ from pretix.base.signals import ( periodic_task, register_data_exporters, register_multievent_data_exporters, ) from pretix.celery_app import app -from pretix.helpers import OF_SELF +from pretix.helpers import OF_SELF, repeatable_reads_transaction from pretix.helpers.urls import build_absolute_uri logger = logging.getLogger(__name__) @@ -80,7 +80,12 @@ def export(self, event: Event, fileid: str, provider: str, form_data: Dict[str, continue ex = response(event, event.organizer, set_progress) if ex.identifier == provider: - d = ex.render(form_data) + if ex.repeatable_read: + with repeatable_reads_transaction(): + d = ex.render(form_data) + else: + d = ex.render(form_data) + if d is None: raise ExportError( gettext('Your export did not contain any data.') @@ -151,7 +156,11 @@ def multiexport(self, organizer: Organizer, user: User, device: int, token: int, gettext('You do not have sufficient permission to perform this export.') ) - d = ex.render(form_data) + if ex.repeatable_read: + with repeatable_reads_transaction(): + d = ex.render(form_data) + else: + d = ex.render(form_data) if d is None: raise ExportError( gettext('Your export did not contain any data.') @@ -209,7 +218,11 @@ def _run_scheduled_export(schedule, context: Union[Event, Organizer], exporter, try: if not exporter: raise ExportError("Export type not found.") - d = exporter.render(schedule.export_form_data) + if exporter.repeatable_read: + with repeatable_reads_transaction(): + d = exporter.render(schedule.export_form_data) + else: + d = exporter.render(schedule.export_form_data) if d is None: raise ExportEmptyError( gettext('Your export did not contain any data.') diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index bbc7438dd..704ea90da 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -61,7 +61,9 @@ from pretix.base.models.tax import EU_CURRENCIES from pretix.base.services.tasks import ( TransactionAwareProfiledEventTask, TransactionAwareTask, ) -from pretix.base.signals import invoice_line_text, periodic_task +from pretix.base.signals import ( + build_invoice_data, invoice_line_text, periodic_task, +) from pretix.celery_app import app from pretix.helpers.database import OF_SELF, rolledback_transaction from pretix.helpers.models import modelcopy @@ -82,6 +84,10 @@ def build_invoice(invoice: Invoice) -> Invoice: lp = invoice.order.payments.last() + min_period_start = None + max_period_end = None + now_dt = now() + with (language(invoice.locale, invoice.event.settings.region)): invoice.invoice_from = invoice.event.settings.get('invoice_address_from') invoice.invoice_from_name = invoice.event.settings.get('invoice_address_from_name') @@ -208,7 +214,9 @@ def build_invoice(invoice: Invoice) -> Invoice: positions = list( invoice.order.positions.select_related('addon_to', 'item', 'tax_rule', 'subevent', 'variation').annotate( addon_c=Count('addons') - ).prefetch_related('answers', 'answers__options', 'answers__question').order_by('positionid', 'id') + ).prefetch_related( + 'answers', 'answers__options', 'answers__question', 'granted_memberships', + ).order_by('positionid', 'id') ) reverse_charge = False @@ -267,6 +275,10 @@ def build_invoice(invoice: Invoice) -> Invoice: location=_location_oneliner(location) ) + period_start, period_end = _service_period_for_position(invoice, p, now_dt) + min_period_start = min(min_period_start or period_start, period_start) + max_period_end = min(max_period_end or period_end, period_end) + InvoiceLine.objects.create( position=i, invoice=invoice, @@ -277,8 +289,8 @@ def build_invoice(invoice: Invoice) -> Invoice: item=p.item, variation=p.variation, attendee_name=p.attendee_name if invoice.event.settings.invoice_attendee_name else None, - event_date_from=p.subevent.date_from if invoice.event.has_subevents else invoice.event.date_from, - event_date_to=p.subevent.date_to if invoice.event.has_subevents else invoice.event.date_to, + period_start=period_start, + period_end=period_end, event_location=location if invoice.event.settings.invoice_event_location else None, tax_rate=p.tax_rate, tax_code=p.tax_code, @@ -301,13 +313,29 @@ def build_invoice(invoice: Invoice) -> Invoice: fee_title = _(fee.get_fee_type_display()) if fee.description: fee_title += " - " + fee.description + + if min_period_start and max_period_end: + # Consider fees to have the same service period as the products sold + period_start = min_period_start + period_end = max_period_end + else: + # Usually can only happen if everything except a cancellation fee is removed + if invoice.event.settings.invoice_period in ("auto", "auto_no_event", "event_date") and not invoice.event.has_subevents: + # Non-series event, let's be backwards-compatible and tag everything with the event period + period_start = invoice.event.date_from + period_end = invoice.event.date_to + else: + # We could try to work from the canceled positions, but it doesn't really make sense. A cancellation + # fee is not "delivered" at the event date, it is rather effective right now. + period_start = period_end = now() + InvoiceLine.objects.create( position=i + offset, invoice=invoice, description=fee_title, gross_value=fee.value, - event_date_from=None if invoice.event.has_subevents else invoice.event.date_from, - event_date_to=None if invoice.event.has_subevents else invoice.event.date_to, + period_start=period_start, + period_end=period_end, event_location=( None if invoice.event.has_subevents else (str(invoice.event.location) @@ -336,6 +364,7 @@ def build_invoice(invoice: Invoice) -> Invoice: invoice.reverse_charge = reverse_charge invoice.save() + build_invoice_data.send(sender=invoice.event, invoice=invoice) return invoice @@ -348,9 +377,60 @@ def build_cancellation(invoice: Invoice): line.gross_value *= -1 line.tax_value *= -1 line.save() + + build_invoice_data.send(sender=invoice.event, invoice=invoice) return invoice +def _service_period_for_position(invoice, position, invoice_dt): + if invoice.event.settings.invoice_period in ("auto", "auto_no_event"): + if position.valid_from and position.valid_until: + period_start = position.valid_from + period_end = position.valid_until + elif position.valid_from: + period_start = position.valid_from + period_end = position.valid_from # weird, but we have nothing else to base this on + elif position.valid_until: + period_start = min(invoice.order.datetime, position.valid_until) + period_end = position.valid_until + elif memberships := list(position.granted_memberships.all()): + period_start = min(m.date_start for m in memberships) + period_end = max(m.date_end for m in memberships) + elif invoice.event.has_subevents: + if position.subevent: + period_start = position.subevent.date_from + period_end = position.subevent.date_to + else: + # Currently impossible case, but might not be in the future and never makes + # sense to use the event date here + period_start = invoice_dt + period_end = invoice_dt + elif invoice.event.settings.invoice_period == "auto_no_event": + period_start = invoice_dt + period_end = invoice_dt + else: + period_start = invoice.event.date_from + period_end = invoice.event.date_to + elif invoice.event.settings.invoice_period == "order_date": + period_start = invoice.order.datetime + period_end = invoice.order.datetime + elif invoice.event.settings.invoice_period == "event_date": + if position.subevent: + period_start = position.subevent.date_from + period_end = position.subevent.date_to + else: + period_start = invoice.event.date_from + period_end = invoice.event.date_to + elif invoice.event.settings.invoice_period == "invoice_date": + period_start = period_end = invoice_dt + else: + raise ValueError(f"Invalid invoice period setting '{invoice.event.settings.invoice_period}'") + + if not period_end: + period_end = period_start + return period_start, period_end + + def generate_cancellation(invoice: Invoice, trigger_pdf=True): if invoice.canceled: raise ValueError("Invoice should not be canceled twice.") @@ -456,6 +536,12 @@ def build_preview_invoice_pdf(event): if not locale or locale == '__user__': locale = event.settings.locale + if event.settings.invoice_period in ("auto", "auto_no_event", "event_date"): + period_start = event.date_from + period_end = event.date_to or event.date_from + else: + period_start = period_end = timezone.now() + with rolledback_transaction(), language(locale, event.settings.region): order = event.orders.create( status=Order.STATUS_PENDING, datetime=timezone.now(), @@ -506,8 +592,8 @@ def build_preview_invoice_pdf(event): invoice=invoice, description=_("Sample product {}").format(i + 1), gross_value=tax.gross, tax_value=tax.tax, tax_rate=tax.rate, tax_name=tax.name, tax_code=tax.code, - event_date_from=event.date_from, - event_date_to=event.date_to, + period_start=period_start, + period_end=period_end, event_location=event.settings.invoice_event_location, ) else: @@ -515,8 +601,8 @@ def build_preview_invoice_pdf(event): InvoiceLine.objects.create( invoice=invoice, description=_("Sample product A"), gross_value=100, tax_value=0, tax_rate=0, tax_code=None, - event_date_from=event.date_from, - event_date_to=event.date_to, + period_start=period_start, + period_end=period_end, event_location=event.settings.invoice_event_location, ) @@ -587,6 +673,7 @@ def send_invoices_to_organizer(sender, **kwargs): event=i.event, invoices=[i], auto_email=True, + plain_text_only=True, ) i.sent_to_organizer = True else: diff --git a/src/pretix/base/services/locking.py b/src/pretix/base/services/locking.py index 08237c42c..ee666c335 100644 --- a/src/pretix/base/services/locking.py +++ b/src/pretix/base/services/locking.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index 3c614941f..03bd489e7 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -470,9 +470,11 @@ def mail_send_task(self, *args, to: List[str], subject: str, body: str, html: st logger.exception('Could not attach invoice to email') pass - if attach_size < settings.FILE_UPLOAD_MAX_SIZE_EMAIL_ATTACHMENT - 1: + if attach_size * 1.37 < settings.FILE_UPLOAD_MAX_SIZE_EMAIL_ATTACHMENT - 1024 * 1024: # Do not attach more than (limit - 1 MB) in tickets (1MB space for invoice, email itself, …), # it will bounce way to often. + # 1 MB is the buffer for the rest of the email (text, invoice, calendar, pictures) + # 1.37 is the factor for base64 encoding https://en.wikipedia.org/wiki/Base64 for a in args: try: email.attach(*a) diff --git a/src/pretix/base/services/media.py b/src/pretix/base/services/media.py index 787b009fc..c431e79ae 100644 --- a/src/pretix/base/services/media.py +++ b/src/pretix/base/services/media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/memberships.py b/src/pretix/base/services/memberships.py index fc52d76cc..fb2efbe71 100644 --- a/src/pretix/base/services/memberships.py +++ b/src/pretix/base/services/memberships.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/modelimport.py b/src/pretix/base/services/modelimport.py index 4c37a6c99..3ef774b70 100644 --- a/src/pretix/base/services/modelimport.py +++ b/src/pretix/base/services/modelimport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -19,6 +19,7 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # +import logging from decimal import Decimal from typing import List @@ -33,8 +34,8 @@ from pretix.base.modelimport import DataImportError, ImportColumn, parse_csv from pretix.base.modelimport_orders import get_order_import_columns from pretix.base.modelimport_vouchers import get_voucher_import_columns from pretix.base.models import ( - CachedFile, Event, InvoiceAddress, Order, OrderPayment, OrderPosition, - User, Voucher, + CachedFile, Event, InvoiceAddress, LogEntry, Order, OrderPayment, + OrderPosition, User, Voucher, ) from pretix.base.models.orders import Transaction from pretix.base.services.invoices import generate_invoice, invoice_qualified @@ -43,6 +44,8 @@ from pretix.base.services.tasks import ProfiledEventTask from pretix.base.signals import order_paid, order_placed from pretix.celery_app import app +logger = logging.getLogger(__name__) + def _validate(cf: CachedFile, charset: str, cols: List[ImportColumn], settings: dict): try: @@ -175,6 +178,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user, raise DataImportError(_('The seat you selected has already been taken. Please select a different seat.')) save_transactions = [] + save_logentries = [] for o in orders: o.total = sum([c.price for c in o._positions]) # currently no support for fees if o.total == Decimal('0.00'): @@ -211,17 +215,19 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user, o._address.save() for c in cols: c.save(o) - o.log_action( + save_logentries.append(o.log_action( 'pretix.event.order.placed', user=user, - data={'source': 'import'} - ) + data={'source': 'import'}, + save=False, + )) save_transactions += o.create_transactions(is_new=True, fees=[], positions=o._positions, save=False) Transaction.objects.bulk_create(save_transactions) + LogEntry.bulk_create_and_postprocess(save_logentries) for o in orders: with language(o.locale, event.settings.region): - order_placed.send(event, order=o) + order_placed.send(event, order=o, bulk=True) if o.status == Order.STATUS_PAID: order_paid.send(event, order=o) @@ -230,7 +236,13 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user, (event.settings.get('invoice_generate') == 'paid' and o.status == Order.STATUS_PAID) ) and not o.invoices.last() if gen_invoice: - generate_invoice(o, trigger_pdf=True) + try: + generate_invoice(o, trigger_pdf=True) + except Exception as e: + logger.exception("Could not generate invoice.") + o.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) except DataImportError: raise ValidationError(_('We were not able to process your request completely as the server was too busy. ' 'Please try again.')) @@ -286,13 +298,16 @@ def import_vouchers(event: Event, fileid: str, settings: dict, locale: str, user raise DataImportError( _('The seat you selected has already been taken. Please select a different seat.')) + save_logentries = [] for v in vouchers: v.save() - v.log_action( + save_logentries.append(v.log_action( 'pretix.voucher.added', user=user, - data={'source': 'import'} - ) + data={'source': 'import'}, + save=False, + )) for c in cols: c.save(v) + LogEntry.bulk_create_and_postprocess(save_logentries) cf.delete() diff --git a/src/pretix/base/services/notifications.py b/src/pretix/base/services/notifications.py index 0680482f2..357ad8fc6 100644 --- a/src/pretix/base/services/notifications.py +++ b/src/pretix/base/services/notifications.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -41,7 +41,11 @@ def notify(logentry_ids: list): if not isinstance(logentry_ids, list): logentry_ids = [logentry_ids] - qs = LogEntry.all.select_related('event', 'event__organizer').filter(id__in=logentry_ids) + qs = LogEntry.all.select_related( + 'event', 'event__organizer' + ).order_by( + 'action_type', 'event_id', + ).filter(id__in=logentry_ids) _event, _at, notify_specific, notify_global = None, None, None, None for logentry in qs: diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 319084816..bfe817d0f 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -264,7 +264,13 @@ def reactivate_order(order: Order, force: bool=False, user: User=None, auth=None num_invoices = order.invoices.filter(is_cancellation=False).count() if num_invoices > 0 and order.invoices.filter(is_cancellation=True).count() >= num_invoices and invoice_qualified(order): - generate_invoice(order) + try: + generate_invoice(order) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) def extend_order(order: Order, new_date: datetime, force: bool=False, valid_if_pending: bool=None, user: User=None, auth=None): @@ -312,7 +318,13 @@ def extend_order(order: Order, new_date: datetime, force: bool=False, valid_if_p if was_expired: num_invoices = order.invoices.filter(is_cancellation=False).count() if num_invoices > 0 and order.invoices.filter(is_cancellation=True).count() >= num_invoices and invoice_qualified(order): - generate_invoice(order) + try: + generate_invoice(order) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) order.create_transactions() with transaction.atomic(): @@ -397,13 +409,19 @@ def approve_order(order, user=None, send_mail: bool=True, auth=None, force=False if order.event.settings.get('invoice_generate') == 'True' and invoice_qualified(order): if not invoice: - invoice = generate_invoice( - order, - # send_mail will trigger PDF generation later - trigger_pdf=not transmit_invoice_mail - ) - if transmit_invoice_task: - transmit_invoice.apply_async(args=(order.event_id, invoice.pk, False)) + try: + invoice = generate_invoice( + order, + # send_mail will trigger PDF generation later + trigger_pdf=not transmit_invoice_mail + ) + if transmit_invoice_task: + transmit_invoice.apply_async(args=(order.event_id, invoice.pk, False)) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) if send_mail: with language(order.locale, order.event.settings.region): @@ -608,7 +626,13 @@ def _cancel_order(order, user=None, send_mail: bool=True, api_token=None, device order.save(update_fields=['status', 'cancellation_date', 'total']) if cancel_invoice and i: - invoices.append(generate_invoice(order)) + try: + invoices.append(generate_invoice(order)) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) else: order.status = Order.STATUS_CANCELED order.cancellation_date = now() @@ -1091,7 +1115,7 @@ def _create_order(event: Event, *, email: str, positions: List[CartPosition], no for msg in meta_info.get('confirm_messages', []): order.log_action('pretix.event.order.consent', data={'msg': msg}) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) return order, payments @@ -1306,13 +1330,19 @@ def _perform_order(event: Event, payment_requests: List[dict], position_ids: Lis ) ) if invoice_required: - invoice = generate_invoice( - order, - # send_mail will trigger PDF generation later - trigger_pdf=not transmit_invoice_mail - ) - if transmit_invoice_task: - transmit_invoice.apply_async(args=(event.pk, invoice.pk, False)) + try: + invoice = generate_invoice( + order, + # send_mail will trigger PDF generation later + trigger_pdf=not transmit_invoice_mail + ) + if transmit_invoice_task: + transmit_invoice.apply_async(args=(event.pk, invoice.pk, False)) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) if order.email: if order.require_approval: @@ -2701,7 +2731,13 @@ class OrderChangeManager: ) if split_order.total != Decimal('0.00') and self.order.invoices.filter(is_cancellation=False).last(): - generate_invoice(split_order) + try: + generate_invoice(split_order) + except Exception as e: + logger.exception("Could not generate invoice.") + split_order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) order_split.send(sender=self.order.event, original=self.order, split_order=split_order) return split_order @@ -2812,20 +2848,32 @@ class OrderChangeManager: if order_now_qualified: if invoice_should_be_generated_now: - if i and not i.canceled: - self._invoices.append(generate_cancellation(i)) - self._invoices.append(generate_invoice(self.order)) + try: + if i and not i.canceled: + self._invoices.append(generate_cancellation(i)) + self._invoices.append(generate_invoice(self.order)) + except Exception as e: + logger.exception("Could not generate invoice.") + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) elif invoice_should_be_generated_later: self.order.invoice_dirty = True self.order.save(update_fields=["invoice_dirty"]) else: - if i and not i.canceled: - self._invoices.append(generate_cancellation(i)) + try: + if i and not i.canceled: + self._invoices.append(generate_cancellation(i)) + except Exception as e: + logger.exception("Could not generate invoice.") + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) def _check_complete_cancel(self): current = self.order.positions.count() cancels = sum([ - 1 + o.position.addons.count() for o in self._operations if isinstance(o, self.CancelOperation) + 1 + o.position.addons.filter(canceled=False).count() for o in self._operations if isinstance(o, self.CancelOperation) ]) + len([ o for o in self._operations if isinstance(o, self.SplitOperation) ]) @@ -3039,6 +3087,7 @@ def _try_auto_refund(order, auto_refund=True, manual_refund=False, allow_partial expires=order.event.organizer.default_gift_card_expiry if giftcard_expires is _unset else giftcard_expires, conditions=giftcard_conditions, currency=order.event.currency, + customer=order.customer, testmode=order.testmode ) giftcard.log_action('pretix.giftcards.created', data={}) @@ -3246,8 +3295,14 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay has_active_invoice = i and not i.canceled if has_active_invoice and order.total != oldtotal: - generate_cancellation(i) - generate_invoice(order) + try: + generate_cancellation(i) + generate_invoice(order) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) new_invoice_created = True elif (not has_active_invoice or order.invoice_dirty) and invoice_qualified(order): @@ -3255,13 +3310,19 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay order.event.settings.get('invoice_generate') == 'paid' and new_payment.payment_provider.requires_invoice_immediately ): - if has_active_invoice: - generate_cancellation(i) - i = generate_invoice(order) - new_invoice_created = True - order.log_action('pretix.event.order.invoice.generated', data={ - 'invoice': i.pk - }) + try: + if has_active_invoice: + generate_cancellation(i) + i = generate_invoice(order) + new_invoice_created = True + order.log_action('pretix.event.order.invoice.generated', data={ + 'invoice': i.pk + }) + except Exception as e: + logger.exception("Could not generate invoice.") + order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) order.create_transactions() return old_fee, new_fee, fee, new_payment, new_invoice_created diff --git a/src/pretix/base/services/placeholders.py b/src/pretix/base/services/placeholders.py index 53fc2918f..c4cdc03c3 100644 --- a/src/pretix/base/services/placeholders.py +++ b/src/pretix/base/services/placeholders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/pricing.py b/src/pretix/base/services/pricing.py index ac6b1a13e..5ac9dbea4 100644 --- a/src/pretix/base/services/pricing.py +++ b/src/pretix/base/services/pricing.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/quotas.py b/src/pretix/base/services/quotas.py index 4511309e7..124e90e39 100644 --- a/src/pretix/base/services/quotas.py +++ b/src/pretix/base/services/quotas.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -26,7 +26,7 @@ from itertools import zip_longest import django_redis from django.conf import settings -from django.db import models +from django.db import connection, models from django.db.models import ( Case, Count, F, Func, Max, OuterRef, Q, Subquery, Sum, Value, When, prefetch_related_objects, @@ -64,7 +64,8 @@ class QuotaAvailability: * count_cart (dict mapping quotas to ints) """ - def __init__(self, count_waitinglist=True, ignore_closed=False, full_results=False, early_out=True): + def __init__(self, count_waitinglist=True, ignore_closed=False, full_results=False, early_out=True, + allow_repeatable_read=False): """ Initialize a new quota availability calculator @@ -86,6 +87,8 @@ class QuotaAvailability: keep the database-level quota cache up to date so backend overviews render quickly. If you do not care about keeping the cache up to date, you can set this to ``False`` for further performance improvements. + + :param allow_repeatable_read: Allow to run this even in REPEATABLE READ mode, generally not advised. """ self._queue = [] self._count_waitinglist = count_waitinglist @@ -95,6 +98,7 @@ class QuotaAvailability: self._var_to_quotas = defaultdict(set) self._early_out = early_out self._quota_objects = {} + self._allow_repeatable_read = allow_repeatable_read self.results = {} self.count_paid_orders = defaultdict(int) self.count_pending_orders = defaultdict(int) @@ -119,6 +123,10 @@ class QuotaAvailability: Compute the queued quotas. If ``allow_cache`` is set, results may also be taken from a cache that might be a few minutes outdated. In this case, you may not rely on the results in the ``count_*`` properties. """ + if not self._allow_repeatable_read and getattr(connection, "tx_in_repeatable_read", False): + raise ValueError("You cannot compute quotas in REPEATABLE READ mode unless you explicitly opted in to " + "do so.") + now_dt = now_dt or now() quota_ids_set = {q.id for q in self._queue} if not quota_ids_set: diff --git a/src/pretix/base/services/seating.py b/src/pretix/base/services/seating.py index 8408f3ee2..5a76f9fca 100644 --- a/src/pretix/base/services/seating.py +++ b/src/pretix/base/services/seating.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/shredder.py b/src/pretix/base/services/shredder.py index 0411e6fa8..84ef4eee0 100644 --- a/src/pretix/base/services/shredder.py +++ b/src/pretix/base/services/shredder.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/stats.py b/src/pretix/base/services/stats.py index 79e86afe0..eef5ac465 100644 --- a/src/pretix/base/services/stats.py +++ b/src/pretix/base/services/stats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/tasks.py b/src/pretix/base/services/tasks.py index 56673c4fa..fa315b463 100644 --- a/src/pretix/base/services/tasks.py +++ b/src/pretix/base/services/tasks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index e4eb37a10..781374c56 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/tickets.py b/src/pretix/base/services/tickets.py index b0244253e..fc50e7968 100644 --- a/src/pretix/base/services/tickets.py +++ b/src/pretix/base/services/tickets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/update_check.py b/src/pretix/base/services/update_check.py index 1f7b93b4d..5a23b3388 100644 --- a/src/pretix/base/services/update_check.py +++ b/src/pretix/base/services/update_check.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/vouchers.py b/src/pretix/base/services/vouchers.py index d0cbb9d68..452dfbaa8 100644 --- a/src/pretix/base/services/vouchers.py +++ b/src/pretix/base/services/vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/services/waitinglist.py b/src/pretix/base/services/waitinglist.py index 59e912a9f..238212ea0 100644 --- a/src/pretix/base/services/waitinglist.py +++ b/src/pretix/base/services/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index fbc52b31a..3bf4ead9e 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1098,6 +1098,35 @@ DEFAULTS = { help_text=_("Invoices will never be automatically generated for free orders.") ) }, + 'invoice_period': { + 'default': 'auto', + 'type': str, + 'form_class': forms.ChoiceField, + 'serializer_class': serializers.ChoiceField, + 'serializer_kwargs': dict( + choices=( + ('auto', _('Automatic based on ticket-specific validity, membership validity, event series date, or event date')), + ('auto_no_event', _('Automatic, but prefer invoice date over event date')), + ('event_date', _('Event date')), + ('order_date', _('Order date')), + ('invoice_date', _('Invoice date')), + ), + ), + 'form_kwargs': dict( + label=_("Date of service"), + widget=forms.RadioSelect, + choices=( + ('auto', _('Automatic based on ticket-specific validity, membership validity, event series date, or event date')), + ('auto_no_event', _('Automatic, but prefer invoice date over event date')), + ('event_date', _('Event date')), + ('order_date', _('Order date')), + ('invoice_date', _('Invoice date')), + ), + help_text=_("This controls what dates are shown on the invoice, but is especially important for " + "electronic invoicing."), + required=True, + ) + }, 'invoice_reissue_after_modify': { 'default': 'False', 'type': bool, diff --git a/src/pretix/base/shredder.py b/src/pretix/base/shredder.py index b1d22a014..a8110e987 100644 --- a/src/pretix/base/shredder.py +++ b/src/pretix/base/shredder.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/signals.py b/src/pretix/base/signals.py index 8e1842200..3ab54bf0e 100644 --- a/src/pretix/base/signals.py +++ b/src/pretix/base/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -170,7 +170,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal): second receiver and so on. The return value of the last receiver is returned by this method. """ if sender and not isinstance(sender, self.type): - raise ValueError("Sender needs to be an event.") + raise ValueError(f"Sender needs to be of type {self.type}.") response = named.get(chain_kwarg_name) if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS: @@ -192,7 +192,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal): stopping the response chain at the offending receiver. """ if sender and not isinstance(sender, self.type): - raise ValueError("Sender needs to be an event.") + raise ValueError(f"Sender needs to be of type {self.type}.") responses = [] if ( @@ -596,6 +596,18 @@ multiple events. Receivers should return a subclass of pretix.base.exporter.Base The ``sender`` keyword argument will contain an organizer. """ +build_invoice_data = EventPluginSignal() +""" +Arguments: ``invoice`` + +This signal is sent out every time an invoice is built, after the invoice model was created +and filled and before the PDF generation task is started. You can use this to make changes +to the invoice, but we recommend to mostly use it to add content to ``Invoice.plugin_data``. +You are responsible for saving any changes to the database. + +As with all event-plugin signals, the ``sender`` keyword argument will contain the event. +""" + validate_order = EventPluginSignal() """ Arguments: ``payments``, ``positions``, ``email``, ``locale``, ``invoice_address``, @@ -653,12 +665,13 @@ As with all event-plugin signals, the ``sender`` keyword argument will contain t order_placed = EventPluginSignal() """ -Arguments: ``order`` +Arguments: ``order``, ``bulk`` This signal is sent out every time an order is placed. The order object is given -as the first argument. This signal is *not* sent out if an order is created through -splitting an existing order, so you can not expect to see all orders by listening -to this signal. +as the first argument. The ``bulk`` argument specifies whether the order was placed +as part of a bulk action, e.g. an import from a file. +This signal is *not* sent out if an order is created through splitting an existing order, +so you can not expect to see all orders by listening to this signal. As with all event-plugin signals, the ``sender`` keyword argument will contain the event. """ diff --git a/src/pretix/base/templates/error.html b/src/pretix/base/templates/error.html index ad1e120a7..790f80d15 100644 --- a/src/pretix/base/templates/error.html +++ b/src/pretix/base/templates/error.html @@ -11,6 +11,7 @@ + {% block custom_header %}{% endblock %}
diff --git a/src/pretix/base/templates/pretixbase/email/base.html b/src/pretix/base/templates/pretixbase/email/base.html index 43a14a5d9..e8375118d 100644 --- a/src/pretix/base/templates/pretixbase/email/base.html +++ b/src/pretix/base/templates/pretixbase/email/base.html @@ -174,6 +174,12 @@ .order-details > thead > tr > td:first-child { width: 20%; } + .order-details, .cart-table { + border-spacing: 0; + } + .order-details td:first-child, .cart-table td:first-child { + padding-left: 0; + } .order-details td { font-size: 12px; } diff --git a/src/pretix/base/templates/pretixbase/email/cancel_confirm.txt b/src/pretix/base/templates/pretixbase/email/cancel_confirm.txt new file mode 100644 index 000000000..5e3043156 --- /dev/null +++ b/src/pretix/base/templates/pretixbase/email/cancel_confirm.txt @@ -0,0 +1,10 @@ +{% load i18n %} +{% trans "You have requested us to cancel an event which includes a larger bulk-refund:" %} + +{% trans "Event" %}: {{ event }} + +{% trans "Estimated refund amount" %}: **{{ amount }}** + +{% trans "Please confirm that you want to proceed by coping the following confirmation code into the cancellation form:" %} + +**{{ confirmation_code }}** diff --git a/src/pretix/base/templates/pretixbase/email/order_details.html b/src/pretix/base/templates/pretixbase/email/order_details.html index 4824cd9fe..e3c0a0a82 100644 --- a/src/pretix/base/templates/pretixbase/email/order_details.html +++ b/src/pretix/base/templates/pretixbase/email/order_details.html @@ -51,42 +51,46 @@
{% else %}
- {% trans "You are receiving this email because you placed an order for the following event:" %} + {% blocktrans trimmed with event=event.name %} + You are receiving this email because you placed an order for {{ event }}. + {% endblocktrans %}
- - - - + {% if not event.has_subevents and event.settings.show_dates_on_frontpage %} + + + + + {% endif %} + {% if not event.has_subevents and event.location %} + + + + + {% endif %} {% if cart %}
- {% trans "Event:" %} - - {{ event.name }} - {% if not event.has_subevents %} - {% if event.settings.show_dates_on_frontpage %} -
- {{ event.get_date_range_display }} - {% if event.settings.show_times %} - {{ event.date_from|date:"TIME_FORMAT" }} - {% endif %} - {% endif %} - {% if event.location %} -
- {{ event.location|oneline }} - {% endif %} - {% endif %} -
- {% trans "Order code:" %} + {% trans "Order code" %}: {{ order.code }} ({{ order.datetime|date:"SHORT_DATE_FORMAT" }})
+ {% trans "Date" %}: + + {{ event.get_date_range_display }} + {% if event.settings.show_times %} + {{ event.date_from|date:"TIME_FORMAT" }} + {% endif %} +
+ {% trans "Location" %}: + + {{ event.location|oneline }} +
- {% trans "Details:" %} + {% trans "Details" %}: @@ -129,7 +133,7 @@ {% endif %}
- {% trans "Contact:" %} + {% trans "Contact" %}: {{ event.organizer }} diff --git a/src/pretix/base/templates/pretixbase/email/simple_logo.html b/src/pretix/base/templates/pretixbase/email/simple_logo.html index df8902c77..676cae5cd 100644 --- a/src/pretix/base/templates/pretixbase/email/simple_logo.html +++ b/src/pretix/base/templates/pretixbase/email/simple_logo.html @@ -197,6 +197,12 @@ .order-details > thead > tr > td:first-child { width: 20%; } + .order-details, .cart-table { + border-spacing: 0; + } + .order-details td:first-child, .cart-table td:first-child { + padding-left: 0; + } .order-details td { font-size: 12px; } diff --git a/src/pretix/base/templatetags/__init__.py b/src/pretix/base/templatetags/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/templatetags/__init__.py +++ b/src/pretix/base/templatetags/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/cache_large.py b/src/pretix/base/templatetags/cache_large.py index b3e9b7dd4..4bdce26df 100644 --- a/src/pretix/base/templatetags/cache_large.py +++ b/src/pretix/base/templatetags/cache_large.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/calendarhead.py b/src/pretix/base/templatetags/calendarhead.py index 912e2a600..f30b274f1 100644 --- a/src/pretix/base/templatetags/calendarhead.py +++ b/src/pretix/base/templatetags/calendarhead.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/classname.py b/src/pretix/base/templatetags/classname.py index 1bc239e9b..66cd1dfb9 100644 --- a/src/pretix/base/templatetags/classname.py +++ b/src/pretix/base/templatetags/classname.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/daterange.py b/src/pretix/base/templatetags/daterange.py index e51bd517d..a7e6a19bf 100644 --- a/src/pretix/base/templatetags/daterange.py +++ b/src/pretix/base/templatetags/daterange.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/dialog.py b/src/pretix/base/templatetags/dialog.py index 0cc422455..b67725f82 100644 --- a/src/pretix/base/templatetags/dialog.py +++ b/src/pretix/base/templatetags/dialog.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/escapejson.py b/src/pretix/base/templatetags/escapejson.py index 89b25bf11..abada8654 100644 --- a/src/pretix/base/templatetags/escapejson.py +++ b/src/pretix/base/templatetags/escapejson.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/eventsignal.py b/src/pretix/base/templatetags/eventsignal.py index 4a4fb1e62..54f2da5df 100644 --- a/src/pretix/base/templatetags/eventsignal.py +++ b/src/pretix/base/templatetags/eventsignal.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/icon.py b/src/pretix/base/templatetags/icon.py index d71319b01..dc10406cd 100644 --- a/src/pretix/base/templatetags/icon.py +++ b/src/pretix/base/templatetags/icon.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/lists.py b/src/pretix/base/templatetags/lists.py index 69113e66a..abfb8aa2e 100644 --- a/src/pretix/base/templatetags/lists.py +++ b/src/pretix/base/templatetags/lists.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/money.py b/src/pretix/base/templatetags/money.py index ad4eff1cc..edda9904e 100644 --- a/src/pretix/base/templatetags/money.py +++ b/src/pretix/base/templatetags/money.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/oneline.py b/src/pretix/base/templatetags/oneline.py index bbfc848a9..f58e4aa93 100644 --- a/src/pretix/base/templatetags/oneline.py +++ b/src/pretix/base/templatetags/oneline.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/phone_format.py b/src/pretix/base/templatetags/phone_format.py index c38ff7561..bc30b610c 100644 --- a/src/pretix/base/templatetags/phone_format.py +++ b/src/pretix/base/templatetags/phone_format.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/rich_text.py b/src/pretix/base/templatetags/rich_text.py index d77d9ce9c..f38cdeab8 100644 --- a/src/pretix/base/templatetags/rich_text.py +++ b/src/pretix/base/templatetags/rich_text.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -54,6 +54,19 @@ from tlds import tld_set register = template.Library() + +def build_fediverse_re(tlds): + return re.compile( + r"""\(* # Match any opening parentheses. + @[^@]+@ + ([\w-]+\.)+(?:{0})(?:\:[0-9]+)?(?!\.\w)\b # xx.yy.tld(:##)? + """.format( + "|".join(sorted(tlds)) + ), + re.IGNORECASE | re.VERBOSE | re.UNICODE, + ) + + ALLOWED_TAGS_SNIPPET = { 'a', 'abbr', @@ -112,6 +125,8 @@ URL_RE = SimpleLazyObject(lambda: build_url_re(tlds=sorted(tld_set, key=len, rev EMAIL_RE = SimpleLazyObject(lambda: build_email_re(tlds=sorted(tld_set, key=len, reverse=True))) +FEDIVERSE_RE = SimpleLazyObject(lambda: build_fediverse_re(tlds=sorted(tld_set, key=len, reverse=True))) + DOT_ESCAPE = "|escaped-dot-sGnY9LMK|" @@ -144,9 +159,11 @@ def truelink_callback(attrs, new=False): https://maps.google.com """ - text = re.sub(r'[^a-zA-Z0-9.\-/_ ]', '', attrs.get('_text')) # clean up link text + text = re.sub(r'[^a-zA-Z0-9.\-/_@: ]', '', attrs.get('_text')) # clean up link text url = attrs.get((None, 'href'), '/') href_url = urllib.parse.urlparse(url) + + # Verify server name of URL names if (None, 'href') in attrs and URL_RE.match(text) and href_url.scheme not in ('tel', 'mailto'): # link text looks like a url if text.startswith('//'): @@ -154,10 +171,20 @@ def truelink_callback(attrs, new=False): elif not text.startswith('http'): text = 'https://' + text + text_url = urllib.parse.urlparse(text) + if text_url.netloc.split("@")[-1] != href_url.netloc.split("@")[-1] or not href_url.path.startswith(text_url.path): + # link text contains an URL that has a different base than the actual URL + attrs['_text'] = attrs[None, 'href'] + + # Verify server name of mastodon display names (@name@server.tld) + if (None, 'href') in attrs and FEDIVERSE_RE.match(text): + parts = text.split('@') + text = f'https://{parts[2]}/@{parts[1]}' text_url = urllib.parse.urlparse(text) if text_url.netloc != href_url.netloc or not href_url.path.startswith(href_url.path): # link text contains an URL that has a different base than the actual URL attrs['_text'] = attrs[None, 'href'] + return attrs diff --git a/src/pretix/base/templatetags/safelink.py b/src/pretix/base/templatetags/safelink.py index 3d2d322bd..f60324627 100644 --- a/src/pretix/base/templatetags/safelink.py +++ b/src/pretix/base/templatetags/safelink.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/textbubble.py b/src/pretix/base/templatetags/textbubble.py index a0c3a3d30..1d138a76d 100644 --- a/src/pretix/base/templatetags/textbubble.py +++ b/src/pretix/base/templatetags/textbubble.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/unidecode.py b/src/pretix/base/templatetags/unidecode.py index 54dbc8325..181fade39 100644 --- a/src/pretix/base/templatetags/unidecode.py +++ b/src/pretix/base/templatetags/unidecode.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/templatetags/urlreplace.py b/src/pretix/base/templatetags/urlreplace.py index b4aa92791..a6b4ec307 100644 --- a/src/pretix/base/templatetags/urlreplace.py +++ b/src/pretix/base/templatetags/urlreplace.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/ticketoutput.py b/src/pretix/base/ticketoutput.py index cd86ab948..63087a93a 100644 --- a/src/pretix/base/ticketoutput.py +++ b/src/pretix/base/ticketoutput.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/timeframes.py b/src/pretix/base/timeframes.py index 10dca6965..f3f2b3a4d 100644 --- a/src/pretix/base/timeframes.py +++ b/src/pretix/base/timeframes.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/timeline.py b/src/pretix/base/timeline.py index b44076627..be9d1d6b9 100644 --- a/src/pretix/base/timeline.py +++ b/src/pretix/base/timeline.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/timemachine.py b/src/pretix/base/timemachine.py index 9bb647321..c8ba4c2c2 100644 --- a/src/pretix/base/timemachine.py +++ b/src/pretix/base/timemachine.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/validators.py b/src/pretix/base/validators.py index 3b2a63531..15cf67b0f 100644 --- a/src/pretix/base/validators.py +++ b/src/pretix/base/validators.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/__init__.py b/src/pretix/base/views/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/base/views/__init__.py +++ b/src/pretix/base/views/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/applepay.py b/src/pretix/base/views/applepay.py index 768a53d44..a008804b0 100644 --- a/src/pretix/base/views/applepay.py +++ b/src/pretix/base/views/applepay.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/cachedfiles.py b/src/pretix/base/views/cachedfiles.py index e425e4805..744ea8c1d 100644 --- a/src/pretix/base/views/cachedfiles.py +++ b/src/pretix/base/views/cachedfiles.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/csp.py b/src/pretix/base/views/csp.py index b51a8d3ed..55bce1fed 100644 --- a/src/pretix/base/views/csp.py +++ b/src/pretix/base/views/csp.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/errors.py b/src/pretix/base/views/errors.py index c558676c6..7b76973b9 100644 --- a/src/pretix/base/views/errors.py +++ b/src/pretix/base/views/errors.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/health.py b/src/pretix/base/views/health.py index c0ea3f38c..874b98770 100644 --- a/src/pretix/base/views/health.py +++ b/src/pretix/base/views/health.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/js_catalog.py b/src/pretix/base/views/js_catalog.py index f74f3b69c..0e874fd75 100644 --- a/src/pretix/base/views/js_catalog.py +++ b/src/pretix/base/views/js_catalog.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/js_helpers.py b/src/pretix/base/views/js_helpers.py index 693dc0b71..7da2c8395 100644 --- a/src/pretix/base/views/js_helpers.py +++ b/src/pretix/base/views/js_helpers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/metrics.py b/src/pretix/base/views/metrics.py index 8df859146..60fe93e2b 100644 --- a/src/pretix/base/views/metrics.py +++ b/src/pretix/base/views/metrics.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/mixins.py b/src/pretix/base/views/mixins.py index 41c986a44..f85228d8a 100644 --- a/src/pretix/base/views/mixins.py +++ b/src/pretix/base/views/mixins.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/redirect.py b/src/pretix/base/views/redirect.py index c5b65cd1e..687338f4a 100644 --- a/src/pretix/base/views/redirect.py +++ b/src/pretix/base/views/redirect.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/source.py b/src/pretix/base/views/source.py index 6316db731..6b09ce9ff 100644 --- a/src/pretix/base/views/source.py +++ b/src/pretix/base/views/source.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/tasks.py b/src/pretix/base/views/tasks.py index 949cef639..e763d7fba 100644 --- a/src/pretix/base/views/tasks.py +++ b/src/pretix/base/views/tasks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/base/views/webmanifest.py b/src/pretix/base/views/webmanifest.py index 22a31699a..c85bebc69 100644 --- a/src/pretix/base/views/webmanifest.py +++ b/src/pretix/base/views/webmanifest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/celery_app.py b/src/pretix/celery_app.py index 060c10e5c..f140aefc7 100644 --- a/src/pretix/celery_app.py +++ b/src/pretix/celery_app.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/__init__.py b/src/pretix/control/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/control/__init__.py +++ b/src/pretix/control/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/apps.py b/src/pretix/control/apps.py index 05c626b6a..2e8e4d87e 100644 --- a/src/pretix/control/apps.py +++ b/src/pretix/control/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index cde58295a..4480a1148 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/__init__.py b/src/pretix/control/forms/__init__.py index 42a0fdf6d..d72a0ca34 100644 --- a/src/pretix/control/forms/__init__.py +++ b/src/pretix/control/forms/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/checkin.py b/src/pretix/control/forms/checkin.py index 32d4021e3..c1dee0443 100644 --- a/src/pretix/control/forms/checkin.py +++ b/src/pretix/control/forms/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/discounts.py b/src/pretix/control/forms/discounts.py index 44ad2386c..e73babde3 100644 --- a/src/pretix/control/forms/discounts.py +++ b/src/pretix/control/forms/discounts.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 1b4f6cdc9..2c67d74b6 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -857,6 +857,7 @@ class InvoiceSettingsForm(EventSettingsValidationMixin, SettingsForm): 'invoice_show_payments', 'invoice_reissue_after_modify', 'invoice_generate', + 'invoice_period', 'invoice_attendee_name', 'invoice_event_location', 'invoice_include_expire_date', diff --git a/src/pretix/control/forms/exports.py b/src/pretix/control/forms/exports.py index a1864280e..7e751df46 100644 --- a/src/pretix/control/forms/exports.py +++ b/src/pretix/control/forms/exports.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index d41d4afc8..6e330bb8f 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/global_settings.py b/src/pretix/control/forms/global_settings.py index 41f4b5745..518579968 100644 --- a/src/pretix/control/forms/global_settings.py +++ b/src/pretix/control/forms/global_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 06aa2496b..5d0e5140a 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/mailsetup.py b/src/pretix/control/forms/mailsetup.py index bece8832f..95c9dddb5 100644 --- a/src/pretix/control/forms/mailsetup.py +++ b/src/pretix/control/forms/mailsetup.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/mapping.py b/src/pretix/control/forms/mapping.py index 1da418688..cb9aa7284 100644 --- a/src/pretix/control/forms/mapping.py +++ b/src/pretix/control/forms/mapping.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/modelimport.py b/src/pretix/control/forms/modelimport.py index c96cf29c4..9e6c4869f 100644 --- a/src/pretix/control/forms/modelimport.py +++ b/src/pretix/control/forms/modelimport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -21,6 +21,8 @@ # from django import forms from django.core.exceptions import ValidationError +from django.utils.functional import lazy +from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ from pretix.base.modelimport_orders import get_order_import_columns @@ -71,6 +73,9 @@ class ProcessForm(forms.Form): raise NotImplementedError() # noqa +format_html_lazy = lazy(format_html, str) + + class OrdersProcessForm(ProcessForm): orders = forms.ChoiceField( label=_('Import mode'), @@ -91,7 +96,11 @@ class OrdersProcessForm(ProcessForm): ) testmode = forms.BooleanField( label=_('Create orders as test mode orders'), - required=False + required=False, + help_text=format_html_lazy( + '
{}
', + _('Orders not created in test mode cannot be deleted again after import.') + ) ) def __init__(self, *args, **kwargs): @@ -100,6 +109,8 @@ class OrdersProcessForm(ProcessForm): initital['testmode'] = self.event.testmode kwargs['initial'] = initital super().__init__(*args, **kwargs) + if not self.event.testmode: + self.fields["testmode"].help_text = "" def get_columns(self): return get_order_import_columns(self.event) diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 881920fca..9d2dc82d6 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1030,3 +1030,27 @@ class EventCancelForm(FormPlaceholderMixin, forms.Form): if self.event.has_subevents and not d['subevent'] and not d['all_subevents'] and not d.get('subevents_from'): raise ValidationError(_('Please confirm that you want to cancel ALL dates in this event series.')) return d + + +class EventCancelConfirmForm(forms.Form): + confirm = forms.BooleanField( + label=_("I understand that this is not reversible and want to continue"), + required=True, + ) + confirmation_code = forms.CharField( + label=_("Confirmation code"), + help_text=_("We have just emailed you a confirmation code to enter to confirm this action"), + required=True, + ) + + def __init__(self, *args, **kwargs): + self.code = kwargs.pop("confirmation_code") + super().__init__(*args, **kwargs) + if not self.code: + del self.fields["confirmation_code"] + + def clean_confirmation_code(self): + val = self.cleaned_data['confirmation_code'] + if val != self.code: + raise ValidationError(_('The confirmation code is incorrect.')) + return val diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index e3226c776..c8f63914f 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -731,6 +731,21 @@ class GiftCardCreateForm(forms.ModelForm): kwargs['initial'] = initial super().__init__(*args, **kwargs) + if self.organizer.settings.customer_accounts: + self.fields['customer'].queryset = self.organizer.customers.all() + self.fields['customer'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:organizer.customers.select2', kwargs={ + 'organizer': self.organizer.slug, + }), + } + ) + self.fields['customer'].widget.choices = self.fields['customer'].choices + self.fields['customer'].required = False + else: + del self.fields['customer'] + def clean_secret(self): s = self.cleaned_data['secret'] if GiftCard.objects.filter( @@ -749,9 +764,10 @@ class GiftCardCreateForm(forms.ModelForm): class Meta: model = GiftCard - fields = ['secret', 'currency', 'testmode', 'expires', 'conditions'] + fields = ['secret', 'currency', 'testmode', 'expires', 'conditions', 'customer'] field_classes = { - 'expires': SplitDateTimeField + 'expires': SplitDateTimeField, + 'customer': SafeModelChoiceField, } widgets = { 'expires': SplitDateTimePickerWidget, @@ -762,10 +778,11 @@ class GiftCardCreateForm(forms.ModelForm): class GiftCardUpdateForm(forms.ModelForm): class Meta: model = GiftCard - fields = ['expires', 'conditions', 'owner_ticket'] + fields = ['expires', 'conditions', 'owner_ticket', 'customer'] field_classes = { 'expires': SplitDateTimeField, 'owner_ticket': SafeOrderPositionChoiceField, + 'customer': SafeModelChoiceField, } widgets = { 'expires': SplitDateTimePickerWidget, @@ -788,6 +805,21 @@ class GiftCardUpdateForm(forms.ModelForm): self.fields['owner_ticket'].widget.choices = self.fields['owner_ticket'].choices self.fields['owner_ticket'].required = False + if organizer.settings.customer_accounts: + self.fields['customer'].queryset = organizer.customers.all() + self.fields['customer'].widget = Select2( + attrs={ + 'data-model-select2': 'generic', + 'data-select2-url': reverse('control:organizer.customers.select2', kwargs={ + 'organizer': organizer.slug, + }), + } + ) + self.fields['customer'].widget.choices = self.fields['customer'].choices + self.fields['customer'].required = False + else: + del self.fields['customer'] + class ReusableMediumUpdateForm(forms.ModelForm): error_messages = { diff --git a/src/pretix/control/forms/renderers.py b/src/pretix/control/forms/renderers.py index 786a060d4..8cc21abc0 100644 --- a/src/pretix/control/forms/renderers.py +++ b/src/pretix/control/forms/renderers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/rrule.py b/src/pretix/control/forms/rrule.py index bfa7810e0..e144ed131 100644 --- a/src/pretix/control/forms/rrule.py +++ b/src/pretix/control/forms/rrule.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index c0fcc6f29..b0a78fd7f 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -390,7 +390,8 @@ class QuotaFormSet(I18nInlineFormSet): use_required_attribute=False, locales=self.locales, event=self.event, - items=self.items + items=self.items, + searchable_selection=self.searchable_selection, ) self.add_fields(form, None) return form diff --git a/src/pretix/control/forms/users.py b/src/pretix/control/forms/users.py index 08cf6dcef..7f813a13d 100644 --- a/src/pretix/control/forms/users.py +++ b/src/pretix/control/forms/users.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 53bf3dccf..5138b7b7c 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/waitinglist.py b/src/pretix/control/forms/waitinglist.py index 3a1b7f3bf..7dc33c4a9 100644 --- a/src/pretix/control/forms/waitinglist.py +++ b/src/pretix/control/forms/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/forms/widgets.py b/src/pretix/control/forms/widgets.py index b65cc22bc..d054be63a 100644 --- a/src/pretix/control/forms/widgets.py +++ b/src/pretix/control/forms/widgets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 29de5a52c..552d07518 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -455,7 +455,7 @@ class OrderDataSyncSuccessLogEntryType(OrderDataSyncLogEntryType): links.append(", ".join( prov.get_external_link_html(logentry.event, obj['external_link_href'], obj['external_link_display_name']) for obj in objs - if obj and 'external_link_href' in obj and 'external_link_display_name' in obj + if obj and obj.get('external_link_href') and obj.get('external_link_display_name') )) return mark_safe(escape(super().display(logentry, data)) + "".join("

" + link + "

" for link in links)) @@ -522,6 +522,7 @@ def pretixcontrol_orderposition_blocked_display(sender: Event, orderposition, bl 'pretix.event.order.customer.changed': _('The customer account has been changed.'), 'pretix.event.order.locale.changed': _('The order locale has been changed.'), 'pretix.event.order.invoice.generated': _('The invoice has been generated.'), + 'pretix.event.order.invoice.failed': _('The invoice could not be generated.'), 'pretix.event.order.invoice.regenerated': _('The invoice has been regenerated.'), 'pretix.event.order.invoice.reissued': _('The invoice has been reissued.'), 'pretix.event.order.invoice.sent': _('The invoice {full_invoice_no} has been sent.'), diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 9a176945d..9694e88de 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/navigation.py b/src/pretix/control/navigation.py index 67bccaccd..99bdd8654 100644 --- a/src/pretix/control/navigation.py +++ b/src/pretix/control/navigation.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/permissions.py b/src/pretix/control/permissions.py index afc677ff2..059e2c9d3 100644 --- a/src/pretix/control/permissions.py +++ b/src/pretix/control/permissions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/signals.py b/src/pretix/control/signals.py index afae6a2a9..504aa2a82 100644 --- a/src/pretix/control/signals.py +++ b/src/pretix/control/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/sysreport.py b/src/pretix/control/sysreport.py index 0c86deb26..6beb0e4fc 100644 --- a/src/pretix/control/sysreport.py +++ b/src/pretix/control/sysreport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index d2b21e70e..52d9a7e9b 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -15,6 +15,19 @@ {% bootstrap_field form.invoice_email_attachment layout="control" %} {% bootstrap_field form.invoice_email_organizer layout="control" %} {% bootstrap_field form.invoice_language layout="control" %} + {% bootstrap_field form.invoice_period layout="control" %} + + {% if not request.event.settings.show_dates_on_frontpage %} +
+
+ {% blocktrans trimmed %} + You configured that your shop is not an event and the event date should not be shown. + Therefore, we recommend that you set the date of service to a different option. + {% endblocktrans %} +
+
+ {% endif %} + {% bootstrap_field form.invoice_include_free layout="control" %} {% bootstrap_field form.invoice_show_payments layout="control" %} {% bootstrap_field form.invoice_reissue_after_modify layout="control" %} diff --git a/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html b/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html index ca579a36b..23403ac1e 100644 --- a/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html +++ b/src/pretix/control/templates/pretixcontrol/giftcards/checkout.html @@ -1,7 +1,35 @@ {% 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/orders/cancel.html b/src/pretix/control/templates/pretixcontrol/orders/cancel.html index 47c91ecb9..2e8c9ce71 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/cancel.html +++ b/src/pretix/control/templates/pretixcontrol/orders/cancel.html @@ -79,9 +79,15 @@ {% bootstrap_field form.send_waitinglist_message layout="horizontal" %}
- + {% if dry_run_supported %} + + {% else %} + + {% endif %}
{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/orders/cancel_confirm.html b/src/pretix/control/templates/pretixcontrol/orders/cancel_confirm.html new file mode 100644 index 000000000..b7e620861 --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/orders/cancel_confirm.html @@ -0,0 +1,85 @@ +{% extends "pretixcontrol/event/base.html" %} +{% load i18n %} +{% load eventsignal %} +{% load bootstrap3 %} +{% load money %} +{% block title %}{% trans "Cancel event" %}{% endblock %} +{% block content %} +

{% trans "Cancel event" %}

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

+ {% blocktrans trimmed %} + If you proceed, the system will do the following: + {% endblocktrans %} +

+
    +
  • + {% blocktrans trimmed count count=dryrun_result.cancel_full_total %} + {{ count }} order will be canceled fully + {% plural %} + {{ count }} orders will be canceled fully + {% endblocktrans %} +
  • +
  • + {% blocktrans trimmed count count=dryrun_result.cancel_partial_total %} + {{ count }} order will be canceled partially + {% plural %} + {{ count }} orders will be canceled partially + {% endblocktrans %} +
  • +
  • + {% if dryrun_result.kwargs.auto_refund and dryrun_result.refund_total %} + + {% endif %} + {% blocktrans trimmed with amount=dryrun_result.refund_total|money:request.event.currency %} + {{ amount }} are eligible for refunds. + {% endblocktrans %} + {% if dryrun_result.kwargs.auto_refund %} + {% trans "The system will attempt to refund the money automatically if supported by the payment method." %} + {% elif dryrun_result.kwargs.manual_refund %} + {% trans "The system will create manual refunds that you need to execute." %} + {% else %} + {% trans "Refunds will not happen automatically." %} + {% endif %} + {% if dryrun_result.kwargs.auto_refund %} + + {% endif %} +
  • + {% if dryrun_result.kwargs.send %} +
  • + {% trans "Inform all customers via email." %} +
  • + {% endif %} + {% if dryrun_result.kwargs.send_waitinglist %} +
  • + {% trans "Inform all waiting list contacts via email." %} +
  • + {% endif %} +
+

+ {% blocktrans trimmed %} + These numbers are estimates and may change if the data in your event recently changed. + {% endblocktrans %} +

+ {% bootstrap_form_errors form %} + {% if form.confirmation_code %} + {% bootstrap_field form.confirm layout="control" %} + {% bootstrap_field form.confirmation_code layout="control" %} + {% else %} + {% bootstrap_field form.confirm layout="inline" form_group_class="" %} + {% endif %} +
+ +
+
+{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/organizers/customer.html b/src/pretix/control/templates/pretixcontrol/organizers/customer.html index b5954d068..8a86c8f68 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/customer.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/customer.html @@ -1,6 +1,7 @@ {% extends "pretixcontrol/organizers/base.html" %} {% load i18n %} {% load bootstrap3 %} +{% load icon %} {% load money %} {% load static %} {% block title %} @@ -278,6 +279,53 @@
{% include "pretixcontrol/pagination.html" %} +
+
+

+ {% trans "Gift cards" %} +

+
+ + + + + + + + {% for gc in gift_cards %} + + + + + + + + + {% endfor %} + +
{% trans "Gift card code" %} + {% trans "Creation date" %} + {% trans "Expiry date" %} + {% trans "Last transaction" %} + {% trans "Current value" %} +
+ + {{ gc.secret }} + {% if gc.testmode %} + {% trans "TEST MODE" %} + {% endif %} + {% if gc.expired %} + {% trans "Expired" %} + {% endif %} + {{ gc.issuance|date:"SHORT_DATETIME_FORMAT" }}{% if gc.expires %}{{ gc.expires|date:"SHORT_DATETIME_FORMAT" }}{% endif %}{% if gc.last_tx %}{{ gc.last_tx|date:"SHORT_DATETIME_FORMAT" }}{% endif %} +

{{ gc.value|money:gc.currency }}

+
+ + + +
+
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html b/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html index 271780abe..8a035e490 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/giftcard.html @@ -54,6 +54,14 @@ {{ card.owner_ticket.order.code }}-{{ card.owner_ticket.positionid }} {% endif %} + {% if card.customer %} +
{% trans "Customer account" %}
+
+ + {{ card.customer.identifier }} – {{ card.customer.email }} + +
+ {% endif %}
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/giftcard_create.html b/src/pretix/control/templates/pretixcontrol/organizers/giftcard_create.html index 86bac3b05..5c21b8fc7 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/giftcard_create.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/giftcard_create.html @@ -12,6 +12,9 @@ {% bootstrap_field form.testmode layout="control" %} {% bootstrap_field form.expires layout="control" %} {% bootstrap_field form.conditions layout="control" %} + {% if form.customer %} + {% bootstrap_field form.customer layout="control" %} + {% endif %}
diff --git a/src/pretix/control/templates/pretixcontrol/subevents/bulk_edit.html b/src/pretix/control/templates/pretixcontrol/subevents/bulk_edit.html index 8770301c5..369bf3fa6 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/bulk_edit.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/bulk_edit.html @@ -363,7 +363,7 @@
{% endif %} -
+
diff --git a/src/pretix/control/templates/pretixcontrol/subevents/detail.html b/src/pretix/control/templates/pretixcontrol/subevents/detail.html index 9a7466c85..5bce7afbb 100644 --- a/src/pretix/control/templates/pretixcontrol/subevents/detail.html +++ b/src/pretix/control/templates/pretixcontrol/subevents/detail.html @@ -130,30 +130,32 @@ {% trans "These settings are optional, if you leave them empty, the default values from the product settings will be used." %}

{% for f in itemvar_forms %} - {% bootstrap_form_errors f %} -
- -
-
- {% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} +
+ {% bootstrap_form_errors f %} +
+ +
+
+ {% bootstrap_field f.price addon_after=request.event.currency form_group_class="" layout="inline" %} +
+
+
+ {% bootstrap_field f.disabled layout="inline" form_group_class="" %} +
-
-
- {% bootstrap_field f.disabled layout="inline" form_group_class="" %} -
-
-
-
- - {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}
- {% bootstrap_field f.available_from form_group_class="foo" layout="inline" %} -
-
- - {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}
- {% bootstrap_field f.available_until form_group_class="" layout="inline" %} +
+
+ + {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_from_mode %}
+ {% bootstrap_field f.available_from form_group_class="foo" layout="inline" %} +
+
+ + {% include "pretixcontrol/subevents/fragment_unavail_mode_indicator.html" with mode=f.available_until_mode %}
+ {% bootstrap_field f.available_until form_group_class="" layout="inline" %} +
{% endfor %} @@ -282,7 +284,7 @@
{% endif %}
-
+
diff --git a/src/pretix/control/templatetags/__init__.py b/src/pretix/control/templatetags/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/control/templatetags/__init__.py +++ b/src/pretix/control/templatetags/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/templatetags/getitem.py b/src/pretix/control/templatetags/getitem.py index 41889c5b1..1ca3c1f9f 100644 --- a/src/pretix/control/templatetags/getitem.py +++ b/src/pretix/control/templatetags/getitem.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/templatetags/hierarkey_form.py b/src/pretix/control/templatetags/hierarkey_form.py index abf7371a6..b340db560 100644 --- a/src/pretix/control/templatetags/hierarkey_form.py +++ b/src/pretix/control/templatetags/hierarkey_form.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/templatetags/mail_settings_preview.py b/src/pretix/control/templatetags/mail_settings_preview.py index f463966e6..85b373329 100644 --- a/src/pretix/control/templatetags/mail_settings_preview.py +++ b/src/pretix/control/templatetags/mail_settings_preview.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/templatetags/order_overview.py b/src/pretix/control/templatetags/order_overview.py index c06f72647..78a01c1cb 100644 --- a/src/pretix/control/templatetags/order_overview.py +++ b/src/pretix/control/templatetags/order_overview.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 4243ad2d5..feb3b6401 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -460,6 +460,7 @@ urlpatterns = [ re_path(r'^orders/search$', orders.OrderSearch.as_view(), name='event.orders.search'), re_path(r'^dangerzone/$', event.DangerZone.as_view(), name='event.dangerzone'), re_path(r'^cancel/$', orders.EventCancel.as_view(), name='event.cancel'), + re_path(r'^cancel/(?P[^/]+)/$', orders.EventCancelConfirm.as_view(), name='event.cancel.confirm'), re_path(r'^shredder/$', shredder.StartShredView.as_view(), name='event.shredder.start'), re_path(r'^shredder/export$', shredder.ShredExportView.as_view(), name='event.shredder.export'), re_path(r'^shredder/download/(?P[^/]+)/$', shredder.ShredDownloadView.as_view(), name='event.shredder.download'), diff --git a/src/pretix/control/views/__init__.py b/src/pretix/control/views/__init__.py index 486cbe8eb..cfff1c451 100644 --- a/src/pretix/control/views/__init__.py +++ b/src/pretix/control/views/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/auth.py b/src/pretix/control/views/auth.py index fef96a637..b1b52985e 100644 --- a/src/pretix/control/views/auth.py +++ b/src/pretix/control/views/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/checkin.py b/src/pretix/control/views/checkin.py index 26ff3e488..cd5ce59e1 100644 --- a/src/pretix/control/views/checkin.py +++ b/src/pretix/control/views/checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py index 35932ceaf..e703bc9ab 100644 --- a/src/pretix/control/views/dashboards.py +++ b/src/pretix/control/views/dashboards.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/datasync.py b/src/pretix/control/views/datasync.py index 6bf47afbb..ebffd8da1 100644 --- a/src/pretix/control/views/datasync.py +++ b/src/pretix/control/views/datasync.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -78,8 +78,8 @@ class ControlSyncJob(OrderView): prov, meta = datasync_providers.get(active_in=self.request.event, identifier=provider) if self.request.POST.get("queue_sync") == "true": - prov.enqueue_order(self.order, 'user') - messages.success(self.request, _('The sync job has been enqueued and will run in the next minutes.')) + prov.enqueue_order(self.order, 'user', immediate=True) + messages.success(self.request, _('The sync job has been set to run as soon as possible.')) elif self.request.POST.get("cancel_job"): with transaction.atomic(): try: diff --git a/src/pretix/control/views/discounts.py b/src/pretix/control/views/discounts.py index cc95ad720..28b5addbe 100644 --- a/src/pretix/control/views/discounts.py +++ b/src/pretix/control/views/discounts.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 038fd7403..c72e81bb7 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/geo.py b/src/pretix/control/views/geo.py index 8f4aa8973..a3bb91568 100644 --- a/src/pretix/control/views/geo.py +++ b/src/pretix/control/views/geo.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/global_settings.py b/src/pretix/control/views/global_settings.py index 2ecef4ebf..322031cbe 100644 --- a/src/pretix/control/views/global_settings.py +++ b/src/pretix/control/views/global_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 7cf68c9d4..f120a03d5 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/mailsetup.py b/src/pretix/control/views/mailsetup.py index 60793586e..6ef1f70fb 100644 --- a/src/pretix/control/views/mailsetup.py +++ b/src/pretix/control/views/mailsetup.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/main.py b/src/pretix/control/views/main.py index 6501aea34..8f0455818 100644 --- a/src/pretix/control/views/main.py +++ b/src/pretix/control/views/main.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/modelimport.py b/src/pretix/control/views/modelimport.py index 0f82798f2..d70171f63 100644 --- a/src/pretix/control/views/modelimport.py +++ b/src/pretix/control/views/modelimport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/oauth.py b/src/pretix/control/views/oauth.py index 4767d0e00..d28b4b66d 100644 --- a/src/pretix/control/views/oauth.py +++ b/src/pretix/control/views/oauth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index fda0db950..aec42dea8 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -42,6 +42,7 @@ from datetime import datetime, time, timedelta from decimal import Decimal, DecimalException from urllib.parse import quote, urlencode +from celery.result import AsyncResult from django import forms from django.conf import settings from django.contrib import messages @@ -122,8 +123,8 @@ from pretix.control.forms.filter import ( RefundFilterForm, ) from pretix.control.forms.orders import ( - CancelForm, CommentForm, DenyForm, EventCancelForm, ExporterForm, - ExtendForm, MarkPaidForm, OrderContactForm, OrderFeeAddForm, + CancelForm, CommentForm, DenyForm, EventCancelConfirmForm, EventCancelForm, + ExporterForm, ExtendForm, MarkPaidForm, OrderContactForm, OrderFeeAddForm, OrderFeeAddFormset, OrderFeeChangeForm, OrderLocaleForm, OrderMailForm, OrderPositionAddForm, OrderPositionAddFormset, OrderPositionChangeForm, OrderPositionMailForm, OrderRefundForm, OtherOperationsForm, @@ -1221,6 +1222,7 @@ class OrderRefundView(OrderView): giftcard = self.request.organizer.issued_gift_cards.create( expires=expires, currency=self.request.event.currency, + customer=order.customer, testmode=order.testmode ) giftcard.log_action('pretix.giftcards.created', user=self.request.user, data={}) @@ -2974,10 +2976,99 @@ class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView): send_waitinglist_subject=form.cleaned_data.get('send_waitinglist_subject').data, send_waitinglist_message=form.cleaned_data.get('send_waitinglist_message').data, user=self.request.user.pk, + dry_run=settings.HAS_CELERY, + ) + + def get_context_data(self, **kwargs): + return super().get_context_data( + dry_run_supported=settings.HAS_CELERY, ) def get_success_message(self, value): - if value == 0: + if value["dry_run"]: + return None + elif value["failed"] == 0: + return _('All orders have been canceled.') + else: + return _('The orders have been canceled. An error occurred with {count} orders, please ' + 'check all uncanceled orders.').format(count=value) + + def get_success_url(self, value): + if settings.HAS_CELERY: + return reverse('control:event.cancel.confirm', kwargs={ + 'organizer': self.request.organizer.slug, + 'event': self.request.event.slug, + 'task': value["id"], + }) + else: + return reverse('control:event.cancel', kwargs={ + 'organizer': self.request.organizer.slug, + 'event': self.request.event.slug, + }) + + def get_error_url(self): + return reverse('control:event.cancel', kwargs={ + 'organizer': self.request.organizer.slug, + 'event': self.request.event.slug, + }) + + def get_error_message(self, exception): + if isinstance(exception, str): + return exception + return super().get_error_message(exception) + + def form_invalid(self, form): + messages.error(self.request, _('Your input was not valid.')) + return super().form_invalid(form) + + +class EventCancelConfirm(EventPermissionRequiredMixin, AsyncAction, FormView): + template_name = 'pretixcontrol/orders/cancel_confirm.html' + permission = 'can_change_orders' + form_class = EventCancelConfirmForm + task = cancel_event + known_errortypes = ['OrderError'] + + @cached_property + def dryrun_result(self): + res = AsyncResult(self.kwargs.get("task")) + if not res.ready(): + raise Http404() + if not res.successful(): + raise Http404() + data = res.info + if not data.get("dry_run"): + raise Http404() + if data.get("args")[0] != self.request.event.pk: + raise Http404() + return data + + def get(self, request, *args, **kwargs): + if 'async_id' in request.GET and settings.HAS_CELERY: + return self.get_result(request) + return FormView.get(self, request, *args, **kwargs) + + def get_form_kwargs(self): + k = super().get_form_kwargs() + k['confirmation_code'] = self.dryrun_result["confirmation_code"] + return k + + def form_valid(self, form): + return self.do( + *self.dryrun_result["args"], + **{ + **self.dryrun_result["kwargs"], + "dry_run": False, + }, + ) + + def get_context_data(self, **kwargs): + return super().get_context_data( + dryrun_result=self.dryrun_result, + ) + + def get_success_message(self, value): + if value["failed"] == 0: return _('All orders have been canceled.') else: return _('The orders have been canceled. An error occurred with {count} orders, please ' diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 6e014bb91..088fb9fc7 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -3085,6 +3085,8 @@ class CustomerDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi .annotate(spending=Sum("total")) ) + ctx["gift_cards"] = self.customer.customer_gift_cards.all() + return ctx diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index a83a29efb..8b863f372 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/search.py b/src/pretix/control/views/search.py index 5feb2aa2c..0501d9c4c 100644 --- a/src/pretix/control/views/search.py +++ b/src/pretix/control/views/search.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/shredder.py b/src/pretix/control/views/shredder.py index e77fa9b9f..aed2c07ab 100644 --- a/src/pretix/control/views/shredder.py +++ b/src/pretix/control/views/shredder.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 150d8a7e5..9712efc80 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 4220823d8..5c8116ed0 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/user.py b/src/pretix/control/views/user.py index 8d0816064..2f325f134 100644 --- a/src/pretix/control/views/user.py +++ b/src/pretix/control/views/user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/users.py b/src/pretix/control/views/users.py index c72a00790..d6ed6b96e 100644 --- a/src/pretix/control/views/users.py +++ b/src/pretix/control/views/users.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index bee6db27e..e7308b9d4 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py index 644b85942..1cacbb3c6 100644 --- a/src/pretix/control/views/waitinglist.py +++ b/src/pretix/control/views/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/__init__.py b/src/pretix/helpers/__init__.py index 588116763..2bf736833 100644 --- a/src/pretix/helpers/__init__.py +++ b/src/pretix/helpers/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/apps.py b/src/pretix/helpers/apps.py index d78d36f88..c51aa3ed3 100644 --- a/src/pretix/helpers/apps.py +++ b/src/pretix/helpers/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/cache.py b/src/pretix/helpers/cache.py index 7969276ee..ff85e3dc6 100644 --- a/src/pretix/helpers/cache.py +++ b/src/pretix/helpers/cache.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/compat.py b/src/pretix/helpers/compat.py index 5b75a4a02..fc3096dad 100644 --- a/src/pretix/helpers/compat.py +++ b/src/pretix/helpers/compat.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/compressor.py b/src/pretix/helpers/compressor.py index 250760c31..97131548b 100644 --- a/src/pretix/helpers/compressor.py +++ b/src/pretix/helpers/compressor.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/config.py b/src/pretix/helpers/config.py index d341479e4..4f0e67a39 100644 --- a/src/pretix/helpers/config.py +++ b/src/pretix/helpers/config.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/cookies.py b/src/pretix/helpers/cookies.py index ee7346594..aea7e0e37 100644 --- a/src/pretix/helpers/cookies.py +++ b/src/pretix/helpers/cookies.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/countries.py b/src/pretix/helpers/countries.py index cb02e4599..12570aaa0 100644 --- a/src/pretix/helpers/countries.py +++ b/src/pretix/helpers/countries.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/database.py b/src/pretix/helpers/database.py index 5e5b4f009..6caf7499f 100644 --- a/src/pretix/helpers/database.py +++ b/src/pretix/helpers/database.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -21,7 +21,8 @@ # import contextlib -from django.core.exceptions import FieldDoesNotExist +from django.conf import settings +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured from django.db import connection, transaction from django.db.models import ( Aggregate, Expression, F, Field, Lookup, OrderBy, Value, @@ -62,6 +63,43 @@ def casual_reads(): yield +@contextlib.contextmanager +def repeatable_reads_transaction(): + """ + pretix, and Django, operate in the transaction isolation level READ COMMITTED by default. This is not a strong level + of isolation, but we NEED to use it: Otherwise e.g. our quota logic breaks, because we need to be able to get the + *current* number of tickets sold at any time in a transaction, not the number of tickets sold *before* our transaction + started. + + However, this isolation mode has drawbacks, for example during reporting. When a user retrieves a report from the + system, it should return numbers that are consistent with each other. However, if the report makes multiple SQL + queries in READ COMMITTED mode, the results might be different for each query, causing numbers to be inconsistent + with each other. + + This context manager creates a transaction that is running in REPEATABLE READ mode to avoid this problem. + + **You should only make read-only queries during this transaction and not rely on quota calculations.** + """ + is_under_test = 'tests.testdummy' in settings.INSTALLED_APPS + try: + with transaction.atomic(durable=not is_under_test): + if not is_under_test: + # We're not running this in tests, where we can basically not use this since the test runner does its + # own transaction logic for efficiency + with connection.cursor() as cursor: + if 'postgresql' in settings.DATABASES['default']['ENGINE']: + cursor.execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;') + elif 'sqlite' in settings.DATABASES['default']['ENGINE']: + pass # noop + else: + raise ImproperlyConfigured("Cannot set transaction isolation mode on this database backend") + + connection.tx_in_repeatable_read = True + yield + finally: + connection.tx_in_repeatable_read = False + + class GroupConcat(Aggregate): function = 'group_concat' template = '%(function)s(%(distinct)s%(field)s, "%(separator)s")' diff --git a/src/pretix/helpers/daterange.py b/src/pretix/helpers/daterange.py index 6ad12ebe3..ec4c253ea 100644 --- a/src/pretix/helpers/daterange.py +++ b/src/pretix/helpers/daterange.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -76,11 +76,11 @@ def daterange(df, dt, as_html=False): return format_html(base_format, _date(df, "j F"), until, _date(dt, "j F Y")) elif lng.startswith("en"): if df.year == dt.year and df.month == dt.month and df.day == dt.day: - return format_html(base_format, _date(df, "D, N jS, Y")) + return format_html(base_format, _date(df, "D, N j, Y")) elif df.year == dt.year and df.month == dt.month: - return format_html(base_format, _date(df, "N jS"), until, _date(dt, "jS, Y")) + return format_html(base_format, _date(df, "N j"), until, _date(dt, "j, Y")) elif df.year == dt.year: - return format_html(base_format, _date(df, "N jS"), until, _date(dt, "N jS, Y")) + return format_html(base_format, _date(df, "N j"), until, _date(dt, "N j, Y")) elif lng.startswith("es"): if df.year == dt.year and df.month == dt.month and df.day == dt.day: return format_html(base_format, _date(df, "DATE_FORMAT")) diff --git a/src/pretix/helpers/dicts.py b/src/pretix/helpers/dicts.py index 3ae0f5dcf..f39956e91 100644 --- a/src/pretix/helpers/dicts.py +++ b/src/pretix/helpers/dicts.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/escapejson.py b/src/pretix/helpers/escapejson.py index 03ebe754e..1df8cd168 100644 --- a/src/pretix/helpers/escapejson.py +++ b/src/pretix/helpers/escapejson.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/filenames.py b/src/pretix/helpers/filenames.py index 637a43962..45b5d5771 100644 --- a/src/pretix/helpers/filenames.py +++ b/src/pretix/helpers/filenames.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/format.py b/src/pretix/helpers/format.py index 3ed2eac36..33549ed8b 100644 --- a/src/pretix/helpers/format.py +++ b/src/pretix/helpers/format.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/__init__.py b/src/pretix/helpers/formats/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/__init__.py +++ b/src/pretix/helpers/formats/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/ar/__init__.py b/src/pretix/helpers/formats/ar/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/ar/__init__.py +++ b/src/pretix/helpers/formats/ar/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/ar/formats.py b/src/pretix/helpers/formats/ar/formats.py index 01b2c05af..57885a72b 100644 --- a/src/pretix/helpers/formats/ar/formats.py +++ b/src/pretix/helpers/formats/ar/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/de/__init__.py b/src/pretix/helpers/formats/de/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/de/__init__.py +++ b/src/pretix/helpers/formats/de/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/de/formats.py b/src/pretix/helpers/formats/de/formats.py index f142c715e..522230910 100644 --- a/src/pretix/helpers/formats/de/formats.py +++ b/src/pretix/helpers/formats/de/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/el/__init__.py b/src/pretix/helpers/formats/el/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/el/__init__.py +++ b/src/pretix/helpers/formats/el/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/el/formats.py b/src/pretix/helpers/formats/el/formats.py index 4efc7d907..4f9926e97 100644 --- a/src/pretix/helpers/formats/el/formats.py +++ b/src/pretix/helpers/formats/el/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en/__init__.py b/src/pretix/helpers/formats/en/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/en/__init__.py +++ b/src/pretix/helpers/formats/en/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en/formats.py b/src/pretix/helpers/formats/en/formats.py index 93ee82085..e48ce0dca 100644 --- a/src/pretix/helpers/formats/en/formats.py +++ b/src/pretix/helpers/formats/en/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -38,5 +38,5 @@ SHORT_DATE_FORMAT = 'Y-m-d' SHORT_DATETIME_FORMAT = 'Y-m-d H:i' TIME_FORMAT = 'H:i' WEEK_FORMAT = '\\W W, o' -WEEK_DAY_FORMAT = 'D, M jS' +WEEK_DAY_FORMAT = 'D, M j' SHORT_MONTH_DAY_FORMAT = 'd.m.' diff --git a/src/pretix/helpers/formats/en_CA/__init__.py b/src/pretix/helpers/formats/en_CA/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/en_CA/__init__.py +++ b/src/pretix/helpers/formats/en_CA/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en_CA/formats.py b/src/pretix/helpers/formats/en_CA/formats.py index d7875e437..bdb16f621 100644 --- a/src/pretix/helpers/formats/en_CA/formats.py +++ b/src/pretix/helpers/formats/en_CA/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -38,7 +38,7 @@ SHORT_DATE_FORMAT = "Y-m-d" SHORT_DATETIME_FORMAT = 'Y-m-d P' TIME_FORMAT = 'P' WEEK_FORMAT = '\\W W, o' -WEEK_DAY_FORMAT = 'D, M jS' +WEEK_DAY_FORMAT = 'D, M j' SHORT_MONTH_DAY_FORMAT = 'm/d' DATE_INPUT_FORMATS = [ diff --git a/src/pretix/helpers/formats/en_NZ/__init__.py b/src/pretix/helpers/formats/en_NZ/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/en_NZ/__init__.py +++ b/src/pretix/helpers/formats/en_NZ/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en_NZ/formats.py b/src/pretix/helpers/formats/en_NZ/formats.py index ed26c5d76..28a8b2bce 100644 --- a/src/pretix/helpers/formats/en_NZ/formats.py +++ b/src/pretix/helpers/formats/en_NZ/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en_US/__init__.py b/src/pretix/helpers/formats/en_US/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/en_US/__init__.py +++ b/src/pretix/helpers/formats/en_US/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/en_US/formats.py b/src/pretix/helpers/formats/en_US/formats.py index 0bb769f80..2ca232f7e 100644 --- a/src/pretix/helpers/formats/en_US/formats.py +++ b/src/pretix/helpers/formats/en_US/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -25,7 +25,7 @@ SHORT_DATE_FORMAT = 'm/d/Y' SHORT_DATETIME_FORMAT = 'm/d/Y P' TIME_FORMAT = 'P' WEEK_FORMAT = '\\W W, o' -WEEK_DAY_FORMAT = 'D, M jS' +WEEK_DAY_FORMAT = 'D, M j' SHORT_MONTH_DAY_FORMAT = 'm/d' DATE_INPUT_FORMATS = [ diff --git a/src/pretix/helpers/formats/fr/__init__.py b/src/pretix/helpers/formats/fr/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/formats/fr/__init__.py +++ b/src/pretix/helpers/formats/fr/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/formats/fr/formats.py b/src/pretix/helpers/formats/fr/formats.py index 5792f151c..4acc5cd3d 100644 --- a/src/pretix/helpers/formats/fr/formats.py +++ b/src/pretix/helpers/formats/fr/formats.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/hierarkey.py b/src/pretix/helpers/hierarkey.py index 691ce2260..8d3360f0b 100644 --- a/src/pretix/helpers/hierarkey.py +++ b/src/pretix/helpers/hierarkey.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/http.py b/src/pretix/helpers/http.py index 47f5752b9..288db62d1 100644 --- a/src/pretix/helpers/http.py +++ b/src/pretix/helpers/http.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/i18n.py b/src/pretix/helpers/i18n.py index ef30c0c57..04edcf2ba 100644 --- a/src/pretix/helpers/i18n.py +++ b/src/pretix/helpers/i18n.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/images.py b/src/pretix/helpers/images.py index 31773849f..df439679b 100644 --- a/src/pretix/helpers/images.py +++ b/src/pretix/helpers/images.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/iter.py b/src/pretix/helpers/iter.py index 007bf9650..8bf978b7d 100644 --- a/src/pretix/helpers/iter.py +++ b/src/pretix/helpers/iter.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/json.py b/src/pretix/helpers/json.py index b73031573..c3ec849a8 100644 --- a/src/pretix/helpers/json.py +++ b/src/pretix/helpers/json.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/jsonlogic.py b/src/pretix/helpers/jsonlogic.py index 8a3159686..8ce62ddd4 100644 --- a/src/pretix/helpers/jsonlogic.py +++ b/src/pretix/helpers/jsonlogic.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/jsonlogic_boolalg.py b/src/pretix/helpers/jsonlogic_boolalg.py index b879fe591..5bdaf379b 100644 --- a/src/pretix/helpers/jsonlogic_boolalg.py +++ b/src/pretix/helpers/jsonlogic_boolalg.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/jsonlogic_query.py b/src/pretix/helpers/jsonlogic_query.py index 8206d7d13..c915a43bf 100644 --- a/src/pretix/helpers/jsonlogic_query.py +++ b/src/pretix/helpers/jsonlogic_query.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/logs.py b/src/pretix/helpers/logs.py index 175b34250..5a26b8a0e 100644 --- a/src/pretix/helpers/logs.py +++ b/src/pretix/helpers/logs.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/metrics/__init__.py b/src/pretix/helpers/metrics/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/metrics/__init__.py +++ b/src/pretix/helpers/metrics/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/metrics/middleware.py b/src/pretix/helpers/metrics/middleware.py index cb296b723..7c15c02ba 100644 --- a/src/pretix/helpers/metrics/middleware.py +++ b/src/pretix/helpers/metrics/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/models.py b/src/pretix/helpers/models.py index 0896cd9f4..8e3814196 100644 --- a/src/pretix/helpers/models.py +++ b/src/pretix/helpers/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/money.py b/src/pretix/helpers/money.py index ced14b900..efa8051b7 100644 --- a/src/pretix/helpers/money.py +++ b/src/pretix/helpers/money.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/monkeypatching.py b/src/pretix/helpers/monkeypatching.py index b56e9c7c6..8d824612c 100644 --- a/src/pretix/helpers/monkeypatching.py +++ b/src/pretix/helpers/monkeypatching.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/names.py b/src/pretix/helpers/names.py index 7ff30db35..14288fb1e 100644 --- a/src/pretix/helpers/names.py +++ b/src/pretix/helpers/names.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/periodic.py b/src/pretix/helpers/periodic.py index 53b0a2b27..a47cc20c1 100644 --- a/src/pretix/helpers/periodic.py +++ b/src/pretix/helpers/periodic.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/profile/__init__.py b/src/pretix/helpers/profile/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/profile/__init__.py +++ b/src/pretix/helpers/profile/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/profile/middleware.py b/src/pretix/helpers/profile/middleware.py index bb2dd25dc..5d39457fa 100644 --- a/src/pretix/helpers/profile/middleware.py +++ b/src/pretix/helpers/profile/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/reportlab.py b/src/pretix/helpers/reportlab.py index 574bf9696..448ac5c84 100644 --- a/src/pretix/helpers/reportlab.py +++ b/src/pretix/helpers/reportlab.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/safe_openpyxl.py b/src/pretix/helpers/safe_openpyxl.py index bef376669..ce305be8c 100644 --- a/src/pretix/helpers/safe_openpyxl.py +++ b/src/pretix/helpers/safe_openpyxl.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/safedownload.py b/src/pretix/helpers/safedownload.py index 4363011c5..87d1f56a3 100644 --- a/src/pretix/helpers/safedownload.py +++ b/src/pretix/helpers/safedownload.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/security.py b/src/pretix/helpers/security.py index 8c8a115cb..baa8f3a15 100644 --- a/src/pretix/helpers/security.py +++ b/src/pretix/helpers/security.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/template_loaders.py b/src/pretix/helpers/template_loaders.py index 419bd2263..7d6df44d3 100644 --- a/src/pretix/helpers/template_loaders.py +++ b/src/pretix/helpers/template_loaders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/__init__.py b/src/pretix/helpers/templatetags/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/helpers/templatetags/__init__.py +++ b/src/pretix/helpers/templatetags/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/captureas.py b/src/pretix/helpers/templatetags/captureas.py index c3c925cbc..d975afcb5 100644 --- a/src/pretix/helpers/templatetags/captureas.py +++ b/src/pretix/helpers/templatetags/captureas.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/date_fast.py b/src/pretix/helpers/templatetags/date_fast.py index 668ed65b8..34604c55a 100644 --- a/src/pretix/helpers/templatetags/date_fast.py +++ b/src/pretix/helpers/templatetags/date_fast.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/expiresformat.py b/src/pretix/helpers/templatetags/expiresformat.py index 8bc0f8ea9..4a5fcb8eb 100644 --- a/src/pretix/helpers/templatetags/expiresformat.py +++ b/src/pretix/helpers/templatetags/expiresformat.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/jsonfield.py b/src/pretix/helpers/templatetags/jsonfield.py index 2c4362aa4..00256d9aa 100644 --- a/src/pretix/helpers/templatetags/jsonfield.py +++ b/src/pretix/helpers/templatetags/jsonfield.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/simple_block_tag.py b/src/pretix/helpers/templatetags/simple_block_tag.py index a71bab7b0..3b83a112d 100644 --- a/src/pretix/helpers/templatetags/simple_block_tag.py +++ b/src/pretix/helpers/templatetags/simple_block_tag.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/templatetags/thumb.py b/src/pretix/helpers/templatetags/thumb.py index d3895a557..a51edbf7b 100644 --- a/src/pretix/helpers/templatetags/thumb.py +++ b/src/pretix/helpers/templatetags/thumb.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/thumb.py b/src/pretix/helpers/thumb.py index 5ebf9d70b..bf37f78e7 100644 --- a/src/pretix/helpers/thumb.py +++ b/src/pretix/helpers/thumb.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/u2f.py b/src/pretix/helpers/u2f.py index f2626639f..5d8f2ea48 100644 --- a/src/pretix/helpers/u2f.py +++ b/src/pretix/helpers/u2f.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/helpers/urls.py b/src/pretix/helpers/urls.py index f3731119e..7a91d498a 100644 --- a/src/pretix/helpers/urls.py +++ b/src/pretix/helpers/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/locale/ang/LC_MESSAGES/django.po b/src/pretix/locale/ang/LC_MESSAGES/django.po index afdf4247e..5e133204a 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-09-26 11:16+0000\n" +"POT-Creation-Date: 2025-10-29 07:54+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -171,15 +171,15 @@ msgstr "" msgid "pretixSCAN (online only, no order sync)" msgstr "" -#: pretix/api/models.py:39 pretix/base/models/customers.py:402 +#: pretix/api/models.py:39 pretix/base/models/customers.py:422 msgid "Application name" msgstr "" -#: pretix/api/models.py:42 pretix/base/models/customers.py:425 +#: pretix/api/models.py:42 pretix/base/models/customers.py:445 msgid "Redirection URIs" msgstr "" -#: pretix/api/models.py:43 pretix/base/models/customers.py:426 +#: pretix/api/models.py:43 pretix/base/models/customers.py:446 msgid "Allowed URIs list, space separated" msgstr "" @@ -187,7 +187,7 @@ msgstr "" msgid "Allowed Post Logout URIs list, space separated" msgstr "" -#: pretix/api/models.py:51 pretix/base/models/customers.py:406 +#: pretix/api/models.py:51 pretix/base/models/customers.py:426 #: pretix/plugins/paypal/payment.py:114 pretix/plugins/paypal2/payment.py:111 msgid "Client ID" msgstr "" @@ -215,8 +215,8 @@ msgstr "" msgid "Limit to events" msgstr "" -#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:285 -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:286 +#: 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 @@ -224,16 +224,16 @@ msgstr "" #: 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/checkinlists/exporters.py:524 +#: pretix/plugins/checkinlists/exporters.py:525 msgid "Comment" msgstr "" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1466 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1471 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "" -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1722 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1718 #: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 msgid "One or more items do not belong to this event." msgstr "" @@ -337,30 +337,30 @@ msgstr "" msgid "\"{input}\" is not a valid choice." msgstr "" -#: pretix/api/serializers/order.py:1427 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1589 +#: pretix/api/serializers/order.py:1432 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1619 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "" -#: pretix/api/serializers/order.py:1453 pretix/api/serializers/order.py:1460 +#: pretix/api/serializers/order.py:1458 pretix/api/serializers/order.py:1465 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "" -#: pretix/api/serializers/order.py:1475 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1480 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." msgstr "" #: pretix/api/serializers/organizer.py:145 -#: pretix/control/forms/organizer.py:893 pretix/presale/forms/customer.py:458 +#: pretix/control/forms/organizer.py:925 pretix/presale/forms/customer.py:458 msgid "An account with this email address is already registered." msgstr "" #: pretix/api/serializers/organizer.py:278 -#: pretix/control/forms/organizer.py:746 +#: pretix/control/forms/organizer.py:761 msgid "" "A gift card with the same secret already exists in your or an affiliated " "organizer account." @@ -390,30 +390,30 @@ msgstr "" msgid "Medium connected to other event" msgstr "" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:754 +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:755 #, 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:1601 -#: pretix/presale/views/order.py:733 pretix/presale/views/order.py:806 +#: pretix/api/views/order.py:608 pretix/control/views/orders.py:1603 +#: 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:1603 -#: pretix/presale/views/order.py:735 pretix/presale/views/order.py:808 +#: pretix/api/views/order.py:613 pretix/control/views/orders.py:1605 +#: 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:1762 +#: pretix/api/views/order.py:639 pretix/control/views/orders.py:1764 #: 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:790 +#: pretix/base/services/orders.py:191 pretix/presale/views/order.py:800 msgid "One of the selected products is not available in the selected country." msgstr "" @@ -432,7 +432,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:1562 +#: pretix/control/views/orders.py:1564 msgid "Order canceled" msgstr "" @@ -609,14 +609,14 @@ msgid "Customer account anonymized" msgstr "" #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 -#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1046 -#: pretix/base/forms/questions.py:1077 pretix/base/forms/questions.py:1329 -#: pretix/base/payment.py:96 pretix/control/forms/event.py:792 +#: 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:1454 pretix/control/forms/mailsetup.py:87 +#: pretix/control/forms/event.py:1455 pretix/control/forms/mailsetup.py:87 #: pretix/control/forms/mailsetup.py:129 pretix/control/forms/subevents.py:181 -#: pretix/plugins/banktransfer/payment.py:506 -#: pretix/plugins/banktransfer/payment.py:512 +#: pretix/plugins/banktransfer/payment.py:507 +#: pretix/plugins/banktransfer/payment.py:513 #: pretix/presale/forms/customer.py:152 msgid "This field is required." msgstr "" @@ -635,21 +635,21 @@ msgid "{system} User" msgstr "" #: pretix/base/auth.py:155 pretix/base/exporters/customers.py:67 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:453 -#: pretix/base/exporters/orderlist.py:586 -#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/auth.py:257 +#: 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/models/customers.py:94 pretix/base/models/notifications.py:46 +#: pretix/base/models/customers.py:101 pretix/base/models/notifications.py:46 #: pretix/base/models/orders.py:246 pretix/base/pdf.py:336 #: 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 #: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:108 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:49 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:50 #: pretix/control/templates/pretixcontrol/organizers/customers.html:59 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:161 -#: pretix/plugins/checkinlists/exporters.py:508 +#: pretix/plugins/checkinlists/exporters.py:509 #: pretix/presale/checkoutflow.py:1542 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 @@ -661,7 +661,7 @@ 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/models/customers.py:96 pretix/control/forms/mailsetup.py:57 +#: pretix/base/models/customers.py:103 pretix/control/forms/mailsetup.py:57 #: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 msgid "Password" msgstr "" @@ -751,9 +751,9 @@ 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:743 -#: pretix/presale/views/customer.py:753 pretix/presale/views/customer.py:792 -#: pretix/presale/views/customer.py:866 +#: pretix/base/customersso/oidc.py:278 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 "" @@ -764,21 +764,21 @@ msgid "" "the email address in your customer account." msgstr "" -#: pretix/base/datasync/datasync.py:255 +#: pretix/base/datasync/datasync.py:263 #, python-brace-format msgid "" "Field \"{field_name}\" does not exist. Please check your {provider_name} " "settings." msgstr "" -#: pretix/base/datasync/datasync.py:262 +#: pretix/base/datasync/datasync.py:270 #, python-brace-format msgid "" "Field \"{field_name}\" requires {required_input}, but only got " "{available_inputs}. Please check your {provider_name} settings." msgstr "" -#: pretix/base/datasync/datasync.py:273 +#: pretix/base/datasync/datasync.py:281 #, python-brace-format msgid "" "Please update value mapping for field \"{field_name}\" - option \"{val}\" " @@ -836,16 +836,16 @@ msgid "Event or date information" msgstr "" #: pretix/base/datasync/sourcefields.py:175 -#: pretix/base/exporters/orderlist.py:604 -#: pretix/base/exporters/orderlist.py:609 pretix/base/forms/questions.py:679 -#: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:300 +#: 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/control/forms/filter.py:679 pretix/control/forms/organizer.py:987 +#: pretix/control/forms/filter.py:679 pretix/control/forms/organizer.py:1019 #: pretix/control/templates/pretixcontrol/order/index.html:566 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:120 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:121 #: pretix/control/views/item.py:442 pretix/plugins/badges/exporters.py:495 #: pretix/plugins/checkinlists/exporters.py:121 -#: pretix/plugins/checkinlists/exporters.py:494 +#: pretix/plugins/checkinlists/exporters.py:495 #: pretix/plugins/ticketoutputpdf/exporters.py:94 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:162 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165 @@ -862,8 +862,8 @@ msgid "Attendee" msgstr "" #: pretix/base/datasync/sourcefields.py:207 -#: pretix/base/exporters/orderlist.py:611 pretix/base/forms/questions.py:685 -#: pretix/base/models/customers.py:307 pretix/base/models/orders.py:1512 +#: 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 @@ -906,30 +906,30 @@ msgid "Invoice address company" msgstr "" #: pretix/base/datasync/sourcefields.py:288 -#: pretix/base/exporters/orderlist.py:464 -#: pretix/base/exporters/orderlist.py:469 -#: pretix/base/exporters/orderlist.py:653 -#: pretix/base/exporters/orderlist.py:657 pretix/base/pdf.py:341 +#: 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 msgid "Invoice address name" msgstr "" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:351 msgid "Invoice address street" msgstr "" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:356 msgid "Invoice address ZIP code" msgstr "" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:361 msgid "Invoice address city" msgstr "" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:371 msgid "Invoice address country" msgstr "" @@ -942,29 +942,30 @@ msgid "Order email domain" msgstr "" #: pretix/base/datasync/sourcefields.py:371 -#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:328 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:451 -#: pretix/base/exporters/orderlist.py:583 -#: pretix/base/exporters/orderlist.py:897 pretix/base/models/orders.py:210 +#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: 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/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 #: pretix/control/templates/pretixcontrol/order/index.html:181 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:116 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:22 #: pretix/control/templates/pretixcontrol/orders/index.html:47 #: pretix/control/templates/pretixcontrol/orders/index.html:131 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:204 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:205 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:41 #: pretix/control/templates/pretixcontrol/search/orders.html:48 #: pretix/plugins/badges/exporters.py:497 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:29 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:41 #: pretix/plugins/checkinlists/exporters.py:122 -#: pretix/plugins/checkinlists/exporters.py:493 -#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/plugins/checkinlists/exporters.py:494 +#: pretix/plugins/checkinlists/exporters.py:760 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:895 +#: pretix/plugins/reports/exporters.py:896 #: pretix/plugins/ticketoutputpdf/exporters.py:96 msgid "Order code" msgstr "" @@ -974,11 +975,11 @@ msgid "Event and order code" msgstr "" #: pretix/base/datasync/sourcefields.py:389 -#: pretix/base/exporters/orderlist.py:262 pretix/base/notifications.py:201 +#: pretix/base/exporters/orderlist.py:263 pretix/base/notifications.py:201 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:25 #: pretix/control/templates/pretixcontrol/search/orders.html:60 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:898 msgid "Order total" msgstr "" @@ -987,9 +988,9 @@ msgid "Product and variation name" msgstr "" #: pretix/base/datasync/sourcefields.py:410 pretix/base/exporters/items.py:57 -#: pretix/base/exporters/orderlist.py:597 -#: pretix/base/exporters/orderlist.py:908 -#: pretix/base/exporters/waitinglist.py:112 +#: pretix/base/exporters/orderlist.py:598 +#: pretix/base/exporters/orderlist.py:910 +#: pretix/base/exporters/waitinglist.py:113 msgid "Product ID" msgstr "" @@ -1002,10 +1003,10 @@ msgid "Event short form" msgstr "" #: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:450 -#: pretix/base/exporters/orderlist.py:582 -#: pretix/base/exporters/waitinglist.py:116 pretix/base/models/event.py:595 +#: pretix/base/exporters/orderlist.py:263 +#: 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/control/forms/filter.py:1724 #: pretix/control/templates/pretixcontrol/events/index.html:68 @@ -1014,22 +1015,22 @@ msgid "Event name" msgstr "" #: pretix/base/datasync/sourcefields.py:446 -#: pretix/base/exporters/invoices.py:326 +#: pretix/base/exporters/invoices.py:328 msgid "Event start date" msgstr "" #: pretix/base/datasync/sourcefields.py:455 -#: pretix/base/exporters/invoices.py:350 pretix/base/pdf.py:289 +#: pretix/base/exporters/invoices.py:352 pretix/base/pdf.py:289 msgid "Event end date" msgstr "" #: pretix/base/datasync/sourcefields.py:464 -#: pretix/base/exporters/waitinglist.py:123 +#: pretix/base/exporters/waitinglist.py:124 #: pretix/base/modelimport_vouchers.py:39 pretix/base/models/vouchers.py:193 #: pretix/control/templates/pretixcontrol/vouchers/index.html:18 #: pretix/control/templates/pretixcontrol/vouchers/index.html:114 #: pretix/control/views/vouchers.py:119 pretix/control/views/waitinglist.py:314 -#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/plugins/checkinlists/exporters.py:521 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:74 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:76 #: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:12 @@ -1046,7 +1047,7 @@ msgid "Ticket price" msgstr "" #: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204 -#: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:85 +#: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:90 msgid "Order status" msgstr "" @@ -1063,8 +1064,8 @@ msgid "Payment date and time" msgstr "" #: pretix/base/datasync/sourcefields.py:527 -#: pretix/base/exporters/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:508 +#: pretix/base/exporters/orderlist.py:272 +#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:508 #: pretix/control/templates/pretixcontrol/order/index.html:193 #: pretix/control/templates/pretixcontrol/pdf/index.html:249 msgid "Order locale" @@ -1075,7 +1076,7 @@ msgid "Order position ID" msgstr "" #: pretix/base/datasync/sourcefields.py:545 -#: pretix/base/exporters/orderlist.py:291 +#: pretix/base/exporters/orderlist.py:292 msgid "Order link" msgstr "" @@ -1094,21 +1095,21 @@ msgid "Question: {name}" msgstr "" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3559 -#: pretix/base/settings.py:3572 pretix/base/settings.py:3588 -#: pretix/base/settings.py:3638 pretix/base/settings.py:3651 -#: pretix/base/settings.py:3665 pretix/base/settings.py:3718 -#: pretix/base/settings.py:3739 pretix/base/settings.py:3761 +#: 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 msgid "Given name" msgstr "" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3560 -#: pretix/base/settings.py:3573 pretix/base/settings.py:3589 -#: pretix/base/settings.py:3605 pretix/base/settings.py:3622 -#: pretix/base/settings.py:3637 pretix/base/settings.py:3652 -#: pretix/base/settings.py:3666 pretix/base/settings.py:3719 -#: pretix/base/settings.py:3740 pretix/base/settings.py:3762 +#: 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 msgid "Family name" msgstr "" @@ -1130,27 +1131,27 @@ msgstr "" msgid "Simple with logo" msgstr "" -#: pretix/base/exporter.py:187 pretix/base/exporter.py:320 +#: pretix/base/exporter.py:199 pretix/base/exporter.py:332 msgid "Export format" msgstr "" -#: pretix/base/exporter.py:189 +#: pretix/base/exporter.py:201 msgid "Excel (.xlsx)" msgstr "" -#: pretix/base/exporter.py:190 pretix/base/exporter.py:312 +#: pretix/base/exporter.py:202 pretix/base/exporter.py:324 msgid "CSV (with commas)" msgstr "" -#: pretix/base/exporter.py:191 pretix/base/exporter.py:313 +#: pretix/base/exporter.py:203 pretix/base/exporter.py:325 msgid "CSV (Excel-style)" msgstr "" -#: pretix/base/exporter.py:192 pretix/base/exporter.py:314 +#: pretix/base/exporter.py:204 pretix/base/exporter.py:326 msgid "CSV (with semicolons)" msgstr "" -#: pretix/base/exporter.py:308 +#: pretix/base/exporter.py:320 msgid "Combined Excel (.xlsx)" msgstr "" @@ -1160,9 +1161,9 @@ msgstr "" #: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52 #: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:88 -#: pretix/base/exporters/orderlist.py:841 -#: pretix/base/exporters/orderlist.py:1020 -#: pretix/base/exporters/orderlist.py:1259 +#: pretix/base/exporters/orderlist.py:842 +#: pretix/base/exporters/orderlist.py:1022 +#: pretix/base/exporters/orderlist.py:1263 #: pretix/plugins/reports/exporters.py:489 #: pretix/plugins/reports/exporters.py:662 msgctxt "export_category" @@ -1175,12 +1176,12 @@ msgid "" "customers while creating an order." msgstr "" -#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:592 -#: pretix/base/exporters/orderlist.py:916 -#: pretix/base/exporters/orderlist.py:1156 pretix/base/models/checkin.py:58 +#: 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:3010 pretix/base/models/vouchers.py:190 -#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1619 +#: 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/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 @@ -1195,8 +1196,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/index.html:140 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:167 #: pretix/control/views/waitinglist.py:318 -#: pretix/plugins/checkinlists/exporters.py:512 -#: pretix/plugins/checkinlists/exporters.py:701 +#: pretix/plugins/checkinlists/exporters.py:513 +#: pretix/plugins/checkinlists/exporters.py:703 #: pretix/plugins/sendmail/forms.py:137 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:32 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:48 @@ -1207,7 +1208,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:1620 +#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1621 #: 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 @@ -1238,8 +1239,8 @@ msgstr "" msgid "Download a spreadsheet of all currently registered customer accounts." msgstr "" -#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:29 +#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:89 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:30 #: pretix/control/templates/pretixcontrol/organizers/customers.html:54 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:37 #: pretix/presale/templates/pretixpresale/organizers/customer_base.html:37 @@ -1247,29 +1248,29 @@ msgid "Customer ID" msgstr "" #: pretix/base/exporters/customers.py:65 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:32 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:33 msgid "SSO provider" msgstr "" -#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:36 +#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:115 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:37 #: pretix/control/templates/pretixcontrol/organizers/customers.html:65 #: pretix/control/templates/pretixcontrol/users/form.html:49 msgid "External identifier" msgstr "" -#: pretix/base/exporters/customers.py:68 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/modelimport_orders.py:87 pretix/base/models/customers.py:95 -#: pretix/base/models/customers.py:396 pretix/base/models/items.py:1659 +#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/orderlist.py:455 +#: 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/orders.py:250 pretix/base/models/waitinglist.py:80 #: pretix/base/pdf.py:331 #: 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:509 +#: pretix/plugins/checkinlists/exporters.py:510 #: pretix/presale/checkoutflow.py:1548 pretix/presale/forms/checkout.py:84 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 @@ -1277,32 +1278,32 @@ msgid "Phone number" msgstr "" #: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:246 -#: pretix/base/models/customers.py:97 pretix/base/models/orders.py:3281 -#: pretix/base/settings.py:3692 pretix/base/settings.py:3704 +#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3295 +#: pretix/base/settings.py:3721 pretix/base/settings.py:3733 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "" -#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:206 -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:332 -#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/questions.py:1244 +#: 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/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:1766 +#: 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/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:3317 -#: pretix/base/settings.py:3327 pretix/base/settings.py:3681 +#: 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/control/forms/organizer.py:918 +#: 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/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/organizers/customer.html:58 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:62 #: pretix/control/templates/pretixcontrol/organizers/devices.html:77 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:26 @@ -1314,8 +1315,8 @@ msgstr "" #: pretix/control/views/waitinglist.py:314 pretix/plugins/badges/models.py:53 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:34 #: pretix/plugins/checkinlists/exporters.py:376 -#: pretix/plugins/checkinlists/exporters.py:761 -#: pretix/plugins/reports/exporters.py:896 +#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/reports/exporters.py:897 #: pretix/plugins/ticketoutputpdf/models.py:333 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:32 #: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:483 @@ -1327,43 +1328,43 @@ msgstr "" msgid "Name" msgstr "" -#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99 +#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:106 msgid "Account active" msgstr "" -#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100 +#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:107 msgid "Verified email address" msgstr "" -#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:68 +#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:108 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:69 msgid "Last login" msgstr "" -#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:66 +#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:109 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:67 msgid "Registration date" msgstr "" -#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205 -#: pretix/base/exporters/waitinglist.py:120 pretix/base/models/auth.py:258 -#: pretix/base/models/customers.py:106 pretix/base/models/exports.py:54 -#: pretix/control/forms/event.py:1625 pretix/control/forms/exports.py:49 +#: 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/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/exports.py:88 pretix/control/views/waitinglist.py:315 msgid "Language" msgstr "" #: pretix/base/exporters/customers.py:82 -#: pretix/base/exporters/reusablemedia.py:53 -#: pretix/base/models/customers.py:109 pretix/base/models/media.py:110 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:72 +#: pretix/base/exporters/reusablemedia.py:54 +#: pretix/base/models/customers.py:116 pretix/base/models/media.py:110 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:73 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68 msgid "Notes" msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:305 pretix/base/exporters/items.py:150 +#: pretix/base/exporters/invoices.py:307 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 @@ -1378,51 +1379,51 @@ msgstr "" #: pretix/base/exporters/items.py:213 pretix/base/exporters/items.py:214 #: pretix/base/exporters/items.py:215 pretix/base/exporters/items.py:218 #: pretix/base/exporters/items.py:221 pretix/base/exporters/items.py:222 -#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:395 -#: pretix/base/exporters/orderlist.py:400 -#: pretix/base/exporters/orderlist.py:752 -#: pretix/base/exporters/orderlist.py:775 -#: pretix/base/exporters/orderlist.py:807 -#: pretix/base/exporters/orderlist.py:1399 -#: pretix/base/exporters/reusablemedia.py:63 pretix/base/modelimport.py:194 +#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:396 +#: pretix/base/exporters/orderlist.py:401 +#: pretix/base/exporters/orderlist.py:753 +#: 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:194 #: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1401 -#: pretix/base/models/orders.py:3427 pretix/control/forms/filter.py:177 +#: pretix/base/models/orders.py:3441 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/views/vouchers.py:140 -#: pretix/plugins/checkinlists/exporters.py:601 -#: pretix/plugins/checkinlists/exporters.py:604 -#: pretix/plugins/checkinlists/exporters.py:631 -#: pretix/plugins/checkinlists/exporters.py:647 -#: pretix/plugins/checkinlists/exporters.py:716 -#: pretix/plugins/checkinlists/exporters.py:823 -#: pretix/plugins/checkinlists/exporters.py:824 -#: pretix/plugins/checkinlists/exporters.py:825 +#: pretix/plugins/checkinlists/exporters.py:602 +#: pretix/plugins/checkinlists/exporters.py:605 +#: pretix/plugins/checkinlists/exporters.py:632 +#: pretix/plugins/checkinlists/exporters.py:648 +#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:826 +#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:828 msgid "Yes" msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:305 pretix/base/exporters/orderlist.py:395 -#: pretix/base/exporters/orderlist.py:400 -#: pretix/base/exporters/orderlist.py:775 -#: pretix/base/exporters/orderlist.py:807 -#: pretix/base/exporters/orderlist.py:1399 -#: pretix/base/exporters/reusablemedia.py:63 pretix/base/modelimport.py:193 +#: pretix/base/exporters/invoices.py:307 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:3429 pretix/control/forms/filter.py:177 +#: pretix/base/models/orders.py:3443 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/views/vouchers.py:140 -#: pretix/plugins/checkinlists/exporters.py:601 -#: pretix/plugins/checkinlists/exporters.py:604 -#: pretix/plugins/checkinlists/exporters.py:631 -#: pretix/plugins/checkinlists/exporters.py:716 -#: pretix/plugins/checkinlists/exporters.py:823 -#: pretix/plugins/checkinlists/exporters.py:824 -#: pretix/plugins/checkinlists/exporters.py:825 +#: pretix/plugins/checkinlists/exporters.py:602 +#: pretix/plugins/checkinlists/exporters.py:605 +#: pretix/plugins/checkinlists/exporters.py:632 +#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:826 +#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:828 msgid "No" msgstr "" @@ -1443,14 +1444,14 @@ msgid "Event ticket {event}-{code}" msgstr "" #: pretix/base/exporters/dekodi.py:234 pretix/base/exporters/invoices.py:74 -#: pretix/base/exporters/orderlist.py:129 -#: pretix/base/exporters/orderlist.py:855 -#: pretix/base/exporters/orderlist.py:1209 +#: pretix/base/exporters/orderlist.py:130 +#: pretix/base/exporters/orderlist.py:857 +#: pretix/base/exporters/orderlist.py:1213 #: pretix/plugins/checkinlists/exporters.py:89 -#: pretix/plugins/checkinlists/exporters.py:865 +#: pretix/plugins/checkinlists/exporters.py:868 #: pretix/plugins/reports/accountingreport.py:75 #: pretix/plugins/reports/exporters.py:472 -#: pretix/plugins/reports/exporters.py:709 +#: pretix/plugins/reports/exporters.py:710 #: pretix/plugins/ticketoutputpdf/exporters.py:85 msgid "Date range" msgstr "" @@ -1496,21 +1497,21 @@ 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:3315 -#: pretix/base/settings.py:3325 pretix/control/forms/subevents.py:483 +#: pretix/base/models/event.py:1526 pretix/base/settings.py:3344 +#: pretix/base/settings.py:3354 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/control/forms/subevents.py:488 +#: 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:493 +#: pretix/base/models/event.py:1530 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 msgid "Admission time" msgstr "" @@ -1525,8 +1526,9 @@ msgstr "" msgid "End of presale" msgstr "" -#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:351 +#: 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/templates/pretixbase/email/order_details.html:83 msgid "Location" msgstr "" @@ -1552,7 +1554,7 @@ msgid "Internal comment" msgstr "" #: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753 -#: pretix/base/models/orders.py:2173 pretix/control/forms/filter.py:209 +#: pretix/base/models/orders.py:2187 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 @@ -1587,18 +1589,18 @@ msgstr "" msgid "Download all invoices created by the system as a ZIP file of PDF files." msgstr "" -#: pretix/base/exporters/invoices.py:178 +#: pretix/base/exporters/invoices.py:179 msgid "Invoice data" msgstr "" -#: pretix/base/exporters/invoices.py:179 +#: pretix/base/exporters/invoices.py:180 msgid "" "Download a spreadsheet with the data of all invoices created by the system. " "The spreadsheet includes two sheets, one with a line for every invoice, and " "one with a line for every position of every invoice." msgstr "" -#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:579 +#: 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/organizers/edit.html:312 @@ -1607,244 +1609,245 @@ msgstr "" msgid "Invoices" msgstr "" -#: pretix/base/exporters/invoices.py:192 +#: pretix/base/exporters/invoices.py:194 msgid "Invoice lines" msgstr "" -#: pretix/base/exporters/invoices.py:199 pretix/base/exporters/invoices.py:318 +#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:320 msgid "Invoice number" msgstr "" -#: pretix/base/exporters/invoices.py:200 pretix/base/exporters/invoices.py:327 -#: pretix/base/exporters/orderlist.py:1232 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/waitinglist.py:107 pretix/base/forms/widgets.py:213 +#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: 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:2985 pretix/base/models/orders.py:3105 +#: pretix/base/models/orders.py:2999 pretix/base/models/orders.py:3119 +#: 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 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:72 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:80 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:11 -#: pretix/plugins/checkinlists/exporters.py:753 +#: pretix/plugins/checkinlists/exporters.py:756 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:6 #: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:58 msgid "Date" msgstr "" -#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 #: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59 -#: pretix/base/models/customers.py:395 pretix/base/models/waitinglist.py:76 +#: pretix/base/models/customers.py:415 pretix/base/models/waitinglist.py:76 #: pretix/control/forms/filter.py:584 #: pretix/control/templates/pretixcontrol/users/index.html:42 #: pretix/control/views/waitinglist.py:314 msgid "Email address" msgstr "" -#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:332 msgid "Invoice type" msgstr "" -#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 +#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:333 msgid "Cancellation of" msgstr "" -#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:207 #: 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:332 -#: pretix/base/exporters/invoices.py:333 pretix/base/exporters/invoices.py:334 +#: 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 msgid "Invoice sender:" msgstr "" -#: pretix/base/exporters/invoices.py:207 pretix/base/exporters/invoices.py:333 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:613 pretix/base/forms/questions.py:704 +#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:335 +#: 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:311 pretix/base/models/orders.py:1539 -#: pretix/base/models/orders.py:3283 pretix/control/forms/filter.py:660 +#: 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/control/forms/filter.py:691 #: pretix/control/templates/pretixcontrol/order/index.html:1001 -#: pretix/plugins/checkinlists/exporters.py:535 -#: pretix/plugins/reports/exporters.py:851 +#: pretix/plugins/checkinlists/exporters.py:536 +#: pretix/plugins/reports/exporters.py:852 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 #: pretix/presale/templates/pretixpresale/event/order.html:316 msgid "Address" msgstr "" -#: 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:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:614 pretix/base/forms/questions.py:715 +#: 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/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:312 pretix/base/models/orders.py:1540 -#: pretix/base/models/orders.py:3284 pretix/base/settings.py:1162 +#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1540 +#: pretix/base/models/orders.py:3298 pretix/base/settings.py:1191 #: pretix/control/forms/filter.py:664 pretix/control/forms/filter.py:695 #: pretix/control/views/item.py:488 -#: pretix/plugins/checkinlists/exporters.py:536 -#: pretix/plugins/reports/exporters.py:852 +#: pretix/plugins/checkinlists/exporters.py:537 +#: pretix/plugins/reports/exporters.py:853 msgid "ZIP code" msgstr "" -#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:217 -#: pretix/base/exporters/invoices.py:335 pretix/base/exporters/invoices.py:343 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:615 pretix/base/forms/questions.py:723 +#: 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/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:313 pretix/base/models/orders.py:1541 -#: pretix/base/models/orders.py:3285 pretix/base/settings.py:1174 +#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1541 +#: pretix/base/models/orders.py:3299 pretix/base/settings.py:1203 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 #: pretix/control/views/item.py:498 -#: pretix/plugins/checkinlists/exporters.py:537 -#: pretix/plugins/reports/exporters.py:853 -msgid "City" -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/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:616 pretix/base/forms/questions.py:735 -#: pretix/base/modelimport_orders.py:274 pretix/base/modelimport_orders.py:425 -#: pretix/base/models/customers.py:314 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3286 pretix/base/models/orders.py:3287 -#: pretix/base/settings.py:1183 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/plugins/checkinlists/exporters.py:538 -#: pretix/plugins/reports/exporters.py:803 -#: pretix/plugins/reports/exporters.py:848 -#: pretix/plugins/reports/exporters.py:897 -#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:92 -#: pretix/presale/templates/pretixpresale/event/order.html:320 -msgid "Country" -msgstr "" - -#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:337 -msgid "Tax ID" +#: 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/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:662 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3290 +#: 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/control/forms/filter.py:705 +#: pretix/control/templates/pretixcontrol/order/index.html:1005 +#: pretix/control/views/item.py:508 +#: pretix/plugins/checkinlists/exporters.py:539 +#: pretix/plugins/reports/exporters.py:804 +#: pretix/plugins/reports/exporters.py:849 +#: pretix/plugins/reports/exporters.py:898 +#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:92 +#: pretix/presale/templates/pretixpresale/event/order.html:320 +msgid "Country" +msgstr "" + +#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 +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/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/plugins/reports/exporters.py:855 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:856 +#: pretix/plugins/reports/exporters.py:898 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 #: pretix/presale/templates/pretixpresale/event/order.html:327 msgid "VAT ID" msgstr "" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:214 #: 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:339 pretix/base/exporters/invoices.py:340 +#: 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: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 msgid "Invoice recipient:" msgstr "" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:463 -#: pretix/base/exporters/orderlist.py:612 -#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:696 +#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: 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/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/plugins/checkinlists/exporters.py:519 -#: pretix/plugins/reports/exporters.py:850 -#: pretix/plugins/reports/exporters.py:896 +#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/plugins/reports/exporters.py:851 +#: pretix/plugins/reports/exporters.py:897 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 #: pretix/presale/templates/pretixpresale/event/order.html:308 msgid "Company" msgstr "" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:343 msgid "Street address" msgstr "" -#: pretix/base/exporters/invoices.py:219 pretix/base/exporters/invoices.py:345 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:617 pretix/base/forms/questions.py:760 -#: pretix/base/forms/questions.py:1194 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:315 pretix/base/models/orders.py:1543 -#: pretix/base/models/orders.py:3289 pretix/base/views/js_helpers.py:48 +#: 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:539 -#: pretix/plugins/reports/exporters.py:854 +#: 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:221 pretix/base/exporters/invoices.py:347 -#: pretix/base/models/orders.py:3299 pretix/base/models/orders.py:3355 +#: 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/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "" -#: pretix/base/exporters/invoices.py:222 pretix/base/exporters/invoices.py:348 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3294 +#: 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/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "" -#: pretix/base/exporters/invoices.py:223 pretix/base/models/tax.py:162 -#: pretix/control/forms/event.py:1515 +#: pretix/base/exporters/invoices.py:225 pretix/base/models/tax.py:162 +#: pretix/control/forms/event.py:1516 msgid "Reverse charge" msgstr "" -#: pretix/base/exporters/invoices.py:224 +#: pretix/base/exporters/invoices.py:226 msgid "Shown foreign currency" msgstr "" -#: pretix/base/exporters/invoices.py:225 +#: pretix/base/exporters/invoices.py:227 msgid "Foreign currency rate" msgstr "" -#: pretix/base/exporters/invoices.py:226 +#: pretix/base/exporters/invoices.py:228 msgid "Total value (with taxes)" msgstr "" -#: pretix/base/exporters/invoices.py:227 +#: pretix/base/exporters/invoices.py:229 msgid "Total value (without taxes)" msgstr "" -#: pretix/base/exporters/invoices.py:228 +#: pretix/base/exporters/invoices.py:230 msgid "Payment matching IDs" msgstr "" -#: pretix/base/exporters/invoices.py:229 pretix/base/exporters/invoices.py:349 -#: pretix/base/exporters/orderlist.py:290 -#: pretix/base/exporters/orderlist.py:475 -#: pretix/base/exporters/orderlist.py:670 pretix/base/plugins.py:137 +#: pretix/base/exporters/invoices.py:231 pretix/base/exporters/invoices.py:351 +#: pretix/base/exporters/orderlist.py:291 +#: pretix/base/exporters/orderlist.py:476 +#: pretix/base/exporters/orderlist.py:671 pretix/base/plugins.py:139 #: pretix/control/templates/pretixcontrol/event/payment.html:11 msgid "Payment providers" msgstr "" -#: pretix/base/exporters/invoices.py:285 pretix/base/exporters/invoices.py:388 +#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 msgid "Cancellation" msgstr "" -#: pretix/base/exporters/invoices.py:285 pretix/base/exporters/invoices.py:388 +#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 #: 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 @@ -1852,44 +1855,44 @@ msgstr "" msgid "Invoice" msgstr "" -#: pretix/base/exporters/invoices.py:319 +#: pretix/base/exporters/invoices.py:321 msgid "Line number" msgstr "" -#: pretix/base/exporters/invoices.py:320 pretix/base/exporters/orderlist.py:458 +#: 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/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "" -#: pretix/base/exporters/invoices.py:321 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:323 pretix/control/forms/orders.py:355 msgid "Gross price" msgstr "" -#: pretix/base/exporters/invoices.py:322 +#: pretix/base/exporters/invoices.py:324 msgid "Net price" msgstr "" -#: pretix/base/exporters/invoices.py:323 pretix/base/exporters/orderlist.py:462 -#: pretix/base/exporters/orderlist.py:603 -#: pretix/base/exporters/orderlist.py:922 pretix/base/models/orders.py:2337 -#: pretix/base/models/orders.py:2509 pretix/base/models/orders.py:3031 +#: pretix/base/exporters/invoices.py:325 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 msgid "Tax value" msgstr "" -#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:460 -#: pretix/base/exporters/orderlist.py:601 -#: pretix/base/exporters/orderlist.py:919 pretix/base/models/orders.py:2324 -#: pretix/base/models/orders.py:2496 pretix/base/models/orders.py:3018 -#: pretix/base/models/orders.py:3118 pretix/base/models/tax.py:348 +#: pretix/base/exporters/invoices.py:326 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/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 -#: pretix/plugins/reports/exporters.py:804 -#: pretix/plugins/reports/exporters.py:849 +#: pretix/plugins/reports/exporters.py:805 +#: pretix/plugins/reports/exporters.py:850 msgid "Tax rate" msgstr "" -#: pretix/base/exporters/invoices.py:325 +#: pretix/base/exporters/invoices.py:327 msgid "Tax name" msgstr "" @@ -1897,7 +1900,7 @@ msgstr "" msgid "Product data" msgstr "" -#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1146 +#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1149 msgctxt "export_category" msgid "Product data" msgstr "" @@ -1906,9 +1909,9 @@ msgstr "" msgid "Download a spreadsheet with details about all products and variations." msgstr "" -#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:599 -#: pretix/base/exporters/orderlist.py:910 -#: pretix/base/exporters/waitinglist.py:114 +#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:600 +#: pretix/base/exporters/orderlist.py:912 +#: pretix/base/exporters/waitinglist.py:115 msgid "Variation ID" msgstr "" @@ -1930,16 +1933,16 @@ msgstr "" msgid "Item name" msgstr "" -#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:598 -#: pretix/base/exporters/orderlist.py:911 -#: pretix/base/exporters/waitinglist.py:113 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1495 pretix/base/models/orders.py:3003 -#: pretix/plugins/checkinlists/exporters.py:696 +#: 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/plugins/checkinlists/exporters.py:698 msgid "Variation" msgstr "" -#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:48 -#: pretix/base/models/customers.py:57 pretix/base/models/customers.py:403 +#: 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 @@ -1954,7 +1957,7 @@ msgid "Active" msgstr "" #: pretix/base/exporters/items.py:72 pretix/base/models/discount.py:77 -#: pretix/control/forms/event.py:976 pretix/control/navigation.py:520 +#: pretix/control/forms/event.py:977 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 @@ -1990,9 +1993,9 @@ msgstr "" msgid "Generate tickets" msgstr "" -#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1153 +#: 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:1695 pretix/control/navigation.py:237 +#: pretix/control/forms/event.py:1696 pretix/control/navigation.py:237 #: pretix/control/templates/pretixcontrol/event/settings.html:363 #: pretix/control/templates/pretixcontrol/orders/cancel.html:62 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:6 @@ -2016,21 +2019,21 @@ 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/payment.py:392 pretix/control/forms/subevents.py:323 +#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 #: pretix/control/forms/subevents.py:345 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:506 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:172 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:149 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:150 msgid "Available from" 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/payment.py:398 pretix/control/forms/subevents.py:328 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:511 +#: 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 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:154 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:155 msgid "Available until" msgstr "" @@ -2064,17 +2067,17 @@ msgstr "" msgid "Maximum amount per order" msgstr "" -#: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:283 +#: 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/plugins/checkinlists/exporters.py:523 +#: pretix/plugins/checkinlists/exporters.py:524 msgid "Requires special attention" msgstr "" -#: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:284 +#: 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/plugins/checkinlists/exporters.py:525 +#: pretix/plugins/checkinlists/exporters.py:526 msgid "Check-in text" msgstr "" @@ -2120,7 +2123,7 @@ msgid "" msgstr "" #: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:498 -#: pretix/plugins/reports/exporters.py:680 +#: pretix/plugins/reports/exporters.py:681 msgid "Filter by status" msgstr "" @@ -2131,77 +2134,78 @@ msgid "" "position, and one with a line for every additional fee charged in an order." msgstr "" -#: pretix/base/exporters/orderlist.py:101 pretix/base/models/orders.py:332 +#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:332 #: 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:198 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:199 #: pretix/plugins/reports/accountingreport.py:671 #: pretix/plugins/reports/accountingreport.py:863 -#: pretix/plugins/reports/exporters.py:668 pretix/plugins/statistics/apps.py:39 +#: 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:102 pretix/base/models/orders.py:2558 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2572 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "" -#: pretix/base/exporters/orderlist.py:103 +#: pretix/base/exporters/orderlist.py:104 msgid "Order fees" msgstr "" -#: pretix/base/exporters/orderlist.py:111 +#: pretix/base/exporters/orderlist.py:112 msgid "Only paid orders" msgstr "" -#: pretix/base/exporters/orderlist.py:117 +#: pretix/base/exporters/orderlist.py:118 msgid "Include payment amounts" msgstr "" -#: pretix/base/exporters/orderlist.py:123 +#: pretix/base/exporters/orderlist.py:124 msgid "Show multiple choice answers grouped in one column" msgstr "" -#: pretix/base/exporters/orderlist.py:132 -#: pretix/plugins/reports/exporters.py:712 +#: pretix/base/exporters/orderlist.py:133 +#: pretix/plugins/reports/exporters.py:713 msgid "Only include orders created within this date range." msgstr "" -#: pretix/base/exporters/orderlist.py:136 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/plugins/badges/exporters.py:499 +#: 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/plugins/reports/exporters.py:316 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 msgid "Event date" msgstr "" -#: pretix/base/exporters/orderlist.py:139 +#: pretix/base/exporters/orderlist.py:140 msgid "" "Only include orders including at least one ticket for a date in this range. " "Will also include other dates in case of mixed orders!" msgstr "" -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:449 -#: pretix/base/exporters/orderlist.py:581 -#: pretix/base/exporters/orderlist.py:894 -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/waitinglist.py:115 pretix/control/forms/event.py:1671 +#: pretix/base/exporters/orderlist.py:263 +#: pretix/base/exporters/orderlist.py:450 +#: pretix/base/exporters/orderlist.py:582 +#: 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/control/forms/organizer.py:116 msgid "Event slug" msgstr "" -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:452 -#: pretix/base/exporters/orderlist.py:585 -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1330 -#: pretix/base/exporters/waitinglist.py:122 -#: pretix/base/exporters/waitinglist.py:172 pretix/base/models/orders.py:216 +#: pretix/base/exporters/orderlist.py:263 +#: pretix/base/exporters/orderlist.py:453 +#: pretix/base/exporters/orderlist.py:586 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1335 +#: pretix/base/exporters/waitinglist.py:123 +#: pretix/base/exporters/waitinglist.py:173 pretix/base/models/orders.py:216 #: pretix/control/forms/filter.py:1050 pretix/control/forms/filter.py:1229 #: pretix/control/forms/filter.py:1455 pretix/control/forms/filter.py:1524 #: pretix/control/forms/filter.py:1596 pretix/control/forms/filter.py:1696 @@ -2209,15 +2213,15 @@ 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:83 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 #: 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/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:39 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:209 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:40 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:210 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:46 #: pretix/control/templates/pretixcontrol/organizers/detail.html:70 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:34 @@ -2230,155 +2234,156 @@ msgstr "" #: pretix/control/views/waitinglist.py:314 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html:9 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:898 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:34 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:79 msgid "Status" msgstr "" -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:455 -#: pretix/base/exporters/orderlist.py:588 -#: pretix/base/exporters/orderlist.py:898 pretix/base/notifications.py:203 +#: pretix/base/exporters/orderlist.py:264 +#: 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/control/forms/filter.py:2356 #: pretix/control/templates/pretixcontrol/order/index.html:183 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 #: pretix/control/templates/pretixcontrol/orders/index.html:140 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:206 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:207 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:45 #: pretix/control/templates/pretixcontrol/search/orders.html:57 #: pretix/plugins/badges/exporters.py:498 #: pretix/plugins/checkinlists/exporters.py:123 -#: pretix/plugins/checkinlists/exporters.py:521 +#: pretix/plugins/checkinlists/exporters.py:522 #: pretix/plugins/reports/exporters.py:509 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:691 -#: pretix/plugins/reports/exporters.py:702 -#: pretix/plugins/reports/exporters.py:895 +#: pretix/plugins/reports/exporters.py:692 +#: pretix/plugins/reports/exporters.py:703 +#: pretix/plugins/reports/exporters.py:896 msgid "Order date" msgstr "" -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:456 -#: pretix/base/exporters/orderlist.py:589 -#: pretix/base/exporters/orderlist.py:899 -#: pretix/plugins/checkinlists/exporters.py:522 +#: pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/orderlist.py:457 +#: pretix/base/exporters/orderlist.py:590 +#: pretix/base/exporters/orderlist.py:901 +#: pretix/plugins/checkinlists/exporters.py:523 msgid "Order time" msgstr "" -#: pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:272 msgid "Custom address field" msgstr "" -#: pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:272 msgid "Date of last payment" msgstr "" -#: pretix/base/exporters/orderlist.py:271 pretix/base/services/stats.py:238 +#: pretix/base/exporters/orderlist.py:272 pretix/base/services/stats.py:238 msgid "Fees" msgstr "" -#: pretix/base/exporters/orderlist.py:276 -#, python-brace-format -msgid "Gross at {rate} % tax" -msgstr "" - #: pretix/base/exporters/orderlist.py:277 #, python-brace-format -msgid "Net at {rate} % tax" +msgid "Gross at {rate} % tax" msgstr "" #: pretix/base/exporters/orderlist.py:278 #, python-brace-format +msgid "Net at {rate} % tax" +msgstr "" + +#: pretix/base/exporters/orderlist.py:279 +#, python-brace-format msgid "Tax value at {rate} % tax" msgstr "" -#: pretix/base/exporters/orderlist.py:281 +#: pretix/base/exporters/orderlist.py:282 msgid "Invoice numbers" msgstr "" -#: pretix/base/exporters/orderlist.py:282 -#: pretix/base/exporters/orderlist.py:665 pretix/base/modelimport_orders.py:578 +#: pretix/base/exporters/orderlist.py:283 +#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:578 #: pretix/control/forms/filter.py:616 #: pretix/control/templates/pretixcontrol/order/index.html:190 msgid "Sales channel" msgstr "" -#: pretix/base/exporters/orderlist.py:286 -#: pretix/base/exporters/orderlist.py:630 pretix/base/models/orders.py:277 +#: pretix/base/exporters/orderlist.py:287 +#: pretix/base/exporters/orderlist.py:631 pretix/base/models/orders.py:277 #: pretix/control/forms/filter.py:246 msgid "Follow-up date" msgstr "" -#: pretix/base/exporters/orderlist.py:287 +#: pretix/base/exporters/orderlist.py:288 #: pretix/control/templates/pretixcontrol/orders/index.html:150 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:208 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:209 msgid "Positions" msgstr "" -#: pretix/base/exporters/orderlist.py:288 -#: pretix/base/exporters/orderlist.py:667 pretix/base/models/orders.py:321 +#: pretix/base/exporters/orderlist.py:289 +#: pretix/base/exporters/orderlist.py:668 pretix/base/models/orders.py:321 #: pretix/control/forms/filter.py:598 msgid "Email address verified" msgstr "" -#: pretix/base/exporters/orderlist.py:289 -#: pretix/base/exporters/orderlist.py:474 -#: pretix/base/exporters/orderlist.py:668 +#: pretix/base/exporters/orderlist.py:290 +#: pretix/base/exporters/orderlist.py:475 +#: pretix/base/exporters/orderlist.py:669 msgid "External customer ID" msgstr "" -#: pretix/base/exporters/orderlist.py:295 +#: pretix/base/exporters/orderlist.py:296 #, python-brace-format msgid "Paid by {method}" msgstr "" -#: pretix/base/exporters/orderlist.py:457 -#: pretix/base/exporters/orderlist.py:912 +#: pretix/base/exporters/orderlist.py:458 +#: pretix/base/exporters/orderlist.py:914 msgid "Fee type" msgstr "" -#: pretix/base/exporters/orderlist.py:459 -#: pretix/base/exporters/orderlist.py:600 -#: pretix/base/exporters/orderlist.py:918 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3014 +#: 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/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 #: pretix/control/templates/pretixcontrol/order/change.html:418 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:496 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:497 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:162 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:139 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 #: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 #: pretix/plugins/reports/accountingreport.py:315 msgid "Price" msgstr "" -#: pretix/base/exporters/orderlist.py:461 -#: pretix/base/exporters/orderlist.py:602 -#: pretix/base/exporters/orderlist.py:921 +#: pretix/base/exporters/orderlist.py:462 +#: pretix/base/exporters/orderlist.py:603 +#: pretix/base/exporters/orderlist.py:923 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:9 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:16 #: pretix/control/templates/pretixcontrol/order/change.html:165 msgid "Tax rule" msgstr "" -#: pretix/base/exporters/orderlist.py:489 -#: pretix/base/exporters/orderlist.py:693 pretix/base/models/orders.py:205 +#: pretix/base/exporters/orderlist.py:490 +#: pretix/base/exporters/orderlist.py:694 pretix/base/models/orders.py:205 msgid "canceled" msgstr "" -#: pretix/base/exporters/orderlist.py:584 -#: pretix/base/exporters/orderlist.py:905 -#: pretix/plugins/checkinlists/exporters.py:758 +#: pretix/base/exporters/orderlist.py:585 +#: pretix/base/exporters/orderlist.py:907 +#: pretix/plugins/checkinlists/exporters.py:761 msgid "Position ID" msgstr "" -#: pretix/base/exporters/orderlist.py:593 -#: pretix/base/exporters/orderlist.py:1157 -#: pretix/base/exporters/waitinglist.py:118 pretix/base/forms/questions.py:650 -#: pretix/base/forms/questions.py:659 pretix/base/models/memberships.py:145 +#: pretix/base/exporters/orderlist.py:594 +#: pretix/base/exporters/orderlist.py:1160 +#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:652 +#: 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 @@ -2388,27 +2393,27 @@ msgstr "" #: pretix/control/templates/pretixcontrol/search/payments.html:83 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:19 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:18 -#: pretix/plugins/checkinlists/exporters.py:513 -#: pretix/plugins/checkinlists/exporters.py:702 +#: pretix/plugins/checkinlists/exporters.py:514 +#: pretix/plugins/checkinlists/exporters.py:704 msgid "Start date" msgstr "" -#: pretix/base/exporters/orderlist.py:594 -#: pretix/base/exporters/orderlist.py:1158 -#: pretix/base/exporters/waitinglist.py:119 +#: pretix/base/exporters/orderlist.py:595 +#: pretix/base/exporters/orderlist.py:1161 +#: pretix/base/exporters/waitinglist.py:120 #: pretix/base/models/memberships.py:148 #: pretix/control/templates/pretixcontrol/events/index.html:82 #: pretix/control/templates/pretixcontrol/organizers/detail.html:68 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:21 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:20 -#: pretix/plugins/checkinlists/exporters.py:514 -#: pretix/plugins/checkinlists/exporters.py:703 +#: pretix/plugins/checkinlists/exporters.py:515 +#: pretix/plugins/checkinlists/exporters.py:705 msgid "End date" msgstr "" -#: pretix/base/exporters/orderlist.py:596 -#: pretix/base/exporters/orderlist.py:909 -#: pretix/base/exporters/waitinglist.py:111 +#: pretix/base/exporters/orderlist.py:597 +#: 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/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 @@ -2424,9 +2429,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/waitinglist/index.html:165 #: pretix/control/views/vouchers.py:119 pretix/control/views/waitinglist.py:314 #: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:500 -#: pretix/plugins/checkinlists/exporters.py:695 -#: pretix/plugins/checkinlists/exporters.py:760 +#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:697 +#: pretix/plugins/checkinlists/exporters.py:763 #: pretix/plugins/reports/accountingreport.py:271 #: pretix/plugins/reports/exporters.py:386 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:100 @@ -2436,7 +2441,7 @@ msgstr "" msgid "Product" msgstr "" -#: pretix/base/exporters/orderlist.py:618 pretix/base/models/vouchers.py:315 +#: pretix/base/exporters/orderlist.py:619 pretix/base/models/vouchers.py:315 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:6 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:8 @@ -2444,120 +2449,122 @@ msgstr "" msgid "Voucher" msgstr "" -#: pretix/base/exporters/orderlist.py:619 +#: pretix/base/exporters/orderlist.py:620 msgid "Pseudonymization ID" msgstr "" -#: pretix/base/exporters/orderlist.py:620 pretix/control/forms/filter.py:709 +#: pretix/base/exporters/orderlist.py:621 pretix/control/forms/filter.py:709 #: pretix/control/templates/pretixcontrol/order/change.html:280 msgid "Ticket secret" msgstr "" -#: pretix/base/exporters/orderlist.py:621 pretix/base/modelimport_orders.py:610 +#: pretix/base/exporters/orderlist.py:622 pretix/base/modelimport_orders.py:610 #: pretix/base/modelimport_vouchers.py:272 -#: pretix/plugins/checkinlists/exporters.py:526 -msgid "Seat ID" -msgstr "" - -#: pretix/base/exporters/orderlist.py:622 #: pretix/plugins/checkinlists/exporters.py:527 -msgid "Seat name" +msgid "Seat ID" msgstr "" #: pretix/base/exporters/orderlist.py:623 #: pretix/plugins/checkinlists/exporters.py:528 -msgid "Seat zone" +msgid "Seat name" msgstr "" #: pretix/base/exporters/orderlist.py:624 #: pretix/plugins/checkinlists/exporters.py:529 -msgid "Seat row" +msgid "Seat zone" msgstr "" #: pretix/base/exporters/orderlist.py:625 #: pretix/plugins/checkinlists/exporters.py:530 -msgid "Seat number" +msgid "Seat row" msgstr "" #: pretix/base/exporters/orderlist.py:626 +#: pretix/plugins/checkinlists/exporters.py:531 +msgid "Seat number" +msgstr "" + +#: pretix/base/exporters/orderlist.py:627 #: pretix/control/templates/pretixcontrol/order/change.html:224 #: pretix/plugins/checkinlists/exporters.py:429 -#: pretix/plugins/checkinlists/exporters.py:531 +#: pretix/plugins/checkinlists/exporters.py:532 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:108 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:110 msgid "Blocked" msgstr "" -#: pretix/base/exporters/orderlist.py:627 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2525 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:117 -#: pretix/plugins/checkinlists/exporters.py:532 -#: pretix/plugins/checkinlists/exporters.py:705 +#: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:537 +#: pretix/base/models/orders.py:2539 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:118 +#: pretix/plugins/checkinlists/exporters.py:533 +#: pretix/plugins/checkinlists/exporters.py:707 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:46 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:54 msgid "Valid from" msgstr "" -#: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2530 +#: 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/models/vouchers.py:224 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:118 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:119 #: pretix/control/views/vouchers.py:119 -#: pretix/plugins/checkinlists/exporters.py:533 -#: pretix/plugins/checkinlists/exporters.py:706 +#: pretix/plugins/checkinlists/exporters.py:534 +#: pretix/plugins/checkinlists/exporters.py:708 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:48 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:60 msgid "Valid until" msgstr "" -#: pretix/base/exporters/orderlist.py:629 pretix/base/modelimport_orders.py:643 +#: pretix/base/exporters/orderlist.py:630 pretix/base/modelimport_orders.py:643 msgid "Order comment" msgstr "" -#: pretix/base/exporters/orderlist.py:631 +#: pretix/base/exporters/orderlist.py:632 msgid "Add-on to position ID" msgstr "" -#: pretix/base/exporters/orderlist.py:661 +#: pretix/base/exporters/orderlist.py:662 msgctxt "address" msgid "Invoice address state" msgstr "" -#: pretix/base/exporters/orderlist.py:669 pretix/control/navigation.py:305 +#: pretix/base/exporters/orderlist.py:670 pretix/control/navigation.py:305 #: pretix/control/templates/pretixcontrol/checkin/lists.html:6 #: pretix/control/templates/pretixcontrol/checkin/lists.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:519 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:274 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:162 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 #: pretix/plugins/checkinlists/apps.py:44 msgid "Check-in lists" msgstr "" -#: pretix/base/exporters/orderlist.py:671 +#: pretix/base/exporters/orderlist.py:672 msgid "Position order link" msgstr "" -#: pretix/base/exporters/orderlist.py:840 +#: pretix/base/exporters/orderlist.py:841 msgid "Order transaction data" msgstr "" -#: pretix/base/exporters/orderlist.py:842 +#: pretix/base/exporters/orderlist.py:843 msgid "" "Download a spreadsheet of all substantial changes to orders, i.e. all " "changes to products, prices or tax rates. The information is only accurate " "for changes made with pretix versions released after October 2021." msgstr "" -#: pretix/base/exporters/orderlist.py:858 +#: pretix/base/exporters/orderlist.py:860 msgid "Only include transactions created within this date range." msgstr "" -#: pretix/base/exporters/orderlist.py:893 pretix/base/models/event.py:695 +#: 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:3097 +#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3111 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 -#: pretix/base/notifications.py:187 pretix/control/forms/filter.py:1025 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:205 +#: pretix/base/notifications.py:187 +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 +#: pretix/control/forms/filter.py:1025 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:206 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:42 #: pretix/control/templates/pretixcontrol/search/orders.html:51 #: pretix/multidomain/models.py:65 @@ -2568,9 +2575,9 @@ msgstr "" msgid "Event" msgstr "" -#: pretix/base/exporters/orderlist.py:895 -#: pretix/base/exporters/orderlist.py:1234 -#: pretix/base/exporters/orderlist.py:1378 +#: pretix/base/exporters/orderlist.py:897 +#: pretix/base/exporters/orderlist.py:1238 +#: 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 @@ -2582,19 +2589,19 @@ msgstr "" msgid "Currency" msgstr "" -#: pretix/base/exporters/orderlist.py:901 +#: pretix/base/exporters/orderlist.py:903 msgid "Transaction date" msgstr "" -#: pretix/base/exporters/orderlist.py:902 +#: pretix/base/exporters/orderlist.py:904 msgid "Transaction time" msgstr "" -#: pretix/base/exporters/orderlist.py:903 +#: pretix/base/exporters/orderlist.py:905 msgid "Old data" msgstr "" -#: pretix/base/exporters/orderlist.py:906 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1555 #: 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 @@ -2606,77 +2613,77 @@ msgstr "" msgid "Quantity" msgstr "" -#: pretix/base/exporters/orderlist.py:913 +#: pretix/base/exporters/orderlist.py:915 msgid "Internal fee type" msgstr "" -#: pretix/base/exporters/orderlist.py:915 +#: pretix/base/exporters/orderlist.py:917 msgctxt "subevent" msgid "Date ID" msgstr "" -#: pretix/base/exporters/orderlist.py:920 +#: pretix/base/exporters/orderlist.py:922 msgid "Tax rule ID" msgstr "" -#: pretix/base/exporters/orderlist.py:923 +#: pretix/base/exporters/orderlist.py:925 #: pretix/plugins/reports/accountingreport.py:320 msgid "Gross total" msgstr "" -#: pretix/base/exporters/orderlist.py:924 +#: pretix/base/exporters/orderlist.py:926 #: pretix/plugins/reports/accountingreport.py:319 msgid "Tax total" msgstr "" -#: pretix/base/exporters/orderlist.py:934 +#: pretix/base/exporters/orderlist.py:936 msgid "" "This value is supplied for informational purposes, it is not part of the " "original transaction data and might have changed since the transaction." msgstr "" -#: pretix/base/exporters/orderlist.py:957 +#: pretix/base/exporters/orderlist.py:959 msgid "Converted from legacy version" msgstr "" -#: pretix/base/exporters/orderlist.py:1019 +#: pretix/base/exporters/orderlist.py:1021 msgid "Payments and refunds" msgstr "" -#: pretix/base/exporters/orderlist.py:1021 +#: pretix/base/exporters/orderlist.py:1023 msgid "Download a spreadsheet of all payments or refunds of every order." msgstr "" -#: pretix/base/exporters/orderlist.py:1030 +#: pretix/base/exporters/orderlist.py:1033 msgid "Date range (payment date)" msgstr "" -#: pretix/base/exporters/orderlist.py:1033 +#: pretix/base/exporters/orderlist.py:1036 msgid "" "Note that using this will exclude any non-confirmed payments or non-" "completed refunds." msgstr "" -#: pretix/base/exporters/orderlist.py:1037 +#: pretix/base/exporters/orderlist.py:1040 msgid "Date range (start of transaction)" msgstr "" -#: pretix/base/exporters/orderlist.py:1043 +#: pretix/base/exporters/orderlist.py:1046 msgid "Payment states" msgstr "" -#: pretix/base/exporters/orderlist.py:1051 +#: pretix/base/exporters/orderlist.py:1054 msgid "Refund states" msgstr "" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1235 -#: pretix/base/exporters/orderlist.py:1277 pretix/base/models/orders.py:331 -#: pretix/base/models/orders.py:1740 pretix/base/models/orders.py:2154 -#: pretix/base/models/orders.py:2313 pretix/base/models/orders.py:2485 -#: pretix/base/models/orders.py:2976 +#: 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/control/templates/pretixcontrol/datasync/failed_jobs.html:23 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:119 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:120 #: pretix/control/templates/pretixcontrol/search/payments.html:78 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:15 #: pretix/plugins/checkinlists/exporters.py:375 @@ -2685,48 +2692,49 @@ msgstr "" msgid "Order" msgstr "" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1277 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1282 #: pretix/control/templates/pretixcontrol/search/payments.html:75 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:5 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html:5 msgid "Payment ID" msgstr "" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1375 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1380 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:292 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:30 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:59 msgid "Creation date" msgstr "" -#: pretix/base/exporters/orderlist.py:1094 +#: pretix/base/exporters/orderlist.py:1097 #: pretix/control/templates/pretixcontrol/order/index.html:887 msgid "Completion date" msgstr "" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 msgid "Status code" msgstr "" -#: pretix/base/exporters/orderlist.py:1095 -#: pretix/base/exporters/orderlist.py:1233 -#: pretix/base/exporters/orderlist.py:1277 pretix/base/models/orders.py:1736 -#: pretix/base/models/orders.py:2150 pretix/control/forms/filter.py:1082 +#: 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/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/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 -#: pretix/plugins/banktransfer/payment.py:298 -#: pretix/plugins/banktransfer/payment.py:307 +#: pretix/plugins/banktransfer/payment.py:299 +#: pretix/plugins/banktransfer/payment.py:308 #: pretix/plugins/banktransfer/refund_export.py:46 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Amount" msgstr "" -#: pretix/base/exporters/orderlist.py:1095 +#: 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 @@ -2737,103 +2745,104 @@ msgstr "" msgid "Payment method" msgstr "" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 msgid "Matching ID" msgstr "" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:38 msgid "Payment details" msgstr "" -#: pretix/base/exporters/orderlist.py:1145 +#: pretix/base/exporters/orderlist.py:1148 msgid "Quota availabilities" msgstr "" -#: pretix/base/exporters/orderlist.py:1147 +#: pretix/base/exporters/orderlist.py:1150 msgid "" "Download a spreadsheet of all quotas including their current availability." msgstr "" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/items/quotas.html:45 msgid "Quota name" msgstr "" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/items/quota.html:56 msgid "Total quota" msgstr "" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 #: pretix/control/views/item.py:970 msgid "Paid orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1152 pretix/control/views/item.py:975 +#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:975 msgid "Pending orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 msgid "Blocking vouchers" msgstr "" -#: pretix/base/exporters/orderlist.py:1153 pretix/control/views/item.py:994 +#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:994 msgid "Current user's carts" msgstr "" -#: pretix/base/exporters/orderlist.py:1153 +#: pretix/base/exporters/orderlist.py:1156 msgid "Exited orders" msgstr "" -#: pretix/base/exporters/orderlist.py:1153 +#: pretix/base/exporters/orderlist.py:1156 msgid "Current availability" msgstr "" -#: pretix/base/exporters/orderlist.py:1170 -#: pretix/base/exporters/orderlist.py:1177 +#: 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 msgid "Infinite" msgstr "" -#: pretix/base/exporters/orderlist.py:1199 +#: pretix/base/exporters/orderlist.py:1202 msgid "Gift card transactions" msgstr "" -#: pretix/base/exporters/orderlist.py:1201 -#: pretix/base/exporters/orderlist.py:1306 +#: pretix/base/exporters/orderlist.py:1204 +#: pretix/base/exporters/orderlist.py:1311 msgctxt "export_category" msgid "Gift cards" msgstr "" -#: pretix/base/exporters/orderlist.py:1202 +#: pretix/base/exporters/orderlist.py:1205 msgid "Download a spreadsheet of all gift card transactions." msgstr "" -#: pretix/base/exporters/orderlist.py:1230 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/orderlist.py:1373 pretix/base/models/giftcards.py:89 -#: pretix/base/payment.py:1454 +#: 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/control/templates/pretixcontrol/giftcards/payment.html:4 #: pretix/control/templates/pretixcontrol/order/index.html:558 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:28 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:56 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:152 msgid "Gift card code" msgstr "" -#: pretix/base/exporters/orderlist.py:1231 -#: pretix/base/exporters/orderlist.py:1320 -#: pretix/base/exporters/orderlist.py:1323 +#: pretix/base/exporters/orderlist.py:1235 +#: pretix/base/exporters/orderlist.py:1325 +#: pretix/base/exporters/orderlist.py:1328 #: pretix/base/models/memberships.py:120 pretix/control/forms/filter.py:250 #: pretix/control/forms/filter.py:1446 pretix/control/forms/filter.py:1449 #: pretix/control/templates/pretixcontrol/event/live.html:75 msgid "Test mode" msgstr "" -#: pretix/base/exporters/orderlist.py:1236 pretix/base/models/organizer.py:102 +#: pretix/base/exporters/orderlist.py:1240 pretix/base/models/organizer.py:102 #: pretix/control/forms/event.py:110 pretix/control/forms/filter.py:919 #: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1711 #: pretix/control/templates/pretixcontrol/email_setup.html:6 @@ -2848,15 +2857,16 @@ msgstr "" msgid "Organizer" msgstr "" -#: pretix/base/exporters/orderlist.py:1243 pretix/base/invoicing/pdf.py:580 +#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:587 #: pretix/control/templates/pretixcontrol/base.html:281 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:38 #: pretix/control/templates/pretixcontrol/orders/index.html:189 #: pretix/control/templates/pretixcontrol/orders/refunds.html:86 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:133 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:222 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:134 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:223 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:306 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:58 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:10 @@ -2869,6 +2879,7 @@ msgstr "" #: pretix/presale/forms/checkout.py:259 #: pretix/presale/templates/pretixpresale/event/order.html:69 #: pretix/presale/templates/pretixpresale/event/position.html:14 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:59 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:20 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:84 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:71 @@ -2876,41 +2887,45 @@ msgstr "" msgid "TEST MODE" msgstr "" -#: pretix/base/exporters/orderlist.py:1258 +#: pretix/base/exporters/orderlist.py:1262 msgid "Gift card redemptions" msgstr "" -#: pretix/base/exporters/orderlist.py:1260 +#: pretix/base/exporters/orderlist.py:1264 msgid "" "Download a spreadsheet of all payments or refunds that involve gift cards." msgstr "" -#: pretix/base/exporters/orderlist.py:1277 +#: pretix/base/exporters/orderlist.py:1282 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:16 msgid "Issuer" msgstr "" -#: pretix/base/exporters/orderlist.py:1304 pretix/control/navigation.py:550 +#: pretix/base/exporters/orderlist.py:1309 pretix/control/navigation.py:550 #: 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/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 +#: pretix/presale/views/customer.py:372 msgid "Gift cards" msgstr "" -#: pretix/base/exporters/orderlist.py:1307 +#: pretix/base/exporters/orderlist.py:1312 msgid "Download a spreadsheet of all gift cards including their current value." msgstr "" -#: pretix/base/exporters/orderlist.py:1314 +#: pretix/base/exporters/orderlist.py:1319 msgid "Show value at" msgstr "" -#: pretix/base/exporters/orderlist.py:1317 +#: pretix/base/exporters/orderlist.py:1322 msgid "Defaults to the time of report." msgstr "" -#: pretix/base/exporters/orderlist.py:1322 -#: pretix/base/exporters/orderlist.py:1332 pretix/control/forms/filter.py:550 +#: pretix/base/exporters/orderlist.py:1327 +#: pretix/base/exporters/orderlist.py:1337 pretix/control/forms/filter.py:550 #: pretix/control/forms/filter.py:1231 pretix/control/forms/filter.py:1448 #: pretix/control/forms/filter.py:1457 pretix/control/forms/filter.py:1527 #: pretix/control/forms/filter.py:1537 pretix/control/forms/filter.py:1599 @@ -2933,66 +2948,70 @@ msgstr "" msgid "All" msgstr "" -#: pretix/base/exporters/orderlist.py:1324 pretix/control/forms/filter.py:1450 +#: pretix/base/exporters/orderlist.py:1329 pretix/control/forms/filter.py:1450 msgid "Live" msgstr "" -#: pretix/base/exporters/orderlist.py:1333 pretix/control/forms/filter.py:1458 +#: pretix/base/exporters/orderlist.py:1338 pretix/control/forms/filter.py:1458 #: pretix/control/templates/pretixcontrol/pdf/index.html:325 msgid "Empty" msgstr "" -#: pretix/base/exporters/orderlist.py:1334 pretix/control/forms/filter.py:1459 +#: pretix/base/exporters/orderlist.py:1339 pretix/control/forms/filter.py:1459 msgid "Valid and with value" msgstr "" -#: pretix/base/exporters/orderlist.py:1335 pretix/control/forms/filter.py:1460 +#: pretix/base/exporters/orderlist.py:1340 pretix/control/forms/filter.py:1460 msgid "Expired and with value" msgstr "" -#: pretix/base/exporters/orderlist.py:1336 pretix/control/forms/filter.py:233 +#: pretix/base/exporters/orderlist.py:1341 pretix/control/forms/filter.py:233 #: pretix/control/forms/filter.py:1461 pretix/control/forms/filter.py:2121 #: pretix/control/templates/pretixcontrol/items/question.html:31 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:37 #: pretix/control/templates/pretixcontrol/orders/overview.html:78 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:309 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:84 #: pretix/plugins/reports/exporters.py:389 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:26 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:42 msgid "Expired" msgstr "" -#: pretix/base/exporters/orderlist.py:1374 pretix/base/models/giftcards.py:98 +#: pretix/base/exporters/orderlist.py:1379 pretix/base/models/giftcards.py:105 msgid "Test mode card" msgstr "" -#: pretix/base/exporters/orderlist.py:1376 -#: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:102 +#: pretix/base/exporters/orderlist.py:1381 +#: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:109 #: pretix/control/templates/pretixcontrol/order/index.html:203 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:293 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:62 msgid "Expiry date" msgstr "" -#: pretix/base/exporters/orderlist.py:1377 pretix/control/forms/orders.py:902 +#: pretix/base/exporters/orderlist.py:1382 pretix/control/forms/orders.py:902 msgid "Special terms and conditions" msgstr "" -#: pretix/base/exporters/orderlist.py:1379 +#: pretix/base/exporters/orderlist.py:1384 #: pretix/control/templates/pretixcontrol/order/change.html:98 #: pretix/control/templates/pretixcontrol/order/change.html:410 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:295 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:32 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:68 msgid "Current value" msgstr "" -#: pretix/base/exporters/orderlist.py:1380 +#: pretix/base/exporters/orderlist.py:1385 msgid "Created in order" msgstr "" -#: pretix/base/exporters/orderlist.py:1381 +#: pretix/base/exporters/orderlist.py:1386 msgid "Last invoice number of order" msgstr "" -#: pretix/base/exporters/orderlist.py:1382 +#: pretix/base/exporters/orderlist.py:1387 msgid "Last invoice date of order" msgstr "" @@ -3015,35 +3034,36 @@ msgid "" "Download a spread sheet with the data of all reusable medias on your account." msgstr "" -#: pretix/base/exporters/reusablemedia.py:46 pretix/base/models/media.py:67 +#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:67 msgctxt "reusable_medium" msgid "Media type" msgstr "" -#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:73 +#: pretix/base/exporters/reusablemedia.py:48 pretix/base/models/media.py:73 msgctxt "reusable_medium" msgid "Identifier" msgstr "" -#: pretix/base/exporters/reusablemedia.py:49 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3109 +#: 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/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" msgstr "" -#: pretix/base/exporters/reusablemedia.py:50 pretix/base/models/media.py:90 +#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:90 #: pretix/control/templates/pretixcontrol/order/index.html:216 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:58 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:8 msgid "Customer account" msgstr "" -#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:97 +#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:97 msgid "Linked ticket" msgstr "" -#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:104 +#: pretix/base/exporters/reusablemedia.py:53 pretix/base/models/media.py:104 msgid "Linked gift card" msgstr "" @@ -3056,49 +3076,49 @@ msgstr "" msgid "Download a spread sheet with all your waiting list data." msgstr "" -#: pretix/base/exporters/waitinglist.py:49 +#: pretix/base/exporters/waitinglist.py:50 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:102 msgid "All entries" msgstr "" -#: pretix/base/exporters/waitinglist.py:54 +#: pretix/base/exporters/waitinglist.py:55 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:105 msgid "Waiting for a voucher" msgstr "" -#: pretix/base/exporters/waitinglist.py:59 +#: pretix/base/exporters/waitinglist.py:60 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:107 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:227 #: pretix/control/views/waitinglist.py:333 msgid "Voucher assigned" msgstr "" -#: pretix/base/exporters/waitinglist.py:64 +#: pretix/base/exporters/waitinglist.py:65 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:110 msgid "Waiting for redemption" msgstr "" -#: pretix/base/exporters/waitinglist.py:72 +#: pretix/base/exporters/waitinglist.py:73 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:223 #: pretix/control/views/waitinglist.py:329 msgid "Voucher redeemed" msgstr "" -#: pretix/base/exporters/waitinglist.py:80 +#: pretix/base/exporters/waitinglist.py:81 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:116 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:225 #: pretix/control/views/waitinglist.py:331 msgid "Voucher expired" msgstr "" -#: pretix/base/exporters/waitinglist.py:117 +#: pretix/base/exporters/waitinglist.py:118 #: pretix/base/modelimport_orders.py:111 pretix/base/modelimport_vouchers.py:60 #: pretix/control/templates/pretixcontrol/checkin/index.html:100 msgctxt "subevents" msgid "Date" msgstr "" -#: pretix/base/exporters/waitinglist.py:121 +#: pretix/base/exporters/waitinglist.py:122 #: pretix/control/views/waitinglist.py:315 msgid "Priority" msgstr "" @@ -3149,112 +3169,112 @@ msgstr "" msgid "Repeat password" msgstr "" -#: pretix/base/forms/questions.py:135 pretix/base/forms/questions.py:262 +#: pretix/base/forms/questions.py:137 pretix/base/forms/questions.py:264 msgctxt "name_salutation" msgid "not specified" msgstr "" -#: pretix/base/forms/questions.py:225 +#: pretix/base/forms/questions.py:227 msgid "Please do not use special characters in names." msgstr "" -#: pretix/base/forms/questions.py:287 +#: pretix/base/forms/questions.py:289 msgid "Please enter a shorter name." msgstr "" -#: pretix/base/forms/questions.py:312 +#: pretix/base/forms/questions.py:314 msgctxt "phonenumber" msgid "International area code" msgstr "" -#: pretix/base/forms/questions.py:338 +#: pretix/base/forms/questions.py:340 msgctxt "phonenumber" msgid "Phone number (without international area code)" msgstr "" -#: pretix/base/forms/questions.py:499 +#: pretix/base/forms/questions.py:501 msgid "" "You uploaded an image in landscape orientation. Please upload an image in " "portrait orientation." msgstr "" -#: pretix/base/forms/questions.py:502 +#: pretix/base/forms/questions.py:504 msgid "Please upload an image where the width is 3/4 of the height." msgstr "" -#: pretix/base/forms/questions.py:505 +#: pretix/base/forms/questions.py:507 msgid "" "The file you uploaded has a very large number of pixels, please upload an " "image no larger than 10000 x 10000 pixels." msgstr "" -#: pretix/base/forms/questions.py:508 pretix/helpers/images.py:75 +#: pretix/base/forms/questions.py:510 pretix/helpers/images.py:75 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: pretix/base/forms/questions.py:651 pretix/base/forms/questions.py:660 +#: pretix/base/forms/questions.py:653 pretix/base/forms/questions.py:662 msgid "" "If you keep this empty, the ticket will be valid starting at the time of " "purchase." msgstr "" -#: pretix/base/forms/questions.py:707 pretix/base/forms/questions.py:1100 +#: pretix/base/forms/questions.py:709 pretix/base/forms/questions.py:1102 msgid "Street and Number" msgstr "" -#: pretix/base/forms/questions.py:1162 +#: pretix/base/forms/questions.py:1166 msgid "" "Optional, but depending on the country you reside in we might need to charge " "you additional taxes if you do not enter it." msgstr "" -#: pretix/base/forms/questions.py:1164 pretix/base/forms/questions.py:1170 +#: pretix/base/forms/questions.py:1168 pretix/base/forms/questions.py:1174 msgid "If you are registered in Switzerland, you can enter your UID instead." msgstr "" -#: pretix/base/forms/questions.py:1168 +#: pretix/base/forms/questions.py:1172 msgid "" "Optional, but it might be required for you to claim tax benefits on your " "invoice depending on your and the seller’s country of residence." msgstr "" -#: pretix/base/forms/questions.py:1177 +#: pretix/base/forms/questions.py:1181 msgid "No invoice requested" msgstr "" -#: pretix/base/forms/questions.py:1179 +#: pretix/base/forms/questions.py:1183 msgid "Invoice transmission method" msgstr "" -#: pretix/base/forms/questions.py:1325 +#: pretix/base/forms/questions.py:1329 msgid "You need to provide a company name." msgstr "" -#: pretix/base/forms/questions.py:1327 +#: pretix/base/forms/questions.py:1331 msgid "You need to provide your name." msgstr "" -#: pretix/base/forms/questions.py:1353 +#: pretix/base/forms/questions.py:1357 msgid "" "If you enter an invoice address, you also need to select an invoice " "transmission method." msgstr "" -#: pretix/base/forms/questions.py:1381 +#: pretix/base/forms/questions.py:1385 msgid "" "The selected transmission type is not available in your country or for your " "type of address." msgstr "" -#: pretix/base/forms/questions.py:1390 +#: pretix/base/forms/questions.py:1394 msgid "" "The selected type of invoice transmission requires a field that is currently " "not available, please reach out to the organizer." msgstr "" -#: pretix/base/forms/questions.py:1394 +#: pretix/base/forms/questions.py:1398 msgid "This field is required for the selected type of invoice transmission." msgstr "" @@ -3344,7 +3364,7 @@ msgid "Available placeholders: {list}" msgstr "" #: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1656 -#: pretix/plugins/checkinlists/exporters.py:754 +#: 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 msgid "Time" @@ -3410,68 +3430,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:141 +#: pretix/base/invoicing/pdf.py:142 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "" -#: pretix/base/invoicing/pdf.py:382 +#: pretix/base/invoicing/pdf.py:383 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "" -#: pretix/base/invoicing/pdf.py:426 +#: pretix/base/invoicing/pdf.py:427 msgctxt "invoice" msgid "Invoice from" msgstr "" -#: pretix/base/invoicing/pdf.py:432 +#: pretix/base/invoicing/pdf.py:433 msgctxt "invoice" msgid "Invoice to" msgstr "" -#: pretix/base/invoicing/pdf.py:469 pretix/base/invoicing/pdf.py:1062 +#: pretix/base/invoicing/pdf.py:470 pretix/base/invoicing/pdf.py:1143 msgctxt "invoice" msgid "Order code" msgstr "" -#: pretix/base/invoicing/pdf.py:478 pretix/base/invoicing/pdf.py:1075 +#: pretix/base/invoicing/pdf.py:479 pretix/base/invoicing/pdf.py:1156 msgctxt "invoice" msgid "Cancellation number" msgstr "" -#: pretix/base/invoicing/pdf.py:484 pretix/base/invoicing/pdf.py:1077 +#: pretix/base/invoicing/pdf.py:485 pretix/base/invoicing/pdf.py:1158 msgctxt "invoice" msgid "Original invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:489 pretix/base/invoicing/pdf.py:1082 +#: pretix/base/invoicing/pdf.py:490 pretix/base/invoicing/pdf.py:1163 msgctxt "invoice" msgid "Invoice number" msgstr "" -#: pretix/base/invoicing/pdf.py:497 pretix/base/invoicing/pdf.py:1097 +#: pretix/base/invoicing/pdf.py:498 pretix/base/invoicing/pdf.py:1178 msgctxt "invoice" msgid "Cancellation date" msgstr "" -#: pretix/base/invoicing/pdf.py:503 +#: pretix/base/invoicing/pdf.py:504 msgctxt "invoice" msgid "Original invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:510 pretix/base/invoicing/pdf.py:1099 +#: pretix/base/invoicing/pdf.py:511 pretix/base/invoicing/pdf.py:1180 msgctxt "invoice" msgid "Invoice date" msgstr "" -#: pretix/base/invoicing/pdf.py:526 +#: pretix/base/invoicing/pdf.py:527 msgctxt "invoice" msgid "Event" msgstr "" -#: pretix/base/invoicing/pdf.py:552 +#: pretix/base/invoicing/pdf.py:561 #, python-brace-format msgctxt "invoice" msgid "" @@ -3479,39 +3499,39 @@ msgid "" "until {to_date}" msgstr "" -#: pretix/base/invoicing/pdf.py:601 pretix/base/services/mail.py:509 +#: pretix/base/invoicing/pdf.py:608 pretix/base/services/mail.py:511 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "" -#: pretix/base/invoicing/pdf.py:653 +#: pretix/base/invoicing/pdf.py:660 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "" -#: pretix/base/invoicing/pdf.py:661 +#: pretix/base/invoicing/pdf.py:668 msgctxt "invoice" msgid "Customer VAT ID" msgstr "" -#: pretix/base/invoicing/pdf.py:668 +#: pretix/base/invoicing/pdf.py:675 msgctxt "invoice" msgid "Beneficiary" msgstr "" -#: pretix/base/invoicing/pdf.py:694 +#: pretix/base/invoicing/pdf.py:708 msgctxt "invoice" msgid "Tax Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:695 +#: pretix/base/invoicing/pdf.py:709 msgctxt "invoice" msgid "Invoice" msgstr "" -#: pretix/base/invoicing/pdf.py:696 +#: pretix/base/invoicing/pdf.py:710 #: 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 @@ -3519,94 +3539,100 @@ msgctxt "invoice" msgid "Cancellation" msgstr "" -#: pretix/base/invoicing/pdf.py:718 pretix/base/invoicing/pdf.py:726 +#: pretix/base/invoicing/pdf.py:732 pretix/base/invoicing/pdf.py:740 msgctxt "invoice" msgid "Description" msgstr "" -#: pretix/base/invoicing/pdf.py:719 pretix/base/invoicing/pdf.py:727 +#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 msgctxt "invoice" msgid "Qty" msgstr "" -#: pretix/base/invoicing/pdf.py:720 pretix/base/invoicing/pdf.py:879 +#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:960 msgctxt "invoice" msgid "Tax rate" msgstr "" -#: pretix/base/invoicing/pdf.py:721 +#: pretix/base/invoicing/pdf.py:735 msgctxt "invoice" msgid "Net" msgstr "" -#: pretix/base/invoicing/pdf.py:722 +#: pretix/base/invoicing/pdf.py:736 msgctxt "invoice" msgid "Gross" msgstr "" -#: pretix/base/invoicing/pdf.py:728 +#: pretix/base/invoicing/pdf.py:742 msgctxt "invoice" msgid "Amount" msgstr "" -#: pretix/base/invoicing/pdf.py:744 +#: pretix/base/invoicing/pdf.py:818 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:767 +#: pretix/base/invoicing/pdf.py:842 #, python-brace-format msgctxt "invoice" msgid "Single price: {price}" msgstr "" -#: pretix/base/invoicing/pdf.py:788 pretix/base/invoicing/pdf.py:794 +#: pretix/base/invoicing/pdf.py:863 pretix/base/invoicing/pdf.py:869 msgctxt "invoice" msgid "Invoice total" msgstr "" -#: pretix/base/invoicing/pdf.py:804 +#: pretix/base/invoicing/pdf.py:879 msgctxt "invoice" msgid "Received payments" msgstr "" -#: pretix/base/invoicing/pdf.py:809 +#: pretix/base/invoicing/pdf.py:884 msgctxt "invoice" msgid "Outstanding payments" msgstr "" -#: pretix/base/invoicing/pdf.py:826 +#: pretix/base/invoicing/pdf.py:901 msgctxt "invoice" msgid "Paid by gift card" msgstr "" -#: pretix/base/invoicing/pdf.py:831 +#: pretix/base/invoicing/pdf.py:906 msgctxt "invoice" msgid "Remaining amount" msgstr "" -#: pretix/base/invoicing/pdf.py:880 +#: pretix/base/invoicing/pdf.py:930 +#, python-brace-format +msgctxt "invoice" +msgid "Invoice period: {daterange}" +msgstr "" + +#: pretix/base/invoicing/pdf.py:961 msgctxt "invoice" msgid "Net value" msgstr "" -#: pretix/base/invoicing/pdf.py:881 +#: pretix/base/invoicing/pdf.py:962 msgctxt "invoice" msgid "Gross value" msgstr "" -#: pretix/base/invoicing/pdf.py:882 +#: pretix/base/invoicing/pdf.py:963 msgctxt "invoice" msgid "Tax" msgstr "" -#: pretix/base/invoicing/pdf.py:912 +#: pretix/base/invoicing/pdf.py:993 msgctxt "invoice" msgid "Included taxes" msgstr "" -#: pretix/base/invoicing/pdf.py:940 +#: pretix/base/invoicing/pdf.py:1021 #, python-brace-format msgctxt "invoice" msgid "" @@ -3614,7 +3640,7 @@ msgid "" "{date}, this corresponds to:" msgstr "" -#: pretix/base/invoicing/pdf.py:955 +#: pretix/base/invoicing/pdf.py:1036 #, python-brace-format msgctxt "invoice" msgid "" @@ -3622,20 +3648,20 @@ msgid "" "{date}, the invoice total corresponds to {total}." msgstr "" -#: pretix/base/invoicing/pdf.py:969 +#: pretix/base/invoicing/pdf.py:1050 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1058 +#: pretix/base/invoicing/pdf.py:1139 msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "" -#: pretix/base/invoicing/pdf.py:1105 +#: pretix/base/invoicing/pdf.py:1186 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1124 +#: pretix/base/invoicing/pdf.py:1205 #, python-brace-format msgctxt "invoice" msgid "Event date: {date_range}" @@ -3770,9 +3796,9 @@ msgstr "" msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1173 -#: pretix/control/views/orders.py:1202 pretix/control/views/orders.py:1246 -#: pretix/control/views/orders.py:1281 pretix/control/views/orders.py:1304 +#: 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 msgid "You entered an invalid number." msgstr "" @@ -3942,8 +3968,8 @@ msgstr "" #: pretix/base/modelimport_orders.py:631 #: pretix/base/modelimport_vouchers.py:296 pretix/base/services/cart.py:213 -#: pretix/base/services/modelimport.py:175 -#: pretix/base/services/modelimport.py:287 +#: pretix/base/services/modelimport.py:178 +#: pretix/base/services/modelimport.py:299 msgid "" "The seat you selected has already been taken. Please select a different seat." msgstr "" @@ -4134,7 +4160,7 @@ msgid "All products (including newly created ones)" msgstr "" #: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:436 -#: pretix/plugins/checkinlists/exporters.py:851 +#: pretix/plugins/checkinlists/exporters.py:854 msgid "Limit to products" msgstr "" @@ -4271,96 +4297,96 @@ msgstr "" msgid "Check-in annulled" msgstr "" -#: pretix/base/models/customers.py:55 +#: pretix/base/models/customers.py:62 msgid "Provider name" msgstr "" -#: pretix/base/models/customers.py:60 +#: pretix/base/models/customers.py:67 msgid "Login button label" msgstr "" -#: pretix/base/models/customers.py:64 +#: pretix/base/models/customers.py:71 msgid "Single-sign-on method" msgstr "" -#: pretix/base/models/customers.py:85 pretix/base/models/devices.py:71 +#: pretix/base/models/customers.py:92 pretix/base/models/devices.py:71 #: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 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." msgstr "" -#: pretix/base/models/customers.py:90 +#: pretix/base/models/customers.py:97 msgid "" "The identifier may only contain letters, numbers, dots, dashes, and " "underscores. It must start and end with a letter or number." msgstr "" -#: pretix/base/models/customers.py:195 pretix/control/forms/filter.py:1529 +#: pretix/base/models/customers.py:202 pretix/control/forms/filter.py:1529 #: pretix/control/forms/filter.py:1601 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:42 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:43 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:56 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:135 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:35 msgid "disabled" msgstr "" -#: pretix/base/models/customers.py:310 pretix/base/models/orders.py:1538 -#: pretix/base/models/orders.py:3280 pretix/base/settings.py:1150 +#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1538 +#: pretix/base/models/orders.py:3294 pretix/base/settings.py:1179 msgid "Company name" msgstr "" -#: pretix/base/models/customers.py:314 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3287 pretix/base/settings.py:83 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 +#: pretix/base/models/orders.py:3301 pretix/base/settings.py:83 #: pretix/plugins/stripe/payment.py:272 msgid "Select country" msgstr "" -#: pretix/base/models/customers.py:381 +#: pretix/base/models/customers.py:401 msgctxt "openidconnect" msgid "Confidential" msgstr "" -#: pretix/base/models/customers.py:382 +#: pretix/base/models/customers.py:402 msgctxt "openidconnect" msgid "Public" msgstr "" -#: pretix/base/models/customers.py:388 +#: pretix/base/models/customers.py:408 msgctxt "openidconnect" msgid "Authorization code" msgstr "" -#: pretix/base/models/customers.py:389 +#: pretix/base/models/customers.py:409 msgctxt "openidconnect" msgid "Implicit" msgstr "" -#: pretix/base/models/customers.py:393 +#: pretix/base/models/customers.py:413 msgid "OpenID Connect access (required)" msgstr "" -#: pretix/base/models/customers.py:394 +#: pretix/base/models/customers.py:414 msgid "Profile data (name, addresses)" msgstr "" -#: pretix/base/models/customers.py:414 +#: pretix/base/models/customers.py:434 msgid "Client type" msgstr "" -#: pretix/base/models/customers.py:417 +#: pretix/base/models/customers.py:437 msgid "Grant type" msgstr "" -#: pretix/base/models/customers.py:420 +#: pretix/base/models/customers.py:440 msgid "Require PKCE extension" msgstr "" -#: pretix/base/models/customers.py:432 +#: pretix/base/models/customers.py:452 msgid "Allowed access scopes" msgstr "" -#: pretix/base/models/customers.py:433 +#: pretix/base/models/customers.py:453 msgid "Separate multiple values with spaces" msgstr "" @@ -4393,7 +4419,7 @@ msgstr "" #: pretix/control/forms/filter.py:2468 pretix/control/forms/filter.py:2628 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 #: pretix/control/templates/pretixcontrol/organizers/gates.html:16 -#: pretix/plugins/checkinlists/exporters.py:766 +#: pretix/plugins/checkinlists/exporters.py:769 msgid "Gate" msgstr "" @@ -4635,7 +4661,7 @@ 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:474 +#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "" @@ -4706,7 +4732,7 @@ msgid "" "event." msgstr "" -#: pretix/base/models/event.py:1565 pretix/base/settings.py:3116 +#: pretix/base/models/event.py:1565 pretix/base/settings.py:3145 msgid "Frontpage text" msgstr "" @@ -4718,78 +4744,78 @@ msgstr "" msgid "Dates in event series" msgstr "" -#: pretix/base/models/event.py:1728 +#: pretix/base/models/event.py:1724 msgid "One or more variations do not belong to this event." msgstr "" -#: pretix/base/models/event.py:1758 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1754 pretix/base/models/items.py:2236 msgid "Can not contain spaces or special characters except underscores" msgstr "" -#: pretix/base/models/event.py:1763 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1759 pretix/base/models/items.py:2241 msgid "The property name may only contain letters, numbers and underscores." msgstr "" -#: pretix/base/models/event.py:1768 +#: pretix/base/models/event.py:1764 msgid "Default value" msgstr "" -#: pretix/base/models/event.py:1770 +#: pretix/base/models/event.py:1766 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "" -#: pretix/base/models/event.py:1772 +#: pretix/base/models/event.py:1768 msgid "Required for events" msgstr "" -#: pretix/base/models/event.py:1773 +#: pretix/base/models/event.py:1769 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:1779 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1775 pretix/base/models/items.py:2253 msgid "Valid values" msgstr "" -#: pretix/base/models/event.py:1782 +#: pretix/base/models/event.py:1778 #: pretix/control/templates/pretixcontrol/organizers/properties.html:45 msgid "Show filter option to customers" msgstr "" -#: pretix/base/models/event.py:1783 +#: pretix/base/models/event.py:1779 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1786 pretix/control/forms/organizer.py:269 +#: pretix/base/models/event.py:1782 pretix/control/forms/organizer.py:269 #: pretix/control/forms/organizer.py:273 msgid "Public name" msgstr "" -#: pretix/base/models/event.py:1790 +#: pretix/base/models/event.py:1786 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1791 +#: pretix/base/models/event.py:1787 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:1801 +#: pretix/base/models/event.py:1797 msgid "A property can either be required or have a default value, not both." msgstr "" -#: pretix/base/models/event.py:1881 pretix/base/models/organizer.py:582 +#: pretix/base/models/event.py:1877 pretix/base/models/organizer.py:582 msgid "Link text" msgstr "" -#: pretix/base/models/event.py:1884 pretix/base/models/organizer.py:585 +#: pretix/base/models/event.py:1880 pretix/base/models/organizer.py:585 msgid "Link URL" msgstr "" @@ -4803,7 +4829,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:988 +#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:989 #: pretix/control/forms/organizer.py:586 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -4816,9 +4842,9 @@ msgstr "" msgid "Additional recipients (Bcc)" msgstr "" -#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1094 -#: pretix/control/forms/event.py:1168 pretix/control/forms/event.py:1178 -#: pretix/control/forms/event.py:1188 pretix/control/forms/event.py:1203 +#: 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/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 @@ -4852,52 +4878,56 @@ msgstr "" msgid "Owned by ticket holder" msgstr "" -#: pretix/base/models/giftcards.py:93 +#: pretix/base/models/giftcards.py:88 +msgid "Owned by customer account" +msgstr "" + +#: pretix/base/models/giftcards.py:100 msgid "The gift card code may only contain letters, numbers, dots and dashes." msgstr "" -#: pretix/base/models/giftcards.py:105 +#: pretix/base/models/giftcards.py:112 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:39 msgctxt "giftcard" msgid "Special terms and conditions" msgstr "" -#: pretix/base/models/giftcards.py:219 pretix/base/models/giftcards.py:223 +#: pretix/base/models/giftcards.py:227 pretix/base/models/giftcards.py:231 msgid "Manual transaction" msgstr "" -#: pretix/base/models/invoices.py:121 +#: pretix/base/models/invoices.py:122 msgid "pending transmission" msgstr "" -#: pretix/base/models/invoices.py:122 +#: pretix/base/models/invoices.py:123 msgid "currently being transmitted" msgstr "" -#: pretix/base/models/invoices.py:123 +#: pretix/base/models/invoices.py:124 msgid "transmitted" msgstr "" -#: pretix/base/models/invoices.py:124 pretix/plugins/sendmail/models.py:52 +#: pretix/base/models/invoices.py:125 pretix/plugins/sendmail/models.py:52 msgid "failed" msgstr "" -#: pretix/base/models/invoices.py:125 +#: pretix/base/models/invoices.py:126 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:56 msgid "unknown" msgstr "" -#: pretix/base/models/invoices.py:126 +#: pretix/base/models/invoices.py:127 msgid "not transmitted due to test mode" msgstr "" -#: pretix/base/models/invoices.py:218 +#: pretix/base/models/invoices.py:220 #, python-format msgctxt "invoice" msgid "Tax ID: %s" msgstr "" -#: pretix/base/models/invoices.py:224 pretix/base/services/invoices.py:148 +#: pretix/base/models/invoices.py:226 pretix/base/services/invoices.py:154 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -5091,8 +5121,8 @@ msgstr "" msgid "This will only work if waiting lists are enabled for this event." msgstr "" -#: pretix/base/models/items.py:548 pretix/base/settings.py:1398 -#: pretix/control/forms/event.py:1690 +#: pretix/base/models/items.py:548 pretix/base/settings.py:1427 +#: pretix/control/forms/event.py:1691 msgid "Show number of tickets left" msgstr "" @@ -5716,7 +5746,7 @@ msgstr "" msgid "Question options" msgstr "" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1724 +#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1725 #: pretix/control/templates/pretixcontrol/items/quotas.html:56 msgid "Total capacity" msgstr "" @@ -5726,7 +5756,7 @@ 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:2997 +#: pretix/base/models/orders.py:3011 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "" @@ -5854,7 +5884,7 @@ msgid "Canceled" msgstr "" #: pretix/base/models/memberships.py:134 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:116 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:117 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:28 msgid "Membership type" msgstr "" @@ -5863,8 +5893,8 @@ msgstr "" msgid "pending" msgstr "" -#: pretix/base/models/orders.py:203 pretix/base/payment.py:568 -#: pretix/base/services/invoices.py:486 +#: pretix/base/models/orders.py:203 pretix/base/payment.py:570 +#: pretix/base/services/invoices.py:572 msgid "paid" msgstr "" @@ -5874,7 +5904,7 @@ msgid "expired" msgstr "" #: pretix/base/models/orders.py:254 pretix/control/forms/filter.py:592 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:64 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:65 msgid "Locale" msgstr "" @@ -6003,99 +6033,99 @@ msgctxt "payment_state" msgid "refunded" msgstr "" -#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2181 +#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2195 #: pretix/base/shredder.py:633 msgid "Payment information" msgstr "" -#: pretix/base/models/orders.py:2122 +#: pretix/base/models/orders.py:2136 msgctxt "refund_state" msgid "started externally" msgstr "" -#: pretix/base/models/orders.py:2123 +#: pretix/base/models/orders.py:2137 msgctxt "refund_state" msgid "created" msgstr "" -#: pretix/base/models/orders.py:2124 +#: pretix/base/models/orders.py:2138 msgctxt "refund_state" msgid "in transit" msgstr "" -#: pretix/base/models/orders.py:2125 +#: pretix/base/models/orders.py:2139 msgctxt "refund_state" msgid "done" msgstr "" -#: pretix/base/models/orders.py:2126 +#: pretix/base/models/orders.py:2140 msgctxt "refund_state" msgid "failed" msgstr "" -#: pretix/base/models/orders.py:2128 +#: pretix/base/models/orders.py:2142 msgctxt "refund_state" msgid "canceled" msgstr "" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2150 msgctxt "refund_source" msgid "Organizer" msgstr "" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2151 msgctxt "refund_source" msgid "Customer" msgstr "" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2152 msgctxt "refund_source" msgid "External" msgstr "" -#: pretix/base/models/orders.py:2176 +#: pretix/base/models/orders.py:2190 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "" -#: pretix/base/models/orders.py:2177 +#: pretix/base/models/orders.py:2191 #: 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:2297 +#: pretix/base/models/orders.py:2311 msgid "Service fee" msgstr "" -#: pretix/base/models/orders.py:2298 +#: pretix/base/models/orders.py:2312 msgid "Payment fee" msgstr "" -#: pretix/base/models/orders.py:2299 +#: pretix/base/models/orders.py:2313 msgid "Shipping fee" msgstr "" -#: pretix/base/models/orders.py:2300 +#: pretix/base/models/orders.py:2314 #: pretix/control/templates/pretixcontrol/order/index.html:157 msgid "Cancellation fee" msgstr "" -#: pretix/base/models/orders.py:2301 +#: pretix/base/models/orders.py:2315 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2302 +#: pretix/base/models/orders.py:2316 msgid "Late fee" msgstr "" -#: pretix/base/models/orders.py:2303 +#: pretix/base/models/orders.py:2317 msgid "Other fees" msgstr "" -#: pretix/base/models/orders.py:2304 pretix/base/payment.py:1372 -#: pretix/base/payment.py:1419 pretix/base/settings.py:992 +#: pretix/base/models/orders.py:2318 pretix/base/payment.py:1374 +#: pretix/base/payment.py:1450 pretix/base/settings.py:992 #: 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 @@ -6104,62 +6134,62 @@ msgstr "" msgid "Gift card" msgstr "" -#: pretix/base/models/orders.py:2309 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:74 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:115 +#: pretix/base/models/orders.py:2323 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:82 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:123 #: pretix/control/views/vouchers.py:120 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:8 msgid "Value" msgstr "" -#: pretix/base/models/orders.py:2557 +#: pretix/base/models/orders.py:2571 msgid "Order position" msgstr "" -#: pretix/base/models/orders.py:3102 +#: pretix/base/models/orders.py:3116 msgid "Cart ID (e.g. session key)" msgstr "" -#: pretix/base/models/orders.py:3113 +#: pretix/base/models/orders.py:3127 msgid "Limit for extending expiration date" msgstr "" -#: pretix/base/models/orders.py:3142 +#: pretix/base/models/orders.py:3156 msgid "Cart position" msgstr "" -#: pretix/base/models/orders.py:3143 +#: pretix/base/models/orders.py:3157 msgid "Cart positions" msgstr "" -#: pretix/base/models/orders.py:3279 +#: pretix/base/models/orders.py:3293 msgid "Business customer" msgstr "" -#: pretix/base/models/orders.py:3295 +#: pretix/base/models/orders.py:3309 msgid "This reference will be printed on your invoice for your convenience." msgstr "" -#: pretix/base/models/orders.py:3422 +#: pretix/base/models/orders.py:3436 msgid "Transmission type" msgstr "" -#: pretix/base/models/orders.py:3520 +#: pretix/base/models/orders.py:3534 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "" -#: pretix/base/models/orders.py:3521 pretix/base/pdf.py:1124 +#: pretix/base/models/orders.py:3535 pretix/base/pdf.py:1124 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 -#: pretix/plugins/ticketoutputpdf/ticketoutput.py:113 +#: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "" -#: pretix/base/models/orders.py:3522 +#: pretix/base/models/orders.py:3536 msgid "Certificate" msgstr "" -#: pretix/base/models/orders.py:3523 pretix/control/views/event.py:393 +#: pretix/base/models/orders.py:3537 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" @@ -6475,7 +6505,7 @@ msgstr "" msgid "Should be short, e.g. \"VAT\"" msgstr "" -#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1522 +#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1523 #: pretix/control/templates/pretixcontrol/order/transactions.html:22 msgid "Tax code" msgstr "" @@ -6535,12 +6565,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:1569 +#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1570 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:1573 +#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1574 msgid "" "A combination of this tax code with a zero tax rate does not make sense." msgstr "" @@ -6821,7 +6851,7 @@ msgstr "" #: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:384 #: pretix/base/services/placeholders.py:393 -#: pretix/base/templates/pretixbase/email/order_details.html:147 +#: pretix/base/templates/pretixbase/email/order_details.html:151 msgid "View order details" msgstr "" @@ -6893,119 +6923,119 @@ msgstr "" msgid "You have been requested to issue a refund for {order.code}." msgstr "" -#: pretix/base/payment.py:85 +#: pretix/base/payment.py:86 msgctxt "payment" msgid "Apple Pay" msgstr "" -#: pretix/base/payment.py:86 +#: pretix/base/payment.py:87 msgctxt "payment" msgid "Google Pay" msgstr "" -#: pretix/base/payment.py:117 pretix/base/payment.py:1579 +#: pretix/base/payment.py:119 pretix/base/payment.py:1610 msgid "You cannot pay with gift cards when buying a gift card." msgstr "" -#: pretix/base/payment.py:126 pretix/base/payment.py:1589 -#: pretix/base/payment.py:1591 +#: pretix/base/payment.py:128 pretix/base/payment.py:1620 +#: pretix/base/payment.py:1622 msgid "This gift card does not support this currency." msgstr "" -#: pretix/base/payment.py:128 pretix/base/payment.py:1597 +#: pretix/base/payment.py:130 pretix/base/payment.py:1628 msgid "This gift card can only be used in test mode." msgstr "" -#: pretix/base/payment.py:130 pretix/base/payment.py:1599 +#: pretix/base/payment.py:132 pretix/base/payment.py:1630 msgid "Only test gift cards can be used in test mode." msgstr "" -#: pretix/base/payment.py:132 pretix/base/payment.py:1601 +#: pretix/base/payment.py:134 pretix/base/payment.py:1632 msgid "This gift card is no longer valid." msgstr "" -#: pretix/base/payment.py:134 +#: pretix/base/payment.py:136 msgid "All credit on this gift card has been used." msgstr "" -#: pretix/base/payment.py:141 +#: pretix/base/payment.py:143 msgid "This gift card is already used for your payment." msgstr "" -#: pretix/base/payment.py:145 +#: pretix/base/payment.py:147 msgid "" "You entered a voucher instead of a gift card. Vouchers can only be entered " "on the first page of the shop below the product selection." msgstr "" -#: pretix/base/payment.py:149 +#: pretix/base/payment.py:151 msgid "This gift card is not known." msgstr "" -#: pretix/base/payment.py:152 +#: pretix/base/payment.py:154 msgid "" "This gift card can not be redeemed since its code is not unique. Please " "contact the organizer of this event." msgstr "" -#: pretix/base/payment.py:313 +#: pretix/base/payment.py:315 #: pretix/presale/templates/pretixpresale/event/order.html:116 msgid "Pay now" msgstr "" -#: pretix/base/payment.py:387 +#: pretix/base/payment.py:389 msgid "Enable payment method" msgstr "" -#: pretix/base/payment.py:393 +#: pretix/base/payment.py:395 msgid "" "Users will not be able to choose this payment provider before the given date." msgstr "" -#: pretix/base/payment.py:399 +#: pretix/base/payment.py:401 msgid "" "Users will not be able to choose this payment provider after the given date." msgstr "" -#: pretix/base/payment.py:404 +#: pretix/base/payment.py:406 msgid "Minimum order total" msgstr "" -#: pretix/base/payment.py:405 +#: pretix/base/payment.py:407 msgid "" "This payment will be available only if the order total is equal to or " "exceeds the given value. The order total for this purpose may be computed " "without taking the fees imposed by this payment method into account." msgstr "" -#: pretix/base/payment.py:415 +#: pretix/base/payment.py:417 msgid "Maximum order total" msgstr "" -#: pretix/base/payment.py:416 +#: pretix/base/payment.py:418 msgid "" "This payment will be available only if the order total is equal to or below " "the given value. The order total for this purpose may be computed without " "taking the fees imposed by this payment method into account." msgstr "" -#: pretix/base/payment.py:426 pretix/base/payment.py:435 +#: pretix/base/payment.py:428 pretix/base/payment.py:437 msgid "Additional fee" msgstr "" -#: pretix/base/payment.py:427 +#: pretix/base/payment.py:429 msgid "Absolute value" msgstr "" -#: pretix/base/payment.py:436 +#: pretix/base/payment.py:438 msgid "Percentage of the order total." msgstr "" -#: pretix/base/payment.py:442 +#: pretix/base/payment.py:444 msgid "Calculate the fee from the total value including the fee." msgstr "" -#: pretix/base/payment.py:443 +#: pretix/base/payment.py:445 #, python-brace-format msgid "" "We recommend to enable this if you want your users to pay the payment fees " @@ -7014,11 +7044,11 @@ msgid "" "Don't forget to set the correct fees above!" msgstr "" -#: pretix/base/payment.py:451 +#: pretix/base/payment.py:453 msgid "Text on invoices" msgstr "" -#: pretix/base/payment.py:452 +#: pretix/base/payment.py:454 msgid "" "Will be printed just below the payment figures and above the closing text on " "invoices. This will only be used if the invoice is generated before the " @@ -7026,111 +7056,111 @@ msgid "" "stating that it has already been paid." msgstr "" -#: pretix/base/payment.py:461 +#: pretix/base/payment.py:463 msgid "Restrict to countries" msgstr "" -#: pretix/base/payment.py:463 +#: pretix/base/payment.py:465 msgid "" "Only allow choosing this payment provider for invoice addresses in the " "selected countries. If you don't select any country, all countries are " "allowed. This is only enabled if the invoice address is required." msgstr "" -#: pretix/base/payment.py:482 +#: pretix/base/payment.py:484 msgid "" "Only allow the usage of this payment provider in the selected sales channels." msgstr "" -#: pretix/base/payment.py:486 +#: pretix/base/payment.py:488 msgid "Hide payment method" msgstr "" -#: pretix/base/payment.py:489 +#: pretix/base/payment.py:491 msgid "" "The payment method will not be shown by default but only to people who enter " "the shop through a special link." msgstr "" -#: pretix/base/payment.py:495 +#: pretix/base/payment.py:497 msgid "Link to enable payment method" msgstr "" -#: pretix/base/payment.py:504 +#: pretix/base/payment.py:506 msgid "Share this link with customers who should use this payment method." msgstr "" -#: pretix/base/payment.py:509 +#: pretix/base/payment.py:511 msgid "Do not send a payment reminder mail" msgstr "" -#: pretix/base/payment.py:510 +#: pretix/base/payment.py:512 msgid "" "Users will not receive a reminder mail to pay for their order before it " "expires if they have chosen this payment method." msgstr "" -#: pretix/base/payment.py:557 +#: pretix/base/payment.py:559 msgctxt "invoice" msgid "The payment for this invoice has already been received." msgstr "" -#: pretix/base/payment.py:1022 +#: pretix/base/payment.py:1024 msgid "" "This payment is already being processed and can not be canceled any more." msgstr "" -#: pretix/base/payment.py:1036 +#: pretix/base/payment.py:1038 msgid "Automatic refunds are not supported by this payment provider." msgstr "" -#: pretix/base/payment.py:1127 +#: pretix/base/payment.py:1129 msgid "" "No payment is required as this order only includes products which are free " "of charge." msgstr "" -#: pretix/base/payment.py:1134 +#: pretix/base/payment.py:1136 msgid "Free of charge" msgstr "" -#: pretix/base/payment.py:1166 +#: pretix/base/payment.py:1168 msgid "Box office" msgstr "" -#: pretix/base/payment.py:1214 pretix/base/payment.py:1233 +#: pretix/base/payment.py:1216 pretix/base/payment.py:1235 #: 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:1219 pretix/plugins/banktransfer/payment.py:195 +#: pretix/base/payment.py:1221 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:1240 pretix/base/payment.py:1427 -#: pretix/plugins/banktransfer/payment.py:149 +#: pretix/base/payment.py:1242 pretix/base/payment.py:1458 +#: pretix/plugins/banktransfer/payment.py:150 msgid "Payment method name" msgstr "" -#: pretix/base/payment.py:1244 +#: pretix/base/payment.py:1246 msgid "Payment process description during checkout" msgstr "" -#: pretix/base/payment.py:1245 +#: pretix/base/payment.py:1247 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:1250 +#: pretix/base/payment.py:1252 msgid "Payment process description in order confirmation emails" msgstr "" -#: pretix/base/payment.py:1251 +#: pretix/base/payment.py:1253 #, python-brace-format msgid "" "This text will be included for the {payment_info} placeholder in order " @@ -7139,11 +7169,11 @@ msgid "" "{amount_with_currency}." msgstr "" -#: pretix/base/payment.py:1258 +#: pretix/base/payment.py:1260 msgid "Payment process description for pending orders" msgstr "" -#: pretix/base/payment.py:1259 +#: pretix/base/payment.py:1261 #, python-brace-format msgid "" "This text will be shown on the order confirmation page for pending orders. " @@ -7151,38 +7181,38 @@ msgid "" "the placeholders {order}, {amount}, {currency} and {amount_with_currency}." msgstr "" -#: pretix/base/payment.py:1267 pretix/plugins/banktransfer/payment.py:144 +#: pretix/base/payment.py:1269 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:1318 +#: pretix/base/payment.py:1320 msgid "Offsetting" msgstr "" -#: pretix/base/payment.py:1332 pretix/control/views/orders.py:1255 +#: pretix/base/payment.py:1334 pretix/control/views/orders.py:1257 msgid "You entered an order that could not be found." msgstr "" -#: pretix/base/payment.py:1361 +#: pretix/base/payment.py:1363 #, python-format msgid "Balanced against orders: %s" msgstr "" -#: pretix/base/payment.py:1433 +#: pretix/base/payment.py:1464 msgid "Payment method description" msgstr "" -#: pretix/base/payment.py:1463 +#: pretix/base/payment.py:1494 msgid "In test mode, only test cards will work." msgstr "" -#: pretix/base/payment.py:1593 +#: pretix/base/payment.py:1624 msgid "This gift card is not accepted by this event organizer." msgstr "" -#: pretix/base/payment.py:1595 +#: pretix/base/payment.py:1626 msgid "This gift card was used in the meantime. Please try again." msgstr "" @@ -7194,7 +7224,7 @@ msgstr "" msgid "Order position number" msgstr "" -#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1777 +#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1778 #: pretix/control/templates/pretixcontrol/items/index.html:38 msgid "Product name" msgstr "" @@ -7254,7 +7284,7 @@ msgid "Price including add-ons and bundled products" msgstr "" #: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:487 +#: pretix/base/services/invoices.py:573 #: pretix/base/services/placeholders.py:571 #: pretix/base/services/placeholders.py:653 #: pretix/base/services/placeholders.py:669 @@ -7395,7 +7425,7 @@ msgstr "" msgid "Event location" msgstr "" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1172 +#: pretix/base/pdf.py:327 pretix/base/settings.py:1201 msgid "Random City" msgstr "" @@ -7407,7 +7437,7 @@ msgstr "" msgid "12345" msgstr "" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:490 +#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:576 msgid "Sample city" msgstr "" @@ -7573,7 +7603,7 @@ msgstr "" #: pretix/base/pdf.py:666 pretix/base/pdf.py:673 #: pretix/plugins/badges/exporters.py:501 #: pretix/plugins/checkinlists/exporters.py:125 -#: pretix/plugins/checkinlists/exporters.py:498 +#: pretix/plugins/checkinlists/exporters.py:499 #: pretix/plugins/ticketoutputpdf/exporters.py:99 #, python-brace-format msgid "Attendee name: {part}" @@ -7593,24 +7623,24 @@ msgstr "" msgid "Your layout file is not a valid layout. Error message: {}" msgstr "" -#: pretix/base/plugins.py:136 +#: pretix/base/plugins.py:138 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:132 msgid "Features" msgstr "" -#: pretix/base/plugins.py:138 +#: pretix/base/plugins.py:140 msgid "Integrations" msgstr "" -#: pretix/base/plugins.py:139 +#: pretix/base/plugins.py:141 msgid "Customizations" msgstr "" -#: pretix/base/plugins.py:140 +#: pretix/base/plugins.py:142 msgid "Output and export formats" msgstr "" -#: pretix/base/plugins.py:141 +#: pretix/base/plugins.py:143 msgid "API features" msgstr "" @@ -7668,12 +7698,16 @@ msgid "" "offline scanning – please refer to documentation or support for details)" msgstr "" -#: pretix/base/services/cancelevent.py:230 -#: pretix/base/services/cancelevent.py:308 +#: pretix/base/services/cancelevent.py:277 +#: pretix/base/services/cancelevent.py:363 msgid "Event canceled" msgstr "" -#: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:235 +#: pretix/base/services/cancelevent.py:392 +msgid "Bulk-refund confirmation" +msgstr "" + +#: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:247 #: pretix/base/services/orders.py:155 msgid "" "We were not able to process your request completely as the server was too " @@ -7731,7 +7765,7 @@ 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:1598 +#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1628 #, python-format msgid "You cannot select more than %(max)s item of the product %(product)s." msgid_plural "" @@ -7739,7 +7773,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1603 +#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1633 #, python-format msgid "You need to select at least %(min)s item of the product %(product)s." msgid_plural "" @@ -8139,34 +8173,34 @@ msgstr "" msgid "Czech National Bank" msgstr "" -#: pretix/base/services/export.py:86 pretix/base/services/export.py:157 -#: pretix/base/services/export.py:215 +#: pretix/base/services/export.py:91 pretix/base/services/export.py:166 +#: pretix/base/services/export.py:228 msgid "Your export did not contain any data." msgstr "" -#: pretix/base/services/export.py:151 +#: pretix/base/services/export.py:156 msgid "You do not have sufficient permission to perform this export." msgstr "" -#: pretix/base/services/export.py:189 +#: pretix/base/services/export.py:198 msgid "Export failed" msgstr "" -#: pretix/base/services/export.py:206 +#: pretix/base/services/export.py:215 msgid "Permission denied." msgstr "" -#: pretix/base/services/export.py:221 +#: pretix/base/services/export.py:234 msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:109 +#: pretix/base/services/invoices.py:115 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "" -#: pretix/base/services/invoices.py:121 +#: pretix/base/services/invoices.py:127 #, python-brace-format msgctxt "invoice" msgid "" @@ -8177,51 +8211,51 @@ msgid "" "{country}" msgstr "" -#: pretix/base/services/invoices.py:229 pretix/base/services/invoices.py:266 +#: pretix/base/services/invoices.py:237 pretix/base/services/invoices.py:274 #, python-brace-format msgctxt "invoice" msgid "Event location: {location}" msgstr "" -#: pretix/base/services/invoices.py:245 +#: pretix/base/services/invoices.py:253 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "" -#: pretix/base/services/invoices.py:263 pretix/plugins/reports/exporters.py:309 +#: pretix/base/services/invoices.py:271 pretix/plugins/reports/exporters.py:309 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "" -#: pretix/base/services/invoices.py:480 +#: pretix/base/services/invoices.py:566 msgid "A payment provider specific text might appear here." msgstr "" -#: pretix/base/services/invoices.py:488 +#: pretix/base/services/invoices.py:574 msgid "214th Example Street" msgstr "" -#: pretix/base/services/invoices.py:489 +#: pretix/base/services/invoices.py:575 msgid "012345" msgstr "" -#: pretix/base/services/invoices.py:506 +#: pretix/base/services/invoices.py:592 #, python-brace-format msgid "Sample product {}" msgstr "" -#: pretix/base/services/invoices.py:516 +#: pretix/base/services/invoices.py:602 msgid "Sample product A" msgstr "" -#: pretix/base/services/invoices.py:576 +#: pretix/base/services/invoices.py:662 #, python-brace-format msgid "New invoice: {number}" msgstr "" -#: pretix/base/services/invoices.py:578 +#: pretix/base/services/invoices.py:664 #, python-brace-format msgid "" "Hello,\n" @@ -8255,7 +8289,7 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "" -#: pretix/base/services/mail.py:492 +#: pretix/base/services/mail.py:494 msgctxt "attachment_filename" msgid "Calendar invite" msgstr "" @@ -8349,45 +8383,45 @@ msgid "" "different ticket at the same time." msgstr "" -#: pretix/base/services/modelimport.py:53 +#: pretix/base/services/modelimport.py:56 #, python-brace-format msgid "Error decoding special characters in your file: {message}" msgstr "" -#: pretix/base/services/modelimport.py:71 +#: pretix/base/services/modelimport.py:74 #, python-brace-format msgid "" "Error while importing value \"{value}\" for column \"{column}\" in line " "\"{line}\": {message}" msgstr "" -#: pretix/base/services/modelimport.py:89 -#: pretix/base/services/modelimport.py:137 pretix/base/services/orders.py:1607 +#: pretix/base/services/modelimport.py:92 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1637 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" -#: pretix/base/services/modelimport.py:113 +#: pretix/base/services/modelimport.py:116 #, python-format msgid "" "The grouping \"%(value)s\" occurs on non-consecutive lines (seen again on " "line %(row)s)." msgstr "" -#: pretix/base/services/modelimport.py:151 +#: pretix/base/services/modelimport.py:154 #, python-brace-format msgid "" "Inconsistent data in row {row}: Column {col} contains value \"{val_line}\", " "but for this order, the value has already been set to \"{val_order}\"." msgstr "" -#: pretix/base/services/modelimport.py:165 -#: pretix/base/services/modelimport.py:277 +#: pretix/base/services/modelimport.py:168 +#: pretix/base/services/modelimport.py:289 #, python-brace-format msgid "Invalid data in row {row}: {message}" msgstr "" -#: pretix/base/services/modelimport.py:258 +#: pretix/base/services/modelimport.py:270 msgid "A voucher cannot be created without a code." msgstr "" @@ -8506,121 +8540,121 @@ msgstr "" msgid "The order was not canceled." msgstr "" -#: pretix/base/services/orders.py:277 pretix/control/forms/orders.py:126 +#: pretix/base/services/orders.py:283 pretix/control/forms/orders.py:126 msgid "The new expiry date needs to be in the future." msgstr "" -#: pretix/base/services/orders.py:371 pretix/base/services/orders.py:463 +#: pretix/base/services/orders.py:383 pretix/base/services/orders.py:481 msgid "This order is not pending approval." msgstr "" -#: pretix/base/services/orders.py:525 pretix/presale/views/order.py:930 -#: pretix/presale/views/order.py:984 +#: pretix/base/services/orders.py:543 pretix/presale/views/order.py:953 +#: pretix/presale/views/order.py:1007 msgid "You cannot cancel this order." msgstr "" -#: pretix/base/services/orders.py:537 +#: pretix/base/services/orders.py:555 #, 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:600 pretix/control/forms/orders.py:219 +#: pretix/base/services/orders.py:618 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:1000 +#: pretix/base/services/orders.py:1024 msgid "The selected payment methods do not cover the total balance." msgstr "" -#: pretix/base/services/orders.py:1068 +#: pretix/base/services/orders.py:1092 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:1577 +#: pretix/base/services/orders.py:1607 msgid "You need to select a variation of the product." msgstr "" -#: pretix/base/services/orders.py:1578 +#: pretix/base/services/orders.py:1608 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "" -#: pretix/base/services/orders.py:1579 +#: pretix/base/services/orders.py:1609 msgid "There is no quota defined that allows this operation." msgstr "" -#: pretix/base/services/orders.py:1580 +#: pretix/base/services/orders.py:1610 msgid "The selected product is not active or has no price set." msgstr "" -#: pretix/base/services/orders.py:1581 +#: pretix/base/services/orders.py:1611 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "" -#: pretix/base/services/orders.py:1583 +#: pretix/base/services/orders.py:1613 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." msgstr "" -#: pretix/base/services/orders.py:1586 +#: pretix/base/services/orders.py:1616 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "" -#: pretix/base/services/orders.py:1587 +#: pretix/base/services/orders.py:1617 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "" -#: pretix/base/services/orders.py:1588 +#: pretix/base/services/orders.py:1618 msgid "You need to choose a subevent for the new position." msgstr "" -#: pretix/base/services/orders.py:1591 +#: pretix/base/services/orders.py:1621 #, 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:1593 +#: pretix/base/services/orders.py:1623 msgid "The selected product requires you to select a seat." msgstr "" -#: pretix/base/services/orders.py:1594 +#: pretix/base/services/orders.py:1624 msgid "The selected product does not allow to select a seat." msgstr "" -#: pretix/base/services/orders.py:1595 +#: pretix/base/services/orders.py:1625 msgid "The selected country is blocked by your tax rule." msgstr "" -#: pretix/base/services/orders.py:1596 +#: pretix/base/services/orders.py:1626 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "" -#: pretix/base/services/orders.py:2421 pretix/base/services/orders.py:2438 +#: pretix/base/services/orders.py:2451 pretix/base/services/orders.py:2468 #, 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:3133 +#: pretix/base/services/orders.py:3182 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." @@ -8756,7 +8790,7 @@ msgstr "" msgid "Plugin: %s" msgstr "" -#: pretix/base/services/vouchers.py:56 pretix/control/logdisplay.py:579 +#: pretix/base/services/vouchers.py:56 pretix/control/logdisplay.py:580 #, python-brace-format msgid "The voucher has been sent to {recipient}." msgstr "" @@ -9129,7 +9163,7 @@ msgstr "" msgid "Only respected by some invoice renderers." msgstr "" -#: pretix/base/settings.py:744 pretix/base/settings.py:2959 +#: pretix/base/settings.py:744 pretix/base/settings.py:2988 #: pretix/control/templates/pretixcontrol/pdf/index.html:436 msgid "Font" msgstr "" @@ -9362,95 +9396,119 @@ msgstr "" msgid "Invoices will never be automatically generated for free orders." msgstr "" -#: pretix/base/settings.py:1107 +#: pretix/base/settings.py:1108 pretix/base/settings.py:1119 +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 +msgid "Automatic, but prefer invoice date over event date" +msgstr "" + +#: pretix/base/settings.py:1112 pretix/base/settings.py:1123 +msgid "Invoice date" +msgstr "" + +#: pretix/base/settings.py:1116 +msgid "Date of service" +msgstr "" + +#: pretix/base/settings.py:1125 +msgid "" +"This controls what dates are shown on the invoice, but is especially " +"important for electronic invoicing." +msgstr "" + +#: pretix/base/settings.py:1136 msgid "Automatically cancel and reissue invoice on address changes" msgstr "" -#: pretix/base/settings.py:1108 +#: pretix/base/settings.py:1137 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:1119 +#: pretix/base/settings.py:1148 msgid "Allow to update existing invoices" msgstr "" -#: pretix/base/settings.py:1120 +#: pretix/base/settings.py:1149 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:1135 +#: pretix/base/settings.py:1164 msgid "Address line" msgstr "" -#: pretix/base/settings.py:1139 +#: pretix/base/settings.py:1168 msgid "Albert Einstein Road 52" msgstr "" -#: pretix/base/settings.py:1191 +#: pretix/base/settings.py:1220 msgid "Domestic tax ID" msgstr "" -#: pretix/base/settings.py:1192 +#: pretix/base/settings.py:1221 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "" -#: pretix/base/settings.py:1201 +#: pretix/base/settings.py:1230 msgid "EU VAT ID" msgstr "" -#: pretix/base/settings.py:1214 +#: pretix/base/settings.py:1243 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "" -#: pretix/base/settings.py:1217 +#: pretix/base/settings.py:1246 msgid "Introductory text" msgstr "" -#: pretix/base/settings.py:1218 +#: pretix/base/settings.py:1247 msgid "Will be printed on every invoice above the invoice rows." msgstr "" -#: pretix/base/settings.py:1231 +#: pretix/base/settings.py:1260 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." msgstr "" -#: pretix/base/settings.py:1234 +#: pretix/base/settings.py:1263 msgid "Additional text" msgstr "" -#: pretix/base/settings.py:1235 +#: pretix/base/settings.py:1264 msgid "Will be printed on every invoice below the invoice total." msgstr "" -#: pretix/base/settings.py:1248 +#: pretix/base/settings.py:1277 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." msgstr "" -#: pretix/base/settings.py:1251 +#: pretix/base/settings.py:1280 msgid "Footer" msgstr "" -#: pretix/base/settings.py:1252 +#: pretix/base/settings.py:1281 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "" -#: pretix/base/settings.py:1265 +#: pretix/base/settings.py:1294 msgid "Attach invoices to emails" msgstr "" -#: pretix/base/settings.py:1266 +#: pretix/base/settings.py:1295 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -9458,39 +9516,39 @@ msgid "" "are not automatically generated, they will not be attached to emails." msgstr "" -#: pretix/base/settings.py:1278 +#: pretix/base/settings.py:1307 msgid "Email address to receive a copy of each invoice" msgstr "" -#: pretix/base/settings.py:1279 +#: pretix/base/settings.py:1308 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:1294 +#: pretix/base/settings.py:1323 msgid "Show items outside presale period" msgstr "" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1324 msgid "" "Show item details before presale has started and after presale has ended" msgstr "" -#: pretix/base/settings.py:1315 +#: pretix/base/settings.py:1344 msgid "Available languages" msgstr "" -#: pretix/base/settings.py:1331 pretix/control/forms/event.py:139 +#: pretix/base/settings.py:1360 pretix/control/forms/event.py:139 msgid "Default language" msgstr "" -#: pretix/base/settings.py:1341 +#: pretix/base/settings.py:1370 msgid "Region" msgstr "" -#: pretix/base/settings.py:1342 +#: pretix/base/settings.py:1371 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 " @@ -9498,11 +9556,11 @@ msgid "" "languages used in different regions globally (like English)." msgstr "" -#: pretix/base/settings.py:1354 +#: pretix/base/settings.py:1383 msgid "This shop represents an event" msgstr "" -#: pretix/base/settings.py:1356 +#: pretix/base/settings.py:1385 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 " @@ -9511,45 +9569,45 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1369 +#: pretix/base/settings.py:1398 msgid "Show event end date" msgstr "" -#: pretix/base/settings.py:1370 +#: pretix/base/settings.py:1399 msgid "If disabled, only event's start date will be displayed to the public." msgstr "" -#: pretix/base/settings.py:1379 +#: pretix/base/settings.py:1408 msgid "Show dates with time" msgstr "" -#: pretix/base/settings.py:1380 +#: pretix/base/settings.py:1409 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." msgstr "" -#: pretix/base/settings.py:1389 +#: pretix/base/settings.py:1418 msgid "Hide all products that are sold out" msgstr "" -#: pretix/base/settings.py:1399 pretix/control/forms/event.py:1691 +#: pretix/base/settings.py:1428 pretix/control/forms/event.py:1692 msgid "Publicly show how many tickets of a certain type are still available." msgstr "" -#: pretix/base/settings.py:1408 +#: pretix/base/settings.py:1437 msgid "Ask search engines not to index the ticket shop" msgstr "" -#: pretix/base/settings.py:1417 +#: pretix/base/settings.py:1446 msgid "Show variations of a product expanded by default" msgstr "" -#: pretix/base/settings.py:1426 +#: pretix/base/settings.py:1455 msgid "Enable waiting list" msgstr "" -#: pretix/base/settings.py:1427 pretix/control/forms/event.py:1696 +#: pretix/base/settings.py:1456 pretix/control/forms/event.py:1697 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 " @@ -9557,11 +9615,11 @@ msgid "" "notification with a voucher that can be used to buy a ticket." msgstr "" -#: pretix/base/settings.py:1438 +#: pretix/base/settings.py:1467 msgid "Automatic waiting list assignments" msgstr "" -#: pretix/base/settings.py:1439 +#: pretix/base/settings.py:1468 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 " @@ -9570,22 +9628,22 @@ msgid "" "enabled, tickets will still be sent out." msgstr "" -#: pretix/base/settings.py:1455 +#: pretix/base/settings.py:1484 msgid "Waiting list response time" msgstr "" -#: pretix/base/settings.py:1458 +#: pretix/base/settings.py:1487 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:1469 +#: pretix/base/settings.py:1498 msgid "Disable waiting list" msgstr "" -#: pretix/base/settings.py:1470 +#: pretix/base/settings.py:1499 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 " @@ -9594,53 +9652,53 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1482 +#: pretix/base/settings.py:1511 msgid "Ask for a name" msgstr "" -#: pretix/base/settings.py:1483 +#: pretix/base/settings.py:1512 msgid "Ask for a name when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1492 +#: pretix/base/settings.py:1521 msgid "Require name" msgstr "" -#: pretix/base/settings.py:1493 +#: pretix/base/settings.py:1522 msgid "Require a name when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1503 +#: pretix/base/settings.py:1532 msgid "Ask for a phone number" msgstr "" -#: pretix/base/settings.py:1504 +#: pretix/base/settings.py:1533 msgid "Ask for a phone number when signing up to the waiting list." msgstr "" -#: pretix/base/settings.py:1513 +#: pretix/base/settings.py:1542 msgid "Require phone number" msgstr "" -#: pretix/base/settings.py:1514 +#: pretix/base/settings.py:1543 msgid "Require a phone number when signing up to the waiting list.." msgstr "" -#: pretix/base/settings.py:1524 +#: pretix/base/settings.py:1553 msgid "Phone number explanation" msgstr "" -#: pretix/base/settings.py:1527 +#: pretix/base/settings.py:1556 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:1539 +#: pretix/base/settings.py:1568 msgid "Maximum number of entries per email address for the same product" msgstr "" -#: pretix/base/settings.py:1543 +#: pretix/base/settings.py:1572 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 " @@ -9649,11 +9707,11 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1555 +#: pretix/base/settings.py:1584 msgid "Show number of check-ins to customer" msgstr "" -#: pretix/base/settings.py:1556 +#: pretix/base/settings.py:1585 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 " @@ -9663,62 +9721,62 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1569 +#: pretix/base/settings.py:1598 msgid "Allow users to download tickets" msgstr "" -#: pretix/base/settings.py:1570 +#: pretix/base/settings.py:1599 msgid "If this is off, nobody can download a ticket." msgstr "" -#: pretix/base/settings.py:1579 +#: pretix/base/settings.py:1608 msgid "Download date" msgstr "" -#: pretix/base/settings.py:1580 +#: pretix/base/settings.py:1609 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:1591 +#: pretix/base/settings.py:1620 msgid "Generate tickets for add-on products and bundled products" msgstr "" -#: pretix/base/settings.py:1592 +#: pretix/base/settings.py:1621 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:1605 +#: pretix/base/settings.py:1634 msgid "Generate tickets for all products" msgstr "" -#: pretix/base/settings.py:1606 +#: pretix/base/settings.py:1635 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:1618 +#: pretix/base/settings.py:1647 msgid "Generate tickets for pending orders" msgstr "" -#: pretix/base/settings.py:1619 +#: pretix/base/settings.py:1648 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." msgstr "" -#: pretix/base/settings.py:1630 +#: pretix/base/settings.py:1659 msgid "Do not issue ticket before email address is validated" msgstr "" -#: pretix/base/settings.py:1631 +#: pretix/base/settings.py:1660 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 " @@ -9727,11 +9785,11 @@ msgid "" "orders performed through other sales channels." msgstr "" -#: pretix/base/settings.py:1647 +#: pretix/base/settings.py:1676 msgid "Low availability threshold" msgstr "" -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1677 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 " @@ -9739,95 +9797,95 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1662 +#: pretix/base/settings.py:1691 msgid "Show availability in event overviews" msgstr "" -#: pretix/base/settings.py:1663 +#: pretix/base/settings.py:1692 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:1676 pretix/base/settings.py:1684 +#: pretix/base/settings.py:1705 pretix/base/settings.py:1713 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "" -#: pretix/base/settings.py:1677 pretix/base/settings.py:1685 +#: pretix/base/settings.py:1706 pretix/base/settings.py:1714 msgid "Week calendar" msgstr "" -#: pretix/base/settings.py:1678 pretix/base/settings.py:1686 +#: pretix/base/settings.py:1707 pretix/base/settings.py:1715 msgid "Month calendar" msgstr "" -#: pretix/base/settings.py:1682 +#: pretix/base/settings.py:1711 msgid "Default overview style" msgstr "" -#: pretix/base/settings.py:1688 +#: pretix/base/settings.py:1717 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:1697 +#: pretix/base/settings.py:1726 msgid "Show filter options for calendar or list view" msgstr "" -#: pretix/base/settings.py:1698 +#: pretix/base/settings.py:1727 msgid "" "You can set up possible filters as meta properties in your organizer " "settings." msgstr "" -#: pretix/base/settings.py:1707 +#: pretix/base/settings.py:1736 msgid "Hide all unavailable dates from calendar or list views" msgstr "" -#: pretix/base/settings.py:1708 pretix/base/settings.py:1719 +#: pretix/base/settings.py:1737 pretix/base/settings.py:1748 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1718 +#: pretix/base/settings.py:1747 msgid "Hide all past dates from calendar" msgstr "" -#: pretix/base/settings.py:1730 pretix/base/settings.py:1739 +#: pretix/base/settings.py:1759 pretix/base/settings.py:1768 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1731 pretix/base/settings.py:1740 +#: pretix/base/settings.py:1760 pretix/base/settings.py:1769 msgid "Only the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1732 pretix/base/settings.py:1741 +#: pretix/base/settings.py:1761 pretix/base/settings.py:1770 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1765 msgid "Allow customers to modify their information" msgstr "" -#: pretix/base/settings.py:1751 +#: pretix/base/settings.py:1780 msgid "Allow customers to modify their information after they checked in." msgstr "" -#: pretix/base/settings.py:1752 +#: pretix/base/settings.py:1781 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:1762 +#: pretix/base/settings.py:1791 msgid "Last date of modifications" msgstr "" -#: pretix/base/settings.py:1763 +#: pretix/base/settings.py:1792 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 " @@ -9835,53 +9893,53 @@ msgid "" "used." msgstr "" -#: pretix/base/settings.py:1774 +#: pretix/base/settings.py:1803 msgid "Customers can change the variation of the products they purchased" msgstr "" -#: pretix/base/settings.py:1783 +#: pretix/base/settings.py:1812 msgid "Customers can change their selected add-on products" msgstr "" -#: pretix/base/settings.py:1793 pretix/base/settings.py:1804 +#: pretix/base/settings.py:1822 pretix/base/settings.py:1833 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "" -#: pretix/base/settings.py:1794 pretix/base/settings.py:1805 +#: pretix/base/settings.py:1823 pretix/base/settings.py:1834 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "" -#: pretix/base/settings.py:1795 pretix/base/settings.py:1806 +#: pretix/base/settings.py:1824 pretix/base/settings.py:1835 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "" -#: pretix/base/settings.py:1796 pretix/base/settings.py:1807 +#: pretix/base/settings.py:1825 pretix/base/settings.py:1836 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:1798 pretix/base/settings.py:1809 +#: pretix/base/settings.py:1827 pretix/base/settings.py:1838 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" -#: pretix/base/settings.py:1802 +#: pretix/base/settings.py:1831 msgid "Requirement for changed prices" msgstr "" -#: pretix/base/settings.py:1820 +#: pretix/base/settings.py:1849 msgid "Do not allow changes after" msgstr "" -#: pretix/base/settings.py:1829 +#: pretix/base/settings.py:1858 msgid "Allow change even though the ticket has already been checked in" msgstr "" -#: pretix/base/settings.py:1830 +#: pretix/base/settings.py:1859 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 " @@ -9890,11 +9948,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:1842 +#: pretix/base/settings.py:1871 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:1843 +#: pretix/base/settings.py:1872 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, " @@ -9903,77 +9961,77 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:1855 +#: pretix/base/settings.py:1884 msgid "Customers can cancel their unpaid orders" msgstr "" -#: pretix/base/settings.py:1867 +#: pretix/base/settings.py:1896 msgid "Charge a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:1868 pretix/base/settings.py:1879 -#: pretix/base/settings.py:1893 +#: pretix/base/settings.py:1897 pretix/base/settings.py:1908 +#: pretix/base/settings.py:1922 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:1878 +#: pretix/base/settings.py:1907 msgid "Charge payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:1892 +#: pretix/base/settings.py:1921 msgid "Charge a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:1903 pretix/base/settings.py:2042 +#: pretix/base/settings.py:1932 pretix/base/settings.py:2071 msgid "Do not allow cancellations after" msgstr "" -#: pretix/base/settings.py:1912 +#: pretix/base/settings.py:1941 msgid "Customers can cancel their paid orders" msgstr "" -#: pretix/base/settings.py:1913 +#: pretix/base/settings.py:1942 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:1926 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:1955 pretix/control/forms/orders.py:909 msgid "Keep a fixed cancellation fee" msgstr "" -#: pretix/base/settings.py:1935 +#: pretix/base/settings.py:1964 msgid "Keep payment, shipping and service fees" msgstr "" -#: pretix/base/settings.py:1947 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:1976 pretix/control/forms/orders.py:920 msgid "Keep a percentual cancellation fee" msgstr "" -#: pretix/base/settings.py:1956 +#: pretix/base/settings.py:1985 msgid "Allow customers to voluntarily choose a lower refund" msgstr "" -#: pretix/base/settings.py:1957 +#: pretix/base/settings.py:1986 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "" -#: pretix/base/settings.py:1962 +#: pretix/base/settings.py:1991 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:1969 +#: pretix/base/settings.py:1998 msgid "Voluntary lower refund explanation" msgstr "" -#: pretix/base/settings.py:1972 +#: pretix/base/settings.py:2001 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 " @@ -9981,107 +10039,107 @@ msgid "" "help your organization." msgstr "" -#: pretix/base/settings.py:1987 +#: pretix/base/settings.py:2016 msgid "Step size for reduction amount" msgstr "" -#: pretix/base/settings.py:1988 +#: pretix/base/settings.py:2017 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:1998 +#: pretix/base/settings.py:2027 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:2008 +#: pretix/base/settings.py:2037 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2017 pretix/base/settings.py:2027 +#: pretix/base/settings.py:2046 pretix/base/settings.py:2056 msgid "All refunds are issued to the original payment method" msgstr "" -#: pretix/base/settings.py:2018 pretix/base/settings.py:2028 +#: pretix/base/settings.py:2047 pretix/base/settings.py:2057 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" -#: pretix/base/settings.py:2019 pretix/base/settings.py:2029 +#: pretix/base/settings.py:2048 pretix/base/settings.py:2058 msgid "All refunds are issued as gift cards" msgstr "" -#: pretix/base/settings.py:2020 pretix/base/settings.py:2030 +#: pretix/base/settings.py:2049 pretix/base/settings.py:2059 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2025 +#: pretix/base/settings.py:2054 #: pretix/control/templates/pretixcontrol/order/index.html:149 msgid "Refund method" msgstr "" -#: pretix/base/settings.py:2051 pretix/base/settings.py:2064 +#: pretix/base/settings.py:2080 pretix/base/settings.py:2093 msgid "Terms of cancellation" msgstr "" -#: pretix/base/settings.py:2054 +#: pretix/base/settings.py:2083 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:2067 +#: pretix/base/settings.py:2096 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:2077 pretix/control/forms/event.py:1719 +#: pretix/base/settings.py:2106 pretix/control/forms/event.py:1720 msgid "Contact address" msgstr "" -#: pretix/base/settings.py:2078 pretix/control/forms/event.py:1721 +#: pretix/base/settings.py:2107 pretix/control/forms/event.py:1722 msgid "We'll show this publicly to allow attendees to contact you." msgstr "" -#: pretix/base/settings.py:2086 pretix/control/forms/event.py:1713 +#: pretix/base/settings.py:2115 pretix/control/forms/event.py:1714 msgid "Imprint URL" msgstr "" -#: pretix/base/settings.py:2087 pretix/control/forms/event.py:1714 +#: pretix/base/settings.py:2116 pretix/control/forms/event.py:1715 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:2097 +#: pretix/base/settings.py:2126 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2098 +#: pretix/base/settings.py:2127 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:2109 +#: pretix/base/settings.py:2138 msgid "Accessibility information URL" msgstr "" -#: pretix/base/settings.py:2110 +#: pretix/base/settings.py:2139 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:2117 +#: pretix/base/settings.py:2146 #: pretix/presale/templates/pretixpresale/event/base.html:228 #: pretix/presale/templates/pretixpresale/event/base.html:233 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -10090,52 +10148,52 @@ msgstr "" msgid "Accessibility information" msgstr "" -#: pretix/base/settings.py:2121 +#: pretix/base/settings.py:2150 msgid "Accessibility information title" msgstr "" -#: pretix/base/settings.py:2131 +#: pretix/base/settings.py:2160 msgid "Accessibility information text" msgstr "" -#: pretix/base/settings.py:2152 +#: pretix/base/settings.py:2181 msgid "Attach ticket files" msgstr "" -#: pretix/base/settings.py:2154 +#: pretix/base/settings.py:2183 #, 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:2165 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2194 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:2166 +#: pretix/base/settings.py:2195 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" -#: pretix/base/settings.py:2175 +#: pretix/base/settings.py:2204 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2176 +#: pretix/base/settings.py:2205 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:2185 +#: pretix/base/settings.py:2214 msgid "Event description" msgstr "" -#: pretix/base/settings.py:2188 +#: pretix/base/settings.py:2217 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 " @@ -10145,52 +10203,52 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2201 +#: pretix/base/settings.py:2230 msgid "Subject prefix" msgstr "" -#: pretix/base/settings.py:2202 +#: pretix/base/settings.py:2231 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:2216 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2245 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:2217 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2246 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "" -#: pretix/base/settings.py:2226 +#: pretix/base/settings.py:2255 msgid "Sender name" msgstr "" -#: pretix/base/settings.py:2227 +#: pretix/base/settings.py:2256 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." msgstr "" -#: pretix/base/settings.py:2245 pretix/base/settings.py:2302 -#: pretix/base/settings.py:2319 pretix/base/settings.py:2337 +#: pretix/base/settings.py:2274 pretix/base/settings.py:2331 +#: pretix/base/settings.py:2348 pretix/base/settings.py:2366 #, python-brace-format msgid "Your order: {code}" msgstr "" -#: pretix/base/settings.py:2249 pretix/base/settings.py:2282 -#: pretix/base/settings.py:2387 pretix/base/settings.py:2620 -#: pretix/base/settings.py:2657 +#: 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 #, python-brace-format msgid "Your event registration: {code}" msgstr "" -#: pretix/base/settings.py:2253 +#: pretix/base/settings.py:2282 #, python-brace-format msgid "" "Hello,\n" @@ -10205,12 +10263,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2266 +#: pretix/base/settings.py:2295 #, python-brace-format msgid "Your orders for {event}" msgstr "" -#: pretix/base/settings.py:2270 +#: pretix/base/settings.py:2299 #, python-brace-format msgid "" "Hello,\n" @@ -10224,7 +10282,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2286 +#: pretix/base/settings.py:2315 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10238,7 +10296,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2306 +#: pretix/base/settings.py:2335 #, python-brace-format msgid "" "Hello,\n" @@ -10253,7 +10311,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2323 +#: pretix/base/settings.py:2352 #, python-brace-format msgid "" "Hello,\n" @@ -10269,7 +10327,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2341 +#: pretix/base/settings.py:2370 #, python-brace-format msgid "" "Hello,\n" @@ -10287,11 +10345,11 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2359 +#: pretix/base/settings.py:2388 msgid "Attachment for new orders" msgstr "" -#: pretix/base/settings.py:2364 +#: pretix/base/settings.py:2393 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -10303,7 +10361,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2391 +#: pretix/base/settings.py:2420 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10317,12 +10375,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2403 +#: pretix/base/settings.py:2432 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "" -#: pretix/base/settings.py:2407 +#: pretix/base/settings.py:2436 #, python-brace-format msgid "" "Hello,\n" @@ -10336,12 +10394,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2419 +#: pretix/base/settings.py:2448 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "" -#: pretix/base/settings.py:2423 +#: pretix/base/settings.py:2452 #, python-brace-format msgid "" "Hello,\n" @@ -10357,12 +10415,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2441 +#: pretix/base/settings.py:2470 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2445 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10376,23 +10434,23 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2462 pretix/control/forms/event.py:1129 -#: pretix/control/forms/event.py:1243 pretix/plugins/sendmail/models.py:275 +#: pretix/base/settings.py:2491 pretix/control/forms/event.py:1130 +#: pretix/control/forms/event.py:1244 pretix/plugins/sendmail/models.py:275 msgid "Number of days" msgstr "" -#: pretix/base/settings.py:2464 pretix/control/forms/event.py:1132 +#: pretix/base/settings.py:2493 pretix/control/forms/event.py:1133 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:2472 +#: pretix/base/settings.py:2501 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "" -#: pretix/base/settings.py:2476 +#: pretix/base/settings.py:2505 #, python-brace-format msgid "" "Hello,\n" @@ -10408,12 +10466,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2490 +#: pretix/base/settings.py:2519 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "" -#: pretix/base/settings.py:2494 +#: pretix/base/settings.py:2523 #, python-brace-format msgid "" "Hello,\n" @@ -10428,12 +10486,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2507 +#: pretix/base/settings.py:2536 #, python-brace-format msgid "Incomplete payment received: {code}" msgstr "" -#: pretix/base/settings.py:2511 +#: pretix/base/settings.py:2540 #, python-brace-format msgid "" "Hello,\n" @@ -10451,12 +10509,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2527 +#: pretix/base/settings.py:2556 #, python-brace-format msgid "Payment failed for your order: {code}" msgstr "" -#: pretix/base/settings.py:2531 +#: pretix/base/settings.py:2560 #, python-brace-format msgid "" "Hello,\n" @@ -10474,12 +10532,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2545 +#: pretix/base/settings.py:2574 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "" -#: pretix/base/settings.py:2549 +#: pretix/base/settings.py:2578 #, python-brace-format msgid "" "Hello,\n" @@ -10510,12 +10568,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2578 +#: pretix/base/settings.py:2607 #, python-brace-format msgid "Order canceled: {code}" msgstr "" -#: pretix/base/settings.py:2582 +#: pretix/base/settings.py:2611 #, python-brace-format msgid "" "Hello,\n" @@ -10531,12 +10589,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2596 +#: pretix/base/settings.py:2625 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "" -#: pretix/base/settings.py:2600 +#: pretix/base/settings.py:2629 #, python-brace-format msgid "" "Hello,\n" @@ -10554,7 +10612,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2624 pretix/base/settings.py:2661 +#: pretix/base/settings.py:2653 pretix/base/settings.py:2690 #, python-brace-format msgid "" "Hello,\n" @@ -10568,12 +10626,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2636 +#: pretix/base/settings.py:2665 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "" -#: pretix/base/settings.py:2640 +#: pretix/base/settings.py:2669 #, python-brace-format msgid "" "Hello,\n" @@ -10588,12 +10646,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2673 +#: pretix/base/settings.py:2702 #, python-brace-format msgid "Order denied: {code}" msgstr "" -#: pretix/base/settings.py:2677 +#: pretix/base/settings.py:2706 #, python-brace-format msgid "" "Hello,\n" @@ -10610,7 +10668,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2692 +#: pretix/base/settings.py:2721 #, python-brace-format msgid "" "Hello,\n" @@ -10622,12 +10680,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2702 +#: pretix/base/settings.py:2731 #, python-brace-format msgid "Invoice {invoice_number}" msgstr "" -#: pretix/base/settings.py:2706 +#: pretix/base/settings.py:2735 #, python-brace-format msgid "" "Hello,\n" @@ -10640,12 +10698,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2724 pretix/base/settings.py:2740 +#: pretix/base/settings.py:2753 pretix/base/settings.py:2769 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "" -#: pretix/base/settings.py:2728 +#: pretix/base/settings.py:2757 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -10659,7 +10717,7 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2744 +#: pretix/base/settings.py:2773 #, python-brace-format msgid "" "Hello,\n" @@ -10673,12 +10731,12 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/base/settings.py:2756 +#: pretix/base/settings.py:2785 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2760 +#: pretix/base/settings.py:2789 #, python-brace-format msgid "" "Hello {name},\n" @@ -10698,12 +10756,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2778 +#: pretix/base/settings.py:2807 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2782 +#: pretix/base/settings.py:2811 #, python-brace-format msgid "" "Hello {name},\n" @@ -10723,12 +10781,12 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2800 +#: pretix/base/settings.py:2829 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "" -#: pretix/base/settings.py:2804 +#: pretix/base/settings.py:2833 #, python-brace-format msgid "" "Hello {name},\n" @@ -10748,57 +10806,57 @@ msgid "" "Your {organizer} team" msgstr "" -#: pretix/base/settings.py:2856 pretix/base/settings.py:2863 -#: pretix/base/settings.py:2877 pretix/base/settings.py:2885 -#: pretix/base/settings.py:2899 pretix/base/settings.py:2907 -#: pretix/base/settings.py:2921 pretix/base/settings.py:2928 +#: 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 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "" -#: pretix/base/settings.py:2860 +#: pretix/base/settings.py:2889 msgid "Primary color" msgstr "" -#: pretix/base/settings.py:2881 +#: pretix/base/settings.py:2910 msgid "Accent color for success" msgstr "" -#: pretix/base/settings.py:2882 +#: pretix/base/settings.py:2911 msgid "We strongly suggest to use a shade of green." msgstr "" -#: pretix/base/settings.py:2903 +#: pretix/base/settings.py:2932 msgid "Accent color for errors" msgstr "" -#: pretix/base/settings.py:2904 +#: pretix/base/settings.py:2933 msgid "We strongly suggest to use a shade of red." msgstr "" -#: pretix/base/settings.py:2925 +#: pretix/base/settings.py:2954 msgid "Page background color" msgstr "" -#: pretix/base/settings.py:2940 +#: pretix/base/settings.py:2969 msgid "Use round edges" msgstr "" -#: pretix/base/settings.py:2949 +#: pretix/base/settings.py:2978 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:2960 +#: pretix/base/settings.py:2989 msgid "Only respected by modern browsers." msgstr "" -#: pretix/base/settings.py:2971 pretix/base/settings.py:3015 +#: pretix/base/settings.py:3000 pretix/base/settings.py:3044 #: pretix/control/forms/organizer.py:523 msgid "Header image" msgstr "" -#: pretix/base/settings.py:2974 +#: pretix/base/settings.py:3003 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 " @@ -10807,26 +10865,26 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:2995 pretix/base/settings.py:3038 +#: pretix/base/settings.py:3024 pretix/base/settings.py:3067 msgid "Use header image in its full size" msgstr "" -#: pretix/base/settings.py:2996 pretix/base/settings.py:3039 +#: pretix/base/settings.py:3025 pretix/base/settings.py:3068 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "" -#: pretix/base/settings.py:3005 +#: pretix/base/settings.py:3034 msgid "Show event title even if a header image is present" msgstr "" -#: pretix/base/settings.py:3006 +#: pretix/base/settings.py:3035 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:3018 pretix/control/forms/organizer.py:527 +#: pretix/base/settings.py:3047 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 " @@ -10835,25 +10893,25 @@ msgid "" "using small details on the picture as it will be resized on smaller screens." msgstr "" -#: pretix/base/settings.py:3048 +#: pretix/base/settings.py:3077 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3056 +#: pretix/base/settings.py:3085 msgid "Favicon" msgstr "" -#: pretix/base/settings.py:3059 +#: pretix/base/settings.py:3088 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:3075 +#: pretix/base/settings.py:3104 msgid "Social media image" msgstr "" -#: pretix/base/settings.py:3078 +#: pretix/base/settings.py:3107 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 " @@ -10862,93 +10920,93 @@ msgid "" "square is shown. If you do not fill this, we will use the logo given above." msgstr "" -#: pretix/base/settings.py:3096 +#: pretix/base/settings.py:3125 msgid "Logo image" msgstr "" -#: pretix/base/settings.py:3100 +#: pretix/base/settings.py:3129 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "" -#: pretix/base/settings.py:3126 pretix/base/settings.py:3232 +#: pretix/base/settings.py:3155 pretix/base/settings.py:3261 msgid "Info text" msgstr "" -#: pretix/base/settings.py:3129 pretix/base/settings.py:3234 +#: pretix/base/settings.py:3158 pretix/base/settings.py:3263 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:3138 +#: pretix/base/settings.py:3167 msgid "Banner text (top)" msgstr "" -#: pretix/base/settings.py:3141 +#: pretix/base/settings.py:3170 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:3151 +#: pretix/base/settings.py:3180 msgid "Banner text (bottom)" msgstr "" -#: pretix/base/settings.py:3154 +#: pretix/base/settings.py:3183 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:3164 +#: pretix/base/settings.py:3193 msgid "Voucher explanation" msgstr "" -#: pretix/base/settings.py:3167 +#: pretix/base/settings.py:3196 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:3177 +#: pretix/base/settings.py:3206 msgid "Attendee data explanation" msgstr "" -#: pretix/base/settings.py:3180 +#: pretix/base/settings.py:3209 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:3190 +#: pretix/base/settings.py:3219 msgid "Additional success message" msgstr "" -#: pretix/base/settings.py:3191 +#: pretix/base/settings.py:3220 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:3203 +#: pretix/base/settings.py:3232 msgid "Help text of the phone number field" msgstr "" -#: pretix/base/settings.py:3210 +#: pretix/base/settings.py:3239 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:3217 +#: pretix/base/settings.py:3246 msgid "Help text of the email field" msgstr "" -#: pretix/base/settings.py:3243 +#: pretix/base/settings.py:3272 msgid "Allow creating a new team during event creation" msgstr "" -#: pretix/base/settings.py:3244 +#: pretix/base/settings.py:3273 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 " @@ -10956,68 +11014,68 @@ msgid "" "not have \"Can change teams and permissions\" permission." msgstr "" -#: pretix/base/settings.py:3316 pretix/base/settings.py:3326 +#: pretix/base/settings.py:3345 pretix/base/settings.py:3355 msgid "Event start time (descending)" msgstr "" -#: pretix/base/settings.py:3318 pretix/base/settings.py:3328 +#: pretix/base/settings.py:3347 pretix/base/settings.py:3357 msgid "Name (descending)" msgstr "" -#: pretix/base/settings.py:3323 +#: pretix/base/settings.py:3352 msgctxt "subevent" msgid "Date ordering" msgstr "" -#: pretix/base/settings.py:3339 +#: pretix/base/settings.py:3368 msgid "Link back to organizer overview on all event pages" msgstr "" -#: pretix/base/settings.py:3348 +#: pretix/base/settings.py:3377 msgid "Homepage text" msgstr "" -#: pretix/base/settings.py:3350 +#: pretix/base/settings.py:3379 msgid "This will be displayed on the organizer homepage." msgstr "" -#: pretix/base/settings.py:3365 +#: pretix/base/settings.py:3394 msgid "Length of gift card codes" msgstr "" -#: pretix/base/settings.py:3366 +#: pretix/base/settings.py:3395 #, 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:3382 +#: pretix/base/settings.py:3411 msgid "Validity of gift card codes in years" msgstr "" -#: pretix/base/settings.py:3383 +#: pretix/base/settings.py:3412 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:3394 +#: pretix/base/settings.py:3423 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3400 +#: pretix/base/settings.py:3429 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:3407 +#: pretix/base/settings.py:3436 msgid "Dialog text" msgstr "" -#: pretix/base/settings.py:3414 +#: pretix/base/settings.py:3443 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 " @@ -11025,192 +11083,192 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3422 +#: pretix/base/settings.py:3451 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3428 +#: pretix/base/settings.py:3457 msgid "Privacy settings" msgstr "" -#: pretix/base/settings.py:3433 +#: pretix/base/settings.py:3462 msgid "Dialog title" msgstr "" -#: pretix/base/settings.py:3439 +#: pretix/base/settings.py:3468 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3444 +#: pretix/base/settings.py:3473 msgid "\"Accept\" button description" msgstr "" -#: pretix/base/settings.py:3450 +#: pretix/base/settings.py:3479 msgid "Required cookies only" msgstr "" -#: pretix/base/settings.py:3455 +#: pretix/base/settings.py:3484 msgid "\"Reject\" button description" msgstr "" -#: pretix/base/settings.py:3465 +#: pretix/base/settings.py:3494 msgid "Customers can choose their own seats" msgstr "" -#: pretix/base/settings.py:3466 +#: pretix/base/settings.py:3495 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:3492 +#: pretix/base/settings.py:3521 msgid "Show button to copy user input from other products" msgstr "" -#: pretix/base/settings.py:3502 +#: pretix/base/settings.py:3531 msgid "Most common English titles" msgstr "" -#: pretix/base/settings.py:3512 +#: pretix/base/settings.py:3541 msgid "Most common German titles" msgstr "" -#: pretix/base/settings.py:3525 +#: pretix/base/settings.py:3554 msgctxt "person_name_salutation" msgid "Ms" msgstr "" -#: pretix/base/settings.py:3526 +#: pretix/base/settings.py:3555 msgctxt "person_name_salutation" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3527 +#: pretix/base/settings.py:3556 msgctxt "person_name_salutation" msgid "Mx" msgstr "" -#: pretix/base/settings.py:3564 pretix/base/settings.py:3580 -#: pretix/base/settings.py:3596 pretix/base/settings.py:3611 -#: pretix/base/settings.py:3629 pretix/base/settings.py:3644 -#: pretix/base/settings.py:3674 pretix/base/settings.py:3698 -#: pretix/base/settings.py:3730 pretix/base/settings.py:3752 -#: pretix/base/settings.py:3783 +#: 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 msgctxt "person_name_sample" msgid "John" msgstr "" -#: pretix/base/settings.py:3565 pretix/base/settings.py:3581 -#: pretix/base/settings.py:3597 pretix/base/settings.py:3613 -#: pretix/base/settings.py:3631 pretix/base/settings.py:3645 -#: pretix/base/settings.py:3675 pretix/base/settings.py:3731 -#: pretix/base/settings.py:3753 pretix/base/settings.py:3784 +#: 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 msgctxt "person_name_sample" msgid "Doe" msgstr "" -#: pretix/base/settings.py:3571 pretix/base/settings.py:3587 -#: pretix/base/settings.py:3619 pretix/base/settings.py:3738 -#: pretix/base/settings.py:3760 +#: 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 msgctxt "person_name" msgid "Title" msgstr "" -#: pretix/base/settings.py:3579 pretix/base/settings.py:3595 -#: pretix/base/settings.py:3628 pretix/base/settings.py:3751 -#: pretix/base/settings.py:3782 +#: 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 msgctxt "person_name_sample" msgid "Dr" msgstr "" -#: pretix/base/settings.py:3603 pretix/base/settings.py:3620 +#: pretix/base/settings.py:3632 pretix/base/settings.py:3649 msgid "First name" msgstr "" -#: pretix/base/settings.py:3604 pretix/base/settings.py:3621 +#: pretix/base/settings.py:3633 pretix/base/settings.py:3650 msgid "Middle name" msgstr "" -#: pretix/base/settings.py:3685 pretix/base/settings.py:3697 +#: pretix/base/settings.py:3714 pretix/base/settings.py:3726 #: pretix/control/forms/organizer.py:658 msgctxt "person_name_sample" msgid "John Doe" msgstr "" -#: pretix/base/settings.py:3691 +#: pretix/base/settings.py:3720 msgid "Calling name" msgstr "" -#: pretix/base/settings.py:3705 +#: pretix/base/settings.py:3734 msgid "Latin transcription" msgstr "" -#: pretix/base/settings.py:3717 pretix/base/settings.py:3737 -#: pretix/base/settings.py:3759 +#: pretix/base/settings.py:3746 pretix/base/settings.py:3766 +#: pretix/base/settings.py:3788 msgctxt "person_name" msgid "Salutation" msgstr "" -#: pretix/base/settings.py:3729 pretix/base/settings.py:3750 -#: pretix/base/settings.py:3781 +#: pretix/base/settings.py:3758 pretix/base/settings.py:3779 +#: pretix/base/settings.py:3810 msgctxt "person_name_sample" msgid "Mr" msgstr "" -#: pretix/base/settings.py:3763 +#: pretix/base/settings.py:3792 msgctxt "person_name" msgid "Degree (after name)" msgstr "" -#: pretix/base/settings.py:3785 +#: pretix/base/settings.py:3814 msgctxt "person_name_sample" msgid "MA" msgstr "" -#: pretix/base/settings.py:3811 pretix/base/settings.py:3813 +#: pretix/base/settings.py:3840 pretix/base/settings.py:3842 msgctxt "address" msgid "Province" msgstr "" -#: pretix/base/settings.py:3812 +#: pretix/base/settings.py:3841 msgctxt "address" msgid "Prefecture" msgstr "" -#: pretix/base/settings.py:3901 pretix/control/forms/event.py:228 +#: pretix/base/settings.py:3930 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:3905 +#: pretix/base/settings.py:3934 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "" -#: pretix/base/settings.py:3909 +#: pretix/base/settings.py:3938 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" -#: pretix/base/settings.py:3913 +#: pretix/base/settings.py:3942 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "" -#: pretix/base/settings.py:3917 +#: pretix/base/settings.py:3946 msgid "You have to require invoice addresses to require for company names." msgstr "" -#: pretix/base/settings.py:3924 +#: pretix/base/settings.py:3953 msgid "The last payment date cannot be before the end of presale." msgstr "" -#: pretix/base/settings.py:3932 +#: pretix/base/settings.py:3961 #, python-brace-format msgid "The value \"{identifier}\" is not a valid sales channel." msgstr "" -#: pretix/base/settings.py:3947 +#: pretix/base/settings.py:3976 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -11427,6 +11485,21 @@ msgid "" "us." msgstr "" +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:2 +msgid "" +"You have requested us to cancel an event which includes a larger bulk-refund:" +msgstr "" + +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:6 +msgid "Estimated refund amount" +msgstr "" + +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:8 +msgid "" +"Please confirm that you want to proceed by coping the following confirmation " +"code into the cancellation form:" +msgstr "" + #: pretix/base/templates/pretixbase/email/email_footer.html:3 #, python-format msgid "powered by pretix" @@ -11476,12 +11549,10 @@ msgid "" msgstr "" #: pretix/base/templates/pretixbase/email/order_details.html:12 -#: pretix/base/templates/pretixbase/email/order_details.html:59 msgid "Event:" msgstr "" #: pretix/base/templates/pretixbase/email/order_details.html:23 -#: pretix/base/templates/pretixbase/email/order_details.html:80 msgid "Order code:" msgstr "" @@ -11490,18 +11561,36 @@ msgid "created by" msgstr "" #: pretix/base/templates/pretixbase/email/order_details.html:34 -#: pretix/base/templates/pretixbase/email/order_details.html:132 msgid "Contact:" msgstr "" #: pretix/base/templates/pretixbase/email/order_details.html:54 +#, python-format msgid "" -"You are receiving this email because you placed an order for the following " -"event:" +"You are receiving this email because you placed an order for " +"%(event)s." msgstr "" -#: pretix/base/templates/pretixbase/email/order_details.html:89 -msgid "Details:" +#: pretix/base/templates/pretixbase/email/order_details.html:93 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:23 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:320 +#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:15 +#: pretix/control/templates/pretixcontrol/organizers/customers.html:90 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:23 +#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:95 +#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:102 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 +#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 +#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 +#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:66 +msgid "Details" +msgstr "" + +#: pretix/base/templates/pretixbase/email/order_details.html:136 +#: pretix/presale/templates/pretixpresale/event/base.html:222 +#: pretix/presale/templates/pretixpresale/organizers/base.html:100 +msgid "Contact" msgstr "" #: pretix/base/templates/pretixbase/email/shred_completed.txt:2 @@ -12088,7 +12177,7 @@ msgid "Do not copy" msgstr "" #: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1301 -#: pretix/control/forms/subevents.py:410 +#: pretix/control/forms/subevents.py:411 #, python-brace-format msgid "Default ({value})" msgstr "" @@ -12166,318 +12255,318 @@ msgid "" "card is issued in." msgstr "" -#: pretix/control/forms/event.py:887 +#: pretix/control/forms/event.py:888 msgid "Generate invoices for Sales channels" msgstr "" -#: pretix/control/forms/event.py:890 +#: pretix/control/forms/event.py:891 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:894 +#: pretix/control/forms/event.py:895 msgid "Invoice style" msgstr "" -#: pretix/control/forms/event.py:900 +#: pretix/control/forms/event.py:901 msgid "Invoice language" msgstr "" -#: pretix/control/forms/event.py:901 pretix/control/forms/event.py:916 +#: pretix/control/forms/event.py:902 pretix/control/forms/event.py:917 msgid "The user's language" msgstr "" -#: pretix/control/forms/event.py:924 +#: pretix/control/forms/event.py:925 #, 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:928 +#: pretix/control/forms/event.py:929 msgid "" "None of the currently configured payment methods will cause an invoice to be " "issued before payment." msgstr "" -#: pretix/control/forms/event.py:937 +#: pretix/control/forms/event.py:938 msgid "Recommended" msgstr "" -#: pretix/control/forms/event.py:949 +#: pretix/control/forms/event.py:950 msgid "The online shop must be selected to receive these emails." msgstr "" -#: pretix/control/forms/event.py:965 +#: pretix/control/forms/event.py:966 msgid "Sales channels for checkout emails" msgstr "" -#: pretix/control/forms/event.py:966 +#: pretix/control/forms/event.py:967 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:977 +#: pretix/control/forms/event.py:978 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:985 pretix/control/forms/organizer.py:583 +#: pretix/control/forms/event.py:986 pretix/control/forms/organizer.py:583 msgid "Bcc address" msgstr "" -#: pretix/control/forms/event.py:987 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:988 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:995 pretix/control/forms/organizer.py:593 +#: pretix/control/forms/event.py:996 pretix/control/forms/organizer.py:593 msgid "Signature" msgstr "" -#: pretix/control/forms/event.py:998 +#: pretix/control/forms/event.py:999 #, python-brace-format msgid "This will be attached to every email. Available placeholders: {event}" msgstr "" -#: pretix/control/forms/event.py:1003 pretix/control/forms/organizer.py:601 +#: pretix/control/forms/event.py:1004 pretix/control/forms/organizer.py:601 msgid "e.g. your contact details" msgstr "" -#: pretix/control/forms/event.py:1008 +#: pretix/control/forms/event.py:1009 msgid "HTML mail renderer" msgstr "" -#: pretix/control/forms/event.py:1013 pretix/control/forms/event.py:1040 -#: pretix/control/forms/event.py:1067 pretix/control/forms/event.py:1217 +#: pretix/control/forms/event.py:1014 pretix/control/forms/event.py:1041 +#: pretix/control/forms/event.py:1068 pretix/control/forms/event.py:1218 msgid "Subject sent to order contact address" msgstr "" -#: pretix/control/forms/event.py:1018 pretix/control/forms/event.py:1045 -#: pretix/control/forms/event.py:1072 pretix/control/forms/event.py:1222 +#: pretix/control/forms/event.py:1019 pretix/control/forms/event.py:1046 +#: pretix/control/forms/event.py:1073 pretix/control/forms/event.py:1223 msgid "Text sent to order contact address" msgstr "" -#: pretix/control/forms/event.py:1023 pretix/control/forms/event.py:1050 -#: pretix/control/forms/event.py:1077 pretix/control/forms/event.py:1227 -#: pretix/control/forms/event.py:1272 pretix/control/forms/event.py:1302 -msgid "Send an email to attendees" -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 +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 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:1029 pretix/control/forms/event.py:1056 -#: pretix/control/forms/event.py:1083 pretix/control/forms/event.py:1233 -#: pretix/control/forms/event.py:1278 pretix/control/forms/event.py:1308 +#: 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 msgid "Subject sent to attendees" msgstr "" -#: pretix/control/forms/event.py:1034 pretix/control/forms/event.py:1061 -#: pretix/control/forms/event.py:1088 pretix/control/forms/event.py:1238 -#: pretix/control/forms/event.py:1283 pretix/control/forms/event.py:1313 +#: 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 msgid "Text sent to attendees" msgstr "" -#: pretix/control/forms/event.py:1099 pretix/control/forms/event.py:1173 -#: pretix/control/forms/event.py:1183 pretix/control/forms/event.py:1193 -#: pretix/control/forms/event.py:1198 pretix/control/forms/event.py:1210 +#: 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/organizer.py:612 pretix/control/forms/organizer.py:622 #: pretix/control/forms/organizer.py:632 #: pretix/control/templates/pretixcontrol/event/mail.html:88 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:111 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:119 msgid "Text" msgstr "" -#: pretix/control/forms/event.py:1104 +#: pretix/control/forms/event.py:1105 msgid "Subject (sent by admin)" msgstr "" -#: pretix/control/forms/event.py:1109 +#: pretix/control/forms/event.py:1110 msgid "Subject (sent by admin to attendee)" msgstr "" -#: pretix/control/forms/event.py:1114 +#: pretix/control/forms/event.py:1115 msgid "Text (sent by admin)" msgstr "" -#: pretix/control/forms/event.py:1119 +#: pretix/control/forms/event.py:1120 msgid "Subject (requested by user)" msgstr "" -#: pretix/control/forms/event.py:1124 +#: pretix/control/forms/event.py:1125 msgid "Text (requested by user)" msgstr "" -#: pretix/control/forms/event.py:1136 +#: pretix/control/forms/event.py:1137 msgid "Text (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1141 +#: pretix/control/forms/event.py:1142 msgid "Subject (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1146 +#: pretix/control/forms/event.py:1147 msgid "Text (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1151 +#: pretix/control/forms/event.py:1152 msgid "Subject (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1156 +#: pretix/control/forms/event.py:1157 msgid "Subject (if an incomplete payment was received)" msgstr "" -#: pretix/control/forms/event.py:1161 +#: pretix/control/forms/event.py:1162 msgid "Text (if an incomplete payment was received)" msgstr "" -#: pretix/control/forms/event.py:1164 +#: pretix/control/forms/event.py:1165 msgid "" "This email only applies to payment methods that can receive incomplete " "payments, such as bank transfer." msgstr "" -#: pretix/control/forms/event.py:1206 pretix/control/forms/event.py:1213 +#: pretix/control/forms/event.py:1207 pretix/control/forms/event.py:1214 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:1246 +#: pretix/control/forms/event.py:1247 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:1250 +#: pretix/control/forms/event.py:1251 msgid "Subject for received order" msgstr "" -#: pretix/control/forms/event.py:1255 +#: pretix/control/forms/event.py:1256 msgid "Text for received order" msgstr "" -#: pretix/control/forms/event.py:1260 +#: pretix/control/forms/event.py:1261 msgid "Subject for approved order" msgstr "" -#: pretix/control/forms/event.py:1265 +#: pretix/control/forms/event.py:1266 msgid "Text for approved order" msgstr "" -#: pretix/control/forms/event.py:1268 pretix/control/forms/event.py:1286 +#: pretix/control/forms/event.py:1269 pretix/control/forms/event.py:1287 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:1290 +#: pretix/control/forms/event.py:1291 msgid "Subject for approved free order" msgstr "" -#: pretix/control/forms/event.py:1295 +#: pretix/control/forms/event.py:1296 msgid "Text for approved free order" msgstr "" -#: pretix/control/forms/event.py:1298 pretix/control/forms/event.py:1316 +#: pretix/control/forms/event.py:1299 pretix/control/forms/event.py:1317 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:1320 +#: pretix/control/forms/event.py:1321 msgid "Subject for denied order" msgstr "" -#: pretix/control/forms/event.py:1325 +#: pretix/control/forms/event.py:1326 msgid "Text for denied order" msgstr "" -#: pretix/control/forms/event.py:1420 +#: pretix/control/forms/event.py:1421 msgid "Ticket code generator" msgstr "" -#: pretix/control/forms/event.py:1421 +#: pretix/control/forms/event.py:1422 msgid "For advanced users, usually does not need to be changed." msgstr "" -#: pretix/control/forms/event.py:1478 +#: pretix/control/forms/event.py:1479 msgid "Any country" msgstr "" -#: pretix/control/forms/event.py:1479 +#: pretix/control/forms/event.py:1480 msgid "European Union" msgstr "" -#: pretix/control/forms/event.py:1505 +#: pretix/control/forms/event.py:1506 msgid "Any customer" msgstr "" -#: pretix/control/forms/event.py:1506 +#: pretix/control/forms/event.py:1507 msgid "Individual" msgstr "" -#: pretix/control/forms/event.py:1507 +#: pretix/control/forms/event.py:1508 msgid "Business" msgstr "" -#: pretix/control/forms/event.py:1508 +#: pretix/control/forms/event.py:1509 msgid "Business with valid VAT ID" msgstr "" -#: pretix/control/forms/event.py:1514 +#: pretix/control/forms/event.py:1515 msgid "Charge VAT" msgstr "" -#: pretix/control/forms/event.py:1516 +#: pretix/control/forms/event.py:1517 msgid "No VAT" msgstr "" -#: pretix/control/forms/event.py:1517 +#: pretix/control/forms/event.py:1518 msgid "Sale not allowed" msgstr "" -#: pretix/control/forms/event.py:1518 +#: pretix/control/forms/event.py:1519 msgid "Order requires approval" msgstr "" -#: pretix/control/forms/event.py:1523 +#: pretix/control/forms/event.py:1524 msgid "Default tax code" msgstr "" -#: pretix/control/forms/event.py:1527 +#: pretix/control/forms/event.py:1528 msgid "Deviating tax rate" msgstr "" -#: pretix/control/forms/event.py:1532 pretix/control/forms/event.py:1536 +#: pretix/control/forms/event.py:1533 pretix/control/forms/event.py:1537 msgid "Text on invoice" msgstr "" -#: pretix/control/forms/event.py:1556 +#: pretix/control/forms/event.py:1557 msgid "" "A combination of this calculation mode with a non-zero tax rate does not " "make sense." msgstr "" -#: pretix/control/forms/event.py:1561 pretix/control/forms/event.py:1565 +#: pretix/control/forms/event.py:1562 pretix/control/forms/event.py:1566 msgid "This combination of calculation mode and tax code does not make sense." msgstr "" -#: pretix/control/forms/event.py:1630 +#: pretix/control/forms/event.py:1631 msgid "Pre-selected voucher" msgstr "" -#: pretix/control/forms/event.py:1632 +#: pretix/control/forms/event.py:1633 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 " @@ -12485,48 +12574,48 @@ msgid "" "secret products." msgstr "" -#: pretix/control/forms/event.py:1637 +#: pretix/control/forms/event.py:1638 msgid "Compatibility mode" msgstr "" -#: pretix/control/forms/event.py:1639 +#: pretix/control/forms/event.py:1640 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:1660 +#: pretix/control/forms/event.py:1661 msgid "The given voucher code does not exist." msgstr "" -#: pretix/control/forms/event.py:1667 pretix/control/forms/organizer.py:112 +#: pretix/control/forms/event.py:1668 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:1702 +#: pretix/control/forms/event.py:1703 msgid "Ticket downloads" msgstr "" -#: pretix/control/forms/event.py:1703 +#: pretix/control/forms/event.py:1704 msgid "Your customers will be able to download their tickets in PDF format." msgstr "" -#: pretix/control/forms/event.py:1707 +#: pretix/control/forms/event.py:1708 msgid "Require all attendees to fill in their names" msgstr "" -#: pretix/control/forms/event.py:1708 +#: pretix/control/forms/event.py:1709 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:1734 +#: pretix/control/forms/event.py:1735 msgid "Payment via Stripe" msgstr "" -#: pretix/control/forms/event.py:1735 +#: pretix/control/forms/event.py:1736 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 " @@ -12534,27 +12623,27 @@ msgid "" "simple interface." msgstr "" -#: pretix/control/forms/event.py:1741 +#: pretix/control/forms/event.py:1742 msgid "Payment by bank transfer" msgstr "" -#: pretix/control/forms/event.py:1742 +#: pretix/control/forms/event.py:1743 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:1781 +#: pretix/control/forms/event.py:1782 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:45 msgid "Price (optional)" msgstr "" -#: pretix/control/forms/event.py:1786 +#: pretix/control/forms/event.py:1787 msgid "Free" msgstr "" -#: pretix/control/forms/event.py:1791 +#: pretix/control/forms/event.py:1792 msgid "Quantity available" msgstr "" @@ -12828,7 +12917,7 @@ msgid "Search query" msgstr "" #: pretix/control/forms/filter.py:1528 pretix/control/forms/filter.py:1600 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:46 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:54 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:126 @@ -12838,12 +12927,12 @@ msgid "active" msgstr "" #: pretix/control/forms/filter.py:1530 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:44 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:45 msgid "not yet activated" msgstr "" #: pretix/control/forms/filter.py:1534 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:110 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:111 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:6 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:12 #: pretix/presale/views/customer.py:366 @@ -12896,7 +12985,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/checkin/index.html:183 #: pretix/control/templates/pretixcontrol/checkin/lists.html:103 #: pretix/plugins/checkinlists/exporters.py:109 -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 msgid "Checked in" msgstr "" @@ -12938,6 +13027,7 @@ msgid "No administrator" msgstr "" #: pretix/control/forms/filter.py:2117 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51 msgid "Valid" msgstr "" @@ -12992,15 +13082,15 @@ msgstr "" msgid "All refunds" msgstr "" -#: pretix/control/forms/filter.py:2353 pretix/plugins/reports/exporters.py:699 +#: pretix/control/forms/filter.py:2353 pretix/plugins/reports/exporters.py:700 msgid "Date filter" msgstr "" -#: pretix/control/forms/filter.py:2355 pretix/plugins/reports/exporters.py:701 +#: pretix/control/forms/filter.py:2355 pretix/plugins/reports/exporters.py:702 msgid "Filter by…" msgstr "" -#: pretix/control/forms/filter.py:2357 pretix/plugins/reports/exporters.py:703 +#: pretix/control/forms/filter.py:2357 pretix/plugins/reports/exporters.py:704 msgid "Date of last successful payment" msgstr "" @@ -13018,7 +13108,7 @@ msgstr "" #: pretix/control/forms/filter.py:2404 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/plugins/checkinlists/exporters.py:756 +#: pretix/plugins/checkinlists/exporters.py:759 msgid "Scan type" msgstr "" @@ -13028,7 +13118,7 @@ msgstr "" #: pretix/control/forms/filter.py:2415 pretix/control/forms/filter.py:2455 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 -#: pretix/plugins/checkinlists/exporters.py:762 +#: pretix/plugins/checkinlists/exporters.py:765 msgid "Device" msgstr "" @@ -13048,7 +13138,7 @@ msgid "End date" msgstr "" #: pretix/control/forms/filter.py:2478 -#: pretix/plugins/checkinlists/exporters.py:880 +#: pretix/plugins/checkinlists/exporters.py:883 msgid "All check-in lists" msgstr "" @@ -13062,8 +13152,8 @@ msgstr "" #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/plugins/checkinlists/exporters.py:154 #: pretix/plugins/checkinlists/exporters.py:475 -#: pretix/plugins/checkinlists/exporters.py:755 -#: pretix/plugins/checkinlists/exporters.py:843 +#: pretix/plugins/checkinlists/exporters.py:758 +#: pretix/plugins/checkinlists/exporters.py:846 msgid "Check-in list" msgstr "" @@ -13580,45 +13670,49 @@ msgstr "" msgid "pretix field" msgstr "" -#: pretix/control/forms/modelimport.py:50 +#: pretix/control/forms/modelimport.py:52 #, python-brace-format msgid "CSV column: \"{name}\"" msgstr "" -#: pretix/control/forms/modelimport.py:76 +#: pretix/control/forms/modelimport.py:81 msgid "Import mode" msgstr "" -#: pretix/control/forms/modelimport.py:78 +#: pretix/control/forms/modelimport.py:83 msgid "Create a separate order for each line" msgstr "" -#: pretix/control/forms/modelimport.py:79 +#: pretix/control/forms/modelimport.py:84 msgid "Create one order with one position per line" msgstr "" -#: pretix/control/forms/modelimport.py:80 +#: pretix/control/forms/modelimport.py:85 msgid "" "Group multiple lines together into the same order based on a grouping column" msgstr "" -#: pretix/control/forms/modelimport.py:87 +#: pretix/control/forms/modelimport.py:92 msgid "Create orders as fully paid" msgstr "" -#: pretix/control/forms/modelimport.py:88 +#: pretix/control/forms/modelimport.py:93 msgid "Create orders as pending and still require payment" msgstr "" -#: pretix/control/forms/modelimport.py:93 +#: pretix/control/forms/modelimport.py:98 msgid "Create orders as test mode orders" msgstr "" -#: pretix/control/forms/modelimport.py:112 +#: pretix/control/forms/modelimport.py:102 +msgid "Orders not created in test mode cannot be deleted again after import." +msgstr "" + +#: pretix/control/forms/modelimport.py:123 msgid "A grouping cannot be specified for this import mode." msgstr "" -#: pretix/control/forms/modelimport.py:114 +#: pretix/control/forms/modelimport.py:125 msgid "A grouping needs to be specified for this import mode." msgstr "" @@ -13718,8 +13812,8 @@ msgstr "" #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:24 #: pretix/plugins/reports/exporters.py:510 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:692 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:693 +#: pretix/plugins/reports/exporters.py:898 msgid "Payment date" msgstr "" @@ -14042,6 +14136,24 @@ msgstr "" msgid "Please confirm that you want to cancel ALL dates in this event series." msgstr "" +#: pretix/control/forms/orders.py:1037 +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" +msgstr "" + +#: pretix/control/forms/orders.py:1055 +msgid "The confirmation code is incorrect." +msgstr "" + #: pretix/control/forms/organizer.py:93 msgid "This slug is already in use. Please choose a different one." msgstr "" @@ -14106,63 +14218,63 @@ msgstr "" msgid "Gift card value" msgstr "" -#: pretix/control/forms/organizer.py:794 +#: pretix/control/forms/organizer.py:826 msgid "An medium with this type and identifier is already registered." msgstr "" -#: pretix/control/forms/organizer.py:892 +#: pretix/control/forms/organizer.py:924 msgid "An account with this customer ID is already registered." msgstr "" -#: pretix/control/forms/organizer.py:909 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:61 +#: pretix/control/forms/organizer.py:941 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:62 #: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:493 msgid "Phone" msgstr "" -#: pretix/control/forms/organizer.py:1016 +#: pretix/control/forms/organizer.py:1048 msgctxt "sso_oidc" msgid "Base URL" msgstr "" -#: pretix/control/forms/organizer.py:1020 +#: pretix/control/forms/organizer.py:1052 msgctxt "sso_oidc" msgid "Client ID" msgstr "" -#: pretix/control/forms/organizer.py:1024 +#: pretix/control/forms/organizer.py:1056 msgctxt "sso_oidc" msgid "Client secret" msgstr "" -#: pretix/control/forms/organizer.py:1028 +#: pretix/control/forms/organizer.py:1060 msgctxt "sso_oidc" msgid "Scope" msgstr "" -#: pretix/control/forms/organizer.py:1029 +#: pretix/control/forms/organizer.py:1061 msgctxt "sso_oidc" msgid "Multiple scopes separated with spaces." msgstr "" -#: pretix/control/forms/organizer.py:1033 +#: pretix/control/forms/organizer.py:1065 msgctxt "sso_oidc" msgid "User ID field" msgstr "" -#: pretix/control/forms/organizer.py:1034 +#: pretix/control/forms/organizer.py:1066 msgctxt "sso_oidc" msgid "" "We will assume that the contents of the user ID fields are unique and can " "never change for a user." msgstr "" -#: pretix/control/forms/organizer.py:1040 +#: pretix/control/forms/organizer.py:1072 msgctxt "sso_oidc" msgid "Email field" msgstr "" -#: pretix/control/forms/organizer.py:1041 +#: pretix/control/forms/organizer.py:1073 msgctxt "sso_oidc" msgid "" "We will assume that all email addresses received from the SSO provider are " @@ -14170,17 +14282,17 @@ msgid "" "security issues might arise." msgstr "" -#: pretix/control/forms/organizer.py:1048 +#: pretix/control/forms/organizer.py:1080 msgctxt "sso_oidc" msgid "Phone field" msgstr "" -#: pretix/control/forms/organizer.py:1052 +#: pretix/control/forms/organizer.py:1084 msgctxt "sso_oidc" msgid "Query parameters" msgstr "" -#: pretix/control/forms/organizer.py:1053 +#: pretix/control/forms/organizer.py:1085 #, python-brace-format msgctxt "sso_oidc" msgid "" @@ -14188,19 +14300,19 @@ msgid "" "endpoint. Enter as: {example}" msgstr "" -#: pretix/control/forms/organizer.py:1114 +#: pretix/control/forms/organizer.py:1146 msgid "Invalidate old client secret and generate a new one" msgstr "" -#: pretix/control/forms/organizer.py:1147 +#: pretix/control/forms/organizer.py:1179 msgid "Organizer short name" msgstr "" -#: pretix/control/forms/organizer.py:1151 +#: pretix/control/forms/organizer.py:1183 msgid "Allow access to reusable media" msgstr "" -#: pretix/control/forms/organizer.py:1152 +#: pretix/control/forms/organizer.py:1184 msgid "" "This is required if you want the other organizer to participate in a shared " "system with e.g. NFC payment chips. You should only use this option for " @@ -14209,19 +14321,19 @@ msgid "" "to interact with the media type." msgstr "" -#: pretix/control/forms/organizer.py:1168 +#: pretix/control/forms/organizer.py:1200 msgid "The selected organizer does not exist or cannot be invited." msgstr "" -#: pretix/control/forms/organizer.py:1170 +#: pretix/control/forms/organizer.py:1202 msgid "The selected organizer has already been invited." msgstr "" -#: pretix/control/forms/organizer.py:1205 +#: pretix/control/forms/organizer.py:1237 msgid "A sales channel with the same identifier already exists." msgstr "" -#: pretix/control/forms/organizer.py:1217 +#: pretix/control/forms/organizer.py:1249 msgid "Events with active plugin" msgstr "" @@ -14313,7 +14425,7 @@ msgstr "" msgid "Available_until" msgstr "" -#: pretix/control/forms/subevents.py:469 +#: pretix/control/forms/subevents.py:470 msgid "Exclude these dates instead of adding them." msgstr "" @@ -14653,7 +14765,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:970 pretix/control/logdisplay.py:972 +#: pretix/control/logdisplay.py:971 pretix/control/logdisplay.py:973 msgid "(unknown)" msgstr "" @@ -14703,8 +14815,8 @@ msgstr "" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "" -#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1565 -#: pretix/presale/views/order.py:1049 +#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1567 +#: pretix/presale/views/order.py:1072 msgid "The order has been canceled." msgstr "" @@ -14742,11 +14854,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:820 +#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:821 msgid "The settings of a payment provider have been changed." msgstr "" -#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:819 +#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:820 msgid "The settings of a ticket output provider have been changed." msgstr "" @@ -14787,11 +14899,11 @@ msgstr "" msgid "The order has been set to require payment before use." msgstr "" -#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1570 +#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1572 msgid "The order has been marked as expired." msgstr "" -#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1469 +#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1471 msgid "The order has been marked as paid." msgstr "" @@ -14803,7 +14915,7 @@ msgstr "" msgid "The order has been refunded." msgstr "" -#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1886 +#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1888 msgid "The order has been reactivated." msgstr "" @@ -14815,7 +14927,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:790 +#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:791 msgid "The order has been approved." msgstr "" @@ -14850,957 +14962,961 @@ msgstr "" msgid "The order locale has been changed." msgstr "" -#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1609 -#: pretix/presale/views/order.py:741 pretix/presale/views/order.py:814 +#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1611 +#: pretix/presale/views/order.py:745 pretix/presale/views/order.py:825 msgid "The invoice has been generated." msgstr "" -#: pretix/control/logdisplay.py:525 pretix/control/views/orders.py:1682 +#: pretix/control/logdisplay.py:525 +msgid "The invoice could not be generated." +msgstr "" + +#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1684 msgid "The invoice has been regenerated." msgstr "" -#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1744 -#: pretix/presale/views/order.py:827 +#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1746 +#: pretix/presale/views/order.py:845 msgid "The invoice has been reissued." msgstr "" -#: pretix/control/logdisplay.py:527 -#, python-brace-format -msgid "The invoice {full_invoice_no} has been sent." -msgstr "" - #: pretix/control/logdisplay.py:528 #, python-brace-format -msgid "The transmission of invoice {full_invoice_no} has failed." +msgid "The invoice {full_invoice_no} has been sent." msgstr "" #: pretix/control/logdisplay.py:529 #, python-brace-format +msgid "The transmission of invoice {full_invoice_no} has failed." +msgstr "" + +#: pretix/control/logdisplay.py:530 +#, python-brace-format msgid "" "Invoice {full_invoice_no} has not been transmitted because the transmission " "provider does not support test mode invoices." msgstr "" -#: pretix/control/logdisplay.py:531 +#: pretix/control/logdisplay.py:532 #, python-brace-format msgid "The invoice {full_invoice_no} has been scheduled for retransmission." msgstr "" -#: pretix/control/logdisplay.py:532 +#: pretix/control/logdisplay.py:533 msgid "The order's internal comment has been updated." msgstr "" -#: pretix/control/logdisplay.py:533 +#: pretix/control/logdisplay.py:534 msgid "The order's follow-up date has been updated." msgstr "" -#: pretix/control/logdisplay.py:534 +#: pretix/control/logdisplay.py:535 msgid "The order's flag to require attention at check-in has been toggled." msgstr "" -#: pretix/control/logdisplay.py:536 +#: pretix/control/logdisplay.py:537 msgid "The order's check-in text has been changed." msgstr "" -#: pretix/control/logdisplay.py:537 +#: pretix/control/logdisplay.py:538 msgid "" "The order's flag to be considered valid even if unpaid has been toggled." msgstr "" -#: pretix/control/logdisplay.py:539 +#: pretix/control/logdisplay.py:540 #, python-brace-format msgid "A new payment {local_id} has been started instead of the previous one." msgstr "" -#: pretix/control/logdisplay.py:540 +#: pretix/control/logdisplay.py:541 msgid "An unidentified type email has been sent." msgstr "" -#: pretix/control/logdisplay.py:541 pretix/control/logdisplay.py:722 -#: pretix/control/logdisplay.py:728 pretix/control/logdisplay.py:756 +#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:723 +#: pretix/control/logdisplay.py:729 pretix/control/logdisplay.py:757 msgid "Sending of an email has failed." msgstr "" -#: pretix/control/logdisplay.py:542 +#: pretix/control/logdisplay.py:543 msgid "" "The email has been sent without attached tickets since they would have been " "too large to be likely to arrive." msgstr "" -#: pretix/control/logdisplay.py:544 +#: pretix/control/logdisplay.py:545 msgid "An invoice email has been sent." msgstr "" -#: pretix/control/logdisplay.py:545 +#: pretix/control/logdisplay.py:546 msgid "A custom email has been sent." msgstr "" -#: pretix/control/logdisplay.py:546 +#: pretix/control/logdisplay.py:547 msgid "A custom email has been sent to an attendee." msgstr "" -#: pretix/control/logdisplay.py:547 +#: pretix/control/logdisplay.py:548 msgid "" "An email has been sent with a reminder that the ticket is available for " "download." msgstr "" -#: pretix/control/logdisplay.py:549 +#: pretix/control/logdisplay.py:550 msgid "" "An email has been sent with a warning that the order is about to expire." msgstr "" -#: pretix/control/logdisplay.py:552 +#: pretix/control/logdisplay.py:553 msgid "" "An email has been sent to notify the user that the order has been canceled." msgstr "" -#: pretix/control/logdisplay.py:553 +#: pretix/control/logdisplay.py:554 msgid "" "An email has been sent to notify the user that the event has been canceled." msgstr "" -#: pretix/control/logdisplay.py:556 +#: pretix/control/logdisplay.py:557 msgid "" "An email has been sent to notify the user that the order has been changed." msgstr "" -#: pretix/control/logdisplay.py:558 +#: pretix/control/logdisplay.py:559 msgid "" "An email has been sent to notify the user that the order has been received." msgstr "" -#: pretix/control/logdisplay.py:560 +#: pretix/control/logdisplay.py:561 msgid "" "An email has been sent to notify the user that payment has been received." msgstr "" -#: pretix/control/logdisplay.py:562 +#: pretix/control/logdisplay.py:563 msgid "" "An email has been sent to notify the user that the order has been denied." msgstr "" -#: pretix/control/logdisplay.py:563 +#: pretix/control/logdisplay.py:564 msgid "" "An email has been sent to notify the user that the order has been approved." msgstr "" -#: pretix/control/logdisplay.py:566 -msgid "" -"An email has been sent to notify the user that the order has been received " -"and requires payment." -msgstr "" - #: pretix/control/logdisplay.py:567 msgid "" "An email has been sent to notify the user that the order has been received " +"and requires payment." +msgstr "" + +#: pretix/control/logdisplay.py:568 +msgid "" +"An email has been sent to notify the user that the order has been received " "and requires approval." msgstr "" -#: pretix/control/logdisplay.py:570 +#: pretix/control/logdisplay.py:571 msgid "" "An email with a link to the order detail page has been resent to the user." msgstr "" -#: pretix/control/logdisplay.py:571 +#: pretix/control/logdisplay.py:572 msgid "An email has been sent to notify the user that the payment failed." msgstr "" -#: pretix/control/logdisplay.py:578 +#: pretix/control/logdisplay.py:579 msgid "The voucher has been created." msgstr "" -#: pretix/control/logdisplay.py:581 +#: pretix/control/logdisplay.py:582 msgid "" "The voucher has been set to expire because the recipient removed themselves " "from the waiting list." msgstr "" -#: pretix/control/logdisplay.py:582 +#: pretix/control/logdisplay.py:583 msgid "The voucher has been changed." msgstr "" -#: pretix/control/logdisplay.py:583 +#: pretix/control/logdisplay.py:584 msgid "The voucher has been deleted." msgstr "" -#: pretix/control/logdisplay.py:584 +#: pretix/control/logdisplay.py:585 #, python-brace-format msgid "The voucher has been assigned to {email} through the waiting list." msgstr "" -#: pretix/control/logdisplay.py:593 +#: pretix/control/logdisplay.py:594 #, python-brace-format msgid "The voucher has been redeemed in order {order_code}." msgstr "" -#: pretix/control/logdisplay.py:608 +#: pretix/control/logdisplay.py:609 msgid "The category has been added." msgstr "" -#: pretix/control/logdisplay.py:609 +#: pretix/control/logdisplay.py:610 msgid "The category has been deleted." msgstr "" -#: pretix/control/logdisplay.py:610 +#: pretix/control/logdisplay.py:611 msgid "The category has been changed." msgstr "" -#: pretix/control/logdisplay.py:611 +#: pretix/control/logdisplay.py:612 msgid "The category has been reordered." msgstr "" -#: pretix/control/logdisplay.py:618 +#: pretix/control/logdisplay.py:619 msgid "The tax rule has been added." msgstr "" -#: pretix/control/logdisplay.py:619 +#: pretix/control/logdisplay.py:620 msgid "The tax rule has been deleted." msgstr "" -#: pretix/control/logdisplay.py:620 +#: pretix/control/logdisplay.py:621 msgid "The tax rule has been changed." msgstr "" -#: pretix/control/logdisplay.py:632 -#, python-brace-format -msgid "{user} has been added to the team." -msgstr "" - #: pretix/control/logdisplay.py:633 #, python-brace-format -msgid "{user} has been removed from the team." +msgid "{user} has been added to the team." msgstr "" #: pretix/control/logdisplay.py:634 #, python-brace-format -msgid "{user} has been invited to the team." +msgid "{user} has been removed from the team." msgstr "" #: pretix/control/logdisplay.py:635 #, python-brace-format +msgid "{user} has been invited to the team." +msgstr "" + +#: pretix/control/logdisplay.py:636 +#, python-brace-format msgid "Invite for {user} has been resent." msgstr "" -#: pretix/control/logdisplay.py:646 +#: pretix/control/logdisplay.py:647 #, python-brace-format msgid "{user} has joined the team using the invite sent to {email}." msgstr "" -#: pretix/control/logdisplay.py:656 +#: pretix/control/logdisplay.py:657 msgid "Your account settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:659 pretix/control/views/user.py:253 +#: pretix/control/logdisplay.py:660 pretix/control/views/user.py:253 #, python-brace-format msgid "Your email address has been changed to {email}." msgstr "" -#: pretix/control/logdisplay.py:661 pretix/control/views/user.py:250 +#: pretix/control/logdisplay.py:662 pretix/control/views/user.py:250 msgid "Your password has been changed." msgstr "" -#: pretix/control/logdisplay.py:663 +#: pretix/control/logdisplay.py:664 msgid "Your account has been enabled." msgstr "" -#: pretix/control/logdisplay.py:665 +#: pretix/control/logdisplay.py:666 msgid "Your account has been disabled." msgstr "" -#: pretix/control/logdisplay.py:675 -#, python-brace-format -msgid "You impersonated {}." -msgstr "" - #: pretix/control/logdisplay.py:676 #, python-brace-format +msgid "You impersonated {}." +msgstr "" + +#: pretix/control/logdisplay.py:677 +#, python-brace-format msgid "You stopped impersonating {}." msgstr "" -#: pretix/control/logdisplay.py:683 +#: pretix/control/logdisplay.py:684 msgid "This object has been created by cloning." msgstr "" -#: pretix/control/logdisplay.py:684 +#: pretix/control/logdisplay.py:685 msgid "The organizer has been changed." msgstr "" -#: pretix/control/logdisplay.py:685 +#: pretix/control/logdisplay.py:686 msgid "The organizer settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:686 pretix/control/logdisplay.py:827 +#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:828 msgid "The footer links have been changed." msgstr "" -#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:734 +#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 msgid "A scheduled export has been added." msgstr "" -#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 +#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 msgid "A scheduled export has been changed." msgstr "" -#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 +#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 msgid "A scheduled export has been deleted." msgstr "" -#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 +#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 msgid "A scheduled export has been executed." msgstr "" -#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 +#: pretix/control/logdisplay.py:692 pretix/control/logdisplay.py:739 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" -#: pretix/control/logdisplay.py:692 +#: pretix/control/logdisplay.py:693 msgid "Gift card acceptance for another organizer has been added." msgstr "" -#: pretix/control/logdisplay.py:693 +#: pretix/control/logdisplay.py:694 msgid "Gift card acceptance for another organizer has been removed." msgstr "" -#: pretix/control/logdisplay.py:694 +#: pretix/control/logdisplay.py:695 msgid "A new gift card acceptor has been invited." msgstr "" -#: pretix/control/logdisplay.py:695 +#: pretix/control/logdisplay.py:696 msgid "A gift card acceptor has been removed." msgstr "" -#: pretix/control/logdisplay.py:696 +#: pretix/control/logdisplay.py:697 msgid "A gift card issuer has been removed or declined." msgstr "" -#: pretix/control/logdisplay.py:697 +#: pretix/control/logdisplay.py:698 msgid "A new gift card issuer has been accepted." msgstr "" -#: pretix/control/logdisplay.py:698 +#: pretix/control/logdisplay.py:699 msgid "The webhook has been created." msgstr "" -#: pretix/control/logdisplay.py:699 +#: pretix/control/logdisplay.py:700 msgid "The webhook has been changed." msgstr "" -#: pretix/control/logdisplay.py:700 +#: pretix/control/logdisplay.py:701 msgid "The webhook call retry jobs have been manually expedited." msgstr "" -#: pretix/control/logdisplay.py:701 +#: pretix/control/logdisplay.py:702 msgid "The webhook call retry jobs have been dropped." msgstr "" -#: pretix/control/logdisplay.py:702 +#: pretix/control/logdisplay.py:703 msgid "The SSO provider has been created." msgstr "" -#: pretix/control/logdisplay.py:703 +#: pretix/control/logdisplay.py:704 msgid "The SSO provider has been changed." msgstr "" -#: pretix/control/logdisplay.py:704 +#: pretix/control/logdisplay.py:705 msgid "The SSO provider has been deleted." msgstr "" -#: pretix/control/logdisplay.py:705 +#: pretix/control/logdisplay.py:706 msgid "The SSO client has been created." msgstr "" -#: pretix/control/logdisplay.py:706 +#: pretix/control/logdisplay.py:707 msgid "The SSO client has been changed." msgstr "" -#: pretix/control/logdisplay.py:707 +#: pretix/control/logdisplay.py:708 msgid "The SSO client has been deleted." msgstr "" -#: pretix/control/logdisplay.py:708 pretix/control/views/organizer.py:2632 +#: pretix/control/logdisplay.py:709 pretix/control/views/organizer.py:2632 msgid "The membership type has been created." msgstr "" -#: pretix/control/logdisplay.py:709 +#: pretix/control/logdisplay.py:710 msgid "The membership type has been changed." msgstr "" -#: pretix/control/logdisplay.py:710 +#: pretix/control/logdisplay.py:711 msgid "The membership type has been deleted." msgstr "" -#: pretix/control/logdisplay.py:711 pretix/control/views/organizer.py:3470 +#: pretix/control/logdisplay.py:712 pretix/control/views/organizer.py:3472 msgid "The sales channel has been created." msgstr "" -#: pretix/control/logdisplay.py:712 +#: pretix/control/logdisplay.py:713 msgid "The sales channel has been changed." msgstr "" -#: pretix/control/logdisplay.py:713 +#: pretix/control/logdisplay.py:714 msgid "The sales channel has been deleted." msgstr "" -#: pretix/control/logdisplay.py:714 +#: pretix/control/logdisplay.py:715 msgid "The account has been created." msgstr "" -#: pretix/control/logdisplay.py:715 +#: pretix/control/logdisplay.py:716 msgid "The account has been changed." msgstr "" -#: pretix/control/logdisplay.py:716 +#: pretix/control/logdisplay.py:717 msgid "A membership for this account has been added." msgstr "" -#: pretix/control/logdisplay.py:717 +#: pretix/control/logdisplay.py:718 msgid "A membership of this account has been changed." msgstr "" -#: pretix/control/logdisplay.py:718 +#: pretix/control/logdisplay.py:719 msgid "A membership of this account has been deleted." msgstr "" -#: pretix/control/logdisplay.py:719 +#: pretix/control/logdisplay.py:720 msgid "The account has been disabled and anonymized." msgstr "" -#: pretix/control/logdisplay.py:720 +#: pretix/control/logdisplay.py:721 msgid "A new password has been requested." msgstr "" -#: pretix/control/logdisplay.py:721 +#: pretix/control/logdisplay.py:722 msgid "A new password has been set." msgstr "" -#: pretix/control/logdisplay.py:723 +#: pretix/control/logdisplay.py:724 msgid "The reusable medium has been created." msgstr "" -#: pretix/control/logdisplay.py:724 +#: pretix/control/logdisplay.py:725 msgid "The reusable medium has been created automatically." msgstr "" -#: pretix/control/logdisplay.py:725 +#: pretix/control/logdisplay.py:726 msgid "The reusable medium has been changed." msgstr "" -#: pretix/control/logdisplay.py:726 +#: pretix/control/logdisplay.py:727 msgid "The medium has been connected to a new ticket." msgstr "" -#: pretix/control/logdisplay.py:727 +#: pretix/control/logdisplay.py:728 msgid "The medium has been connected to a new gift card." msgstr "" -#: pretix/control/logdisplay.py:729 +#: pretix/control/logdisplay.py:730 msgid "The event's internal comment has been updated." msgstr "" -#: pretix/control/logdisplay.py:730 +#: pretix/control/logdisplay.py:731 msgid "The event has been canceled." msgstr "" -#: pretix/control/logdisplay.py:731 +#: pretix/control/logdisplay.py:732 msgid "An event has been deleted." msgstr "" -#: pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:733 msgid "A removal process for personal data has been started." msgstr "" -#: pretix/control/logdisplay.py:733 +#: pretix/control/logdisplay.py:734 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:739 +#: pretix/control/logdisplay.py:740 msgid "The user has been created." msgstr "" -#: pretix/control/logdisplay.py:740 +#: pretix/control/logdisplay.py:741 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:742 pretix/control/views/user.py:490 +#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:490 #: pretix/control/views/user.py:550 pretix/control/views/user.py:609 msgid "Two-factor authentication has been enabled." msgstr "" -#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:393 +#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:393 #: pretix/control/views/user.py:625 msgid "Two-factor authentication has been disabled." msgstr "" -#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:642 +#: pretix/control/logdisplay.py:745 pretix/control/views/user.py:642 msgid "Your two-factor emergency codes have been regenerated." msgstr "" -#: pretix/control/logdisplay.py:745 +#: pretix/control/logdisplay.py:746 msgid "A two-factor emergency code has been generated." msgstr "" -#: pretix/control/logdisplay.py:746 +#: pretix/control/logdisplay.py:747 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "" -#: pretix/control/logdisplay.py:748 +#: pretix/control/logdisplay.py:749 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "" -#: pretix/control/logdisplay.py:750 +#: pretix/control/logdisplay.py:751 msgid "Notifications have been enabled." msgstr "" -#: pretix/control/logdisplay.py:751 +#: pretix/control/logdisplay.py:752 msgid "Notifications have been disabled." msgstr "" -#: pretix/control/logdisplay.py:752 +#: pretix/control/logdisplay.py:753 msgid "Your notification settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:753 +#: pretix/control/logdisplay.py:754 msgid "This user has been anonymized." msgstr "" -#: pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:758 msgid "Password reset mail sent." msgstr "" -#: pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:759 msgid "The password has been reset." msgstr "" -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:760 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:761 +#: pretix/control/logdisplay.py:762 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:762 pretix/control/logdisplay.py:988 +#: pretix/control/logdisplay.py:763 pretix/control/logdisplay.py:989 msgid "A voucher has been sent to a person on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:763 +#: pretix/control/logdisplay.py:764 msgid "An entry has been transferred to another waiting list." msgstr "" -#: pretix/control/logdisplay.py:764 +#: pretix/control/logdisplay.py:765 msgid "The team has been created." msgstr "" -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:766 msgid "The team settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:767 msgid "The team has been deleted." msgstr "" -#: pretix/control/logdisplay.py:767 pretix/control/views/organizer.py:2298 +#: pretix/control/logdisplay.py:768 pretix/control/views/organizer.py:2298 msgid "The gate has been created." msgstr "" -#: pretix/control/logdisplay.py:768 +#: pretix/control/logdisplay.py:769 msgid "The gate has been changed." msgstr "" -#: pretix/control/logdisplay.py:769 -msgid "The gate has been deleted." -msgstr "" - #: pretix/control/logdisplay.py:770 -msgctxt "subevent" -msgid "The event date has been deleted." +msgid "The gate has been deleted." msgstr "" #: pretix/control/logdisplay.py:771 msgctxt "subevent" -msgid "The event date has been canceled." +msgid "The event date has been deleted." msgstr "" #: pretix/control/logdisplay.py:772 msgctxt "subevent" -msgid "The event date has been changed." +msgid "The event date has been canceled." msgstr "" #: pretix/control/logdisplay.py:773 msgctxt "subevent" -msgid "The event date has been created." +msgid "The event date has been changed." msgstr "" #: pretix/control/logdisplay.py:774 msgctxt "subevent" -msgid "A quota has been added to the event date." +msgid "The event date has been created." msgstr "" #: pretix/control/logdisplay.py:775 msgctxt "subevent" -msgid "A quota has been changed on the event date." +msgid "A quota has been added to the event date." msgstr "" #: pretix/control/logdisplay.py:776 msgctxt "subevent" -msgid "A quota has been removed from the event date." +msgid "A quota has been changed on the event date." msgstr "" #: pretix/control/logdisplay.py:777 -msgid "The device has been created." +msgctxt "subevent" +msgid "A quota has been removed from the event date." msgstr "" #: pretix/control/logdisplay.py:778 -msgid "The device has been changed." +msgid "The device has been created." msgstr "" #: pretix/control/logdisplay.py:779 -msgid "Access of the device has been revoked." +msgid "The device has been changed." msgstr "" #: pretix/control/logdisplay.py:780 -msgid "The device has been initialized." +msgid "Access of the device has been revoked." msgstr "" #: pretix/control/logdisplay.py:781 -msgid "The access token of the device has been regenerated." +msgid "The device has been initialized." msgstr "" #: pretix/control/logdisplay.py:782 -msgid "The device has notified the server of an hardware or software update." +msgid "The access token of the device has been regenerated." msgstr "" #: pretix/control/logdisplay.py:783 +msgid "The device has notified the server of an hardware or software update." +msgstr "" + +#: pretix/control/logdisplay.py:784 msgid "The gift card has been created." msgstr "" -#: pretix/control/logdisplay.py:784 pretix/control/views/organizer.py:1925 +#: pretix/control/logdisplay.py:785 pretix/control/views/organizer.py:1925 msgid "The gift card has been changed." msgstr "" -#: pretix/control/logdisplay.py:785 -msgid "A manual transaction has been performed." -msgstr "" - #: pretix/control/logdisplay.py:786 -#, python-brace-format -msgid "The token \"{name}\" has been created." +msgid "A manual transaction has been performed." msgstr "" #: pretix/control/logdisplay.py:787 #, python-brace-format -msgid "The token \"{name}\" has been revoked." +msgid "The token \"{name}\" has been created." msgstr "" #: pretix/control/logdisplay.py:788 +#, python-brace-format +msgid "The token \"{name}\" has been revoked." +msgstr "" + +#: pretix/control/logdisplay.py:789 msgid "The check-in and print log state has been reset." msgstr "" -#: pretix/control/logdisplay.py:795 pretix/control/logdisplay.py:854 +#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 msgid "The plugin has been enabled." msgstr "" -#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:797 pretix/control/logdisplay.py:856 #: pretix/control/views/event.py:490 pretix/control/views/organizer.py:753 msgid "The plugin has been disabled." msgstr "" -#: pretix/control/logdisplay.py:799 pretix/control/logdisplay.py:858 +#: pretix/control/logdisplay.py:800 pretix/control/logdisplay.py:859 #, python-brace-format msgid "Plugin {val}" msgstr "" -#: pretix/control/logdisplay.py:814 +#: pretix/control/logdisplay.py:815 msgid "A meta property has been added to this event." msgstr "" -#: pretix/control/logdisplay.py:815 +#: pretix/control/logdisplay.py:816 msgid "A meta property has been removed from this event." msgstr "" -#: pretix/control/logdisplay.py:816 +#: pretix/control/logdisplay.py:817 msgid "A meta property has been changed on this event." msgstr "" -#: pretix/control/logdisplay.py:817 +#: pretix/control/logdisplay.py:818 msgid "The event settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:818 +#: pretix/control/logdisplay.py:819 msgid "The ticket download settings have been changed." msgstr "" -#: pretix/control/logdisplay.py:821 +#: pretix/control/logdisplay.py:822 msgid "The shop has been taken live." msgstr "" -#: pretix/control/logdisplay.py:822 +#: pretix/control/logdisplay.py:823 msgid "The shop has been taken offline." msgstr "" -#: pretix/control/logdisplay.py:823 +#: pretix/control/logdisplay.py:824 msgid "The shop has been taken into test mode." msgstr "" -#: pretix/control/logdisplay.py:824 +#: pretix/control/logdisplay.py:825 msgid "The test mode has been disabled." msgstr "" -#: pretix/control/logdisplay.py:825 +#: pretix/control/logdisplay.py:826 msgid "The event has been created." msgstr "" -#: pretix/control/logdisplay.py:826 +#: pretix/control/logdisplay.py:827 msgid "The event details have been changed." msgstr "" -#: pretix/control/logdisplay.py:828 +#: pretix/control/logdisplay.py:829 msgid "An answer option has been added to the question." msgstr "" -#: pretix/control/logdisplay.py:829 +#: pretix/control/logdisplay.py:830 msgid "An answer option has been removed from the question." msgstr "" -#: pretix/control/logdisplay.py:830 +#: pretix/control/logdisplay.py:831 msgid "An answer option has been changed." msgstr "" -#: pretix/control/logdisplay.py:831 +#: pretix/control/logdisplay.py:832 msgid "A user has been added to the event team." msgstr "" -#: pretix/control/logdisplay.py:832 +#: pretix/control/logdisplay.py:833 msgid "A user has been invited to the event team." msgstr "" -#: pretix/control/logdisplay.py:833 +#: pretix/control/logdisplay.py:834 msgid "A user's permissions have been changed." msgstr "" -#: pretix/control/logdisplay.py:834 +#: pretix/control/logdisplay.py:835 msgid "A user has been removed from the event team." msgstr "" -#: pretix/control/logdisplay.py:841 +#: pretix/control/logdisplay.py:842 msgid "The check-in list has been added." msgstr "" -#: pretix/control/logdisplay.py:842 pretix/control/logdisplay.py:843 +#: pretix/control/logdisplay.py:843 pretix/control/logdisplay.py:844 msgid "The check-in list has been deleted." msgstr "" -#: pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:845 msgid "The check-in list has been changed." msgstr "" -#: pretix/control/logdisplay.py:847 +#: pretix/control/logdisplay.py:848 #, python-brace-format msgid "Check-in list {val}" msgstr "" -#: pretix/control/logdisplay.py:874 +#: pretix/control/logdisplay.py:875 msgid "The product has been created." msgstr "" -#: pretix/control/logdisplay.py:875 +#: pretix/control/logdisplay.py:876 msgid "The product has been changed." msgstr "" -#: pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:877 msgid "The product has been reordered." msgstr "" -#: pretix/control/logdisplay.py:877 +#: pretix/control/logdisplay.py:878 msgid "The product has been deleted." msgstr "" -#: pretix/control/logdisplay.py:878 +#: pretix/control/logdisplay.py:879 msgid "An add-on has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:879 +#: pretix/control/logdisplay.py:880 msgid "An add-on has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:881 msgid "An add-on has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:881 +#: pretix/control/logdisplay.py:882 msgid "A bundled item has been added to this product." msgstr "" -#: pretix/control/logdisplay.py:882 +#: pretix/control/logdisplay.py:883 msgid "A bundled item has been removed from this product." msgstr "" -#: pretix/control/logdisplay.py:883 +#: pretix/control/logdisplay.py:884 msgid "A bundled item has been changed on this product." msgstr "" -#: pretix/control/logdisplay.py:890 -#, python-brace-format -msgid "The variation \"{value}\" has been created." -msgstr "" - #: pretix/control/logdisplay.py:891 #, python-brace-format -msgid "The variation \"{value}\" has been deleted." +msgid "The variation \"{value}\" has been created." msgstr "" #: pretix/control/logdisplay.py:892 #, python-brace-format -msgid "The variation \"{value}\" has been changed." +msgid "The variation \"{value}\" has been deleted." msgstr "" -#: pretix/control/logdisplay.py:909 +#: pretix/control/logdisplay.py:893 #, python-brace-format -msgid "Payment {local_id} has been confirmed." +msgid "The variation \"{value}\" has been changed." msgstr "" #: pretix/control/logdisplay.py:910 #, python-brace-format -msgid "Payment {local_id} has been canceled." +msgid "Payment {local_id} has been confirmed." msgstr "" #: pretix/control/logdisplay.py:911 #, python-brace-format -msgid "Canceling payment {local_id} has failed." +msgid "Payment {local_id} has been canceled." msgstr "" #: pretix/control/logdisplay.py:912 #, python-brace-format -msgid "Payment {local_id} has been started." +msgid "Canceling payment {local_id} has failed." msgstr "" #: pretix/control/logdisplay.py:913 #, python-brace-format -msgid "Payment {local_id} has failed." +msgid "Payment {local_id} has been started." msgstr "" #: pretix/control/logdisplay.py:914 #, python-brace-format -msgid "The order could not be marked as paid: {message}" +msgid "Payment {local_id} has failed." msgstr "" #: pretix/control/logdisplay.py:915 -msgid "The order has been overpaid." +#, python-brace-format +msgid "The order could not be marked as paid: {message}" msgstr "" #: pretix/control/logdisplay.py:916 -#, python-brace-format -msgid "Refund {local_id} has been created." +msgid "The order has been overpaid." msgstr "" #: pretix/control/logdisplay.py:917 #, python-brace-format -msgid "Refund {local_id} has been created by an external entity." +msgid "Refund {local_id} has been created." msgstr "" #: pretix/control/logdisplay.py:918 -msgid "The customer requested you to issue a refund." +#, python-brace-format +msgid "Refund {local_id} has been created by an external entity." msgstr "" #: pretix/control/logdisplay.py:919 -#, python-brace-format -msgid "Refund {local_id} has been completed." +msgid "The customer requested you to issue a refund." msgstr "" #: pretix/control/logdisplay.py:920 #, python-brace-format -msgid "Refund {local_id} has been canceled." +msgid "Refund {local_id} has been completed." msgstr "" #: pretix/control/logdisplay.py:921 #, python-brace-format +msgid "Refund {local_id} has been canceled." +msgstr "" + +#: pretix/control/logdisplay.py:922 +#, python-brace-format msgid "Refund {local_id} has failed." msgstr "" -#: pretix/control/logdisplay.py:928 +#: pretix/control/logdisplay.py:929 msgid "The quota has been added." msgstr "" -#: pretix/control/logdisplay.py:929 +#: pretix/control/logdisplay.py:930 msgid "The quota has been deleted." msgstr "" -#: pretix/control/logdisplay.py:930 +#: pretix/control/logdisplay.py:931 msgid "The quota has been changed." msgstr "" -#: pretix/control/logdisplay.py:931 +#: pretix/control/logdisplay.py:932 msgid "The quota has closed." msgstr "" -#: pretix/control/logdisplay.py:932 pretix/control/views/item.py:1081 +#: pretix/control/logdisplay.py:933 pretix/control/views/item.py:1081 msgid "The quota has been re-opened." msgstr "" -#: pretix/control/logdisplay.py:939 +#: pretix/control/logdisplay.py:940 msgid "The question has been added." msgstr "" -#: pretix/control/logdisplay.py:940 +#: pretix/control/logdisplay.py:941 msgid "The question has been deleted." msgstr "" -#: pretix/control/logdisplay.py:941 +#: pretix/control/logdisplay.py:942 msgid "The question has been changed." msgstr "" -#: pretix/control/logdisplay.py:942 +#: pretix/control/logdisplay.py:943 msgid "The question has been reordered." msgstr "" -#: pretix/control/logdisplay.py:949 +#: pretix/control/logdisplay.py:950 msgid "The discount has been added." msgstr "" -#: pretix/control/logdisplay.py:950 +#: pretix/control/logdisplay.py:951 msgid "The discount has been deleted." msgstr "" -#: pretix/control/logdisplay.py:951 +#: pretix/control/logdisplay.py:952 msgid "The discount has been changed." msgstr "" -#: pretix/control/logdisplay.py:975 +#: pretix/control/logdisplay.py:976 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" "\"." msgstr "" -#: pretix/control/logdisplay.py:980 +#: pretix/control/logdisplay.py:981 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." msgstr "" -#: pretix/control/logdisplay.py:989 +#: pretix/control/logdisplay.py:990 msgid "An entry has been removed from the waiting list." msgstr "" -#: pretix/control/logdisplay.py:990 +#: pretix/control/logdisplay.py:991 msgid "An entry has been changed on the waiting list." msgstr "" -#: pretix/control/logdisplay.py:991 +#: pretix/control/logdisplay.py:992 msgid "An entry has been added to the waiting list." msgstr "" @@ -15884,7 +16000,7 @@ msgstr "" #: pretix/control/navigation.py:126 pretix/control/navigation.py:435 #: pretix/control/navigation.py:485 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:151 #: pretix/control/templates/pretixcontrol/event/payment.html:47 #: pretix/control/templates/pretixcontrol/event/plugins.html:117 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:137 @@ -16146,12 +16262,12 @@ 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:131 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:168 #: 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 #: pretix/presale/templates/pretixpresale/event/order_pay.html:28 -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:66 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:75 #: pretix/presale/templates/pretixpresale/event/position_change.html:29 msgid "Continue" msgstr "" @@ -16200,7 +16316,7 @@ msgstr "" #: 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:162 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:175 #: 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 @@ -16233,8 +16349,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/export_form.html:46 #: pretix/control/templates/pretixcontrol/organizers/gate_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_invite.html:15 -#: pretix/control/templates/pretixcontrol/organizers/giftcard_create.html:17 -#: pretix/control/templates/pretixcontrol/organizers/giftcard_edit.html:21 +#: pretix/control/templates/pretixcontrol/organizers/giftcard_create.html:20 +#: pretix/control/templates/pretixcontrol/organizers/giftcard_edit.html:24 #: 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 @@ -16245,9 +16361,9 @@ msgstr "" #: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 #: pretix/control/templates/pretixcontrol/organizers/webhook_edit.html:21 #: pretix/control/templates/pretixcontrol/pdf/index.html:46 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:630 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:632 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:287 +#: 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/staff_session_edit.html:13 @@ -16513,8 +16629,8 @@ msgid "Transaction ID" msgstr "" #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:98 -#: pretix/plugins/banktransfer/payment.py:297 -#: pretix/plugins/banktransfer/payment.py:306 +#: pretix/plugins/banktransfer/payment.py:298 +#: pretix/plugins/banktransfer/payment.py:307 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:32 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:33 msgid "Reference" @@ -16623,7 +16739,7 @@ msgstr[1] "" #: pretix/presale/templates/pretixpresale/event/order_change.html:22 #: pretix/presale/templates/pretixpresale/event/order_modify.html:80 #: pretix/presale/templates/pretixpresale/event/order_pay.html:23 -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:60 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:69 #: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:40 #: pretix/presale/templates/pretixpresale/event/position_change.html:24 #: pretix/presale/templates/pretixpresale/event/position_modify.html:44 @@ -16644,7 +16760,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/orders/export.html:77 #: pretix/control/templates/pretixcontrol/orders/export_delete.html:15 #: pretix/control/templates/pretixcontrol/organizers/channel_delete.html:28 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:173 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:174 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:26 #: pretix/control/templates/pretixcontrol/organizers/delete.html:30 #: pretix/control/templates/pretixcontrol/organizers/export.html:77 @@ -16664,7 +16780,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:387 +#: pretix/control/views/orders.py:388 #: 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 @@ -16740,7 +16856,7 @@ msgstr "" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:65 #: pretix/control/templates/pretixcontrol/checkin/simulator.html:49 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14 -#: pretix/plugins/checkinlists/exporters.py:767 +#: pretix/plugins/checkinlists/exporters.py:770 msgid "Result" msgstr "" @@ -16937,8 +17053,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/index.html:164 #: pretix/control/templates/pretixcontrol/orders/export.html:73 #: pretix/control/templates/pretixcontrol/orders/index.html:40 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:98 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:166 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:99 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:167 #: pretix/control/templates/pretixcontrol/organizers/export.html:73 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:15 #: pretix/control/templates/pretixcontrol/organizers/mail.html:34 @@ -17525,6 +17641,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:47 #: pretix/control/templates/pretixcontrol/orders/cancel.html:5 #: pretix/control/templates/pretixcontrol/orders/cancel.html:7 +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:6 +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:8 msgid "Cancel event" msgstr "" @@ -17764,23 +17882,30 @@ msgstr "" msgid "Invoice generation" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:27 -msgid "Address form" +#: pretix/control/templates/pretixcontrol/event/invoicing.html:23 +msgid "" +"You configured that your shop is not an event and the event date should not " +"be shown. Therefore, we recommend that you set the date of service to a " +"different option." msgstr "" #: pretix/control/templates/pretixcontrol/event/invoicing.html:40 +msgid "Address form" +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/invoicing.html:53 msgid "Issuer details" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:50 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:63 msgid "Invoice customization" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:64 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:77 msgid "Invoice transmission" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:66 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:79 msgid "" "pretix can transmit invoices using different transmission methods. Different " "transmission methods might be required depending on country and industry. By " @@ -17788,47 +17913,47 @@ msgid "" "types of transmission can be added by plugins." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:73 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:86 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:82 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:95 msgid "Transmission method" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:98 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:125 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:111 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 #: 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:100 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:113 msgid "" "When this type is available for an invoice address, no other type can be " "selected." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:101 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 msgid "(exclusive)" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:108 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:121 msgid "Unavailable" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:130 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:143 msgid "Not configured" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:152 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:165 msgid "Enable additional invoice transmission plugins" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:159 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:172 msgid "Save and show preview" msgstr "" @@ -18152,19 +18277,19 @@ msgstr "" #: pretix/control/views/organizer.py:2672 #: pretix/control/views/organizer.py:2788 #: pretix/control/views/organizer.py:2917 -#: pretix/control/views/organizer.py:3111 -#: pretix/control/views/organizer.py:3140 -#: pretix/control/views/organizer.py:3180 -#: pretix/control/views/organizer.py:3257 -#: pretix/control/views/organizer.py:3354 -#: pretix/control/views/organizer.py:3383 -#: pretix/control/views/organizer.py:3521 pretix/control/views/subevents.py:542 +#: pretix/control/views/organizer.py:3113 +#: pretix/control/views/organizer.py:3142 +#: pretix/control/views/organizer.py:3182 +#: pretix/control/views/organizer.py:3259 +#: 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/plugins/ticketoutputpdf/views.py:172 -#: pretix/presale/views/customer.py:527 pretix/presale/views/customer.py:579 +#: pretix/presale/views/customer.py:542 pretix/presale/views/customer.py:594 msgid "Your changes have been saved." msgstr "" @@ -18905,6 +19030,29 @@ 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." @@ -19424,8 +19572,8 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/index.html:254 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:617 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:260 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:619 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:262 msgid "Additional settings" msgstr "" @@ -19729,8 +19877,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/items/question.html:26 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:31 #: pretix/control/templates/pretixcontrol/orders/overview.html:88 -#: pretix/plugins/checkinlists/exporters.py:503 -#: pretix/plugins/checkinlists/exporters.py:697 +#: pretix/plugins/checkinlists/exporters.py:504 +#: pretix/plugins/checkinlists/exporters.py:699 #: pretix/plugins/reports/exporters.py:397 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:23 msgid "Paid" @@ -20392,13 +20540,13 @@ msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:46 #: pretix/control/templates/pretixcontrol/orders/index.html:297 -#: pretix/control/views/orders.py:311 +#: pretix/control/views/orders.py:312 msgid "Approve" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:325 +#: pretix/control/views/orders.py:326 msgid "Deny" msgstr "" @@ -20437,7 +20585,7 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:373 +#: pretix/control/views/orders.py:374 msgid "Refund for overpayment" msgstr "" @@ -20666,7 +20814,7 @@ msgstr "" #: pretix/plugins/reports/exporters.py:397 #: pretix/plugins/reports/exporters.py:446 #: pretix/plugins/reports/exporters.py:638 -#: pretix/plugins/reports/exporters.py:968 +#: pretix/plugins/reports/exporters.py:969 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:465 msgid "Total" msgstr "" @@ -21111,10 +21259,74 @@ msgid "" "everyone on the waiting list will get multiple emails." msgstr "" -#: pretix/control/templates/pretixcontrol/orders/cancel.html:83 +#: pretix/control/templates/pretixcontrol/orders/cancel.html:84 +msgid "Preview refund amount" +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel.html:88 msgid "Cancel all orders" msgstr "" +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:13 +msgid "If you proceed, the system will do the following:" +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:19 +#, python-format +msgid "%(count)s order will be canceled fully" +msgid_plural "%(count)s orders will be canceled fully" +msgstr[0] "" +msgstr[1] "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:26 +#, python-format +msgid "%(count)s order will be canceled partially" +msgid_plural "%(count)s orders will be canceled partially" +msgstr[0] "" +msgstr[1] "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:36 +#, python-format +msgid "%(amount)s are eligible for refunds." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:40 +msgid "" +"The system will attempt to refund the money automatically if supported by " +"the payment method." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:42 +msgid "The system will create manual refunds that you need to execute." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:44 +msgid "Refunds will not happen automatically." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:52 +msgid "Inform all customers via email." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:57 +msgid "Inform all waiting list contacts via email." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:62 +msgid "" +"These numbers are estimates and may change if the data in your event " +"recently changed." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:76 +#, python-format +msgid "Proceed and refund approx. %(amount)s" +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:80 +msgid "Proceed and cancel orders" +msgstr "" + #: pretix/control/templates/pretixcontrol/orders/export.html:5 #: pretix/control/templates/pretixcontrol/orders/export.html:8 #: pretix/control/templates/pretixcontrol/orders/export_form.html:4 @@ -21427,7 +21639,7 @@ msgid "Remove filter" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:145 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:207 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:208 msgid "Order paid / total" msgstr "" @@ -21449,40 +21661,40 @@ msgid "TODO %(date)s" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:215 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:246 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:247 #: pretix/control/templates/pretixcontrol/search/orders.html:95 msgid "CANCELLATION REQUESTED" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:218 #: pretix/control/templates/pretixcontrol/orders/index.html:220 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:249 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:251 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:250 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:252 #: pretix/control/templates/pretixcontrol/search/orders.html:98 #: pretix/control/templates/pretixcontrol/search/orders.html:100 msgid "REFUND PENDING" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:223 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:254 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:255 #: pretix/control/templates/pretixcontrol/search/orders.html:103 msgid "OVERPAID" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:225 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:256 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:257 #: pretix/control/templates/pretixcontrol/search/orders.html:105 msgid "UNDERPAID" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:227 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:258 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:259 #: pretix/control/templates/pretixcontrol/search/orders.html:107 msgid "FULLY PAID" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:239 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:270 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:271 msgid "INVOICE NOT CANCELED" msgstr "" @@ -21509,12 +21721,12 @@ msgid "Select action" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:357 +#: pretix/control/views/orders.py:358 msgid "Refund overpaid amount" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:342 +#: pretix/control/views/orders.py:343 msgid "Mark as expired if overdue" msgstr "" @@ -21621,62 +21833,53 @@ msgstr "" msgid "Channel" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:7 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:13 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:8 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:14 #: pretix/control/templates/pretixcontrol/organizers/customer_edit.html:8 #: pretix/control/templates/pretixcontrol/organizers/customer_edit.html:18 #, python-format msgid "Customer #%(id)s" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:22 -#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:15 -#: pretix/control/templates/pretixcontrol/organizers/customers.html:90 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:23 -#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:95 -#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:102 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 -#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 -#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 -#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:66 -msgid "Details" -msgstr "" - -#: pretix/control/templates/pretixcontrol/organizers/customer.html:54 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:55 msgid "Send password reset link" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:79 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:80 msgid "This includes all paid orders by this customer across all your events." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:80 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:81 msgid "Lifetime spending" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:102 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:103 #: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html:39 #: pretix/control/templates/pretixcontrol/users/form.html:24 msgid "Anonymize" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:121 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:122 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:35 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:60 msgid "Usages" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:188 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:189 msgid "Add membership" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:240 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:241 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:29 msgid "Matched to the account based on the email address." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:286 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:294 +#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 +msgid "Last transaction" +msgstr "" + +#: pretix/control/templates/pretixcontrol/organizers/customer.html:334 msgid "Customer history" msgstr "" @@ -22087,26 +22290,21 @@ msgstr "" msgid "Issued through sale" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:63 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:71 msgid "Transactions" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:73 -#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 -msgid "Information" -msgstr "" - -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:86 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:94 msgid "" "Create a payment on the respective order that cancels out with this " "transaction. The order will then likely be overpaid." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:88 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:96 msgid "Revert" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:131 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:139 msgid "Gift card history" msgstr "" @@ -22203,10 +22401,6 @@ msgstr "" msgid "Manually issue a gift card" msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 -msgid "Last transaction" -msgstr "" - #: pretix/control/templates/pretixcontrol/organizers/index.html:9 msgid "" "The list below shows all organizer accounts you have administrative access " @@ -22748,10 +22942,6 @@ msgid "" "it to copy and share ticket designs, not to modify the design source code." msgstr "" -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 -msgid "Apply" -msgstr "" - #: pretix/control/templates/pretixcontrol/pdf/index.html:164 msgid "Uploading new PDF background…" msgstr "" @@ -23050,10 +23240,6 @@ msgid "" "successfully downloaded the file." msgstr "" -#: pretix/control/templates/pretixcontrol/shredder/download.html:53 -msgid "Confirmation code" -msgstr "" - #: pretix/control/templates/pretixcontrol/shredder/download.html:59 msgid "" "Depending on the amount of data in your event, the following step may take a " @@ -23171,8 +23357,8 @@ msgid "" "from the product settings will be used." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:166 msgid "" "You can choose to either add one or more check-in lists for every date in " "your series individually, or use just one check-in list for all your dates " @@ -23184,9 +23370,9 @@ msgid "" "will be easier." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:600 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:602 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:359 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:243 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:245 msgid "Add a new check-in list" msgstr "" @@ -23267,7 +23453,7 @@ msgctxt "subevent" msgid "Create date" msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/detail.html:277 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:279 msgctxt "subevent" msgid "Date history" msgstr "" @@ -24401,8 +24587,8 @@ msgid_plural "{num} orders" msgstr[0] "" msgstr[1] "" -#: pretix/control/views/datasync.py:82 -msgid "The sync job has been enqueued and will run in the next minutes." +#: pretix/control/views/datasync.py:82 pretix/control/views/datasync.py:113 +msgid "The sync job has been set to run as soon as possible." msgstr "" #: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104 @@ -24418,10 +24604,6 @@ msgstr "" msgid "The sync job has been canceled." msgstr "" -#: pretix/control/views/datasync.py:113 -msgid "The sync job has been set to run as soon as possible." -msgstr "" - #: pretix/control/views/datasync.py:144 msgid "The selected jobs have been set to run as soon as possible." msgstr "" @@ -24454,7 +24636,7 @@ 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/organizer.py:2558 -#: pretix/control/views/organizer.py:3616 +#: pretix/control/views/organizer.py:3618 msgid "Some of the provided object ids are invalid." msgstr "" @@ -24497,8 +24679,8 @@ msgstr "" msgid "Unknown email renderer." msgstr "" -#: pretix/control/views/event.py:920 pretix/control/views/orders.py:678 -#: pretix/presale/views/order.py:1088 pretix/presale/views/order.py:1095 +#: pretix/control/views/event.py:920 pretix/control/views/orders.py:679 +#: pretix/presale/views/order.py:1111 pretix/presale/views/order.py:1118 msgid "You requested an invalid ticket output type." msgstr "" @@ -24545,11 +24727,11 @@ msgid "" "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:771 +#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:772 msgid "The comment has been updated." msgstr "" -#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:773 +#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:774 msgid "Could not update the comment." msgstr "" @@ -24695,7 +24877,7 @@ msgstr "" #: pretix/control/views/item.py:405 pretix/control/views/item.py:539 #: pretix/control/views/organizer.py:2561 -#: pretix/control/views/organizer.py:3619 +#: pretix/control/views/organizer.py:3621 msgid "Not all objects have been selected." msgstr "" @@ -24885,87 +25067,87 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "" -#: pretix/control/views/orders.py:193 +#: pretix/control/views/orders.py:194 msgid "We could not process your input. See below for details." msgstr "" -#: pretix/control/views/orders.py:266 +#: pretix/control/views/orders.py:267 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:680 pretix/presale/views/order.py:158 -#: pretix/presale/views/order.py:240 pretix/presale/views/order.py:334 -#: pretix/presale/views/order.py:361 pretix/presale/views/order.py:429 -#: pretix/presale/views/order.py:496 pretix/presale/views/order.py:542 -#: pretix/presale/views/order.py:728 pretix/presale/views/order.py:841 -#: pretix/presale/views/order.py:913 pretix/presale/views/order.py:928 -#: pretix/presale/views/order.py:977 pretix/presale/views/order.py:982 -#: pretix/presale/views/order.py:1097 pretix/presale/views/order.py:1274 -#: pretix/presale/views/order.py:1666 pretix/presale/views/order.py:1697 +#: pretix/control/views/orders.py:681 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 +#: pretix/presale/views/order.py:731 pretix/presale/views/order.py:864 +#: 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 msgid "Unknown order code or not authorized to access this order." msgstr "" -#: pretix/control/views/orders.py:682 pretix/presale/views/order.py:1102 +#: pretix/control/views/orders.py:683 pretix/presale/views/order.py:1125 msgid "Ticket download is not enabled for this product." msgstr "" -#: pretix/control/views/orders.py:807 +#: pretix/control/views/orders.py:808 msgid "The order has been deleted." msgstr "" -#: pretix/control/views/orders.py:814 +#: pretix/control/views/orders.py:815 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:822 +#: pretix/control/views/orders.py:823 msgid "Only orders created in test mode can be deleted." msgstr "" -#: pretix/control/views/orders.py:843 +#: pretix/control/views/orders.py:844 msgid "The order has been denied and is therefore now canceled." msgstr "" -#: pretix/control/views/orders.py:883 +#: pretix/control/views/orders.py:884 msgid "This payment has been canceled." msgstr "" -#: pretix/control/views/orders.py:885 +#: pretix/control/views/orders.py:886 msgid "This payment can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:911 +#: pretix/control/views/orders.py:912 msgid "The refund has been canceled." msgstr "" -#: pretix/control/views/orders.py:913 +#: pretix/control/views/orders.py:914 msgid "This refund can not be canceled at the moment." msgstr "" -#: pretix/control/views/orders.py:947 +#: pretix/control/views/orders.py:948 msgid "The refund has been processed." msgstr "" -#: pretix/control/views/orders.py:949 pretix/control/views/orders.py:975 +#: pretix/control/views/orders.py:950 pretix/control/views/orders.py:976 msgid "This refund can not be processed at the moment." msgstr "" -#: pretix/control/views/orders.py:973 +#: pretix/control/views/orders.py:974 msgid "The refund has been marked as done." msgstr "" -#: pretix/control/views/orders.py:999 +#: pretix/control/views/orders.py:1000 msgid "The request has been removed. If you want, you can now inform the user." msgstr "" -#: pretix/control/views/orders.py:1006 +#: pretix/control/views/orders.py:1007 msgid "Your cancellation request" msgstr "" -#: pretix/control/views/orders.py:1007 +#: pretix/control/views/orders.py:1008 #, python-brace-format msgid "" "Hello,\n" @@ -24976,72 +25158,72 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1063 +#: pretix/control/views/orders.py:1064 msgid "" "The payment has been marked as complete, but we were unable to send a " "confirmation mail." msgstr "" -#: pretix/control/views/orders.py:1066 +#: pretix/control/views/orders.py:1067 msgid "The payment has been marked as complete." msgstr "" -#: pretix/control/views/orders.py:1068 +#: pretix/control/views/orders.py:1069 msgid "This payment can not be confirmed at the moment." msgstr "" -#: pretix/control/views/orders.py:1159 +#: pretix/control/views/orders.py:1160 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:1259 +#: pretix/control/views/orders.py:1261 msgid "You entered an order in an event with a different currency." msgstr "" -#: pretix/control/views/orders.py:1310 +#: pretix/control/views/orders.py:1312 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "" -#: pretix/control/views/orders.py:1315 +#: pretix/control/views/orders.py:1317 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" -#: pretix/control/views/orders.py:1345 +#: pretix/control/views/orders.py:1347 #, 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:1351 +#: pretix/control/views/orders.py:1353 #, python-brace-format msgid "A refund of {} has been processed." msgstr "" -#: pretix/control/views/orders.py:1355 +#: pretix/control/views/orders.py:1357 #, 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:1384 +#: pretix/control/views/orders.py:1386 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1392 +#: pretix/control/views/orders.py:1394 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1394 +#: pretix/control/views/orders.py:1396 #, python-brace-format msgid "" "Hello,\n" @@ -25054,201 +25236,201 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1405 +#: pretix/control/views/orders.py:1407 msgid "The refunds you selected do not match the selected total refund amount." msgstr "" -#: pretix/control/views/orders.py:1535 +#: pretix/control/views/orders.py:1537 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." msgstr "" -#: pretix/control/views/orders.py:1538 +#: pretix/control/views/orders.py:1540 msgid "The payment has been created successfully." msgstr "" -#: pretix/control/views/orders.py:1552 +#: pretix/control/views/orders.py:1554 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:1623 pretix/control/views/orders.py:1627 +#: pretix/control/views/orders.py:1625 pretix/control/views/orders.py:1629 msgid "No VAT ID specified." msgstr "" -#: pretix/control/views/orders.py:1631 +#: pretix/control/views/orders.py:1633 msgid "No country specified." msgstr "" -#: pretix/control/views/orders.py:1635 +#: pretix/control/views/orders.py:1637 msgid "VAT ID could not be checked since this country is not supported." msgstr "" -#: pretix/control/views/orders.py:1646 +#: pretix/control/views/orders.py:1648 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:1649 +#: pretix/control/views/orders.py:1651 msgid "This VAT ID is valid." msgstr "" -#: pretix/control/views/orders.py:1663 pretix/control/views/orders.py:1697 -#: pretix/control/views/orders.py:1729 +#: pretix/control/views/orders.py:1665 pretix/control/views/orders.py:1699 +#: pretix/control/views/orders.py:1731 msgid "Unknown invoice." msgstr "" -#: pretix/control/views/orders.py:1666 +#: pretix/control/views/orders.py:1668 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1668 +#: pretix/control/views/orders.py:1670 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1670 pretix/control/views/orders.py:1732 +#: pretix/control/views/orders.py:1672 pretix/control/views/orders.py:1734 msgid "The invoice has already been canceled." msgstr "" -#: pretix/control/views/orders.py:1672 +#: pretix/control/views/orders.py:1674 msgid "The invoice file has already been exported." msgstr "" -#: pretix/control/views/orders.py:1674 +#: pretix/control/views/orders.py:1676 msgid "The invoice file is too old to be regenerated." msgstr "" -#: pretix/control/views/orders.py:1676 pretix/control/views/orders.py:1734 +#: pretix/control/views/orders.py:1678 pretix/control/views/orders.py:1736 msgid "The invoice has been cleaned of personal data." msgstr "" -#: pretix/control/views/orders.py:1701 +#: pretix/control/views/orders.py:1703 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:1708 +#: pretix/control/views/orders.py:1710 msgid "The invoice has been scheduled for retransmission." msgstr "" -#: pretix/control/views/orders.py:1765 +#: pretix/control/views/orders.py:1767 msgid "The email has been queued to be sent." msgstr "" -#: pretix/control/views/orders.py:1789 pretix/presale/views/order.py:1283 +#: pretix/control/views/orders.py:1791 pretix/presale/views/order.py:1306 msgid "This invoice has not been found" msgstr "" -#: pretix/control/views/orders.py:1796 pretix/presale/views/order.py:1290 +#: pretix/control/views/orders.py:1798 pretix/presale/views/order.py:1313 msgid "The invoice file is no longer stored on the server." msgstr "" -#: pretix/control/views/orders.py:1801 pretix/presale/views/order.py:1295 +#: pretix/control/views/orders.py:1803 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:1829 +#: pretix/control/views/orders.py:1831 msgid "The payment term has been changed." msgstr "" -#: pretix/control/views/orders.py:1834 pretix/control/views/orders.py:1891 +#: pretix/control/views/orders.py:1836 pretix/control/views/orders.py:1893 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "" -#: pretix/control/views/orders.py:1842 +#: pretix/control/views/orders.py:1844 msgid "This action is only allowed for pending orders." msgstr "" -#: pretix/control/views/orders.py:1897 +#: pretix/control/views/orders.py:1899 msgid "This action is only allowed for canceled orders." msgstr "" -#: pretix/control/views/orders.py:2154 pretix/presale/views/order.py:1569 +#: pretix/control/views/orders.py:2156 pretix/presale/views/order.py:1592 msgid "An error occurred. Please see the details below." msgstr "" -#: pretix/control/views/orders.py:2162 +#: pretix/control/views/orders.py:2164 msgid "The order has been changed and the user has been notified." msgstr "" -#: pretix/control/views/orders.py:2164 pretix/control/views/orders.py:2300 -#: pretix/control/views/orders.py:2337 pretix/presale/views/order.py:1604 +#: pretix/control/views/orders.py:2166 pretix/control/views/orders.py:2302 +#: pretix/control/views/orders.py:2339 pretix/presale/views/order.py:1627 msgid "The order has been changed." msgstr "" -#: pretix/control/views/orders.py:2191 pretix/presale/checkoutflow.py:945 -#: pretix/presale/views/order.py:783 pretix/presale/views/order.py:888 +#: pretix/control/views/orders.py:2193 pretix/presale/checkoutflow.py:945 +#: 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:2302 +#: pretix/control/views/orders.py:2304 msgid "Nothing about the order had to be changed." msgstr "" -#: pretix/control/views/orders.py:2383 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2385 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "" -#: pretix/control/views/orders.py:2399 pretix/control/views/orders.py:2469 +#: pretix/control/views/orders.py:2401 pretix/control/views/orders.py:2471 #: pretix/plugins/sendmail/views.py:204 pretix/plugins/sendmail/views.py:671 #, python-brace-format msgid "Subject: {subject}" msgstr "" -#: pretix/control/views/orders.py:2418 pretix/control/views/orders.py:2489 +#: pretix/control/views/orders.py:2420 pretix/control/views/orders.py:2491 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "" -#: pretix/control/views/orders.py:2422 pretix/control/views/orders.py:2492 +#: pretix/control/views/orders.py:2424 pretix/control/views/orders.py:2494 #, python-brace-format msgid "Failed to send mail to the following user: {}" msgstr "" -#: pretix/control/views/orders.py:2545 pretix/presale/views/order.py:1062 +#: pretix/control/views/orders.py:2547 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:2626 +#: pretix/control/views/orders.py:2628 msgid "There is no order with the given order code." msgstr "" -#: pretix/control/views/orders.py:2732 pretix/control/views/organizer.py:2074 +#: pretix/control/views/orders.py:2734 pretix/control/views/organizer.py:2074 msgid "The selected exporter was not found." msgstr "" -#: pretix/control/views/orders.py:2742 pretix/control/views/organizer.py:2084 +#: pretix/control/views/orders.py:2744 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:2777 pretix/control/views/organizer.py:2127 +#: pretix/control/views/orders.py:2779 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:2782 pretix/control/views/organizer.py:2132 +#: pretix/control/views/orders.py:2784 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:2821 pretix/control/views/organizer.py:2172 +#: pretix/control/views/orders.py:2823 pretix/control/views/organizer.py:2172 #, python-brace-format msgid "Export: {title}" msgstr "" -#: pretix/control/views/orders.py:2822 pretix/control/views/organizer.py:2174 +#: pretix/control/views/orders.py:2824 pretix/control/views/organizer.py:2174 #, python-brace-format msgid "" "Hello,\n" @@ -25256,31 +25438,31 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207 +#: pretix/control/views/orders.py:2851 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:2902 pretix/control/views/organizer.py:2259 +#: pretix/control/views/orders.py:2904 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:2981 +#: pretix/control/views/orders.py:2991 pretix/control/views/orders.py:3072 msgid "All orders have been canceled." msgstr "" -#: pretix/control/views/orders.py:2983 +#: pretix/control/views/orders.py:2993 pretix/control/views/orders.py:3074 #, 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:3004 +#: pretix/control/views/orders.py:3021 pretix/control/views/orders.py:3095 msgid "Your input was not valid." msgstr "" @@ -25349,8 +25531,8 @@ msgstr "" #: pretix/control/views/organizer.py:2792 #: pretix/control/views/organizer.py:2872 #: pretix/control/views/organizer.py:2922 -#: pretix/control/views/organizer.py:3481 -#: pretix/control/views/organizer.py:3525 +#: pretix/control/views/organizer.py:3483 +#: pretix/control/views/organizer.py:3527 msgid "Your changes could not be saved." msgstr "" @@ -25512,7 +25694,7 @@ msgstr "" #: pretix/control/views/organizer.py:2706 #: pretix/control/views/organizer.py:2822 #: pretix/control/views/organizer.py:2952 -#: pretix/control/views/organizer.py:3218 +#: pretix/control/views/organizer.py:3220 msgid "The selected object has been deleted." msgstr "" @@ -25540,25 +25722,25 @@ msgid "" "password." msgstr "" -#: pretix/control/views/organizer.py:3283 +#: pretix/control/views/organizer.py:3285 msgid "The customer account has been anonymized." msgstr "" -#: pretix/control/views/organizer.py:3553 +#: pretix/control/views/organizer.py:3555 msgid "This channel can not be deleted." msgstr "" -#: pretix/control/views/organizer.py:3558 +#: pretix/control/views/organizer.py:3560 msgid "The selected sales channel has been deleted." msgstr "" -#: pretix/control/views/organizer.py:3560 +#: pretix/control/views/organizer.py:3562 msgid "" "The channel could not be deleted as some constraints (e.g. data created by " "plug-ins) did not allow it." msgstr "" -#: pretix/control/views/organizer.py:3585 +#: pretix/control/views/organizer.py:3587 msgid "The order of sales channels has been updated." msgstr "" @@ -26159,7 +26341,7 @@ msgstr "" #: pretix/plugins/badges/exporters.py:493 #: pretix/plugins/checkinlists/exporters.py:118 #: pretix/plugins/reports/exporters.py:506 -#: pretix/plugins/reports/exporters.py:688 +#: pretix/plugins/reports/exporters.py:689 #: pretix/plugins/ticketoutputpdf/exporters.py:92 msgid "Sort by" msgstr "" @@ -26299,7 +26481,7 @@ msgstr "" #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/banktransfer/apps.py:46 #: pretix/plugins/banktransfer/apps.py:47 -#: pretix/plugins/banktransfer/payment.py:60 +#: pretix/plugins/banktransfer/payment.py:61 #: pretix/plugins/banktransfer/signals.py:48 #: pretix/plugins/banktransfer/signals.py:83 msgid "Bank transfer" @@ -26332,7 +26514,7 @@ msgid "" "Install the python package 'chardet' for better CSV import capabilities." msgstr "" -#: pretix/plugins/banktransfer/payment.py:68 +#: pretix/plugins/banktransfer/payment.py:69 msgid "" "I have understood that people will pay the ticket price directly to my bank " "account and pretix cannot automatically know what payments arrived. " @@ -26341,101 +26523,101 @@ msgid "" "information." msgstr "" -#: pretix/plugins/banktransfer/payment.py:75 +#: pretix/plugins/banktransfer/payment.py:76 msgid "Bank account type" msgstr "" -#: pretix/plugins/banktransfer/payment.py:78 +#: pretix/plugins/banktransfer/payment.py:79 msgid "SEPA bank account" msgstr "" -#: pretix/plugins/banktransfer/payment.py:79 +#: pretix/plugins/banktransfer/payment.py:80 msgid "Other bank account" msgstr "" -#: pretix/plugins/banktransfer/payment.py:84 +#: pretix/plugins/banktransfer/payment.py:85 msgid "Name of account holder" msgstr "" -#: pretix/plugins/banktransfer/payment.py:86 +#: pretix/plugins/banktransfer/payment.py:87 msgid "" "Please note: special characters other than letters, numbers, and some " "punctuation can cause problems with some banks." msgstr "" -#: pretix/plugins/banktransfer/payment.py:96 -#: pretix/plugins/banktransfer/payment.py:300 -#: pretix/plugins/banktransfer/payment.py:490 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:15 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: 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/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 msgid "IBAN" msgstr "" -#: pretix/plugins/banktransfer/payment.py:106 -#: pretix/plugins/banktransfer/payment.py:301 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:16 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:15 +#: 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/import_assign.html:66 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 msgid "BIC" msgstr "" -#: pretix/plugins/banktransfer/payment.py:116 +#: pretix/plugins/banktransfer/payment.py:117 msgid "Name of bank" msgstr "" -#: pretix/plugins/banktransfer/payment.py:126 +#: pretix/plugins/banktransfer/payment.py:127 msgid "Bank account details" msgstr "" -#: pretix/plugins/banktransfer/payment.py:129 +#: pretix/plugins/banktransfer/payment.py:130 msgid "" "Include everything else that your customers might need to send you a bank " "transfer payment. If you have lots of international customers, they might " "need your full address and your bank's full address." msgstr "" -#: pretix/plugins/banktransfer/payment.py:135 +#: pretix/plugins/banktransfer/payment.py:136 msgid "" "For SEPA accounts, you can leave this empty. Otherwise, please add " "everything that your customers need to transfer the money, e.g. account " "numbers, routing numbers, addresses, etc." msgstr "" -#: pretix/plugins/banktransfer/payment.py:154 +#: pretix/plugins/banktransfer/payment.py:155 msgid "Do not include hyphens in the payment reference." msgstr "" -#: pretix/plugins/banktransfer/payment.py:155 +#: pretix/plugins/banktransfer/payment.py:156 msgid "This is required in some countries." msgstr "" -#: pretix/plugins/banktransfer/payment.py:159 +#: pretix/plugins/banktransfer/payment.py:160 msgid "Include invoice number in the payment reference." msgstr "" -#: pretix/plugins/banktransfer/payment.py:163 +#: pretix/plugins/banktransfer/payment.py:164 msgid "Prefix for the payment reference" msgstr "" -#: pretix/plugins/banktransfer/payment.py:167 +#: pretix/plugins/banktransfer/payment.py:168 msgid "Additional text to show on pending orders" msgstr "" -#: pretix/plugins/banktransfer/payment.py:168 +#: pretix/plugins/banktransfer/payment.py:169 msgid "" "This text will be shown on the order confirmation page for pending orders in " "addition to the standard text." msgstr "" -#: pretix/plugins/banktransfer/payment.py:177 +#: pretix/plugins/banktransfer/payment.py:178 msgid "IBAN blocklist for refunds" msgstr "" -#: pretix/plugins/banktransfer/payment.py:180 +#: pretix/plugins/banktransfer/payment.py:181 msgid "" "Put one IBAN or IBAN prefix per line. The system will not attempt to send " "refunds to any of these IBANs. Useful e.g. if you receive a lot of " @@ -26446,33 +26628,33 @@ msgid "" "starting with 12345." msgstr "" -#: pretix/plugins/banktransfer/payment.py:207 +#: pretix/plugins/banktransfer/payment.py:208 msgid "Restrict to business customers" msgstr "" -#: pretix/plugins/banktransfer/payment.py:208 +#: pretix/plugins/banktransfer/payment.py:209 msgid "" "Only allow choosing this payment provider for customers who enter an invoice " "address and select \"Business or institutional customer\"." msgstr "" -#: pretix/plugins/banktransfer/payment.py:238 +#: pretix/plugins/banktransfer/payment.py:239 msgid "Please fill out your bank account details." msgstr "" -#: pretix/plugins/banktransfer/payment.py:242 +#: pretix/plugins/banktransfer/payment.py:243 msgid "Please enter your bank account details." msgstr "" -#: pretix/plugins/banktransfer/payment.py:291 +#: pretix/plugins/banktransfer/payment.py:292 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:15 msgid "Please transfer the full amount to the following bank account:" msgstr "" -#: pretix/plugins/banktransfer/payment.py:299 -#: pretix/plugins/banktransfer/payment.py:487 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:14 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:13 +#: 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/new_refund_control_form.html:5 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 #: pretix/plugins/banktransfer/views.py:829 @@ -26482,9 +26664,9 @@ msgstr "" msgid "Account holder" msgstr "" -#: 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/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/stripe/templates/pretixplugins/stripe/control.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31 @@ -26494,25 +26676,25 @@ msgstr "" msgid "Bank" msgstr "" -#: pretix/plugins/banktransfer/payment.py:381 +#: pretix/plugins/banktransfer/payment.py:382 msgid "Invalid IBAN/BIC" msgstr "" -#: pretix/plugins/banktransfer/payment.py:457 +#: pretix/plugins/banktransfer/payment.py:458 #, python-brace-format msgid "Bank account {iban}" msgstr "" -#: pretix/plugins/banktransfer/payment.py:473 +#: pretix/plugins/banktransfer/payment.py:474 msgid "Can only create a bank transfer refund from an existing payment." msgstr "" -#: pretix/plugins/banktransfer/payment.py:493 +#: pretix/plugins/banktransfer/payment.py:494 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:7 msgid "BIC (optional)" msgstr "" -#: pretix/plugins/banktransfer/payment.py:532 +#: pretix/plugins/banktransfer/payment.py:533 msgid "Your input was invalid, please see below for details." msgstr "" @@ -26547,35 +26729,35 @@ msgstr "" msgid "Currencies do not match." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:6 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:5 +#: 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:11 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:10 +#: 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:26 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:25 +#: 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 msgid "Reference code (important):" msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:31 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:30 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:32 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:31 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:36 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:35 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:37 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36 msgid "" "After completing your purchase, we will ask you to transfer the money to our " "bank account, using a personal reference code." @@ -27014,8 +27196,8 @@ msgstr "" #: pretix/plugins/checkinlists/exporters.py:305 #: pretix/plugins/checkinlists/exporters.py:476 -#: pretix/plugins/checkinlists/exporters.py:673 -#: pretix/plugins/checkinlists/exporters.py:743 +#: pretix/plugins/checkinlists/exporters.py:674 +#: pretix/plugins/checkinlists/exporters.py:745 msgctxt "export_category" msgid "Check-in" msgstr "" @@ -27038,71 +27220,71 @@ msgid "" "list." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 msgid "Checked out" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:500 -#: pretix/plugins/checkinlists/exporters.py:765 +#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:768 msgid "Automatically checked in" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:506 -#: pretix/plugins/checkinlists/exporters.py:694 -#: pretix/plugins/checkinlists/exporters.py:759 +#: pretix/plugins/checkinlists/exporters.py:507 +#: pretix/plugins/checkinlists/exporters.py:696 +#: pretix/plugins/checkinlists/exporters.py:762 #: pretix/plugins/paypal/payment.py:124 pretix/plugins/paypal2/payment.py:121 msgid "Secret" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:672 +#: pretix/plugins/checkinlists/exporters.py:673 msgid "Valid check-in codes" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:674 +#: pretix/plugins/checkinlists/exporters.py:675 msgid "" "Download a spreadsheet with all valid check-in barcodes e.g. for import into " "a different system. Does not included blocked codes or personal data." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:742 +#: pretix/plugins/checkinlists/exporters.py:744 msgid "Check-in log (all scans)" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:744 +#: pretix/plugins/checkinlists/exporters.py:746 msgid "" "Download a spreadsheet with one line for every scan that happened at your " "check-in stations." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:763 +#: pretix/plugins/checkinlists/exporters.py:766 msgid "Offline" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/checkinlists/exporters.py:767 msgid "Offline override" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:768 +#: pretix/plugins/checkinlists/exporters.py:771 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:83 msgid "Error message" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:769 +#: pretix/plugins/checkinlists/exporters.py:772 msgid "Upload date" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:770 +#: pretix/plugins/checkinlists/exporters.py:773 msgid "Upload time" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:830 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:519 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:859 +#: pretix/plugins/checkinlists/exporters.py:862 msgid "Successful scans only" msgstr "" @@ -27583,7 +27765,7 @@ msgid "Please turn on JavaScript." msgstr "" #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:85 msgid "Please select how you want to pay." msgstr "" @@ -27769,16 +27951,16 @@ msgid "Orders by tax rate ({currency})" msgstr "" #: pretix/plugins/reports/exporters.py:576 -#: pretix/plugins/reports/exporters.py:805 -#: pretix/plugins/reports/exporters.py:857 -#: pretix/plugins/reports/exporters.py:898 +#: pretix/plugins/reports/exporters.py:806 +#: pretix/plugins/reports/exporters.py:858 +#: pretix/plugins/reports/exporters.py:899 msgid "Gross" msgstr "" #: pretix/plugins/reports/exporters.py:576 -#: pretix/plugins/reports/exporters.py:806 -#: pretix/plugins/reports/exporters.py:858 -#: pretix/plugins/reports/exporters.py:898 +#: pretix/plugins/reports/exporters.py:807 +#: pretix/plugins/reports/exporters.py:859 +#: pretix/plugins/reports/exporters.py:899 msgid "Tax" msgstr "" @@ -27790,16 +27972,16 @@ msgstr "" msgid "Download a spreadsheet with the tax amounts included in each order." msgstr "" -#: pretix/plugins/reports/exporters.py:669 +#: pretix/plugins/reports/exporters.py:670 msgid "Taxes by country" msgstr "" -#: pretix/plugins/reports/exporters.py:670 +#: pretix/plugins/reports/exporters.py:671 msgid "Business customers" msgstr "" -#: pretix/plugins/reports/exporters.py:802 -#: pretix/plugins/reports/exporters.py:847 +#: pretix/plugins/reports/exporters.py:803 +#: pretix/plugins/reports/exporters.py:848 msgid "Country code" msgstr "" @@ -29423,7 +29605,7 @@ msgstr "" #: pretix/presale/checkoutflow.py:678 pretix/presale/checkoutflow.py:686 #: 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:1491 pretix/presale/views/order.py:1499 +#: pretix/presale/views/order.py:1514 pretix/presale/views/order.py:1522 msgid "Please enter numbers only." msgstr "" @@ -29475,7 +29657,7 @@ msgid "" "select a payment method for the remainder." msgstr "" -#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:676 +#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:679 msgid "Please select a payment method." msgstr "" @@ -29484,8 +29666,8 @@ msgstr "" msgid "Please select a payment method to proceed." msgstr "" -#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:435 -#: pretix/presale/views/order.py:502 +#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:438 +#: pretix/presale/views/order.py:505 msgid "The payment information you entered was incomplete." msgstr "" @@ -29774,11 +29956,6 @@ msgctxt "alert-messages" msgid "Information" msgstr "" -#: pretix/presale/templates/pretixpresale/event/base.html:222 -#: pretix/presale/templates/pretixpresale/organizers/base.html:100 -msgid "Contact" -msgstr "" - #: pretix/presale/templates/pretixpresale/event/base.html:225 #: pretix/presale/templates/pretixpresale/fragment_modals.html:118 #: pretix/presale/templates/pretixpresale/fragment_modals.html:137 @@ -29828,7 +30005,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:126 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:163 #: 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 @@ -30002,48 +30179,56 @@ msgid "" "product." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:13 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 #: 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:30 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:58 msgid "Remove payment" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:40 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:68 msgid "Remaining balance" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:69 msgid "Please select a payment method below." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:54 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 msgid "Please select how you want to pay the remaining balance:" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:92 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:110 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45 +#, python-format +msgid "(%(count)s available)" +msgid_plural "(%(count)s available)" +msgstr[0] "" +msgstr[1] "" + +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:129 msgid "This sales channel does not provide support for test mode." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:94 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:131 msgid "If you continue, you might pay an actual order with non-existing money!" msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:102 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:139 msgid "This payment provider does not provide support for test mode." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:104 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:141 msgid "If you continue, actual money might be transferred." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:115 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:152 msgid "There are no payment providers enabled." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:117 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:154 msgid "" "Please go to the payment settings and activate one or more payment providers." msgstr "" @@ -31301,7 +31486,7 @@ msgid "" "by the amount displayed to the right of each method." msgstr "" -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:52 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:61 msgid "There are no alternative payment providers available for this order." msgstr "" @@ -31756,7 +31941,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:11 -#: pretix/presale/views/customer.py:372 +#: pretix/presale/views/customer.py:378 msgid "Addresses" msgstr "" @@ -31781,6 +31966,35 @@ msgstr "" msgid "customer account information" msgstr "" +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:28 +#, python-format +msgid "Issued on %(date)s" +msgstr "" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:38 +#, python-format +msgid "Expired since %(date)s" +msgstr "" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:46 +#, python-format +msgid "Valid until %(date)s" +msgstr "" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:66 +msgid "Remaining value:" +msgstr "" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:76 +msgid "You don’t have any gift cards in your account currently." +msgstr "" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:77 +msgid "" +"Currently, only gift cards resulting from refunds show up here, any " +"purchased gift cards show up under the orders tab." +msgstr "" + #: pretix/presale/templates/pretixpresale/organizers/customer_info.html:6 msgid "Account information" msgstr "" @@ -31859,7 +32073,7 @@ msgstr "" #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11 -#: pretix/presale/views/customer.py:378 +#: pretix/presale/views/customer.py:384 msgid "Attendee profiles" msgstr "" @@ -32009,7 +32223,7 @@ msgid "" msgstr "" #: pretix/presale/views/customer.py:268 pretix/presale/views/customer.py:271 -#: pretix/presale/views/customer.py:607 pretix/presale/views/customer.py:613 +#: pretix/presale/views/customer.py:622 pretix/presale/views/customer.py:628 msgid "You clicked an invalid link." msgstr "" @@ -32022,24 +32236,24 @@ msgid "" "We've sent you an email with further instructions on resetting your password." msgstr "" -#: pretix/presale/views/customer.py:575 +#: pretix/presale/views/customer.py:590 msgid "" "Your changes have been saved. We've sent you an email with a link to update " "your email address. The email address of your account will be changed as " "soon as you click that link." msgstr "" -#: pretix/presale/views/customer.py:624 +#: pretix/presale/views/customer.py:639 msgid "" "Your email address has not been updated since the address is already in use " "for another customer account." msgstr "" -#: pretix/presale/views/customer.py:627 +#: pretix/presale/views/customer.py:642 msgid "Your email address has been updated." msgstr "" -#: pretix/presale/views/customer.py:844 pretix/presale/views/customer.py:855 +#: pretix/presale/views/customer.py:859 pretix/presale/views/customer.py:870 #, python-brace-format msgid "" "We were unable to use your login since the email address {email} is already " @@ -32081,94 +32295,98 @@ msgstr "" msgid "Time machine disabled!" msgstr "" -#: pretix/presale/views/order.py:366 pretix/presale/views/order.py:431 -#: pretix/presale/views/order.py:498 +#: pretix/presale/views/order.py:369 pretix/presale/views/order.py:434 +#: pretix/presale/views/order.py:501 msgid "The payment for this order cannot be continued." msgstr "" -#: pretix/presale/views/order.py:371 pretix/presale/views/order.py:440 -#: pretix/presale/views/order.py:507 pretix/presale/views/order.py:549 +#: pretix/presale/views/order.py:374 pretix/presale/views/order.py:443 +#: pretix/presale/views/order.py:510 pretix/presale/views/order.py:552 msgid "The payment is too late to be accepted." msgstr "" -#: pretix/presale/views/order.py:544 +#: pretix/presale/views/order.py:547 msgid "The payment method for this order cannot be changed." msgstr "" -#: pretix/presale/views/order.py:555 +#: pretix/presale/views/order.py:558 msgid "A payment is currently pending for this order." msgstr "" -#: pretix/presale/views/order.py:667 +#: pretix/presale/views/order.py:670 msgid "An invoice has been generated." msgstr "" -#: pretix/presale/views/order.py:843 pretix/presale/views/order.py:915 +#: pretix/presale/views/order.py:751 pretix/presale/views/order.py:831 +msgid "Invoice generation has failed, please reach out to the organizer." +msgstr "" + +#: pretix/presale/views/order.py:866 pretix/presale/views/order.py:938 msgid "You cannot modify this order" msgstr "" -#: pretix/presale/views/order.py:1010 pretix/presale/views/order.py:1015 -#: pretix/presale/views/order.py:1020 +#: pretix/presale/views/order.py:1033 pretix/presale/views/order.py:1038 +#: pretix/presale/views/order.py:1043 msgid "You chose an invalid cancellation fee." msgstr "" -#: pretix/presale/views/order.py:1036 +#: pretix/presale/views/order.py:1059 msgid "Canceled by customer" msgstr "" -#: pretix/presale/views/order.py:1047 +#: pretix/presale/views/order.py:1070 msgid "The cancellation has been requested." msgstr "" -#: pretix/presale/views/order.py:1100 +#: pretix/presale/views/order.py:1123 msgid "Ticket download is not (yet) enabled for this order." msgstr "" -#: pretix/presale/views/order.py:1109 +#: pretix/presale/views/order.py:1132 msgid "Please click the link we sent you via email to download your tickets." msgstr "" -#: pretix/presale/views/order.py:1596 +#: pretix/presale/views/order.py:1619 #, 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:1608 +#: pretix/presale/views/order.py:1631 msgid "You did not make any changes." msgstr "" -#: pretix/presale/views/order.py:1632 +#: pretix/presale/views/order.py:1655 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1634 +#: pretix/presale/views/order.py:1657 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1636 +#: pretix/presale/views/order.py:1659 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1638 +#: pretix/presale/views/order.py:1661 msgid "You may not change your order in a way that would require a refund." msgstr "" -#: pretix/presale/views/order.py:1646 +#: pretix/presale/views/order.py:1669 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:1652 +#: pretix/presale/views/order.py:1675 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:1668 pretix/presale/views/order.py:1699 +#: pretix/presale/views/order.py:1691 pretix/presale/views/order.py:1722 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 426356efb..3ad08f20a 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-09-26 11:16+0000\n" +"POT-Creation-Date: 2025-10-29 07:55+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -330,13 +330,13 @@ msgstr "" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71 #: pretix/static/pretixcontrol/js/ui/question.js:136 -#: pretix/static/pretixpresale/js/ui/questions.js:270 +#: pretix/static/pretixpresale/js/ui/questions.js:271 msgid "Yes" msgstr "" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:72 #: pretix/static/pretixcontrol/js/ui/question.js:137 -#: pretix/static/pretixpresale/js/ui/questions.js:270 +#: pretix/static/pretixpresale/js/ui/questions.js:271 msgid "No" msgstr "" @@ -345,7 +345,7 @@ msgid "close" msgstr "" #: pretix/static/pretixbase/js/addressform.js:90 -#: pretix/static/pretixpresale/js/ui/main.js:519 +#: pretix/static/pretixpresale/js/ui/main.js:525 msgid "required" msgstr "" @@ -549,6 +549,14 @@ msgctxt "entry_status" msgid "absent" msgstr "" +#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289 +msgid "Error: Product not found!" +msgstr "" + +#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296 +msgid "Error: Variation not found!" +msgstr "" + #: pretix/static/pretixcontrol/js/ui/editor.js:171 msgid "Check-in QR" msgstr "" @@ -630,40 +638,40 @@ msgid "" "will be impacted." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:417 -#: pretix/static/pretixcontrol/js/ui/main.js:437 +#: pretix/static/pretixcontrol/js/ui/main.js:418 +#: pretix/static/pretixcontrol/js/ui/main.js:438 msgid "Search query" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:435 +#: pretix/static/pretixcontrol/js/ui/main.js:436 msgid "All" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:436 +#: pretix/static/pretixcontrol/js/ui/main.js:437 msgid "None" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:440 +#: pretix/static/pretixcontrol/js/ui/main.js:441 msgid "Selected only" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:812 +#: pretix/static/pretixcontrol/js/ui/main.js:814 msgid "Enter page number between 1 and %(max)s." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:815 +#: pretix/static/pretixcontrol/js/ui/main.js:817 msgid "Invalid page number." msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:973 +#: pretix/static/pretixcontrol/js/ui/main.js:975 msgid "Use a different name internally" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1013 +#: pretix/static/pretixcontrol/js/ui/main.js:1015 msgid "Click to close" msgstr "" -#: pretix/static/pretixcontrol/js/ui/main.js:1094 +#: pretix/static/pretixcontrol/js/ui/main.js:1096 msgid "You have unsaved changes!" msgstr "" @@ -683,7 +691,7 @@ msgstr "" msgid "Count" msgstr "" -#: pretix/static/pretixcontrol/js/ui/subevent.js:111 +#: pretix/static/pretixcontrol/js/ui/subevent.js:112 msgid "(one more date)" msgid_plural "({num} more dates)" msgstr[0] "" @@ -740,7 +748,7 @@ msgstr "" msgid "Please enter the amount the organizer can keep." msgstr "" -#: pretix/static/pretixpresale/js/ui/main.js:564 +#: pretix/static/pretixpresale/js/ui/main.js:570 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 40c669784..bbbf8aeba 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-09-26 11:16+0000\n" +"POT-Creation-Date: 2025-10-29 07:54+0000\n" "PO-Revision-Date: 2025-04-08 18:00+0000\n" "Last-Translator: Menaouer Chaabi " "<98581961+DerJimno@users.noreply.github.com>\n" @@ -177,15 +177,15 @@ msgstr "pretixSCAN (وضع kiosk، لا مزامنة للطلبات ولا بح msgid "pretixSCAN (online only, no order sync)" msgstr "pretixSCAN (وضع kiosk، لا مزامنة للطلبات)" -#: pretix/api/models.py:39 pretix/base/models/customers.py:402 +#: pretix/api/models.py:39 pretix/base/models/customers.py:422 msgid "Application name" msgstr "اسم التطبيق" -#: pretix/api/models.py:42 pretix/base/models/customers.py:425 +#: pretix/api/models.py:42 pretix/base/models/customers.py:445 msgid "Redirection URIs" msgstr "روابط إعادة التوجيه" -#: pretix/api/models.py:43 pretix/base/models/customers.py:426 +#: pretix/api/models.py:43 pretix/base/models/customers.py:446 msgid "Allowed URIs list, space separated" msgstr "قائمة العناوين المسموح بها, مفصولة بمسافة" @@ -193,7 +193,7 @@ msgstr "قائمة العناوين المسموح بها, مفصولة بمسا msgid "Allowed Post Logout URIs list, space separated" msgstr "قائمة العناوين المسموح بها بعد تسجيل الخروج، مفصولة بمسافة" -#: pretix/api/models.py:51 pretix/base/models/customers.py:406 +#: pretix/api/models.py:51 pretix/base/models/customers.py:426 #: pretix/plugins/paypal/payment.py:114 pretix/plugins/paypal2/payment.py:111 msgid "Client ID" msgstr "هوية العميل" @@ -221,8 +221,8 @@ msgstr "كل الفعاليات (بما في ذلك تلك التي تم إنش msgid "Limit to events" msgstr "حد على الفعاليات" -#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:285 -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/api/models.py:120 pretix/base/exporters/orderlist.py:286 +#: 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 @@ -230,16 +230,16 @@ msgstr "حد على الفعاليات" #: 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/checkinlists/exporters.py:524 +#: pretix/plugins/checkinlists/exporters.py:525 msgid "Comment" msgstr "تعليق" -#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1466 +#: pretix/api/serializers/cart.py:168 pretix/api/serializers/order.py:1471 #, python-brace-format msgid "The product \"{}\" is not assigned to a quota." msgstr "لم يتم تعيين حصة للمنتج \"{}\"." -#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1722 +#: pretix/api/serializers/checkin.py:65 pretix/base/models/event.py:1718 #: pretix/base/models/items.py:1917 pretix/base/models/items.py:2203 msgid "One or more items do not belong to this event." msgstr "هناك عنصر أو أكثر لا ينتمي إلى هذه الفعالية." @@ -351,30 +351,30 @@ msgstr "توجد وسيلة بنفس المعرف والنوع في حساب ا msgid "\"{input}\" is not a valid choice." msgstr "\"{input}\" ادخال غير صالحة، يرجى المحاولة مرة أخرى." -#: pretix/api/serializers/order.py:1427 pretix/api/views/cart.py:224 -#: pretix/base/services/orders.py:1589 +#: pretix/api/serializers/order.py:1432 pretix/api/views/cart.py:224 +#: pretix/base/services/orders.py:1619 #, python-brace-format msgid "The selected seat \"{seat}\" is not available." msgstr "المقعد المحدد \"{seat}\" غير متوفر." -#: pretix/api/serializers/order.py:1453 pretix/api/serializers/order.py:1460 +#: pretix/api/serializers/order.py:1458 pretix/api/serializers/order.py:1465 #, python-brace-format msgid "The product \"{}\" is not available on this date." msgstr "المنتج \"{}\" غير متوفر في هذا التاريخ." -#: pretix/api/serializers/order.py:1475 pretix/api/views/cart.py:200 +#: pretix/api/serializers/order.py:1480 pretix/api/views/cart.py:200 #, python-brace-format msgid "" "There is not enough quota available on quota \"{}\" to perform the operation." msgstr "لا توجد حصة كافية متاحة في الحصة \"{}\" لإجراء العملية." #: pretix/api/serializers/organizer.py:145 -#: pretix/control/forms/organizer.py:893 pretix/presale/forms/customer.py:458 +#: pretix/control/forms/organizer.py:925 pretix/presale/forms/customer.py:458 msgid "An account with this email address is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." #: pretix/api/serializers/organizer.py:278 -#: pretix/control/forms/organizer.py:746 +#: pretix/control/forms/organizer.py:761 msgid "" "A gift card with the same secret already exists in your or an affiliated " "organizer account." @@ -404,30 +404,30 @@ msgstr "تم استخدام رمز كود الخصم هذا سابقا لأقص msgid "Medium connected to other event" msgstr "الوسيط متصل بحدث آخر" -#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:754 +#: pretix/api/views/oauth.py:107 pretix/control/logdisplay.py:755 #, 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:1601 -#: pretix/presale/views/order.py:733 pretix/presale/views/order.py:806 +#: pretix/api/views/order.py:608 pretix/control/views/orders.py:1603 +#: 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:1603 -#: pretix/presale/views/order.py:735 pretix/presale/views/order.py:808 +#: pretix/api/views/order.py:613 pretix/control/views/orders.py:1605 +#: 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:1762 +#: pretix/api/views/order.py:639 pretix/control/views/orders.py:1764 #: 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:790 +#: pretix/base/services/orders.py:191 pretix/presale/views/order.py:800 msgid "One of the selected products is not available in the selected country." msgstr "أحد المنتجات المختارة غير متوفر في البلد المحدد." @@ -446,7 +446,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:1562 +#: pretix/control/views/orders.py:1564 msgid "Order canceled" msgstr "تم إلغاء الطلب" @@ -669,14 +669,14 @@ msgid "Customer account anonymized" msgstr "تم طمس هويتها لهذا المستخدم." #: pretix/base/addressvalidation.py:100 pretix/base/addressvalidation.py:103 -#: pretix/base/addressvalidation.py:108 pretix/base/forms/questions.py:1046 -#: pretix/base/forms/questions.py:1077 pretix/base/forms/questions.py:1329 -#: pretix/base/payment.py:96 pretix/control/forms/event.py:792 +#: 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:1454 pretix/control/forms/mailsetup.py:87 +#: pretix/control/forms/event.py:1455 pretix/control/forms/mailsetup.py:87 #: pretix/control/forms/mailsetup.py:129 pretix/control/forms/subevents.py:181 -#: pretix/plugins/banktransfer/payment.py:506 -#: pretix/plugins/banktransfer/payment.py:512 +#: pretix/plugins/banktransfer/payment.py:507 +#: pretix/plugins/banktransfer/payment.py:513 #: pretix/presale/forms/customer.py:152 msgid "This field is required." msgstr "هذه الخانة مطلوبة." @@ -695,21 +695,21 @@ msgid "{system} User" msgstr "{system} اسم المستخدم" #: pretix/base/auth.py:155 pretix/base/exporters/customers.py:67 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:453 -#: pretix/base/exporters/orderlist.py:586 -#: pretix/base/exporters/waitinglist.py:109 pretix/base/forms/auth.py:257 +#: 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/models/customers.py:94 pretix/base/models/notifications.py:46 +#: pretix/base/models/customers.py:101 pretix/base/models/notifications.py:46 #: pretix/base/models/orders.py:246 pretix/base/pdf.py:336 #: 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 #: pretix/control/templates/pretixcontrol/orders/fragment_export_schedule_form.html:108 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:49 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:50 #: pretix/control/templates/pretixcontrol/organizers/customers.html:59 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:161 -#: pretix/plugins/checkinlists/exporters.py:508 +#: pretix/plugins/checkinlists/exporters.py:509 #: pretix/presale/checkoutflow.py:1542 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 @@ -721,7 +721,7 @@ 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/models/customers.py:96 pretix/control/forms/mailsetup.py:57 +#: pretix/base/models/customers.py:103 pretix/control/forms/mailsetup.py:57 #: pretix/presale/forms/customer.py:61 pretix/presale/forms/customer.py:302 msgid "Password" msgstr "كلمة المرور" @@ -818,9 +818,9 @@ 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:743 -#: pretix/presale/views/customer.py:753 pretix/presale/views/customer.py:792 -#: pretix/presale/views/customer.py:866 +#: pretix/base/customersso/oidc.py:278 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 "" @@ -831,21 +831,21 @@ msgid "" "the email address in your customer account." msgstr "" -#: pretix/base/datasync/datasync.py:255 +#: pretix/base/datasync/datasync.py:263 #, python-brace-format msgid "" "Field \"{field_name}\" does not exist. Please check your {provider_name} " "settings." msgstr "" -#: pretix/base/datasync/datasync.py:262 +#: pretix/base/datasync/datasync.py:270 #, python-brace-format msgid "" "Field \"{field_name}\" requires {required_input}, but only got " "{available_inputs}. Please check your {provider_name} settings." msgstr "" -#: pretix/base/datasync/datasync.py:273 +#: pretix/base/datasync/datasync.py:281 #, python-brace-format msgid "" "Please update value mapping for field \"{field_name}\" - option \"{val}\" " @@ -913,16 +913,16 @@ msgid "Event or date information" msgstr "إرسال معلومات الاسترداد" #: pretix/base/datasync/sourcefields.py:175 -#: pretix/base/exporters/orderlist.py:604 -#: pretix/base/exporters/orderlist.py:609 pretix/base/forms/questions.py:679 -#: pretix/base/modelimport_orders.py:347 pretix/base/models/customers.py:300 +#: 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/control/forms/filter.py:679 pretix/control/forms/organizer.py:987 +#: pretix/control/forms/filter.py:679 pretix/control/forms/organizer.py:1019 #: pretix/control/templates/pretixcontrol/order/index.html:566 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:120 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:121 #: pretix/control/views/item.py:442 pretix/plugins/badges/exporters.py:495 #: pretix/plugins/checkinlists/exporters.py:121 -#: pretix/plugins/checkinlists/exporters.py:494 +#: pretix/plugins/checkinlists/exporters.py:495 #: pretix/plugins/ticketoutputpdf/exporters.py:94 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:162 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165 @@ -941,8 +941,8 @@ msgid "Attendee" msgstr "اسم الحاضر" #: pretix/base/datasync/sourcefields.py:207 -#: pretix/base/exporters/orderlist.py:611 pretix/base/forms/questions.py:685 -#: pretix/base/models/customers.py:307 pretix/base/models/orders.py:1512 +#: 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 @@ -995,30 +995,30 @@ msgid "Invoice address company" msgstr "شركة عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:288 -#: pretix/base/exporters/orderlist.py:464 -#: pretix/base/exporters/orderlist.py:469 -#: pretix/base/exporters/orderlist.py:653 -#: pretix/base/exporters/orderlist.py:657 pretix/base/pdf.py:341 +#: 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 msgid "Invoice address name" msgstr "اسم عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:317 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:351 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:351 msgid "Invoice address street" msgstr "شارع عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:326 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:356 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:356 msgid "Invoice address ZIP code" msgstr "الرمز البريدي لعنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:335 -#: pretix/base/exporters/orderlist.py:659 pretix/base/pdf.py:361 +#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:361 msgid "Invoice address city" msgstr "مدينة عنوان الفاتورة" #: pretix/base/datasync/sourcefields.py:344 -#: pretix/base/exporters/orderlist.py:660 pretix/base/pdf.py:371 +#: pretix/base/exporters/orderlist.py:661 pretix/base/pdf.py:371 msgid "Invoice address country" msgstr "بلد عنوان الفاتورة" @@ -1035,29 +1035,30 @@ msgid "Order email domain" msgstr "اسم المنظم" #: pretix/base/datasync/sourcefields.py:371 -#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:328 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:451 -#: pretix/base/exporters/orderlist.py:583 -#: pretix/base/exporters/orderlist.py:897 pretix/base/models/orders.py:210 +#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: 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/templates/pretixbase/email/order_details.html:61 #: pretix/control/templates/pretixcontrol/checkin/index.html:95 #: pretix/control/templates/pretixcontrol/order/index.html:181 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:116 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:22 #: pretix/control/templates/pretixcontrol/orders/index.html:47 #: pretix/control/templates/pretixcontrol/orders/index.html:131 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:204 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:205 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:41 #: pretix/control/templates/pretixcontrol/search/orders.html:48 #: pretix/plugins/badges/exporters.py:497 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:29 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:41 #: pretix/plugins/checkinlists/exporters.py:122 -#: pretix/plugins/checkinlists/exporters.py:493 -#: pretix/plugins/checkinlists/exporters.py:757 +#: pretix/plugins/checkinlists/exporters.py:494 +#: pretix/plugins/checkinlists/exporters.py:760 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:895 +#: pretix/plugins/reports/exporters.py:896 #: pretix/plugins/ticketoutputpdf/exporters.py:96 msgid "Order code" msgstr "رمز الطلب" @@ -1069,11 +1070,11 @@ msgid "Event and order code" msgstr "تاريخ الطلب" #: pretix/base/datasync/sourcefields.py:389 -#: pretix/base/exporters/orderlist.py:262 pretix/base/notifications.py:201 +#: pretix/base/exporters/orderlist.py:263 pretix/base/notifications.py:201 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:25 #: pretix/control/templates/pretixcontrol/search/orders.html:60 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:898 msgid "Order total" msgstr "إجمالي الطلب" @@ -1084,9 +1085,9 @@ msgid "Product and variation name" msgstr "اسم المنتج ونوعه" #: pretix/base/datasync/sourcefields.py:410 pretix/base/exporters/items.py:57 -#: pretix/base/exporters/orderlist.py:597 -#: pretix/base/exporters/orderlist.py:908 -#: pretix/base/exporters/waitinglist.py:112 +#: pretix/base/exporters/orderlist.py:598 +#: pretix/base/exporters/orderlist.py:910 +#: pretix/base/exporters/waitinglist.py:113 #, fuzzy #| msgid "Product" msgid "Product ID" @@ -1105,10 +1106,10 @@ msgid "Event short form" msgstr "اسم الحدث" #: pretix/base/datasync/sourcefields.py:437 pretix/base/exporters/events.py:57 -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:450 -#: pretix/base/exporters/orderlist.py:582 -#: pretix/base/exporters/waitinglist.py:116 pretix/base/models/event.py:595 +#: pretix/base/exporters/orderlist.py:263 +#: 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/control/forms/filter.py:1724 #: pretix/control/templates/pretixcontrol/events/index.html:68 @@ -1117,22 +1118,22 @@ msgid "Event name" msgstr "اسم الفعالية" #: pretix/base/datasync/sourcefields.py:446 -#: pretix/base/exporters/invoices.py:326 +#: pretix/base/exporters/invoices.py:328 msgid "Event start date" msgstr "تاريخ بدء الفعالية" #: pretix/base/datasync/sourcefields.py:455 -#: pretix/base/exporters/invoices.py:350 pretix/base/pdf.py:289 +#: pretix/base/exporters/invoices.py:352 pretix/base/pdf.py:289 msgid "Event end date" msgstr "تاريخ إنتهاء الفعالية" #: pretix/base/datasync/sourcefields.py:464 -#: pretix/base/exporters/waitinglist.py:123 +#: pretix/base/exporters/waitinglist.py:124 #: pretix/base/modelimport_vouchers.py:39 pretix/base/models/vouchers.py:193 #: pretix/control/templates/pretixcontrol/vouchers/index.html:18 #: pretix/control/templates/pretixcontrol/vouchers/index.html:114 #: pretix/control/views/vouchers.py:119 pretix/control/views/waitinglist.py:314 -#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/plugins/checkinlists/exporters.py:521 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:74 #: pretix/presale/templates/pretixpresale/event/fragment_cart_box.html:76 #: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:12 @@ -1153,7 +1154,7 @@ msgid "Ticket price" msgstr "كلمة سر الزبون" #: pretix/base/datasync/sourcefields.py:491 pretix/base/notifications.py:204 -#: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:85 +#: pretix/control/forms/filter.py:216 pretix/control/forms/modelimport.py:90 msgid "Order status" msgstr "حالة الطلب" @@ -1176,8 +1177,8 @@ msgid "Payment date and time" msgstr "تاريخ ووقت الطباعة" #: pretix/base/datasync/sourcefields.py:527 -#: pretix/base/exporters/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:508 +#: pretix/base/exporters/orderlist.py:272 +#: pretix/base/exporters/orderlist.py:667 pretix/base/modelimport_orders.py:508 #: pretix/control/templates/pretixcontrol/order/index.html:193 #: pretix/control/templates/pretixcontrol/pdf/index.html:249 msgid "Order locale" @@ -1190,7 +1191,7 @@ msgid "Order position ID" msgstr "حالة الطلب" #: pretix/base/datasync/sourcefields.py:545 -#: pretix/base/exporters/orderlist.py:291 +#: pretix/base/exporters/orderlist.py:292 #, fuzzy #| msgid "Order time" msgid "Order link" @@ -1215,21 +1216,21 @@ msgid "Question: {name}" msgstr "سؤال: %(name)s" #: pretix/base/datasync/sourcefields.py:604 -#: pretix/base/datasync/sourcefields.py:614 pretix/base/settings.py:3559 -#: pretix/base/settings.py:3572 pretix/base/settings.py:3588 -#: pretix/base/settings.py:3638 pretix/base/settings.py:3651 -#: pretix/base/settings.py:3665 pretix/base/settings.py:3718 -#: pretix/base/settings.py:3739 pretix/base/settings.py:3761 +#: 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 msgid "Given name" msgstr "الاسم الاول" #: pretix/base/datasync/sourcefields.py:628 -#: pretix/base/datasync/sourcefields.py:638 pretix/base/settings.py:3560 -#: pretix/base/settings.py:3573 pretix/base/settings.py:3589 -#: pretix/base/settings.py:3605 pretix/base/settings.py:3622 -#: pretix/base/settings.py:3637 pretix/base/settings.py:3652 -#: pretix/base/settings.py:3666 pretix/base/settings.py:3719 -#: pretix/base/settings.py:3740 pretix/base/settings.py:3762 +#: 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 msgid "Family name" msgstr "اسم العائلة" @@ -1251,27 +1252,27 @@ msgstr "افتراضي" msgid "Simple with logo" msgstr "بسيط مع الشعار" -#: pretix/base/exporter.py:187 pretix/base/exporter.py:320 +#: pretix/base/exporter.py:199 pretix/base/exporter.py:332 msgid "Export format" msgstr "طريقة التصدير" -#: pretix/base/exporter.py:189 +#: pretix/base/exporter.py:201 msgid "Excel (.xlsx)" msgstr "إكسل (.xlsx)" -#: pretix/base/exporter.py:190 pretix/base/exporter.py:312 +#: pretix/base/exporter.py:202 pretix/base/exporter.py:324 msgid "CSV (with commas)" msgstr "CSV (مع فواصل)" -#: pretix/base/exporter.py:191 pretix/base/exporter.py:313 +#: pretix/base/exporter.py:203 pretix/base/exporter.py:325 msgid "CSV (Excel-style)" msgstr "CSV (نمط إكسل)" -#: pretix/base/exporter.py:192 pretix/base/exporter.py:314 +#: pretix/base/exporter.py:204 pretix/base/exporter.py:326 msgid "CSV (with semicolons)" msgstr "CSV (مع فواصل منقوطة)" -#: pretix/base/exporter.py:308 +#: pretix/base/exporter.py:320 msgid "Combined Excel (.xlsx)" msgstr "إكسل مجمع (.xlsx)" @@ -1283,9 +1284,9 @@ msgstr "إجابات السؤال" #: pretix/base/exporters/answers.py:55 pretix/base/exporters/json.py:52 #: pretix/base/exporters/mail.py:53 pretix/base/exporters/orderlist.py:88 -#: pretix/base/exporters/orderlist.py:841 -#: pretix/base/exporters/orderlist.py:1020 -#: pretix/base/exporters/orderlist.py:1259 +#: pretix/base/exporters/orderlist.py:842 +#: pretix/base/exporters/orderlist.py:1022 +#: pretix/base/exporters/orderlist.py:1263 #: pretix/plugins/reports/exporters.py:489 #: pretix/plugins/reports/exporters.py:662 #, fuzzy @@ -1300,12 +1301,12 @@ msgid "" "customers while creating an order." msgstr "" -#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:592 -#: pretix/base/exporters/orderlist.py:916 -#: pretix/base/exporters/orderlist.py:1156 pretix/base/models/checkin.py:58 +#: 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:3010 pretix/base/models/vouchers.py:190 -#: pretix/base/models/waitinglist.py:61 pretix/control/forms/event.py:1619 +#: 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/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 @@ -1320,8 +1321,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/vouchers/index.html:140 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:167 #: pretix/control/views/waitinglist.py:318 -#: pretix/plugins/checkinlists/exporters.py:512 -#: pretix/plugins/checkinlists/exporters.py:701 +#: pretix/plugins/checkinlists/exporters.py:513 +#: pretix/plugins/checkinlists/exporters.py:703 #: pretix/plugins/sendmail/forms.py:137 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:32 #: pretix/presale/templates/pretixpresale/event/checkout_membership.html:48 @@ -1332,7 +1333,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:1620 +#: pretix/control/forms/checkin.py:83 pretix/control/forms/event.py:1621 #: 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 @@ -1365,8 +1366,8 @@ msgstr "حسابات العملاء" msgid "Download a spreadsheet of all currently registered customer accounts." msgstr "" -#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:82 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:29 +#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:89 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:30 #: pretix/control/templates/pretixcontrol/organizers/customers.html:54 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:37 #: pretix/presale/templates/pretixpresale/organizers/customer_base.html:37 @@ -1377,14 +1378,14 @@ msgid "Customer ID" msgstr "معرف ضريبة القيمة المضافة للعميل" #: pretix/base/exporters/customers.py:65 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:32 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:33 #, fuzzy #| msgid "Payment provider" msgid "SSO provider" msgstr "مقدم خدمة السداد" -#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:108 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:36 +#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:115 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:37 #: pretix/control/templates/pretixcontrol/organizers/customers.html:65 #: pretix/control/templates/pretixcontrol/users/form.html:49 #, fuzzy @@ -1392,18 +1393,18 @@ msgstr "مقدم خدمة السداد" msgid "External identifier" msgstr "معرف داخلي" -#: pretix/base/exporters/customers.py:68 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/modelimport_orders.py:87 pretix/base/models/customers.py:95 -#: pretix/base/models/customers.py:396 pretix/base/models/items.py:1659 +#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/orderlist.py:455 +#: 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/orders.py:250 pretix/base/models/waitinglist.py:80 #: pretix/base/pdf.py:331 #: 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:509 +#: pretix/plugins/checkinlists/exporters.py:510 #: pretix/presale/checkoutflow.py:1548 pretix/presale/forms/checkout.py:84 #: pretix/presale/forms/waitinglist.py:80 #: pretix/presale/templates/pretixpresale/event/order.html:304 @@ -1411,32 +1412,32 @@ msgid "Phone number" msgstr "رقم الجوال" #: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:246 -#: pretix/base/models/customers.py:97 pretix/base/models/orders.py:3281 -#: pretix/base/settings.py:3692 pretix/base/settings.py:3704 +#: pretix/base/models/customers.py:104 pretix/base/models/orders.py:3295 +#: pretix/base/settings.py:3721 pretix/base/settings.py:3733 #: pretix/control/templates/pretixcontrol/users/index.html:47 msgid "Full name" msgstr "الاسم الكامل" -#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:206 -#: pretix/base/exporters/invoices.py:214 pretix/base/exporters/invoices.py:332 -#: pretix/base/exporters/invoices.py:340 pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/waitinglist.py:108 pretix/base/forms/questions.py:1244 +#: 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/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:1766 +#: 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/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:3317 -#: pretix/base/settings.py:3327 pretix/base/settings.py:3681 +#: 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/control/forms/organizer.py:918 +#: 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/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/organizers/customer.html:58 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:59 #: pretix/control/templates/pretixcontrol/organizers/customers.html:62 #: pretix/control/templates/pretixcontrol/organizers/devices.html:77 #: pretix/control/templates/pretixcontrol/organizers/membershiptypes.html:26 @@ -1448,8 +1449,8 @@ msgstr "الاسم الكامل" #: pretix/control/views/waitinglist.py:314 pretix/plugins/badges/models.py:53 #: pretix/plugins/badges/templates/pretixplugins/badges/index.html:34 #: pretix/plugins/checkinlists/exporters.py:376 -#: pretix/plugins/checkinlists/exporters.py:761 -#: pretix/plugins/reports/exporters.py:896 +#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/reports/exporters.py:897 #: pretix/plugins/ticketoutputpdf/models.py:333 #: pretix/plugins/ticketoutputpdf/templates/pretixplugins/ticketoutputpdf/index.html:32 #: pretix/presale/forms/customer.py:179 pretix/presale/forms/customer.py:483 @@ -1461,43 +1462,43 @@ msgstr "الاسم الكامل" msgid "Name" msgstr "اسم" -#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:99 +#: pretix/base/exporters/customers.py:77 pretix/base/models/customers.py:106 msgid "Account active" msgstr "حساب نشط" -#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:100 +#: pretix/base/exporters/customers.py:78 pretix/base/models/customers.py:107 msgid "Verified email address" msgstr "تم التحقق من عنوان البريد الإلكتروني" -#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:101 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:68 +#: pretix/base/exporters/customers.py:79 pretix/base/models/customers.py:108 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:69 msgid "Last login" msgstr "آخر تسجيل دخول" -#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:102 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:66 +#: pretix/base/exporters/customers.py:80 pretix/base/models/customers.py:109 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:67 msgid "Registration date" msgstr "تاريخ التسجيل" -#: pretix/base/exporters/customers.py:81 pretix/base/exporters/invoices.py:205 -#: pretix/base/exporters/waitinglist.py:120 pretix/base/models/auth.py:258 -#: pretix/base/models/customers.py:106 pretix/base/models/exports.py:54 -#: pretix/control/forms/event.py:1625 pretix/control/forms/exports.py:49 +#: 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/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/exports.py:88 pretix/control/views/waitinglist.py:315 msgid "Language" msgstr "اللغة" #: pretix/base/exporters/customers.py:82 -#: pretix/base/exporters/reusablemedia.py:53 -#: pretix/base/models/customers.py:109 pretix/base/models/media.py:110 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:72 +#: pretix/base/exporters/reusablemedia.py:54 +#: pretix/base/models/customers.py:116 pretix/base/models/media.py:110 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:73 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:68 msgid "Notes" msgstr "" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:305 pretix/base/exporters/items.py:150 +#: pretix/base/exporters/invoices.py:307 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 @@ -1512,51 +1513,51 @@ msgstr "" #: pretix/base/exporters/items.py:213 pretix/base/exporters/items.py:214 #: pretix/base/exporters/items.py:215 pretix/base/exporters/items.py:218 #: pretix/base/exporters/items.py:221 pretix/base/exporters/items.py:222 -#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:395 -#: pretix/base/exporters/orderlist.py:400 -#: pretix/base/exporters/orderlist.py:752 -#: pretix/base/exporters/orderlist.py:775 -#: pretix/base/exporters/orderlist.py:807 -#: pretix/base/exporters/orderlist.py:1399 -#: pretix/base/exporters/reusablemedia.py:63 pretix/base/modelimport.py:194 +#: pretix/base/exporters/items.py:223 pretix/base/exporters/orderlist.py:396 +#: pretix/base/exporters/orderlist.py:401 +#: pretix/base/exporters/orderlist.py:753 +#: 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:194 #: pretix/base/modelimport.py:201 pretix/base/models/orders.py:1401 -#: pretix/base/models/orders.py:3427 pretix/control/forms/filter.py:177 +#: pretix/base/models/orders.py:3441 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/views/vouchers.py:140 -#: pretix/plugins/checkinlists/exporters.py:601 -#: pretix/plugins/checkinlists/exporters.py:604 -#: pretix/plugins/checkinlists/exporters.py:631 -#: pretix/plugins/checkinlists/exporters.py:647 -#: pretix/plugins/checkinlists/exporters.py:716 -#: pretix/plugins/checkinlists/exporters.py:823 -#: pretix/plugins/checkinlists/exporters.py:824 -#: pretix/plugins/checkinlists/exporters.py:825 +#: pretix/plugins/checkinlists/exporters.py:602 +#: pretix/plugins/checkinlists/exporters.py:605 +#: pretix/plugins/checkinlists/exporters.py:632 +#: pretix/plugins/checkinlists/exporters.py:648 +#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:826 +#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:828 msgid "Yes" msgstr "نعم" #: pretix/base/exporters/customers.py:100 #: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83 -#: pretix/base/exporters/invoices.py:305 pretix/base/exporters/orderlist.py:395 -#: pretix/base/exporters/orderlist.py:400 -#: pretix/base/exporters/orderlist.py:775 -#: pretix/base/exporters/orderlist.py:807 -#: pretix/base/exporters/orderlist.py:1399 -#: pretix/base/exporters/reusablemedia.py:63 pretix/base/modelimport.py:193 +#: pretix/base/exporters/invoices.py:307 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:3429 pretix/control/forms/filter.py:177 +#: pretix/base/models/orders.py:3443 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/views/vouchers.py:140 -#: pretix/plugins/checkinlists/exporters.py:601 -#: pretix/plugins/checkinlists/exporters.py:604 -#: pretix/plugins/checkinlists/exporters.py:631 -#: pretix/plugins/checkinlists/exporters.py:716 -#: pretix/plugins/checkinlists/exporters.py:823 -#: pretix/plugins/checkinlists/exporters.py:824 -#: pretix/plugins/checkinlists/exporters.py:825 +#: pretix/plugins/checkinlists/exporters.py:602 +#: pretix/plugins/checkinlists/exporters.py:605 +#: pretix/plugins/checkinlists/exporters.py:632 +#: pretix/plugins/checkinlists/exporters.py:718 +#: pretix/plugins/checkinlists/exporters.py:826 +#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:828 msgid "No" msgstr "لا" @@ -1579,14 +1580,14 @@ msgid "Event ticket {event}-{code}" msgstr "تذكرة الفعالية {event}-{code}" #: pretix/base/exporters/dekodi.py:234 pretix/base/exporters/invoices.py:74 -#: pretix/base/exporters/orderlist.py:129 -#: pretix/base/exporters/orderlist.py:855 -#: pretix/base/exporters/orderlist.py:1209 +#: pretix/base/exporters/orderlist.py:130 +#: pretix/base/exporters/orderlist.py:857 +#: pretix/base/exporters/orderlist.py:1213 #: pretix/plugins/checkinlists/exporters.py:89 -#: pretix/plugins/checkinlists/exporters.py:865 +#: pretix/plugins/checkinlists/exporters.py:868 #: pretix/plugins/reports/accountingreport.py:75 #: pretix/plugins/reports/exporters.py:472 -#: pretix/plugins/reports/exporters.py:709 +#: pretix/plugins/reports/exporters.py:710 #: pretix/plugins/ticketoutputpdf/exporters.py:85 #, fuzzy #| msgid "Date and time" @@ -1644,21 +1645,21 @@ 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:3315 -#: pretix/base/settings.py:3325 pretix/control/forms/subevents.py:483 +#: pretix/base/models/event.py:1526 pretix/base/settings.py:3344 +#: pretix/base/settings.py:3354 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/control/forms/subevents.py:488 +#: 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:493 +#: pretix/base/models/event.py:1530 pretix/control/forms/subevents.py:494 #: pretix/control/templates/pretixcontrol/subevents/bulk.html:274 msgid "Admission time" msgstr "وقت قبول التسجيل" @@ -1673,8 +1674,9 @@ msgstr "بداية عرض ما قبل البيع" msgid "End of presale" msgstr "نهاية عرض ما قبل البيع" -#: pretix/base/exporters/events.py:67 pretix/base/exporters/invoices.py:351 +#: 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/templates/pretixbase/email/order_details.html:83 msgid "Location" msgstr "الموقع" @@ -1700,7 +1702,7 @@ msgid "Internal comment" msgstr "ملاحظة داخلية" #: pretix/base/exporters/invoices.py:82 pretix/base/models/orders.py:1753 -#: pretix/base/models/orders.py:2173 pretix/control/forms/filter.py:209 +#: pretix/base/models/orders.py:2187 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 @@ -1738,18 +1740,18 @@ msgstr "جميع الفواتير" msgid "Download all invoices created by the system as a ZIP file of PDF files." msgstr "" -#: pretix/base/exporters/invoices.py:178 +#: pretix/base/exporters/invoices.py:179 msgid "Invoice data" msgstr "بيانات الفاتورة" -#: pretix/base/exporters/invoices.py:179 +#: pretix/base/exporters/invoices.py:180 msgid "" "Download a spreadsheet with the data of all invoices created by the system. " "The spreadsheet includes two sheets, one with a line for every invoice, and " "one with a line for every position of every invoice." msgstr "" -#: pretix/base/exporters/invoices.py:191 pretix/base/shredder.py:579 +#: 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/organizers/edit.html:312 @@ -1758,244 +1760,245 @@ msgstr "" msgid "Invoices" msgstr "فواتير" -#: pretix/base/exporters/invoices.py:192 +#: pretix/base/exporters/invoices.py:194 msgid "Invoice lines" msgstr "أسطر الفاتورة" -#: pretix/base/exporters/invoices.py:199 pretix/base/exporters/invoices.py:318 +#: pretix/base/exporters/invoices.py:201 pretix/base/exporters/invoices.py:320 msgid "Invoice number" msgstr "رقم الفاتورة" -#: pretix/base/exporters/invoices.py:200 pretix/base/exporters/invoices.py:327 -#: pretix/base/exporters/orderlist.py:1232 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/waitinglist.py:107 pretix/base/forms/widgets.py:213 +#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: 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:2985 pretix/base/models/orders.py:3105 +#: pretix/base/models/orders.py:2999 pretix/base/models/orders.py:3119 +#: 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 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:72 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:80 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:11 -#: pretix/plugins/checkinlists/exporters.py:753 +#: pretix/plugins/checkinlists/exporters.py:756 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:6 #: pretix/presale/templates/pretixpresale/organizers/calendar_day.html:58 msgid "Date" msgstr "التاريخ" -#: pretix/base/exporters/invoices.py:202 pretix/base/exporters/invoices.py:329 +#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 #: pretix/base/forms/auth.py:160 pretix/base/modelimport_orders.py:59 -#: pretix/base/models/customers.py:395 pretix/base/models/waitinglist.py:76 +#: pretix/base/models/customers.py:415 pretix/base/models/waitinglist.py:76 #: pretix/control/forms/filter.py:584 #: pretix/control/templates/pretixcontrol/users/index.html:42 #: pretix/control/views/waitinglist.py:314 msgid "Email address" msgstr "عنوان البريد الإلكتروني" -#: pretix/base/exporters/invoices.py:203 pretix/base/exporters/invoices.py:330 +#: pretix/base/exporters/invoices.py:205 pretix/base/exporters/invoices.py:332 msgid "Invoice type" msgstr "نوع الفاتورة" -#: pretix/base/exporters/invoices.py:204 pretix/base/exporters/invoices.py:331 +#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:333 msgid "Cancellation of" msgstr "إلغاء ل" -#: pretix/base/exporters/invoices.py:206 pretix/base/exporters/invoices.py:207 #: 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:332 -#: pretix/base/exporters/invoices.py:333 pretix/base/exporters/invoices.py:334 +#: 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 msgid "Invoice sender:" msgstr "مرسل الفاتورة:" -#: pretix/base/exporters/invoices.py:207 pretix/base/exporters/invoices.py:333 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:613 pretix/base/forms/questions.py:704 +#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:335 +#: 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:311 pretix/base/models/orders.py:1539 -#: pretix/base/models/orders.py:3283 pretix/control/forms/filter.py:660 +#: 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/control/forms/filter.py:691 #: pretix/control/templates/pretixcontrol/order/index.html:1001 -#: pretix/plugins/checkinlists/exporters.py:535 -#: pretix/plugins/reports/exporters.py:851 +#: pretix/plugins/checkinlists/exporters.py:536 +#: pretix/plugins/reports/exporters.py:852 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88 #: pretix/presale/templates/pretixpresale/event/order.html:316 msgid "Address" msgstr "العنوان" -#: 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:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:614 pretix/base/forms/questions.py:715 +#: 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/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:312 pretix/base/models/orders.py:1540 -#: pretix/base/models/orders.py:3284 pretix/base/settings.py:1162 +#: pretix/base/models/customers.py:332 pretix/base/models/orders.py:1540 +#: pretix/base/models/orders.py:3298 pretix/base/settings.py:1191 #: pretix/control/forms/filter.py:664 pretix/control/forms/filter.py:695 #: pretix/control/views/item.py:488 -#: pretix/plugins/checkinlists/exporters.py:536 -#: pretix/plugins/reports/exporters.py:852 +#: pretix/plugins/checkinlists/exporters.py:537 +#: pretix/plugins/reports/exporters.py:853 msgid "ZIP code" msgstr "الرمز البريدي" -#: pretix/base/exporters/invoices.py:209 pretix/base/exporters/invoices.py:217 -#: pretix/base/exporters/invoices.py:335 pretix/base/exporters/invoices.py:343 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:615 pretix/base/forms/questions.py:723 +#: 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/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:313 pretix/base/models/orders.py:1541 -#: pretix/base/models/orders.py:3285 pretix/base/settings.py:1174 +#: pretix/base/models/customers.py:333 pretix/base/models/orders.py:1541 +#: pretix/base/models/orders.py:3299 pretix/base/settings.py:1203 #: pretix/control/forms/filter.py:669 pretix/control/forms/filter.py:700 #: pretix/control/views/item.py:498 -#: pretix/plugins/checkinlists/exporters.py:537 -#: pretix/plugins/reports/exporters.py:853 +#: pretix/plugins/checkinlists/exporters.py:538 +#: pretix/plugins/reports/exporters.py:854 msgid "City" 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/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:616 pretix/base/forms/questions.py:735 +#: 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/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:314 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3286 pretix/base/models/orders.py:3287 -#: pretix/base/settings.py:1183 pretix/control/forms/filter.py:674 +#: 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/control/forms/filter.py:705 #: pretix/control/templates/pretixcontrol/order/index.html:1005 #: pretix/control/views/item.py:508 -#: pretix/plugins/checkinlists/exporters.py:538 -#: pretix/plugins/reports/exporters.py:803 -#: pretix/plugins/reports/exporters.py:848 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/checkinlists/exporters.py:539 +#: pretix/plugins/reports/exporters.py:804 +#: pretix/plugins/reports/exporters.py:849 +#: pretix/plugins/reports/exporters.py:898 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:92 #: pretix/presale/templates/pretixpresale/event/order.html:320 msgid "Country" msgstr "الدولة" -#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:337 +#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 msgid "Tax ID" 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/orderlist.py:271 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:662 pretix/base/modelimport_orders.py:321 -#: pretix/base/models/orders.py:3290 +#: 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/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/plugins/reports/exporters.py:855 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:856 +#: pretix/plugins/reports/exporters.py:898 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:99 #: pretix/presale/templates/pretixpresale/event/order.html:327 msgid "VAT ID" msgstr "رقم تعريف ضريبة القيمة المضافة" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:214 #: 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:339 pretix/base/exporters/invoices.py:340 +#: 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: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 msgid "Invoice recipient:" msgstr "مستلم الفاتورة:" -#: pretix/base/exporters/invoices.py:213 pretix/base/exporters/invoices.py:339 -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:463 -#: pretix/base/exporters/orderlist.py:612 -#: pretix/base/exporters/orderlist.py:652 pretix/base/forms/questions.py:696 +#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: 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/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/plugins/checkinlists/exporters.py:519 -#: pretix/plugins/reports/exporters.py:850 -#: pretix/plugins/reports/exporters.py:896 +#: pretix/plugins/checkinlists/exporters.py:520 +#: pretix/plugins/reports/exporters.py:851 +#: pretix/plugins/reports/exporters.py:897 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83 #: pretix/presale/templates/pretixpresale/event/order.html:308 msgid "Company" msgstr "الشركة" -#: pretix/base/exporters/invoices.py:215 pretix/base/exporters/invoices.py:341 +#: pretix/base/exporters/invoices.py:217 pretix/base/exporters/invoices.py:343 msgid "Street address" msgstr "عنوان الشارع" -#: pretix/base/exporters/invoices.py:219 pretix/base/exporters/invoices.py:345 -#: pretix/base/exporters/orderlist.py:270 -#: pretix/base/exporters/orderlist.py:471 -#: pretix/base/exporters/orderlist.py:617 pretix/base/forms/questions.py:760 -#: pretix/base/forms/questions.py:1194 pretix/base/modelimport_orders.py:295 -#: pretix/base/models/customers.py:315 pretix/base/models/orders.py:1543 -#: pretix/base/models/orders.py:3289 pretix/base/views/js_helpers.py:48 +#: 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:539 -#: pretix/plugins/reports/exporters.py:854 +#: 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:221 pretix/base/exporters/invoices.py:347 -#: pretix/base/models/orders.py:3299 pretix/base/models/orders.py:3355 +#: 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/presale/templates/pretixpresale/event/checkout_confirm.html:103 msgid "Beneficiary" msgstr "المستفيد" -#: pretix/base/exporters/invoices.py:222 pretix/base/exporters/invoices.py:348 -#: pretix/base/modelimport_orders.py:333 pretix/base/models/orders.py:3294 +#: 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/presale/templates/pretixpresale/event/checkout_confirm.html:111 msgid "Internal reference" msgstr "المرجع الداخلي" -#: pretix/base/exporters/invoices.py:223 pretix/base/models/tax.py:162 -#: pretix/control/forms/event.py:1515 +#: pretix/base/exporters/invoices.py:225 pretix/base/models/tax.py:162 +#: pretix/control/forms/event.py:1516 msgid "Reverse charge" msgstr "التكلفة العكسية" -#: pretix/base/exporters/invoices.py:224 +#: pretix/base/exporters/invoices.py:226 msgid "Shown foreign currency" msgstr "العملات الأجنبية المعروضة" -#: pretix/base/exporters/invoices.py:225 +#: pretix/base/exporters/invoices.py:227 msgid "Foreign currency rate" msgstr "أسعار العملات الأجنبية" -#: pretix/base/exporters/invoices.py:226 +#: pretix/base/exporters/invoices.py:228 msgid "Total value (with taxes)" msgstr "القيمة الإجمالية (مع الضرائب)" -#: pretix/base/exporters/invoices.py:227 +#: pretix/base/exporters/invoices.py:229 msgid "Total value (without taxes)" msgstr "القيمة الإجمالية (بدون الضرائب)" -#: pretix/base/exporters/invoices.py:228 +#: pretix/base/exporters/invoices.py:230 msgid "Payment matching IDs" msgstr "معرفات مطابقة الدفع" -#: pretix/base/exporters/invoices.py:229 pretix/base/exporters/invoices.py:349 -#: pretix/base/exporters/orderlist.py:290 -#: pretix/base/exporters/orderlist.py:475 -#: pretix/base/exporters/orderlist.py:670 pretix/base/plugins.py:137 +#: pretix/base/exporters/invoices.py:231 pretix/base/exporters/invoices.py:351 +#: pretix/base/exporters/orderlist.py:291 +#: pretix/base/exporters/orderlist.py:476 +#: pretix/base/exporters/orderlist.py:671 pretix/base/plugins.py:139 #: pretix/control/templates/pretixcontrol/event/payment.html:11 msgid "Payment providers" msgstr "مزودي خدمات الدفع" -#: pretix/base/exporters/invoices.py:285 pretix/base/exporters/invoices.py:388 +#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 msgid "Cancellation" msgstr "إلغاء" -#: pretix/base/exporters/invoices.py:285 pretix/base/exporters/invoices.py:388 +#: pretix/base/exporters/invoices.py:287 pretix/base/exporters/invoices.py:390 #: 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 @@ -2003,44 +2006,44 @@ msgstr "إلغاء" msgid "Invoice" msgstr "فاتورة" -#: pretix/base/exporters/invoices.py:319 +#: pretix/base/exporters/invoices.py:321 msgid "Line number" msgstr "رقم السطر" -#: pretix/base/exporters/invoices.py:320 pretix/base/exporters/orderlist.py:458 +#: 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/control/templates/pretixcontrol/pdf/placeholders.html:32 msgid "Description" msgstr "الوصف" -#: pretix/base/exporters/invoices.py:321 pretix/control/forms/orders.py:355 +#: pretix/base/exporters/invoices.py:323 pretix/control/forms/orders.py:355 msgid "Gross price" msgstr "السعر الإجمالي" -#: pretix/base/exporters/invoices.py:322 +#: pretix/base/exporters/invoices.py:324 msgid "Net price" msgstr "السعر الصافي" -#: pretix/base/exporters/invoices.py:323 pretix/base/exporters/orderlist.py:462 -#: pretix/base/exporters/orderlist.py:603 -#: pretix/base/exporters/orderlist.py:922 pretix/base/models/orders.py:2337 -#: pretix/base/models/orders.py:2509 pretix/base/models/orders.py:3031 +#: pretix/base/exporters/invoices.py:325 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 msgid "Tax value" msgstr "قيمة الضريبة" -#: pretix/base/exporters/invoices.py:324 pretix/base/exporters/orderlist.py:460 -#: pretix/base/exporters/orderlist.py:601 -#: pretix/base/exporters/orderlist.py:919 pretix/base/models/orders.py:2324 -#: pretix/base/models/orders.py:2496 pretix/base/models/orders.py:3018 -#: pretix/base/models/orders.py:3118 pretix/base/models/tax.py:348 +#: pretix/base/exporters/invoices.py:326 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/control/templates/pretixcontrol/order/transactions.html:21 #: pretix/plugins/reports/accountingreport.py:316 -#: pretix/plugins/reports/exporters.py:804 -#: pretix/plugins/reports/exporters.py:849 +#: pretix/plugins/reports/exporters.py:805 +#: pretix/plugins/reports/exporters.py:850 msgid "Tax rate" msgstr "معدل الضريبة" -#: pretix/base/exporters/invoices.py:325 +#: pretix/base/exporters/invoices.py:327 msgid "Tax name" msgstr "الاسم الضريبي" @@ -2050,7 +2053,7 @@ msgstr "الاسم الضريبي" msgid "Product data" msgstr "اسم المنتج" -#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1146 +#: pretix/base/exporters/items.py:50 pretix/base/exporters/orderlist.py:1149 #, fuzzy #| msgid "Product name" msgctxt "export_category" @@ -2061,9 +2064,9 @@ msgstr "اسم المنتج" msgid "Download a spreadsheet with details about all products and variations." msgstr "" -#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:599 -#: pretix/base/exporters/orderlist.py:910 -#: pretix/base/exporters/waitinglist.py:114 +#: pretix/base/exporters/items.py:58 pretix/base/exporters/orderlist.py:600 +#: pretix/base/exporters/orderlist.py:912 +#: pretix/base/exporters/waitinglist.py:115 #, fuzzy #| msgid "Variation" msgid "Variation ID" @@ -2087,16 +2090,16 @@ msgstr "الاسم الداخلي" msgid "Item name" msgstr "اسم العنصر" -#: pretix/base/exporters/items.py:68 pretix/base/exporters/orderlist.py:598 -#: pretix/base/exporters/orderlist.py:911 -#: pretix/base/exporters/waitinglist.py:113 pretix/base/models/items.py:1148 -#: pretix/base/models/orders.py:1495 pretix/base/models/orders.py:3003 -#: pretix/plugins/checkinlists/exporters.py:696 +#: 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/plugins/checkinlists/exporters.py:698 msgid "Variation" msgstr "النوع" -#: pretix/base/exporters/items.py:71 pretix/base/exporters/reusablemedia.py:48 -#: pretix/base/models/customers.py:57 pretix/base/models/customers.py:403 +#: 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 @@ -2111,7 +2114,7 @@ msgid "Active" msgstr "نشط" #: pretix/base/exporters/items.py:72 pretix/base/models/discount.py:77 -#: pretix/control/forms/event.py:976 pretix/control/navigation.py:520 +#: pretix/control/forms/event.py:977 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 @@ -2149,9 +2152,9 @@ msgstr "إنشاء التذاكر" msgid "Generate tickets" msgstr "إنشاء التذاكر" -#: pretix/base/exporters/items.py:79 pretix/base/exporters/orderlist.py:1153 +#: 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:1695 pretix/control/navigation.py:237 +#: pretix/control/forms/event.py:1696 pretix/control/navigation.py:237 #: pretix/control/templates/pretixcontrol/event/settings.html:363 #: pretix/control/templates/pretixcontrol/orders/cancel.html:62 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:6 @@ -2175,21 +2178,21 @@ 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/payment.py:392 pretix/control/forms/subevents.py:323 +#: pretix/base/payment.py:394 pretix/control/forms/subevents.py:323 #: pretix/control/forms/subevents.py:345 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:506 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:507 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:172 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:149 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:150 msgid "Available from" 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/payment.py:398 pretix/control/forms/subevents.py:328 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:511 +#: 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 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:154 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:155 msgid "Available until" msgstr "متاح حتى" @@ -2223,17 +2226,17 @@ msgstr "الحد الأدنى للمبلغ حسب كل طلب" msgid "Maximum amount per order" msgstr "الحد الأقصى حسب كل طلب" -#: pretix/base/exporters/items.py:89 pretix/base/exporters/orderlist.py:283 +#: 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/plugins/checkinlists/exporters.py:523 +#: pretix/plugins/checkinlists/exporters.py:524 msgid "Requires special attention" msgstr "يتطلب اهتماما خاصا" -#: pretix/base/exporters/items.py:90 pretix/base/exporters/orderlist.py:284 +#: 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/plugins/checkinlists/exporters.py:525 +#: pretix/plugins/checkinlists/exporters.py:526 #, fuzzy #| msgid "Check-in list" msgid "Check-in text" @@ -2283,7 +2286,7 @@ msgid "" msgstr "" #: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:498 -#: pretix/plugins/reports/exporters.py:680 +#: pretix/plugins/reports/exporters.py:681 msgid "Filter by status" msgstr "تصنيف حسب الحالة" @@ -2294,56 +2297,57 @@ msgid "" "position, and one with a line for every additional fee charged in an order." msgstr "" -#: pretix/base/exporters/orderlist.py:101 pretix/base/models/orders.py:332 +#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:332 #: 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:198 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:199 #: pretix/plugins/reports/accountingreport.py:671 #: pretix/plugins/reports/accountingreport.py:863 -#: pretix/plugins/reports/exporters.py:668 pretix/plugins/statistics/apps.py:39 +#: 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:102 pretix/base/models/orders.py:2558 +#: pretix/base/exporters/orderlist.py:103 pretix/base/models/orders.py:2572 #: pretix/base/notifications.py:205 msgid "Order positions" msgstr "حالات الطلب" -#: pretix/base/exporters/orderlist.py:103 +#: pretix/base/exporters/orderlist.py:104 msgid "Order fees" msgstr "رسوم الطلب" -#: pretix/base/exporters/orderlist.py:111 +#: pretix/base/exporters/orderlist.py:112 msgid "Only paid orders" msgstr "الطلبات المدفوعة فقط" -#: pretix/base/exporters/orderlist.py:117 +#: pretix/base/exporters/orderlist.py:118 msgid "Include payment amounts" msgstr "تضمين مبالغ الدفع" -#: pretix/base/exporters/orderlist.py:123 +#: pretix/base/exporters/orderlist.py:124 msgid "Show multiple choice answers grouped in one column" msgstr "أظهر إجابات متعددة الخيار، مجمعة في عمود واحد" -#: pretix/base/exporters/orderlist.py:132 -#: pretix/plugins/reports/exporters.py:712 +#: pretix/base/exporters/orderlist.py:133 +#: pretix/plugins/reports/exporters.py:713 #, fuzzy #| msgid "Only include orders created on or after this date." msgid "Only include orders created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." -#: pretix/base/exporters/orderlist.py:136 pretix/base/notifications.py:194 -#: pretix/base/pdf.py:245 pretix/plugins/badges/exporters.py:499 +#: 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/plugins/reports/exporters.py:316 #: pretix/plugins/reports/exporters.py:465 #: pretix/plugins/ticketoutputpdf/exporters.py:97 msgid "Event date" msgstr "تاريخ الفعالية" -#: pretix/base/exporters/orderlist.py:139 +#: pretix/base/exporters/orderlist.py:140 #, fuzzy #| msgid "" #| "Only include orders including at least one ticket for a date on or after " @@ -2355,24 +2359,24 @@ msgstr "" "قم بتضمين الطلبات التي تشمل تذكرة واحدة على الأقل في هذا التاريخ أو بعده. " "سيشمل أيضا تواريخ أخرى في حالة الطلبات المختلطة!" -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:449 -#: pretix/base/exporters/orderlist.py:581 -#: pretix/base/exporters/orderlist.py:894 -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/waitinglist.py:115 pretix/control/forms/event.py:1671 +#: pretix/base/exporters/orderlist.py:263 +#: pretix/base/exporters/orderlist.py:450 +#: pretix/base/exporters/orderlist.py:582 +#: 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/control/forms/organizer.py:116 msgid "Event slug" msgstr "رابط الفعالية" -#: pretix/base/exporters/orderlist.py:262 -#: pretix/base/exporters/orderlist.py:452 -#: pretix/base/exporters/orderlist.py:585 -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1330 -#: pretix/base/exporters/waitinglist.py:122 -#: pretix/base/exporters/waitinglist.py:172 pretix/base/models/orders.py:216 +#: pretix/base/exporters/orderlist.py:263 +#: pretix/base/exporters/orderlist.py:453 +#: pretix/base/exporters/orderlist.py:586 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1335 +#: pretix/base/exporters/waitinglist.py:123 +#: pretix/base/exporters/waitinglist.py:173 pretix/base/models/orders.py:216 #: pretix/control/forms/filter.py:1050 pretix/control/forms/filter.py:1229 #: pretix/control/forms/filter.py:1455 pretix/control/forms/filter.py:1524 #: pretix/control/forms/filter.py:1596 pretix/control/forms/filter.py:1696 @@ -2380,15 +2384,15 @@ 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:83 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:96 #: 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/orders/bulk_action.html:26 #: pretix/control/templates/pretixcontrol/orders/index.html:151 #: pretix/control/templates/pretixcontrol/orders/refunds.html:65 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:39 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:209 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:40 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:210 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:46 #: pretix/control/templates/pretixcontrol/organizers/detail.html:70 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:34 @@ -2401,82 +2405,83 @@ msgstr "رابط الفعالية" #: pretix/control/views/waitinglist.py:314 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control.html:9 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:898 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_inspect.html:34 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:79 msgid "Status" msgstr "حالة" -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:455 -#: pretix/base/exporters/orderlist.py:588 -#: pretix/base/exporters/orderlist.py:898 pretix/base/notifications.py:203 +#: pretix/base/exporters/orderlist.py:264 +#: 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/control/forms/filter.py:2356 #: pretix/control/templates/pretixcontrol/order/index.html:183 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:24 #: pretix/control/templates/pretixcontrol/orders/index.html:140 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:206 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:207 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:45 #: pretix/control/templates/pretixcontrol/search/orders.html:57 #: pretix/plugins/badges/exporters.py:498 #: pretix/plugins/checkinlists/exporters.py:123 -#: pretix/plugins/checkinlists/exporters.py:521 +#: pretix/plugins/checkinlists/exporters.py:522 #: pretix/plugins/reports/exporters.py:509 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:691 -#: pretix/plugins/reports/exporters.py:702 -#: pretix/plugins/reports/exporters.py:895 +#: pretix/plugins/reports/exporters.py:692 +#: pretix/plugins/reports/exporters.py:703 +#: pretix/plugins/reports/exporters.py:896 msgid "Order date" msgstr "تاريخ الطلب" -#: pretix/base/exporters/orderlist.py:263 -#: pretix/base/exporters/orderlist.py:456 -#: pretix/base/exporters/orderlist.py:589 -#: pretix/base/exporters/orderlist.py:899 -#: pretix/plugins/checkinlists/exporters.py:522 +#: pretix/base/exporters/orderlist.py:264 +#: pretix/base/exporters/orderlist.py:457 +#: pretix/base/exporters/orderlist.py:590 +#: pretix/base/exporters/orderlist.py:901 +#: pretix/plugins/checkinlists/exporters.py:523 msgid "Order time" msgstr "توقيت الطلب" -#: pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:272 msgid "Custom address field" msgstr "حقل العنوان المخصص" -#: pretix/base/exporters/orderlist.py:271 +#: pretix/base/exporters/orderlist.py:272 msgid "Date of last payment" msgstr "تاريخ آخر دفع" -#: pretix/base/exporters/orderlist.py:271 pretix/base/services/stats.py:238 +#: pretix/base/exporters/orderlist.py:272 pretix/base/services/stats.py:238 msgid "Fees" msgstr "الرسوم" -#: pretix/base/exporters/orderlist.py:276 +#: pretix/base/exporters/orderlist.py:277 #, python-brace-format msgid "Gross at {rate} % tax" msgstr "الإجمالي في {rate} % ضريبة" -#: pretix/base/exporters/orderlist.py:277 +#: pretix/base/exporters/orderlist.py:278 #, python-brace-format msgid "Net at {rate} % tax" msgstr "صافي {rate} % ضريبة" -#: pretix/base/exporters/orderlist.py:278 +#: pretix/base/exporters/orderlist.py:279 #, python-brace-format msgid "Tax value at {rate} % tax" msgstr "قيمة الضريبة {rate} % ضريبة" -#: pretix/base/exporters/orderlist.py:281 +#: pretix/base/exporters/orderlist.py:282 msgid "Invoice numbers" msgstr "أرقام الفواتير" -#: pretix/base/exporters/orderlist.py:282 -#: pretix/base/exporters/orderlist.py:665 pretix/base/modelimport_orders.py:578 +#: pretix/base/exporters/orderlist.py:283 +#: pretix/base/exporters/orderlist.py:666 pretix/base/modelimport_orders.py:578 #: pretix/control/forms/filter.py:616 #: pretix/control/templates/pretixcontrol/order/index.html:190 msgid "Sales channel" msgstr "قناة المبيعات" -#: pretix/base/exporters/orderlist.py:286 -#: pretix/base/exporters/orderlist.py:630 pretix/base/models/orders.py:277 +#: pretix/base/exporters/orderlist.py:287 +#: pretix/base/exporters/orderlist.py:631 pretix/base/models/orders.py:277 #: pretix/control/forms/filter.py:246 #, fuzzy #| msgctxt "subevent" @@ -2484,78 +2489,78 @@ msgstr "قناة المبيعات" msgid "Follow-up date" msgstr "كل التواريخ" -#: pretix/base/exporters/orderlist.py:287 +#: pretix/base/exporters/orderlist.py:288 #: pretix/control/templates/pretixcontrol/orders/index.html:150 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:208 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:209 msgid "Positions" msgstr "الحالات" -#: pretix/base/exporters/orderlist.py:288 -#: pretix/base/exporters/orderlist.py:667 pretix/base/models/orders.py:321 +#: pretix/base/exporters/orderlist.py:289 +#: pretix/base/exporters/orderlist.py:668 pretix/base/models/orders.py:321 #: pretix/control/forms/filter.py:598 msgid "Email address verified" msgstr "تم التحقق من عنوان البريد الإلكتروني" -#: pretix/base/exporters/orderlist.py:289 -#: pretix/base/exporters/orderlist.py:474 -#: pretix/base/exporters/orderlist.py:668 +#: pretix/base/exporters/orderlist.py:290 +#: pretix/base/exporters/orderlist.py:475 +#: pretix/base/exporters/orderlist.py:669 #, fuzzy #| msgctxt "invoice" #| msgid "Customer VAT ID" msgid "External customer ID" msgstr "معرف ضريبة القيمة المضافة للعميل" -#: pretix/base/exporters/orderlist.py:295 +#: pretix/base/exporters/orderlist.py:296 #, python-brace-format msgid "Paid by {method}" msgstr "تم السداد بواسطة {method}" -#: pretix/base/exporters/orderlist.py:457 -#: pretix/base/exporters/orderlist.py:912 +#: pretix/base/exporters/orderlist.py:458 +#: pretix/base/exporters/orderlist.py:914 msgid "Fee type" msgstr "نوع الرسوم" -#: pretix/base/exporters/orderlist.py:459 -#: pretix/base/exporters/orderlist.py:600 -#: pretix/base/exporters/orderlist.py:918 pretix/base/modelimport_orders.py:467 -#: pretix/base/models/orders.py:1500 pretix/base/models/orders.py:3014 +#: 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/control/templates/pretixcontrol/item/index.html:146 #: pretix/control/templates/pretixcontrol/order/change.html:194 #: pretix/control/templates/pretixcontrol/order/change.html:418 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:496 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:497 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:162 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:139 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:140 #: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 #: pretix/plugins/reports/accountingreport.py:315 msgid "Price" msgstr "السعر" -#: pretix/base/exporters/orderlist.py:461 -#: pretix/base/exporters/orderlist.py:602 -#: pretix/base/exporters/orderlist.py:921 +#: pretix/base/exporters/orderlist.py:462 +#: pretix/base/exporters/orderlist.py:603 +#: pretix/base/exporters/orderlist.py:923 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:9 #: pretix/control/templates/pretixcontrol/event/tax_edit.html:16 #: pretix/control/templates/pretixcontrol/order/change.html:165 msgid "Tax rule" msgstr "قاعدة الضريبة" -#: pretix/base/exporters/orderlist.py:489 -#: pretix/base/exporters/orderlist.py:693 pretix/base/models/orders.py:205 +#: pretix/base/exporters/orderlist.py:490 +#: pretix/base/exporters/orderlist.py:694 pretix/base/models/orders.py:205 msgid "canceled" msgstr "ملغى" -#: pretix/base/exporters/orderlist.py:584 -#: pretix/base/exporters/orderlist.py:905 -#: pretix/plugins/checkinlists/exporters.py:758 +#: pretix/base/exporters/orderlist.py:585 +#: pretix/base/exporters/orderlist.py:907 +#: pretix/plugins/checkinlists/exporters.py:761 msgid "Position ID" msgstr "معرف الحالة" -#: pretix/base/exporters/orderlist.py:593 -#: pretix/base/exporters/orderlist.py:1157 -#: pretix/base/exporters/waitinglist.py:118 pretix/base/forms/questions.py:650 -#: pretix/base/forms/questions.py:659 pretix/base/models/memberships.py:145 +#: pretix/base/exporters/orderlist.py:594 +#: pretix/base/exporters/orderlist.py:1160 +#: pretix/base/exporters/waitinglist.py:119 pretix/base/forms/questions.py:652 +#: 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 @@ -2565,27 +2570,27 @@ msgstr "معرف الحالة" #: pretix/control/templates/pretixcontrol/search/payments.html:83 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:19 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:18 -#: pretix/plugins/checkinlists/exporters.py:513 -#: pretix/plugins/checkinlists/exporters.py:702 +#: pretix/plugins/checkinlists/exporters.py:514 +#: pretix/plugins/checkinlists/exporters.py:704 msgid "Start date" msgstr "تاريخ البداية" -#: pretix/base/exporters/orderlist.py:594 -#: pretix/base/exporters/orderlist.py:1158 -#: pretix/base/exporters/waitinglist.py:119 +#: pretix/base/exporters/orderlist.py:595 +#: pretix/base/exporters/orderlist.py:1161 +#: pretix/base/exporters/waitinglist.py:120 #: pretix/base/models/memberships.py:148 #: pretix/control/templates/pretixcontrol/events/index.html:82 #: pretix/control/templates/pretixcontrol/organizers/detail.html:68 #: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:21 #: pretix/control/templates/pretixcontrol/user/staff_session_list.html:20 -#: pretix/plugins/checkinlists/exporters.py:514 -#: pretix/plugins/checkinlists/exporters.py:703 +#: pretix/plugins/checkinlists/exporters.py:515 +#: pretix/plugins/checkinlists/exporters.py:705 msgid "End date" msgstr "تاريخ الإنتهاء" -#: pretix/base/exporters/orderlist.py:596 -#: pretix/base/exporters/orderlist.py:909 -#: pretix/base/exporters/waitinglist.py:111 +#: pretix/base/exporters/orderlist.py:597 +#: 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/models/vouchers.py:253 pretix/base/models/waitinglist.py:91 @@ -2601,9 +2606,9 @@ msgstr "تاريخ الإنتهاء" #: pretix/control/templates/pretixcontrol/waitinglist/index.html:165 #: pretix/control/views/vouchers.py:119 pretix/control/views/waitinglist.py:314 #: pretix/plugins/checkinlists/exporters.py:377 -#: pretix/plugins/checkinlists/exporters.py:500 -#: pretix/plugins/checkinlists/exporters.py:695 -#: pretix/plugins/checkinlists/exporters.py:760 +#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:697 +#: pretix/plugins/checkinlists/exporters.py:763 #: pretix/plugins/reports/accountingreport.py:271 #: pretix/plugins/reports/exporters.py:386 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:100 @@ -2613,7 +2618,7 @@ msgstr "تاريخ الإنتهاء" msgid "Product" msgstr "منتج" -#: pretix/base/exporters/orderlist.py:618 pretix/base/models/vouchers.py:315 +#: pretix/base/exporters/orderlist.py:619 pretix/base/models/vouchers.py:315 #: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:6 #: pretix/control/templates/pretixcontrol/vouchers/detail.html:8 @@ -2621,132 +2626,134 @@ msgstr "منتج" msgid "Voucher" msgstr "كود الخصم" -#: pretix/base/exporters/orderlist.py:619 +#: pretix/base/exporters/orderlist.py:620 msgid "Pseudonymization ID" msgstr "معرف الاسم المستعار" -#: pretix/base/exporters/orderlist.py:620 pretix/control/forms/filter.py:709 +#: pretix/base/exporters/orderlist.py:621 pretix/control/forms/filter.py:709 #: pretix/control/templates/pretixcontrol/order/change.html:280 #, fuzzy #| msgid "Client secret" msgid "Ticket secret" msgstr "كلمة سر التذكرة" -#: pretix/base/exporters/orderlist.py:621 pretix/base/modelimport_orders.py:610 +#: pretix/base/exporters/orderlist.py:622 pretix/base/modelimport_orders.py:610 #: pretix/base/modelimport_vouchers.py:272 -#: pretix/plugins/checkinlists/exporters.py:526 +#: pretix/plugins/checkinlists/exporters.py:527 msgid "Seat ID" msgstr "رقم المقعد" -#: pretix/base/exporters/orderlist.py:622 -#: pretix/plugins/checkinlists/exporters.py:527 +#: pretix/base/exporters/orderlist.py:623 +#: pretix/plugins/checkinlists/exporters.py:528 msgid "Seat name" msgstr "اسم المقعد" -#: pretix/base/exporters/orderlist.py:623 -#: pretix/plugins/checkinlists/exporters.py:528 +#: pretix/base/exporters/orderlist.py:624 +#: pretix/plugins/checkinlists/exporters.py:529 msgid "Seat zone" msgstr "منطقة المقعد" -#: pretix/base/exporters/orderlist.py:624 -#: pretix/plugins/checkinlists/exporters.py:529 +#: pretix/base/exporters/orderlist.py:625 +#: pretix/plugins/checkinlists/exporters.py:530 msgid "Seat row" msgstr "صف المقعد" -#: pretix/base/exporters/orderlist.py:625 -#: pretix/plugins/checkinlists/exporters.py:530 +#: pretix/base/exporters/orderlist.py:626 +#: pretix/plugins/checkinlists/exporters.py:531 msgid "Seat number" msgstr "رقم المقعد" -#: pretix/base/exporters/orderlist.py:626 +#: pretix/base/exporters/orderlist.py:627 #: pretix/control/templates/pretixcontrol/order/change.html:224 #: pretix/plugins/checkinlists/exporters.py:429 -#: pretix/plugins/checkinlists/exporters.py:531 +#: pretix/plugins/checkinlists/exporters.py:532 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:108 #: pretix/plugins/statistics/templates/pretixplugins/statistics/index.html:110 msgid "Blocked" msgstr "محجوب" -#: pretix/base/exporters/orderlist.py:627 pretix/base/modelimport_orders.py:537 -#: pretix/base/models/orders.py:2525 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:117 -#: pretix/plugins/checkinlists/exporters.py:532 -#: pretix/plugins/checkinlists/exporters.py:705 +#: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:537 +#: pretix/base/models/orders.py:2539 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:118 +#: pretix/plugins/checkinlists/exporters.py:533 +#: pretix/plugins/checkinlists/exporters.py:707 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:46 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:54 msgid "Valid from" msgstr "من تاريخ" -#: pretix/base/exporters/orderlist.py:628 pretix/base/modelimport_orders.py:545 -#: pretix/base/modelimport_vouchers.py:111 pretix/base/models/orders.py:2530 +#: 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/models/vouchers.py:224 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:118 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:119 #: pretix/control/views/vouchers.py:119 -#: pretix/plugins/checkinlists/exporters.py:533 -#: pretix/plugins/checkinlists/exporters.py:706 +#: pretix/plugins/checkinlists/exporters.py:534 +#: pretix/plugins/checkinlists/exporters.py:708 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:48 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:60 msgid "Valid until" msgstr "حتى تاريخ" -#: pretix/base/exporters/orderlist.py:629 pretix/base/modelimport_orders.py:643 +#: pretix/base/exporters/orderlist.py:630 pretix/base/modelimport_orders.py:643 msgid "Order comment" msgstr "ملاحظات الطلب" -#: pretix/base/exporters/orderlist.py:631 +#: pretix/base/exporters/orderlist.py:632 #, fuzzy #| msgid "Add-On to position #%(posid)s" msgid "Add-on to position ID" msgstr "إضافة على #%(posid)s" -#: pretix/base/exporters/orderlist.py:661 +#: pretix/base/exporters/orderlist.py:662 #, fuzzy #| msgid "Invoice address state" msgctxt "address" msgid "Invoice address state" msgstr "منطقة عنوان الفاتورة" -#: pretix/base/exporters/orderlist.py:669 pretix/control/navigation.py:305 +#: pretix/base/exporters/orderlist.py:670 pretix/control/navigation.py:305 #: pretix/control/templates/pretixcontrol/checkin/lists.html:6 #: pretix/control/templates/pretixcontrol/checkin/lists.html:8 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:519 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:274 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:162 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 #: pretix/plugins/checkinlists/apps.py:44 msgid "Check-in lists" msgstr "تحقق في القوائم" -#: pretix/base/exporters/orderlist.py:671 +#: pretix/base/exporters/orderlist.py:672 #, fuzzy #| msgid "Resend order link" msgid "Position order link" msgstr "إعادة إرسال روابط الطلب" -#: pretix/base/exporters/orderlist.py:840 +#: pretix/base/exporters/orderlist.py:841 #, fuzzy #| msgid "Transaction Code" msgid "Order transaction data" msgstr "رمز معاملة الخادم" -#: pretix/base/exporters/orderlist.py:842 +#: pretix/base/exporters/orderlist.py:843 msgid "" "Download a spreadsheet of all substantial changes to orders, i.e. all " "changes to products, prices or tax rates. The information is only accurate " "for changes made with pretix versions released after October 2021." msgstr "" -#: pretix/base/exporters/orderlist.py:858 +#: pretix/base/exporters/orderlist.py:860 #, fuzzy #| msgid "Only include orders created on or after this date." msgid "Only include transactions created within this date range." msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذا التاريخ أو بعده فقط." -#: pretix/base/exporters/orderlist.py:893 pretix/base/models/event.py:695 +#: 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:3097 +#: pretix/base/models/orders.py:233 pretix/base/models/orders.py:3111 #: pretix/base/models/vouchers.py:184 pretix/base/models/waitinglist.py:55 -#: pretix/base/notifications.py:187 pretix/control/forms/filter.py:1025 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:205 +#: pretix/base/notifications.py:187 +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:4 +#: pretix/control/forms/filter.py:1025 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:206 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:42 #: pretix/control/templates/pretixcontrol/search/orders.html:51 #: pretix/multidomain/models.py:65 @@ -2757,9 +2764,9 @@ msgstr "قم بتضمين الطلبات التي تم إنشاؤها في هذ msgid "Event" msgstr "فعالية" -#: pretix/base/exporters/orderlist.py:895 -#: pretix/base/exporters/orderlist.py:1234 -#: pretix/base/exporters/orderlist.py:1378 +#: pretix/base/exporters/orderlist.py:897 +#: pretix/base/exporters/orderlist.py:1238 +#: 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 @@ -2771,25 +2778,25 @@ msgstr "فعالية" msgid "Currency" msgstr "العملة" -#: pretix/base/exporters/orderlist.py:901 +#: pretix/base/exporters/orderlist.py:903 #, fuzzy #| msgid "Transaction Code" msgid "Transaction date" msgstr "كود المعاملة" -#: pretix/base/exporters/orderlist.py:902 +#: pretix/base/exporters/orderlist.py:904 #, fuzzy #| msgid "Transaction Code" msgid "Transaction time" msgstr "كود المعاملة" -#: pretix/base/exporters/orderlist.py:903 +#: pretix/base/exporters/orderlist.py:905 #, fuzzy #| msgid "Order data" msgid "Old data" msgstr "بيانات الطلب" -#: pretix/base/exporters/orderlist.py:906 pretix/base/models/items.py:1555 +#: pretix/base/exporters/orderlist.py:908 pretix/base/models/items.py:1555 #: 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 @@ -2803,26 +2810,26 @@ msgstr "بيانات الطلب" msgid "Quantity" msgstr "كمية" -#: pretix/base/exporters/orderlist.py:913 +#: pretix/base/exporters/orderlist.py:915 #, fuzzy #| msgid "Internal reference" msgid "Internal fee type" msgstr "المرجع الداخلي" -#: pretix/base/exporters/orderlist.py:915 +#: pretix/base/exporters/orderlist.py:917 #, fuzzy #| msgid "Date" msgctxt "subevent" msgid "Date ID" msgstr "التاريخ" -#: pretix/base/exporters/orderlist.py:920 +#: pretix/base/exporters/orderlist.py:922 #, fuzzy #| msgid "Tax rule" msgid "Tax rule ID" msgstr "قاعدة الضريبة" -#: pretix/base/exporters/orderlist.py:923 +#: pretix/base/exporters/orderlist.py:925 #: pretix/plugins/reports/accountingreport.py:320 #, fuzzy #| msgctxt "invoice" @@ -2830,65 +2837,65 @@ msgstr "قاعدة الضريبة" msgid "Gross total" msgstr "القيمة الإجمالية" -#: pretix/base/exporters/orderlist.py:924 +#: pretix/base/exporters/orderlist.py:926 #: pretix/plugins/reports/accountingreport.py:319 #, fuzzy #| msgid "Total" msgid "Tax total" msgstr "المجموع" -#: pretix/base/exporters/orderlist.py:934 +#: pretix/base/exporters/orderlist.py:936 msgid "" "This value is supplied for informational purposes, it is not part of the " "original transaction data and might have changed since the transaction." msgstr "" -#: pretix/base/exporters/orderlist.py:957 +#: pretix/base/exporters/orderlist.py:959 msgid "Converted from legacy version" msgstr "" -#: pretix/base/exporters/orderlist.py:1019 +#: pretix/base/exporters/orderlist.py:1021 #, fuzzy #| msgid "Order payments and refunds" msgid "Payments and refunds" msgstr "مدفوعات الطلب والمبالغ المستردة" -#: pretix/base/exporters/orderlist.py:1021 +#: pretix/base/exporters/orderlist.py:1023 msgid "Download a spreadsheet of all payments or refunds of every order." msgstr "" -#: pretix/base/exporters/orderlist.py:1030 +#: pretix/base/exporters/orderlist.py:1033 #, fuzzy #| msgid "Extend payment term" msgid "Date range (payment date)" msgstr "تمديد فترة السداد" -#: pretix/base/exporters/orderlist.py:1033 +#: pretix/base/exporters/orderlist.py:1036 msgid "" "Note that using this will exclude any non-confirmed payments or non-" "completed refunds." msgstr "" -#: pretix/base/exporters/orderlist.py:1037 +#: pretix/base/exporters/orderlist.py:1040 msgid "Date range (start of transaction)" msgstr "" -#: pretix/base/exporters/orderlist.py:1043 +#: pretix/base/exporters/orderlist.py:1046 msgid "Payment states" msgstr "‪حالات الدفع" -#: pretix/base/exporters/orderlist.py:1051 +#: pretix/base/exporters/orderlist.py:1054 msgid "Refund states" msgstr "حالات استعادة المبلغ" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1235 -#: pretix/base/exporters/orderlist.py:1277 pretix/base/models/orders.py:331 -#: pretix/base/models/orders.py:1740 pretix/base/models/orders.py:2154 -#: pretix/base/models/orders.py:2313 pretix/base/models/orders.py:2485 -#: pretix/base/models/orders.py:2976 +#: 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/control/templates/pretixcontrol/datasync/failed_jobs.html:23 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:119 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:120 #: pretix/control/templates/pretixcontrol/search/payments.html:78 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:15 #: pretix/plugins/checkinlists/exporters.py:375 @@ -2897,48 +2904,49 @@ msgstr "حالات استعادة المبلغ" msgid "Order" msgstr "الطلب" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1277 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1282 #: pretix/control/templates/pretixcontrol/search/payments.html:75 #: pretix/plugins/paypal/templates/pretixplugins/paypal/control.html:5 #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/control_legacy.html:5 msgid "Payment ID" msgstr "معرف الدفع" -#: pretix/base/exporters/orderlist.py:1094 -#: pretix/base/exporters/orderlist.py:1375 +#: pretix/base/exporters/orderlist.py:1097 +#: pretix/base/exporters/orderlist.py:1380 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:292 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:30 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:59 msgid "Creation date" msgstr "تاريخ الإنشاء" -#: pretix/base/exporters/orderlist.py:1094 +#: pretix/base/exporters/orderlist.py:1097 #: pretix/control/templates/pretixcontrol/order/index.html:887 msgid "Completion date" msgstr "تاريخ الاكتمال" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 msgid "Status code" msgstr "رمز الحالة" -#: pretix/base/exporters/orderlist.py:1095 -#: pretix/base/exporters/orderlist.py:1233 -#: pretix/base/exporters/orderlist.py:1277 pretix/base/models/orders.py:1736 -#: pretix/base/models/orders.py:2150 pretix/control/forms/filter.py:1082 +#: 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/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/orders/refunds.html:70 #: pretix/control/templates/pretixcontrol/search/payments.html:98 -#: pretix/plugins/banktransfer/payment.py:298 -#: pretix/plugins/banktransfer/payment.py:307 +#: pretix/plugins/banktransfer/payment.py:299 +#: pretix/plugins/banktransfer/payment.py:308 #: pretix/plugins/banktransfer/refund_export.py:46 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13 msgid "Amount" msgstr "المبلغ" -#: pretix/base/exporters/orderlist.py:1095 +#: 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 @@ -2949,111 +2957,112 @@ msgstr "المبلغ" msgid "Payment method" msgstr "طريقة السداد" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 #, fuzzy #| msgid "Payment matching IDs" msgid "Matching ID" msgstr "معرفات مطابقة الدفع" -#: pretix/base/exporters/orderlist.py:1095 +#: pretix/base/exporters/orderlist.py:1098 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:38 #, fuzzy #| msgid "Payment settings" msgid "Payment details" msgstr "إعدادات الدفع" -#: pretix/base/exporters/orderlist.py:1145 +#: pretix/base/exporters/orderlist.py:1148 msgid "Quota availabilities" msgstr "توافر الحصة" -#: pretix/base/exporters/orderlist.py:1147 +#: pretix/base/exporters/orderlist.py:1150 msgid "" "Download a spreadsheet of all quotas including their current availability." msgstr "" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/items/quotas.html:45 msgid "Quota name" msgstr "اسم الحصة" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/items/quota.html:56 msgid "Total quota" msgstr "الحصة الإجمالية" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 #: pretix/control/templates/pretixcontrol/event/cancel.html:20 #: pretix/control/views/item.py:970 msgid "Paid orders" msgstr "الطلبات المدفوعة" -#: pretix/base/exporters/orderlist.py:1152 pretix/control/views/item.py:975 +#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:975 msgid "Pending orders" msgstr "الطلبات المعلقة" -#: pretix/base/exporters/orderlist.py:1152 +#: pretix/base/exporters/orderlist.py:1155 msgid "Blocking vouchers" msgstr "حظر كود الخصم" -#: pretix/base/exporters/orderlist.py:1153 pretix/control/views/item.py:994 +#: pretix/base/exporters/orderlist.py:1156 pretix/control/views/item.py:994 msgid "Current user's carts" msgstr "عربات المستخدم الحالية" -#: pretix/base/exporters/orderlist.py:1153 +#: pretix/base/exporters/orderlist.py:1156 msgid "Exited orders" msgstr "طلبات خارجة" -#: pretix/base/exporters/orderlist.py:1153 +#: pretix/base/exporters/orderlist.py:1156 msgid "Current availability" msgstr "المتوفر حاليا" -#: pretix/base/exporters/orderlist.py:1170 -#: pretix/base/exporters/orderlist.py:1177 +#: 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 msgid "Infinite" msgstr "غير محدود" -#: pretix/base/exporters/orderlist.py:1199 +#: pretix/base/exporters/orderlist.py:1202 #, fuzzy #| msgid "Gift card redemptions" msgid "Gift card transactions" msgstr "استرداد بطاقة هدية" -#: pretix/base/exporters/orderlist.py:1201 -#: pretix/base/exporters/orderlist.py:1306 +#: pretix/base/exporters/orderlist.py:1204 +#: pretix/base/exporters/orderlist.py:1311 #, fuzzy #| msgid "Gift cards" msgctxt "export_category" msgid "Gift cards" msgstr "بطاقات الهدايا" -#: pretix/base/exporters/orderlist.py:1202 +#: pretix/base/exporters/orderlist.py:1205 msgid "Download a spreadsheet of all gift card transactions." msgstr "" -#: pretix/base/exporters/orderlist.py:1230 -#: pretix/base/exporters/orderlist.py:1277 -#: pretix/base/exporters/orderlist.py:1373 pretix/base/models/giftcards.py:89 -#: pretix/base/payment.py:1454 +#: 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/control/templates/pretixcontrol/giftcards/payment.html:4 #: pretix/control/templates/pretixcontrol/order/index.html:558 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:291 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:28 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:56 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:152 msgid "Gift card code" msgstr "رمز بطاقة الهدية" -#: pretix/base/exporters/orderlist.py:1231 -#: pretix/base/exporters/orderlist.py:1320 -#: pretix/base/exporters/orderlist.py:1323 +#: pretix/base/exporters/orderlist.py:1235 +#: pretix/base/exporters/orderlist.py:1325 +#: pretix/base/exporters/orderlist.py:1328 #: pretix/base/models/memberships.py:120 pretix/control/forms/filter.py:250 #: pretix/control/forms/filter.py:1446 pretix/control/forms/filter.py:1449 #: pretix/control/templates/pretixcontrol/event/live.html:75 msgid "Test mode" msgstr "وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1236 pretix/base/models/organizer.py:102 +#: pretix/base/exporters/orderlist.py:1240 pretix/base/models/organizer.py:102 #: pretix/control/forms/event.py:110 pretix/control/forms/filter.py:919 #: pretix/control/forms/filter.py:1037 pretix/control/forms/filter.py:1711 #: pretix/control/templates/pretixcontrol/email_setup.html:6 @@ -3068,15 +3077,16 @@ msgstr "وضع الاختبار" msgid "Organizer" msgstr "منظم" -#: pretix/base/exporters/orderlist.py:1243 pretix/base/invoicing/pdf.py:580 +#: pretix/base/exporters/orderlist.py:1247 pretix/base/invoicing/pdf.py:587 #: pretix/control/templates/pretixcontrol/base.html:281 #: pretix/control/templates/pretixcontrol/checkin/index.html:145 #: pretix/control/templates/pretixcontrol/order/index.html:25 #: pretix/control/templates/pretixcontrol/orders/bulk_action.html:38 #: pretix/control/templates/pretixcontrol/orders/index.html:189 #: pretix/control/templates/pretixcontrol/orders/refunds.html:86 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:133 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:222 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:134 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:223 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:306 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:10 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:58 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:10 @@ -3089,6 +3099,7 @@ msgstr "منظم" #: pretix/presale/forms/checkout.py:259 #: pretix/presale/templates/pretixpresale/event/order.html:69 #: pretix/presale/templates/pretixpresale/event/position.html:14 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:59 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:20 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:84 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:71 @@ -3096,41 +3107,45 @@ msgstr "منظم" msgid "TEST MODE" msgstr "وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1258 +#: pretix/base/exporters/orderlist.py:1262 msgid "Gift card redemptions" msgstr "استرداد بطاقة هدية" -#: pretix/base/exporters/orderlist.py:1260 +#: pretix/base/exporters/orderlist.py:1264 msgid "" "Download a spreadsheet of all payments or refunds that involve gift cards." msgstr "" -#: pretix/base/exporters/orderlist.py:1277 +#: pretix/base/exporters/orderlist.py:1282 #: pretix/control/templates/pretixcontrol/giftcards/payment.html:16 msgid "Issuer" msgstr "جهة الاصدار" -#: pretix/base/exporters/orderlist.py:1304 pretix/control/navigation.py:550 +#: pretix/base/exporters/orderlist.py:1309 pretix/control/navigation.py:550 #: 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/presale/templates/pretixpresale/organizers/customer_giftcards.html:7 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:13 +#: pretix/presale/views/customer.py:372 msgid "Gift cards" msgstr "بطاقات الهدايا" -#: pretix/base/exporters/orderlist.py:1307 +#: pretix/base/exporters/orderlist.py:1312 msgid "Download a spreadsheet of all gift cards including their current value." msgstr "" -#: pretix/base/exporters/orderlist.py:1314 +#: pretix/base/exporters/orderlist.py:1319 msgid "Show value at" msgstr "إظهار القيمة عند" -#: pretix/base/exporters/orderlist.py:1317 +#: pretix/base/exporters/orderlist.py:1322 msgid "Defaults to the time of report." msgstr "" -#: pretix/base/exporters/orderlist.py:1322 -#: pretix/base/exporters/orderlist.py:1332 pretix/control/forms/filter.py:550 +#: pretix/base/exporters/orderlist.py:1327 +#: pretix/base/exporters/orderlist.py:1337 pretix/control/forms/filter.py:550 #: pretix/control/forms/filter.py:1231 pretix/control/forms/filter.py:1448 #: pretix/control/forms/filter.py:1457 pretix/control/forms/filter.py:1527 #: pretix/control/forms/filter.py:1537 pretix/control/forms/filter.py:1599 @@ -3153,66 +3168,70 @@ msgstr "" msgid "All" msgstr "الكل" -#: pretix/base/exporters/orderlist.py:1324 pretix/control/forms/filter.py:1450 +#: pretix/base/exporters/orderlist.py:1329 pretix/control/forms/filter.py:1450 msgid "Live" msgstr "مباشر" -#: pretix/base/exporters/orderlist.py:1333 pretix/control/forms/filter.py:1458 +#: pretix/base/exporters/orderlist.py:1338 pretix/control/forms/filter.py:1458 #: pretix/control/templates/pretixcontrol/pdf/index.html:325 msgid "Empty" msgstr "فارغ" -#: pretix/base/exporters/orderlist.py:1334 pretix/control/forms/filter.py:1459 +#: pretix/base/exporters/orderlist.py:1339 pretix/control/forms/filter.py:1459 msgid "Valid and with value" msgstr "صالحة وذات قيمة" -#: pretix/base/exporters/orderlist.py:1335 pretix/control/forms/filter.py:1460 +#: pretix/base/exporters/orderlist.py:1340 pretix/control/forms/filter.py:1460 msgid "Expired and with value" msgstr "منتهية الصلاحية وذات قيمة" -#: pretix/base/exporters/orderlist.py:1336 pretix/control/forms/filter.py:233 +#: pretix/base/exporters/orderlist.py:1341 pretix/control/forms/filter.py:233 #: pretix/control/forms/filter.py:1461 pretix/control/forms/filter.py:2121 #: pretix/control/templates/pretixcontrol/items/question.html:31 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:37 #: pretix/control/templates/pretixcontrol/orders/overview.html:78 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:309 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:84 #: pretix/plugins/reports/exporters.py:389 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:26 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:42 msgid "Expired" msgstr "منتهية الصلاحية" -#: pretix/base/exporters/orderlist.py:1374 pretix/base/models/giftcards.py:98 +#: pretix/base/exporters/orderlist.py:1379 pretix/base/models/giftcards.py:105 msgid "Test mode card" msgstr "بطاقة وضع الاختبار" -#: pretix/base/exporters/orderlist.py:1376 -#: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:102 +#: pretix/base/exporters/orderlist.py:1381 +#: pretix/base/modelimport_orders.py:553 pretix/base/models/giftcards.py:109 #: pretix/control/templates/pretixcontrol/order/index.html:203 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:293 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:62 msgid "Expiry date" msgstr "تاريخ الانتهاء" -#: pretix/base/exporters/orderlist.py:1377 pretix/control/forms/orders.py:902 +#: pretix/base/exporters/orderlist.py:1382 pretix/control/forms/orders.py:902 msgid "Special terms and conditions" msgstr "شروط وأحكام خاصة" -#: pretix/base/exporters/orderlist.py:1379 +#: pretix/base/exporters/orderlist.py:1384 #: pretix/control/templates/pretixcontrol/order/change.html:98 #: pretix/control/templates/pretixcontrol/order/change.html:410 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:295 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:32 #: pretix/control/templates/pretixcontrol/organizers/giftcards.html:68 msgid "Current value" msgstr "القيمة الحالية" -#: pretix/base/exporters/orderlist.py:1380 +#: pretix/base/exporters/orderlist.py:1385 msgid "Created in order" msgstr "تم الإنشاء بالترتيب" -#: pretix/base/exporters/orderlist.py:1381 +#: pretix/base/exporters/orderlist.py:1386 msgid "Last invoice number of order" msgstr "رقم الفاتورة الأخير للطلب" -#: pretix/base/exporters/orderlist.py:1382 +#: pretix/base/exporters/orderlist.py:1387 msgid "Last invoice date of order" msgstr "تاريخ آخر فاتورة للطلب" @@ -3237,29 +3256,30 @@ msgid "" "Download a spread sheet with the data of all reusable medias on your account." msgstr "" -#: pretix/base/exporters/reusablemedia.py:46 pretix/base/models/media.py:67 +#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:67 #, fuzzy #| msgid "Fee type" msgctxt "reusable_medium" msgid "Media type" msgstr "نوع الرسوم" -#: pretix/base/exporters/reusablemedia.py:47 pretix/base/models/media.py:73 +#: pretix/base/exporters/reusablemedia.py:48 pretix/base/models/media.py:73 #, fuzzy #| msgid "Internal identifier" msgctxt "reusable_medium" msgid "Identifier" msgstr "معرف داخلي" -#: pretix/base/exporters/reusablemedia.py:49 pretix/base/models/media.py:81 -#: pretix/base/models/orders.py:265 pretix/base/models/orders.py:3109 +#: 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/control/forms/orders.py:78 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:138 msgid "Expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/exporters/reusablemedia.py:50 pretix/base/models/media.py:90 +#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:90 #: pretix/control/templates/pretixcontrol/order/index.html:216 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:58 #: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:136 #: pretix/presale/templates/pretixpresale/event/checkout_customer.html:8 #, fuzzy @@ -3267,13 +3287,13 @@ msgstr "تاريخ إنتهاء الصلاحية" msgid "Customer account" msgstr "إجراءات العملاء" -#: pretix/base/exporters/reusablemedia.py:51 pretix/base/models/media.py:97 +#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:97 #, fuzzy #| msgid "Info text" msgid "Linked ticket" msgstr "معلومات النص" -#: pretix/base/exporters/reusablemedia.py:52 pretix/base/models/media.py:104 +#: pretix/base/exporters/reusablemedia.py:53 pretix/base/models/media.py:104 #, fuzzy #| msgid "Issued gift cards" msgid "Linked gift card" @@ -3290,49 +3310,49 @@ msgstr "قائمة الانتظار" msgid "Download a spread sheet with all your waiting list data." msgstr "" -#: pretix/base/exporters/waitinglist.py:49 +#: pretix/base/exporters/waitinglist.py:50 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:102 msgid "All entries" msgstr "جميع المدخلات" -#: pretix/base/exporters/waitinglist.py:54 +#: pretix/base/exporters/waitinglist.py:55 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:105 msgid "Waiting for a voucher" msgstr "في انتظار كود الخصم" -#: pretix/base/exporters/waitinglist.py:59 +#: pretix/base/exporters/waitinglist.py:60 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:107 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:227 #: pretix/control/views/waitinglist.py:333 msgid "Voucher assigned" msgstr "تم تعيين كود الخصم" -#: pretix/base/exporters/waitinglist.py:64 +#: pretix/base/exporters/waitinglist.py:65 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:110 msgid "Waiting for redemption" msgstr "في انتظار الاسترداد" -#: pretix/base/exporters/waitinglist.py:72 +#: pretix/base/exporters/waitinglist.py:73 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:223 #: pretix/control/views/waitinglist.py:329 msgid "Voucher redeemed" msgstr "تم استخدام كود الخصم" -#: pretix/base/exporters/waitinglist.py:80 +#: pretix/base/exporters/waitinglist.py:81 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:116 #: pretix/control/templates/pretixcontrol/waitinglist/index.html:225 #: pretix/control/views/waitinglist.py:331 msgid "Voucher expired" msgstr "كود الخصم منتهية الصلاحية" -#: pretix/base/exporters/waitinglist.py:117 +#: pretix/base/exporters/waitinglist.py:118 #: pretix/base/modelimport_orders.py:111 pretix/base/modelimport_vouchers.py:60 #: pretix/control/templates/pretixcontrol/checkin/index.html:100 msgctxt "subevents" msgid "Date" msgstr "التاريخ" -#: pretix/base/exporters/waitinglist.py:121 +#: pretix/base/exporters/waitinglist.py:122 #: pretix/control/views/waitinglist.py:315 msgid "Priority" msgstr "الأولوية" @@ -3385,45 +3405,45 @@ msgstr "الرجاء إدخال نفس كلمة المرور مرتين" msgid "Repeat password" msgstr "أعد كلمة السر" -#: pretix/base/forms/questions.py:135 pretix/base/forms/questions.py:262 +#: pretix/base/forms/questions.py:137 pretix/base/forms/questions.py:264 #, fuzzy #| msgid "No country specified." msgctxt "name_salutation" msgid "not specified" msgstr "تحديد أي بلد." -#: pretix/base/forms/questions.py:225 +#: pretix/base/forms/questions.py:227 #, fuzzy #| msgid "Please enter a shorter name." msgid "Please do not use special characters in names." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:287 +#: pretix/base/forms/questions.py:289 msgid "Please enter a shorter name." msgstr "الرجاء إدخال اسم أقصر." -#: pretix/base/forms/questions.py:312 +#: pretix/base/forms/questions.py:314 msgctxt "phonenumber" msgid "International area code" msgstr "مفتاح الاتصال الدولي" -#: pretix/base/forms/questions.py:338 +#: pretix/base/forms/questions.py:340 msgctxt "phonenumber" msgid "Phone number (without international area code)" msgstr "رقم الهاتف (بدون مفتاح الاتصال الدولي)" -#: pretix/base/forms/questions.py:499 +#: pretix/base/forms/questions.py:501 msgid "" "You uploaded an image in landscape orientation. Please upload an image in " "portrait orientation." msgstr "" "قمت بتحميل صورة في الاتجاه الأفقي. الرجاء تحميل صورة في الاتجاه العمودي." -#: pretix/base/forms/questions.py:502 +#: pretix/base/forms/questions.py:504 msgid "Please upload an image where the width is 3/4 of the height." msgstr "يرجى تحميل صورة بحيث يكون العرض 3/4 الارتفاع." -#: pretix/base/forms/questions.py:505 +#: pretix/base/forms/questions.py:507 msgid "" "The file you uploaded has a very large number of pixels, please upload an " "image no larger than 10000 x 10000 pixels." @@ -3431,64 +3451,64 @@ msgstr "" "يحتوي الملف الذي قمت بتحميله على عدد كبير جدا من وحدات البكسل ، يرجى تحميل " "صورة لا يزيد حجمها عن 10000 × 10000 بكسل." -#: pretix/base/forms/questions.py:508 pretix/helpers/images.py:75 +#: pretix/base/forms/questions.py:510 pretix/helpers/images.py:75 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" "قم بتحميل صورة صالحة. الملف الذي قمت بتحميله ليس صورة أو هو صورة تالفة." -#: pretix/base/forms/questions.py:651 pretix/base/forms/questions.py:660 +#: pretix/base/forms/questions.py:653 pretix/base/forms/questions.py:662 msgid "" "If you keep this empty, the ticket will be valid starting at the time of " "purchase." msgstr "" -#: pretix/base/forms/questions.py:707 pretix/base/forms/questions.py:1100 +#: pretix/base/forms/questions.py:709 pretix/base/forms/questions.py:1102 msgid "Street and Number" msgstr "الشارع والرقم" -#: pretix/base/forms/questions.py:1162 +#: pretix/base/forms/questions.py:1166 msgid "" "Optional, but depending on the country you reside in we might need to charge " "you additional taxes if you do not enter it." msgstr "" -#: pretix/base/forms/questions.py:1164 pretix/base/forms/questions.py:1170 +#: pretix/base/forms/questions.py:1168 pretix/base/forms/questions.py:1174 msgid "If you are registered in Switzerland, you can enter your UID instead." msgstr "" -#: pretix/base/forms/questions.py:1168 +#: pretix/base/forms/questions.py:1172 msgid "" "Optional, but it might be required for you to claim tax benefits on your " "invoice depending on your and the seller’s country of residence." msgstr "" -#: pretix/base/forms/questions.py:1177 +#: pretix/base/forms/questions.py:1181 #, fuzzy #| msgid "Cancellation requested" msgid "No invoice requested" msgstr "طلبات الإلغاء" -#: pretix/base/forms/questions.py:1179 +#: pretix/base/forms/questions.py:1183 msgid "Invoice transmission method" msgstr "" -#: pretix/base/forms/questions.py:1325 +#: pretix/base/forms/questions.py:1329 msgid "You need to provide a company name." msgstr "تحتاج إلى تقديم اسم شركة." -#: pretix/base/forms/questions.py:1327 +#: pretix/base/forms/questions.py:1331 msgid "You need to provide your name." msgstr "تحتاج إلى تقديم اسمك." -#: pretix/base/forms/questions.py:1353 +#: pretix/base/forms/questions.py:1357 msgid "" "If you enter an invoice address, you also need to select an invoice " "transmission method." msgstr "" -#: pretix/base/forms/questions.py:1381 +#: pretix/base/forms/questions.py:1385 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "" @@ -3496,13 +3516,13 @@ msgid "" "type of address." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/forms/questions.py:1390 +#: pretix/base/forms/questions.py:1394 msgid "" "The selected type of invoice transmission requires a field that is currently " "not available, please reach out to the organizer." msgstr "" -#: pretix/base/forms/questions.py:1394 +#: pretix/base/forms/questions.py:1398 msgid "This field is required for the selected type of invoice transmission." msgstr "" @@ -3604,7 +3624,7 @@ msgid "Available placeholders: {list}" msgstr "النائبة المتاحة: {list}" #: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1656 -#: pretix/plugins/checkinlists/exporters.py:754 +#: 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 msgid "Time" @@ -3680,68 +3700,68 @@ msgid "" "April 30, 2018, issued by the Director of the Revenue Agency." msgstr "" -#: pretix/base/invoicing/pdf.py:141 +#: pretix/base/invoicing/pdf.py:142 #, python-format msgctxt "invoice" msgid "Page %d of %d" msgstr "صفحة %d من %d" -#: pretix/base/invoicing/pdf.py:382 +#: pretix/base/invoicing/pdf.py:383 msgctxt "invoice" msgid "Classic renderer (pretix 1.0)" msgstr "المقدم الكلاسيكي (pretix 1.0)" -#: pretix/base/invoicing/pdf.py:426 +#: pretix/base/invoicing/pdf.py:427 msgctxt "invoice" msgid "Invoice from" msgstr "فاتورة من طرف" -#: pretix/base/invoicing/pdf.py:432 +#: pretix/base/invoicing/pdf.py:433 msgctxt "invoice" msgid "Invoice to" msgstr "فاتورة إلى" -#: pretix/base/invoicing/pdf.py:469 pretix/base/invoicing/pdf.py:1062 +#: pretix/base/invoicing/pdf.py:470 pretix/base/invoicing/pdf.py:1143 msgctxt "invoice" msgid "Order code" msgstr "رمز الطلب" -#: pretix/base/invoicing/pdf.py:478 pretix/base/invoicing/pdf.py:1075 +#: pretix/base/invoicing/pdf.py:479 pretix/base/invoicing/pdf.py:1156 msgctxt "invoice" msgid "Cancellation number" msgstr "رقم الإلغاء" -#: pretix/base/invoicing/pdf.py:484 pretix/base/invoicing/pdf.py:1077 +#: pretix/base/invoicing/pdf.py:485 pretix/base/invoicing/pdf.py:1158 msgctxt "invoice" msgid "Original invoice" msgstr "فاتورة أصلية" -#: pretix/base/invoicing/pdf.py:489 pretix/base/invoicing/pdf.py:1082 +#: pretix/base/invoicing/pdf.py:490 pretix/base/invoicing/pdf.py:1163 msgctxt "invoice" msgid "Invoice number" msgstr "رقم الفاتورة" -#: pretix/base/invoicing/pdf.py:497 pretix/base/invoicing/pdf.py:1097 +#: pretix/base/invoicing/pdf.py:498 pretix/base/invoicing/pdf.py:1178 msgctxt "invoice" msgid "Cancellation date" msgstr "تاريخ الإلغاء" -#: pretix/base/invoicing/pdf.py:503 +#: pretix/base/invoicing/pdf.py:504 msgctxt "invoice" msgid "Original invoice date" msgstr "تاريخ الفاتورة الأصلي" -#: pretix/base/invoicing/pdf.py:510 pretix/base/invoicing/pdf.py:1099 +#: pretix/base/invoicing/pdf.py:511 pretix/base/invoicing/pdf.py:1180 msgctxt "invoice" msgid "Invoice date" msgstr "تاريخ الفاتورة" -#: pretix/base/invoicing/pdf.py:526 +#: pretix/base/invoicing/pdf.py:527 msgctxt "invoice" msgid "Event" msgstr "الفعالية" -#: pretix/base/invoicing/pdf.py:552 +#: pretix/base/invoicing/pdf.py:561 #, python-brace-format msgctxt "invoice" msgid "" @@ -3751,39 +3771,39 @@ msgstr "" "من {from_date}\n" "حتى {to_date}" -#: pretix/base/invoicing/pdf.py:601 pretix/base/services/mail.py:509 +#: pretix/base/invoicing/pdf.py:608 pretix/base/services/mail.py:511 #, python-brace-format msgctxt "invoice" msgid "Invoice {num}" msgstr "فاتورة {num}" -#: pretix/base/invoicing/pdf.py:653 +#: pretix/base/invoicing/pdf.py:660 #, python-brace-format msgctxt "invoice" msgid "Customer reference: {reference}" msgstr "رقم مرجع العميل: {reference}" -#: pretix/base/invoicing/pdf.py:661 +#: pretix/base/invoicing/pdf.py:668 msgctxt "invoice" msgid "Customer VAT ID" msgstr "معرف ضريبة القيمة المضافة للعميل" -#: pretix/base/invoicing/pdf.py:668 +#: pretix/base/invoicing/pdf.py:675 msgctxt "invoice" msgid "Beneficiary" msgstr "المستفيد" -#: pretix/base/invoicing/pdf.py:694 +#: pretix/base/invoicing/pdf.py:708 msgctxt "invoice" msgid "Tax Invoice" msgstr "فاتورة الضريبة" -#: pretix/base/invoicing/pdf.py:695 +#: pretix/base/invoicing/pdf.py:709 msgctxt "invoice" msgid "Invoice" msgstr "فاتورة" -#: pretix/base/invoicing/pdf.py:696 +#: pretix/base/invoicing/pdf.py:710 #: 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 @@ -3791,99 +3811,106 @@ msgctxt "invoice" msgid "Cancellation" msgstr "إلغاء" -#: pretix/base/invoicing/pdf.py:718 pretix/base/invoicing/pdf.py:726 +#: pretix/base/invoicing/pdf.py:732 pretix/base/invoicing/pdf.py:740 msgctxt "invoice" msgid "Description" msgstr "وصف" -#: pretix/base/invoicing/pdf.py:719 pretix/base/invoicing/pdf.py:727 +#: pretix/base/invoicing/pdf.py:733 pretix/base/invoicing/pdf.py:741 msgctxt "invoice" msgid "Qty" msgstr "الكمية" -#: pretix/base/invoicing/pdf.py:720 pretix/base/invoicing/pdf.py:879 +#: pretix/base/invoicing/pdf.py:734 pretix/base/invoicing/pdf.py:960 msgctxt "invoice" msgid "Tax rate" msgstr "معدل الضريبة" -#: pretix/base/invoicing/pdf.py:721 +#: pretix/base/invoicing/pdf.py:735 msgctxt "invoice" msgid "Net" msgstr "الصافي" -#: pretix/base/invoicing/pdf.py:722 +#: pretix/base/invoicing/pdf.py:736 msgctxt "invoice" msgid "Gross" msgstr "الإجمالي" -#: pretix/base/invoicing/pdf.py:728 +#: pretix/base/invoicing/pdf.py:742 msgctxt "invoice" msgid "Amount" msgstr "المبلغ" -#: pretix/base/invoicing/pdf.py:744 +#: pretix/base/invoicing/pdf.py:818 #, python-brace-format msgctxt "invoice" msgid "Single price: {net_price} net / {gross_price} gross" msgstr "" -#: pretix/base/invoicing/pdf.py:767 +#: pretix/base/invoicing/pdf.py:842 #, fuzzy, python-brace-format #| msgid "Original price" msgctxt "invoice" msgid "Single price: {price}" msgstr "السعر الأصلي" -#: pretix/base/invoicing/pdf.py:788 pretix/base/invoicing/pdf.py:794 +#: pretix/base/invoicing/pdf.py:863 pretix/base/invoicing/pdf.py:869 msgctxt "invoice" msgid "Invoice total" msgstr "إجمالي الفاتورة" -#: pretix/base/invoicing/pdf.py:804 +#: pretix/base/invoicing/pdf.py:879 msgctxt "invoice" msgid "Received payments" msgstr "المدفوعات المستلمة" -#: pretix/base/invoicing/pdf.py:809 +#: pretix/base/invoicing/pdf.py:884 msgctxt "invoice" msgid "Outstanding payments" msgstr "المدفوعات المتأخرة" -#: pretix/base/invoicing/pdf.py:826 +#: pretix/base/invoicing/pdf.py:901 #, fuzzy #| msgid "Issued gift cards" msgctxt "invoice" msgid "Paid by gift card" msgstr "بطاقات هدية صدر" -#: pretix/base/invoicing/pdf.py:831 +#: pretix/base/invoicing/pdf.py:906 #, fuzzy #| msgid "Pending amount" msgctxt "invoice" msgid "Remaining amount" msgstr "مبالغ متأخرة" -#: pretix/base/invoicing/pdf.py:880 +#: pretix/base/invoicing/pdf.py:930 +#, fuzzy, python-brace-format +#| msgid "Event date range" +msgctxt "invoice" +msgid "Invoice period: {daterange}" +msgstr "نطاق تاريخ الفعالية" + +#: pretix/base/invoicing/pdf.py:961 msgctxt "invoice" msgid "Net value" msgstr "صافي القيمة" -#: pretix/base/invoicing/pdf.py:881 +#: pretix/base/invoicing/pdf.py:962 msgctxt "invoice" msgid "Gross value" msgstr "القيمة الإجمالية" -#: pretix/base/invoicing/pdf.py:882 +#: pretix/base/invoicing/pdf.py:963 msgctxt "invoice" msgid "Tax" msgstr "الضريبة" -#: pretix/base/invoicing/pdf.py:912 +#: pretix/base/invoicing/pdf.py:993 msgctxt "invoice" msgid "Included taxes" msgstr "الضرائب المدرجة" -#: pretix/base/invoicing/pdf.py:940 +#: pretix/base/invoicing/pdf.py:1021 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -3897,7 +3924,7 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، وهذا يعادل:" -#: pretix/base/invoicing/pdf.py:955 +#: pretix/base/invoicing/pdf.py:1036 #, fuzzy, python-brace-format #| msgctxt "invoice" #| msgid "" @@ -3911,22 +3938,22 @@ msgstr "" "باستخدام معدل التحويل 1: {rate} كما نشره البنك المركزي الأوروبي بتاريخ " "{date} ، إجمالي الفاتورة يعادل {total}." -#: pretix/base/invoicing/pdf.py:969 +#: pretix/base/invoicing/pdf.py:1050 msgid "Default invoice renderer (European-style letter)" msgstr "" -#: pretix/base/invoicing/pdf.py:1058 +#: pretix/base/invoicing/pdf.py:1139 #, fuzzy #| msgid "Please enter a valid state." msgctxt "invoice" msgid "(Please quote at all times.)" msgstr "الرجاء اختيار ولاية صحيحة." -#: pretix/base/invoicing/pdf.py:1105 +#: pretix/base/invoicing/pdf.py:1186 msgid "Simplified invoice renderer" msgstr "" -#: pretix/base/invoicing/pdf.py:1124 +#: pretix/base/invoicing/pdf.py:1205 #, fuzzy, python-brace-format #| msgid "Event date range" msgctxt "invoice" @@ -4069,9 +4096,9 @@ msgstr "" msgid "Could not parse {value} as a date and time." msgstr "" -#: pretix/base/modelimport.py:239 pretix/control/views/orders.py:1173 -#: pretix/control/views/orders.py:1202 pretix/control/views/orders.py:1246 -#: pretix/control/views/orders.py:1281 pretix/control/views/orders.py:1304 +#: 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 msgid "You entered an invalid number." msgstr "لقد أدخلت رقما غير صالح." @@ -4250,8 +4277,8 @@ msgstr "لم يتم العثور على مقعد مطابق." #: pretix/base/modelimport_orders.py:631 #: pretix/base/modelimport_vouchers.py:296 pretix/base/services/cart.py:213 -#: pretix/base/services/modelimport.py:175 -#: pretix/base/services/modelimport.py:287 +#: pretix/base/services/modelimport.py:178 +#: pretix/base/services/modelimport.py:299 msgid "" "The seat you selected has already been taken. Please select a different seat." msgstr "المقعد الذي اخترته قد تم شغله مسبقا. الرجاء اختيار مقعد مختلف." @@ -4452,7 +4479,7 @@ msgid "All products (including newly created ones)" msgstr "جميع المنتجات (بما في ذلك تلك التي تم إنشاؤها حديثا)" #: pretix/base/models/checkin.py:56 pretix/plugins/badges/exporters.py:436 -#: pretix/plugins/checkinlists/exporters.py:851 +#: pretix/plugins/checkinlists/exporters.py:854 msgid "Limit to products" msgstr "مقتصر على المنتجات" @@ -4617,23 +4644,23 @@ msgstr "كود الخصم هذا غير صالح لهذا المقعد." msgid "Check-in annulled" msgstr "تحقق ذات المركز" -#: pretix/base/models/customers.py:55 +#: pretix/base/models/customers.py:62 #, fuzzy #| msgid "Product name" msgid "Provider name" msgstr "اسم المنتج" -#: pretix/base/models/customers.py:60 +#: pretix/base/models/customers.py:67 msgid "Login button label" msgstr "" -#: pretix/base/models/customers.py:64 +#: pretix/base/models/customers.py:71 #, fuzzy #| msgid "Refund method" msgid "Single-sign-on method" msgstr "طريقة الاسترداد" -#: pretix/base/models/customers.py:85 pretix/base/models/devices.py:71 +#: pretix/base/models/customers.py:92 pretix/base/models/devices.py:71 #: pretix/base/models/items.py:1676 pretix/base/models/items.py:1952 msgid "" "You can enter any value here to make it easier to match the data with other " @@ -4642,15 +4669,15 @@ msgstr "" "يمكنك إدخال أي قيمة هنا لتسهيل مطابقة البيانات مع المصادر الأخرى. إذا لم تقم " "بإدخال واحد ، فسننشئ واحدا تلقائيا." -#: pretix/base/models/customers.py:90 +#: pretix/base/models/customers.py:97 msgid "" "The identifier may only contain letters, numbers, dots, dashes, and " "underscores. It must start and end with a letter or number." msgstr "" -#: pretix/base/models/customers.py:195 pretix/control/forms/filter.py:1529 +#: pretix/base/models/customers.py:202 pretix/control/forms/filter.py:1529 #: pretix/control/forms/filter.py:1601 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:42 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:43 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:56 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:135 #: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:35 @@ -4659,77 +4686,77 @@ msgstr "" msgid "disabled" msgstr "معاق" -#: pretix/base/models/customers.py:310 pretix/base/models/orders.py:1538 -#: pretix/base/models/orders.py:3280 pretix/base/settings.py:1150 +#: pretix/base/models/customers.py:330 pretix/base/models/orders.py:1538 +#: pretix/base/models/orders.py:3294 pretix/base/settings.py:1179 msgid "Company name" msgstr "اسم الشركة" -#: pretix/base/models/customers.py:314 pretix/base/models/orders.py:1542 -#: pretix/base/models/orders.py:3287 pretix/base/settings.py:83 +#: pretix/base/models/customers.py:334 pretix/base/models/orders.py:1542 +#: pretix/base/models/orders.py:3301 pretix/base/settings.py:83 #: pretix/plugins/stripe/payment.py:272 msgid "Select country" msgstr "اختر الدولة" -#: pretix/base/models/customers.py:381 +#: pretix/base/models/customers.py:401 msgctxt "openidconnect" msgid "Confidential" msgstr "" -#: pretix/base/models/customers.py:382 +#: pretix/base/models/customers.py:402 #, fuzzy #| msgid "Public profile" msgctxt "openidconnect" msgid "Public" msgstr "حساب عام" -#: pretix/base/models/customers.py:388 +#: pretix/base/models/customers.py:408 #, fuzzy #| msgid "Authorization Code" msgctxt "openidconnect" msgid "Authorization code" msgstr "شفرة الترخيص" -#: pretix/base/models/customers.py:389 +#: pretix/base/models/customers.py:409 msgctxt "openidconnect" msgid "Implicit" msgstr "" -#: pretix/base/models/customers.py:393 +#: pretix/base/models/customers.py:413 msgid "OpenID Connect access (required)" msgstr "" -#: pretix/base/models/customers.py:394 +#: pretix/base/models/customers.py:414 #, fuzzy #| msgctxt "subevent" #| msgid "Create a new date" msgid "Profile data (name, addresses)" msgstr "إنشاء موعد جديد" -#: pretix/base/models/customers.py:414 +#: pretix/base/models/customers.py:434 #, fuzzy #| msgid "Event type" msgid "Client type" msgstr "نوع الفعالية" -#: pretix/base/models/customers.py:417 +#: pretix/base/models/customers.py:437 #, fuzzy #| msgid "Scan type" msgid "Grant type" msgstr "نوع المسح الضوئي" -#: pretix/base/models/customers.py:420 +#: pretix/base/models/customers.py:440 #, fuzzy #| msgid "Required question" msgid "Require PKCE extension" msgstr "سؤال مطلوب" -#: pretix/base/models/customers.py:432 +#: pretix/base/models/customers.py:452 #, fuzzy #| msgid "Allowed membership types" msgid "Allowed access scopes" msgstr "أنواع العضوية المسموح بها" -#: pretix/base/models/customers.py:433 +#: pretix/base/models/customers.py:453 #, fuzzy #| msgid "Create multiple vouchers" msgid "Separate multiple values with spaces" @@ -4766,7 +4793,7 @@ msgstr "هذا المعرف مستخدم مسبقا لسؤال مختلف." #: pretix/control/forms/filter.py:2468 pretix/control/forms/filter.py:2628 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 #: pretix/control/templates/pretixcontrol/organizers/gates.html:16 -#: pretix/plugins/checkinlists/exporters.py:766 +#: pretix/plugins/checkinlists/exporters.py:769 msgid "Gate" msgstr "بوابة" @@ -5048,7 +5075,7 @@ 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:474 +#: pretix/base/models/items.py:1230 pretix/base/payment.py:476 msgid "Restrict to specific sales channels" msgstr "يقتصر على قنوات بيع محددة" @@ -5129,7 +5156,7 @@ msgstr "" "إذا تم الحديد، فستظهر هذه الفعالية بشكل عام في قائمة تواريخ الفعالية الخاصة " "بك." -#: pretix/base/models/event.py:1565 pretix/base/settings.py:3116 +#: pretix/base/models/event.py:1565 pretix/base/settings.py:3145 msgid "Frontpage text" msgstr "نص الصفحة الأولى" @@ -5141,32 +5168,32 @@ msgstr "التاريخ في سلسلة الفعالية" msgid "Dates in event series" msgstr "التواريخ في سلسلة الفعالية" -#: pretix/base/models/event.py:1728 +#: pretix/base/models/event.py:1724 msgid "One or more variations do not belong to this event." msgstr "عنصر أو أكثر لا ينتمي إلى هذه الفعالية." -#: pretix/base/models/event.py:1758 pretix/base/models/items.py:2236 +#: pretix/base/models/event.py:1754 pretix/base/models/items.py:2236 msgid "Can not contain spaces or special characters except underscores" msgstr "لا يمكن أن يحتوي على مسافات أو أحرف خاصة باستثناء الشرطات السفلية" -#: pretix/base/models/event.py:1763 pretix/base/models/items.py:2241 +#: pretix/base/models/event.py:1759 pretix/base/models/items.py:2241 msgid "The property name may only contain letters, numbers and underscores." msgstr "لا يسمح أن يحتوي اسم الملكية إلا على أحرف وأرقام وشرطات سفلية فقط." -#: pretix/base/models/event.py:1768 +#: pretix/base/models/event.py:1764 msgid "Default value" msgstr "القيمة الافتراضية" -#: pretix/base/models/event.py:1770 +#: pretix/base/models/event.py:1766 #: pretix/control/templates/pretixcontrol/organizers/properties.html:50 msgid "Can only be changed by organizer-level administrators" msgstr "لا يمكن تغييرها إلا من قبل المسؤولين برتبة منظم" -#: pretix/base/models/event.py:1772 +#: pretix/base/models/event.py:1768 msgid "Required for events" msgstr "مطلوب للفعاليات" -#: pretix/base/models/event.py:1773 +#: pretix/base/models/event.py:1769 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" @@ -5174,53 +5201,53 @@ msgstr "" "إذا تم تحديده ، فلا يمكن أن تكون الفعالية مباشرة إلا إذا تم تعيين الخاصية. " "في سلسلة الفعالية، يكون دائما تعيين قيمة للتواريخ الفردية أمرا اختياريا" -#: pretix/base/models/event.py:1779 pretix/base/models/items.py:2253 +#: pretix/base/models/event.py:1775 pretix/base/models/items.py:2253 msgid "Valid values" msgstr "قيم صالحة" -#: pretix/base/models/event.py:1782 +#: pretix/base/models/event.py:1778 #: 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:1783 +#: pretix/base/models/event.py:1779 msgid "" "This field will be shown to filter events in the public event list and " "calendar." msgstr "" -#: pretix/base/models/event.py:1786 pretix/control/forms/organizer.py:269 +#: pretix/base/models/event.py:1782 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:1790 +#: pretix/base/models/event.py:1786 #: pretix/control/templates/pretixcontrol/organizers/properties.html:40 msgid "Can be used for filtering" msgstr "" -#: pretix/base/models/event.py:1791 +#: pretix/base/models/event.py:1787 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:1801 +#: pretix/base/models/event.py:1797 msgid "A property can either be required or have a default value, not both." msgstr "يمكن أن تكون الخاصية إما مطلوبة أو لها قيمة افتراضية ، وليس كليهما." -#: pretix/base/models/event.py:1881 pretix/base/models/organizer.py:582 +#: pretix/base/models/event.py:1877 pretix/base/models/organizer.py:582 #, fuzzy #| msgid "Info text" msgid "Link text" msgstr "معلومات النص" -#: pretix/base/models/event.py:1884 pretix/base/models/organizer.py:585 +#: pretix/base/models/event.py:1880 pretix/base/models/organizer.py:585 #, fuzzy #| msgid "Imprint URL" msgid "Link URL" @@ -5238,7 +5265,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:988 +#: pretix/base/models/exports.py:71 pretix/control/forms/event.py:989 #: pretix/control/forms/organizer.py:586 msgid "You can specify multiple recipients separated by commas." msgstr "" @@ -5255,9 +5282,9 @@ msgstr "إعدادات إضافية" msgid "Additional recipients (Bcc)" msgstr "إعدادات إضافية" -#: pretix/base/models/exports.py:74 pretix/control/forms/event.py:1094 -#: pretix/control/forms/event.py:1168 pretix/control/forms/event.py:1178 -#: pretix/control/forms/event.py:1188 pretix/control/forms/event.py:1203 +#: 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/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 @@ -5295,64 +5322,70 @@ msgstr "لا يمكن أن تحتوي أي قيمة على الرمز المحد msgid "Owned by ticket holder" msgstr "قم بتنزيل تذكرتك هنا:" -#: pretix/base/models/giftcards.py:93 +#: pretix/base/models/giftcards.py:88 +#, fuzzy +#| msgid "View customer account" +msgid "Owned by customer account" +msgstr "عرض حساب العميل" + +#: pretix/base/models/giftcards.py:100 msgid "The gift card code may only contain letters, numbers, dots and dashes." msgstr "قد يحتوي رمز بطاقة الهدايا فقط على أحرف وأرقام ونقاط وشرطات." -#: pretix/base/models/giftcards.py:105 +#: pretix/base/models/giftcards.py:112 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:39 msgctxt "giftcard" msgid "Special terms and conditions" msgstr "‪شروط وأحكام خاصة" -#: pretix/base/models/giftcards.py:219 pretix/base/models/giftcards.py:223 +#: pretix/base/models/giftcards.py:227 pretix/base/models/giftcards.py:231 msgid "Manual transaction" msgstr "المعاملات اليدوية" -#: pretix/base/models/invoices.py:121 +#: pretix/base/models/invoices.py:122 #, fuzzy #| msgid "Pending amount" msgid "pending transmission" msgstr "مبالغ متأخرة" -#: pretix/base/models/invoices.py:122 +#: pretix/base/models/invoices.py:123 msgid "currently being transmitted" msgstr "" -#: pretix/base/models/invoices.py:123 +#: pretix/base/models/invoices.py:124 #, fuzzy #| msgctxt "subevent" #| msgid "No date selected." msgid "transmitted" msgstr "لم يتم تحديد تاريخ." -#: pretix/base/models/invoices.py:124 pretix/plugins/sendmail/models.py:52 +#: pretix/base/models/invoices.py:125 pretix/plugins/sendmail/models.py:52 #, fuzzy #| msgctxt "payment_state" #| msgid "failed" msgid "failed" msgstr "فشل" -#: pretix/base/models/invoices.py:125 +#: pretix/base/models/invoices.py:126 #: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_list.html:56 #, fuzzy #| msgid "(unknown)" msgid "unknown" msgstr "(غير معروف)" -#: pretix/base/models/invoices.py:126 +#: pretix/base/models/invoices.py:127 #, fuzzy #| msgid "in private test mode" msgid "not transmitted due to test mode" msgstr "في وضع الاختبار الخاص" -#: pretix/base/models/invoices.py:218 +#: pretix/base/models/invoices.py:220 #, python-format msgctxt "invoice" msgid "Tax ID: %s" msgstr "رقم تعريف الضريبة: %s" -#: pretix/base/models/invoices.py:224 pretix/base/services/invoices.py:148 +#: pretix/base/models/invoices.py:226 pretix/base/services/invoices.py:154 #, python-format msgctxt "invoice" msgid "VAT-ID: %s" @@ -5586,8 +5619,8 @@ msgstr "عرض قائمة الانتظار لهذه التذكرة" msgid "This will only work if waiting lists are enabled for this event." msgstr "لن يعمل هذا إلا إذا تم تمكين قوائم الانتظار لهذه الفعالية." -#: pretix/base/models/items.py:548 pretix/base/settings.py:1398 -#: pretix/control/forms/event.py:1690 +#: pretix/base/models/items.py:548 pretix/base/settings.py:1427 +#: pretix/control/forms/event.py:1691 msgid "Show number of tickets left" msgstr "إظهار عدد التذاكر المتبقية" @@ -6329,7 +6362,7 @@ msgstr "خيار السؤال" msgid "Question options" msgstr "خيارات السؤال" -#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1724 +#: pretix/base/models/items.py:2074 pretix/control/forms/event.py:1725 #: pretix/control/templates/pretixcontrol/items/quotas.html:56 msgid "Total capacity" msgstr "السعة الإجمالية" @@ -6339,7 +6372,7 @@ 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:2997 +#: pretix/base/models/orders.py:3011 #: pretix/control/templates/pretixcontrol/checkin/index.html:97 msgid "Item" msgstr "بند" @@ -6494,7 +6527,7 @@ msgid "Canceled" msgstr "ملغاة" #: pretix/base/models/memberships.py:134 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:116 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:117 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:28 msgid "Membership type" msgstr "نوع العضوية" @@ -6503,8 +6536,8 @@ msgstr "نوع العضوية" msgid "pending" msgstr "معلق" -#: pretix/base/models/orders.py:203 pretix/base/payment.py:568 -#: pretix/base/services/invoices.py:486 +#: pretix/base/models/orders.py:203 pretix/base/payment.py:570 +#: pretix/base/services/invoices.py:572 msgid "paid" msgstr "مدفوع" @@ -6514,7 +6547,7 @@ msgid "expired" msgstr "منتهي الصلاحية" #: pretix/base/models/orders.py:254 pretix/control/forms/filter.py:592 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:64 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:65 msgid "Locale" msgstr "المكان" @@ -6661,62 +6694,62 @@ msgctxt "payment_state" msgid "refunded" msgstr "تم الاسترداد" -#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2181 +#: pretix/base/models/orders.py:1756 pretix/base/models/orders.py:2195 #: pretix/base/shredder.py:633 msgid "Payment information" msgstr "معلومات الدفع" -#: pretix/base/models/orders.py:2122 +#: pretix/base/models/orders.py:2136 msgctxt "refund_state" msgid "started externally" msgstr "بدأ من الخارج" -#: pretix/base/models/orders.py:2123 +#: pretix/base/models/orders.py:2137 msgctxt "refund_state" msgid "created" msgstr "تم الإنشاء" -#: pretix/base/models/orders.py:2124 +#: pretix/base/models/orders.py:2138 msgctxt "refund_state" msgid "in transit" msgstr "قيد الإرسال" -#: pretix/base/models/orders.py:2125 +#: pretix/base/models/orders.py:2139 msgctxt "refund_state" msgid "done" msgstr "منجز" -#: pretix/base/models/orders.py:2126 +#: pretix/base/models/orders.py:2140 msgctxt "refund_state" msgid "failed" msgstr "فشل" -#: pretix/base/models/orders.py:2128 +#: pretix/base/models/orders.py:2142 msgctxt "refund_state" msgid "canceled" msgstr "ألغيت" -#: pretix/base/models/orders.py:2136 +#: pretix/base/models/orders.py:2150 msgctxt "refund_source" msgid "Organizer" msgstr "منظم" -#: pretix/base/models/orders.py:2137 +#: pretix/base/models/orders.py:2151 msgctxt "refund_source" msgid "Customer" msgstr "عميل" -#: pretix/base/models/orders.py:2138 +#: pretix/base/models/orders.py:2152 msgctxt "refund_source" msgid "External" msgstr "خارجي" -#: pretix/base/models/orders.py:2176 +#: pretix/base/models/orders.py:2190 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:198 msgid "Refund reason" msgstr "سبب استرداد الأموال" -#: pretix/base/models/orders.py:2177 +#: pretix/base/models/orders.py:2191 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:199 #: pretix/control/templates/pretixcontrol/order/refund_choose.html:201 msgid "" @@ -6725,39 +6758,39 @@ msgstr "" "قد يتم عرضها للمستخدم النهائي أو استخدامها على سبيل المثال كجزء من مرجع " "السداد." -#: pretix/base/models/orders.py:2297 +#: pretix/base/models/orders.py:2311 msgid "Service fee" msgstr "رسوم الخدمة" -#: pretix/base/models/orders.py:2298 +#: pretix/base/models/orders.py:2312 msgid "Payment fee" msgstr "رسوم السداد" -#: pretix/base/models/orders.py:2299 +#: pretix/base/models/orders.py:2313 msgid "Shipping fee" msgstr "رسوم الشحن" -#: pretix/base/models/orders.py:2300 +#: pretix/base/models/orders.py:2314 #: pretix/control/templates/pretixcontrol/order/index.html:157 msgid "Cancellation fee" msgstr "رسوم الإلغاء" -#: pretix/base/models/orders.py:2301 +#: pretix/base/models/orders.py:2315 msgid "Insurance fee" msgstr "" -#: pretix/base/models/orders.py:2302 +#: pretix/base/models/orders.py:2316 #, fuzzy #| msgid "Other fees" msgid "Late fee" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2303 +#: pretix/base/models/orders.py:2317 msgid "Other fees" msgstr "رسوم أخرى" -#: pretix/base/models/orders.py:2304 pretix/base/payment.py:1372 -#: pretix/base/payment.py:1419 pretix/base/settings.py:992 +#: pretix/base/models/orders.py:2318 pretix/base/payment.py:1374 +#: pretix/base/payment.py:1450 pretix/base/settings.py:992 #: 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 @@ -6766,68 +6799,68 @@ msgstr "رسوم أخرى" msgid "Gift card" msgstr "بطاقة هدايا" -#: pretix/base/models/orders.py:2309 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:74 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:115 +#: pretix/base/models/orders.py:2323 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:82 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:123 #: pretix/control/views/vouchers.py:120 #: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:8 msgid "Value" msgstr "قيمة" -#: pretix/base/models/orders.py:2557 +#: pretix/base/models/orders.py:2571 msgid "Order position" msgstr "حالة الطلب" -#: pretix/base/models/orders.py:3102 +#: pretix/base/models/orders.py:3116 msgid "Cart ID (e.g. session key)" msgstr "معرف عربة التسوق (مثل مفتاح الجلسة)" -#: pretix/base/models/orders.py:3113 +#: pretix/base/models/orders.py:3127 #, fuzzy #| msgid "Expiration date" msgid "Limit for extending expiration date" msgstr "تاريخ إنتهاء الصلاحية" -#: pretix/base/models/orders.py:3142 +#: pretix/base/models/orders.py:3156 msgid "Cart position" msgstr "حالة سلة التسوق" -#: pretix/base/models/orders.py:3143 +#: pretix/base/models/orders.py:3157 msgid "Cart positions" msgstr "حالات سلة التسوق" -#: pretix/base/models/orders.py:3279 +#: pretix/base/models/orders.py:3293 msgid "Business customer" msgstr "عميل قطاع الأعمال" -#: pretix/base/models/orders.py:3295 +#: pretix/base/models/orders.py:3309 msgid "This reference will be printed on your invoice for your convenience." msgstr "ستتم طباعة هذا المرجع على فاتورتك وفقا لما يناسبك." -#: pretix/base/models/orders.py:3422 +#: pretix/base/models/orders.py:3436 #, fuzzy #| msgid "Transaction Code" msgid "Transmission type" msgstr "كود المعاملة" -#: pretix/base/models/orders.py:3520 +#: pretix/base/models/orders.py:3534 #: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9 msgid "Badge" msgstr "شارة" -#: pretix/base/models/orders.py:3521 pretix/base/pdf.py:1124 +#: pretix/base/models/orders.py:3535 pretix/base/pdf.py:1124 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:66 -#: pretix/plugins/ticketoutputpdf/ticketoutput.py:113 +#: pretix/plugins/ticketoutputpdf/ticketoutput.py:114 msgid "Ticket" msgstr "تذكرة" -#: pretix/base/models/orders.py:3522 +#: pretix/base/models/orders.py:3536 #, fuzzy #| msgid "Verification failed" msgid "Certificate" msgstr "فشل التحقق" -#: pretix/base/models/orders.py:3523 pretix/control/views/event.py:393 +#: pretix/base/models/orders.py:3537 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 @@ -7170,7 +7203,7 @@ msgstr "" msgid "Should be short, e.g. \"VAT\"" msgstr "يجب أن يكون قصيرا، على سبيل المثال VAT" -#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1522 +#: pretix/base/models/tax.py:330 pretix/control/forms/event.py:1523 #: pretix/control/templates/pretixcontrol/order/transactions.html:22 #, fuzzy #| msgid "Status code" @@ -7240,12 +7273,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:1569 +#: pretix/base/models/tax.py:427 pretix/control/forms/event.py:1570 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:1573 +#: pretix/base/models/tax.py:432 pretix/control/forms/event.py:1574 msgid "" "A combination of this tax code with a zero tax rate does not make sense." msgstr "" @@ -7553,7 +7586,7 @@ msgstr "المنتجات التي تم شراءها" #: pretix/base/notifications.py:223 pretix/base/services/placeholders.py:384 #: pretix/base/services/placeholders.py:393 -#: pretix/base/templates/pretixbase/email/order_details.html:147 +#: pretix/base/templates/pretixbase/email/order_details.html:151 msgid "View order details" msgstr "معاينة تفاصيل الطلب" @@ -7625,50 +7658,50 @@ msgstr "تم طلب استرداد الأموال" msgid "You have been requested to issue a refund for {order.code}." msgstr "لقدطلب منك إصدار استرداد ل {order.code}." -#: pretix/base/payment.py:85 +#: pretix/base/payment.py:86 #, fuzzy #| msgid "Apply" msgctxt "payment" msgid "Apple Pay" msgstr "تطبيق" -#: pretix/base/payment.py:86 +#: pretix/base/payment.py:87 #, fuzzy #| msgid "Android (Google Play)" msgctxt "payment" msgid "Google Pay" msgstr "الروبوت (جوجل اللعب)" -#: pretix/base/payment.py:117 pretix/base/payment.py:1579 +#: pretix/base/payment.py:119 pretix/base/payment.py:1610 msgid "You cannot pay with gift cards when buying a gift card." msgstr "لا يمكنك الدفع ببطاقات الهدايا عند شراء بطاقة هدايا." -#: pretix/base/payment.py:126 pretix/base/payment.py:1589 -#: pretix/base/payment.py:1591 +#: pretix/base/payment.py:128 pretix/base/payment.py:1620 +#: pretix/base/payment.py:1622 msgid "This gift card does not support this currency." msgstr "بطاقة الهدايا هذه لا تدعم هذه العملة." -#: pretix/base/payment.py:128 pretix/base/payment.py:1597 +#: pretix/base/payment.py:130 pretix/base/payment.py:1628 msgid "This gift card can only be used in test mode." msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا في وضع الاختبار." -#: pretix/base/payment.py:130 pretix/base/payment.py:1599 +#: pretix/base/payment.py:132 pretix/base/payment.py:1630 msgid "Only test gift cards can be used in test mode." msgstr "يمكن استخدام بطاقات الهدايا التجريبية فقط في وضع الاختبار." -#: pretix/base/payment.py:132 pretix/base/payment.py:1601 +#: pretix/base/payment.py:134 pretix/base/payment.py:1632 msgid "This gift card is no longer valid." msgstr "بطاقة الهدايا هذه لم تعد صالحة." -#: pretix/base/payment.py:134 +#: pretix/base/payment.py:136 msgid "All credit on this gift card has been used." msgstr "تم استخدام كل الرصيد الموجود في بطاقة الهدايا هذه." -#: pretix/base/payment.py:141 +#: pretix/base/payment.py:143 msgid "This gift card is already used for your payment." msgstr "بطاقة الهدايا هذه مستخدمة مسبقا لسدادك." -#: pretix/base/payment.py:145 +#: pretix/base/payment.py:147 msgid "" "You entered a voucher instead of a gift card. Vouchers can only be entered " "on the first page of the shop below the product selection." @@ -7676,11 +7709,11 @@ msgstr "" "لقد أدخلت كود خصم بدلا من بطاقة هدايا. يمكن إدخال أكواد الخصم فقط في الصفحة " "الأولى من المتجر أسفل اختيار المنتج." -#: pretix/base/payment.py:149 +#: pretix/base/payment.py:151 msgid "This gift card is not known." msgstr "بطاقة الهدايا هذه غير معروفة." -#: pretix/base/payment.py:152 +#: pretix/base/payment.py:154 msgid "" "This gift card can not be redeemed since its code is not unique. Please " "contact the organizer of this event." @@ -7688,16 +7721,16 @@ msgstr "" "لا يمكن استرداد بطاقة الهدايا هذه نظرا لأن رمزها ليس فريدا. يرجى الاتصال " "بمنظم هذه الفعالية." -#: pretix/base/payment.py:313 +#: pretix/base/payment.py:315 #: pretix/presale/templates/pretixpresale/event/order.html:116 msgid "Pay now" msgstr "ادفع الآن" -#: pretix/base/payment.py:387 +#: pretix/base/payment.py:389 msgid "Enable payment method" msgstr "تفعيل طريقة الدفع" -#: pretix/base/payment.py:393 +#: pretix/base/payment.py:395 #, fuzzy #| msgid "" #| "Users will not be able to choose this payment provider after the given " @@ -7706,16 +7739,16 @@ msgid "" "Users will not be able to choose this payment provider before the given date." msgstr "لن يتمكن المستخدمون من اختيار مزود خدمة الدفع هذا بعد التاريخ المحدد." -#: pretix/base/payment.py:399 +#: pretix/base/payment.py:401 msgid "" "Users will not be able to choose this payment provider after the given date." msgstr "لن يتمكن المستخدمون من اختيار مزود خدمة الدفع هذا بعد التاريخ المحدد." -#: pretix/base/payment.py:404 +#: pretix/base/payment.py:406 msgid "Minimum order total" msgstr "إجمالي الحد الأدنى للطلب" -#: pretix/base/payment.py:405 +#: pretix/base/payment.py:407 msgid "" "This payment will be available only if the order total is equal to or " "exceeds the given value. The order total for this purpose may be computed " @@ -7725,11 +7758,11 @@ msgstr "" "المحددة. يمكن حساب إجمالي الطلب لهذا الغرض دون الأخذ في الاعتبار الرسوم " "المفروضة بواسطة طريقة الدفع هذه." -#: pretix/base/payment.py:415 +#: pretix/base/payment.py:417 msgid "Maximum order total" msgstr "الحد الأقصى لإجمالي الطلب" -#: pretix/base/payment.py:416 +#: pretix/base/payment.py:418 msgid "" "This payment will be available only if the order total is equal to or below " "the given value. The order total for this purpose may be computed without " @@ -7739,23 +7772,23 @@ msgstr "" "منها. يمكن حساب إجمالي الطلب لهذا الغرض دون الأخذ في الاعتبار الرسوم " "المفروضة بواسطة طريقة الدفع هذه." -#: pretix/base/payment.py:426 pretix/base/payment.py:435 +#: pretix/base/payment.py:428 pretix/base/payment.py:437 msgid "Additional fee" msgstr "رسوم إضافية" -#: pretix/base/payment.py:427 +#: pretix/base/payment.py:429 msgid "Absolute value" msgstr "قيمه مطلقه" -#: pretix/base/payment.py:436 +#: pretix/base/payment.py:438 msgid "Percentage of the order total." msgstr "النسبة المئوية للطلب الإجمالي." -#: pretix/base/payment.py:442 +#: pretix/base/payment.py:444 msgid "Calculate the fee from the total value including the fee." msgstr "احسب الرسوم من القيمة الإجمالية بما في ذلك الرسوم." -#: pretix/base/payment.py:443 +#: pretix/base/payment.py:445 #, python-brace-format msgid "" "We recommend to enable this if you want your users to pay the payment fees " @@ -7768,11 +7801,11 @@ msgstr "" "انقر هنا للحصول على معلومات مفصلة حول ما يمكنه هذا الخيار. لا تنس تحديد " "الرسوم الصحيحة أعلاه!" -#: pretix/base/payment.py:451 +#: pretix/base/payment.py:453 msgid "Text on invoices" msgstr "نص على الفواتير" -#: pretix/base/payment.py:452 +#: pretix/base/payment.py:454 msgid "" "Will be printed just below the payment figures and above the closing text on " "invoices. This will only be used if the invoice is generated before the " @@ -7783,11 +7816,11 @@ msgstr "" "استخدام هذا إلا إذا تم إنشاء الفاتورة قبل سداد الطلب. في حال تم إنشاء " "الفاتورة لاحقا ، فسيظهر نص يفيد بأنه تم الدفع مسبقا." -#: pretix/base/payment.py:461 +#: pretix/base/payment.py:463 msgid "Restrict to countries" msgstr "مقصور على البلدان" -#: pretix/base/payment.py:463 +#: pretix/base/payment.py:465 msgid "" "Only allow choosing this payment provider for invoice addresses in the " "selected countries. If you don't select any country, all countries are " @@ -7797,16 +7830,16 @@ msgstr "" "لم تحدد أي بلد ، فسيسمح بجميع البلدان. يتم تمكين هذا الخيار فقط إذا كان " "عنوان الفاتورة مطلوبا." -#: pretix/base/payment.py:482 +#: pretix/base/payment.py:484 msgid "" "Only allow the usage of this payment provider in the selected sales channels." msgstr "السماح باستخدام مزود الدفع هذا فقط في قنوات المبيعات المحددة." -#: pretix/base/payment.py:486 +#: pretix/base/payment.py:488 msgid "Hide payment method" msgstr "إخفاء طريقة الدفع" -#: pretix/base/payment.py:489 +#: pretix/base/payment.py:491 msgid "" "The payment method will not be shown by default but only to people who enter " "the shop through a special link." @@ -7814,62 +7847,62 @@ msgstr "" "لن يتم عرض طريقة الدفع بشكل افتراضي إلا للأشخاص الذين يدخلون إلى المتجر من " "خلال رابط خاص." -#: pretix/base/payment.py:495 +#: pretix/base/payment.py:497 msgid "Link to enable payment method" msgstr "رابط لتمكين طريقة الدفع" -#: pretix/base/payment.py:504 +#: pretix/base/payment.py:506 msgid "Share this link with customers who should use this payment method." msgstr "شارك هذا الرابط مع العملاء الذين يجب عليهم استخدام طريقة الدفع هذه." -#: pretix/base/payment.py:509 +#: pretix/base/payment.py:511 msgid "Do not send a payment reminder mail" msgstr "" -#: pretix/base/payment.py:510 +#: pretix/base/payment.py:512 msgid "" "Users will not receive a reminder mail to pay for their order before it " "expires if they have chosen this payment method." msgstr "" -#: pretix/base/payment.py:557 +#: pretix/base/payment.py:559 msgctxt "invoice" msgid "The payment for this invoice has already been received." msgstr "تم استلام دفعة هذه الفاتورة سابقا." -#: pretix/base/payment.py:1022 +#: pretix/base/payment.py:1024 #, fuzzy #| msgid "This payment can not be canceled at the moment." msgid "" "This payment is already being processed and can not be canceled any more." msgstr "لا يمكن إلغاء هذه الدفعة في الوقت الراهن." -#: pretix/base/payment.py:1036 +#: pretix/base/payment.py:1038 msgid "Automatic refunds are not supported by this payment provider." msgstr "لا يدعم مزود الدفع هذا المبالغ المستردة التلقائية." -#: pretix/base/payment.py:1127 +#: pretix/base/payment.py:1129 msgid "" "No payment is required as this order only includes products which are free " "of charge." msgstr "لا يلزم الدفع لأن هذا الطلب يشمل فقط المنتجات المجانية." -#: pretix/base/payment.py:1134 +#: pretix/base/payment.py:1136 msgid "Free of charge" msgstr "معفي من الرسوم" -#: pretix/base/payment.py:1166 +#: pretix/base/payment.py:1168 msgid "Box office" msgstr "شباك التذاكر" -#: pretix/base/payment.py:1214 pretix/base/payment.py:1233 +#: pretix/base/payment.py:1216 pretix/base/payment.py:1235 #: 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:1219 pretix/plugins/banktransfer/payment.py:195 +#: pretix/base/payment.py:1221 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." @@ -7877,16 +7910,16 @@ msgstr "" "في وضع الاختبار ، يمكنك فقط تحديد هذا الطلب يدويا على أنه مدفوع في لوحة " "التحكم بعد إنشائه." -#: pretix/base/payment.py:1240 pretix/base/payment.py:1427 -#: pretix/plugins/banktransfer/payment.py:149 +#: pretix/base/payment.py:1242 pretix/base/payment.py:1458 +#: pretix/plugins/banktransfer/payment.py:150 msgid "Payment method name" msgstr "اسم طريقة الدفع" -#: pretix/base/payment.py:1244 +#: pretix/base/payment.py:1246 msgid "Payment process description during checkout" msgstr "وصف عملية الدفع أثناء تسجيل الخروج" -#: pretix/base/payment.py:1245 +#: pretix/base/payment.py:1247 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." @@ -7894,11 +7927,11 @@ msgstr "" "سيظهر هذا النص أثناء تسجيل الخروج عندما يختار المستخدم طريقة الدفع هذه. يجب " "أن يتم تقديم شرح موجز عن طريقة الدفع ." -#: pretix/base/payment.py:1250 +#: pretix/base/payment.py:1252 msgid "Payment process description in order confirmation emails" msgstr "وصف عملية الدفع في رسائل البريد الإلكتروني لتأكيد الطلب" -#: pretix/base/payment.py:1251 +#: pretix/base/payment.py:1253 #, python-brace-format msgid "" "This text will be included for the {payment_info} placeholder in order " @@ -7910,11 +7943,11 @@ msgstr "" "المستخدم إلى كيفية متابعة الدفع. {order}, {amount}, {currency} " "و{amount_with_currency}." -#: pretix/base/payment.py:1258 +#: pretix/base/payment.py:1260 msgid "Payment process description for pending orders" msgstr "وصف عملية الدفع للطلبات المعلقة" -#: pretix/base/payment.py:1259 +#: pretix/base/payment.py:1261 #, python-brace-format msgid "" "This text will be shown on the order confirmation page for pending orders. " @@ -7925,7 +7958,7 @@ msgstr "" "المستخدم إلى كيفية متابعة الدفع. يمكنك استخدام العناصر {order}, {amount}, " "{currency} و {amount_with_currency}." -#: pretix/base/payment.py:1267 pretix/plugins/banktransfer/payment.py:144 +#: pretix/base/payment.py:1269 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." @@ -7933,34 +7966,34 @@ msgstr "" "قم بإنشاء فاتورة للطلبات باستخدام التحويل المصرفي على الفور إذا تم إعداد " "الفعالية بطريقة أخرى تسمح بإنشاء الفواتير بعد إتمام الدفع." -#: pretix/base/payment.py:1318 +#: pretix/base/payment.py:1320 msgid "Offsetting" msgstr "تعويض" -#: pretix/base/payment.py:1332 pretix/control/views/orders.py:1255 +#: pretix/base/payment.py:1334 pretix/control/views/orders.py:1257 msgid "You entered an order that could not be found." msgstr "لقد أدخلت طلبا لا يمكن العثور عليه." -#: pretix/base/payment.py:1361 +#: pretix/base/payment.py:1363 #, python-format msgid "Balanced against orders: %s" msgstr "تم تسويتها مقابل الطلبات: %s" -#: pretix/base/payment.py:1433 +#: pretix/base/payment.py:1464 #, fuzzy #| msgid "Payment method name" msgid "Payment method description" msgstr "اسم طريقة الدفع" -#: pretix/base/payment.py:1463 +#: pretix/base/payment.py:1494 msgid "In test mode, only test cards will work." msgstr "في وضع الاختبار ، ستعمل بطاقات الاختبار فقط." -#: pretix/base/payment.py:1593 +#: pretix/base/payment.py:1624 msgid "This gift card is not accepted by this event organizer." msgstr "لم يتم قبول بطاقة الهدايا هذه من قبل منظم هذه الفعالية." -#: pretix/base/payment.py:1595 +#: pretix/base/payment.py:1626 msgid "This gift card was used in the meantime. Please try again." msgstr "تم استخدام بطاقة الهدايا هذه في هذه الأثناء. حاول مرة اخرى." @@ -7972,7 +8005,7 @@ msgstr "رمز التذكرة (محتوى الباركود)" msgid "Order position number" msgstr "رقم حالة الطلب" -#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1777 +#: pretix/base/pdf.py:123 pretix/control/forms/event.py:1778 #: pretix/control/templates/pretixcontrol/items/index.html:38 msgid "Product name" msgstr "اسم المنتج" @@ -8036,7 +8069,7 @@ msgid "Price including add-ons and bundled products" msgstr "السعر شاملا الإضافات" #: pretix/base/pdf.py:184 pretix/base/pdf.py:342 -#: pretix/base/services/invoices.py:487 +#: pretix/base/services/invoices.py:573 #: pretix/base/services/placeholders.py:571 #: pretix/base/services/placeholders.py:653 #: pretix/base/services/placeholders.py:669 @@ -8188,7 +8221,7 @@ msgstr "19:00" msgid "Event location" msgstr "موقع الفعالية" -#: pretix/base/pdf.py:327 pretix/base/settings.py:1172 +#: pretix/base/pdf.py:327 pretix/base/settings.py:1201 msgid "Random City" msgstr "مدينة عشوائية" @@ -8200,7 +8233,7 @@ msgstr "شارع سيسيم 42" msgid "12345" msgstr "12345" -#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:490 +#: pretix/base/pdf.py:362 pretix/base/services/invoices.py:576 msgid "Sample city" msgstr "مدينة مثال" @@ -8396,7 +8429,7 @@ msgstr "السيد دو" #: pretix/base/pdf.py:666 pretix/base/pdf.py:673 #: pretix/plugins/badges/exporters.py:501 #: pretix/plugins/checkinlists/exporters.py:125 -#: pretix/plugins/checkinlists/exporters.py:498 +#: pretix/plugins/checkinlists/exporters.py:499 #: pretix/plugins/ticketoutputpdf/exporters.py:99 #, python-brace-format msgid "Attendee name: {part}" @@ -8419,30 +8452,30 @@ msgstr "اسم عنوان الفاتورة: {part}" msgid "Your layout file is not a valid layout. Error message: {}" msgstr "ملف التخطيط الخاص بك ليس خطة جلوس صالحة. رسالة خطأ: {}" -#: pretix/base/plugins.py:136 +#: pretix/base/plugins.py:138 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:132 msgid "Features" msgstr "المميزات" -#: pretix/base/plugins.py:138 +#: pretix/base/plugins.py:140 #, fuzzy #| msgid "Invoice generation" msgid "Integrations" msgstr "جيل فاتورة" -#: pretix/base/plugins.py:139 +#: pretix/base/plugins.py:141 #, fuzzy #| msgid "Customer actions" msgid "Customizations" msgstr "إجراءات العملاء" -#: pretix/base/plugins.py:140 +#: pretix/base/plugins.py:142 #, fuzzy #| msgid "Export format" msgid "Output and export formats" msgstr "تنسيق التصدير" -#: pretix/base/plugins.py:141 +#: pretix/base/plugins.py:143 #, fuzzy #| msgid "Features" msgid "API features" @@ -8512,12 +8545,18 @@ msgstr "" "ويغير دلالات المسح دون اتصال - يرجى الرجوع إلى التوثيق أو الدعم للحصول على " "التفاصيل)" -#: pretix/base/services/cancelevent.py:230 -#: pretix/base/services/cancelevent.py:308 +#: pretix/base/services/cancelevent.py:277 +#: pretix/base/services/cancelevent.py:363 msgid "Event canceled" msgstr "تم إلغاء الفعالية" -#: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:235 +#: pretix/base/services/cancelevent.py:392 +#, fuzzy +#| msgid "Create configuration" +msgid "Bulk-refund confirmation" +msgstr "إنشاء التكوين" + +#: pretix/base/services/cart.py:102 pretix/base/services/modelimport.py:247 #: pretix/base/services/orders.py:155 msgid "" "We were not able to process your request completely as the server was too " @@ -8594,7 +8633,7 @@ msgstr[3] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب. msgstr[4] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." msgstr[5] "لا يمكنك تحديد أكثر من %s عناصر لكل طلب." -#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1598 +#: pretix/base/services/cart.py:131 pretix/base/services/orders.py:1628 #, fuzzy, python-format #| msgid "" #| "You cannot select more than %(max)s items of the product %(product)s." @@ -8608,7 +8647,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:1603 +#: pretix/base/services/cart.py:136 pretix/base/services/orders.py:1633 #, fuzzy, python-format #| msgid "" #| "You need to select at least %(min)s items of the product %(product)s." @@ -9131,40 +9170,40 @@ msgstr "الإتحاد الأوربي" msgid "Czech National Bank" msgstr "" -#: pretix/base/services/export.py:86 pretix/base/services/export.py:157 -#: pretix/base/services/export.py:215 +#: pretix/base/services/export.py:91 pretix/base/services/export.py:166 +#: pretix/base/services/export.py:228 msgid "Your export did not contain any data." msgstr "تصديرك لا يحتوي على أي بيانات." -#: pretix/base/services/export.py:151 +#: pretix/base/services/export.py:156 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "You do not have sufficient permission to perform this export." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/base/services/export.py:189 +#: pretix/base/services/export.py:198 #, fuzzy #| msgid "Exported files" msgid "Export failed" msgstr "الملفات المصدرة" -#: pretix/base/services/export.py:206 +#: pretix/base/services/export.py:215 #, fuzzy #| msgid "Permission denied" msgid "Permission denied." msgstr "تم رفض طلب الإذن" -#: pretix/base/services/export.py:221 +#: pretix/base/services/export.py:234 msgid "Your exported data exceeded the size limit for scheduled exports." msgstr "" -#: pretix/base/services/invoices.py:109 +#: pretix/base/services/invoices.py:115 #, python-brace-format msgctxt "invoice" msgid "Please complete your payment before {expire_date}." msgstr "يرجى إتمام عملية الدفع قبل {expire_date}." -#: pretix/base/services/invoices.py:121 +#: pretix/base/services/invoices.py:127 #, python-brace-format msgctxt "invoice" msgid "" @@ -9180,52 +9219,52 @@ msgstr "" "{i.zipcode} {i.city} {state}\n" "{country}" -#: pretix/base/services/invoices.py:229 pretix/base/services/invoices.py:266 +#: pretix/base/services/invoices.py:237 pretix/base/services/invoices.py:274 #, fuzzy, python-brace-format #| msgid "Event location" msgctxt "invoice" msgid "Event location: {location}" msgstr "موقع الفعالية" -#: pretix/base/services/invoices.py:245 +#: pretix/base/services/invoices.py:253 #, python-brace-format msgctxt "invoice" msgid "Attendee: {name}" msgstr "الحاضر: {name}" -#: pretix/base/services/invoices.py:263 pretix/plugins/reports/exporters.py:309 +#: pretix/base/services/invoices.py:271 pretix/plugins/reports/exporters.py:309 #, python-brace-format msgctxt "subevent" msgid "Date: {}" msgstr "تاريخ: {}" -#: pretix/base/services/invoices.py:480 +#: pretix/base/services/invoices.py:566 msgid "A payment provider specific text might appear here." msgstr "قد يظهر نص محدد لمزود خدمة الدفع هنا." -#: pretix/base/services/invoices.py:488 +#: pretix/base/services/invoices.py:574 msgid "214th Example Street" msgstr "مثال شارع رقم 214" -#: pretix/base/services/invoices.py:489 +#: pretix/base/services/invoices.py:575 msgid "012345" msgstr "012345" -#: pretix/base/services/invoices.py:506 +#: pretix/base/services/invoices.py:592 #, python-brace-format msgid "Sample product {}" msgstr "نموذج منتج {}" -#: pretix/base/services/invoices.py:516 +#: pretix/base/services/invoices.py:602 msgid "Sample product A" msgstr "نموذج منتج أ" -#: pretix/base/services/invoices.py:576 +#: pretix/base/services/invoices.py:662 #, python-brace-format msgid "New invoice: {number}" msgstr "فاتورة جديدة: {number}" -#: pretix/base/services/invoices.py:578 +#: pretix/base/services/invoices.py:664 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -9276,7 +9315,7 @@ msgstr "" msgid "You are receiving this email because you placed an order for {event}." msgstr "أنت تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا ل {event}." -#: pretix/base/services/mail.py:492 +#: pretix/base/services/mail.py:494 #, fuzzy #| msgid "resend invite" msgctxt "attachment_filename" @@ -9400,12 +9439,12 @@ msgstr "" "أنت تحاول استخدام عضوية من النوع \"{type}\" لفعالية تقام في {date} ، ولكنك " "استخدمت سابقا نفس العضوية لتذكرة مختلفة في نفس الوقت." -#: pretix/base/services/modelimport.py:53 +#: pretix/base/services/modelimport.py:56 #, python-brace-format msgid "Error decoding special characters in your file: {message}" msgstr "" -#: pretix/base/services/modelimport.py:71 +#: pretix/base/services/modelimport.py:74 #, python-brace-format msgid "" "Error while importing value \"{value}\" for column \"{column}\" in line " @@ -9414,33 +9453,33 @@ msgstr "" "خطأ أثناء استيراد القيمة \"{value}\" للعمود \"{column}\" في السطر \"{line}" "\": {message}" -#: pretix/base/services/modelimport.py:89 -#: pretix/base/services/modelimport.py:137 pretix/base/services/orders.py:1607 +#: pretix/base/services/modelimport.py:92 +#: pretix/base/services/modelimport.py:140 pretix/base/services/orders.py:1637 #, python-format msgid "Orders cannot have more than %(max)s positions." msgstr "" -#: pretix/base/services/modelimport.py:113 +#: pretix/base/services/modelimport.py:116 #, python-format msgid "" "The grouping \"%(value)s\" occurs on non-consecutive lines (seen again on " "line %(row)s)." msgstr "" -#: pretix/base/services/modelimport.py:151 +#: pretix/base/services/modelimport.py:154 #, python-brace-format msgid "" "Inconsistent data in row {row}: Column {col} contains value \"{val_line}\", " "but for this order, the value has already been set to \"{val_order}\"." msgstr "" -#: pretix/base/services/modelimport.py:165 -#: pretix/base/services/modelimport.py:277 +#: pretix/base/services/modelimport.py:168 +#: pretix/base/services/modelimport.py:289 #, python-brace-format msgid "Invalid data in row {row}: {message}" msgstr "بيانات غير صالحة في الصف {row}: {message}" -#: pretix/base/services/modelimport.py:258 +#: pretix/base/services/modelimport.py:270 #, fuzzy #| msgid "A voucher can not be deleted if it already has been redeemed." msgid "A voucher cannot be created without a code." @@ -9617,20 +9656,20 @@ msgstr "بطاقة الهدايا هذه لا تدعم هذه العملة." msgid "The order was not canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/base/services/orders.py:277 pretix/control/forms/orders.py:126 +#: pretix/base/services/orders.py:283 pretix/control/forms/orders.py:126 msgid "The new expiry date needs to be in the future." msgstr "يجب أن يكون تاريخ إنتهاء الصلاحية الجديد في المستقبل." -#: pretix/base/services/orders.py:371 pretix/base/services/orders.py:463 +#: pretix/base/services/orders.py:383 pretix/base/services/orders.py:481 msgid "This order is not pending approval." msgstr "هذا الطلب ليس في انتظار الموافقة." -#: pretix/base/services/orders.py:525 pretix/presale/views/order.py:930 -#: pretix/presale/views/order.py:984 +#: pretix/base/services/orders.py:543 pretix/presale/views/order.py:953 +#: pretix/presale/views/order.py:1007 msgid "You cannot cancel this order." msgstr "لا يمكنك إلغاء هذا الطلب." -#: pretix/base/services/orders.py:537 +#: pretix/base/services/orders.py:555 #, python-brace-format msgid "" "This order can not be canceled since the gift card {card} purchased in this " @@ -9639,7 +9678,7 @@ msgstr "" "لا يمكن إلغاء هذا الطلب لأنه تم بالفعل استرداد قيمة بطاقة الهدايا {card} " "المشتراة لهذا الطلب." -#: pretix/base/services/orders.py:600 pretix/control/forms/orders.py:219 +#: pretix/base/services/orders.py:618 pretix/control/forms/orders.py:219 #, fuzzy #| msgid "" #| "The cancellation fee cannot be higher than the payment credit of this " @@ -9648,13 +9687,13 @@ msgid "" "The cancellation fee cannot be higher than the total amount of this order." msgstr "لا يمكن أن تكون رسوم الإلغاء أعلى من رصيد الدفع لهذا الطلب." -#: pretix/base/services/orders.py:1000 +#: pretix/base/services/orders.py:1024 #, 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:1068 +#: pretix/base/services/orders.py:1092 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 " @@ -9664,31 +9703,31 @@ msgstr "" "الأسعار الآن ، أو أن بطاقة الهدايا التي استخدمتها جاري استعمالها في الوقت " "الحالي. يرجى التحقق من الأسعار أدناه والمحاولة مرة أخرى." -#: pretix/base/services/orders.py:1577 +#: pretix/base/services/orders.py:1607 msgid "You need to select a variation of the product." msgstr "تحتاج إلى تحديد نوع من المنتج." -#: pretix/base/services/orders.py:1578 +#: pretix/base/services/orders.py:1608 #, python-brace-format msgid "" "The quota {name} does not have enough capacity left to perform the operation." msgstr "الحصة {name} لم يتبق لديها سعة كافية لإجراء العملية." -#: pretix/base/services/orders.py:1579 +#: pretix/base/services/orders.py:1609 msgid "There is no quota defined that allows this operation." msgstr "لا توجد حصة محددة تسمح بهذه العملية." -#: pretix/base/services/orders.py:1580 +#: pretix/base/services/orders.py:1610 msgid "The selected product is not active or has no price set." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/services/orders.py:1581 +#: pretix/base/services/orders.py:1611 msgid "" "This operation would leave the order empty. Please cancel the order itself " "instead." msgstr "سيترك هذا الإجراء الطلب فارغا. يرجى إلغاء الطلب نفسه بدلا من ذلك." -#: pretix/base/services/orders.py:1583 +#: pretix/base/services/orders.py:1613 msgid "" "This operation would make the order free and therefore immediately paid, " "however no quota is available." @@ -9696,23 +9735,23 @@ msgstr "" "ستجعل هذه العملية الطلب مجانيا وبالتالي يتم دفعه على الفور ، إلا أنه لا " "تتوفر حصة." -#: pretix/base/services/orders.py:1586 +#: pretix/base/services/orders.py:1616 msgid "" "This is an add-on product, please select the base position it should be " "added to." msgstr "هذا منتج إضافي ، يرجى تحديد العنصر الأساسي الذي تجب الإضافة إليه." -#: pretix/base/services/orders.py:1587 +#: pretix/base/services/orders.py:1617 msgid "" "The selected base position does not allow you to add this product as an add-" "on." msgstr "لا يسمح لك العنصر المختار بإضافة هذا المنتج كقائمة مضافة." -#: pretix/base/services/orders.py:1588 +#: pretix/base/services/orders.py:1618 msgid "You need to choose a subevent for the new position." msgstr "تحتاج إلى اختيار فعالية فرعية للعنصر الجديد." -#: pretix/base/services/orders.py:1591 +#: pretix/base/services/orders.py:1621 #, python-brace-format msgid "" "You selected seat \"{seat}\" for a date that does not match the selected " @@ -9721,25 +9760,25 @@ msgstr "" "لقد حددت المقعد \"{seat}\" لتاريخ لا يتطابق مع تاريخ التذكرة المحدد. الرجاء " "اختيار مقعد مرة أخرى." -#: pretix/base/services/orders.py:1593 +#: pretix/base/services/orders.py:1623 msgid "The selected product requires you to select a seat." msgstr "المنتج المحدد يتطلب منك اختيار مقعد." -#: pretix/base/services/orders.py:1594 +#: pretix/base/services/orders.py:1624 msgid "The selected product does not allow to select a seat." msgstr "المنتج المحدد لا يسمح باختيار مقعد." -#: pretix/base/services/orders.py:1595 +#: pretix/base/services/orders.py:1625 msgid "The selected country is blocked by your tax rule." msgstr "تم حظر البلد المحدد من خلال القاعدة الضريبية الخاصة بك." -#: pretix/base/services/orders.py:1596 +#: pretix/base/services/orders.py:1626 msgid "" "You cannot change the price of a position that has been used to issue a gift " "card." msgstr "لا يمكنك تغيير سعر العنصر الذي تم استخدامه لإصدار بطاقة هدايا." -#: pretix/base/services/orders.py:2421 pretix/base/services/orders.py:2438 +#: pretix/base/services/orders.py:2451 pretix/base/services/orders.py:2468 #, python-brace-format msgid "" "A position can not be canceled since the gift card {card} purchased in this " @@ -9748,7 +9787,7 @@ msgstr "" "لا يمكن إلغاء العنصر نظرا لأنه تم بالفعل استرداد قيمة بطاقة الهدايا {card} " "المشتراة في هذا الطلب." -#: pretix/base/services/orders.py:3133 +#: pretix/base/services/orders.py:3182 msgid "" "There was an error while trying to send the money back to you. Please " "contact the event organizer for further information." @@ -9915,7 +9954,7 @@ msgstr "" msgid "Plugin: %s" msgstr "المكونات الإضافية: %s" -#: pretix/base/services/vouchers.py:56 pretix/control/logdisplay.py:579 +#: pretix/base/services/vouchers.py:56 pretix/control/logdisplay.py:580 #, python-brace-format msgid "The voucher has been sent to {recipient}." msgstr "تم إرسال كود الخصم إلى {recipient}." @@ -10371,7 +10410,7 @@ msgstr "" msgid "Only respected by some invoice renderers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:744 pretix/base/settings.py:2959 +#: pretix/base/settings.py:744 pretix/base/settings.py:2988 #: pretix/control/templates/pretixcontrol/pdf/index.html:436 msgid "Font" msgstr "الخط" @@ -10651,11 +10690,41 @@ msgstr "تلقائيا لجميع الطلبات التي تم إنشاؤها" msgid "Invoices will never be automatically generated for free orders." msgstr "لن يتم إنشاء الفواتير تلقائيا للطلبات المجانية." -#: pretix/base/settings.py:1107 +#: pretix/base/settings.py:1108 pretix/base/settings.py:1119 +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 +msgid "Automatic, but prefer invoice date over event date" +msgstr "" + +#: pretix/base/settings.py:1112 pretix/base/settings.py:1123 +#, fuzzy +#| msgctxt "invoice" +#| msgid "Invoice date" +msgid "Invoice date" +msgstr "تاريخ الفاتورة" + +#: pretix/base/settings.py:1116 +#, fuzzy +#| msgctxt "subevent" +#| msgid "Date ordering" +msgid "Date of service" +msgstr "ترتيب التاريخ" + +#: pretix/base/settings.py:1125 +msgid "" +"This controls what dates are shown on the invoice, but is especially " +"important for electronic invoicing." +msgstr "" + +#: pretix/base/settings.py:1136 msgid "Automatically cancel and reissue invoice on address changes" msgstr "إلغاء الفاتورة تلقائيا عند تغيير العنوان وإعادة إصدارها" -#: pretix/base/settings.py:1108 +#: pretix/base/settings.py:1137 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 " @@ -10665,50 +10734,50 @@ msgstr "" "الفاتورة تلقائيا وسيتم إصدار فاتورة جديدة. لن يؤثر هذا الإعداد على التعديلات " "في لوحة التحكم." -#: pretix/base/settings.py:1119 +#: pretix/base/settings.py:1148 msgid "Allow to update existing invoices" msgstr "" -#: pretix/base/settings.py:1120 +#: pretix/base/settings.py:1149 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:1135 +#: pretix/base/settings.py:1164 msgid "Address line" msgstr "العنوان" -#: pretix/base/settings.py:1139 +#: pretix/base/settings.py:1168 msgid "Albert Einstein Road 52" msgstr "شارع ألبرت أينشتاين 52" -#: pretix/base/settings.py:1191 +#: pretix/base/settings.py:1220 msgid "Domestic tax ID" msgstr "معرف الضريبة المحلية" -#: pretix/base/settings.py:1192 +#: pretix/base/settings.py:1221 msgid "e.g. tax number in Germany, ABN in Australia, …" msgstr "على سبيل المثال الرقم الضريبي في ألمانيا ، رقم العمل الأسترالي،…" -#: pretix/base/settings.py:1201 +#: pretix/base/settings.py:1230 msgid "EU VAT ID" msgstr "رقم ضريبة القيمة المضافة في الاتحاد الأوروبي" -#: pretix/base/settings.py:1214 +#: pretix/base/settings.py:1243 msgid "e.g. With this document, we sent you the invoice for your ticket order." msgstr "على سبيل المثال باستخدام هذا المستند ، أرسلنا إليك فاتورة طلب تذكرتك." -#: pretix/base/settings.py:1217 +#: pretix/base/settings.py:1246 msgid "Introductory text" msgstr "نص تمهيدي" -#: pretix/base/settings.py:1218 +#: pretix/base/settings.py:1247 msgid "Will be printed on every invoice above the invoice rows." msgstr "ستتم طباعتها على كل فاتورة فوق صفوف الفاتورة." -#: pretix/base/settings.py:1231 +#: pretix/base/settings.py:1260 msgid "" "e.g. Thank you for your purchase! You can find more information on the event " "at ..." @@ -10716,15 +10785,15 @@ msgstr "" "مثلا شكرا لك على الشراء! يمكنك العثور على مزيد من المعلومات حول هذه الفعالية " "في ..." -#: pretix/base/settings.py:1234 +#: pretix/base/settings.py:1263 msgid "Additional text" msgstr "نص إضافي" -#: pretix/base/settings.py:1235 +#: pretix/base/settings.py:1264 msgid "Will be printed on every invoice below the invoice total." msgstr "ستتم الطباعة على كل فاتورة تحت إجمالي الفاتورة." -#: pretix/base/settings.py:1248 +#: pretix/base/settings.py:1277 msgid "" "e.g. your bank details, legal details like your VAT ID, registration " "numbers, etc." @@ -10732,21 +10801,21 @@ msgstr "" "مثلا تفاصيل حسابك المصرفي، التفاصيل القانونية مثل معرف ضريبة القيمة المضافة، " "أرقام التسجيل، الخ." -#: pretix/base/settings.py:1251 +#: pretix/base/settings.py:1280 msgid "Footer" msgstr "تذييل" -#: pretix/base/settings.py:1252 +#: pretix/base/settings.py:1281 msgid "" "Will be printed centered and in a smaller font at the end of every invoice " "page." msgstr "ستتم طباعتها في المنتصف وبخط أصغر في نهاية كل صفحة فاتورة." -#: pretix/base/settings.py:1265 +#: pretix/base/settings.py:1294 msgid "Attach invoices to emails" msgstr "إرفق الفواتير في رسائل البريد الإلكتروني" -#: pretix/base/settings.py:1266 +#: pretix/base/settings.py:1295 msgid "" "If invoices are automatically generated for all orders, they will be " "attached to the order confirmation mail. If they are automatically generated " @@ -10757,11 +10826,11 @@ msgstr "" "الطلب. إذا تم إنشاؤها تلقائيا عند الدفع ، فسيتم إرفاقها ببريد تأكيد الدفع. " "إذا لم يتم إنشاؤها تلقائيا ، فلن يتم إرفاقها برسائل البريد الإلكتروني." -#: pretix/base/settings.py:1278 +#: pretix/base/settings.py:1307 msgid "Email address to receive a copy of each invoice" msgstr "عنوان البريد الإلكتروني لتلقي نسخة من كل فاتورة" -#: pretix/base/settings.py:1279 +#: pretix/base/settings.py:1308 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 " @@ -10771,28 +10840,28 @@ msgstr "" "وقت قصير من إنشائها. يمكنك استخدام هذا للاستيراد الآلي للفواتير إلى نظام " "المحاسبة الخاص بك. ستكون الفاتورة هي المرفق الوحيد بالبريد الإلكتروني." -#: pretix/base/settings.py:1294 +#: pretix/base/settings.py:1323 msgid "Show items outside presale period" msgstr "إظهار العناصر خارج فترة عرض ما قبل البيع" -#: pretix/base/settings.py:1295 +#: pretix/base/settings.py:1324 msgid "" "Show item details before presale has started and after presale has ended" msgstr "إظهار تفاصيل العنصر قبل بداية البيع المسبق وبعد انتهائه" -#: pretix/base/settings.py:1315 +#: pretix/base/settings.py:1344 msgid "Available languages" msgstr "اللغات المتاحة" -#: pretix/base/settings.py:1331 pretix/control/forms/event.py:139 +#: pretix/base/settings.py:1360 pretix/control/forms/event.py:139 msgid "Default language" msgstr "اللغة الافتراضية" -#: pretix/base/settings.py:1341 +#: pretix/base/settings.py:1370 msgid "Region" msgstr "منطقة" -#: pretix/base/settings.py:1342 +#: pretix/base/settings.py:1371 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 " @@ -10804,13 +10873,13 @@ msgstr "" "من اللغة وبالتالي فهو مناسب في الغالب للغات المستخدمة في مناطق مختلفة على " "مستوى العالم (مثل اللغة الإنجليزية)." -#: pretix/base/settings.py:1354 +#: pretix/base/settings.py:1383 #, fuzzy #| msgid "This is not an event series." msgid "This shop represents an event" msgstr "هذه ليست سلسلة فعالية." -#: pretix/base/settings.py:1356 +#: pretix/base/settings.py:1385 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 " @@ -10819,19 +10888,19 @@ msgid "" "may still show up in other places." msgstr "" -#: pretix/base/settings.py:1369 +#: pretix/base/settings.py:1398 msgid "Show event end date" msgstr "إظهار تاريخ انتهاء الفعالية" -#: pretix/base/settings.py:1370 +#: pretix/base/settings.py:1399 msgid "If disabled, only event's start date will be displayed to the public." msgstr "إذا تم تعطيل هذا الخيار، فسيظهر للجمهور تاريخ بداية الفعالية فقط." -#: pretix/base/settings.py:1379 +#: pretix/base/settings.py:1408 msgid "Show dates with time" msgstr "عرض التواريخ مع الوقت" -#: pretix/base/settings.py:1380 +#: pretix/base/settings.py:1409 msgid "" "If disabled, the event's start and end date will be displayed without the " "time of day." @@ -10839,27 +10908,27 @@ msgstr "" "إذا تم تعطيل هذا الخيار ، فسيتم عرض تاريخ بداية الفعالية وانتهائها بدون " "توقيت اليوم." -#: pretix/base/settings.py:1389 +#: pretix/base/settings.py:1418 msgid "Hide all products that are sold out" msgstr "إخفاء جميع المنتجات التي تم بيعها" -#: pretix/base/settings.py:1399 pretix/control/forms/event.py:1691 +#: pretix/base/settings.py:1428 pretix/control/forms/event.py:1692 msgid "Publicly show how many tickets of a certain type are still available." msgstr "اعرض علنا عدد التذاكر من نوع معين والتي لا تزال متاحة." -#: pretix/base/settings.py:1408 +#: pretix/base/settings.py:1437 msgid "Ask search engines not to index the ticket shop" msgstr "اطلب من محركات البحث عدم فهرسة متجر التذاكر" -#: pretix/base/settings.py:1417 +#: pretix/base/settings.py:1446 msgid "Show variations of a product expanded by default" msgstr "إظهار الأشكال المختلفة للمنتج موسعة بشكل افتراضي" -#: pretix/base/settings.py:1426 +#: pretix/base/settings.py:1455 msgid "Enable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1427 pretix/control/forms/event.py:1696 +#: pretix/base/settings.py:1456 pretix/control/forms/event.py:1697 #, fuzzy msgid "" "Once a ticket is sold out, people can add themselves to a waiting list. As " @@ -10871,11 +10940,11 @@ msgstr "" "تصبح التذكرة متاحة مرة أخرى ، سيتم حجزها لأول شخص في قائمة الانتظار وسيتلقى " "هذا الشخص إشعارا بالبريد الإلكتروني مع قسيمة يمكن استخدامها لشراء تذكرة." -#: pretix/base/settings.py:1438 +#: pretix/base/settings.py:1467 msgid "Automatic waiting list assignments" msgstr "مهام قائمة الانتظار التلقائية" -#: pretix/base/settings.py:1439 +#: pretix/base/settings.py:1468 #, fuzzy msgid "" "If ticket capacity becomes free, automatically create a voucher and send it " @@ -10889,11 +10958,11 @@ msgstr "" "البريد الإلكتروني تلقائيا ولكن يمكنك إرسالها يدويا عبر لوحة التحكم. إذا قمت " "بتعطيل قائمة الانتظار مع إبقاء هذا الخيار مفعلا ، فسيستمر إرسال التذاكر." -#: pretix/base/settings.py:1455 +#: pretix/base/settings.py:1484 msgid "Waiting list response time" msgstr "وقت استجابة قائمة الانتظار" -#: pretix/base/settings.py:1458 +#: pretix/base/settings.py:1487 #, fuzzy msgid "" "If a ticket voucher is sent to a person on the waiting list, it has to be " @@ -10904,13 +10973,13 @@ msgstr "" "خلال هذا العدد من الساعات حتى تنتهي صلاحيتها ويمكن إعادة تخصيصها إلى الشخص " "التالي في القائمة." -#: pretix/base/settings.py:1469 +#: pretix/base/settings.py:1498 #, fuzzy #| msgid "Enable waiting list" msgid "Disable waiting list" msgstr "تمكين قائمة الانتظار" -#: pretix/base/settings.py:1470 +#: pretix/base/settings.py:1499 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 " @@ -10919,56 +10988,56 @@ msgid "" "remain active." msgstr "" -#: pretix/base/settings.py:1482 +#: pretix/base/settings.py:1511 msgid "Ask for a name" msgstr "اطلب الاسم" -#: pretix/base/settings.py:1483 +#: pretix/base/settings.py:1512 msgid "Ask for a name when signing up to the waiting list." msgstr "اطلب اسما عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1492 +#: pretix/base/settings.py:1521 msgid "Require name" msgstr "اطلب اسم" -#: pretix/base/settings.py:1493 +#: pretix/base/settings.py:1522 msgid "Require a name when signing up to the waiting list.." msgstr "طلب اسم عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1503 +#: pretix/base/settings.py:1532 msgid "Ask for a phone number" msgstr "اطلب رقم هاتف" -#: pretix/base/settings.py:1504 +#: pretix/base/settings.py:1533 msgid "Ask for a phone number when signing up to the waiting list." msgstr "اطلب رقم هاتف عند التسجيل في قائمة الانتظار." -#: pretix/base/settings.py:1513 +#: pretix/base/settings.py:1542 msgid "Require phone number" msgstr "يلزم رقم الهاتف" -#: pretix/base/settings.py:1514 +#: pretix/base/settings.py:1543 msgid "Require a phone number when signing up to the waiting list.." msgstr "طلب رقم هاتف عند التسجيل في قائمة الانتظار .." -#: pretix/base/settings.py:1524 +#: pretix/base/settings.py:1553 msgid "Phone number explanation" msgstr "تفسير رقم الهاتف" -#: pretix/base/settings.py:1527 +#: pretix/base/settings.py:1556 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:1539 +#: pretix/base/settings.py:1568 #, 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:1543 +#: pretix/base/settings.py:1572 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 " @@ -10977,13 +11046,13 @@ msgid "" "ticket at a time." msgstr "" -#: pretix/base/settings.py:1555 +#: pretix/base/settings.py:1584 #, fuzzy #| msgid "Show number of tickets left" msgid "Show number of check-ins to customer" msgstr "إظهار عدد التذاكر المتبقية" -#: pretix/base/settings.py:1556 +#: pretix/base/settings.py:1585 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 " @@ -10993,19 +11062,19 @@ msgid "" "check-in lists." msgstr "" -#: pretix/base/settings.py:1569 +#: pretix/base/settings.py:1598 msgid "Allow users to download tickets" msgstr "السماح للمستخدمين بتحميل التذاكر" -#: pretix/base/settings.py:1570 +#: pretix/base/settings.py:1599 msgid "If this is off, nobody can download a ticket." msgstr "إذا تم تعطيل هذا الخيار، فلا يمكن لأي شخص تنزيل تذكرة." -#: pretix/base/settings.py:1579 +#: pretix/base/settings.py:1608 msgid "Download date" msgstr "تاريخ التنزيل" -#: pretix/base/settings.py:1580 +#: pretix/base/settings.py:1609 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 " @@ -11015,13 +11084,13 @@ msgstr "" "الفعاليات وكان الطلب يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيكون تنزيل " "جميع التذاكر متاحا إذا سمح بذلك أحد تواريخ الفعالية على الأقل." -#: pretix/base/settings.py:1591 +#: pretix/base/settings.py:1620 #, fuzzy #| msgid "Generate tickets for add-on products" msgid "Generate tickets for add-on products and bundled products" msgstr "إنشاء تذاكر للمنتجات الإضافية" -#: pretix/base/settings.py:1592 +#: pretix/base/settings.py:1621 #, fuzzy #| msgid "" #| "By default, tickets are only issued for products selected individually, " @@ -11036,11 +11105,11 @@ msgstr "" "للمنتجات الإضافية. باستخدام هذا الخيار ، يتم إصدار تذكرة منفصلة لكل منتج " "إضافي أيضا." -#: pretix/base/settings.py:1605 +#: pretix/base/settings.py:1634 msgid "Generate tickets for all products" msgstr "إنشاء تذاكر لجميع المنتجات" -#: pretix/base/settings.py:1606 +#: pretix/base/settings.py:1635 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 " @@ -11050,11 +11119,11 @@ msgstr "" "\"بطاقة دخول\" عليها في إعدادات المنتج. يمكنك أيضا إيقاف تشغيل إصدار التذاكر " "لكل منتج على حدة." -#: pretix/base/settings.py:1618 +#: pretix/base/settings.py:1647 msgid "Generate tickets for pending orders" msgstr "إصدار تذاكر للطلبات المعلقة" -#: pretix/base/settings.py:1619 +#: pretix/base/settings.py:1648 msgid "" "If turned off, ticket downloads are only possible after an order has been " "marked as paid." @@ -11062,11 +11131,11 @@ msgstr "" "إذا تم إيقاف تشغيل هذا الخيار، فلن يكون تنزيل التذاكر ممكنا إلا بعد وضع " "علامة على الطلب على أنه مدفوع." -#: pretix/base/settings.py:1630 +#: pretix/base/settings.py:1659 msgid "Do not issue ticket before email address is validated" msgstr "لا تصدر تذكرة قبل التحقق من صحة عنوان البريد الإلكتروني" -#: pretix/base/settings.py:1631 +#: pretix/base/settings.py:1660 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 " @@ -11079,13 +11148,13 @@ msgstr "" "جدا)، وسيتمكن العميل من تنزيلها من الصفحة بمجرد النقر على الرابط في البريد " "الإلكتروني. لا يؤثر على الطلبات المنفذة من خلال قنوات البيع الأخرى." -#: pretix/base/settings.py:1647 +#: pretix/base/settings.py:1676 #, fuzzy #| msgid "Quota availabilities" msgid "Low availability threshold" msgstr "توافر الحصة" -#: pretix/base/settings.py:1648 +#: pretix/base/settings.py:1677 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 " @@ -11093,11 +11162,11 @@ msgid "" "availability will not be shown publicly." msgstr "" -#: pretix/base/settings.py:1662 +#: pretix/base/settings.py:1691 msgid "Show availability in event overviews" msgstr "إظهار التوفر في \"نبذة عن الفعالية\"" -#: pretix/base/settings.py:1663 +#: pretix/base/settings.py:1692 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 " @@ -11107,24 +11176,24 @@ msgstr "" "يؤدي هذا إلى إطالة وقت تحميل الصفحات إذا كان لديك الكثير من الفعاليات وقد " "تكون الحالة المعروضة قديمة لمدة تصل إلى دقيقتين." -#: pretix/base/settings.py:1676 pretix/base/settings.py:1684 +#: pretix/base/settings.py:1705 pretix/base/settings.py:1713 #: pretix/presale/templates/pretixpresale/fragment_calendar_nav.html:8 msgid "List" msgstr "قائمة" -#: pretix/base/settings.py:1677 pretix/base/settings.py:1685 +#: pretix/base/settings.py:1706 pretix/base/settings.py:1714 msgid "Week calendar" msgstr "تقويم الأسبوع" -#: pretix/base/settings.py:1678 pretix/base/settings.py:1686 +#: pretix/base/settings.py:1707 pretix/base/settings.py:1715 msgid "Month calendar" msgstr "تقويم الشهر" -#: pretix/base/settings.py:1682 +#: pretix/base/settings.py:1711 msgid "Default overview style" msgstr "نمط النظرة العامة الافتراضي" -#: pretix/base/settings.py:1688 +#: pretix/base/settings.py:1717 msgid "" "If your event series has more than 50 dates in the future, only the month or " "week calendar can be used." @@ -11132,13 +11201,13 @@ msgstr "" "إذا كانت سلسلة الفعاليات الخاصة بك تحتوي على أكثر من 50 تاريخا في المستقبل ، " "فيمكن استخدام تقويم الشهر أو الأسبوع فقط." -#: pretix/base/settings.py:1697 +#: pretix/base/settings.py:1726 #, 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:1698 +#: pretix/base/settings.py:1727 #, fuzzy #| msgid "The selected product is not active or has no price set." msgid "" @@ -11146,57 +11215,57 @@ msgid "" "settings." msgstr "المنتج المحدد غير نشط أو ليس له سعر محدد." -#: pretix/base/settings.py:1707 +#: pretix/base/settings.py:1736 msgid "Hide all unavailable dates from calendar or list views" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1708 pretix/base/settings.py:1719 +#: pretix/base/settings.py:1737 pretix/base/settings.py:1748 msgid "" "This option currently only affects the calendar of this event series, not " "the organizer-wide calendar." msgstr "" -#: pretix/base/settings.py:1718 +#: pretix/base/settings.py:1747 #, fuzzy #| msgid "Hide all unavailable dates from calendar or list views" msgid "Hide all past dates from calendar" msgstr "إخفاء جميع التواريخ غير المتاحة من التقويم أو طرق عرض القائمة" -#: pretix/base/settings.py:1730 pretix/base/settings.py:1739 +#: pretix/base/settings.py:1759 pretix/base/settings.py:1768 msgid "No modifications after order was submitted" msgstr "" -#: pretix/base/settings.py:1731 pretix/base/settings.py:1740 +#: pretix/base/settings.py:1760 pretix/base/settings.py:1769 #, fuzzy #| msgid "Only pending or paid orders can be changed." msgid "Only the person who ordered can make changes" msgstr "يمكن فقط تغيير الطلبات المعلقة أو المدفوعة." -#: pretix/base/settings.py:1732 pretix/base/settings.py:1741 +#: pretix/base/settings.py:1761 pretix/base/settings.py:1770 msgid "Both the attendee and the person who ordered can make changes" msgstr "" -#: pretix/base/settings.py:1736 +#: pretix/base/settings.py:1765 #, fuzzy #| msgid "Allow customers to modify their information after they checked in." msgid "Allow customers to modify their information" msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1751 +#: pretix/base/settings.py:1780 msgid "Allow customers to modify their information after they checked in." msgstr "اسمح للعملاء بتعديل معلوماتهم بعد تمام التسجيل." -#: pretix/base/settings.py:1752 +#: pretix/base/settings.py:1781 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:1762 +#: pretix/base/settings.py:1791 msgid "Last date of modifications" msgstr "آخر موعد لإجراء التعديلات" -#: pretix/base/settings.py:1763 +#: pretix/base/settings.py:1792 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 " @@ -11207,58 +11276,58 @@ msgstr "" "الحضور أو إجابات الأسئلة. إذا كنت تستخدم ميزة سلسلة الفعاليات وكان الطلب " "يحتوي على تذاكر لتواريخ فعاليات متعددة ، فسيتم استخدام أقرب تاريخ." -#: pretix/base/settings.py:1774 +#: pretix/base/settings.py:1803 msgid "Customers can change the variation of the products they purchased" msgstr "يمكن للعملاء تغيير تنوع المنتجات التي قاموا بشرائها" -#: pretix/base/settings.py:1783 +#: pretix/base/settings.py:1812 #, fuzzy #| msgid "Customers can cancel their paid orders" msgid "Customers can change their selected add-on products" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:1793 pretix/base/settings.py:1804 +#: pretix/base/settings.py:1822 pretix/base/settings.py:1833 msgid "" "Only allow changes if the resulting price is higher or equal than the " "previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى أو يساوي السعر السابق." -#: pretix/base/settings.py:1794 pretix/base/settings.py:1805 +#: pretix/base/settings.py:1823 pretix/base/settings.py:1834 msgid "" "Only allow changes if the resulting price is higher than the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1795 pretix/base/settings.py:1806 +#: pretix/base/settings.py:1824 pretix/base/settings.py:1835 msgid "" "Only allow changes if the resulting price is equal to the previous price." msgstr "السماح بالتغييرات فقط إذا كان السعر الناتج أعلى من السعر السابق." -#: pretix/base/settings.py:1796 pretix/base/settings.py:1807 +#: pretix/base/settings.py:1825 pretix/base/settings.py:1836 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:1798 pretix/base/settings.py:1809 +#: pretix/base/settings.py:1827 pretix/base/settings.py:1838 msgid "Allow changes regardless of price, even if this results in a refund." msgstr "" "السماح بالتغييرات بغض النظر عن السعر ، حتى لو أدى ذلك إلى استرداد الأموال." -#: pretix/base/settings.py:1802 +#: pretix/base/settings.py:1831 msgid "Requirement for changed prices" msgstr "شرط تغيير الأسعار" -#: pretix/base/settings.py:1820 +#: pretix/base/settings.py:1849 msgid "Do not allow changes after" msgstr "لا تسمح بالتغييرات بعد" -#: pretix/base/settings.py:1829 +#: pretix/base/settings.py:1858 #, 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:1830 +#: pretix/base/settings.py:1859 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 " @@ -11267,11 +11336,11 @@ msgid "" "limitation on price changes above." msgstr "" -#: pretix/base/settings.py:1842 +#: pretix/base/settings.py:1871 msgid "Allow individual attendees to change their ticket" msgstr "" -#: pretix/base/settings.py:1843 +#: pretix/base/settings.py:1872 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, " @@ -11280,45 +11349,45 @@ msgid "" "customer." msgstr "" -#: pretix/base/settings.py:1855 +#: pretix/base/settings.py:1884 msgid "Customers can cancel their unpaid orders" msgstr "يمكن للعملاء إلغاء طلباتهم غير المدفوعة" -#: pretix/base/settings.py:1867 +#: pretix/base/settings.py:1896 #, fuzzy #| msgid "Keep a fixed cancellation fee" msgid "Charge a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1868 pretix/base/settings.py:1879 -#: pretix/base/settings.py:1893 +#: pretix/base/settings.py:1897 pretix/base/settings.py:1908 +#: pretix/base/settings.py:1922 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:1878 +#: pretix/base/settings.py:1907 #, fuzzy #| msgid "Keep payment, shipping and service fees" msgid "Charge payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:1892 +#: pretix/base/settings.py:1921 #, fuzzy #| msgid "Keep a percentual cancellation fee" msgid "Charge a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:1903 pretix/base/settings.py:2042 +#: pretix/base/settings.py:1932 pretix/base/settings.py:2071 msgid "Do not allow cancellations after" msgstr "لا تسمح بالإلغاء بعد" -#: pretix/base/settings.py:1912 +#: pretix/base/settings.py:1941 msgid "Customers can cancel their paid orders" msgstr "يمكن للعملاء إلغاء طلباتهم المدفوعة" -#: pretix/base/settings.py:1913 +#: pretix/base/settings.py:1942 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." @@ -11326,29 +11395,29 @@ msgstr "" "سيتم رد الأموال المدفوعة تلقائيا إذا كانت طريقة الدفع تسمح بذلك. وبخلاف " "ذلك ، سيتم إنشاء استرداد يدوي لتتم معالجته يدويا." -#: pretix/base/settings.py:1926 pretix/control/forms/orders.py:909 +#: pretix/base/settings.py:1955 pretix/control/forms/orders.py:909 msgid "Keep a fixed cancellation fee" msgstr "احتفظ برسوم إلغاء ثابتة" -#: pretix/base/settings.py:1935 +#: pretix/base/settings.py:1964 msgid "Keep payment, shipping and service fees" msgstr "احتفظ برسوم السداد والشحن والخدمة" -#: pretix/base/settings.py:1947 pretix/control/forms/orders.py:920 +#: pretix/base/settings.py:1976 pretix/control/forms/orders.py:920 msgid "Keep a percentual cancellation fee" msgstr "احتفظ بنسبة رسوم الإلغاء" -#: pretix/base/settings.py:1956 +#: pretix/base/settings.py:1985 msgid "Allow customers to voluntarily choose a lower refund" msgstr "السماح للعملاء طواعية باختيار استرداد أقل" -#: pretix/base/settings.py:1957 +#: pretix/base/settings.py:1986 msgid "" "With this option enabled, your customers can choose to get a smaller refund " "to support you." msgstr "مع تمكين هذا الخيار ، يمكن لعملائك اختيار استرداد مبلغ أصغر لدعمك." -#: pretix/base/settings.py:1962 +#: pretix/base/settings.py:1991 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!" @@ -11356,12 +11425,12 @@ msgstr "" "إذا كنت تريد منا المساعدة في استمرار النشاط، فيرجى استخدام شريط التمرير " "أدناه لطلب استرداد مبلغ أقل. شكرا لك!" -#: pretix/base/settings.py:1969 +#: pretix/base/settings.py:1998 #, fuzzy msgid "Voluntary lower refund explanation" msgstr "تبرير تخفيض المبلغ الطوعي" -#: pretix/base/settings.py:1972 +#: pretix/base/settings.py:2001 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 " @@ -11372,11 +11441,11 @@ msgstr "" "الذي يمكن لعملائك استخدامه لاختيار المبلغ الذي يرغبون في استلامه. يمكنك " "استخدامه على سبيل المثال لشرح اختيار استرداد أقل مما سيساعد مؤسستك." -#: pretix/base/settings.py:1987 +#: pretix/base/settings.py:2016 msgid "Step size for reduction amount" msgstr "حجم مبلغ التخفيض" -#: pretix/base/settings.py:1988 +#: pretix/base/settings.py:2017 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 " @@ -11386,7 +11455,7 @@ msgstr "" "ذلك على سبيل المثال 10 ، سيكونون قادرين فقط على اختيار القيم بزيادات قدرها " "10." -#: pretix/base/settings.py:1998 +#: pretix/base/settings.py:2027 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." @@ -11394,68 +11463,68 @@ msgstr "" "يمكن للعملاء فقط طلب الإلغاء الذي يحتاج إلى موافقة منظم الفالية قبل إلغاء " "الطلب وإصدار أمر الاسترداد." -#: pretix/base/settings.py:2008 +#: pretix/base/settings.py:2037 msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" -#: pretix/base/settings.py:2017 pretix/base/settings.py:2027 +#: pretix/base/settings.py:2046 pretix/base/settings.py:2056 msgid "All refunds are issued to the original payment method" msgstr "يتم إصدار جميع المبالغ المستردة بطريقة الدفع الأصلية" -#: pretix/base/settings.py:2018 pretix/base/settings.py:2028 +#: pretix/base/settings.py:2047 pretix/base/settings.py:2057 msgid "" "Customers can choose between a gift card and a refund to their payment method" msgstr "" "يمكن للعملاء الاختيار بين بطاقة هدايا واسترداد الأموال بطريقة الدفع الخاصة " "بهم" -#: pretix/base/settings.py:2019 pretix/base/settings.py:2029 +#: pretix/base/settings.py:2048 pretix/base/settings.py:2058 msgid "All refunds are issued as gift cards" msgstr "يتم إصدار جميع المبالغ المستردة كبطاقات هدايا" -#: pretix/base/settings.py:2020 pretix/base/settings.py:2030 +#: pretix/base/settings.py:2049 pretix/base/settings.py:2059 msgid "Do not handle refunds automatically at all" msgstr "" -#: pretix/base/settings.py:2025 +#: pretix/base/settings.py:2054 #: pretix/control/templates/pretixcontrol/order/index.html:149 msgid "Refund method" msgstr "طريقة الاسترداد" -#: pretix/base/settings.py:2051 pretix/base/settings.py:2064 +#: pretix/base/settings.py:2080 pretix/base/settings.py:2093 #, fuzzy #| msgid "Generate cancellation" msgid "Terms of cancellation" msgstr "توليد إلغاء" -#: pretix/base/settings.py:2054 +#: pretix/base/settings.py:2083 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:2067 +#: pretix/base/settings.py:2096 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:2077 pretix/control/forms/event.py:1719 +#: pretix/base/settings.py:2106 pretix/control/forms/event.py:1720 msgid "Contact address" msgstr "عنوان الإتصال" -#: pretix/base/settings.py:2078 pretix/control/forms/event.py:1721 +#: pretix/base/settings.py:2107 pretix/control/forms/event.py:1722 msgid "We'll show this publicly to allow attendees to contact you." msgstr "سيظهر هذا علنا للسماح للحاضرين بالاتصال بك." -#: pretix/base/settings.py:2086 pretix/control/forms/event.py:1713 +#: pretix/base/settings.py:2115 pretix/control/forms/event.py:1714 msgid "Imprint URL" msgstr "رابط موقع مقدم الخدمة" -#: pretix/base/settings.py:2087 pretix/control/forms/event.py:1714 +#: pretix/base/settings.py:2116 pretix/control/forms/event.py:1715 msgid "" "This should point e.g. to a part of your website that has your contact " "details and legal information." @@ -11463,11 +11532,11 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2097 +#: pretix/base/settings.py:2126 msgid "Privacy Policy URL" msgstr "" -#: pretix/base/settings.py:2098 +#: pretix/base/settings.py:2127 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -11479,13 +11548,13 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2109 +#: pretix/base/settings.py:2138 #, fuzzy #| msgid "Account information" msgid "Accessibility information URL" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2110 +#: pretix/base/settings.py:2139 #, fuzzy #| msgid "" #| "This should point e.g. to a part of your website that has your contact " @@ -11497,7 +11566,7 @@ msgstr "" "ينبغي أن يشير هذا إلى على سبيل المثال جزء من موقع الويب الخاص بك الذي يحتوي " "على تفاصيل الاتصال الخاصة بك والمعلومات القانونية." -#: pretix/base/settings.py:2117 +#: pretix/base/settings.py:2146 #: pretix/presale/templates/pretixpresale/event/base.html:228 #: pretix/presale/templates/pretixpresale/event/base.html:233 #: pretix/presale/templates/pretixpresale/organizers/accessibility.html:6 @@ -11508,23 +11577,23 @@ msgstr "" msgid "Accessibility information" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2121 +#: pretix/base/settings.py:2150 #, fuzzy #| msgid "Account information" msgid "Accessibility information title" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2131 +#: pretix/base/settings.py:2160 #, fuzzy #| msgid "Account information" msgid "Accessibility information text" msgstr "معلومات الحساب" -#: pretix/base/settings.py:2152 +#: pretix/base/settings.py:2181 msgid "Attach ticket files" msgstr "إرفق ملفات التذكرة" -#: pretix/base/settings.py:2154 +#: pretix/base/settings.py:2183 #, python-brace-format msgid "" "Tickets will never be attached if they're larger than {size} to avoid email " @@ -11533,36 +11602,36 @@ msgstr "" "لن يتم إرفاق التذاكر أبدا إذا كان حجمها أكبر من {size} لتجنب مشاكل إرسال " "البريد الإلكتروني." -#: pretix/base/settings.py:2165 pretix/plugins/sendmail/forms.py:201 +#: pretix/base/settings.py:2194 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:2166 +#: pretix/base/settings.py:2195 msgid "" "If enabled, we will attach an .ics calendar file to order confirmation " "emails." msgstr "" "في حالة التمكين، سنرفق ملف تقويم ics. لرسائل البريد الإلكتروني لتأكيد الطلب." -#: pretix/base/settings.py:2175 +#: pretix/base/settings.py:2204 msgid "Attach calendar files only after order has been paid" msgstr "" -#: pretix/base/settings.py:2176 +#: pretix/base/settings.py:2205 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:2185 +#: pretix/base/settings.py:2214 #, fuzzy #| msgid "Product description" msgid "Event description" msgstr "وصف المنتج" -#: pretix/base/settings.py:2188 +#: pretix/base/settings.py:2217 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 " @@ -11572,11 +11641,11 @@ msgid "" "people." msgstr "" -#: pretix/base/settings.py:2201 +#: pretix/base/settings.py:2230 msgid "Subject prefix" msgstr "الرمز الذي يسبق الموضوع" -#: pretix/base/settings.py:2202 +#: pretix/base/settings.py:2231 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." @@ -11584,23 +11653,23 @@ msgstr "" "سيتم إضافة هذا مسبقا إلى موضوع جميع رسائل البريد الإلكتروني الصادرة ، محدد " "مثل [prefix]. اختر ، على سبيل المثال ، مسمى قصير لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2216 pretix/control/forms/mailsetup.py:37 +#: pretix/base/settings.py:2245 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:2217 pretix/control/forms/mailsetup.py:38 +#: pretix/base/settings.py:2246 pretix/control/forms/mailsetup.py:38 #: pretix/control/forms/mailsetup.py:120 msgid "Sender address for outgoing emails" msgstr "عنوان المرسل لرسائل البريد الإلكتروني الصادرة" -#: pretix/base/settings.py:2226 +#: pretix/base/settings.py:2255 msgid "Sender name" msgstr "اسم المرسل" -#: pretix/base/settings.py:2227 +#: pretix/base/settings.py:2256 msgid "" "Sender name used in conjunction with the sender address for outgoing emails. " "Defaults to your event name." @@ -11608,20 +11677,20 @@ msgstr "" "يتم استخدام اسم المرسل مع عنوان المرسل لرسائل البريد الإلكتروني الصادرة. " "افتراضات لاسم الفعالية الخاصة بك." -#: pretix/base/settings.py:2245 pretix/base/settings.py:2302 -#: pretix/base/settings.py:2319 pretix/base/settings.py:2337 +#: pretix/base/settings.py:2274 pretix/base/settings.py:2331 +#: pretix/base/settings.py:2348 pretix/base/settings.py:2366 #, python-brace-format msgid "Your order: {code}" msgstr "طلبك هو: {code}" -#: pretix/base/settings.py:2249 pretix/base/settings.py:2282 -#: pretix/base/settings.py:2387 pretix/base/settings.py:2620 -#: pretix/base/settings.py:2657 +#: 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 #, python-brace-format msgid "Your event registration: {code}" msgstr "تسجيل الفعالية الخاصة بك:{code}" -#: pretix/base/settings.py:2253 +#: pretix/base/settings.py:2282 #, python-brace-format msgid "" "Hello,\n" @@ -11646,12 +11715,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2266 +#: pretix/base/settings.py:2295 #, python-brace-format msgid "Your orders for {event}" msgstr "طلباتكم ل{event}" -#: pretix/base/settings.py:2270 +#: pretix/base/settings.py:2299 #, python-brace-format msgid "" "Hello,\n" @@ -11674,7 +11743,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2286 +#: pretix/base/settings.py:2315 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11697,7 +11766,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2306 +#: pretix/base/settings.py:2335 #, python-brace-format msgid "" "Hello,\n" @@ -11722,7 +11791,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2323 +#: pretix/base/settings.py:2352 #, python-brace-format msgid "" "Hello,\n" @@ -11749,7 +11818,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2341 +#: pretix/base/settings.py:2370 #, python-brace-format msgid "" "Hello,\n" @@ -11779,13 +11848,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2359 +#: pretix/base/settings.py:2388 #, fuzzy #| msgid "Split into new order" msgid "Attachment for new orders" msgstr "تنقسم إلى النظام الجديد" -#: pretix/base/settings.py:2364 +#: pretix/base/settings.py:2393 #, python-brace-format msgid "" "This file will be attached to the first email that we send for every new " @@ -11797,7 +11866,7 @@ msgid "" "vital email going to spam, you can only upload PDF files of up to {size} MB." msgstr "" -#: pretix/base/settings.py:2391 +#: pretix/base/settings.py:2420 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11820,12 +11889,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2403 +#: pretix/base/settings.py:2432 #, python-brace-format msgid "Your order has been changed: {code}" msgstr "تم تغيير طلبك: {code}" -#: pretix/base/settings.py:2407 +#: pretix/base/settings.py:2436 #, python-brace-format msgid "" "Hello,\n" @@ -11848,12 +11917,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2419 +#: pretix/base/settings.py:2448 #, python-brace-format msgid "Payment received for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2423 +#: pretix/base/settings.py:2452 #, python-brace-format msgid "" "Hello,\n" @@ -11880,12 +11949,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2441 +#: pretix/base/settings.py:2470 #, python-brace-format msgid "Event registration confirmed: {code}" msgstr "تم تأكيد تسجيل الفعالية: {code}" -#: pretix/base/settings.py:2445 +#: pretix/base/settings.py:2474 #, python-brace-format msgid "" "Hello {attendee_name},\n" @@ -11908,12 +11977,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2462 pretix/control/forms/event.py:1129 -#: pretix/control/forms/event.py:1243 pretix/plugins/sendmail/models.py:275 +#: pretix/base/settings.py:2491 pretix/control/forms/event.py:1130 +#: pretix/control/forms/event.py:1244 pretix/plugins/sendmail/models.py:275 msgid "Number of days" msgstr "عدد الأيام" -#: pretix/base/settings.py:2464 pretix/control/forms/event.py:1132 +#: pretix/base/settings.py:2493 pretix/control/forms/event.py:1133 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." @@ -11921,12 +11990,12 @@ msgstr "" "سيتم إرسال هذا البريد الإلكتروني من هذا عدة أيام قبل انتهاء صلاحية النظام. " "إذا كانت القيمة 0، لن يتم إرسال البريد." -#: pretix/base/settings.py:2472 +#: pretix/base/settings.py:2501 #, python-brace-format msgid "Your order is about to expire: {code}" msgstr "طلبك على وشك الانتهاء: {code}" -#: pretix/base/settings.py:2476 +#: pretix/base/settings.py:2505 #, python-brace-format msgid "" "Hello,\n" @@ -11953,12 +12022,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2490 +#: pretix/base/settings.py:2519 #, python-brace-format msgid "Your order is pending payment: {code}" msgstr "طلبك في انتظار الدفع: {code}" -#: pretix/base/settings.py:2494 +#: pretix/base/settings.py:2523 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -11996,13 +12065,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2507 +#: pretix/base/settings.py:2536 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Incomplete payment received: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2511 +#: pretix/base/settings.py:2540 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12043,13 +12112,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2527 +#: pretix/base/settings.py:2556 #, fuzzy, python-brace-format #| msgid "Payment received for your order: {code}" msgid "Payment failed for your order: {code}" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/base/settings.py:2531 +#: pretix/base/settings.py:2560 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12090,12 +12159,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2545 +#: pretix/base/settings.py:2574 #, python-brace-format msgid "You have been selected from the waitinglist for {event}" msgstr "لقد تم اختيارك من قائمة الانتظار ل{event}" -#: pretix/base/settings.py:2549 +#: pretix/base/settings.py:2578 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12167,12 +12236,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2578 +#: pretix/base/settings.py:2607 #, python-brace-format msgid "Order canceled: {code}" msgstr "تم إلغاء الطلب: {code}" -#: pretix/base/settings.py:2582 +#: pretix/base/settings.py:2611 #, python-brace-format msgid "" "Hello,\n" @@ -12199,12 +12268,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2596 +#: pretix/base/settings.py:2625 #, python-brace-format msgid "Order approved and awaiting payment: {code}" msgstr "تمت الموافقة على الطلب وفي انتظار الدفع: {code}" -#: pretix/base/settings.py:2600 +#: pretix/base/settings.py:2629 #, python-brace-format msgid "" "Hello,\n" @@ -12234,7 +12303,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2624 pretix/base/settings.py:2661 +#: pretix/base/settings.py:2653 pretix/base/settings.py:2690 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12267,12 +12336,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2636 +#: pretix/base/settings.py:2665 #, python-brace-format msgid "Order approved and confirmed: {code}" msgstr "تمت الموافقة على الطلب وتأكيده: {code}" -#: pretix/base/settings.py:2640 +#: pretix/base/settings.py:2669 #, python-brace-format msgid "" "Hello,\n" @@ -12297,12 +12366,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2673 +#: pretix/base/settings.py:2702 #, python-brace-format msgid "Order denied: {code}" msgstr "الطلب مرفوض: {code}" -#: pretix/base/settings.py:2677 +#: pretix/base/settings.py:2706 #, python-brace-format msgid "" "Hello,\n" @@ -12331,7 +12400,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2692 +#: pretix/base/settings.py:2721 #, python-brace-format msgid "" "Hello,\n" @@ -12350,13 +12419,13 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2702 +#: pretix/base/settings.py:2731 #, fuzzy, python-brace-format #| msgid "Invoice number" msgid "Invoice {invoice_number}" msgstr "رقم الفاتورة" -#: pretix/base/settings.py:2706 +#: pretix/base/settings.py:2735 #, fuzzy, python-brace-format #| msgid "" #| "Hello,\n" @@ -12388,12 +12457,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2724 pretix/base/settings.py:2740 +#: pretix/base/settings.py:2753 pretix/base/settings.py:2769 #, python-brace-format msgid "Your ticket is ready for download: {code}" msgstr "تذكرتك جاهزة للتنزيل: {code}" -#: pretix/base/settings.py:2728 +#: pretix/base/settings.py:2757 #, fuzzy, python-brace-format #| msgid "" #| "Hello {attendee_name},\n" @@ -12426,7 +12495,7 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2744 +#: pretix/base/settings.py:2773 #, python-brace-format msgid "" "Hello,\n" @@ -12449,12 +12518,12 @@ msgstr "" "تحياتنا،\n" "فريق {event}" -#: pretix/base/settings.py:2756 +#: pretix/base/settings.py:2785 #, python-brace-format msgid "Activate your account at {organizer}" msgstr "قم بتفعيل حسابك على {organizer}" -#: pretix/base/settings.py:2760 +#: pretix/base/settings.py:2789 #, python-brace-format msgid "" "Hello {name},\n" @@ -12489,12 +12558,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2778 +#: pretix/base/settings.py:2807 #, python-brace-format msgid "Confirm email address for your account at {organizer}" msgstr "تأكيد عنوان البريد الإلكتروني لحسابك على {organizer}" -#: pretix/base/settings.py:2782 +#: pretix/base/settings.py:2811 #, python-brace-format msgid "" "Hello {name},\n" @@ -12529,12 +12598,12 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2800 +#: pretix/base/settings.py:2829 #, python-brace-format msgid "Set a new password for your account at {organizer}" msgstr "قم بتعيين كلمة مرور جديدة لحسابك على {organizer}" -#: pretix/base/settings.py:2804 +#: pretix/base/settings.py:2833 #, python-brace-format msgid "" "Hello {name},\n" @@ -12569,57 +12638,57 @@ msgstr "" "\n" "فريق {organizer} الخاص بك" -#: pretix/base/settings.py:2856 pretix/base/settings.py:2863 -#: pretix/base/settings.py:2877 pretix/base/settings.py:2885 -#: pretix/base/settings.py:2899 pretix/base/settings.py:2907 -#: pretix/base/settings.py:2921 pretix/base/settings.py:2928 +#: 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 msgid "Please enter the hexadecimal code of a color, e.g. #990000." msgstr "الرجاء إدخال رمز عشري للون على سبيل المثال # 990000." -#: pretix/base/settings.py:2860 +#: pretix/base/settings.py:2889 msgid "Primary color" msgstr "لون أساسي" -#: pretix/base/settings.py:2881 +#: pretix/base/settings.py:2910 msgid "Accent color for success" msgstr "درجة لون لنجاح العملية" -#: pretix/base/settings.py:2882 +#: pretix/base/settings.py:2911 msgid "We strongly suggest to use a shade of green." msgstr "نقترح بشدة استخدام الظل الأخضر." -#: pretix/base/settings.py:2903 +#: pretix/base/settings.py:2932 msgid "Accent color for errors" msgstr "درجة لون الأخطاء" -#: pretix/base/settings.py:2904 +#: pretix/base/settings.py:2933 msgid "We strongly suggest to use a shade of red." msgstr "نقترح بشدة استخدام الظل الأحمر." -#: pretix/base/settings.py:2925 +#: pretix/base/settings.py:2954 msgid "Page background color" msgstr "لون خلفية الصفحة" -#: pretix/base/settings.py:2940 +#: pretix/base/settings.py:2969 msgid "Use round edges" msgstr "استخدم حواف مستديرة" -#: pretix/base/settings.py:2949 +#: pretix/base/settings.py:2978 msgid "" "Use native spinners in the widget instead of custom ones for numeric inputs " "such as quantity." msgstr "" -#: pretix/base/settings.py:2960 +#: pretix/base/settings.py:2989 msgid "Only respected by modern browsers." msgstr "يستخدم للمتصفحات الحديثة فقط." -#: pretix/base/settings.py:2971 pretix/base/settings.py:3015 +#: pretix/base/settings.py:3000 pretix/base/settings.py:3044 #: pretix/control/forms/organizer.py:523 msgid "Header image" msgstr "صورة رأسية" -#: pretix/base/settings.py:2974 +#: pretix/base/settings.py:3003 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your event name " @@ -12639,26 +12708,26 @@ msgstr "" "120 بكسل. يمكنك زيادة الحجم من خلال الإعداد أدناه. نوصي بعدم استخدام " "التفاصيل الصغيرة على الصورة حيث سيتغير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:2995 pretix/base/settings.py:3038 +#: pretix/base/settings.py:3024 pretix/base/settings.py:3067 msgid "Use header image in its full size" msgstr "استخدم الصورة الرأسية بحجمها الكامل" -#: pretix/base/settings.py:2996 pretix/base/settings.py:3039 +#: pretix/base/settings.py:3025 pretix/base/settings.py:3068 msgid "We recommend to upload a picture at least 1170 pixels wide." msgstr "نوصي بتحميل صورة لا يقل عرضها عن 1170 بكسل." -#: pretix/base/settings.py:3005 +#: pretix/base/settings.py:3034 msgid "Show event title even if a header image is present" msgstr "أعرض عنوان الفعالية حتى إذا كانت الصورة الرأسية موجودة" -#: pretix/base/settings.py:3006 +#: pretix/base/settings.py:3035 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:3018 pretix/control/forms/organizer.py:527 +#: pretix/base/settings.py:3047 pretix/control/forms/organizer.py:527 #, fuzzy #| msgid "" #| "If you provide a logo image, we will by default not show your " @@ -12678,15 +12747,15 @@ msgstr "" "الحجم من الإعداد أدناه. نوصي بعدم استخدام التفاصيل الصغيرة على الصورة حيث " "سيتم تغيير حجمها على الشاشات الصغيرة." -#: pretix/base/settings.py:3048 +#: pretix/base/settings.py:3077 msgid "Use header image also for events without an individually uploaded logo" msgstr "" -#: pretix/base/settings.py:3056 +#: pretix/base/settings.py:3085 msgid "Favicon" msgstr "فافيكون" -#: pretix/base/settings.py:3059 +#: pretix/base/settings.py:3088 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." @@ -12694,11 +12763,11 @@ msgstr "" "إذا قمت بتوفير فافيكون، وسوف نعرض بدلا من الافتراضي pretix رمز. نوصي حجم " "200x200px على الأقل لاستيعاب معظم الأجهزة." -#: pretix/base/settings.py:3075 +#: pretix/base/settings.py:3104 msgid "Social media image" msgstr "صورة وسائل التواصل الاجتماعي" -#: pretix/base/settings.py:3078 +#: pretix/base/settings.py:3107 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 " @@ -12712,19 +12781,19 @@ msgstr "" "لذلك نوصي بالتأكد من أنها لا تزال تبدو جيدة في حال كان المربع الأوسط هو الذي " "يظهر فقط. إذا لم تقم بملء هذا ، فسنستخدم الشعار المقدم أعلاه." -#: pretix/base/settings.py:3096 +#: pretix/base/settings.py:3125 msgid "Logo image" msgstr "صورة الشعار" -#: pretix/base/settings.py:3100 +#: pretix/base/settings.py:3129 msgid "We will show your logo with a maximal height and width of 2.5 cm." msgstr "سنعرض شعارك بارتفاع وعرض 2.5 سم كحد أقصى." -#: pretix/base/settings.py:3126 pretix/base/settings.py:3232 +#: pretix/base/settings.py:3155 pretix/base/settings.py:3261 msgid "Info text" msgstr "معلومات النص" -#: pretix/base/settings.py:3129 pretix/base/settings.py:3234 +#: pretix/base/settings.py:3158 pretix/base/settings.py:3263 msgid "" "Not displayed anywhere by default, but if you want to, you can use this e.g. " "in ticket templates." @@ -12732,11 +12801,11 @@ msgstr "" "لا يتم عرضه في أي مكان بشكل افتراضي ، ولكن إذا كنت ترغب في ذلك ، يمكنك " "استخدام هذا على سبيل المثال في قوالب التذاكر." -#: pretix/base/settings.py:3138 +#: pretix/base/settings.py:3167 msgid "Banner text (top)" msgstr "نص الشعار (أعلى)" -#: pretix/base/settings.py:3141 +#: pretix/base/settings.py:3170 msgid "" "This text will be shown above every page of your shop. Please only use this " "for very important messages." @@ -12744,11 +12813,11 @@ msgstr "" "سيظهر هذا النص فوق كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3151 +#: pretix/base/settings.py:3180 msgid "Banner text (bottom)" msgstr "نص الشعار (أسفل)" -#: pretix/base/settings.py:3154 +#: pretix/base/settings.py:3183 msgid "" "This text will be shown below every page of your shop. Please only use this " "for very important messages." @@ -12756,11 +12825,11 @@ msgstr "" "سيظهر هذا النص أسفل كل صفحة من صفحات متجرك. الرجاء استخدام هذا فقط للرسائل " "الهامة جدا." -#: pretix/base/settings.py:3164 +#: pretix/base/settings.py:3193 msgid "Voucher explanation" msgstr "تفسير لكود الخصم" -#: pretix/base/settings.py:3167 +#: pretix/base/settings.py:3196 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." @@ -12768,11 +12837,11 @@ msgstr "" "سيظهر هذا النص بجانب إدخال رمز كود الخصم. يمكنك استخدامه على سبيل المثال " "لشرح كيفية الحصول على رمز قسيمة." -#: pretix/base/settings.py:3177 +#: pretix/base/settings.py:3206 msgid "Attendee data explanation" msgstr "شرح بيانات الحضور" -#: pretix/base/settings.py:3180 +#: pretix/base/settings.py:3209 #, fuzzy #| msgid "" #| "This text will be shown above the questions asked for every admission " @@ -12785,11 +12854,11 @@ msgstr "" "سيتم عرض هذا النص فوق الأسئلة المطروحة لكل منتج مدخل. يمكنك استخدامه على " "سبيل المثال لشرح سبب حاجتك إلى معلومات منهم." -#: pretix/base/settings.py:3190 +#: pretix/base/settings.py:3219 msgid "Additional success message" msgstr "رسالة نجاح إضافية" -#: pretix/base/settings.py:3191 +#: pretix/base/settings.py:3220 msgid "" "This message will be shown after an order has been created successfully. It " "will be shown in additional to the default text." @@ -12797,11 +12866,11 @@ msgstr "" "ستظهر هذه الرسالة بعد إنشاء الطلب بنجاح. سيتم عرضه بالإضافة إلى النص " "الافتراضي." -#: pretix/base/settings.py:3203 +#: pretix/base/settings.py:3232 msgid "Help text of the phone number field" msgstr "نص المساعدة لحقل رقم الهاتف" -#: pretix/base/settings.py:3210 +#: pretix/base/settings.py:3239 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." @@ -12809,15 +12878,15 @@ msgstr "" "تأكد من إدخال عنوان بريد إلكتروني صالح. سنرسل إليك تأكيدا لطلبك يتضمن رابطا " "تحتاجه للوصول إلى طلبك لاحقا." -#: pretix/base/settings.py:3217 +#: pretix/base/settings.py:3246 msgid "Help text of the email field" msgstr "نص المساعدة لحقل البريد الإلكتروني" -#: pretix/base/settings.py:3243 +#: pretix/base/settings.py:3272 msgid "Allow creating a new team during event creation" msgstr "السماح بإنشاء فريق جديد أثناء إنشاء الفعالية" -#: pretix/base/settings.py:3244 +#: pretix/base/settings.py:3273 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 " @@ -12829,36 +12898,36 @@ msgstr "" "الإعداد للمستخدمين بإنشاء فريق محدد للفعاية أثناء التنقل ، حتى عندما لا يكون " "لديهم إذن \"إمكانية تغيير الفرق والتصاريح\"." -#: pretix/base/settings.py:3316 pretix/base/settings.py:3326 +#: pretix/base/settings.py:3345 pretix/base/settings.py:3355 msgid "Event start time (descending)" msgstr "وقت بدء الفعالية (تنازلي)" -#: pretix/base/settings.py:3318 pretix/base/settings.py:3328 +#: pretix/base/settings.py:3347 pretix/base/settings.py:3357 msgid "Name (descending)" msgstr "الاسم (تنازلي)" -#: pretix/base/settings.py:3323 +#: pretix/base/settings.py:3352 msgctxt "subevent" msgid "Date ordering" msgstr "ترتيب التاريخ" -#: pretix/base/settings.py:3339 +#: pretix/base/settings.py:3368 msgid "Link back to organizer overview on all event pages" msgstr "قم بنظرة عامة للمنظم للاطلاع على جميع صفحات الفعالية" -#: pretix/base/settings.py:3348 +#: pretix/base/settings.py:3377 msgid "Homepage text" msgstr "نص الصفحة الرئيسية" -#: pretix/base/settings.py:3350 +#: pretix/base/settings.py:3379 msgid "This will be displayed on the organizer homepage." msgstr "سيتم عرض هذا على الصفحة الرئيسية للمنظم." -#: pretix/base/settings.py:3365 +#: pretix/base/settings.py:3394 msgid "Length of gift card codes" msgstr "طول رموز بطاقات الهدايا" -#: pretix/base/settings.py:3366 +#: pretix/base/settings.py:3395 #, python-brace-format msgid "" "The system generates by default {}-character long gift card codes. However, " @@ -12867,11 +12936,11 @@ msgstr "" "ينشئ النظام افتراضيا رموز بطاقات هدايا طويلة مكونة من {}-حرف. ومع ذلك ، إذا " "تم طلب طول مختلف، فيمكن تعيينه هنا." -#: pretix/base/settings.py:3382 +#: pretix/base/settings.py:3411 msgid "Validity of gift card codes in years" msgstr "صلاحية رموز بطاقات الهدايا بالسنوات" -#: pretix/base/settings.py:3383 +#: pretix/base/settings.py:3412 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 " @@ -12881,23 +12950,23 @@ msgstr "" "العام بعد هذه السنوات العديدة. إذا أبقيت الخانة فارغة ، فلن يكون لبطاقات " "الهدايا تاريخ انتهاء صلاحية صريح." -#: pretix/base/settings.py:3394 +#: pretix/base/settings.py:3423 msgid "Enable cookie consent management features" msgstr "" -#: pretix/base/settings.py:3400 +#: pretix/base/settings.py:3429 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:3407 +#: pretix/base/settings.py:3436 #, fuzzy #| msgid "Additional text" msgid "Dialog text" msgstr "نص إضافي" -#: pretix/base/settings.py:3414 +#: pretix/base/settings.py:3443 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 " @@ -12905,49 +12974,49 @@ msgid "" "offers." msgstr "" -#: pretix/base/settings.py:3422 +#: pretix/base/settings.py:3451 msgid "Secondary dialog text" msgstr "" -#: pretix/base/settings.py:3428 +#: pretix/base/settings.py:3457 #, fuzzy #| msgid "Price settings" msgid "Privacy settings" msgstr "ضبط الأسعار" -#: pretix/base/settings.py:3433 +#: pretix/base/settings.py:3462 #, fuzzy #| msgid "Allowed titles" msgid "Dialog title" msgstr "عناوين سمح" -#: pretix/base/settings.py:3439 +#: pretix/base/settings.py:3468 msgid "Accept all cookies" msgstr "" -#: pretix/base/settings.py:3444 +#: pretix/base/settings.py:3473 #, fuzzy #| msgid "Product variation description" msgid "\"Accept\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3450 +#: pretix/base/settings.py:3479 #, fuzzy #| msgid "Required question" msgid "Required cookies only" msgstr "سؤال مطلوب" -#: pretix/base/settings.py:3455 +#: pretix/base/settings.py:3484 #, fuzzy #| msgid "Product variation description" msgid "\"Reject\" button description" msgstr "وصف نوع المنتج" -#: pretix/base/settings.py:3465 +#: pretix/base/settings.py:3494 msgid "Customers can choose their own seats" msgstr "يمكن للعملاء اختيار مقاعدهم الخاصة" -#: pretix/base/settings.py:3466 +#: pretix/base/settings.py:3495 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 " @@ -12957,159 +13026,159 @@ msgstr "" "لاحظ أن هذا قد يعني أن الأشخاص لن يعرفوا مقعدهم بعد شرائه وقد لا يكون مكتوبا " "على تذكرتهم." -#: pretix/base/settings.py:3492 +#: pretix/base/settings.py:3521 msgid "Show button to copy user input from other products" msgstr "أظهر الزر لنسخ مدخلات المستخدم من المنتجات الأخرى" -#: pretix/base/settings.py:3502 +#: pretix/base/settings.py:3531 msgid "Most common English titles" msgstr "العناوين الإنجليزية الأكثر شيوعا" -#: pretix/base/settings.py:3512 +#: pretix/base/settings.py:3541 msgid "Most common German titles" msgstr "العناوين الألمانية الأكثر شيوعا" -#: pretix/base/settings.py:3525 +#: pretix/base/settings.py:3554 msgctxt "person_name_salutation" msgid "Ms" msgstr "آنسة" -#: pretix/base/settings.py:3526 +#: pretix/base/settings.py:3555 msgctxt "person_name_salutation" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3527 +#: pretix/base/settings.py:3556 msgctxt "person_name_salutation" msgid "Mx" msgstr "السيد\\السيدة" -#: pretix/base/settings.py:3564 pretix/base/settings.py:3580 -#: pretix/base/settings.py:3596 pretix/base/settings.py:3611 -#: pretix/base/settings.py:3629 pretix/base/settings.py:3644 -#: pretix/base/settings.py:3674 pretix/base/settings.py:3698 -#: pretix/base/settings.py:3730 pretix/base/settings.py:3752 -#: pretix/base/settings.py:3783 +#: 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 msgctxt "person_name_sample" msgid "John" msgstr "جون" -#: pretix/base/settings.py:3565 pretix/base/settings.py:3581 -#: pretix/base/settings.py:3597 pretix/base/settings.py:3613 -#: pretix/base/settings.py:3631 pretix/base/settings.py:3645 -#: pretix/base/settings.py:3675 pretix/base/settings.py:3731 -#: pretix/base/settings.py:3753 pretix/base/settings.py:3784 +#: 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 msgctxt "person_name_sample" msgid "Doe" msgstr "دو" -#: pretix/base/settings.py:3571 pretix/base/settings.py:3587 -#: pretix/base/settings.py:3619 pretix/base/settings.py:3738 -#: pretix/base/settings.py:3760 +#: 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 msgctxt "person_name" msgid "Title" msgstr "عنوان" -#: pretix/base/settings.py:3579 pretix/base/settings.py:3595 -#: pretix/base/settings.py:3628 pretix/base/settings.py:3751 -#: pretix/base/settings.py:3782 +#: 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 msgctxt "person_name_sample" msgid "Dr" msgstr "الدكتور" -#: pretix/base/settings.py:3603 pretix/base/settings.py:3620 +#: pretix/base/settings.py:3632 pretix/base/settings.py:3649 msgid "First name" msgstr "الاسم الاول" -#: pretix/base/settings.py:3604 pretix/base/settings.py:3621 +#: pretix/base/settings.py:3633 pretix/base/settings.py:3650 msgid "Middle name" msgstr "الاسم الأوسط" -#: pretix/base/settings.py:3685 pretix/base/settings.py:3697 +#: pretix/base/settings.py:3714 pretix/base/settings.py:3726 #: pretix/control/forms/organizer.py:658 msgctxt "person_name_sample" msgid "John Doe" msgstr "جون دو" -#: pretix/base/settings.py:3691 +#: pretix/base/settings.py:3720 msgid "Calling name" msgstr "اسم النداء" -#: pretix/base/settings.py:3705 +#: pretix/base/settings.py:3734 msgid "Latin transcription" msgstr "الإملاء بالحروف اللاتينية" -#: pretix/base/settings.py:3717 pretix/base/settings.py:3737 -#: pretix/base/settings.py:3759 +#: pretix/base/settings.py:3746 pretix/base/settings.py:3766 +#: pretix/base/settings.py:3788 msgctxt "person_name" msgid "Salutation" msgstr "تحية" -#: pretix/base/settings.py:3729 pretix/base/settings.py:3750 -#: pretix/base/settings.py:3781 +#: pretix/base/settings.py:3758 pretix/base/settings.py:3779 +#: pretix/base/settings.py:3810 msgctxt "person_name_sample" msgid "Mr" msgstr "السيد" -#: pretix/base/settings.py:3763 +#: pretix/base/settings.py:3792 msgctxt "person_name" msgid "Degree (after name)" msgstr "الدرجة (بعد الاسم)" -#: pretix/base/settings.py:3785 +#: pretix/base/settings.py:3814 msgctxt "person_name_sample" msgid "MA" msgstr "MA" -#: pretix/base/settings.py:3811 pretix/base/settings.py:3813 +#: pretix/base/settings.py:3840 pretix/base/settings.py:3842 #, fuzzy #| msgid "Product name" msgctxt "address" msgid "Province" msgstr "اسم المنتج" -#: pretix/base/settings.py:3812 +#: pretix/base/settings.py:3841 #, fuzzy #| msgid "Use feature" msgctxt "address" msgid "Prefecture" msgstr "استخدام ميزة" -#: pretix/base/settings.py:3901 pretix/control/forms/event.py:228 +#: pretix/base/settings.py:3930 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:3905 +#: pretix/base/settings.py:3934 msgid "" "You cannot require specifying attendee names if you do not ask for them." msgstr "لا يمكنك طلب تحديد أسماء الحضور إذا لم تطلبها." -#: pretix/base/settings.py:3909 +#: pretix/base/settings.py:3938 msgid "You have to ask for attendee emails if you want to make them required." msgstr "" "عليك أن تطلب رسائل البريد الإلكتروني للحضور إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:3913 +#: pretix/base/settings.py:3942 msgid "" "You have to ask for invoice addresses if you want to make them required." msgstr "عليك أن تطلب عناوين الفواتير إذا كنت ترغب في جعلها إلزامية." -#: pretix/base/settings.py:3917 +#: pretix/base/settings.py:3946 msgid "You have to require invoice addresses to require for company names." msgstr "عليك أن تطلب عنوان الفاتورة لطلب أسماء الشركات." -#: pretix/base/settings.py:3924 +#: pretix/base/settings.py:3953 msgid "The last payment date cannot be before the end of presale." msgstr "لا يمكن أن يكون تاريخ الدفع الأخير قبل نهاية فترة عرض البيع المسبق." -#: pretix/base/settings.py:3932 +#: pretix/base/settings.py:3961 #, 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:3947 +#: pretix/base/settings.py:3976 msgid "This needs to be disabled if other NFC-based types are active." msgstr "" @@ -13362,6 +13431,23 @@ msgstr "" "إذا استغرق هذا الأمر أكثر من بضع دقائق ، يرجى تحديث هذه الصفحة أو الاتصال " "بنا." +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:2 +msgid "" +"You have requested us to cancel an event which includes a larger bulk-refund:" +msgstr "" + +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:6 +#, fuzzy +#| msgid "Initiate a refund of %(amount)s" +msgid "Estimated refund amount" +msgstr "بدء استرداد %(amount)s" + +#: pretix/base/templates/pretixbase/email/cancel_confirm.txt:8 +msgid "" +"Please confirm that you want to proceed by coping the following confirmation " +"code into the cancellation form:" +msgstr "" + #: pretix/base/templates/pretixbase/email/email_footer.html:3 #, python-format msgid "powered by pretix" @@ -13419,12 +13505,10 @@ msgstr "" "تتلقى هذا البريد الإلكتروني لأن شخصا ما قام بتسجيلك في الفعالية التالية:" #: pretix/base/templates/pretixbase/email/order_details.html:12 -#: pretix/base/templates/pretixbase/email/order_details.html:59 msgid "Event:" msgstr "فعالية:" #: pretix/base/templates/pretixbase/email/order_details.html:23 -#: pretix/base/templates/pretixbase/email/order_details.html:80 msgid "Order code:" msgstr "رمز الطلب:" @@ -13433,19 +13517,41 @@ msgid "created by" msgstr "أنشئ من قبل" #: pretix/base/templates/pretixbase/email/order_details.html:34 -#: pretix/base/templates/pretixbase/email/order_details.html:132 msgid "Contact:" msgstr "جهة اتصال:" #: pretix/base/templates/pretixbase/email/order_details.html:54 +#, fuzzy, python-format +#| msgid "" +#| "You are receiving this email because you placed an order for {event}." msgid "" -"You are receiving this email because you placed an order for the following " -"event:" -msgstr "تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا للفعالية التالية:" +"You are receiving this email because you placed an order for " +"%(event)s." +msgstr "أنت تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا ل {event}." -#: pretix/base/templates/pretixbase/email/order_details.html:89 -msgid "Details:" -msgstr "تفاصيل:" +#: pretix/base/templates/pretixbase/email/order_details.html:93 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:23 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:320 +#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:15 +#: pretix/control/templates/pretixcontrol/organizers/customers.html:90 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:23 +#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:95 +#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:102 +#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 +#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 +#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 +#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 +#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:66 +msgid "Details" +msgstr "تفاصيل" + +#: pretix/base/templates/pretixbase/email/order_details.html:136 +#: pretix/presale/templates/pretixpresale/event/base.html:222 +#: pretix/presale/templates/pretixpresale/organizers/base.html:100 +#, fuzzy +#| msgid "Contact:" +msgid "Contact" +msgstr "جهة اتصال:" #: pretix/base/templates/pretixbase/email/shred_completed.txt:2 #, python-format @@ -14144,7 +14250,7 @@ msgid "Do not copy" msgstr "لا تنسخ" #: pretix/control/forms/event.py:336 pretix/control/forms/item.py:1301 -#: pretix/control/forms/subevents.py:410 +#: pretix/control/forms/subevents.py:411 #, python-brace-format msgid "Default ({value})" msgstr "تلقائي ({value})" @@ -14232,11 +14338,11 @@ msgid "" "card is issued in." msgstr "" -#: pretix/control/forms/event.py:887 +#: pretix/control/forms/event.py:888 msgid "Generate invoices for Sales channels" msgstr "توليد الفواتير للقنوات المبيعات" -#: pretix/control/forms/event.py:890 +#: pretix/control/forms/event.py:891 msgid "" "If you have enabled invoice generation in the previous setting, you can " "limit it here to specific sales channels." @@ -14244,107 +14350,107 @@ msgstr "" "إذا قمت بتمكين الجيل الفاتورة في الإعداد السابق، يمكنك تحديد هنا لقنوات " "البيع المحددة." -#: pretix/control/forms/event.py:894 +#: pretix/control/forms/event.py:895 msgid "Invoice style" msgstr "النمط فاتورة" -#: pretix/control/forms/event.py:900 +#: pretix/control/forms/event.py:901 msgid "Invoice language" msgstr "اللغة فاتورة" -#: pretix/control/forms/event.py:901 pretix/control/forms/event.py:916 +#: pretix/control/forms/event.py:902 pretix/control/forms/event.py:917 msgid "The user's language" msgstr "لغة المستخدم" -#: pretix/control/forms/event.py:924 +#: pretix/control/forms/event.py:925 #, 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:928 +#: pretix/control/forms/event.py:929 msgid "" "None of the currently configured payment methods will cause an invoice to be " "issued before payment." msgstr "" -#: pretix/control/forms/event.py:937 +#: pretix/control/forms/event.py:938 #, fuzzy #| msgid "Split into new order" msgid "Recommended" msgstr "تنقسم إلى النظام الجديد" -#: pretix/control/forms/event.py:949 +#: pretix/control/forms/event.py:950 msgid "The online shop must be selected to receive these emails." msgstr "" -#: pretix/control/forms/event.py:965 +#: pretix/control/forms/event.py:966 #, fuzzy #| msgid "Sales channels to automatically check in" msgid "Sales channels for checkout emails" msgstr "قنوات البيع للبريد الإلكتروني الخاص بالدفع" -#: pretix/control/forms/event.py:966 +#: pretix/control/forms/event.py:967 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:977 +#: pretix/control/forms/event.py:978 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:985 pretix/control/forms/organizer.py:583 +#: pretix/control/forms/event.py:986 pretix/control/forms/organizer.py:583 msgid "Bcc address" msgstr "عنوان مخفية" -#: pretix/control/forms/event.py:987 pretix/control/forms/organizer.py:585 +#: pretix/control/forms/event.py:988 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:995 pretix/control/forms/organizer.py:593 +#: pretix/control/forms/event.py:996 pretix/control/forms/organizer.py:593 msgid "Signature" msgstr "التوقيع" -#: pretix/control/forms/event.py:998 +#: pretix/control/forms/event.py:999 #, python-brace-format msgid "This will be attached to every email. Available placeholders: {event}" msgstr "وسيلحق هذا على كل البريد الإلكتروني. النائبة المتاحة: {event}" -#: pretix/control/forms/event.py:1003 pretix/control/forms/organizer.py:601 +#: pretix/control/forms/event.py:1004 pretix/control/forms/organizer.py:601 msgid "e.g. your contact details" msgstr "مثلا تفاصيل الاتصال الخاصة بك" -#: pretix/control/forms/event.py:1008 +#: pretix/control/forms/event.py:1009 msgid "HTML mail renderer" msgstr "HTML العارض الإلكتروني" -#: pretix/control/forms/event.py:1013 pretix/control/forms/event.py:1040 -#: pretix/control/forms/event.py:1067 pretix/control/forms/event.py:1217 +#: pretix/control/forms/event.py:1014 pretix/control/forms/event.py:1041 +#: pretix/control/forms/event.py:1068 pretix/control/forms/event.py:1218 #, fuzzy #| msgid "Text sent to order contact address" msgid "Subject sent to order contact address" msgstr "إرسالها إلى عنوان النص أمر الاتصال" -#: pretix/control/forms/event.py:1018 pretix/control/forms/event.py:1045 -#: pretix/control/forms/event.py:1072 pretix/control/forms/event.py:1222 +#: pretix/control/forms/event.py:1019 pretix/control/forms/event.py:1046 +#: pretix/control/forms/event.py:1073 pretix/control/forms/event.py:1223 msgid "Text sent to order contact address" msgstr "إرسالها إلى عنوان النص أمر الاتصال" -#: pretix/control/forms/event.py:1023 pretix/control/forms/event.py:1050 -#: pretix/control/forms/event.py:1077 pretix/control/forms/event.py:1227 -#: pretix/control/forms/event.py:1272 pretix/control/forms/event.py:1302 -msgid "Send an email to attendees" -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 +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 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 " @@ -14353,85 +14459,85 @@ msgstr "" "إذا كان النظام يحتوي على الحضور مع عناوين البريد الإلكتروني المختلفة من " "الشخص الذي يأمر التذاكر، سيتم إرسال البريد الإلكتروني التالي إلى الحضور." -#: pretix/control/forms/event.py:1029 pretix/control/forms/event.py:1056 -#: pretix/control/forms/event.py:1083 pretix/control/forms/event.py:1233 -#: pretix/control/forms/event.py:1278 pretix/control/forms/event.py:1308 +#: 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 #, fuzzy #| msgid "Text sent to attendees" msgid "Subject sent to attendees" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1034 pretix/control/forms/event.py:1061 -#: pretix/control/forms/event.py:1088 pretix/control/forms/event.py:1238 -#: pretix/control/forms/event.py:1283 pretix/control/forms/event.py:1313 +#: 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 msgid "Text sent to attendees" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1099 pretix/control/forms/event.py:1173 -#: pretix/control/forms/event.py:1183 pretix/control/forms/event.py:1193 -#: pretix/control/forms/event.py:1198 pretix/control/forms/event.py:1210 +#: 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/organizer.py:612 pretix/control/forms/organizer.py:622 #: pretix/control/forms/organizer.py:632 #: pretix/control/templates/pretixcontrol/event/mail.html:88 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:111 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:119 msgid "Text" msgstr "نص" -#: pretix/control/forms/event.py:1104 +#: pretix/control/forms/event.py:1105 #, fuzzy #| msgid "Text (sent by admin)" msgid "Subject (sent by admin)" msgstr "النص (أرسلت بواسطة admin)" -#: pretix/control/forms/event.py:1109 +#: pretix/control/forms/event.py:1110 #, fuzzy #| msgid "Text sent to attendees" msgid "Subject (sent by admin to attendee)" msgstr "إرسالها النص إلى الحضور" -#: pretix/control/forms/event.py:1114 +#: pretix/control/forms/event.py:1115 msgid "Text (sent by admin)" msgstr "النص (أرسلت بواسطة admin)" -#: pretix/control/forms/event.py:1119 +#: pretix/control/forms/event.py:1120 #, fuzzy #| msgid "Text (requested by user)" msgid "Subject (requested by user)" msgstr "النص (عن طريق المستخدم المطلوب)" -#: pretix/control/forms/event.py:1124 +#: pretix/control/forms/event.py:1125 msgid "Text (requested by user)" msgstr "النص (عن طريق المستخدم المطلوب)" -#: pretix/control/forms/event.py:1136 +#: pretix/control/forms/event.py:1137 msgid "Text (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1141 +#: pretix/control/forms/event.py:1142 msgid "Subject (if order will expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1146 +#: pretix/control/forms/event.py:1147 msgid "Text (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1151 +#: pretix/control/forms/event.py:1152 msgid "Subject (if order will not expire automatically)" msgstr "" -#: pretix/control/forms/event.py:1156 +#: pretix/control/forms/event.py:1157 #, fuzzy #| msgid "Payment received for your order: {code}" msgid "Subject (if an incomplete payment was received)" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/control/forms/event.py:1161 +#: pretix/control/forms/event.py:1162 #, fuzzy #| msgid "Payment received for your order: {code}" msgid "Text (if an incomplete payment was received)" msgstr "تم إستلام الدفع لطلبك: {code}" -#: pretix/control/forms/event.py:1164 +#: pretix/control/forms/event.py:1165 #, fuzzy #| msgid "This plugin allows you to receive payments via bank transfer." msgid "" @@ -14439,13 +14545,13 @@ msgid "" "payments, such as bank transfer." msgstr "يسمح لك هذا المكون الإضافي بتلقي المدفوعات عبر التحويل المصرفي." -#: pretix/control/forms/event.py:1206 pretix/control/forms/event.py:1213 +#: pretix/control/forms/event.py:1207 pretix/control/forms/event.py:1214 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:1246 +#: pretix/control/forms/event.py:1247 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." @@ -14453,31 +14559,31 @@ msgstr "" "سيتم إرسال هذا البريد الإلكتروني من هذا عدة أيام قبل أن يبدأ الحدث النظام. " "إذا كان الحقل فارغا، لن يتم إرسال البريد." -#: pretix/control/forms/event.py:1250 +#: pretix/control/forms/event.py:1251 #, fuzzy #| msgid "Received order" msgid "Subject for received order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1255 +#: pretix/control/forms/event.py:1256 #, fuzzy #| msgid "Received order" msgid "Text for received order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1260 +#: pretix/control/forms/event.py:1261 #, fuzzy #| msgid "Yes, approve order" msgid "Subject for approved order" msgstr "نعم، والموافقة على النظام" -#: pretix/control/forms/event.py:1265 +#: pretix/control/forms/event.py:1266 #, fuzzy #| msgid "Yes, approve order" msgid "Text for approved order" msgstr "نعم، والموافقة على النظام" -#: pretix/control/forms/event.py:1268 pretix/control/forms/event.py:1286 +#: pretix/control/forms/event.py:1269 pretix/control/forms/event.py:1287 msgid "" "This will only be sent out for non-free orders. Free orders will receive the " "free order template from below instead." @@ -14485,19 +14591,19 @@ msgstr "" "سيتم ارسال هذا للطلبات غير المجانية فقط. وسوف يتلقى أصحاب الطلبات المجانية " "بدلا من ذلك نموذج الطلب المجاني كما هو في الأسفل." -#: pretix/control/forms/event.py:1290 +#: pretix/control/forms/event.py:1291 #, fuzzy #| msgid "Approved free order" msgid "Subject for approved free order" msgstr "طلب مجاني معتمد" -#: pretix/control/forms/event.py:1295 +#: pretix/control/forms/event.py:1296 #, fuzzy #| msgid "Approved free order" msgid "Text for approved free order" msgstr "طلب مجاني معتمد" -#: pretix/control/forms/event.py:1298 pretix/control/forms/event.py:1316 +#: pretix/control/forms/event.py:1299 pretix/control/forms/event.py:1317 msgid "" "This will only be sent out for free orders. Non-free orders will receive the " "non-free order template from above instead." @@ -14505,103 +14611,103 @@ msgstr "" "سيتم ارسال هذا إلى الطلبات المجانية فقط. سيستلم أصحاب الطلبات غير المجانية " "نموذج الطلب غير المجاني كما هو في الأعلى." -#: pretix/control/forms/event.py:1320 +#: pretix/control/forms/event.py:1321 #, fuzzy #| msgid "Received order" msgid "Subject for denied order" msgstr "النظام وردت" -#: pretix/control/forms/event.py:1325 +#: pretix/control/forms/event.py:1326 #, fuzzy #| msgid "Denied order" msgid "Text for denied order" msgstr "أمر مرفوض" -#: pretix/control/forms/event.py:1420 +#: pretix/control/forms/event.py:1421 #, fuzzy #| msgid "Ticket code" msgid "Ticket code generator" msgstr "إنشاء رمز التذكرة" -#: pretix/control/forms/event.py:1421 +#: pretix/control/forms/event.py:1422 msgid "For advanced users, usually does not need to be changed." msgstr "" -#: pretix/control/forms/event.py:1478 +#: pretix/control/forms/event.py:1479 msgid "Any country" msgstr "أي بلد" -#: pretix/control/forms/event.py:1479 +#: pretix/control/forms/event.py:1480 msgid "European Union" msgstr "الإتحاد الأوربي" -#: pretix/control/forms/event.py:1505 +#: pretix/control/forms/event.py:1506 msgid "Any customer" msgstr "أي زبون" -#: pretix/control/forms/event.py:1506 +#: pretix/control/forms/event.py:1507 msgid "Individual" msgstr "فرد" -#: pretix/control/forms/event.py:1507 +#: pretix/control/forms/event.py:1508 msgid "Business" msgstr "اعمال" -#: pretix/control/forms/event.py:1508 +#: pretix/control/forms/event.py:1509 msgid "Business with valid VAT ID" msgstr "العمل مع معرف الضريبة على القيمة المضافة" -#: pretix/control/forms/event.py:1514 +#: pretix/control/forms/event.py:1515 msgid "Charge VAT" msgstr "تكلفة ضريبة القيمة المضافة" -#: pretix/control/forms/event.py:1516 +#: pretix/control/forms/event.py:1517 msgid "No VAT" msgstr "لا ضريبه للقيمه المضافه" -#: pretix/control/forms/event.py:1517 +#: pretix/control/forms/event.py:1518 msgid "Sale not allowed" msgstr "غير مسموح بالبيع" -#: pretix/control/forms/event.py:1518 +#: pretix/control/forms/event.py:1519 #, fuzzy #| msgid "New order requires approval" msgid "Order requires approval" msgstr "طلب جديد يتطلب الموافقة." -#: pretix/control/forms/event.py:1523 +#: pretix/control/forms/event.py:1524 #, fuzzy #| msgid "Default price" msgid "Default tax code" msgstr "السعر الافتراضي" -#: pretix/control/forms/event.py:1527 +#: pretix/control/forms/event.py:1528 #, fuzzy #| msgid "Sales tax rate" msgid "Deviating tax rate" msgstr "معدل ضريبة المبيعات" -#: pretix/control/forms/event.py:1532 pretix/control/forms/event.py:1536 +#: pretix/control/forms/event.py:1533 pretix/control/forms/event.py:1537 msgid "Text on invoice" msgstr "النص على الفاتورة" -#: pretix/control/forms/event.py:1556 +#: pretix/control/forms/event.py:1557 msgid "" "A combination of this calculation mode with a non-zero tax rate does not " "make sense." msgstr "" -#: pretix/control/forms/event.py:1561 pretix/control/forms/event.py:1565 +#: pretix/control/forms/event.py:1562 pretix/control/forms/event.py:1566 #, 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:1630 +#: pretix/control/forms/event.py:1631 msgid "Pre-selected voucher" msgstr "قسيمة المختارة مسبقا" -#: pretix/control/forms/event.py:1632 +#: pretix/control/forms/event.py:1633 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 " @@ -14612,11 +14718,11 @@ msgstr "" "شراء المنتج عن طريق القطعة، سيتم استخدام هذه القسائم. يمكن استخدام هذا يمكن " "على سبيل المثال لتوفير الحاجيات التي تعطي تخفيض أو إلغاء المنتجات سرية." -#: pretix/control/forms/event.py:1637 +#: pretix/control/forms/event.py:1638 msgid "Compatibility mode" msgstr "وضع التوافق" -#: pretix/control/forms/event.py:1639 +#: pretix/control/forms/event.py:1640 msgid "" "Our regular widget doesn't work in all website builders. If you run into " "trouble, try using this compatibility mode." @@ -14624,28 +14730,28 @@ msgstr "" "لا تعمل لدينا القطعة العادية في جميع بناة الموقع. إذا واجهت مشكلة، حاول " "استخدام هذا الوضع التوافق." -#: pretix/control/forms/event.py:1660 +#: pretix/control/forms/event.py:1661 msgid "The given voucher code does not exist." msgstr "لا وجود رمز قسيمة معين." -#: pretix/control/forms/event.py:1667 pretix/control/forms/organizer.py:112 +#: pretix/control/forms/event.py:1668 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:1702 +#: pretix/control/forms/event.py:1703 msgid "Ticket downloads" msgstr "التنزيلات تذكرة" -#: pretix/control/forms/event.py:1703 +#: pretix/control/forms/event.py:1704 msgid "Your customers will be able to download their tickets in PDF format." msgstr "زبائنك سوف تكون قادرة على تحميل تذاكرهم في شكل PDF." -#: pretix/control/forms/event.py:1707 +#: pretix/control/forms/event.py:1708 msgid "Require all attendees to fill in their names" msgstr "يتطلب من جميع الحضور لملء في أسمائها" -#: pretix/control/forms/event.py:1708 +#: pretix/control/forms/event.py:1709 msgid "" "By default, we will ask for names but not require them. You can turn this " "off completely in the settings." @@ -14653,11 +14759,11 @@ msgstr "" "افتراضيا، ونحن سوف تسأل عن الأسماء ولكن لا تتطلب منهم. يمكنك إيقاف هذا تماما " "في الإعدادات." -#: pretix/control/forms/event.py:1734 +#: pretix/control/forms/event.py:1735 msgid "Payment via Stripe" msgstr "الدفع عن طريق الشريط" -#: pretix/control/forms/event.py:1735 +#: pretix/control/forms/event.py:1736 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 " @@ -14668,11 +14774,11 @@ msgstr "" "خيارات الدفع الأخرى. لقبول الدفع عن طريق الشريط، وسوف تحتاج إلى إعداد حساب " "معهم، والتي تأخذ أقل من خمس دقائق باستخدام واجهة بسيطة بهم." -#: pretix/control/forms/event.py:1741 +#: pretix/control/forms/event.py:1742 msgid "Payment by bank transfer" msgstr "الدفع عن طريق التحويل المصرفي" -#: pretix/control/forms/event.py:1742 +#: pretix/control/forms/event.py:1743 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 " @@ -14682,16 +14788,16 @@ msgstr "" "المصرفية الخاصة بك لمعالجة المدفوعات في غضون pretix، أو وضع علامة عليها كما " "تدفع يدويا." -#: pretix/control/forms/event.py:1781 +#: pretix/control/forms/event.py:1782 #: pretix/control/templates/pretixcontrol/event/quick_setup.html:45 msgid "Price (optional)" msgstr "السعر (اختياري)" -#: pretix/control/forms/event.py:1786 +#: pretix/control/forms/event.py:1787 msgid "Free" msgstr "حر" -#: pretix/control/forms/event.py:1791 +#: pretix/control/forms/event.py:1792 msgid "Quantity available" msgstr "الكمية متاحة" @@ -14992,7 +15098,7 @@ msgid "Search query" msgstr "البحث في الاستفسارات" #: pretix/control/forms/filter.py:1528 pretix/control/forms/filter.py:1600 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:46 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:47 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:54 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:126 @@ -15004,14 +15110,14 @@ msgid "active" msgstr "غير نشط" #: pretix/control/forms/filter.py:1530 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:44 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:45 #, fuzzy #| msgid "Deactivate" msgid "not yet activated" msgstr "إلغاء تنشيط" #: pretix/control/forms/filter.py:1534 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:110 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:111 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:6 #: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:12 #: pretix/presale/views/customer.py:366 @@ -15070,7 +15176,7 @@ msgstr "جميع الحاضرين" #: pretix/control/templates/pretixcontrol/checkin/index.html:183 #: pretix/control/templates/pretixcontrol/checkin/lists.html:103 #: pretix/plugins/checkinlists/exporters.py:109 -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 msgid "Checked in" msgstr "إيداعه" @@ -15116,6 +15222,7 @@ msgid "No administrator" msgstr "لا المسؤول" #: pretix/control/forms/filter.py:2117 +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51 msgid "Valid" msgstr "ساري المفعول" @@ -15170,15 +15277,15 @@ msgstr "كل مبلغ معاد المفتوحة" msgid "All refunds" msgstr "كل مبلغ معاد" -#: pretix/control/forms/filter.py:2353 pretix/plugins/reports/exporters.py:699 +#: pretix/control/forms/filter.py:2353 pretix/plugins/reports/exporters.py:700 msgid "Date filter" msgstr "تاريخ فلتر" -#: pretix/control/forms/filter.py:2355 pretix/plugins/reports/exporters.py:701 +#: pretix/control/forms/filter.py:2355 pretix/plugins/reports/exporters.py:702 msgid "Filter by…" msgstr "مصنف بواسطة…" -#: pretix/control/forms/filter.py:2357 pretix/plugins/reports/exporters.py:703 +#: pretix/control/forms/filter.py:2357 pretix/plugins/reports/exporters.py:704 msgid "Date of last successful payment" msgstr "تاريخ الدفع الناجح الماضي" @@ -15202,7 +15309,7 @@ msgstr "المدفوعات الناجحة فقط" #: pretix/control/forms/filter.py:2404 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:64 -#: pretix/plugins/checkinlists/exporters.py:756 +#: pretix/plugins/checkinlists/exporters.py:759 msgid "Scan type" msgstr "نوع المسح الضوئي" @@ -15214,7 +15321,7 @@ msgstr "جميع الإجراءات" #: pretix/control/forms/filter.py:2415 pretix/control/forms/filter.py:2455 #: pretix/control/templates/pretixcontrol/checkin/checkins.html:67 -#: pretix/plugins/checkinlists/exporters.py:762 +#: pretix/plugins/checkinlists/exporters.py:765 msgid "Device" msgstr "جهاز" @@ -15240,7 +15347,7 @@ msgid "End date" msgstr "تاريخ الإنتهاء" #: pretix/control/forms/filter.py:2478 -#: pretix/plugins/checkinlists/exporters.py:880 +#: pretix/plugins/checkinlists/exporters.py:883 msgid "All check-in lists" msgstr "جميع قوائم التسجيل" @@ -15254,8 +15361,8 @@ msgstr "جميع قوائم التسجيل" #: pretix/plugins/checkinlists/exporters.py:81 #: pretix/plugins/checkinlists/exporters.py:154 #: pretix/plugins/checkinlists/exporters.py:475 -#: pretix/plugins/checkinlists/exporters.py:755 -#: pretix/plugins/checkinlists/exporters.py:843 +#: pretix/plugins/checkinlists/exporters.py:758 +#: pretix/plugins/checkinlists/exporters.py:846 msgid "Check-in list" msgstr "تحقق في قائمة" @@ -15824,47 +15931,53 @@ msgstr "أضفني إلى القائمة" msgid "pretix field" msgstr "pretix شعار" -#: pretix/control/forms/modelimport.py:50 +#: pretix/control/forms/modelimport.py:52 #, python-brace-format msgid "CSV column: \"{name}\"" msgstr "" -#: pretix/control/forms/modelimport.py:76 +#: pretix/control/forms/modelimport.py:81 msgid "Import mode" msgstr "وضع الاستيراد" -#: pretix/control/forms/modelimport.py:78 +#: pretix/control/forms/modelimport.py:83 msgid "Create a separate order for each line" msgstr "" -#: pretix/control/forms/modelimport.py:79 +#: pretix/control/forms/modelimport.py:84 msgid "Create one order with one position per line" msgstr "" -#: pretix/control/forms/modelimport.py:80 +#: pretix/control/forms/modelimport.py:85 msgid "" "Group multiple lines together into the same order based on a grouping column" msgstr "" -#: pretix/control/forms/modelimport.py:87 +#: pretix/control/forms/modelimport.py:92 msgid "Create orders as fully paid" msgstr "أنشئ الطلبات المدفوعة كليا" -#: pretix/control/forms/modelimport.py:88 +#: pretix/control/forms/modelimport.py:93 msgid "Create orders as pending and still require payment" msgstr "" -#: pretix/control/forms/modelimport.py:93 +#: pretix/control/forms/modelimport.py:98 msgid "Create orders as test mode orders" msgstr "أنشئ الطلبات في وضع الإختبار" -#: pretix/control/forms/modelimport.py:112 +#: pretix/control/forms/modelimport.py:102 +#, fuzzy +#| msgid "Only orders created in test mode can be deleted." +msgid "Orders not created in test mode cannot be deleted again after import." +msgstr "أوامر الوحيدة التي تم إنشاؤها في وضع الاختبار يمكن حذفها." + +#: pretix/control/forms/modelimport.py:123 #, fuzzy #| msgid "You cannot generate an invoice for this order." msgid "A grouping cannot be specified for this import mode." msgstr "لا يمكن انشاء فاتورة لهذا الطلب." -#: pretix/control/forms/modelimport.py:114 +#: pretix/control/forms/modelimport.py:125 #, fuzzy #| msgid "A variation needs to be set for this item." msgid "A grouping needs to be specified for this import mode." @@ -15986,8 +16099,8 @@ msgstr "دفع المبلغ" #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:24 #: pretix/plugins/reports/exporters.py:510 #: pretix/plugins/reports/exporters.py:572 -#: pretix/plugins/reports/exporters.py:692 -#: pretix/plugins/reports/exporters.py:897 +#: pretix/plugins/reports/exporters.py:693 +#: pretix/plugins/reports/exporters.py:898 msgid "Payment date" msgstr "يوم الدفع او الاستحقاق" @@ -16350,6 +16463,26 @@ msgstr "" msgid "Please confirm that you want to cancel ALL dates in this event series." msgstr "" +#: pretix/control/forms/orders.py:1037 +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" +msgstr "" + +#: pretix/control/forms/orders.py:1055 +#, fuzzy +#| msgid "The confirm code you entered was incorrect." +msgid "The confirmation code is incorrect." +msgstr "رمز التأكيد الذي أدخلته غير صحيح." + #: pretix/control/forms/organizer.py:93 msgid "This slug is already in use. Please choose a different one." msgstr "هذا سبيكة هي قيد الاستخدام. الرجاء اختيار واحدة مختلفة." @@ -16423,77 +16556,77 @@ msgstr "أنواع الأحداث" msgid "Gift card value" msgstr "قيمة بطاقة هدية" -#: pretix/control/forms/organizer.py:794 +#: pretix/control/forms/organizer.py:826 #, fuzzy #| msgid "An account with this email address is already registered." msgid "An medium with this type and identifier is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." -#: pretix/control/forms/organizer.py:892 +#: pretix/control/forms/organizer.py:924 #, fuzzy #| msgid "An account with this email address is already registered." msgid "An account with this customer ID is already registered." msgstr "هناك حساب مرتبط بهذا البريد الإلكتروني مسبقا." -#: pretix/control/forms/organizer.py:909 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:61 +#: pretix/control/forms/organizer.py:941 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:62 #: pretix/presale/forms/customer.py:169 pretix/presale/forms/customer.py:493 msgid "Phone" msgstr "" -#: pretix/control/forms/organizer.py:1016 +#: pretix/control/forms/organizer.py:1048 #, fuzzy #| msgid "Target URL" msgctxt "sso_oidc" msgid "Base URL" msgstr "الرابط المستهدف" -#: pretix/control/forms/organizer.py:1020 +#: pretix/control/forms/organizer.py:1052 #, fuzzy #| msgid "Client ID" msgctxt "sso_oidc" msgid "Client ID" msgstr "هوية العميل" -#: pretix/control/forms/organizer.py:1024 +#: pretix/control/forms/organizer.py:1056 #, fuzzy #| msgid "Client secret" msgctxt "sso_oidc" msgid "Client secret" msgstr "سر العميل" -#: pretix/control/forms/organizer.py:1028 +#: pretix/control/forms/organizer.py:1060 msgctxt "sso_oidc" msgid "Scope" msgstr "" -#: pretix/control/forms/organizer.py:1029 +#: pretix/control/forms/organizer.py:1061 msgctxt "sso_oidc" msgid "Multiple scopes separated with spaces." msgstr "" -#: pretix/control/forms/organizer.py:1033 +#: pretix/control/forms/organizer.py:1065 #, fuzzy #| msgid "User profile only" msgctxt "sso_oidc" msgid "User ID field" msgstr "ملف تعريف المستخدم فقط" -#: pretix/control/forms/organizer.py:1034 +#: pretix/control/forms/organizer.py:1066 msgctxt "sso_oidc" msgid "" "We will assume that the contents of the user ID fields are unique and can " "never change for a user." msgstr "" -#: pretix/control/forms/organizer.py:1040 +#: pretix/control/forms/organizer.py:1072 #, fuzzy #| msgid "All invoices" msgctxt "sso_oidc" msgid "Email field" msgstr "جميع الفواتير" -#: pretix/control/forms/organizer.py:1041 +#: pretix/control/forms/organizer.py:1073 msgctxt "sso_oidc" msgid "" "We will assume that all email addresses received from the SSO provider are " @@ -16501,19 +16634,19 @@ msgid "" "security issues might arise." msgstr "" -#: pretix/control/forms/organizer.py:1048 +#: pretix/control/forms/organizer.py:1080 #, fuzzy #| msgid "Phone number" msgctxt "sso_oidc" msgid "Phone field" msgstr "رقم الجوال" -#: pretix/control/forms/organizer.py:1052 +#: pretix/control/forms/organizer.py:1084 msgctxt "sso_oidc" msgid "Query parameters" msgstr "" -#: pretix/control/forms/organizer.py:1053 +#: pretix/control/forms/organizer.py:1085 #, python-brace-format msgctxt "sso_oidc" msgid "" @@ -16521,25 +16654,25 @@ msgid "" "endpoint. Enter as: {example}" msgstr "" -#: pretix/control/forms/organizer.py:1114 +#: pretix/control/forms/organizer.py:1146 #, fuzzy #| msgid "A new client secret has been generated and is now effective." msgid "Invalidate old client secret and generate a new one" msgstr "تم إنشاء سر عميل جديد، وهو الآن فعال." -#: pretix/control/forms/organizer.py:1147 +#: pretix/control/forms/organizer.py:1179 #, fuzzy #| msgid "Organizer name" msgid "Organizer short name" msgstr "اسم المنظم" -#: pretix/control/forms/organizer.py:1151 +#: pretix/control/forms/organizer.py:1183 #, fuzzy #| msgid "Disable selected" msgid "Allow access to reusable media" msgstr "تعطيل المختارة" -#: pretix/control/forms/organizer.py:1152 +#: pretix/control/forms/organizer.py:1184 msgid "" "This is required if you want the other organizer to participate in a shared " "system with e.g. NFC payment chips. You should only use this option for " @@ -16548,25 +16681,25 @@ msgid "" "to interact with the media type." msgstr "" -#: pretix/control/forms/organizer.py:1168 +#: pretix/control/forms/organizer.py:1200 #, fuzzy #| msgid "The selected date does not exist in this event series." msgid "The selected organizer does not exist or cannot be invited." msgstr "التاريخ المحدد غير موجود في سلسلة الفعاليات هذه." -#: pretix/control/forms/organizer.py:1170 +#: pretix/control/forms/organizer.py:1202 #, fuzzy #| msgid "The selected organizer was not found." msgid "The selected organizer has already been invited." msgstr "لم يتم العثور على المنظم المحدد." -#: pretix/control/forms/organizer.py:1205 +#: pretix/control/forms/organizer.py:1237 #, fuzzy #| msgid "A voucher with this code already exists." msgid "A sales channel with the same identifier already exists." msgstr "يوجد كود الخصم مسبقا يحمل هذا الرمز." -#: pretix/control/forms/organizer.py:1217 +#: pretix/control/forms/organizer.py:1249 msgid "Events with active plugin" msgstr "" @@ -16664,7 +16797,7 @@ msgstr "نهاية الفعالية يجب أن تكون في وقت لاحق ب msgid "Available_until" msgstr "متاحة حتى" -#: pretix/control/forms/subevents.py:469 +#: pretix/control/forms/subevents.py:470 msgid "Exclude these dates instead of adding them." msgstr "استبعاد هذه التواريخ بدلا من إضافتها." @@ -17068,7 +17201,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:970 pretix/control/logdisplay.py:972 +#: pretix/control/logdisplay.py:971 pretix/control/logdisplay.py:973 msgid "(unknown)" msgstr "(غير معروف)" @@ -17123,8 +17256,8 @@ msgstr "أكد المستخدم الرسالة التالية: \"{}\"" msgid "The order has been canceled (comment: \"{comment}\")." msgstr "تم رفض الطلب." -#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1565 -#: pretix/presale/views/order.py:1049 +#: pretix/control/logdisplay.py:416 pretix/control/views/orders.py:1567 +#: pretix/presale/views/order.py:1072 msgid "The order has been canceled." msgstr "تم إلغاء هذا الأمر." @@ -17164,11 +17297,11 @@ msgstr "" msgid "Internal error while transferring data to {provider_display_name}." msgstr "" -#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:820 +#: pretix/control/logdisplay.py:483 pretix/control/logdisplay.py:821 msgid "The settings of a payment provider have been changed." msgstr "تم تغيير الإعدادات من مقدم الدفع." -#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:819 +#: pretix/control/logdisplay.py:486 pretix/control/logdisplay.py:820 msgid "The settings of a ticket output provider have been changed." msgstr "تم تغيير إعدادات مزود الناتج التذاكر." @@ -17215,11 +17348,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:1570 +#: pretix/control/logdisplay.py:505 pretix/control/views/orders.py:1572 msgid "The order has been marked as expired." msgstr "تم وضع علامة على النظام ومنتهية الصلاحية." -#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1469 +#: pretix/control/logdisplay.py:506 pretix/control/views/orders.py:1471 msgid "The order has been marked as paid." msgstr "تم وضع علامة على الترتيب كما المدفوعة." @@ -17231,7 +17364,7 @@ msgstr "تم حذف طلب الإلغاء." msgid "The order has been refunded." msgstr "وقد تم ترتيب ردها." -#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1886 +#: pretix/control/logdisplay.py:509 pretix/control/views/orders.py:1888 msgid "The order has been reactivated." msgstr "تم إعادة تنشيط الطلب." @@ -17243,7 +17376,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:790 +#: pretix/control/logdisplay.py:513 pretix/control/views/orders.py:791 msgid "The order has been approved." msgstr "تمت الموافقة على النظام." @@ -17280,85 +17413,91 @@ msgstr "تم تغيير حساب العميل." msgid "The order locale has been changed." msgstr "تم تغيير لغة النظام." -#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1609 -#: pretix/presale/views/order.py:741 pretix/presale/views/order.py:814 +#: pretix/control/logdisplay.py:524 pretix/control/views/orders.py:1611 +#: pretix/presale/views/order.py:745 pretix/presale/views/order.py:825 msgid "The invoice has been generated." msgstr "تم إنشاء الفاتورة." -#: pretix/control/logdisplay.py:525 pretix/control/views/orders.py:1682 +#: pretix/control/logdisplay.py:525 +#, fuzzy +#| msgid "The invoice has been generated." +msgid "The invoice could not be generated." +msgstr "تم إنشاء الفاتورة." + +#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1684 msgid "The invoice has been regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/logdisplay.py:526 pretix/control/views/orders.py:1744 -#: pretix/presale/views/order.py:827 +#: pretix/control/logdisplay.py:527 pretix/control/views/orders.py:1746 +#: pretix/presale/views/order.py:845 msgid "The invoice has been reissued." msgstr "تم إعادة إصدار الفاتورة." -#: pretix/control/logdisplay.py:527 +#: pretix/control/logdisplay.py:528 #, fuzzy, python-brace-format #| msgid "The invite has been resent." msgid "The invoice {full_invoice_no} has been sent." msgstr "وكان يستاء دعوة." -#: pretix/control/logdisplay.py:528 +#: pretix/control/logdisplay.py:529 #, python-brace-format msgid "The transmission of invoice {full_invoice_no} has failed." msgstr "" -#: pretix/control/logdisplay.py:529 +#: pretix/control/logdisplay.py:530 #, python-brace-format msgid "" "Invoice {full_invoice_no} has not been transmitted because the transmission " "provider does not support test mode invoices." msgstr "" -#: pretix/control/logdisplay.py:531 +#: pretix/control/logdisplay.py:532 #, python-brace-format msgid "The invoice {full_invoice_no} has been scheduled for retransmission." msgstr "" -#: pretix/control/logdisplay.py:532 +#: pretix/control/logdisplay.py:533 msgid "The order's internal comment has been updated." msgstr "تم تحديث تعليق الداخلي النظام و." -#: pretix/control/logdisplay.py:533 +#: pretix/control/logdisplay.py:534 #, fuzzy #| msgid "The order of items has been updated." msgid "The order's follow-up date has been updated." msgstr "تم تحديث ترتيب العناصر." -#: pretix/control/logdisplay.py:534 +#: pretix/control/logdisplay.py:535 msgid "The order's flag to require attention at check-in has been toggled." msgstr "تم تبديل عند النقر علم النظام وبحاجة إلى اهتمام في الاختيار." -#: pretix/control/logdisplay.py:536 +#: pretix/control/logdisplay.py:537 #, fuzzy #| msgid "The order's secret has been changed." msgid "The order's check-in text has been changed." msgstr "تم تغيير سر النظام و." -#: pretix/control/logdisplay.py:537 +#: pretix/control/logdisplay.py:538 #, fuzzy #| msgid "The order's flag to require attention at check-in has been toggled." msgid "" "The order's flag to be considered valid even if unpaid has been toggled." msgstr "تم تبديل عند النقر علم النظام وبحاجة إلى اهتمام في الاختيار." -#: pretix/control/logdisplay.py:539 +#: pretix/control/logdisplay.py:540 #, python-brace-format msgid "A new payment {local_id} has been started instead of the previous one." msgstr "وقد بدأ دفعة جديدة {local_id} بدلا من سابقتها." -#: pretix/control/logdisplay.py:540 +#: pretix/control/logdisplay.py:541 msgid "An unidentified type email has been sent." msgstr "تم ارسال نوع البريد الإلكتروني مجهول." -#: pretix/control/logdisplay.py:541 pretix/control/logdisplay.py:722 -#: pretix/control/logdisplay.py:728 pretix/control/logdisplay.py:756 +#: pretix/control/logdisplay.py:542 pretix/control/logdisplay.py:723 +#: pretix/control/logdisplay.py:729 pretix/control/logdisplay.py:757 msgid "Sending of an email has failed." msgstr "ارسال بريد الكتروني قد فشلت." -#: pretix/control/logdisplay.py:542 +#: pretix/control/logdisplay.py:543 #, fuzzy #| msgid "" #| "The email has been sent without attachments since they would have been " @@ -17370,68 +17509,68 @@ msgstr "" "تم إرسال البريد الإلكتروني دون المرفقات لأنها كان يمكن أن يكون كبيرا جدا " "ليكون من المرجح أن يصل." -#: pretix/control/logdisplay.py:544 +#: pretix/control/logdisplay.py:545 #, fuzzy #| msgid "A custom email has been sent." msgid "An invoice email has been sent." msgstr "تم إرسال البريد الإلكتروني المخصص." -#: pretix/control/logdisplay.py:545 +#: pretix/control/logdisplay.py:546 msgid "A custom email has been sent." msgstr "تم إرسال البريد الإلكتروني المخصص." -#: pretix/control/logdisplay.py:546 +#: pretix/control/logdisplay.py:547 msgid "A custom email has been sent to an attendee." msgstr "تم إرسال البريد الإلكتروني المخصص لحاضر." -#: pretix/control/logdisplay.py:547 +#: pretix/control/logdisplay.py:548 msgid "" "An email has been sent with a reminder that the ticket is available for " "download." msgstr "وقد أرسلت رسالة بالبريد الالكتروني مع التذكير بأن تذكرة يتوفر للتحميل." -#: pretix/control/logdisplay.py:549 +#: pretix/control/logdisplay.py:550 msgid "" "An email has been sent with a warning that the order is about to expire." msgstr "" "وقد أرسلت رسالة بالبريد الالكتروني مع تحذير بأن النظام على وشك الانتهاء." -#: pretix/control/logdisplay.py:552 +#: pretix/control/logdisplay.py:553 msgid "" "An email has been sent to notify the user that the order has been canceled." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم التي تم إلغاء الطلب." -#: pretix/control/logdisplay.py:553 +#: pretix/control/logdisplay.py:554 msgid "" "An email has been sent to notify the user that the event has been canceled." msgstr "تم إرسال بريد إلكتروني لإعلام المستخدم بإلغاء الفعالية." -#: pretix/control/logdisplay.py:556 +#: pretix/control/logdisplay.py:557 msgid "" "An email has been sent to notify the user that the order has been changed." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم التي تم تغيير النظام." -#: pretix/control/logdisplay.py:558 +#: pretix/control/logdisplay.py:559 msgid "" "An email has been sent to notify the user that the order has been received." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم الذي تم استلام النظام." -#: pretix/control/logdisplay.py:560 +#: pretix/control/logdisplay.py:561 msgid "" "An email has been sent to notify the user that payment has been received." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم الذي تم استلام المبلغ." -#: pretix/control/logdisplay.py:562 +#: pretix/control/logdisplay.py:563 msgid "" "An email has been sent to notify the user that the order has been denied." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم التي تم رفض الطلب." -#: pretix/control/logdisplay.py:563 +#: pretix/control/logdisplay.py:564 msgid "" "An email has been sent to notify the user that the order has been approved." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم أن تمت الموافقة على النظام." -#: pretix/control/logdisplay.py:566 +#: pretix/control/logdisplay.py:567 msgid "" "An email has been sent to notify the user that the order has been received " "and requires payment." @@ -17439,7 +17578,7 @@ msgstr "" "وقد تم إرسال بريد إلكتروني لإعلام المستخدم الذي تم استلام النظام ويتطلب " "الدفع." -#: pretix/control/logdisplay.py:567 +#: pretix/control/logdisplay.py:568 msgid "" "An email has been sent to notify the user that the order has been received " "and requires approval." @@ -17447,25 +17586,25 @@ msgstr "" "وقد تم إرسال بريد إلكتروني لإعلام المستخدم الذي تم استلام النظام، ويتطلب " "موافقة عليها." -#: pretix/control/logdisplay.py:570 +#: pretix/control/logdisplay.py:571 msgid "" "An email with a link to the order detail page has been resent to the user." msgstr "" "وكانت رسائل البريد الإلكتروني مع رابط إلى صفحة التفاصيل النظام تستاء إلى " "المستخدم." -#: pretix/control/logdisplay.py:571 +#: pretix/control/logdisplay.py:572 #, fuzzy #| msgid "" #| "An email has been sent to notify the user that payment has been received." msgid "An email has been sent to notify the user that the payment failed." msgstr "وقد تم إرسال بريد إلكتروني لإعلام المستخدم الذي تم استلام المبلغ." -#: pretix/control/logdisplay.py:578 +#: pretix/control/logdisplay.py:579 msgid "The voucher has been created." msgstr "تم إنشاء قسيمة." -#: pretix/control/logdisplay.py:581 +#: pretix/control/logdisplay.py:582 #, fuzzy #| msgid "A voucher has been sent to a person on the waiting list." msgid "" @@ -17473,853 +17612,853 @@ msgid "" "from the waiting list." msgstr "تم إرسال قسيمة لشخص على قائمة الانتظار." -#: pretix/control/logdisplay.py:582 +#: pretix/control/logdisplay.py:583 msgid "The voucher has been changed." msgstr "تم تغيير قسيمة." -#: pretix/control/logdisplay.py:583 +#: pretix/control/logdisplay.py:584 msgid "The voucher has been deleted." msgstr "تم حذف قسيمة." -#: pretix/control/logdisplay.py:584 +#: pretix/control/logdisplay.py:585 #, 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:593 +#: pretix/control/logdisplay.py:594 #, python-brace-format msgid "The voucher has been redeemed in order {order_code}." msgstr "تم استبدال القسيمة من أجل {order_code}." -#: pretix/control/logdisplay.py:608 +#: pretix/control/logdisplay.py:609 msgid "The category has been added." msgstr "تمت إضافة فئة." -#: pretix/control/logdisplay.py:609 +#: pretix/control/logdisplay.py:610 msgid "The category has been deleted." msgstr "تم حذف الفئة." -#: pretix/control/logdisplay.py:610 +#: pretix/control/logdisplay.py:611 msgid "The category has been changed." msgstr "تم تغيير الفئة." -#: pretix/control/logdisplay.py:611 +#: pretix/control/logdisplay.py:612 #, fuzzy #| msgid "The category has been deleted." msgid "The category has been reordered." msgstr "تم حذف الفئة." -#: pretix/control/logdisplay.py:618 +#: pretix/control/logdisplay.py:619 msgid "The tax rule has been added." msgstr "تمت إضافة القاعدة الضريبية." -#: pretix/control/logdisplay.py:619 +#: pretix/control/logdisplay.py:620 msgid "The tax rule has been deleted." msgstr "تم حذف حكم الضرائب." -#: pretix/control/logdisplay.py:620 +#: pretix/control/logdisplay.py:621 msgid "The tax rule has been changed." msgstr "تم تغيير القاعدة الضريبية." -#: pretix/control/logdisplay.py:632 +#: pretix/control/logdisplay.py:633 #, python-brace-format msgid "{user} has been added to the team." msgstr "{user} قد أضيفت إلى الفريق." -#: pretix/control/logdisplay.py:633 +#: pretix/control/logdisplay.py:634 #, python-brace-format msgid "{user} has been removed from the team." msgstr "{user} تمت إزالته من الفريق." -#: pretix/control/logdisplay.py:634 +#: pretix/control/logdisplay.py:635 #, python-brace-format msgid "{user} has been invited to the team." msgstr "{user} وقد وجهت الدعوة للفريق." -#: pretix/control/logdisplay.py:635 +#: pretix/control/logdisplay.py:636 #, python-brace-format msgid "Invite for {user} has been resent." msgstr "دعوة ل{user} لديه كان يستاء." -#: pretix/control/logdisplay.py:646 +#: pretix/control/logdisplay.py:647 #, python-brace-format msgid "{user} has joined the team using the invite sent to {email}." msgstr "{user} انضم إلى الفريق باستخدام دعوة إرسالها إلى {email}." -#: pretix/control/logdisplay.py:656 +#: pretix/control/logdisplay.py:657 msgid "Your account settings have been changed." msgstr "تم تغيير إعدادات حسابك." -#: pretix/control/logdisplay.py:659 pretix/control/views/user.py:253 +#: pretix/control/logdisplay.py:660 pretix/control/views/user.py:253 #, python-brace-format msgid "Your email address has been changed to {email}." msgstr "تم تغيير عنوان البريد الإلكتروني الخاص بك إلى {email}." -#: pretix/control/logdisplay.py:661 pretix/control/views/user.py:250 +#: pretix/control/logdisplay.py:662 pretix/control/views/user.py:250 msgid "Your password has been changed." msgstr "تم تغيير كلمة السر الخاصة بك." -#: pretix/control/logdisplay.py:663 +#: pretix/control/logdisplay.py:664 msgid "Your account has been enabled." msgstr "تم تمكين حسابك." -#: pretix/control/logdisplay.py:665 +#: pretix/control/logdisplay.py:666 msgid "Your account has been disabled." msgstr "تم تعطيل حسابك." -#: pretix/control/logdisplay.py:675 +#: pretix/control/logdisplay.py:676 #, python-brace-format msgid "You impersonated {}." msgstr "كنت انتحاله {}." -#: pretix/control/logdisplay.py:676 +#: pretix/control/logdisplay.py:677 #, python-brace-format msgid "You stopped impersonating {}." msgstr "قمت بإيقاف انتحال {}." -#: pretix/control/logdisplay.py:683 +#: pretix/control/logdisplay.py:684 msgid "This object has been created by cloning." msgstr "تم إنشاء هذا الكائن عبر النسخ." -#: pretix/control/logdisplay.py:684 +#: pretix/control/logdisplay.py:685 msgid "The organizer has been changed." msgstr "تم تغيير المنظم." -#: pretix/control/logdisplay.py:685 +#: pretix/control/logdisplay.py:686 msgid "The organizer settings have been changed." msgstr "تم تغيير إعدادات المنظم." -#: pretix/control/logdisplay.py:686 pretix/control/logdisplay.py:827 +#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:828 #, fuzzy #| msgid "The order details have been changed." msgid "The footer links have been changed." msgstr "تم تغيير تفاصيل النظام." -#: pretix/control/logdisplay.py:687 pretix/control/logdisplay.py:734 +#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 #, fuzzy #| msgid "The quota has been added." msgid "A scheduled export has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:688 pretix/control/logdisplay.py:735 +#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 #, fuzzy #| msgid "The product has been changed." msgid "A scheduled export has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:689 pretix/control/logdisplay.py:736 +#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been deleted." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:690 pretix/control/logdisplay.py:737 +#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 #, fuzzy #| msgid "The selected product has been deleted." msgid "A scheduled export has been executed." msgstr "تم حذف المنتج المحدد." -#: pretix/control/logdisplay.py:691 pretix/control/logdisplay.py:738 +#: pretix/control/logdisplay.py:692 pretix/control/logdisplay.py:739 #, python-brace-format msgid "A scheduled export has failed: {reason}." msgstr "" -#: pretix/control/logdisplay.py:692 +#: pretix/control/logdisplay.py:693 msgid "Gift card acceptance for another organizer has been added." msgstr "تم إضافة قبول بطاقة الهدية لمنظم آخر." -#: pretix/control/logdisplay.py:693 +#: pretix/control/logdisplay.py:694 msgid "Gift card acceptance for another organizer has been removed." msgstr "تم إزالة قبول بطاقة هدية لمنظم آخر." -#: pretix/control/logdisplay.py:694 +#: pretix/control/logdisplay.py:695 #, fuzzy #| msgid "The gift card has been created." msgid "A new gift card acceptor has been invited." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:695 +#: pretix/control/logdisplay.py:696 #, fuzzy #| msgid "The gift card has been created." msgid "A gift card acceptor has been removed." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:696 +#: pretix/control/logdisplay.py:697 #, 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:697 +#: pretix/control/logdisplay.py:698 #, fuzzy #| msgid "The selected gift card issuer has been added." msgid "A new gift card issuer has been accepted." msgstr "تمت إضافة مصدر البطاقة هدية المحدد." -#: pretix/control/logdisplay.py:698 +#: pretix/control/logdisplay.py:699 msgid "The webhook has been created." msgstr "تم إنشاء خطاف الويب." -#: pretix/control/logdisplay.py:699 +#: pretix/control/logdisplay.py:700 msgid "The webhook has been changed." msgstr "تم تغيير خطاف الويب." -#: pretix/control/logdisplay.py:700 +#: pretix/control/logdisplay.py:701 msgid "The webhook call retry jobs have been manually expedited." msgstr "" -#: pretix/control/logdisplay.py:701 +#: pretix/control/logdisplay.py:702 #, fuzzy #| msgid "The webhook has been created." msgid "The webhook call retry jobs have been dropped." msgstr "تم إنشاء خطاف الويب." -#: pretix/control/logdisplay.py:702 +#: pretix/control/logdisplay.py:703 #, fuzzy #| msgid "The order has been created." msgid "The SSO provider has been created." msgstr "تم إنشاء هذا الأمر." -#: pretix/control/logdisplay.py:703 +#: pretix/control/logdisplay.py:704 #, fuzzy #| msgid "The order has been changed." msgid "The SSO provider has been changed." msgstr "تم تغيير النظام." -#: pretix/control/logdisplay.py:704 +#: pretix/control/logdisplay.py:705 #, fuzzy #| msgid "The order has been deleted." msgid "The SSO provider has been deleted." msgstr "تم حذف هذا الأمر." -#: pretix/control/logdisplay.py:705 +#: pretix/control/logdisplay.py:706 #, fuzzy #| msgid "The event has been created." msgid "The SSO client has been created." msgstr "تم إنشاء هذا الحدث." -#: pretix/control/logdisplay.py:706 +#: pretix/control/logdisplay.py:707 #, fuzzy #| msgid "The account has been changed." msgid "The SSO client has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:707 +#: pretix/control/logdisplay.py:708 #, fuzzy #| msgid "The event has been deleted." msgid "The SSO client has been deleted." msgstr "الحدث تم الغائه." -#: pretix/control/logdisplay.py:708 pretix/control/views/organizer.py:2632 +#: pretix/control/logdisplay.py:709 pretix/control/views/organizer.py:2632 msgid "The membership type has been created." msgstr "تم انشاء نوع العضوية." -#: pretix/control/logdisplay.py:709 +#: pretix/control/logdisplay.py:710 msgid "The membership type has been changed." msgstr "تم تغيير نوع العضوية." -#: pretix/control/logdisplay.py:710 +#: pretix/control/logdisplay.py:711 msgid "The membership type has been deleted." msgstr "تم حذف نوع العضوية." -#: pretix/control/logdisplay.py:711 pretix/control/views/organizer.py:3470 +#: pretix/control/logdisplay.py:712 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:712 +#: pretix/control/logdisplay.py:713 #, fuzzy #| msgid "The device has been changed." msgid "The sales channel has been changed." msgstr "تم تغيير الجهاز." -#: pretix/control/logdisplay.py:713 +#: pretix/control/logdisplay.py:714 #, fuzzy #| msgid "The selected list has been deleted." msgid "The sales channel has been deleted." msgstr "تم حذف القائمة المحددة." -#: pretix/control/logdisplay.py:714 +#: pretix/control/logdisplay.py:715 msgid "The account has been created." msgstr "تم إنشاء الحساب." -#: pretix/control/logdisplay.py:715 +#: pretix/control/logdisplay.py:716 msgid "The account has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:716 +#: pretix/control/logdisplay.py:717 msgid "A membership for this account has been added." msgstr "تم إضافة عضوية لهذا الحساب." -#: pretix/control/logdisplay.py:717 +#: pretix/control/logdisplay.py:718 msgid "A membership of this account has been changed." msgstr "تم تغيير العضوية لهذا الحساب." -#: pretix/control/logdisplay.py:718 +#: pretix/control/logdisplay.py:719 msgid "A membership of this account has been deleted." msgstr "تم حذف عضوية هذا الحساب." -#: pretix/control/logdisplay.py:719 +#: pretix/control/logdisplay.py:720 #, fuzzy #| msgid "Your account has been disabled." msgid "The account has been disabled and anonymized." msgstr "تم تعطيل الحساب وأصبح مجهول المصدر." -#: pretix/control/logdisplay.py:720 +#: pretix/control/logdisplay.py:721 msgid "A new password has been requested." msgstr "تم طلب تعيين كلمة المرور جديدة." -#: pretix/control/logdisplay.py:721 +#: pretix/control/logdisplay.py:722 msgid "A new password has been set." msgstr "تم تعيين كلمة المرور جديدة." -#: pretix/control/logdisplay.py:723 +#: pretix/control/logdisplay.py:724 #, fuzzy #| msgid "The team has been created." msgid "The reusable medium has been created." msgstr "تم إنشاء فريق." -#: pretix/control/logdisplay.py:724 +#: pretix/control/logdisplay.py:725 #, fuzzy #| msgid "The payment has been created successfully." msgid "The reusable medium has been created automatically." msgstr "تم إنشاء دفع بنجاح." -#: pretix/control/logdisplay.py:725 +#: pretix/control/logdisplay.py:726 #, fuzzy #| msgid "The tax rule has been changed." msgid "The reusable medium has been changed." msgstr "تم تغيير القاعدة الضريبية." -#: pretix/control/logdisplay.py:726 +#: pretix/control/logdisplay.py:727 #, 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:727 +#: pretix/control/logdisplay.py:728 #, 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:729 +#: pretix/control/logdisplay.py:730 msgid "The event's internal comment has been updated." msgstr "تم تحديث التعليق الداخلي للحدث." -#: pretix/control/logdisplay.py:730 +#: pretix/control/logdisplay.py:731 msgid "The event has been canceled." msgstr "تم إلغاء الفعالية." -#: pretix/control/logdisplay.py:731 +#: pretix/control/logdisplay.py:732 msgid "An event has been deleted." msgstr "تم حذف فعالية." -#: pretix/control/logdisplay.py:732 +#: pretix/control/logdisplay.py:733 msgid "A removal process for personal data has been started." msgstr "" -#: pretix/control/logdisplay.py:733 +#: pretix/control/logdisplay.py:734 msgid "A removal process for personal data has been completed." msgstr "" -#: pretix/control/logdisplay.py:739 +#: pretix/control/logdisplay.py:740 msgid "The user has been created." msgstr "تم إنشاء المستخدم." -#: pretix/control/logdisplay.py:740 +#: pretix/control/logdisplay.py:741 #, python-brace-format msgid "" "A first login using {agent_type} on {os_type} from {country} has been " "detected." msgstr "" -#: pretix/control/logdisplay.py:742 pretix/control/views/user.py:490 +#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:490 #: pretix/control/views/user.py:550 pretix/control/views/user.py:609 msgid "Two-factor authentication has been enabled." msgstr "تم تمكين مصادقة اثنين عامل." -#: pretix/control/logdisplay.py:743 pretix/control/views/user.py:393 +#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:393 #: pretix/control/views/user.py:625 msgid "Two-factor authentication has been disabled." msgstr "تم تعطيل المصادقة اثنين عامل." -#: pretix/control/logdisplay.py:744 pretix/control/views/user.py:642 +#: pretix/control/logdisplay.py:745 pretix/control/views/user.py:642 msgid "Your two-factor emergency codes have been regenerated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:745 +#: pretix/control/logdisplay.py:746 #, fuzzy #| msgid "Your two-factor emergency codes have been regenerated." msgid "A two-factor emergency code has been generated." msgstr "وقد جددت بك رموز الطوارئ اثنين عامل." -#: pretix/control/logdisplay.py:746 +#: pretix/control/logdisplay.py:747 #, python-brace-format msgid "" "A new two-factor authentication device \"{name}\" has been added to your " "account." msgstr "A اثنين عامل جهاز التوثيق جديد \"{name}\" قد أضيفت إلى حسابك." -#: pretix/control/logdisplay.py:748 +#: pretix/control/logdisplay.py:749 #, python-brace-format msgid "" "The two-factor authentication device \"{name}\" has been removed from your " "account." msgstr "الجهاز اثنين عامل التوثيق \"{name}\" تمت إزالة من حسابك." -#: pretix/control/logdisplay.py:750 +#: pretix/control/logdisplay.py:751 msgid "Notifications have been enabled." msgstr "تم تمكين الإشعارات." -#: pretix/control/logdisplay.py:751 +#: pretix/control/logdisplay.py:752 msgid "Notifications have been disabled." msgstr "تم تعطيل الإشعارات." -#: pretix/control/logdisplay.py:752 +#: pretix/control/logdisplay.py:753 msgid "Your notification settings have been changed." msgstr "تم تغيير إعدادات الإشعار." -#: pretix/control/logdisplay.py:753 +#: pretix/control/logdisplay.py:754 msgid "This user has been anonymized." msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/control/logdisplay.py:757 +#: pretix/control/logdisplay.py:758 msgid "Password reset mail sent." msgstr "إرسال كلمة المرور الإلكتروني إعادة تعيين." -#: pretix/control/logdisplay.py:758 +#: pretix/control/logdisplay.py:759 msgid "The password has been reset." msgstr "وقد تم إعادة تعيين كلمة المرور." -#: pretix/control/logdisplay.py:759 +#: pretix/control/logdisplay.py:760 msgid "" "A repeated password reset has been denied, as the last request was less than " "24 hours ago." msgstr "" -#: pretix/control/logdisplay.py:761 +#: pretix/control/logdisplay.py:762 #, python-brace-format msgid "The organizer \"{name}\" has been deleted." msgstr "منظم \"{name}\" تم حذفها." -#: pretix/control/logdisplay.py:762 pretix/control/logdisplay.py:988 +#: pretix/control/logdisplay.py:763 pretix/control/logdisplay.py:989 msgid "A voucher has been sent to a person on the waiting list." msgstr "تم إرسال قسيمة لشخص على قائمة الانتظار." -#: pretix/control/logdisplay.py:763 +#: pretix/control/logdisplay.py:764 #, 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:764 +#: pretix/control/logdisplay.py:765 msgid "The team has been created." msgstr "تم إنشاء فريق." -#: pretix/control/logdisplay.py:765 +#: pretix/control/logdisplay.py:766 msgid "The team settings have been changed." msgstr "تم تغيير إعدادات الفريق." -#: pretix/control/logdisplay.py:766 +#: pretix/control/logdisplay.py:767 msgid "The team has been deleted." msgstr "تم حذف الفريق." -#: pretix/control/logdisplay.py:767 pretix/control/views/organizer.py:2298 +#: pretix/control/logdisplay.py:768 pretix/control/views/organizer.py:2298 msgid "The gate has been created." msgstr "تم إنشاء البوابة." -#: pretix/control/logdisplay.py:768 +#: pretix/control/logdisplay.py:769 msgid "The gate has been changed." msgstr "تم تغيير البوابة." -#: pretix/control/logdisplay.py:769 +#: pretix/control/logdisplay.py:770 msgid "The gate has been deleted." msgstr "تم حذف البوابة." -#: pretix/control/logdisplay.py:770 +#: pretix/control/logdisplay.py:771 msgctxt "subevent" msgid "The event date has been deleted." msgstr "تم حذف تاريخ الحدث." -#: pretix/control/logdisplay.py:771 +#: pretix/control/logdisplay.py:772 msgctxt "subevent" msgid "The event date has been canceled." msgstr "تم تغيير تاريخ الفعالية." -#: pretix/control/logdisplay.py:772 +#: pretix/control/logdisplay.py:773 msgctxt "subevent" msgid "The event date has been changed." msgstr "تم تغيير تاريخ الحدث." -#: pretix/control/logdisplay.py:773 +#: pretix/control/logdisplay.py:774 msgctxt "subevent" msgid "The event date has been created." msgstr "تم إنشاء تاريخ الحدث." -#: pretix/control/logdisplay.py:774 +#: pretix/control/logdisplay.py:775 msgctxt "subevent" msgid "A quota has been added to the event date." msgstr "تمت إضافة الحصص لتاريخ الحدث." -#: pretix/control/logdisplay.py:775 +#: pretix/control/logdisplay.py:776 msgctxt "subevent" msgid "A quota has been changed on the event date." msgstr "تم تغيير الحصص في تاريخ الحدث." -#: pretix/control/logdisplay.py:776 +#: pretix/control/logdisplay.py:777 msgctxt "subevent" msgid "A quota has been removed from the event date." msgstr "تمت إزالة حصة من تاريخ الحدث." -#: pretix/control/logdisplay.py:777 +#: pretix/control/logdisplay.py:778 msgid "The device has been created." msgstr "تم إنشاء الجهاز." -#: pretix/control/logdisplay.py:778 +#: pretix/control/logdisplay.py:779 msgid "The device has been changed." msgstr "تم تغيير الجهاز." -#: pretix/control/logdisplay.py:779 +#: pretix/control/logdisplay.py:780 msgid "Access of the device has been revoked." msgstr "تم إبطال الوصول للجهاز." -#: pretix/control/logdisplay.py:780 +#: pretix/control/logdisplay.py:781 msgid "The device has been initialized." msgstr "تم تهيئة الجهاز." -#: pretix/control/logdisplay.py:781 +#: pretix/control/logdisplay.py:782 msgid "The access token of the device has been regenerated." msgstr "تم إعادة إنشاء الوصول رمزية للجهاز." -#: pretix/control/logdisplay.py:782 +#: pretix/control/logdisplay.py:783 msgid "The device has notified the server of an hardware or software update." msgstr "وقد أخطرت جهاز الخادم من تحديث الأجهزة أو البرامج." -#: pretix/control/logdisplay.py:783 +#: pretix/control/logdisplay.py:784 msgid "The gift card has been created." msgstr "تم إنشاء بطاقة هدية." -#: pretix/control/logdisplay.py:784 pretix/control/views/organizer.py:1925 +#: pretix/control/logdisplay.py:785 pretix/control/views/organizer.py:1925 msgid "The gift card has been changed." msgstr "تم تغيير بطاقة الهدية." -#: pretix/control/logdisplay.py:785 +#: pretix/control/logdisplay.py:786 msgid "A manual transaction has been performed." msgstr "تم إجراء عملية يدوية." -#: pretix/control/logdisplay.py:786 +#: pretix/control/logdisplay.py:787 #, python-brace-format msgid "The token \"{name}\" has been created." msgstr "ورمزي \"{name}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:787 +#: pretix/control/logdisplay.py:788 #, python-brace-format msgid "The token \"{name}\" has been revoked." msgstr "ورمزي \"{name}\" تم إبطال." -#: pretix/control/logdisplay.py:788 +#: pretix/control/logdisplay.py:789 #, 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:795 pretix/control/logdisplay.py:854 +#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 #, fuzzy #| msgid "A plugin has been enabled." msgid "The plugin has been enabled." msgstr "تم تمكين البرنامج المساعد." -#: pretix/control/logdisplay.py:796 pretix/control/logdisplay.py:855 +#: pretix/control/logdisplay.py:797 pretix/control/logdisplay.py:856 #: 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:799 pretix/control/logdisplay.py:858 +#: pretix/control/logdisplay.py:800 pretix/control/logdisplay.py:859 #, fuzzy, python-brace-format #| msgid "Question {val}" msgid "Plugin {val}" msgstr "سؤال{val}" -#: pretix/control/logdisplay.py:814 +#: pretix/control/logdisplay.py:815 #, 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:815 +#: pretix/control/logdisplay.py:816 #, 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:816 +#: pretix/control/logdisplay.py:817 #, 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:817 +#: pretix/control/logdisplay.py:818 msgid "The event settings have been changed." msgstr "تم تغيير إعدادات الحدث." -#: pretix/control/logdisplay.py:818 +#: pretix/control/logdisplay.py:819 msgid "The ticket download settings have been changed." msgstr "تم تغيير إعدادات تذكرة تنزيل." -#: pretix/control/logdisplay.py:821 +#: pretix/control/logdisplay.py:822 msgid "The shop has been taken live." msgstr "وقد اتخذت المحل الحية." -#: pretix/control/logdisplay.py:822 +#: pretix/control/logdisplay.py:823 msgid "The shop has been taken offline." msgstr "وقد اتخذت المحل حاليا." -#: pretix/control/logdisplay.py:823 +#: pretix/control/logdisplay.py:824 msgid "The shop has been taken into test mode." msgstr "وقد اتخذت المحل في وضع الاختبار." -#: pretix/control/logdisplay.py:824 +#: pretix/control/logdisplay.py:825 msgid "The test mode has been disabled." msgstr "تم تعطيل وضع الاختبار." -#: pretix/control/logdisplay.py:825 +#: pretix/control/logdisplay.py:826 msgid "The event has been created." msgstr "تم إنشاء هذا الحدث." -#: pretix/control/logdisplay.py:826 +#: pretix/control/logdisplay.py:827 msgid "The event details have been changed." msgstr "تم تغيير تفاصيل الفعالية." -#: pretix/control/logdisplay.py:828 +#: pretix/control/logdisplay.py:829 msgid "An answer option has been added to the question." msgstr "تمت إضافة خيار الإجابة على السؤال." -#: pretix/control/logdisplay.py:829 +#: pretix/control/logdisplay.py:830 msgid "An answer option has been removed from the question." msgstr "تمت إزالة خيار الإجابة عن السؤال." -#: pretix/control/logdisplay.py:830 +#: pretix/control/logdisplay.py:831 msgid "An answer option has been changed." msgstr "تم تغيير خيار الإجابة." -#: pretix/control/logdisplay.py:831 +#: pretix/control/logdisplay.py:832 msgid "A user has been added to the event team." msgstr "تمت إضافة المستخدم إلى فريق الحدث." -#: pretix/control/logdisplay.py:832 +#: pretix/control/logdisplay.py:833 msgid "A user has been invited to the event team." msgstr "وقد وجهت الدعوة للمستخدم لفريق الحدث." -#: pretix/control/logdisplay.py:833 +#: pretix/control/logdisplay.py:834 msgid "A user's permissions have been changed." msgstr "تم تغيير الأذونات للمستخدم." -#: pretix/control/logdisplay.py:834 +#: pretix/control/logdisplay.py:835 msgid "A user has been removed from the event team." msgstr "تمت إزالة مستخدم من فريق الحدث." -#: pretix/control/logdisplay.py:841 +#: pretix/control/logdisplay.py:842 msgid "The check-in list has been added." msgstr "تمت إضافة الاختيار في القائمة." -#: pretix/control/logdisplay.py:842 pretix/control/logdisplay.py:843 +#: pretix/control/logdisplay.py:843 pretix/control/logdisplay.py:844 msgid "The check-in list has been deleted." msgstr "تم حذف الاختيار في القائمة." -#: pretix/control/logdisplay.py:844 +#: pretix/control/logdisplay.py:845 msgid "The check-in list has been changed." msgstr "تم تغيير الاختيار في القائمة." -#: pretix/control/logdisplay.py:847 +#: pretix/control/logdisplay.py:848 #, fuzzy, python-brace-format #| msgid "Check-in list" msgid "Check-in list {val}" msgstr "تحقق في قائمة" -#: pretix/control/logdisplay.py:874 +#: pretix/control/logdisplay.py:875 msgid "The product has been created." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:875 +#: pretix/control/logdisplay.py:876 msgid "The product has been changed." msgstr "تم تغيير المنتج." -#: pretix/control/logdisplay.py:876 +#: pretix/control/logdisplay.py:877 #, fuzzy #| msgid "The product has been created." msgid "The product has been reordered." msgstr "تم إنشاء المنتج." -#: pretix/control/logdisplay.py:877 +#: pretix/control/logdisplay.py:878 msgid "The product has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:878 +#: pretix/control/logdisplay.py:879 msgid "An add-on has been added to this product." msgstr "تمت إضافة وظيفة إضافية على هذا المنتج." -#: pretix/control/logdisplay.py:879 +#: pretix/control/logdisplay.py:880 msgid "An add-on has been removed from this product." msgstr "تمت إزالة وظيفة إضافية على من هذا المنتج." -#: pretix/control/logdisplay.py:880 +#: pretix/control/logdisplay.py:881 msgid "An add-on has been changed on this product." msgstr "تم تغيير وظيفة إضافية على على هذا المنتج." -#: pretix/control/logdisplay.py:881 +#: pretix/control/logdisplay.py:882 msgid "A bundled item has been added to this product." msgstr "تمت إضافة بند المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:882 +#: pretix/control/logdisplay.py:883 msgid "A bundled item has been removed from this product." msgstr "تمت إزالة عنصر المجمعة من هذا المنتج." -#: pretix/control/logdisplay.py:883 +#: pretix/control/logdisplay.py:884 msgid "A bundled item has been changed on this product." msgstr "تم تغيير عنصر المجمعة لهذا المنتج." -#: pretix/control/logdisplay.py:890 +#: pretix/control/logdisplay.py:891 #, python-brace-format msgid "The variation \"{value}\" has been created." msgstr "الاختلاف \"{value}\" تم إنشاؤه." -#: pretix/control/logdisplay.py:891 +#: pretix/control/logdisplay.py:892 #, python-brace-format msgid "The variation \"{value}\" has been deleted." msgstr "الاختلاف \"{value}\" تم حذفها." -#: pretix/control/logdisplay.py:892 +#: pretix/control/logdisplay.py:893 #, python-brace-format msgid "The variation \"{value}\" has been changed." msgstr "الاختلاف \"{value}\" تم تغيير." -#: pretix/control/logdisplay.py:909 +#: pretix/control/logdisplay.py:910 #, python-brace-format msgid "Payment {local_id} has been confirmed." msgstr "وقد تم تأكيد الدفع {local_id}." -#: pretix/control/logdisplay.py:910 +#: pretix/control/logdisplay.py:911 #, python-brace-format msgid "Payment {local_id} has been canceled." msgstr "تم إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:911 +#: pretix/control/logdisplay.py:912 #, python-brace-format msgid "Canceling payment {local_id} has failed." msgstr "فشل إلغاء الدفع {local_id}." -#: pretix/control/logdisplay.py:912 +#: pretix/control/logdisplay.py:913 #, python-brace-format msgid "Payment {local_id} has been started." msgstr "وقد بدأ الدفع {local_id}." -#: pretix/control/logdisplay.py:913 +#: pretix/control/logdisplay.py:914 #, python-brace-format msgid "Payment {local_id} has failed." msgstr "فشلت الدفع {local_id}." -#: pretix/control/logdisplay.py:914 +#: pretix/control/logdisplay.py:915 #, python-brace-format msgid "The order could not be marked as paid: {message}" msgstr "لا يمكن أن تكون وضعت النظام كما المدفوعة: {message}" -#: pretix/control/logdisplay.py:915 +#: pretix/control/logdisplay.py:916 msgid "The order has been overpaid." msgstr "وقد تم ترتيب زائدة." -#: pretix/control/logdisplay.py:916 +#: pretix/control/logdisplay.py:917 #, python-brace-format msgid "Refund {local_id} has been created." msgstr "تم إنشاء استرداد {local_id}." -#: pretix/control/logdisplay.py:917 +#: pretix/control/logdisplay.py:918 #, python-brace-format msgid "Refund {local_id} has been created by an external entity." msgstr "تم إنشاء استرداد {local_id} كيان خارجي." -#: pretix/control/logdisplay.py:918 +#: pretix/control/logdisplay.py:919 msgid "The customer requested you to issue a refund." msgstr "طلب لك العملاء لإصدار رد." -#: pretix/control/logdisplay.py:919 +#: pretix/control/logdisplay.py:920 #, python-brace-format msgid "Refund {local_id} has been completed." msgstr "وقد تم الانتهاء استرداد {local_id}." -#: pretix/control/logdisplay.py:920 +#: pretix/control/logdisplay.py:921 #, python-brace-format msgid "Refund {local_id} has been canceled." msgstr "تم إلغاء استرداد {local_id}." -#: pretix/control/logdisplay.py:921 +#: pretix/control/logdisplay.py:922 #, python-brace-format msgid "Refund {local_id} has failed." msgstr "فشل استرداد {local_id}." -#: pretix/control/logdisplay.py:928 +#: pretix/control/logdisplay.py:929 msgid "The quota has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:929 +#: pretix/control/logdisplay.py:930 msgid "The quota has been deleted." msgstr "تم حذف الحصص." -#: pretix/control/logdisplay.py:930 +#: pretix/control/logdisplay.py:931 msgid "The quota has been changed." msgstr "تم تغيير الحصص." -#: pretix/control/logdisplay.py:931 +#: pretix/control/logdisplay.py:932 msgid "The quota has closed." msgstr "وقد أغلقت الحصص." -#: pretix/control/logdisplay.py:932 pretix/control/views/item.py:1081 +#: pretix/control/logdisplay.py:933 pretix/control/views/item.py:1081 msgid "The quota has been re-opened." msgstr "وكانت الحصة إعادة فتح." -#: pretix/control/logdisplay.py:939 +#: pretix/control/logdisplay.py:940 msgid "The question has been added." msgstr "تمت إضافة هذا السؤال." -#: pretix/control/logdisplay.py:940 +#: pretix/control/logdisplay.py:941 msgid "The question has been deleted." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:941 +#: pretix/control/logdisplay.py:942 msgid "The question has been changed." msgstr "تم تغيير السؤال." -#: pretix/control/logdisplay.py:942 +#: pretix/control/logdisplay.py:943 #, fuzzy #| msgid "The question has been deleted." msgid "The question has been reordered." msgstr "تم حذف السؤال." -#: pretix/control/logdisplay.py:949 +#: pretix/control/logdisplay.py:950 #, fuzzy #| msgid "The quota has been added." msgid "The discount has been added." msgstr "تمت إضافة الحصص." -#: pretix/control/logdisplay.py:950 +#: pretix/control/logdisplay.py:951 #, fuzzy #| msgid "The product has been deleted." msgid "The discount has been deleted." msgstr "تم حذف المنتج." -#: pretix/control/logdisplay.py:951 +#: pretix/control/logdisplay.py:952 #, fuzzy #| msgid "The account has been changed." msgid "The discount has been changed." msgstr "تم تغيير الحساب." -#: pretix/control/logdisplay.py:975 +#: pretix/control/logdisplay.py:976 #, python-brace-format msgid "" "Position #{posid} has been checked in manually at {datetime} on list \"{list}" @@ -18327,7 +18466,7 @@ msgid "" msgstr "" "وقد تم التحقق من موقف # {posid} في يدويا في{datetime} على قائمة \"{list}\"." -#: pretix/control/logdisplay.py:980 +#: pretix/control/logdisplay.py:981 #, python-brace-format msgid "" "Position #{posid} has been checked in again at {datetime} on list \"{list}\"." @@ -18335,15 +18474,15 @@ msgstr "" "وقد تم التحقق من موقف # {posid} الدخول مرة أخرى في{datetime} على قائمة " "\"{list}\"." -#: pretix/control/logdisplay.py:989 +#: pretix/control/logdisplay.py:990 msgid "An entry has been removed from the waiting list." msgstr "تمت إزالة إدخال من قائمة الانتظار." -#: pretix/control/logdisplay.py:990 +#: pretix/control/logdisplay.py:991 msgid "An entry has been changed on the waiting list." msgstr "تم تغيير دخول على قائمة الانتظار." -#: pretix/control/logdisplay.py:991 +#: pretix/control/logdisplay.py:992 msgid "An entry has been added to the waiting list." msgstr "تمت إضافة إدخال إلى قائمة الانتظار." @@ -18427,7 +18566,7 @@ msgstr "القطعة" #: pretix/control/navigation.py:126 pretix/control/navigation.py:435 #: pretix/control/navigation.py:485 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:151 #: pretix/control/templates/pretixcontrol/event/payment.html:47 #: pretix/control/templates/pretixcontrol/event/plugins.html:117 #: pretix/control/templates/pretixcontrol/organizers/plugins.html:137 @@ -18710,12 +18849,12 @@ 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:131 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:168 #: 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 #: pretix/presale/templates/pretixpresale/event/order_pay.html:28 -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:66 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:75 #: pretix/presale/templates/pretixpresale/event/position_change.html:29 msgid "Continue" msgstr "المتابعة" @@ -18768,7 +18907,7 @@ msgstr "كلمة المرور الجديدة تعيين" #: 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:162 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:175 #: 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 @@ -18801,8 +18940,8 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/organizers/export_form.html:46 #: pretix/control/templates/pretixcontrol/organizers/gate_edit.html:15 #: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_invite.html:15 -#: pretix/control/templates/pretixcontrol/organizers/giftcard_create.html:17 -#: pretix/control/templates/pretixcontrol/organizers/giftcard_edit.html:21 +#: pretix/control/templates/pretixcontrol/organizers/giftcard_create.html:20 +#: pretix/control/templates/pretixcontrol/organizers/giftcard_edit.html:24 #: 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 @@ -18813,9 +18952,9 @@ msgstr "كلمة المرور الجديدة تعيين" #: pretix/control/templates/pretixcontrol/organizers/team_edit.html:47 #: pretix/control/templates/pretixcontrol/organizers/webhook_edit.html:21 #: pretix/control/templates/pretixcontrol/pdf/index.html:46 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:630 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:632 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:368 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:287 +#: 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/staff_session_edit.html:13 @@ -19103,8 +19242,8 @@ msgid "Transaction ID" msgstr "المعاملات" #: pretix/control/templates/pretixcontrol/boxoffice/payment.html:98 -#: pretix/plugins/banktransfer/payment.py:297 -#: pretix/plugins/banktransfer/payment.py:306 +#: pretix/plugins/banktransfer/payment.py:298 +#: pretix/plugins/banktransfer/payment.py:307 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:32 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:33 msgid "Reference" @@ -19235,7 +19374,7 @@ msgstr[5] "" #: pretix/presale/templates/pretixpresale/event/order_change.html:22 #: pretix/presale/templates/pretixpresale/event/order_modify.html:80 #: pretix/presale/templates/pretixpresale/event/order_pay.html:23 -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:60 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:69 #: pretix/presale/templates/pretixpresale/event/order_pay_confirm.html:40 #: pretix/presale/templates/pretixpresale/event/position_change.html:24 #: pretix/presale/templates/pretixpresale/event/position_modify.html:44 @@ -19256,7 +19395,7 @@ msgstr "قم بالإلغاء" #: pretix/control/templates/pretixcontrol/orders/export.html:77 #: pretix/control/templates/pretixcontrol/orders/export_delete.html:15 #: pretix/control/templates/pretixcontrol/organizers/channel_delete.html:28 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:173 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:174 #: pretix/control/templates/pretixcontrol/organizers/customer_membership_delete.html:26 #: pretix/control/templates/pretixcontrol/organizers/delete.html:30 #: pretix/control/templates/pretixcontrol/organizers/export.html:77 @@ -19276,7 +19415,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:387 +#: pretix/control/views/orders.py:388 #: 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 @@ -19358,7 +19497,7 @@ msgstr "اسم البنك" #: pretix/control/templates/pretixcontrol/checkin/checkins.html:65 #: pretix/control/templates/pretixcontrol/checkin/simulator.html:49 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14 -#: pretix/plugins/checkinlists/exporters.py:767 +#: pretix/plugins/checkinlists/exporters.py:770 msgid "Result" msgstr "النتيجة" @@ -19574,8 +19713,8 @@ msgstr "آلية الدخول" #: pretix/control/templates/pretixcontrol/items/index.html:164 #: pretix/control/templates/pretixcontrol/orders/export.html:73 #: pretix/control/templates/pretixcontrol/orders/index.html:40 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:98 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:166 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:99 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:167 #: pretix/control/templates/pretixcontrol/organizers/export.html:73 #: pretix/control/templates/pretixcontrol/organizers/giftcard.html:15 #: pretix/control/templates/pretixcontrol/organizers/mail.html:34 @@ -20275,6 +20414,8 @@ msgstr "" #: pretix/control/templates/pretixcontrol/event/dangerzone.html:47 #: pretix/control/templates/pretixcontrol/orders/cancel.html:5 #: pretix/control/templates/pretixcontrol/orders/cancel.html:7 +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:6 +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:8 msgid "Cancel event" msgstr "حذف فعالية" @@ -20544,25 +20685,32 @@ msgstr "ضبط فاتورة" msgid "Invoice generation" msgstr "جيل فاتورة" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:27 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:23 +msgid "" +"You configured that your shop is not an event and the event date should not " +"be shown. Therefore, we recommend that you set the date of service to a " +"different option." +msgstr "" + +#: pretix/control/templates/pretixcontrol/event/invoicing.html:40 msgid "Address form" msgstr "شكل عنوان" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:40 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:53 msgid "Issuer details" msgstr "تفاصيل المصدر" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:50 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:63 msgid "Invoice customization" msgstr "فاتورة التخصيص" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:64 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:77 #, fuzzy #| msgid "Invoice generation" msgid "Invoice transmission" msgstr "جيل فاتورة" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:66 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:79 msgid "" "pretix can transmit invoices using different transmission methods. Different " "transmission methods might be required depending on country and industry. By " @@ -20570,56 +20718,56 @@ msgid "" "types of transmission can be added by plugins." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:73 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:86 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:82 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:95 #, fuzzy #| msgid "Transaction Code" msgid "Transmission method" msgstr "كود المعاملة" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:98 -#: pretix/control/templates/pretixcontrol/event/invoicing.html:125 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:111 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:138 #: 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:100 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:113 msgid "" "When this type is available for an invoice address, no other type can be " "selected." msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:101 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:114 msgid "(exclusive)" msgstr "" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:108 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:121 #, fuzzy #| msgid "Available" msgid "Unavailable" msgstr "متاح" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:130 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:143 #, fuzzy #| msgctxt "payment_state" #| msgid "confirmed" msgid "Not configured" msgstr "تم التأكيد" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:152 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:165 #, fuzzy #| msgid "Enable waiting list" msgid "Enable additional invoice transmission plugins" msgstr "تمكين قائمة الانتظار" -#: pretix/control/templates/pretixcontrol/event/invoicing.html:159 +#: pretix/control/templates/pretixcontrol/event/invoicing.html:172 msgid "Save and show preview" msgstr "حفظ وعرض المعاينة" @@ -20979,19 +21127,19 @@ msgstr "" #: pretix/control/views/organizer.py:2672 #: pretix/control/views/organizer.py:2788 #: pretix/control/views/organizer.py:2917 -#: pretix/control/views/organizer.py:3111 -#: pretix/control/views/organizer.py:3140 -#: pretix/control/views/organizer.py:3180 -#: pretix/control/views/organizer.py:3257 -#: pretix/control/views/organizer.py:3354 -#: pretix/control/views/organizer.py:3383 -#: pretix/control/views/organizer.py:3521 pretix/control/views/subevents.py:542 +#: pretix/control/views/organizer.py:3113 +#: pretix/control/views/organizer.py:3142 +#: pretix/control/views/organizer.py:3182 +#: pretix/control/views/organizer.py:3259 +#: 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/plugins/ticketoutputpdf/views.py:172 -#: pretix/presale/views/customer.py:527 pretix/presale/views/customer.py:579 +#: pretix/presale/views/customer.py:542 pretix/presale/views/customer.py:594 msgid "Your changes have been saved." msgstr "تم حفظ التغييرات." @@ -21856,6 +22004,33 @@ 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." @@ -22460,8 +22635,8 @@ msgid "" msgstr "" #: pretix/control/templates/pretixcontrol/item/index.html:254 -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:617 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:260 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:619 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:262 msgid "Additional settings" msgstr "إعدادات إضافية" @@ -22816,8 +22991,8 @@ msgstr "تحرير مسألة" #: pretix/control/templates/pretixcontrol/items/question.html:26 #: pretix/control/templates/pretixcontrol/orders/fragment_order_status.html:31 #: pretix/control/templates/pretixcontrol/orders/overview.html:88 -#: pretix/plugins/checkinlists/exporters.py:503 -#: pretix/plugins/checkinlists/exporters.py:697 +#: pretix/plugins/checkinlists/exporters.py:504 +#: pretix/plugins/checkinlists/exporters.py:699 #: pretix/plugins/reports/exporters.py:397 #: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:23 msgid "Paid" @@ -23554,13 +23729,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:311 +#: pretix/control/views/orders.py:312 msgid "Approve" msgstr "يوافق" #: pretix/control/templates/pretixcontrol/order/index.html:51 #: pretix/control/templates/pretixcontrol/orders/index.html:304 -#: pretix/control/views/orders.py:325 +#: pretix/control/views/orders.py:326 msgid "Deny" msgstr "أنكر" @@ -23605,7 +23780,7 @@ msgstr "" "المجانية، يمكنك وضع علامة على أنها منتهية الصلاحية يدويا." #: pretix/control/templates/pretixcontrol/order/index.html:116 -#: pretix/control/views/orders.py:373 +#: pretix/control/views/orders.py:374 #, fuzzy #| msgid "Refund order" msgid "Refund for overpayment" @@ -23883,7 +24058,7 @@ msgstr "الضرائب" #: pretix/plugins/reports/exporters.py:397 #: pretix/plugins/reports/exporters.py:446 #: pretix/plugins/reports/exporters.py:638 -#: pretix/plugins/reports/exporters.py:968 +#: pretix/plugins/reports/exporters.py:969 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:465 msgid "Total" msgstr "المجموع" @@ -24383,12 +24558,95 @@ msgid "" "everyone on the waiting list will get multiple emails." msgstr "" -#: pretix/control/templates/pretixcontrol/orders/cancel.html:83 +#: pretix/control/templates/pretixcontrol/orders/cancel.html:84 +#, fuzzy +#| msgid "Refund only" +msgid "Preview refund amount" +msgstr "برد فقط" + +#: pretix/control/templates/pretixcontrol/orders/cancel.html:88 #, fuzzy #| msgid "Cancel order" msgid "Cancel all orders" msgstr "الغاء الطلب" +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:13 +#, fuzzy +#| msgid "If you contact us, please send us the following code:" +msgid "If you proceed, the system will do the following:" +msgstr "إذا اتصلت بنا ، يرجى إرسال الرمز التالي إلينا:" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:19 +#, python-format +msgid "%(count)s order will be canceled fully" +msgid_plural "%(count)s orders will be canceled fully" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:26 +#, python-format +msgid "%(count)s order will be canceled partially" +msgid_plural "%(count)s orders will be canceled partially" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:36 +#, python-format +msgid "%(amount)s are eligible for refunds." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:40 +msgid "" +"The system will attempt to refund the money automatically if supported by " +"the payment method." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:42 +msgid "The system will create manual refunds that you need to execute." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:44 +#, fuzzy +#| msgid "Checked in automatically" +msgid "Refunds will not happen automatically." +msgstr "إيداعه تلقائيا" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:52 +#, fuzzy +#| msgid "Send information via email" +msgid "Inform all customers via email." +msgstr "أرسل المعلومات إلى البريد الإلكتروني" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:57 +msgid "Inform all waiting list contacts via email." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:62 +msgid "" +"These numbers are estimates and may change if the data in your event " +"recently changed." +msgstr "" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:76 +#, fuzzy, python-format +#| msgid "Initiate a refund of %(amount)s" +msgid "Proceed and refund approx. %(amount)s" +msgstr "بدء استرداد %(amount)s" + +#: pretix/control/templates/pretixcontrol/orders/cancel_confirm.html:80 +#, fuzzy +#| msgid "Yes, cancel order" +msgid "Proceed and cancel orders" +msgstr "نعم، إلغاء الطلب" + #: pretix/control/templates/pretixcontrol/orders/export.html:5 #: pretix/control/templates/pretixcontrol/orders/export.html:8 #: pretix/control/templates/pretixcontrol/orders/export_form.html:4 @@ -24750,7 +25008,7 @@ msgid "Remove filter" msgstr "فلتر إزالة" #: pretix/control/templates/pretixcontrol/orders/index.html:145 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:207 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:208 #, fuzzy #| msgid "Order total" msgid "Order paid / total" @@ -24775,40 +25033,40 @@ msgid "TODO %(date)s" msgstr "خروج: %(date)s" #: pretix/control/templates/pretixcontrol/orders/index.html:215 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:246 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:247 #: pretix/control/templates/pretixcontrol/search/orders.html:95 msgid "CANCELLATION REQUESTED" msgstr "" #: pretix/control/templates/pretixcontrol/orders/index.html:218 #: pretix/control/templates/pretixcontrol/orders/index.html:220 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:249 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:251 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:250 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:252 #: pretix/control/templates/pretixcontrol/search/orders.html:98 #: pretix/control/templates/pretixcontrol/search/orders.html:100 msgid "REFUND PENDING" msgstr "إسترداد بانتظار" #: pretix/control/templates/pretixcontrol/orders/index.html:223 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:254 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:255 #: pretix/control/templates/pretixcontrol/search/orders.html:103 msgid "OVERPAID" msgstr "زائدة" #: pretix/control/templates/pretixcontrol/orders/index.html:225 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:256 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:257 #: pretix/control/templates/pretixcontrol/search/orders.html:105 msgid "UNDERPAID" msgstr "يتقاضون أجورا" #: pretix/control/templates/pretixcontrol/orders/index.html:227 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:258 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:259 #: pretix/control/templates/pretixcontrol/search/orders.html:107 msgid "FULLY PAID" msgstr "مدفوع بالكامل" #: pretix/control/templates/pretixcontrol/orders/index.html:239 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:270 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:271 msgid "INVOICE NOT CANCELED" msgstr "" @@ -24842,14 +25100,14 @@ msgid "Select action" msgstr "اختر ولايه" #: pretix/control/templates/pretixcontrol/orders/index.html:311 -#: pretix/control/views/orders.py:357 +#: pretix/control/views/orders.py:358 #, fuzzy #| msgid "Refund full paid amount" msgid "Refund overpaid amount" msgstr "برد المبلغ المدفوع كاملا" #: pretix/control/templates/pretixcontrol/orders/index.html:319 -#: pretix/control/views/orders.py:342 +#: pretix/control/views/orders.py:343 msgid "Mark as expired if overdue" msgstr "" @@ -24976,8 +25234,8 @@ msgstr "إضافة قاعدة جديدة" msgid "Channel" msgstr "يتغيرون" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:7 -#: pretix/control/templates/pretixcontrol/organizers/customer.html:13 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:8 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:14 #: pretix/control/templates/pretixcontrol/organizers/customer_edit.html:8 #: pretix/control/templates/pretixcontrol/organizers/customer_edit.html:18 #, fuzzy, python-format @@ -24985,60 +25243,53 @@ msgstr "يتغيرون" msgid "Customer #%(id)s" msgstr "عنوان البريد الإلكتروني التحقق منها" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:22 -#: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:15 -#: pretix/control/templates/pretixcontrol/organizers/customers.html:90 -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:23 -#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:95 -#: pretix/control/templates/pretixcontrol/organizers/reusable_media.html:102 -#: pretix/control/templates/pretixcontrol/organizers/reusable_medium.html:21 -#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:390 -#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:114 -#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:95 -#: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:66 -msgid "Details" -msgstr "تفاصيل" - -#: pretix/control/templates/pretixcontrol/organizers/customer.html:54 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:55 #, fuzzy #| msgid "Send password reset email" msgid "Send password reset link" msgstr "إرسال إعادة تعيين كلمة المرور البريد الإلكتروني" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:79 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:80 msgid "This includes all paid orders by this customer across all your events." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:80 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:81 #, fuzzy #| msgid "Payment pending" msgid "Lifetime spending" msgstr "انتظار الدفع" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:102 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:103 #: pretix/control/templates/pretixcontrol/organizers/customer_anonymize.html:39 #: pretix/control/templates/pretixcontrol/users/form.html:24 msgid "Anonymize" msgstr "إخفاء هوية" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:121 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:122 #: pretix/control/templates/pretixcontrol/organizers/customer_membership.html:35 #: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:60 msgid "Usages" msgstr "مرات الإستخدام" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:188 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:189 #, fuzzy #| msgid "Team memberships" msgid "Add membership" msgstr "عضوية فريق" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:240 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:241 #: pretix/presale/templates/pretixpresale/organizers/customer_orders.html:29 msgid "Matched to the account based on the email address." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/customer.html:286 +#: pretix/control/templates/pretixcontrol/organizers/customer.html:294 +#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 +#, fuzzy +#| msgid "Latin transcription" +msgid "Last transaction" +msgstr "الإملاء بالحروف اللاتينية" + +#: pretix/control/templates/pretixcontrol/organizers/customer.html:334 #, fuzzy #| msgid "User history" msgid "Customer history" @@ -25520,30 +25771,23 @@ msgstr "تاريخ الانتهاء" msgid "Issued through sale" msgstr "أصدرت من خلال بيع" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:63 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:71 msgid "Transactions" msgstr "المعاملات" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:73 -#: pretix/presale/templates/pretixpresale/event/fragment_giftcard_history.html:7 -#, fuzzy -#| msgid "Confirmations" -msgid "Information" -msgstr "تأكيدات" - -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:86 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:94 msgid "" "Create a payment on the respective order that cancels out with this " "transaction. The order will then likely be overpaid." msgstr "" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:88 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:96 #, fuzzy #| msgid "Never" msgid "Revert" msgstr "أبدا" -#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:131 +#: pretix/control/templates/pretixcontrol/organizers/giftcard.html:139 #, fuzzy #| msgid "Gift cards" msgid "Gift card history" @@ -25656,12 +25900,6 @@ msgstr "" msgid "Manually issue a gift card" msgstr "يدويا إصدار بطاقة هدية" -#: pretix/control/templates/pretixcontrol/organizers/giftcards.html:65 -#, fuzzy -#| msgid "Latin transcription" -msgid "Last transaction" -msgstr "الإملاء بالحروف اللاتينية" - #: pretix/control/templates/pretixcontrol/organizers/index.html:9 msgid "" "The list below shows all organizer accounts you have administrative access " @@ -26313,10 +26551,6 @@ msgstr "" "والغرض من هذه الميزة فقط للمستخدمين المتقدمين. من المستحسن استخدامه فقط لنسخ " "والتصاميم حصة التذاكر، وليس لتعديل التعليمات البرمجية المصدر التصميم." -#: pretix/control/templates/pretixcontrol/pdf/index.html:156 -msgid "Apply" -msgstr "تطبيق" - #: pretix/control/templates/pretixcontrol/pdf/index.html:164 msgid "Uploading new PDF background…" msgstr "تحميل خلفية PDF جديدة ..." @@ -26681,10 +26915,6 @@ msgstr "" "في الملف الذي تم تنزيله، وهناك ملف نصي يدعى \"CONFIRM_CODE.txt\" مع رمز ستة " "أحرف. الرجاء إدخال هذا الرمز هنا لتأكيد أن بنجاح تحميل الملف." -#: pretix/control/templates/pretixcontrol/shredder/download.html:53 -msgid "Confirmation code" -msgstr "رمز التأكيد" - #: pretix/control/templates/pretixcontrol/shredder/download.html:59 msgid "" "Depending on the amount of data in your event, the following step may take a " @@ -26836,8 +27066,8 @@ msgid "" "from the product settings will be used." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:521 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:164 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:523 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:166 msgid "" "You can choose to either add one or more check-in lists for every date in " "your series individually, or use just one check-in list for all your dates " @@ -26849,9 +27079,9 @@ msgid "" "will be easier." msgstr "" -#: pretix/control/templates/pretixcontrol/subevents/bulk.html:600 +#: pretix/control/templates/pretixcontrol/subevents/bulk.html:602 #: pretix/control/templates/pretixcontrol/subevents/bulk_edit.html:359 -#: pretix/control/templates/pretixcontrol/subevents/detail.html:243 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:245 msgid "Add a new check-in list" msgstr "إضافة الاختيار في قائمة جديدة" @@ -26942,7 +27172,7 @@ msgctxt "subevent" msgid "Create date" msgstr "تاريخ إنشاء" -#: pretix/control/templates/pretixcontrol/subevents/detail.html:277 +#: pretix/control/templates/pretixcontrol/subevents/detail.html:279 msgctxt "subevent" msgid "Date history" msgstr "تاريخ التاريخ" @@ -28236,11 +28466,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: pretix/control/views/datasync.py:82 +#: pretix/control/views/datasync.py:82 pretix/control/views/datasync.py:113 #, fuzzy -#| msgid "The quota has been re-opened and will not close again." -msgid "The sync job has been enqueued and will run in the next minutes." -msgstr "وكانت الحصة إعادة فتحها وسوف يتم إغلاق مرة أخرى." +#| msgid "The voucher has been sent to {recipient}." +msgid "The sync job has been set to run as soon as possible." +msgstr "تم إرسال كود الخصم إلى {recipient}." #: pretix/control/views/datasync.py:90 pretix/control/views/datasync.py:104 #, fuzzy @@ -28261,12 +28491,6 @@ msgstr "وقد تم بالفعل إلغاء الفاتورة." msgid "The sync job has been canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/control/views/datasync.py:113 -#, fuzzy -#| msgid "The voucher has been sent to {recipient}." -msgid "The sync job has been set to run as soon as possible." -msgstr "تم إرسال كود الخصم إلى {recipient}." - #: pretix/control/views/datasync.py:144 #, fuzzy #| msgctxt "subevent" @@ -28316,7 +28540,7 @@ 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/organizer.py:2558 -#: pretix/control/views/organizer.py:3616 +#: pretix/control/views/organizer.py:3618 #, fuzzy #| msgid "Some of the provided question ids are invalid." msgid "Some of the provided object ids are invalid." @@ -28367,8 +28591,8 @@ msgstr "طلبك هو: {code}" msgid "Unknown email renderer." msgstr "غير معروف العارض البريد الإلكتروني." -#: pretix/control/views/event.py:920 pretix/control/views/orders.py:678 -#: pretix/presale/views/order.py:1088 pretix/presale/views/order.py:1095 +#: pretix/control/views/event.py:920 pretix/control/views/orders.py:679 +#: pretix/presale/views/order.py:1111 pretix/presale/views/order.py:1118 msgid "You requested an invalid ticket output type." msgstr "لقد طلبت صالح نوع الانتاج التذاكر." @@ -28419,11 +28643,11 @@ msgid "" "event: {plugin_names}" msgstr "" -#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:771 +#: pretix/control/views/event.py:1251 pretix/control/views/orders.py:772 msgid "The comment has been updated." msgstr "تم تحديث التعليق." -#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:773 +#: pretix/control/views/event.py:1253 pretix/control/views/orders.py:774 msgid "Could not update the comment." msgstr "لا يمكن تحديث للتعليق." @@ -28571,7 +28795,7 @@ msgstr "تم تحديث ترتيب الفئات." #: pretix/control/views/item.py:405 pretix/control/views/item.py:539 #: pretix/control/views/organizer.py:2561 -#: pretix/control/views/organizer.py:3619 +#: pretix/control/views/organizer.py:3621 #, fuzzy #| msgid "The question has been deleted." msgid "Not all objects have been selected." @@ -28791,39 +29015,39 @@ msgstr "" msgid "Access for the selected application has been revoked." msgstr "تم إبطال وصول التطبيق المحدد." -#: pretix/control/views/orders.py:193 +#: pretix/control/views/orders.py:194 #, 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:266 +#: pretix/control/views/orders.py:267 #, python-brace-format msgid "" "Successfully executed the action \"{label}\" on {success} of {total} orders." msgstr "" -#: pretix/control/views/orders.py:680 pretix/presale/views/order.py:158 -#: pretix/presale/views/order.py:240 pretix/presale/views/order.py:334 -#: pretix/presale/views/order.py:361 pretix/presale/views/order.py:429 -#: pretix/presale/views/order.py:496 pretix/presale/views/order.py:542 -#: pretix/presale/views/order.py:728 pretix/presale/views/order.py:841 -#: pretix/presale/views/order.py:913 pretix/presale/views/order.py:928 -#: pretix/presale/views/order.py:977 pretix/presale/views/order.py:982 -#: pretix/presale/views/order.py:1097 pretix/presale/views/order.py:1274 -#: pretix/presale/views/order.py:1666 pretix/presale/views/order.py:1697 +#: pretix/control/views/orders.py:681 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 +#: pretix/presale/views/order.py:731 pretix/presale/views/order.py:864 +#: 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 msgid "Unknown order code or not authorized to access this order." msgstr "كود أجل غير معروف أو غير مخول للوصول إلى هذا النظام." -#: pretix/control/views/orders.py:682 pretix/presale/views/order.py:1102 +#: pretix/control/views/orders.py:683 pretix/presale/views/order.py:1125 msgid "Ticket download is not enabled for this product." msgstr "لم يتم تمكين حمل تذكرة لهذا المنتج." -#: pretix/control/views/orders.py:807 +#: pretix/control/views/orders.py:808 msgid "The order has been deleted." msgstr "تم حذف هذا الأمر." -#: pretix/control/views/orders.py:814 +#: pretix/control/views/orders.py:815 msgid "" "The order could not be deleted as some constraints (e.g. data created by " "plug-ins) do not allow it." @@ -28831,55 +29055,55 @@ msgstr "" "لا يمكن حذف النظام كما بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/orders.py:822 +#: pretix/control/views/orders.py:823 msgid "Only orders created in test mode can be deleted." msgstr "أوامر الوحيدة التي تم إنشاؤها في وضع الاختبار يمكن حذفها." -#: pretix/control/views/orders.py:843 +#: pretix/control/views/orders.py:844 msgid "The order has been denied and is therefore now canceled." msgstr "تم رفض الطلب، وبالتالي يتم إلغاء الآن." -#: pretix/control/views/orders.py:883 +#: pretix/control/views/orders.py:884 msgid "This payment has been canceled." msgstr "تم إلغاء هذا الدفع." -#: pretix/control/views/orders.py:885 +#: pretix/control/views/orders.py:886 msgid "This payment can not be canceled at the moment." msgstr "لا يمكن إلغاء هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:911 +#: pretix/control/views/orders.py:912 msgid "The refund has been canceled." msgstr "تم إلغاء استرداد." -#: pretix/control/views/orders.py:913 +#: pretix/control/views/orders.py:914 msgid "This refund can not be canceled at the moment." msgstr "لا يمكن إلغاء هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:947 +#: pretix/control/views/orders.py:948 msgid "The refund has been processed." msgstr "تم معالجة استرداد." -#: pretix/control/views/orders.py:949 pretix/control/views/orders.py:975 +#: pretix/control/views/orders.py:950 pretix/control/views/orders.py:976 msgid "This refund can not be processed at the moment." msgstr "لا يمكن معالجة هذا رد في الوقت الراهن." -#: pretix/control/views/orders.py:973 +#: pretix/control/views/orders.py:974 msgid "The refund has been marked as done." msgstr "تم وضع علامة على المبلغ في القيام به." -#: pretix/control/views/orders.py:999 +#: pretix/control/views/orders.py:1000 #, 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:1006 +#: pretix/control/views/orders.py:1007 #, fuzzy #| msgid "Cancellation fee" msgid "Your cancellation request" msgstr "رسوم الإلغاء" -#: pretix/control/views/orders.py:1007 +#: pretix/control/views/orders.py:1008 #, python-brace-format msgid "" "Hello,\n" @@ -28895,7 +29119,7 @@ msgstr "" "\n" "فريق فعاليتك{event}" -#: pretix/control/views/orders.py:1063 +#: pretix/control/views/orders.py:1064 msgid "" "The payment has been marked as complete, but we were unable to send a " "confirmation mail." @@ -28903,41 +29127,41 @@ msgstr "" "تم وضع علامة الدفع على النحو الكامل، ولكن لم نتمكن من إرسال البريد " "الإلكتروني تأكيد." -#: pretix/control/views/orders.py:1066 +#: pretix/control/views/orders.py:1067 msgid "The payment has been marked as complete." msgstr "تم وضع علامة الدفع على النحو الكامل." -#: pretix/control/views/orders.py:1068 +#: pretix/control/views/orders.py:1069 msgid "This payment can not be confirmed at the moment." msgstr "لا يمكن تأكيد هذه الدفعة في الوقت الراهن." -#: pretix/control/views/orders.py:1159 +#: pretix/control/views/orders.py:1160 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:1259 +#: pretix/control/views/orders.py:1261 #, 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:1310 +#: pretix/control/views/orders.py:1312 msgid "" "You can not refund more than the amount of a payment that is not yet " "refunded." msgstr "لا يمكنك استرداد أكثر من مبلغ الدفعة التي لم يتم ردها حتى الان." -#: pretix/control/views/orders.py:1315 +#: pretix/control/views/orders.py:1317 msgid "" "You selected a partial refund for a payment method that only supports full " "refunds." msgstr "" "لقد حددت استرداد جزئي لطريقة الدفع التي تدعم فقط المبالغ المستردة كامل." -#: pretix/control/views/orders.py:1345 +#: pretix/control/views/orders.py:1347 #, python-brace-format msgid "" "One of the refunds failed to be processed. You should retry to refund in a " @@ -28946,12 +29170,12 @@ msgstr "" "فشل في معالجتها واحدة من المبالغ المستردة. يجب عليك إعادة المحاولة لاسترداد " "بطريقة مختلفة. وكانت رسالة الخطأ: {}" -#: pretix/control/views/orders.py:1351 +#: pretix/control/views/orders.py:1353 #, python-brace-format msgid "A refund of {} has been processed." msgstr "وقد تم تجهيز واسترداد {}." -#: pretix/control/views/orders.py:1355 +#: pretix/control/views/orders.py:1357 #, python-brace-format msgid "" "A refund of {} has been saved, but not yet fully executed. You can mark it " @@ -28960,16 +29184,16 @@ msgstr "" "تم حفظ استرداد {}، ولكن لم يتم تنفيذها بالكامل. يمكنك وضع علامة على أنها " "كاملة أدناه." -#: pretix/control/views/orders.py:1384 +#: pretix/control/views/orders.py:1386 msgid "" "A new gift card was created. You can now send the user their gift card code." msgstr "" -#: pretix/control/views/orders.py:1392 +#: pretix/control/views/orders.py:1394 msgid "Your gift card code" msgstr "" -#: pretix/control/views/orders.py:1394 +#: pretix/control/views/orders.py:1396 #, python-brace-format msgid "" "Hello,\n" @@ -28982,22 +29206,22 @@ msgid "" "Your {event} team" msgstr "" -#: pretix/control/views/orders.py:1405 +#: pretix/control/views/orders.py:1407 msgid "The refunds you selected do not match the selected total refund amount." msgstr "المبالغ المستردة التي حددتها لا تتطابق إجمالي استرداد المبلغ المحدد." -#: pretix/control/views/orders.py:1535 +#: pretix/control/views/orders.py:1537 msgid "" "The order has been marked as paid, but we were unable to send a confirmation " "mail." msgstr "" "تم وضع علامة على النظام ودفع، ولكن لم نتمكن من إرسال البريد الإلكتروني تأكيد." -#: pretix/control/views/orders.py:1538 +#: pretix/control/views/orders.py:1540 msgid "The payment has been created successfully." msgstr "تم إنشاء دفع بنجاح." -#: pretix/control/views/orders.py:1552 +#: pretix/control/views/orders.py:1554 msgid "" "The order has been canceled. You can now select how you want to transfer the " "money back to the user." @@ -29005,22 +29229,22 @@ msgstr "" "تم إلغاء هذا الأمر. يمكنك الآن تحديد كيف تريد لنقل الجزء الخلفي المال " "للمستخدم." -#: pretix/control/views/orders.py:1623 pretix/control/views/orders.py:1627 +#: pretix/control/views/orders.py:1625 pretix/control/views/orders.py:1629 msgid "No VAT ID specified." msgstr "يتم تحديد معرف ضريبة القيمة المضافة." -#: pretix/control/views/orders.py:1631 +#: pretix/control/views/orders.py:1633 msgid "No country specified." msgstr "تحديد أي بلد." -#: pretix/control/views/orders.py:1635 +#: pretix/control/views/orders.py:1637 #, 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:1646 +#: pretix/control/views/orders.py:1648 msgid "" "The VAT ID could not be checked, as the VAT checking service of the country " "is currently not available." @@ -29028,68 +29252,68 @@ msgstr "" "ولم يتسن التحقق من هوية ضريبة القيمة المضافة، مثل خدمة فحص ضريبة القيمة " "المضافة من البلاد غير متوفرة حاليا." -#: pretix/control/views/orders.py:1649 +#: pretix/control/views/orders.py:1651 msgid "This VAT ID is valid." msgstr "هذا ID VAT صالح." -#: pretix/control/views/orders.py:1663 pretix/control/views/orders.py:1697 -#: pretix/control/views/orders.py:1729 +#: pretix/control/views/orders.py:1665 pretix/control/views/orders.py:1699 +#: pretix/control/views/orders.py:1731 msgid "Unknown invoice." msgstr "فاتورة غير معروفة." -#: pretix/control/views/orders.py:1666 +#: pretix/control/views/orders.py:1668 msgid "Invoices may not be changed after they are created." msgstr "" -#: pretix/control/views/orders.py:1668 +#: pretix/control/views/orders.py:1670 msgid "Invoices may not be changed after they are transmitted." msgstr "" -#: pretix/control/views/orders.py:1670 pretix/control/views/orders.py:1732 +#: pretix/control/views/orders.py:1672 pretix/control/views/orders.py:1734 msgid "The invoice has already been canceled." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1672 +#: pretix/control/views/orders.py:1674 #, fuzzy #| msgid "The invoice has already been canceled." msgid "The invoice file has already been exported." msgstr "وقد تم بالفعل إلغاء الفاتورة." -#: pretix/control/views/orders.py:1674 +#: pretix/control/views/orders.py:1676 #, fuzzy #| msgid "The invoice has been regenerated." msgid "The invoice file is too old to be regenerated." msgstr "تم إعادة إنشاء الفاتورة." -#: pretix/control/views/orders.py:1676 pretix/control/views/orders.py:1734 +#: pretix/control/views/orders.py:1678 pretix/control/views/orders.py:1736 msgid "The invoice has been cleaned of personal data." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1701 +#: pretix/control/views/orders.py:1703 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:1708 +#: pretix/control/views/orders.py:1710 #, fuzzy #| msgid "The invoice has been cleaned of personal data." msgid "The invoice has been scheduled for retransmission." msgstr "وقد تم تنظيف الفاتورة البيانات الشخصية." -#: pretix/control/views/orders.py:1765 +#: pretix/control/views/orders.py:1767 msgid "The email has been queued to be sent." msgstr "وقد تم في قائمة الانتظار البريد الإلكتروني لإرسالها." -#: pretix/control/views/orders.py:1789 pretix/presale/views/order.py:1283 +#: pretix/control/views/orders.py:1791 pretix/presale/views/order.py:1306 msgid "This invoice has not been found" msgstr "لم يتم العثور على هذه الفاتورة" -#: pretix/control/views/orders.py:1796 pretix/presale/views/order.py:1290 +#: pretix/control/views/orders.py:1798 pretix/presale/views/order.py:1313 msgid "The invoice file is no longer stored on the server." msgstr "لم يعد تخزين الملف فاتورة على الخادم." -#: pretix/control/views/orders.py:1801 pretix/presale/views/order.py:1295 +#: pretix/control/views/orders.py:1803 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." @@ -29097,107 +29321,107 @@ msgstr "" "لم يتم إنشاء ملف الفاتورة، وسوف تولد لانها لكم الآن. يرجى المحاولة مرة أخرى " "في بضع ثوان." -#: pretix/control/views/orders.py:1829 +#: pretix/control/views/orders.py:1831 msgid "The payment term has been changed." msgstr "تم تغيير مصطلح الدفع." -#: pretix/control/views/orders.py:1834 pretix/control/views/orders.py:1891 +#: pretix/control/views/orders.py:1836 pretix/control/views/orders.py:1893 msgid "" "We were not able to process the request completely as the server was too " "busy." msgstr "لم نكن قادرين على معالجة الطلب تماما كما كان الملقم مشغول جدا." -#: pretix/control/views/orders.py:1842 +#: pretix/control/views/orders.py:1844 msgid "This action is only allowed for pending orders." msgstr "يسمح هذا الإجراء فقط لانتظار أوامر." -#: pretix/control/views/orders.py:1897 +#: pretix/control/views/orders.py:1899 #, 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:2154 pretix/presale/views/order.py:1569 +#: pretix/control/views/orders.py:2156 pretix/presale/views/order.py:1592 msgid "An error occurred. Please see the details below." msgstr "حدث خطأ. يرجى الاطلاع على التفاصيل أدناه." -#: pretix/control/views/orders.py:2162 +#: pretix/control/views/orders.py:2164 msgid "The order has been changed and the user has been notified." msgstr "تم تغيير النظام وتم إعلام المستخدم." -#: pretix/control/views/orders.py:2164 pretix/control/views/orders.py:2300 -#: pretix/control/views/orders.py:2337 pretix/presale/views/order.py:1604 +#: pretix/control/views/orders.py:2166 pretix/control/views/orders.py:2302 +#: pretix/control/views/orders.py:2339 pretix/presale/views/order.py:1627 msgid "The order has been changed." msgstr "تم تغيير النظام." -#: pretix/control/views/orders.py:2191 pretix/presale/checkoutflow.py:945 -#: pretix/presale/views/order.py:783 pretix/presale/views/order.py:888 +#: pretix/control/views/orders.py:2193 pretix/presale/checkoutflow.py:945 +#: 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:2302 +#: pretix/control/views/orders.py:2304 msgid "Nothing about the order had to be changed." msgstr "كان شيئا عن هذا الأمر يجب أن يتغير." -#: pretix/control/views/orders.py:2383 pretix/plugins/sendmail/views.py:176 +#: pretix/control/views/orders.py:2385 pretix/plugins/sendmail/views.py:176 msgid "We could not send the email. See below for details." msgstr "لم نتمكن من إرسال البريد الإلكتروني. انظر أدناه للحصول على التفاصيل." -#: pretix/control/views/orders.py:2399 pretix/control/views/orders.py:2469 +#: pretix/control/views/orders.py:2401 pretix/control/views/orders.py:2471 #: 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:2418 pretix/control/views/orders.py:2489 +#: pretix/control/views/orders.py:2420 pretix/control/views/orders.py:2491 #, python-brace-format msgid "Your message has been queued and will be sent to {}." msgstr "وقد اصطف رسالتك وسوف يتم ارسالهم الى {}." -#: pretix/control/views/orders.py:2422 pretix/control/views/orders.py:2492 +#: pretix/control/views/orders.py:2424 pretix/control/views/orders.py:2494 #, python-brace-format msgid "Failed to send mail to the following user: {}" msgstr "فشل في إرسال البريد الإلكتروني للمستخدم التالية: {}" -#: pretix/control/views/orders.py:2545 pretix/presale/views/order.py:1062 +#: pretix/control/views/orders.py:2547 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:2626 +#: pretix/control/views/orders.py:2628 msgid "There is no order with the given order code." msgstr "لا يوجد أي ترتيب مع رمز ترتيب معين." -#: pretix/control/views/orders.py:2732 pretix/control/views/organizer.py:2074 +#: pretix/control/views/orders.py:2734 pretix/control/views/organizer.py:2074 msgid "The selected exporter was not found." msgstr "لم يتم العثور على مصدر المحدد." -#: pretix/control/views/orders.py:2742 pretix/control/views/organizer.py:2084 +#: pretix/control/views/orders.py:2744 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:2777 pretix/control/views/organizer.py:2127 +#: pretix/control/views/orders.py:2779 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:2782 pretix/control/views/organizer.py:2132 +#: pretix/control/views/orders.py:2784 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:2821 pretix/control/views/organizer.py:2172 +#: pretix/control/views/orders.py:2823 pretix/control/views/organizer.py:2172 #, fuzzy, python-brace-format #| msgid "Export date" msgid "Export: {title}" msgstr "تاريخ التصدير" -#: pretix/control/views/orders.py:2822 pretix/control/views/organizer.py:2174 +#: pretix/control/views/orders.py:2824 pretix/control/views/organizer.py:2174 #, python-brace-format msgid "" "Hello,\n" @@ -29205,7 +29429,7 @@ msgid "" "attached to this email, you can find a new scheduled report for {name}." msgstr "" -#: pretix/control/views/orders.py:2849 pretix/control/views/organizer.py:2207 +#: pretix/control/views/orders.py:2851 pretix/control/views/organizer.py:2207 #, fuzzy #| msgid "You do not have permission to perform this action." msgid "" @@ -29213,27 +29437,27 @@ msgid "" "therefore you cannot schedule it." msgstr "ليس لديك إذن لتنفيذ هذا الإجراء." -#: pretix/control/views/orders.py:2902 pretix/control/views/organizer.py:2259 +#: pretix/control/views/orders.py:2904 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:2981 +#: pretix/control/views/orders.py:2991 pretix/control/views/orders.py:3072 #, fuzzy #| msgid "The order has been canceled." msgid "All orders have been canceled." msgstr "تم إلغاء هذا الأمر." -#: pretix/control/views/orders.py:2983 +#: pretix/control/views/orders.py:2993 pretix/control/views/orders.py:3074 #, 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:3004 +#: pretix/control/views/orders.py:3021 pretix/control/views/orders.py:3095 #, fuzzy #| msgid "Your input was invalid, please try again." msgid "Your input was not valid." @@ -29312,8 +29536,8 @@ msgstr "تم إنشاء فريق. يمكنك الآن إضافة أعضاء لل #: pretix/control/views/organizer.py:2792 #: pretix/control/views/organizer.py:2872 #: pretix/control/views/organizer.py:2922 -#: pretix/control/views/organizer.py:3481 -#: pretix/control/views/organizer.py:3525 +#: pretix/control/views/organizer.py:3483 +#: pretix/control/views/organizer.py:3527 msgid "Your changes could not be saved." msgstr "لا يمكن حفظ التغييرات الخاصة بك." @@ -29504,7 +29728,7 @@ msgstr "تم تحديث ترتيب العناصر." #: pretix/control/views/organizer.py:2706 #: pretix/control/views/organizer.py:2822 #: pretix/control/views/organizer.py:2952 -#: pretix/control/views/organizer.py:3218 +#: pretix/control/views/organizer.py:3220 #, fuzzy #| msgid "The selected product has been deleted." msgid "The selected object has been deleted." @@ -29547,25 +29771,25 @@ msgstr "" "لقد أرسلنا إليك بريدا إلكترونيا يحتوي على مزيد من الإرشادات حول إعادة تعيين " "كلمة المرور الخاصة بك." -#: pretix/control/views/organizer.py:3283 +#: pretix/control/views/organizer.py:3285 #, fuzzy #| msgid "This user has been anonymized." msgid "The customer account has been anonymized." msgstr "تم طمس هويتها لهذا المستخدم." -#: pretix/control/views/organizer.py:3553 +#: pretix/control/views/organizer.py:3555 #, fuzzy #| msgid "This organizer can not be deleted." msgid "This channel can not be deleted." msgstr "لا يمكن حذف هذا منظم." -#: pretix/control/views/organizer.py:3558 +#: pretix/control/views/organizer.py:3560 #, fuzzy #| msgid "The selected list has been deleted." msgid "The selected sales channel has been deleted." msgstr "تم حذف القائمة المحددة." -#: pretix/control/views/organizer.py:3560 +#: pretix/control/views/organizer.py:3562 #, fuzzy #| msgid "" #| "The event could not be deleted as some constraints (e.g. data created by " @@ -29577,7 +29801,7 @@ msgstr "" "لا يمكن حذف الحدث عن بعض القيود (مثل البيانات التي تم إنشاؤها من قبل " "المكونات الإضافية) لا تسمح بذلك." -#: pretix/control/views/organizer.py:3585 +#: pretix/control/views/organizer.py:3587 #, fuzzy #| msgid "The order of items has been updated." msgid "The order of sales channels has been updated." @@ -30288,7 +30512,7 @@ msgstr "قم بتضمين تذاكر لفترة في هذا التاريخ أو #: pretix/plugins/badges/exporters.py:493 #: pretix/plugins/checkinlists/exporters.py:118 #: pretix/plugins/reports/exporters.py:506 -#: pretix/plugins/reports/exporters.py:688 +#: pretix/plugins/reports/exporters.py:689 #: pretix/plugins/ticketoutputpdf/exporters.py:92 msgid "Sort by" msgstr "ترتيب حسب" @@ -30430,7 +30654,7 @@ msgstr "تخطيط الشارة: {}" #: pretix/plugins/banktransfer/apps.py:43 #: pretix/plugins/banktransfer/apps.py:46 #: pretix/plugins/banktransfer/apps.py:47 -#: pretix/plugins/banktransfer/payment.py:60 +#: pretix/plugins/banktransfer/payment.py:61 #: pretix/plugins/banktransfer/signals.py:48 #: pretix/plugins/banktransfer/signals.py:83 msgid "Bank transfer" @@ -30463,7 +30687,7 @@ msgid "" "Install the python package 'chardet' for better CSV import capabilities." msgstr "قم بتثبيت حزمة python 'chardet' لتحسين إمكانات استيراد ملفات CSV." -#: pretix/plugins/banktransfer/payment.py:68 +#: pretix/plugins/banktransfer/payment.py:69 msgid "" "I have understood that people will pay the ticket price directly to my bank " "account and pretix cannot automatically know what payments arrived. " @@ -30476,57 +30700,57 @@ msgstr "" "يدويا ، أو سأستورد بانتظام كشف حساب بنكي رقمي من أجل إعطاء pretix المعلومات " "المطلوبة." -#: pretix/plugins/banktransfer/payment.py:75 +#: pretix/plugins/banktransfer/payment.py:76 msgid "Bank account type" msgstr "نوع الحساب المصرفي" -#: pretix/plugins/banktransfer/payment.py:78 +#: pretix/plugins/banktransfer/payment.py:79 msgid "SEPA bank account" msgstr "حساب مصرفي SEPA" -#: pretix/plugins/banktransfer/payment.py:79 +#: pretix/plugins/banktransfer/payment.py:80 msgid "Other bank account" msgstr "حساب مصرفي آخر" -#: pretix/plugins/banktransfer/payment.py:84 +#: pretix/plugins/banktransfer/payment.py:85 msgid "Name of account holder" msgstr "اسم صاحب الحساب" -#: pretix/plugins/banktransfer/payment.py:86 +#: pretix/plugins/banktransfer/payment.py:87 msgid "" "Please note: special characters other than letters, numbers, and some " "punctuation can cause problems with some banks." msgstr "" -#: pretix/plugins/banktransfer/payment.py:96 -#: pretix/plugins/banktransfer/payment.py:300 -#: pretix/plugins/banktransfer/payment.py:490 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:15 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:14 +#: 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/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 msgid "IBAN" msgstr "رقم الحساب المصرفي الدولي IBAN" -#: pretix/plugins/banktransfer/payment.py:106 -#: pretix/plugins/banktransfer/payment.py:301 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:16 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:15 +#: 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/import_assign.html:66 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:25 msgid "BIC" msgstr "رمز معرف الأعمال BIC" -#: pretix/plugins/banktransfer/payment.py:116 +#: pretix/plugins/banktransfer/payment.py:117 msgid "Name of bank" msgstr "اسم البنك" -#: pretix/plugins/banktransfer/payment.py:126 +#: pretix/plugins/banktransfer/payment.py:127 msgid "Bank account details" msgstr "تفاصيل الحساب المصرفي" -#: pretix/plugins/banktransfer/payment.py:129 +#: pretix/plugins/banktransfer/payment.py:130 msgid "" "Include everything else that your customers might need to send you a bank " "transfer payment. If you have lots of international customers, they might " @@ -30536,7 +30760,7 @@ msgstr "" "كان لديك الكثير من العملاء الدوليين ، فقد يحتاجون إلى عنوانك الكامل وعنوان " "البنك الذي تتعامل معه." -#: pretix/plugins/banktransfer/payment.py:135 +#: pretix/plugins/banktransfer/payment.py:136 msgid "" "For SEPA accounts, you can leave this empty. Otherwise, please add " "everything that your customers need to transfer the money, e.g. account " @@ -30546,38 +30770,38 @@ msgstr "" "يحتاجه عملاؤك لتحويل المبالغ ، على سبيل المثال أرقام الحسابات وأرقام التوجيه " "والعناوين وما إلى ذلك." -#: pretix/plugins/banktransfer/payment.py:154 +#: pretix/plugins/banktransfer/payment.py:155 msgid "Do not include hyphens in the payment reference." msgstr "لا تقم بتضمين الشرطات في مرجع الدفع." -#: pretix/plugins/banktransfer/payment.py:155 +#: pretix/plugins/banktransfer/payment.py:156 msgid "This is required in some countries." msgstr "هذا مطلوب في بعض البلدان." -#: pretix/plugins/banktransfer/payment.py:159 +#: pretix/plugins/banktransfer/payment.py:160 msgid "Include invoice number in the payment reference." msgstr "قم بتضمين رقم الفاتورة في مرجع الدفع." -#: pretix/plugins/banktransfer/payment.py:163 +#: pretix/plugins/banktransfer/payment.py:164 msgid "Prefix for the payment reference" msgstr "الرمز الذي يسق مرجع الدفع" -#: pretix/plugins/banktransfer/payment.py:167 +#: pretix/plugins/banktransfer/payment.py:168 msgid "Additional text to show on pending orders" msgstr "نص إضافي لإظهاره في الطلبات المعلقة" -#: pretix/plugins/banktransfer/payment.py:168 +#: pretix/plugins/banktransfer/payment.py:169 msgid "" "This text will be shown on the order confirmation page for pending orders in " "addition to the standard text." msgstr "" "سيظهر هذا النص في صفحة تأكيد الطلب للأوامر المعلقة بالإضافة إلى النص المعتاد." -#: pretix/plugins/banktransfer/payment.py:177 +#: pretix/plugins/banktransfer/payment.py:178 msgid "IBAN blocklist for refunds" msgstr "قائمة حظر IBAN للمبالغ المستردة" -#: pretix/plugins/banktransfer/payment.py:180 +#: pretix/plugins/banktransfer/payment.py:181 #, fuzzy #| msgid "" #| "Put one IBAN or IBAN prefix per line. The system will not attempt to send " @@ -30600,35 +30824,35 @@ msgstr "" "لجهة خارجية. يمكنك أيضا سرد رموز البلدان مثل \"GB\" إذا كنت لا ترغب أبدا في " "إرسال المبالغ المستردة إلى أرقام IBAN من بلد معين." -#: pretix/plugins/banktransfer/payment.py:207 +#: pretix/plugins/banktransfer/payment.py:208 #, fuzzy #| msgid "Business customers" msgid "Restrict to business customers" msgstr "عملاء قطاع الأعمال" -#: pretix/plugins/banktransfer/payment.py:208 +#: pretix/plugins/banktransfer/payment.py:209 msgid "" "Only allow choosing this payment provider for customers who enter an invoice " "address and select \"Business or institutional customer\"." msgstr "" -#: pretix/plugins/banktransfer/payment.py:238 +#: pretix/plugins/banktransfer/payment.py:239 msgid "Please fill out your bank account details." msgstr "يرجى ملء تفاصيل حسابك المصرفي." -#: pretix/plugins/banktransfer/payment.py:242 +#: pretix/plugins/banktransfer/payment.py:243 msgid "Please enter your bank account details." msgstr "الرجاء إدخال تفاصيل حسابك المصرفي." -#: pretix/plugins/banktransfer/payment.py:291 +#: pretix/plugins/banktransfer/payment.py:292 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:15 msgid "Please transfer the full amount to the following bank account:" msgstr "يرجى تحويل المبلغ كاملا إلى الحساب المصرفي التالي:" -#: pretix/plugins/banktransfer/payment.py:299 -#: pretix/plugins/banktransfer/payment.py:487 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:14 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:13 +#: 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/new_refund_control_form.html:5 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:23 #: pretix/plugins/banktransfer/views.py:829 @@ -30638,9 +30862,9 @@ msgstr "يرجى تحويل المبلغ كاملا إلى الحساب المص msgid "Account holder" msgstr "صاحب الحساب" -#: 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/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/stripe/templates/pretixplugins/stripe/control.html:23 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31 @@ -30650,25 +30874,25 @@ msgstr "صاحب الحساب" msgid "Bank" msgstr "مصرف" -#: pretix/plugins/banktransfer/payment.py:381 +#: pretix/plugins/banktransfer/payment.py:382 msgid "Invalid IBAN/BIC" msgstr "رقم IBAN/BIC غير صالح" -#: pretix/plugins/banktransfer/payment.py:457 +#: pretix/plugins/banktransfer/payment.py:458 #, python-brace-format msgid "Bank account {iban}" msgstr "الحساب المصرفي{iban}" -#: pretix/plugins/banktransfer/payment.py:473 +#: pretix/plugins/banktransfer/payment.py:474 msgid "Can only create a bank transfer refund from an existing payment." msgstr "يمكن فقط إنشاء تحويل مصرفي مسترد من دفعة موجودة." -#: pretix/plugins/banktransfer/payment.py:493 +#: pretix/plugins/banktransfer/payment.py:494 #: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/new_refund_control_form.html:7 msgid "BIC (optional)" msgstr "رقم BIC (اختياري)" -#: pretix/plugins/banktransfer/payment.py:532 +#: pretix/plugins/banktransfer/payment.py:533 msgid "Your input was invalid, please see below for details." msgstr "الإدخالات الخاصة بك غير صالحة ، الرجاء انظر أدناه للحصول على التفاصيل." @@ -30705,8 +30929,8 @@ msgstr "تم إلغاء الطلب سابقا." msgid "Currencies do not match." msgstr "" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:6 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:5 +#: 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:" @@ -30714,8 +30938,8 @@ msgstr "" "بعد إتمام عملية الشراء ، سنطلب منك تحويل الأموال إلى الحساب المصرفي التالي ، " "باستخدام رمز مرجعي شخصي:" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:11 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:10 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:12 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:11 #, fuzzy #| msgid "" #| "We will assign you a personal reference code to use after you completed " @@ -30725,21 +30949,21 @@ msgid "" "code after you completed the order." msgstr "سنخصص لك رمزا مرجعيا شخصيا لاستخدامه بعد إتمام الطلب." -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:26 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:25 +#: 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 msgid "Reference code (important):" msgstr "الرمز المرجعي (مهم):" -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:31 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:30 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:32 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:31 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:36 -#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:35 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:37 +#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:36 #, fuzzy #| msgid "" #| "After completing your purchase, we will ask you to transfer the money to " @@ -31232,8 +31456,8 @@ msgstr "قائمة التسجيل (PDF)" #: pretix/plugins/checkinlists/exporters.py:305 #: pretix/plugins/checkinlists/exporters.py:476 -#: pretix/plugins/checkinlists/exporters.py:673 -#: pretix/plugins/checkinlists/exporters.py:743 +#: pretix/plugins/checkinlists/exporters.py:674 +#: pretix/plugins/checkinlists/exporters.py:745 #, fuzzy #| msgid "Check-in" msgctxt "export_category" @@ -31258,81 +31482,81 @@ msgid "" "list." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:500 +#: pretix/plugins/checkinlists/exporters.py:501 msgid "Checked out" msgstr "تسجيل خروج" -#: pretix/plugins/checkinlists/exporters.py:500 -#: pretix/plugins/checkinlists/exporters.py:765 +#: pretix/plugins/checkinlists/exporters.py:501 +#: pretix/plugins/checkinlists/exporters.py:768 msgid "Automatically checked in" msgstr "تم التسجيل تلقائيا" -#: pretix/plugins/checkinlists/exporters.py:506 -#: pretix/plugins/checkinlists/exporters.py:694 -#: pretix/plugins/checkinlists/exporters.py:759 +#: pretix/plugins/checkinlists/exporters.py:507 +#: pretix/plugins/checkinlists/exporters.py:696 +#: pretix/plugins/checkinlists/exporters.py:762 #: pretix/plugins/paypal/payment.py:124 pretix/plugins/paypal2/payment.py:121 msgid "Secret" msgstr "سري" -#: pretix/plugins/checkinlists/exporters.py:672 +#: pretix/plugins/checkinlists/exporters.py:673 #, fuzzy #| msgid "All check-in lists" msgid "Valid check-in codes" msgstr "جميع قوائم التسجيل" -#: pretix/plugins/checkinlists/exporters.py:674 +#: pretix/plugins/checkinlists/exporters.py:675 msgid "" "Download a spreadsheet with all valid check-in barcodes e.g. for import into " "a different system. Does not included blocked codes or personal data." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:742 +#: pretix/plugins/checkinlists/exporters.py:744 #, fuzzy #| msgid "Check-in log (all successful scans)" msgid "Check-in log (all scans)" msgstr "تسجيل الدخول (جميع عمليات الفحص الناجحة)" -#: pretix/plugins/checkinlists/exporters.py:744 +#: pretix/plugins/checkinlists/exporters.py:746 msgid "" "Download a spreadsheet with one line for every scan that happened at your " "check-in stations." msgstr "" -#: pretix/plugins/checkinlists/exporters.py:763 +#: pretix/plugins/checkinlists/exporters.py:766 #, fuzzy #| msgid "Go offline" msgid "Offline" msgstr "العودة متواجد حاليا" -#: pretix/plugins/checkinlists/exporters.py:764 +#: pretix/plugins/checkinlists/exporters.py:767 msgid "Offline override" msgstr "تجاوز وضع عدم الاتصال" -#: pretix/plugins/checkinlists/exporters.py:768 +#: pretix/plugins/checkinlists/exporters.py:771 #: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:83 msgid "Error message" msgstr "رسالة خاطئة" -#: pretix/plugins/checkinlists/exporters.py:769 +#: pretix/plugins/checkinlists/exporters.py:772 #, fuzzy #| msgid "Download date" msgid "Upload date" msgstr "تاريخ التنزيل" -#: pretix/plugins/checkinlists/exporters.py:770 +#: pretix/plugins/checkinlists/exporters.py:773 #, fuzzy #| msgid "Download time" msgid "Upload time" msgstr "وقت التنزيل" -#: pretix/plugins/checkinlists/exporters.py:827 +#: pretix/plugins/checkinlists/exporters.py:830 #: pretix/presale/templates/pretixpresale/event/fragment_cart.html:519 #: pretix/presale/templates/pretixpresale/fragment_modals.html:52 #: pretix/presale/templates/pretixpresale/fragment_modals.html:148 msgid "OK" msgstr "" -#: pretix/plugins/checkinlists/exporters.py:859 +#: pretix/plugins/checkinlists/exporters.py:862 #, fuzzy #| msgid "Successful payments" msgid "Successful scans only" @@ -31894,7 +32118,7 @@ msgid "Please turn on JavaScript." msgstr "حاول مرة اخرى." #: pretix/plugins/paypal2/templates/pretixplugins/paypal2/pay.html:29 -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:57 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:85 msgid "Please select how you want to pay." msgstr "يرجى اختيار طريقة الدفع." @@ -32119,16 +32343,16 @@ msgid "Orders by tax rate ({currency})" msgstr "أوامر حسب معدل الضريبة ({currency})" #: pretix/plugins/reports/exporters.py:576 -#: pretix/plugins/reports/exporters.py:805 -#: pretix/plugins/reports/exporters.py:857 -#: pretix/plugins/reports/exporters.py:898 +#: pretix/plugins/reports/exporters.py:806 +#: pretix/plugins/reports/exporters.py:858 +#: pretix/plugins/reports/exporters.py:899 msgid "Gross" msgstr "الإجمالي" #: pretix/plugins/reports/exporters.py:576 -#: pretix/plugins/reports/exporters.py:806 -#: pretix/plugins/reports/exporters.py:858 -#: pretix/plugins/reports/exporters.py:898 +#: pretix/plugins/reports/exporters.py:807 +#: pretix/plugins/reports/exporters.py:859 +#: pretix/plugins/reports/exporters.py:899 msgid "Tax" msgstr "ضريبة" @@ -32142,16 +32366,16 @@ msgstr "القائمة الافتراضية" msgid "Download a spreadsheet with the tax amounts included in each order." msgstr "" -#: pretix/plugins/reports/exporters.py:669 +#: pretix/plugins/reports/exporters.py:670 msgid "Taxes by country" msgstr "الضرائب حسب البلد" -#: pretix/plugins/reports/exporters.py:670 +#: pretix/plugins/reports/exporters.py:671 msgid "Business customers" msgstr "عملاء قطاع الأعمال" -#: pretix/plugins/reports/exporters.py:802 -#: pretix/plugins/reports/exporters.py:847 +#: pretix/plugins/reports/exporters.py:803 +#: pretix/plugins/reports/exporters.py:848 msgid "Country code" msgstr "رمز البلد" @@ -34088,7 +34312,7 @@ msgstr "المنتجات الإضافية" #: pretix/presale/checkoutflow.py:678 pretix/presale/checkoutflow.py:686 #: 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:1491 pretix/presale/views/order.py:1499 +#: pretix/presale/views/order.py:1514 pretix/presale/views/order.py:1522 msgid "Please enter numbers only." msgstr "الرجاء إدخال أرقام فقط." @@ -34149,7 +34373,7 @@ msgstr "" "تم استعمال بطاقة الهدايا الخاصة بك، ولكن {} لا تزال بحاجة إلى أن يتم سدادها. " "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:676 +#: pretix/presale/checkoutflow.py:1397 pretix/presale/views/order.py:679 msgid "Please select a payment method." msgstr "الرجاء اختيار طريقة الدفع." @@ -34160,8 +34384,8 @@ msgstr "الرجاء اختيار طريقة الدفع." msgid "Please select a payment method to proceed." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:435 -#: pretix/presale/views/order.py:502 +#: pretix/presale/checkoutflow.py:1454 pretix/presale/views/order.py:438 +#: pretix/presale/views/order.py:505 msgid "The payment information you entered was incomplete." msgstr "معلومات الدفع التي أدخلتها غير مكتملة." @@ -34513,13 +34737,6 @@ msgctxt "alert-messages" msgid "Information" msgstr "تأكيدات" -#: pretix/presale/templates/pretixpresale/event/base.html:222 -#: pretix/presale/templates/pretixpresale/organizers/base.html:100 -#, fuzzy -#| msgid "Contact:" -msgid "Contact" -msgstr "جهة اتصال:" - #: pretix/presale/templates/pretixpresale/event/base.html:225 #: pretix/presale/templates/pretixpresale/fragment_modals.html:118 #: pretix/presale/templates/pretixpresale/fragment_modals.html:137 @@ -34580,7 +34797,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:126 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:163 #: 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 @@ -34789,59 +35006,72 @@ msgid "" "product." msgstr "" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:13 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 #: 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:30 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:58 #, fuzzy #| msgctxt "invoice" #| msgid "Received payments" msgid "Remove payment" msgstr "المدفوعات المستلمة" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:40 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:68 #, fuzzy #| msgid "Pending amount" msgid "Remaining balance" msgstr "مبالغ متأخرة" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:41 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:69 #, fuzzy #| msgid "Please select a payment method." msgid "Please select a payment method below." msgstr "الرجاء اختيار طريقة الدفع." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:54 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82 #, 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:92 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:110 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45 +#, fuzzy, python-format +#| msgid "%(num)s available" +msgid "(%(count)s available)" +msgid_plural "(%(count)s available)" +msgstr[0] "%(num)s هو متاح" +msgstr[1] "%(num)s هو متاح" +msgstr[2] "%(num)s هو متاح" +msgstr[3] "%(num)s هو متاح" +msgstr[4] "%(num)s هو متاح" +msgstr[5] "%(num)s هو متاح" + +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:129 msgid "This sales channel does not provide support for test mode." msgstr "لا توفر قناة المبيعات هذه دعما لوضع الاختبار." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:94 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:131 msgid "If you continue, you might pay an actual order with non-existing money!" msgstr "إذا تابعت ، فقد تدفع طلبا فعليا بمبلغ غير موجود!" -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:102 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:139 msgid "This payment provider does not provide support for test mode." msgstr "لا يوفر مزود الدفع هذا دعما لوضع الاختبار." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:104 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:141 msgid "If you continue, actual money might be transferred." msgstr "إذا قمت بالمتابعة، قد يتم تحويل المبلغ الفعلي." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:115 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:152 msgid "There are no payment providers enabled." msgstr "لم يتم تمكين مزودي الدفع." -#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:117 +#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:154 msgid "" "Please go to the payment settings and activate one or more payment providers." msgstr "يرجى الذهاب إلى إعدادات الدفع وتفعيل واحد أو أكثر من مزودي الدفع." @@ -36318,7 +36548,7 @@ msgstr "" "يرجى الملاحظة: إذا قمت بتغيير طريقة الدفع الخاصة بك ، فسيتغير إجمالي طلبك " "حسب المبلغ المعروض على يمين كل طريقة." -#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:52 +#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:61 msgid "There are no alternative payment providers available for this order." msgstr "لا يوجد مزودو دفع بديلون متاحون لهذا الطلب." @@ -36870,7 +37100,7 @@ msgstr "هل أنت متأكد أنك تريد حذف التواريخ التا #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_addresses.html:11 -#: pretix/presale/views/customer.py:372 +#: pretix/presale/views/customer.py:378 #, fuzzy #| msgid "Address" msgid "Addresses" @@ -36901,6 +37131,42 @@ msgstr "قم بتغيير كلمة المرور" msgid "customer account information" msgstr "تاكيد التسجيل" +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:28 +#, fuzzy, python-format +#| msgid "First scanned: %(date)s" +msgid "Issued on %(date)s" +msgstr "الممسوحة ضوئيا أولا: %(date)s" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:38 +#, fuzzy, python-format +#| msgid "Expired" +msgid "Expired since %(date)s" +msgstr "منتهية الصلاحية" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:46 +#, fuzzy, python-format +#| msgid "Admission: %(datetime)s" +msgid "Valid until %(date)s" +msgstr "القبول: %(datetime)s" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:66 +#, fuzzy +#| msgid "Pending amount" +msgid "Remaining value:" +msgstr "مبالغ متأخرة" + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:76 +#, fuzzy +#| msgid "You do not have permission to clone this event." +msgid "You don’t have any gift cards in your account currently." +msgstr "ليس لديك إذن لاستنساخ هذا الحدث." + +#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:77 +msgid "" +"Currently, only gift cards resulting from refunds show up here, any " +"purchased gift cards show up under the orders tab." +msgstr "" + #: pretix/presale/templates/pretixpresale/organizers/customer_info.html:6 msgid "Account information" msgstr "معلومات الحساب" @@ -37001,7 +37267,7 @@ msgstr "هل أنت متأكد أنك تريد حذف التواريخ التا #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:5 #: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11 -#: pretix/presale/views/customer.py:378 +#: pretix/presale/views/customer.py:384 #, fuzzy #| msgid "Attendee address" msgid "Attendee profiles" @@ -37167,7 +37433,7 @@ msgstr "" "أرسلناه لك لتفعيل حسابك واختيار كلمة مرور." #: pretix/presale/views/customer.py:268 pretix/presale/views/customer.py:271 -#: pretix/presale/views/customer.py:607 pretix/presale/views/customer.py:613 +#: pretix/presale/views/customer.py:622 pretix/presale/views/customer.py:628 msgid "You clicked an invalid link." msgstr "لقد قمت بالنقر فوق رابط غير صالح." @@ -37183,7 +37449,7 @@ msgstr "" "لقد أرسلنا إليك بريدا إلكترونيا يحتوي على مزيد من الإرشادات حول إعادة تعيين " "كلمة المرور الخاصة بك." -#: pretix/presale/views/customer.py:575 +#: pretix/presale/views/customer.py:590 msgid "" "Your changes have been saved. We've sent you an email with a link to update " "your email address. The email address of your account will be changed as " @@ -37193,17 +37459,17 @@ msgstr "" "بريدك الإلكتروني. سيتم تغيير عنوان البريد الإلكتروني الخاص بحسابك بمجرد " "النقر فوق هذا الارتباط." -#: pretix/presale/views/customer.py:624 +#: pretix/presale/views/customer.py:639 msgid "" "Your email address has not been updated since the address is already in use " "for another customer account." msgstr "" -#: pretix/presale/views/customer.py:627 +#: pretix/presale/views/customer.py:642 msgid "Your email address has been updated." msgstr "تم تحديث عنوان بريدك الإلكتروني." -#: pretix/presale/views/customer.py:844 pretix/presale/views/customer.py:855 +#: pretix/presale/views/customer.py:859 pretix/presale/views/customer.py:870 #, python-brace-format msgid "" "We were unable to use your login since the email address {email} is already " @@ -37253,56 +37519,60 @@ msgstr "لا يمكن استخدام بطاقة الهدايا هذه إلا ف msgid "Time machine disabled!" msgstr "هذا الحساب معطل." -#: pretix/presale/views/order.py:366 pretix/presale/views/order.py:431 -#: pretix/presale/views/order.py:498 +#: pretix/presale/views/order.py:369 pretix/presale/views/order.py:434 +#: pretix/presale/views/order.py:501 msgid "The payment for this order cannot be continued." msgstr "لا يمكن متابعة الدفع لهذا الطلب." -#: pretix/presale/views/order.py:371 pretix/presale/views/order.py:440 -#: pretix/presale/views/order.py:507 pretix/presale/views/order.py:549 +#: pretix/presale/views/order.py:374 pretix/presale/views/order.py:443 +#: pretix/presale/views/order.py:510 pretix/presale/views/order.py:552 msgid "The payment is too late to be accepted." msgstr "فات الأوان لقبول الدفع." -#: pretix/presale/views/order.py:544 +#: pretix/presale/views/order.py:547 msgid "The payment method for this order cannot be changed." msgstr "لا يمكن تغيير طريقة الدفع لهذا الطلب." -#: pretix/presale/views/order.py:555 +#: pretix/presale/views/order.py:558 msgid "A payment is currently pending for this order." msgstr "دفعة سداد معلقة حاليا لهذا الطلب." -#: pretix/presale/views/order.py:667 +#: pretix/presale/views/order.py:670 msgid "An invoice has been generated." msgstr "تم إنشاء فاتورة." -#: pretix/presale/views/order.py:843 pretix/presale/views/order.py:915 +#: pretix/presale/views/order.py:751 pretix/presale/views/order.py:831 +msgid "Invoice generation has failed, please reach out to the organizer." +msgstr "" + +#: pretix/presale/views/order.py:866 pretix/presale/views/order.py:938 msgid "You cannot modify this order" msgstr "لا يمكنك تعديل هذا الطلب" -#: pretix/presale/views/order.py:1010 pretix/presale/views/order.py:1015 -#: pretix/presale/views/order.py:1020 +#: pretix/presale/views/order.py:1033 pretix/presale/views/order.py:1038 +#: pretix/presale/views/order.py:1043 msgid "You chose an invalid cancellation fee." msgstr "لقد اخترت رسوم إلغاء غير صالحة." -#: pretix/presale/views/order.py:1036 +#: pretix/presale/views/order.py:1059 msgid "Canceled by customer" msgstr "تم الإلغاء من قبل العميل" -#: pretix/presale/views/order.py:1047 +#: pretix/presale/views/order.py:1070 msgid "The cancellation has been requested." msgstr "تم طلب الإلغاء." -#: pretix/presale/views/order.py:1100 +#: pretix/presale/views/order.py:1123 msgid "Ticket download is not (yet) enabled for this order." msgstr "لم يتم تمكين تنزيل التذاكر (حتى الآن) لهذا الطلب." -#: pretix/presale/views/order.py:1109 +#: pretix/presale/views/order.py:1132 msgid "Please click the link we sent you via email to download your tickets." msgstr "" "الرجاء الضغط على الرابط الذي أرسلناه لك عبر البريد الإلكتروني لتنزيل التذاكر " "الخاصة بك." -#: pretix/presale/views/order.py:1596 +#: pretix/presale/views/order.py:1619 #, python-brace-format msgid "" "The order has been changed. You can now proceed by paying the open amount of " @@ -37310,44 +37580,44 @@ msgid "" msgstr "" "تم تغيير الطلب. يمكنك الآن المضي قدما بدفع المبلغ المفتوح وقدره{amount}." -#: pretix/presale/views/order.py:1608 +#: pretix/presale/views/order.py:1631 #, fuzzy #| msgid "Your search did not match any vouchers." msgid "You did not make any changes." msgstr "بحثك لم تطابق اي القسائم." -#: pretix/presale/views/order.py:1632 +#: pretix/presale/views/order.py:1655 msgid "You may not change your order in a way that reduces the total price." msgstr "" -#: pretix/presale/views/order.py:1634 +#: pretix/presale/views/order.py:1657 msgid "You may only change your order in a way that increases the total price." msgstr "" -#: pretix/presale/views/order.py:1636 +#: pretix/presale/views/order.py:1659 msgid "You may not change your order in a way that changes the total price." msgstr "" -#: pretix/presale/views/order.py:1638 +#: pretix/presale/views/order.py:1661 #, 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:1646 +#: pretix/presale/views/order.py:1669 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:1652 +#: pretix/presale/views/order.py:1675 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:1668 pretix/presale/views/order.py:1699 +#: pretix/presale/views/order.py:1691 pretix/presale/views/order.py:1722 msgid "You cannot change this order." msgstr "لا يمكنك تغيير هذا الطلب." @@ -37457,6 +37727,19 @@ msgstr "الوصول إلى الكتابة" msgid "Kosovo" msgstr "كوسوفو" +#~ msgid "" +#~ "You are receiving this email because you placed an order for the " +#~ "following event:" +#~ msgstr "تتلقى هذا البريد الإلكتروني لأنك قدمت طلبا للفعالية التالية:" + +#~ msgid "Details:" +#~ msgstr "تفاصيل:" + +#, fuzzy +#~| msgid "The quota has been re-opened and will not close again." +#~ msgid "The sync job has been enqueued and will run in the next minutes." +#~ msgstr "وكانت الحصة إعادة فتحها وسوف يتم إغلاق مرة أخرى." + #~ msgid "" #~ "If you click links in this column, you will only find orders that are " #~ "canceled completely, while the numbers also include single canceled " @@ -38519,9 +38802,6 @@ msgstr "كوسوفو" #~ "code here:" #~ msgstr "لبدء المسح تذاكر مع التطبيقات لدينا، أولا إنشاء مدونة التكوين هنا:" -#~ msgid "Create configuration" -#~ msgstr "إنشاء التكوين" - #~ msgid "Create a new configuration" #~ msgstr "إنشاء تكوين جديد" diff --git a/src/pretix/locale/ar/LC_MESSAGES/djangojs.po b/src/pretix/locale/ar/LC_MESSAGES/djangojs.po index d323b4564..e244d0342 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-09-26 11:16+0000\n" +"POT-Creation-Date: 2025-10-29 07:55+0000\n" "PO-Revision-Date: 2021-09-15 11:22+0000\n" "Last-Translator: Mohamed Tawfiq \n" "Language-Team: Arabic \n" "Language-Team: Azerbaijani
{% endif %} {% if code %} diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html index 62a58dd46..3ad5e526e 100644 --- a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html +++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html @@ -1,5 +1,6 @@ {% load i18n %} {% load ibanformat %} +{% load rich_text %} {% if details or code %}

{% blocktrans trimmed %} @@ -17,7 +18,7 @@ {% endif %} - {{ details|linebreaks }} + {{ details | rich_text }} {% if not code %}

{% endif %} {% if code %} diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html index d1788f854..a594b3163 100644 --- a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html +++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html @@ -29,7 +29,7 @@ {% endif %} {% endif %} {% if details %} - {{ details|linebreaks }} + {{ details | rich_text }}
{% endif %} {% if not settings.bank_details_type == "sepa" and not details %} diff --git a/src/pretix/plugins/banktransfer/templatetags/__init__.py b/src/pretix/plugins/banktransfer/templatetags/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/banktransfer/templatetags/__init__.py +++ b/src/pretix/plugins/banktransfer/templatetags/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/banktransfer/templatetags/commadecimal.py b/src/pretix/plugins/banktransfer/templatetags/commadecimal.py index 119231e83..f46a0e197 100644 --- a/src/pretix/plugins/banktransfer/templatetags/commadecimal.py +++ b/src/pretix/plugins/banktransfer/templatetags/commadecimal.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/banktransfer/templatetags/dotdecimal.py b/src/pretix/plugins/banktransfer/templatetags/dotdecimal.py index 3e37ebb42..b550aab27 100644 --- a/src/pretix/plugins/banktransfer/templatetags/dotdecimal.py +++ b/src/pretix/plugins/banktransfer/templatetags/dotdecimal.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/banktransfer/templatetags/ibanformat.py b/src/pretix/plugins/banktransfer/templatetags/ibanformat.py index 4ffe1d7d1..e2f93e9c5 100644 --- a/src/pretix/plugins/banktransfer/templatetags/ibanformat.py +++ b/src/pretix/plugins/banktransfer/templatetags/ibanformat.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/banktransfer/urls.py b/src/pretix/plugins/banktransfer/urls.py index 968d0a9f1..91c2d3dd6 100644 --- a/src/pretix/plugins/banktransfer/urls.py +++ b/src/pretix/plugins/banktransfer/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index e5adeefdb..ed3492cf8 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/checkinlists/__init__.py b/src/pretix/plugins/checkinlists/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/pretix/plugins/checkinlists/__init__.py +++ b/src/pretix/plugins/checkinlists/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/checkinlists/apps.py b/src/pretix/plugins/checkinlists/apps.py index 72f7c38f1..b8d633fe2 100644 --- a/src/pretix/plugins/checkinlists/apps.py +++ b/src/pretix/plugins/checkinlists/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/checkinlists/exporters.py b/src/pretix/plugins/checkinlists/exporters.py index 7f95a79cd..142b60e59 100644 --- a/src/pretix/plugins/checkinlists/exporters.py +++ b/src/pretix/plugins/checkinlists/exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -476,6 +476,7 @@ class CSVCheckinList(CheckInListMixin, ListExporter): category = pgettext_lazy('export_category', 'Check-in') description = gettext_lazy("Download a spreadsheet with all attendees that are included in a check-in list.") featured = True + repeatable_read = False @property def additional_form_fields(self): @@ -673,6 +674,7 @@ class CSVCheckinCodeList(CheckInListMixin, ListExporter): category = pgettext_lazy('export_category', 'Check-in') description = gettext_lazy("Download a spreadsheet with all valid check-in barcodes e.g. for import into a " "different system. Does not included blocked codes or personal data.") + repeatable_read = False @property def additional_form_fields(self): @@ -743,6 +745,7 @@ class CheckinLogList(ListExporter): category = pgettext_lazy('export_category', 'Check-in') description = gettext_lazy("Download a spreadsheet with one line for every scan that happened at your check-in " "stations.") + repeatable_read = False @property def additional_form_fields(self): diff --git a/src/pretix/plugins/checkinlists/signals.py b/src/pretix/plugins/checkinlists/signals.py index 7d00b93d2..b2f4df0af 100644 --- a/src/pretix/plugins/checkinlists/signals.py +++ b/src/pretix/plugins/checkinlists/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/manualpayment/__init__.py b/src/pretix/plugins/manualpayment/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/manualpayment/__init__.py +++ b/src/pretix/plugins/manualpayment/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/manualpayment/apps.py b/src/pretix/plugins/manualpayment/apps.py index bd1f2ad7f..8d1132f68 100644 --- a/src/pretix/plugins/manualpayment/apps.py +++ b/src/pretix/plugins/manualpayment/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/__init__.py b/src/pretix/plugins/paypal/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/pretix/plugins/paypal/__init__.py +++ b/src/pretix/plugins/paypal/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/api.py b/src/pretix/plugins/paypal/api.py index 3479b89c1..3a09c9422 100644 --- a/src/pretix/plugins/paypal/api.py +++ b/src/pretix/plugins/paypal/api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/apps.py b/src/pretix/plugins/paypal/apps.py index 2a07d46a8..0b14e95e7 100644 --- a/src/pretix/plugins/paypal/apps.py +++ b/src/pretix/plugins/paypal/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/models.py b/src/pretix/plugins/paypal/models.py index 6707fd37c..b6ffe7c50 100644 --- a/src/pretix/plugins/paypal/models.py +++ b/src/pretix/plugins/paypal/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index df1437c9b..63cb03501 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/signals.py b/src/pretix/plugins/paypal/signals.py index 572a79c81..2d4dbd7d0 100644 --- a/src/pretix/plugins/paypal/signals.py +++ b/src/pretix/plugins/paypal/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/urls.py b/src/pretix/plugins/paypal/urls.py index 3b8dc501c..c13ca1236 100644 --- a/src/pretix/plugins/paypal/urls.py +++ b/src/pretix/plugins/paypal/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 414b37789..01a37b814 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/__init__.py b/src/pretix/plugins/paypal2/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/paypal2/__init__.py +++ b/src/pretix/plugins/paypal2/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/apps.py b/src/pretix/plugins/paypal2/apps.py index 2fee7bd4a..f442754e5 100644 --- a/src/pretix/plugins/paypal2/apps.py +++ b/src/pretix/plugins/paypal2/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/__init__.py b/src/pretix/plugins/paypal2/client/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/paypal2/client/__init__.py +++ b/src/pretix/plugins/paypal2/client/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/core/__init__.py b/src/pretix/plugins/paypal2/client/core/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/paypal2/client/core/__init__.py +++ b/src/pretix/plugins/paypal2/client/core/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/core/environment.py b/src/pretix/plugins/paypal2/client/core/environment.py index d8740b4c1..01c4af188 100644 --- a/src/pretix/plugins/paypal2/client/core/environment.py +++ b/src/pretix/plugins/paypal2/client/core/environment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/core/paypal_http_client.py b/src/pretix/plugins/paypal2/client/core/paypal_http_client.py index 714ad0954..75a4acd4a 100644 --- a/src/pretix/plugins/paypal2/client/core/paypal_http_client.py +++ b/src/pretix/plugins/paypal2/client/core/paypal_http_client.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/customer/__init__.py b/src/pretix/plugins/paypal2/client/customer/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/paypal2/client/customer/__init__.py +++ b/src/pretix/plugins/paypal2/client/customer/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/customer/partner_referral_create_request.py b/src/pretix/plugins/paypal2/client/customer/partner_referral_create_request.py index b0ca081ba..2f9f8de6f 100644 --- a/src/pretix/plugins/paypal2/client/customer/partner_referral_create_request.py +++ b/src/pretix/plugins/paypal2/client/customer/partner_referral_create_request.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/client/customer/partners_merchantintegrations_get_request.py b/src/pretix/plugins/paypal2/client/customer/partners_merchantintegrations_get_request.py index 68ce135e2..47ca25c49 100644 --- a/src/pretix/plugins/paypal2/client/customer/partners_merchantintegrations_get_request.py +++ b/src/pretix/plugins/paypal2/client/customer/partners_merchantintegrations_get_request.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/payment.py b/src/pretix/plugins/paypal2/payment.py index 1b8c6853e..18a265864 100644 --- a/src/pretix/plugins/paypal2/payment.py +++ b/src/pretix/plugins/paypal2/payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/signals.py b/src/pretix/plugins/paypal2/signals.py index 58894baa2..7965f8e0b 100644 --- a/src/pretix/plugins/paypal2/signals.py +++ b/src/pretix/plugins/paypal2/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/urls.py b/src/pretix/plugins/paypal2/urls.py index 11cb5715a..ed92dd473 100644 --- a/src/pretix/plugins/paypal2/urls.py +++ b/src/pretix/plugins/paypal2/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/paypal2/views.py b/src/pretix/plugins/paypal2/views.py index 9f617ce14..89cf81eaa 100644 --- a/src/pretix/plugins/paypal2/views.py +++ b/src/pretix/plugins/paypal2/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/pretixdroid/__init__.py b/src/pretix/plugins/pretixdroid/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/pretixdroid/__init__.py +++ b/src/pretix/plugins/pretixdroid/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/pretixdroid/apps.py b/src/pretix/plugins/pretixdroid/apps.py index d97868d47..7b2c9a3ae 100644 --- a/src/pretix/plugins/pretixdroid/apps.py +++ b/src/pretix/plugins/pretixdroid/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/reports/__init__.py b/src/pretix/plugins/reports/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/pretix/plugins/reports/__init__.py +++ b/src/pretix/plugins/reports/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/reports/accountingreport.py b/src/pretix/plugins/reports/accountingreport.py index 7d5da2731..0cef64663 100644 --- a/src/pretix/plugins/reports/accountingreport.py +++ b/src/pretix/plugins/reports/accountingreport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/reports/apps.py b/src/pretix/plugins/reports/apps.py index dd9924598..4e39df271 100644 --- a/src/pretix/plugins/reports/apps.py +++ b/src/pretix/plugins/reports/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/reports/exporters.py b/src/pretix/plugins/reports/exporters.py index 13aac28a9..3a0cd9a15 100644 --- a/src/pretix/plugins/reports/exporters.py +++ b/src/pretix/plugins/reports/exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -661,6 +661,7 @@ class OrderTaxListReport(MultiSheetListExporter): verbose_name = gettext_lazy('Tax split list') category = pgettext_lazy('export_category', 'Order data') description = gettext_lazy("Download a spreadsheet with the tax amounts included in each order.") + repeatable_read = False @property def sheets(self): diff --git a/src/pretix/plugins/reports/signals.py b/src/pretix/plugins/reports/signals.py index bc928a84e..a9670d5b7 100644 --- a/src/pretix/plugins/reports/signals.py +++ b/src/pretix/plugins/reports/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/returnurl/__init__.py b/src/pretix/plugins/returnurl/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/returnurl/__init__.py +++ b/src/pretix/plugins/returnurl/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/returnurl/apps.py b/src/pretix/plugins/returnurl/apps.py index f5217c3b6..524d076a9 100644 --- a/src/pretix/plugins/returnurl/apps.py +++ b/src/pretix/plugins/returnurl/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/returnurl/signals.py b/src/pretix/plugins/returnurl/signals.py index 894bed67b..60583003f 100644 --- a/src/pretix/plugins/returnurl/signals.py +++ b/src/pretix/plugins/returnurl/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/returnurl/urls.py b/src/pretix/plugins/returnurl/urls.py index df5f9d176..92536d02d 100644 --- a/src/pretix/plugins/returnurl/urls.py +++ b/src/pretix/plugins/returnurl/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/returnurl/views.py b/src/pretix/plugins/returnurl/views.py index 437a46695..f3fab2490 100644 --- a/src/pretix/plugins/returnurl/views.py +++ b/src/pretix/plugins/returnurl/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/__init__.py b/src/pretix/plugins/sendmail/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/sendmail/__init__.py +++ b/src/pretix/plugins/sendmail/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/api.py b/src/pretix/plugins/sendmail/api.py index 1bb0baec0..1bcc80593 100644 --- a/src/pretix/plugins/sendmail/api.py +++ b/src/pretix/plugins/sendmail/api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/apps.py b/src/pretix/plugins/sendmail/apps.py index 14a5b2fce..7942559cb 100644 --- a/src/pretix/plugins/sendmail/apps.py +++ b/src/pretix/plugins/sendmail/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index fb69e9654..060bd5eea 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/models.py b/src/pretix/plugins/sendmail/models.py index 432e48631..0f5733493 100644 --- a/src/pretix/plugins/sendmail/models.py +++ b/src/pretix/plugins/sendmail/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index 39fa11683..1186f11f4 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/tasks.py b/src/pretix/plugins/sendmail/tasks.py index 41dffdcd2..76808b080 100644 --- a/src/pretix/plugins/sendmail/tasks.py +++ b/src/pretix/plugins/sendmail/tasks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/urls.py b/src/pretix/plugins/sendmail/urls.py index 757c7cb07..d14a687b6 100644 --- a/src/pretix/plugins/sendmail/urls.py +++ b/src/pretix/plugins/sendmail/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py index 5b46cac2c..189761ab4 100644 --- a/src/pretix/plugins/sendmail/views.py +++ b/src/pretix/plugins/sendmail/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/statistics/__init__.py b/src/pretix/plugins/statistics/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/statistics/__init__.py +++ b/src/pretix/plugins/statistics/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/statistics/apps.py b/src/pretix/plugins/statistics/apps.py index 580782e4c..a5e59683a 100644 --- a/src/pretix/plugins/statistics/apps.py +++ b/src/pretix/plugins/statistics/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/statistics/signals.py b/src/pretix/plugins/statistics/signals.py index c78dae5a9..224a916b0 100644 --- a/src/pretix/plugins/statistics/signals.py +++ b/src/pretix/plugins/statistics/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/statistics/urls.py b/src/pretix/plugins/statistics/urls.py index e7a08f3a0..c8ee94b65 100644 --- a/src/pretix/plugins/statistics/urls.py +++ b/src/pretix/plugins/statistics/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/statistics/views.py b/src/pretix/plugins/statistics/views.py index a3438bb15..518120854 100644 --- a/src/pretix/plugins/statistics/views.py +++ b/src/pretix/plugins/statistics/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/__init__.py b/src/pretix/plugins/stripe/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/stripe/__init__.py +++ b/src/pretix/plugins/stripe/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/apps.py b/src/pretix/plugins/stripe/apps.py index de478128f..bb19805e3 100644 --- a/src/pretix/plugins/stripe/apps.py +++ b/src/pretix/plugins/stripe/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/forms.py b/src/pretix/plugins/stripe/forms.py index 60cb26a41..5d79654dd 100644 --- a/src/pretix/plugins/stripe/forms.py +++ b/src/pretix/plugins/stripe/forms.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/management/__init__.py b/src/pretix/plugins/stripe/management/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/stripe/management/__init__.py +++ b/src/pretix/plugins/stripe/management/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/management/commands/__init__.py b/src/pretix/plugins/stripe/management/commands/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/stripe/management/commands/__init__.py +++ b/src/pretix/plugins/stripe/management/commands/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/management/commands/stripe_connect_fill_countries.py b/src/pretix/plugins/stripe/management/commands/stripe_connect_fill_countries.py index 7062e9b1f..b7a1d7168 100644 --- a/src/pretix/plugins/stripe/management/commands/stripe_connect_fill_countries.py +++ b/src/pretix/plugins/stripe/management/commands/stripe_connect_fill_countries.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/models.py b/src/pretix/plugins/stripe/models.py index d63f7aee1..cb6904d41 100644 --- a/src/pretix/plugins/stripe/models.py +++ b/src/pretix/plugins/stripe/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 2bf8ad4a2..325884a9f 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/signals.py b/src/pretix/plugins/stripe/signals.py index 29189b7d2..8202c10e1 100644 --- a/src/pretix/plugins/stripe/signals.py +++ b/src/pretix/plugins/stripe/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/tasks.py b/src/pretix/plugins/stripe/tasks.py index cbf04fd35..c4f09dad5 100644 --- a/src/pretix/plugins/stripe/tasks.py +++ b/src/pretix/plugins/stripe/tasks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/urls.py b/src/pretix/plugins/stripe/urls.py index 7bb62e9c4..51106622e 100644 --- a/src/pretix/plugins/stripe/urls.py +++ b/src/pretix/plugins/stripe/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/utils.py b/src/pretix/plugins/stripe/utils.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/stripe/utils.py +++ b/src/pretix/plugins/stripe/utils.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/stripe/views.py b/src/pretix/plugins/stripe/views.py index 628323dac..adc14965d 100644 --- a/src/pretix/plugins/stripe/views.py +++ b/src/pretix/plugins/stripe/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/__init__.py b/src/pretix/plugins/ticketoutputpdf/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/pretix/plugins/ticketoutputpdf/__init__.py +++ b/src/pretix/plugins/ticketoutputpdf/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/api.py b/src/pretix/plugins/ticketoutputpdf/api.py index b526ccf59..7232c4bcf 100644 --- a/src/pretix/plugins/ticketoutputpdf/api.py +++ b/src/pretix/plugins/ticketoutputpdf/api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/apps.py b/src/pretix/plugins/ticketoutputpdf/apps.py index b307dd9a2..c5552fdf7 100644 --- a/src/pretix/plugins/ticketoutputpdf/apps.py +++ b/src/pretix/plugins/ticketoutputpdf/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index 4d42e866b..cc9171f0c 100644 --- a/src/pretix/plugins/ticketoutputpdf/exporters.py +++ b/src/pretix/plugins/ticketoutputpdf/exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/forms.py b/src/pretix/plugins/ticketoutputpdf/forms.py index 57e8999c9..5a1cf4404 100644 --- a/src/pretix/plugins/ticketoutputpdf/forms.py +++ b/src/pretix/plugins/ticketoutputpdf/forms.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/models.py b/src/pretix/plugins/ticketoutputpdf/models.py index 07f7fb9f3..5b506f343 100644 --- a/src/pretix/plugins/ticketoutputpdf/models.py +++ b/src/pretix/plugins/ticketoutputpdf/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/signals.py b/src/pretix/plugins/ticketoutputpdf/signals.py index bd3464f5f..3bc2dc131 100644 --- a/src/pretix/plugins/ticketoutputpdf/signals.py +++ b/src/pretix/plugins/ticketoutputpdf/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/tasks.py b/src/pretix/plugins/ticketoutputpdf/tasks.py index c28f8e300..6d64a7a71 100644 --- a/src/pretix/plugins/ticketoutputpdf/tasks.py +++ b/src/pretix/plugins/ticketoutputpdf/tasks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 2179cec60..636e5f08f 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -64,6 +64,7 @@ class PdfTicketOutput(BaseTicketOutput): download_button_text = _('PDF') multi_download_button_text = _('Download tickets (PDF)') long_download_button_text = _('Download ticket (PDF)') + override_layout_signal = override_layout def __init__(self, event, override_layout=None, override_background=None, override_channel=None): self.override_layout = override_layout @@ -116,7 +117,7 @@ class PdfTicketOutput(BaseTicketOutput): merger = PdfWriter() with language(order.locale, self.event.settings.region): for op in self.get_tickets_to_print(order): - layout = override_layout.send_chained( + layout = self.override_layout_signal.send_chained( order.event, 'layout', orderposition=op, layout=self.layout_map.get( (op.item_id, self.override_channel or order.sales_channel.identifier), self.layout_map.get( @@ -137,7 +138,7 @@ class PdfTicketOutput(BaseTicketOutput): def generate(self, op): order = op.order - layout = override_layout.send_chained( + layout = self.override_layout_signal.send_chained( order.event, 'layout', orderposition=op, layout=self.layout_map.get( (op.item_id, self.override_channel or order.sales_channel.identifier), self.layout_map.get( diff --git a/src/pretix/plugins/ticketoutputpdf/urls.py b/src/pretix/plugins/ticketoutputpdf/urls.py index 224935374..7759b4196 100644 --- a/src/pretix/plugins/ticketoutputpdf/urls.py +++ b/src/pretix/plugins/ticketoutputpdf/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/ticketoutputpdf/views.py b/src/pretix/plugins/ticketoutputpdf/views.py index bf908fcea..5d47cad30 100644 --- a/src/pretix/plugins/ticketoutputpdf/views.py +++ b/src/pretix/plugins/ticketoutputpdf/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/webcheckin/__init__.py b/src/pretix/plugins/webcheckin/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/plugins/webcheckin/__init__.py +++ b/src/pretix/plugins/webcheckin/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/webcheckin/apps.py b/src/pretix/plugins/webcheckin/apps.py index af85d4703..bc03444d3 100644 --- a/src/pretix/plugins/webcheckin/apps.py +++ b/src/pretix/plugins/webcheckin/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/webcheckin/signals.py b/src/pretix/plugins/webcheckin/signals.py index f60bfa8f6..b88ad5fad 100644 --- a/src/pretix/plugins/webcheckin/signals.py +++ b/src/pretix/plugins/webcheckin/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/webcheckin/urls.py b/src/pretix/plugins/webcheckin/urls.py index 40551d546..5f7800e23 100644 --- a/src/pretix/plugins/webcheckin/urls.py +++ b/src/pretix/plugins/webcheckin/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/plugins/webcheckin/views.py b/src/pretix/plugins/webcheckin/views.py index b5aff4125..c4b42a795 100644 --- a/src/pretix/plugins/webcheckin/views.py +++ b/src/pretix/plugins/webcheckin/views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/__init__.py b/src/pretix/presale/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/presale/__init__.py +++ b/src/pretix/presale/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/apps.py b/src/pretix/presale/apps.py index 144152c50..9c5607091 100644 --- a/src/pretix/presale/apps.py +++ b/src/pretix/presale/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index 29304b0cf..31a130b0f 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/context.py b/src/pretix/presale/context.py index 2bfeac2c5..d6b1ff24b 100644 --- a/src/pretix/presale/context.py +++ b/src/pretix/presale/context.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/cookies.py b/src/pretix/presale/cookies.py index afea6d5de..f1662d37a 100644 --- a/src/pretix/presale/cookies.py +++ b/src/pretix/presale/cookies.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/__init__.py b/src/pretix/presale/forms/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/presale/forms/__init__.py +++ b/src/pretix/presale/forms/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py index e786d1c92..ea6e8ff48 100644 --- a/src/pretix/presale/forms/checkout.py +++ b/src/pretix/presale/forms/checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/customer.py b/src/pretix/presale/forms/customer.py index 264b11b9b..b8c14ac7c 100644 --- a/src/pretix/presale/forms/customer.py +++ b/src/pretix/presale/forms/customer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/order.py b/src/pretix/presale/forms/order.py index 38ae37267..19537b5a6 100644 --- a/src/pretix/presale/forms/order.py +++ b/src/pretix/presale/forms/order.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/organizer.py b/src/pretix/presale/forms/organizer.py index 50bd65e11..a0577c006 100644 --- a/src/pretix/presale/forms/organizer.py +++ b/src/pretix/presale/forms/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/renderers.py b/src/pretix/presale/forms/renderers.py index ae36b29b0..193a503fc 100644 --- a/src/pretix/presale/forms/renderers.py +++ b/src/pretix/presale/forms/renderers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/user.py b/src/pretix/presale/forms/user.py index deb461b96..3b76bd983 100644 --- a/src/pretix/presale/forms/user.py +++ b/src/pretix/presale/forms/user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/forms/waitinglist.py b/src/pretix/presale/forms/waitinglist.py index 030fe9690..740ad3045 100644 --- a/src/pretix/presale/forms/waitinglist.py +++ b/src/pretix/presale/forms/waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/ical.py b/src/pretix/presale/ical.py index f9952cbde..cb5940a41 100644 --- a/src/pretix/presale/ical.py +++ b/src/pretix/presale/ical.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/management/__init__.py b/src/pretix/presale/management/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/presale/management/__init__.py +++ b/src/pretix/presale/management/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/management/commands/__init__.py b/src/pretix/presale/management/commands/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/presale/management/commands/__init__.py +++ b/src/pretix/presale/management/commands/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/management/commands/updateassets.py b/src/pretix/presale/management/commands/updateassets.py index 0aabae8d8..b1743907c 100644 --- a/src/pretix/presale/management/commands/updateassets.py +++ b/src/pretix/presale/management/commands/updateassets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/management/commands/updatestyles.py b/src/pretix/presale/management/commands/updatestyles.py index f6bdf0b59..cb07f8205 100644 --- a/src/pretix/presale/management/commands/updatestyles.py +++ b/src/pretix/presale/management/commands/updatestyles.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/middleware.py b/src/pretix/presale/middleware.py index 8832d4550..05260a648 100644 --- a/src/pretix/presale/middleware.py +++ b/src/pretix/presale/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/signals.py b/src/pretix/presale/signals.py index 267be37dd..077b35d2c 100644 --- a/src/pretix/presale/signals.py +++ b/src/pretix/presale/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/style.py b/src/pretix/presale/style.py index bbde358e7..9945cbf6b 100644 --- a/src/pretix/presale/style.py +++ b/src/pretix/presale/style.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html index a5daa1699..3aac8dc43 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html @@ -9,6 +9,34 @@ {% 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:" %}

@@ -77,6 +105,15 @@ aria-controls="payment_{{ p.provider.identifier }}" data-wallets="{{ p.provider.walletqueries|join:"|" }}" /> {{ p.provider.public_name }} + {% if p.provider.identifier == 'giftcard' and p.provider.customer_gift_cards %} + + {% blocktrans trimmed count count=p.provider.customer_gift_cards|length %} + ({{ count }} available) + {% plural %} + ({{ count }} available) + {% endblocktrans %} + + {% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/event/order_pay_change.html b/src/pretix/presale/templates/pretixpresale/event/order_pay_change.html index c32e568c5..324d697a6 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order_pay_change.html +++ b/src/pretix/presale/templates/pretixpresale/event/order_pay_change.html @@ -40,6 +40,15 @@ {% if selected == p.provider.identifier %}checked="checked"{% endif %} data-wallets="{{ p.provider.walletqueries|join:"|" }}"/> {{ p.provider.public_name }} + {% if p.provider.identifier == 'giftcard' and p.provider.customer_gift_cards %} + + {% blocktrans trimmed count count=p.provider.customer_gift_cards|length %} + ({{ count }} available) + {% plural %} + ({{ count }} available) + {% endblocktrans %} + + {% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html b/src/pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html new file mode 100644 index 000000000..691ffed59 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html @@ -0,0 +1,83 @@ +{% extends "pretixpresale/organizers/customer_base.html" %} +{% load money %} +{% load i18n %} +{% load icon %} +{% load eventurl %} +{% load textbubble %} +{% block title %}{% trans "Gift cards" %}{% endblock %} +{% block inner %} +
+
+

+ {% icon "gift" %} + {% trans "Gift cards" %} ({{ page_obj.paginator.count }}) +

+
+
+ {% if gift_cards %} +
+ {% for gc in gift_cards %} +
+
+

+ {% icon "gift" %} {{ gc }} +

+ {% if gc.issuance %} +

+ {% icon "calendar" %} + {% blocktrans trimmed with date=gc.issuance|date:"SHORT_DATE_FORMAT" %} + Issued on {{ date }} + {% endblocktrans %} +

+ {% endif %} +

+ + {% if gc.expired %} + {% icon "clock-o" %} + {% if gc.expires %} + {% blocktrans trimmed with date=gc.expires|date:"SHORT_DATETIME_FORMAT" %} + Expired since {{ date }} + {% endblocktrans %} + {% else %} + {% trans "Expired" %} + {% endif %} + {% elif gc.expires %} + {% icon "check" %} + {% blocktrans trimmed with date=gc.expires|date:"SHORT_DATETIME_FORMAT" %} + Valid until {{ date }} + {% endblocktrans %} + {% else %} + {% icon "check" %} + {% trans "Valid" %} + {% endif %} + +

+ {% if gc.testmode %} +

+ + {% textbubble "warning" %} + {% trans "TEST MODE" %} + {% endtextbubble %} + +

+ {% endif %} +
+
+ {% blocktrans trimmed with value=gc.value|money:gc.currency %} + Remaining value: + {% endblocktrans %} +

{{ value }}

+
+
+ {% endfor %} +
+ {% else %} +

+ {% trans "You don’t have any gift cards in your account currently." %} + {% trans "Currently, only gift cards resulting from refunds show up here, any purchased gift cards show up under the orders tab." %} +

+ {% endif %} +
+
+ {% include "pretixcontrol/pagination.html" %} +{% endblock %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index ac197af54..2fe4fc398 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -214,6 +214,8 @@ organizer_patterns = [ re_path(r'^account/confirmchange$', pretix.presale.views.customer.ConfirmChangeView.as_view(), name='organizer.customer.change.confirm'), re_path(r'^account/memberships$', pretix.presale.views.customer.MembershipView.as_view(), name='organizer.customer.memberships'), re_path(r'^account/memberships/(?P\d+)/$', pretix.presale.views.customer.MembershipUsageView.as_view(), name='organizer.customer.membership'), + re_path(r'^account/giftcards$', pretix.presale.views.customer.GiftcardView.as_view(), + name='organizer.customer.giftcards'), re_path(r'^account/addresses$', pretix.presale.views.customer.AddressView.as_view(), name='organizer.customer.addresses'), re_path(r'^account/addresses/(?P\d+)/delete$', pretix.presale.views.customer.AddressDeleteView.as_view(), name='organizer.customer.address.delete'), re_path(r'^account/profiles$', pretix.presale.views.customer.ProfileView.as_view(), name='organizer.customer.profiles'), diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 734fa2b21..4b4d64e58 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index b8d6acb69..3ed42cad7 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 362dfef5d..b9cfebd41 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index 2184776bb..f2865e9e5 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/customer.py b/src/pretix/presale/views/customer.py index a2aa3ff07..fa0dd884b 100644 --- a/src/pretix/presale/views/customer.py +++ b/src/pretix/presale/views/customer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -368,6 +368,12 @@ class CustomerAccountBaseMixin(CustomerRequiredMixin): 'active': url_name.startswith('organizer.customer.membership'), 'icon': 'id-badge', }, + { + 'label': _('Gift cards'), + 'url': eventreverse(self.request.organizer, 'presale:organizer.customer.giftcards', kwargs={}), + 'active': url_name.startswith('organizer.customer.giftcard'), + 'icon': 'gift', + }, { 'label': _('Addresses'), 'url': eventreverse(self.request.organizer, 'presale:organizer.customer.addresses', kwargs={}), @@ -461,6 +467,15 @@ class MembershipUsageView(CustomerAccountBaseMixin, ListView): return ctx +class GiftcardView(CustomerAccountBaseMixin, ListView): + template_name = 'pretixpresale/organizers/customer_giftcards.html' + context_object_name = 'gift_cards' + paginate_by = 20 + + def get_queryset(self): + return self.request.customer.customer_gift_cards.all() + + class AddressView(CustomerAccountBaseMixin, ListView): template_name = 'pretixpresale/organizers/customer_addresses.html' context_object_name = 'invoice_addresses' diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index ef7a9ac75..43dec358a 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/locale.py b/src/pretix/presale/views/locale.py index 9cc0df2d7..15dcf7512 100644 --- a/src/pretix/presale/views/locale.py +++ b/src/pretix/presale/views/locale.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/oidc_op.py b/src/pretix/presale/views/oidc_op.py index 2c23360e7..a8178545f 100644 --- a/src/pretix/presale/views/oidc_op.py +++ b/src/pretix/presale/views/oidc_op.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index b78e98ea0..291e4a129 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -36,6 +36,7 @@ import copy import hmac import inspect import json +import logging import mimetypes import os import re @@ -98,6 +99,8 @@ from pretix.presale.views import ( from pretix.presale.views.event import get_grouped_items from pretix.presale.views.robots import NoSearchIndexViewMixin +logger = logging.getLogger(__name__) + class OrderDetailMixin(NoSearchIndexViewMixin): @@ -734,11 +737,18 @@ class OrderInvoiceCreate(EventViewMixin, OrderDetailMixin, View): elif self.order.invoices.exists(): messages.error(self.request, _('An invoice for this order already exists.')) else: - i = generate_invoice(self.order) - self.order.log_action('pretix.event.order.invoice.generated', data={ - 'invoice': i.pk - }) - messages.success(self.request, _('The invoice has been generated.')) + try: + i = generate_invoice(self.order) + self.order.log_action('pretix.event.order.invoice.generated', data={ + 'invoice': i.pk + }) + messages.success(self.request, _('The invoice has been generated.')) + except Exception as e: + logger.exception("Could not generate invoice.") + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) + messages.error(self.request, _('Invoice generation has failed, please reach out to the organizer.')) return redirect(self.get_order_url()) @@ -807,24 +817,37 @@ class OrderModify(EventViewMixin, OrderDetailMixin, OrderQuestionsViewMixin, Tem elif self.order.invoices.exists(): messages.error(self.request, _('An invoice for this order already exists.')) else: - i = generate_invoice(self.order) - self.order.log_action('pretix.event.order.invoice.generated', data={ - 'invoice': i.pk - }) - messages.success(self.request, _('The invoice has been generated.')) + try: + i = generate_invoice(self.order) + self.order.log_action('pretix.event.order.invoice.generated', data={ + 'invoice': i.pk + }) + messages.success(self.request, _('The invoice has been generated.')) + except Exception as e: + logger.exception("Could not generate invoice.") + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) + }) + messages.error(self.request, _('Invoice generation has failed, please reach out to the organizer.')) elif self.request.event.settings.invoice_reissue_after_modify: if self.invoice_form.changed_data: - inv = self.order.invoices.last() - if inv and not inv.canceled and not inv.shredded: - c = generate_cancellation(inv) - if self.order.status != Order.STATUS_CANCELED: - inv = generate_invoice(self.order) - else: - inv = c - self.order.log_action('pretix.event.order.invoice.reissued', data={ - 'invoice': inv.pk + try: + inv = self.order.invoices.last() + if inv and not inv.canceled and not inv.shredded: + c = generate_cancellation(inv) + if self.order.status != Order.STATUS_CANCELED: + inv = generate_invoice(self.order) + else: + inv = c + self.order.log_action('pretix.event.order.invoice.reissued', data={ + 'invoice': inv.pk + }) + messages.success(self.request, _('The invoice has been reissued.')) + except Exception as e: + self.order.log_action("pretix.event.order.invoice.failed", data={ + "exception": str(e) }) - messages.success(self.request, _('The invoice has been reissued.')) + logger.exception("Could not generate invoice.") invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'order': self.order.pk}) CachedTicket.objects.filter(order_position__order=self.order).delete() diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index 519708c8b..d46c2ef6c 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/questions.py b/src/pretix/presale/views/questions.py index 76265434a..fad52d0b6 100644 --- a/src/pretix/presale/views/questions.py +++ b/src/pretix/presale/views/questions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/robots.py b/src/pretix/presale/views/robots.py index 1d0356c64..be88ee953 100644 --- a/src/pretix/presale/views/robots.py +++ b/src/pretix/presale/views/robots.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/theme.py b/src/pretix/presale/views/theme.py index d70515326..045addd93 100644 --- a/src/pretix/presale/views/theme.py +++ b/src/pretix/presale/views/theme.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/user.py b/src/pretix/presale/views/user.py index 926be4786..a95118408 100644 --- a/src/pretix/presale/views/user.py +++ b/src/pretix/presale/views/user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -107,4 +107,10 @@ class UnlockHashView(EventViewMixin, View): hashes = request.session.get('pretix_unlock_hashes', []) hashes.append(kwargs.get('hash')) request.session['pretix_unlock_hashes'] = hashes + + if 'voucher' in request.GET: + return redirect_to_url( + eventreverse(self.request.event, 'presale:event.redeem') + f'?{request.META["QUERY_STRING"]}' + ) + return redirect_to_url(eventreverse(self.request.event, 'presale:event.index')) diff --git a/src/pretix/presale/views/waiting.py b/src/pretix/presale/views/waiting.py index b72888f82..6a8d85e46 100644 --- a/src/pretix/presale/views/waiting.py +++ b/src/pretix/presale/views/waiting.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index c612accf9..87ffa7e68 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/sentry.py b/src/pretix/sentry.py index 56eee6239..9e40e8ce3 100644 --- a/src/pretix/sentry.py +++ b/src/pretix/sentry.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/settings.py b/src/pretix/settings.py index 10123aa9b..7f7845858 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index 5b2e13bae..1cf6b981a 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -8,7 +8,7 @@ "name": "pretix", "version": "0.0.0", "dependencies": { - "@babel/core": "^7.28.3", + "@babel/core": "^7.28.4", "@babel/preset-env": "^7.28.3", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^16.0.1", @@ -18,18 +18,6 @@ "vue-template-compiler": "^2.7.16" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -53,20 +41,20 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "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==", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -115,15 +103,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", @@ -401,23 +380,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1475,16 +1454,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -1492,9 +1471,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -1504,15 +1483,21 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1523,14 +1508,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", @@ -3802,15 +3779,6 @@ } }, "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -3827,20 +3795,20 @@ "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==" }, "@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "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==", "requires": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -3870,17 +3838,6 @@ "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - } } }, "@babel/helper-annotate-as-pure": { @@ -4074,20 +4031,20 @@ } }, "@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "requires": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" } }, "@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "requires": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -4718,35 +4675,44 @@ } }, "@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "requires": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "requires": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -4754,11 +4720,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, "@jridgewell/sourcemap-codec": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index 581ae10c5..1738d134e 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": {}, "dependencies": { - "@babel/core": "^7.28.3", + "@babel/core": "^7.28.4", "@babel/preset-env": "^7.28.3", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^16.0.1", diff --git a/src/pretix/static/pretixbase/js/addressform.js b/src/pretix/static/pretixbase/js/addressform.js index baedc8da7..b1aa04e76 100644 --- a/src/pretix/static/pretixbase/js/addressform.js +++ b/src/pretix/static/pretixbase/js/addressform.js @@ -95,10 +95,6 @@ $(function () { } const update = function (ev) { - if (xhr) { - xhr.abort(); - } - dependents.state.prop("data-selected-value", dependents.state.val()); if (dependents.transmission_type) { dependents.transmission_type.prop("data-selected-value", dependents.transmission_type.val()); @@ -119,17 +115,24 @@ $(function () { url.searchParams.append("transmission_type_required", !dependents.transmission_type.find("option[value='-']").length); } + if (xhr && url in responseCache) { + if (responseCache[url] == xhr) { + // already requested this, but XHR is still running and will resolve promise + // only re-resolve promise for JSON-data in responseCache[url] + return; + } else { + // abort current xhr as it is not the one we want + // aborting deletes responseCache[url] but async + xhr.abort(); + } + } + if (!(url in responseCache)) { - responseCache[url] = new Promise((resolve, reject) => { - xhr = $.ajax({ - dataType: "json", - url: url, - timeout: 3000, - success: resolve, - }).fail(function(){ - reject(); - }); - }) + responseCache[url] = xhr = $.ajax({ + dataType: "json", + url: url, + timeout: 3000, + }); } Promise.resolve(responseCache[url]).then(function (data) { diff --git a/src/pretix/static/pretixbase/js/asynctask.js b/src/pretix/static/pretixbase/js/asynctask.js index a720a3b18..b8924ecd0 100644 --- a/src/pretix/static/pretixbase/js/asynctask.js +++ b/src/pretix/static/pretixbase/js/asynctask.js @@ -330,9 +330,11 @@ var ajaxErrDialog = { $("#ajaxerr .links").html("" + gettext("Close message") + ""); $("body").addClass("ajaxerr has-modal-dialog"); + $("#ajaxerr").prop("hidden", false); }, hide: function () { "use strict"; $("body").removeClass("ajaxerr has-modal-dialog"); + $("#ajaxerr").prop("hidden", true); }, }; diff --git a/src/pretix/static/pretixcontrol/js/ui/checkinrules.js b/src/pretix/static/pretixcontrol/js/ui/checkinrules.js index 4d6ec8920..308331a00 100644 --- a/src/pretix/static/pretixcontrol/js/ui/checkinrules.js +++ b/src/pretix/static/pretixcontrol/js/ui/checkinrules.js @@ -275,6 +275,35 @@ $(function () { _update(); }) _update() + + function check_for_invalid_ids(valid_products, valid_variations, rule) { + if (rule["and"]) { + for(const child of rule["and"]) + check_for_invalid_ids(valid_products, valid_variations, child); + } else if (rule["or"]) { + for(const child of rule["or"]) + check_for_invalid_ids(valid_products, valid_variations, child); + } else if (rule["inList"] && rule["inList"][0]["var"] === "product") { + for(const item of rule["inList"][1]["objectList"]) { + if (!valid_products[item["lookup"][1]]) + item["lookup"][2] = "[" + gettext('Error: Product not found!') + "]"; + else + item["lookup"][2] = valid_products[item["lookup"][1]]; + } + } else if (rule["inList"] && rule["inList"][0]["var"] === "variation") { + for(const item of rule["inList"][1]["objectList"]) { + if (!valid_variations[item["lookup"][1]]) + item["lookup"][2] = "[" + gettext('Error: Variation not found!') + "]"; + else + item["lookup"][2] = valid_variations[item["lookup"][1]]; + } + } + } + check_for_invalid_ids( + Object.fromEntries(this.items.map(p => [p.id, p.name])), + Object.fromEntries(this.items.flatMap(p => p.variations?.map(v => [v.id, p.name + ' – ' + v.name]))), + this.rules + ); } }, watch: { diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index 7ac5db7dc..a1928bbca 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -60,7 +60,7 @@ var i18nToString = function (i18nstring) { $(document).ajaxError(function (event, jqXHR, settings, thrownError) { waitingDialog.hide(); var c = $(jqXHR.responseText).filter('.container'); - if (jqXHR.responseText.indexOf("") !== -1) { + if (jqXHR.responseText && jqXHR.responseText.indexOf("") !== -1) { location.href = '/control/login?next=' + encodeURIComponent(location.pathname + location.search + location.hash) } else if (c.length > 0) { ajaxErrDialog.show(c.first().html()); @@ -348,7 +348,7 @@ var form_handlers = function (el) { dependency.on("change", update); }); - el.find("div[data-display-dependency], textarea[data-display-dependency], input[data-display-dependency], select[data-display-dependency]").each(function () { + el.find("div[data-display-dependency], textarea[data-display-dependency], input[data-display-dependency], select[data-display-dependency], button[data-display-dependency]").each(function () { var dependent = $(this), dependency = findDependency($(this).attr("data-display-dependency"), this), update = function (ev) { @@ -373,10 +373,11 @@ var form_handlers = function (el) { enabled = !enabled; } var $toggling = dependent; - if (dependent.attr("data-disable-dependent")) { + if (dependent.is("[data-disable-dependent]")) { $toggling.attr('disabled', !enabled).trigger("change"); } - if (dependent.get(0).tagName.toLowerCase() !== "div") { + const tagName = dependent.get(0).tagName.toLowerCase() + if (tagName !== "div" && tagName !== "button") { $toggling = dependent.closest('.form-group'); } if (ev) { @@ -485,6 +486,7 @@ var form_handlers = function (el) { theme: "bootstrap", language: $("body").attr("data-select2-locale"), data: JSON.parse($(this.getAttribute('data-select2-src')).text()), + width: '100%', }).val(selectedValue).trigger('change'); }); diff --git a/src/pretix/static/pretixcontrol/js/ui/subevent.js b/src/pretix/static/pretixcontrol/js/ui/subevent.js index 2e3f6793c..81872d7db 100644 --- a/src/pretix/static/pretixcontrol/js/ui/subevent.js +++ b/src/pretix/static/pretixcontrol/js/ui/subevent.js @@ -26,6 +26,7 @@ $(document).on("pretix:bind-forms", function () { } } + // RRule editor function rrule_preview() { var ruleset = new rrule.RRuleSet(); @@ -79,7 +80,7 @@ $(document).on("pretix:bind-forms", function () { var end = $form.find("input[name*=end]:checked").val(); if (end === "count") { - rule_args.count = parseInt($form.find("input[name*=count]").val()) || 1; + rule_args.count = Math.max(parseInt($form.find("input[name*=count]").val()) || 1, 1); } else { var date = $form.find("input[name*=until]").data("DateTimePicker").date(); if (date !== null) { @@ -121,7 +122,14 @@ $(document).on("pretix:bind-forms", function () { }); } } + $("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () { + rrule_preview(); + }); + rrule_preview(); + $("#rrule-formset").on("formAdded", "div", function (event) {rrule_bind_form($(event.target)); }); + + // Timeslot editor $("#subevent_add_many_slots_go").on("click", function () { $("#time-formset [data-formset-form]").each(function () { var tf = $(this).find("[name$=time_from]").val() @@ -167,13 +175,45 @@ $(document).on("pretix:bind-forms", function () { $(this).addClass("hidden"); }); - $("#rrule-formset").on("change keydown keyup keypress dp.change", "input, select", function () { - rrule_preview(); - }); - rrule_preview(); + // Hide config for products that are not for sale + function quota_form_handlers(el) { + // searchable_selection = True + el.find('[id^="id_quotas-"]').on("select2:select select2:unselect", () => { + update_item_visibility(); + }); + // searchable_selection = False + el.find('input[id^="id_quotas-"][id*=itemvars_]').on("change", () => { + update_item_visibility(); + }); + } + function update_item_visibility() { + const itemvars = []; - $("#rrule-formset").on("formAdded", "div", function (event) { rrule_bind_form($(event.target)); }); + // searchable_selection = True + $("select[id^=id_quotas-][id$=-itemvars]").filter((idx, el) => { + return !$(el).closest('[data-formset-form]').is('[data-formset-form-deleted]'); + }).each((_, e) => itemvars.push(...$(e).val())); + // searchable_selection = False + $("input[id^=id_quotas-][id*=itemvars_]:checked").filter((idx, el) => { + return !$(el).closest('[data-formset-form]').is('[data-formset-form-deleted]'); + }).each((_, e) => itemvars.push($(e).val())); + $("div[data-itemvar]").each(function (idx, e) { + const el = $(e); + el.prop("hidden", !itemvars.includes(el.attr("data-itemvar")) && !el.find(".has-error, .alert-danger").length); + }); + } + + $('[data-formset-prefix="quotas"]').on("formDeleted", "div", () => { + update_item_visibility(); + }).on("formAdded", "div", (event) => { + quota_form_handlers($(event.target)); + update_item_visibility(); + }) + quota_form_handlers($("body")); + update_item_visibility(); + + // Auto-set name of check-in list var $namef = $("input[id^=id_name]").first(); var lastValue = $namef.val(); $namef.change(function () { diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index c3bb65050..f6f2d55f9 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -63,10 +63,6 @@ td > .form-group > .checkbox { @include box-shadow(none); } -div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], div[data-nested-formset-body], details[data-formset-form] { - width: 100%; -} - .form-plugins .panel-title { line-height: 34px; } @@ -95,6 +91,12 @@ div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], d } } +.submit-group-sticky { + position: sticky; + bottom: 0; + z-index: 100; +} + .panel .form-group:last-child { margin-bottom: 0; } diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index 0a5c71552..c83eb3409 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -222,6 +222,12 @@ var form_handlers = function (el) { } }); } + + el.find('.use_giftcard').on("click", function () { + var value = $(this).data('value'); + $('#id_payment_giftcard-code').val(value) + }) + }; function setup_basics(el) { diff --git a/src/pretix/static/pretixpresale/js/ui/questions.js b/src/pretix/static/pretixpresale/js/ui/questions.js index ce054945e..d2317b07a 100644 --- a/src/pretix/static/pretixpresale/js/ui/questions.js +++ b/src/pretix/static/pretixpresale/js/ui/questions.js @@ -168,7 +168,7 @@ function questions_init_profiles(el) { for (var p of profiles) { data = {}; for (var key of Object.keys(p)) { - if (key.startsWith("_")) { + if (key.startsWith("_") || p[key] === null) { continue; } matched_field = getMatchingInput(key, p[key], scope); @@ -230,6 +230,7 @@ function questions_init_profiles(el) { // _0 and _1 are e.g. for phone-fields. name-fields have their parts/keys already split var $fields = $('[name$="' + key + '"], [name$="' + key + '_0"], [name$="' + key + '_1"]', scope).not(":disabled"); if ($fields.length) return $fields; + if (!answer) return null; if (answer.identifier) { $label = $('[data-identifier="' + answer.identifier + '"]', scope); diff --git a/src/pretix/static/rrule/rrule.js b/src/pretix/static/rrule/rrule.js index 6419236b6..a7d4696c0 100644 --- a/src/pretix/static/rrule/rrule.js +++ b/src/pretix/static/rrule/rrule.js @@ -1,120 +1,120 @@ +/*! +* rrule.js - Library for working with recurrence rules for calendar dates. +* https://github.com/jakubrotocil/rrule +* Version v2.7.2-14-g9f2061f +* +* Copyright 2010, Jakub Roztocil and Lars Schoning +* Licenced under the BSD licence. +* https://github.com/jakubroztocil/rrule/blob/master/LICENCE +* +*/ (function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["rrule"] = factory(); - else - root["rrule"] = factory(); -})(typeof self !== 'undefined' ? self : this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["rrule"] = factory(); + else + root["rrule"] = factory(); +})(typeof self !== 'undefined' ? self : this, () => { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ /************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return isPresent; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return isNumber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return isWeekdayStr; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return isArray; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return range; }); -/* unused harmony export clone */ -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return repeat; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return toArray; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return padStart; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return split; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return pymod; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return divmod; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return empty; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return notEmpty; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return includes; }); -/* harmony import */ var _weekday__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "ALL_WEEKDAYS": () => (/* reexport */ ALL_WEEKDAYS), + "Frequency": () => (/* reexport */ Frequency), + "RRule": () => (/* reexport */ RRule), + "RRuleSet": () => (/* reexport */ RRuleSet), + "Weekday": () => (/* reexport */ Weekday), + "datetime": () => (/* reexport */ datetime), + "rrulestr": () => (/* reexport */ rrulestr) +}); + +;// CONCATENATED MODULE: ./src/weekday.ts +// ============================================================================= +// Weekday +// ============================================================================= +var ALL_WEEKDAYS = [ + 'MO', + 'TU', + 'WE', + 'TH', + 'FR', + 'SA', + 'SU', +]; +var Weekday = /** @class */ (function () { + function Weekday(weekday, n) { + if (n === 0) + throw new Error("Can't create weekday with n == 0"); + this.weekday = weekday; + this.n = n; + } + Weekday.fromStr = function (str) { + return new Weekday(ALL_WEEKDAYS.indexOf(str)); + }; + // __call__ - Cannot call the object directly, do it through + // e.g. RRule.TH.nth(-1) instead, + Weekday.prototype.nth = function (n) { + return this.n === n ? this : new Weekday(this.weekday, n); + }; + // __eq__ + Weekday.prototype.equals = function (other) { + return this.weekday === other.weekday && this.n === other.n; + }; + // __repr__ + Weekday.prototype.toString = function () { + var s = ALL_WEEKDAYS[this.weekday]; + if (this.n) + s = (this.n > 0 ? '+' : '') + String(this.n) + s; + return s; + }; + Weekday.prototype.getJsWeekday = function () { + return this.weekday === 6 ? 0 : this.weekday + 1; + }; + return Weekday; +}()); + + +;// CONCATENATED MODULE: ./src/helpers.ts // ============================================================================= // Helper functions // ============================================================================= @@ -126,7 +126,7 @@ var isNumber = function (value) { return typeof value === 'number'; }; var isWeekdayStr = function (value) { - return _weekday__WEBPACK_IMPORTED_MODULE_0__[/* ALL_WEEKDAYS */ "a"].indexOf(value) >= 0; + return typeof value === 'string' && ALL_WEEKDAYS.includes(value); }; var isArray = Array.isArray; /** @@ -200,7 +200,7 @@ var split = function (str, sep, num) { * @param {number} a The dividend. * @param {number} b The divisor. * @return {number} a % b where the result is between 0 and b (either 0 <= x < b - * or b < x <= 0, depending on the sign of b). + * or b < x <= 0, depending on the sign of b). */ var pymod = function (a, b) { var r = a % b; @@ -218,6 +218,7 @@ var empty = function (obj) { }; /** * Python-like boolean + * * @return {Boolean} value of an object/primitive, taking into account * the fact that in Python an empty list's/tuple's * boolean value is False, whereas in JS it's true @@ -232,165 +233,169 @@ var includes = function (arr, val) { return notEmpty(arr) && arr.indexOf(val) !== -1; }; +;// CONCATENATED MODULE: ./src/dateutil.ts -/***/ }), -/* 1 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); - -// EXTERNAL MODULE: ./src/helpers.ts -var helpers = __webpack_require__(0); - -// CONCATENATED MODULE: ./src/dateutil.ts - +var datetime = function (y, m, d, h, i, s) { + if (h === void 0) { h = 0; } + if (i === void 0) { i = 0; } + if (s === void 0) { s = 0; } + return new Date(Date.UTC(y, m - 1, d, h, i, s)); +}; /** * General date-related utilities. * Also handles several incompatibilities between JavaScript and Python * */ -var dateutil_dateutil; -(function (dateutil) { - dateutil.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - /** - * Number of milliseconds of one day - */ - dateutil.ONE_DAY = 1000 * 60 * 60 * 24; - /** - * @see: - */ - dateutil.MAXYEAR = 9999; - /** - * Python uses 1-Jan-1 as the base for calculating ordinals but we don't - * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, - * therefore we use 1-Jan-1970 instead - */ - dateutil.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)); - /** - * Python: MO-SU: 0 - 6 - * JS: SU-SAT 0 - 6 - */ - dateutil.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; - /** - * py_date.timetuple()[7] - */ - dateutil.getYearDay = function (date) { - var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); - return (Math.ceil((dateNoTime.valueOf() - - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / - dateutil.ONE_DAY) + 1); - }; - dateutil.isLeapYear = function (year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - }; - dateutil.isDate = function (value) { - return value instanceof Date; - }; - dateutil.isValidDate = function (value) { - return dateutil.isDate(value) && !isNaN(value.getTime()); - }; - /** - * @return {Number} the date's timezone offset in ms - */ - dateutil.tzOffset = function (date) { - return date.getTimezoneOffset() * 60 * 1000; - }; - /** - * @see: - */ - dateutil.daysBetween = function (date1, date2) { - // The number of milliseconds in one day - // Convert both dates to milliseconds - var date1ms = date1.getTime() - dateutil.tzOffset(date1); - var date2ms = date2.getTime() - dateutil.tzOffset(date2); - // Calculate the difference in milliseconds - var differencems = date1ms - date2ms; - // Convert back to days and return - return Math.round(differencems / dateutil.ONE_DAY); - }; - /** - * @see: - */ - dateutil.toOrdinal = function (date) { - return dateutil.daysBetween(date, dateutil.ORDINAL_BASE); - }; - /** - * @see - - */ - dateutil.fromOrdinal = function (ordinal) { - return new Date(dateutil.ORDINAL_BASE.getTime() + ordinal * dateutil.ONE_DAY); - }; - dateutil.getMonthDays = function (date) { - var month = date.getUTCMonth(); - return month === 1 && dateutil.isLeapYear(date.getUTCFullYear()) - ? 29 - : dateutil.MONTH_DAYS[month]; - }; - /** - * @return {Number} python-like weekday - */ - dateutil.getWeekday = function (date) { - return dateutil.PY_WEEKDAYS[date.getUTCDay()]; - }; - /** - * @see: - */ - dateutil.monthRange = function (year, month) { - var date = new Date(Date.UTC(year, month, 1)); - return [dateutil.getWeekday(date), dateutil.getMonthDays(date)]; - }; - /** - * @see: - */ - dateutil.combine = function (date, time) { - time = time || date; - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); - }; - dateutil.clone = function (date) { - var dolly = new Date(date.getTime()); - return dolly; - }; - dateutil.cloneDates = function (dates) { - var clones = []; - for (var i = 0; i < dates.length; i++) { - clones.push(dateutil.clone(dates[i])); - } - return clones; - }; - /** - * Sorts an array of Date or dateutil.Time objects - */ - dateutil.sort = function (dates) { - dates.sort(function (a, b) { - return a.getTime() - b.getTime(); - }); - }; - dateutil.timeToUntilString = function (time, utc) { - if (utc === void 0) { utc = true; } - var date = new Date(time); - return [ - Object(helpers["i" /* padStart */])(date.getUTCFullYear().toString(), 4, '0'), - Object(helpers["i" /* padStart */])(date.getUTCMonth() + 1, 2, '0'), - Object(helpers["i" /* padStart */])(date.getUTCDate(), 2, '0'), - 'T', - Object(helpers["i" /* padStart */])(date.getUTCHours(), 2, '0'), - Object(helpers["i" /* padStart */])(date.getUTCMinutes(), 2, '0'), - Object(helpers["i" /* padStart */])(date.getUTCSeconds(), 2, '0'), - utc ? 'Z' : '' - ].join(''); - }; - dateutil.untilStringToDate = function (until) { - var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; - var bits = re.exec(until); - if (!bits) - throw new Error("Invalid UNTIL value: " + until); - return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); - }; -})(dateutil_dateutil || (dateutil_dateutil = {})); -/* harmony default export */ var src_dateutil = (dateutil_dateutil); +var MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +/** + * Number of milliseconds of one day + */ +var ONE_DAY = 1000 * 60 * 60 * 24; +/** + * @see: + */ +var MAXYEAR = 9999; +/** + * Python uses 1-Jan-1 as the base for calculating ordinals but we don't + * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, + * therefore we use 1-Jan-1970 instead + */ +var ORDINAL_BASE = datetime(1970, 1, 1); +/** + * Python: MO-SU: 0 - 6 + * JS: SU-SAT 0 - 6 + */ +var PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5]; +/** + * py_date.timetuple()[7] + */ +var getYearDay = function (date) { + var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); + return (Math.ceil((dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / + ONE_DAY) + 1); +}; +var isLeapYear = function (year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; +}; +var isDate = function (value) { + return value instanceof Date; +}; +var isValidDate = function (value) { + return isDate(value) && !isNaN(value.getTime()); +}; +/** + * @return {Number} the date's timezone offset in ms + */ +var tzOffset = function (date) { + return date.getTimezoneOffset() * 60 * 1000; +}; +/** + * @see: + */ +var daysBetween = function (date1, date2) { + // The number of milliseconds in one day + // Convert both dates to milliseconds + var date1ms = date1.getTime(); + var date2ms = date2.getTime(); + // Calculate the difference in milliseconds + var differencems = date1ms - date2ms; + // Convert back to days and return + return Math.round(differencems / ONE_DAY); +}; +/** + * @see: + */ +var toOrdinal = function (date) { + return daysBetween(date, ORDINAL_BASE); +}; +/** + * @see - + */ +var fromOrdinal = function (ordinal) { + return new Date(ORDINAL_BASE.getTime() + ordinal * ONE_DAY); +}; +var getMonthDays = function (date) { + var month = date.getUTCMonth(); + return month === 1 && isLeapYear(date.getUTCFullYear()) + ? 29 + : MONTH_DAYS[month]; +}; +/** + * @return {Number} python-like weekday + */ +var getWeekday = function (date) { + return PY_WEEKDAYS[date.getUTCDay()]; +}; +/** + * @see: + */ +var monthRange = function (year, month) { + var date = datetime(year, month + 1, 1); + return [getWeekday(date), getMonthDays(date)]; +}; +/** + * @see: + */ +var combine = function (date, time) { + time = time || date; + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds())); +}; +var dateutil_clone = function (date) { + var dolly = new Date(date.getTime()); + return dolly; +}; +var cloneDates = function (dates) { + var clones = []; + for (var i = 0; i < dates.length; i++) { + clones.push(dateutil_clone(dates[i])); + } + return clones; +}; +/** + * Sorts an array of Date or Time objects + */ +var sort = function (dates) { + dates.sort(function (a, b) { + return a.getTime() - b.getTime(); + }); +}; +var timeToUntilString = function (time, utc) { + if (utc === void 0) { utc = true; } + var date = new Date(time); + return [ + padStart(date.getUTCFullYear().toString(), 4, '0'), + padStart(date.getUTCMonth() + 1, 2, '0'), + padStart(date.getUTCDate(), 2, '0'), + 'T', + padStart(date.getUTCHours(), 2, '0'), + padStart(date.getUTCMinutes(), 2, '0'), + padStart(date.getUTCSeconds(), 2, '0'), + utc ? 'Z' : '', + ].join(''); +}; +var untilStringToDate = function (until) { + var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/; + var bits = re.exec(until); + if (!bits) + throw new Error("Invalid UNTIL value: ".concat(until)); + return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0)); +}; +var dateTZtoISO8601 = function (date, timeZone) { + // date format for sv-SE is almost ISO8601 + var dateStr = date.toLocaleString('sv-SE', { timeZone: timeZone }); + // '2023-02-07 10:41:36' + return dateStr.replace(' ', 'T') + 'Z'; +}; +var dateInTimeZone = function (date, timeZone) { + var localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; + // Date constructor can only reliably parse dates in ISO8601 format + var dateInLocalTZ = new Date(dateTZtoISO8601(date, localTimeZone)); + var dateInTargetTZ = new Date(dateTZtoISO8601(date, timeZone !== null && timeZone !== void 0 ? timeZone : 'UTC')); + var tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime(); + return new Date(date.getTime() - tzOffset); +}; -// CONCATENATED MODULE: ./src/iterresult.ts +;// CONCATENATED MODULE: ./src/iterresult.ts /** * This class helps us to emulate python's generators, sorta. */ @@ -419,9 +424,9 @@ var IterResult = /** @class */ (function () { * Possibly adds a date into the result. * * @param {Date} date - the date isn't necessarly added to the result - * list (if it is too late/too early) + * list (if it is too late/too early) * @return {Boolean} true if it makes sense to continue the iteration - * false if we're done. + * false if we're done. */ IterResult.prototype.accept = function (date) { ++this.total; @@ -457,6 +462,7 @@ var IterResult = /** @class */ (function () { /** * 'before' and 'after' return only one date, whereas 'all' * and 'between' an array. + * * @return {Date,Array?} */ IterResult.prototype.getValue = function () { @@ -476,33 +482,35 @@ var IterResult = /** @class */ (function () { }; return IterResult; }()); -/* harmony default export */ var iterresult = (IterResult); +/* harmony default export */ const iterresult = (IterResult); -// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 +;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js +/****************************************************************************** +Copyright (c) Microsoft Corporation. -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); @@ -547,10 +555,11 @@ function __metadata(metadataKey, metadataValue) { } function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } @@ -583,19 +592,32 @@ function __generator(thisArg, body) { } } -function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +var __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}); + +function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); } function __values(o) { - var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); - return { + if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } function __read(o, n) { @@ -615,19 +637,31 @@ function __read(o, n) { return ar; } +/** @deprecated */ function __spread() { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; } +/** @deprecated */ function __spreadArrays() { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; -}; +} + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} function __await(v) { return this instanceof __await ? (this.v = v, this) : new __await(v); @@ -664,11 +698,17 @@ function __makeTemplateObject(cooked, raw) { return cooked; }; +var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}; + function __importStar(mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); return result; } @@ -676,14 +716,32 @@ function __importDefault(mod) { return (mod && mod.__esModule) ? mod : { default: mod }; } -// CONCATENATED MODULE: ./src/callbackiterresult.ts +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +function __classPrivateFieldIn(state, receiver) { + if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} + +;// CONCATENATED MODULE: ./src/callbackiterresult.ts /** * IterResult subclass that calls a callback function on each add, * and stops iterating when the callback returns false. */ -var callbackiterresult_CallbackIterResult = /** @class */ (function (_super) { +var CallbackIterResult = /** @class */ (function (_super) { __extends(CallbackIterResult, _super); function CallbackIterResult(method, args, iterator) { var _this = _super.call(this, method, args) || this; @@ -699,2134 +757,41 @@ var callbackiterresult_CallbackIterResult = /** @class */ (function (_super) { }; return CallbackIterResult; }(iterresult)); -/* harmony default export */ var callbackiterresult = (callbackiterresult_CallbackIterResult); +/* harmony default export */ const callbackiterresult = (CallbackIterResult); -// CONCATENATED MODULE: ./src/types.ts -var Frequency; -(function (Frequency) { - Frequency[Frequency["YEARLY"] = 0] = "YEARLY"; - Frequency[Frequency["MONTHLY"] = 1] = "MONTHLY"; - Frequency[Frequency["WEEKLY"] = 2] = "WEEKLY"; - Frequency[Frequency["DAILY"] = 3] = "DAILY"; - Frequency[Frequency["HOURLY"] = 4] = "HOURLY"; - Frequency[Frequency["MINUTELY"] = 5] = "MINUTELY"; - Frequency[Frequency["SECONDLY"] = 6] = "SECONDLY"; -})(Frequency || (Frequency = {})); -function freqIsDailyOrGreater(freq) { - return freq < Frequency.HOURLY; -} - -// EXTERNAL MODULE: ./src/weekday.ts -var weekday = __webpack_require__(2); - -// CONCATENATED MODULE: ./src/datetime.ts - - - - -var Time = /** @class */ (function () { - function Time(hour, minute, second, millisecond) { - this.hour = hour; - this.minute = minute; - this.second = second; - this.millisecond = millisecond || 0; - } - Time.prototype.getHours = function () { - return this.hour; - }; - Time.prototype.getMinutes = function () { - return this.minute; - }; - Time.prototype.getSeconds = function () { - return this.second; - }; - Time.prototype.getMilliseconds = function () { - return this.millisecond; - }; - Time.prototype.getTime = function () { - return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + - this.millisecond); - }; - return Time; -}()); - -var datetime_DateTime = /** @class */ (function (_super) { - __extends(DateTime, _super); - function DateTime(year, month, day, hour, minute, second, millisecond) { - var _this = _super.call(this, hour, minute, second, millisecond) || this; - _this.year = year; - _this.month = month; - _this.day = day; - return _this; - } - DateTime.fromDate = function (date) { - return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000); - }; - DateTime.prototype.getWeekday = function () { - return dateutil_dateutil.getWeekday(new Date(this.getTime())); - }; - DateTime.prototype.getTime = function () { - return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); - }; - DateTime.prototype.getDay = function () { - return this.day; - }; - DateTime.prototype.getMonth = function () { - return this.month; - }; - DateTime.prototype.getYear = function () { - return this.year; - }; - DateTime.prototype.addYears = function (years) { - this.year += years; - }; - DateTime.prototype.addMonths = function (months) { - this.month += months; - if (this.month > 12) { - var yearDiv = Math.floor(this.month / 12); - var monthMod = Object(helpers["j" /* pymod */])(this.month, 12); - this.month = monthMod; - this.year += yearDiv; - if (this.month === 0) { - this.month = 12; - --this.year; - } - } - }; - DateTime.prototype.addWeekly = function (days, wkst) { - if (wkst > this.getWeekday()) { - this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; - } - else { - this.day += -(this.getWeekday() - wkst) + days * 7; - } - this.fixDay(); - }; - DateTime.prototype.addDaily = function (days) { - this.day += days; - this.fixDay(); - }; - DateTime.prototype.addHours = function (hours, filtered, byhour) { - if (filtered) { - // Jump to one iteration before next day - this.hour += Math.floor((23 - this.hour) / hours) * hours; - } - while (true) { - this.hour += hours; - var _a = Object(helpers["a" /* divmod */])(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; - if (dayDiv) { - this.hour = hourMod; - this.addDaily(dayDiv); - } - if (Object(helpers["b" /* empty */])(byhour) || Object(helpers["c" /* includes */])(byhour, this.hour)) - break; - } - }; - DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) { - if (filtered) { - // Jump to one iteration before next day - this.minute += - Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; - } - while (true) { - this.minute += minutes; - var _a = Object(helpers["a" /* divmod */])(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; - if (hourDiv) { - this.minute = minuteMod; - this.addHours(hourDiv, false, byhour); - } - if ((Object(helpers["b" /* empty */])(byhour) || Object(helpers["c" /* includes */])(byhour, this.hour)) && - (Object(helpers["b" /* empty */])(byminute) || Object(helpers["c" /* includes */])(byminute, this.minute))) { - break; - } - } - }; - DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) { - if (filtered) { - // Jump to one iteration before next day - this.second += - Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds) * seconds; - } - while (true) { - this.second += seconds; - var _a = Object(helpers["a" /* divmod */])(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; - if (minuteDiv) { - this.second = secondMod; - this.addMinutes(minuteDiv, false, byhour, byminute); - } - if ((Object(helpers["b" /* empty */])(byhour) || Object(helpers["c" /* includes */])(byhour, this.hour)) && - (Object(helpers["b" /* empty */])(byminute) || Object(helpers["c" /* includes */])(byminute, this.minute)) && - (Object(helpers["b" /* empty */])(bysecond) || Object(helpers["c" /* includes */])(bysecond, this.second))) { - break; - } - } - }; - DateTime.prototype.fixDay = function () { - if (this.day <= 28) { - return; - } - var daysinmonth = dateutil_dateutil.monthRange(this.year, this.month - 1)[1]; - if (this.day <= daysinmonth) { - return; - } - while (this.day > daysinmonth) { - this.day -= daysinmonth; - ++this.month; - if (this.month === 13) { - this.month = 1; - ++this.year; - if (this.year > dateutil_dateutil.MAXYEAR) { - return; - } - } - daysinmonth = dateutil_dateutil.monthRange(this.year, this.month - 1)[1]; - } - }; - DateTime.prototype.add = function (options, filtered) { - var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - switch (freq) { - case Frequency.YEARLY: return this.addYears(interval); - case Frequency.MONTHLY: return this.addMonths(interval); - case Frequency.WEEKLY: return this.addWeekly(interval, wkst); - case Frequency.DAILY: return this.addDaily(interval); - case Frequency.HOURLY: return this.addHours(interval, filtered, byhour); - case Frequency.MINUTELY: return this.addMinutes(interval, filtered, byhour, byminute); - case Frequency.SECONDLY: return this.addSeconds(interval, filtered, byhour, byminute, bysecond); - } - }; - return DateTime; -}(Time)); - - -// CONCATENATED MODULE: ./src/parseoptions.ts - - - - - - - -function initializeOptions(options) { - var invalid = []; - var keys = Object.keys(options); - // Shallow copy for options and origOptions and check for invalid - for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { - var key = keys_1[_i]; - if (!Object(helpers["c" /* includes */])(rrule_defaultKeys, key)) - invalid.push(key); - if (src_dateutil.isDate(options[key]) && !src_dateutil.isValidDate(options[key])) - invalid.push(key); - } - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign({}, options); -} -function parseOptions(options) { - var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); - if (Object(helpers["f" /* isPresent */])(opts.byeaster)) - opts.freq = src_rrule.YEARLY; - if (!(Object(helpers["f" /* isPresent */])(opts.freq) && src_rrule.FREQUENCIES[opts.freq])) { - throw new Error("Invalid frequency: " + opts.freq + " " + options.freq); - } - if (!opts.dtstart) - opts.dtstart = new Date(new Date().setMilliseconds(0)); - if (!Object(helpers["f" /* isPresent */])(opts.wkst)) { - opts.wkst = src_rrule.MO.weekday; - } - else if (Object(helpers["e" /* isNumber */])(opts.wkst)) { - // cool, just keep it like that - } - else { - opts.wkst = opts.wkst.weekday; - } - if (Object(helpers["f" /* isPresent */])(opts.bysetpos)) { - if (Object(helpers["e" /* isNumber */])(opts.bysetpos)) - opts.bysetpos = [opts.bysetpos]; - for (var i = 0; i < opts.bysetpos.length; i++) { - var v = opts.bysetpos[i]; - if (v === 0 || !(v >= -366 && v <= 366)) { - throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1'); - } - } - } - if (!(Boolean(opts.byweekno) || - Object(helpers["h" /* notEmpty */])(opts.byweekno) || - Object(helpers["h" /* notEmpty */])(opts.byyearday) || - Boolean(opts.bymonthday) || - Object(helpers["h" /* notEmpty */])(opts.bymonthday) || - Object(helpers["f" /* isPresent */])(opts.byweekday) || - Object(helpers["f" /* isPresent */])(opts.byeaster))) { - switch (opts.freq) { - case src_rrule.YEARLY: - if (!opts.bymonth) - opts.bymonth = opts.dtstart.getUTCMonth() + 1; - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case src_rrule.MONTHLY: - opts.bymonthday = opts.dtstart.getUTCDate(); - break; - case src_rrule.WEEKLY: - opts.byweekday = [src_dateutil.getWeekday(opts.dtstart)]; - break; - } - } - // bymonth - if (Object(helpers["f" /* isPresent */])(opts.bymonth) && !Object(helpers["d" /* isArray */])(opts.bymonth)) { - opts.bymonth = [opts.bymonth]; - } - // byyearday - if (Object(helpers["f" /* isPresent */])(opts.byyearday) && - !Object(helpers["d" /* isArray */])(opts.byyearday) && - Object(helpers["e" /* isNumber */])(opts.byyearday)) { - opts.byyearday = [opts.byyearday]; - } - // bymonthday - if (!Object(helpers["f" /* isPresent */])(opts.bymonthday)) { - opts.bymonthday = []; - opts.bynmonthday = []; - } - else if (Object(helpers["d" /* isArray */])(opts.bymonthday)) { - var bymonthday = []; - var bynmonthday = []; - for (var i = 0; i < opts.bymonthday.length; i++) { - var v = opts.bymonthday[i]; - if (v > 0) { - bymonthday.push(v); - } - else if (v < 0) { - bynmonthday.push(v); - } - } - opts.bymonthday = bymonthday; - opts.bynmonthday = bynmonthday; - } - else if (opts.bymonthday < 0) { - opts.bynmonthday = [opts.bymonthday]; - opts.bymonthday = []; - } - else { - opts.bynmonthday = []; - opts.bymonthday = [opts.bymonthday]; - } - // byweekno - if (Object(helpers["f" /* isPresent */])(opts.byweekno) && !Object(helpers["d" /* isArray */])(opts.byweekno)) { - opts.byweekno = [opts.byweekno]; - } - // byweekday / bynweekday - if (!Object(helpers["f" /* isPresent */])(opts.byweekday)) { - opts.bynweekday = null; - } - else if (Object(helpers["e" /* isNumber */])(opts.byweekday)) { - opts.byweekday = [opts.byweekday]; - opts.bynweekday = null; - } - else if (Object(helpers["g" /* isWeekdayStr */])(opts.byweekday)) { - opts.byweekday = [weekday["b" /* Weekday */].fromStr(opts.byweekday).weekday]; - opts.bynweekday = null; - } - else if (opts.byweekday instanceof weekday["b" /* Weekday */]) { - if (!opts.byweekday.n || opts.freq > src_rrule.MONTHLY) { - opts.byweekday = [opts.byweekday.weekday]; - opts.bynweekday = null; - } - else { - opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; - opts.byweekday = null; - } - } - else { - var byweekday = []; - var bynweekday = []; - for (var i = 0; i < opts.byweekday.length; i++) { - var wday = opts.byweekday[i]; - if (Object(helpers["e" /* isNumber */])(wday)) { - byweekday.push(wday); - continue; - } - else if (Object(helpers["g" /* isWeekdayStr */])(wday)) { - byweekday.push(weekday["b" /* Weekday */].fromStr(wday).weekday); - continue; - } - if (!wday.n || opts.freq > src_rrule.MONTHLY) { - byweekday.push(wday.weekday); - } - else { - bynweekday.push([wday.weekday, wday.n]); - } - } - opts.byweekday = Object(helpers["h" /* notEmpty */])(byweekday) ? byweekday : null; - opts.bynweekday = Object(helpers["h" /* notEmpty */])(bynweekday) ? bynweekday : null; - } - // byhour - if (!Object(helpers["f" /* isPresent */])(opts.byhour)) { - opts.byhour = - opts.freq < src_rrule.HOURLY ? [opts.dtstart.getUTCHours()] : null; - } - else if (Object(helpers["e" /* isNumber */])(opts.byhour)) { - opts.byhour = [opts.byhour]; - } - // byminute - if (!Object(helpers["f" /* isPresent */])(opts.byminute)) { - opts.byminute = - opts.freq < src_rrule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; - } - else if (Object(helpers["e" /* isNumber */])(opts.byminute)) { - opts.byminute = [opts.byminute]; - } - // bysecond - if (!Object(helpers["f" /* isPresent */])(opts.bysecond)) { - opts.bysecond = - opts.freq < src_rrule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; - } - else if (Object(helpers["e" /* isNumber */])(opts.bysecond)) { - opts.bysecond = [opts.bysecond]; - } - return { parsedOptions: opts }; -} -function buildTimeset(opts) { - var millisecondModulo = opts.dtstart.getTime() % 1000; - if (!freqIsDailyOrGreater(opts.freq)) { - return []; - } - var timeset = []; - opts.byhour.forEach(function (hour) { - opts.byminute.forEach(function (minute) { - opts.bysecond.forEach(function (second) { - timeset.push(new Time(hour, minute, second, millisecondModulo)); - }); - }); - }); - return timeset; -} - -// CONCATENATED MODULE: ./src/parsestring.ts - - - - - -function parseString(rfcString) { - var options = rfcString.split('\n').map(parseLine).filter(function (x) { return x !== null; }); - return __assign(__assign({}, options[0]), options[1]); -} -function parseDtstart(line) { - var options = {}; - var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); - if (!dtstartWithZone) { - return options; - } - var _ = dtstartWithZone[0], tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; - if (tzid) { - options.tzid = tzid; - } - options.dtstart = src_dateutil.untilStringToDate(dtstart); - return options; -} -function parseLine(rfcString) { - rfcString = rfcString.replace(/^\s+|\s+$/, ''); - if (!rfcString.length) - return null; - var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); - if (!header) { - return parseRrule(rfcString); - } - var _ = header[0], key = header[1]; - switch (key.toUpperCase()) { - case 'RRULE': - case 'EXRULE': - return parseRrule(rfcString); - case 'DTSTART': - return parseDtstart(rfcString); - default: - throw new Error("Unsupported RFC prop " + key + " in " + rfcString); - } -} -function parseRrule(line) { - var strippedLine = line.replace(/^RRULE:/i, ''); - var options = parseDtstart(strippedLine); - var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';'); - attrs.forEach(function (attr) { - var _a = attr.split('='), key = _a[0], value = _a[1]; - switch (key.toUpperCase()) { - case 'FREQ': - options.freq = Frequency[value.toUpperCase()]; - break; - case 'WKST': - options.wkst = Days[value.toUpperCase()]; - break; - case 'COUNT': - case 'INTERVAL': - case 'BYSETPOS': - case 'BYMONTH': - case 'BYMONTHDAY': - case 'BYYEARDAY': - case 'BYWEEKNO': - case 'BYHOUR': - case 'BYMINUTE': - case 'BYSECOND': - var num = parseNumber(value); - var optionKey = key.toLowerCase(); - // @ts-ignore - options[optionKey] = num; - break; - case 'BYWEEKDAY': - case 'BYDAY': - options.byweekday = parseWeekday(value); - break; - case 'DTSTART': - case 'TZID': - // for backwards compatibility - var dtstart = parseDtstart(line); - options.tzid = dtstart.tzid; - options.dtstart = dtstart.dtstart; - break; - case 'UNTIL': - options.until = src_dateutil.untilStringToDate(value); - break; - case 'BYEASTER': - options.byeaster = Number(value); - break; - default: - throw new Error("Unknown RRULE property '" + key + "'"); - } - }); - return options; -} -function parseNumber(value) { - if (value.indexOf(',') !== -1) { - var values = value.split(','); - return values.map(parseIndividualNumber); - } - return parseIndividualNumber(value); -} -function parseIndividualNumber(value) { - if (/^[+-]?\d+$/.test(value)) { - return Number(value); - } - return value; -} -function parseWeekday(value) { - var days = value.split(','); - return days.map(function (day) { - if (day.length === 2) { - // MO, TU, ... - return Days[day]; // wday instanceof Weekday - } - // -1MO, +3FR, 1SO, 13TU ... - var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); - var n = Number(parts[1]); - var wdaypart = parts[2]; - var wday = Days[wdaypart].weekday; - return new weekday["b" /* Weekday */](wday, n); - }); -} - -// CONCATENATED MODULE: ./src/fake-luxon.ts -var fake_luxon_DateTime = { - fromJSDate: function () { - throw new TypeError(); - } -}; - -// CONCATENATED MODULE: ./src/datewithzone.ts - - -var datewithzone_DateWithZone = /** @class */ (function () { - function DateWithZone(date, tzid) { - this.date = date; - this.tzid = tzid; - } - Object.defineProperty(DateWithZone.prototype, "isUTC", { - get: function () { - return !this.tzid || this.tzid.toUpperCase() === 'UTC'; - }, - enumerable: true, - configurable: true - }); - DateWithZone.prototype.toString = function () { - var datestr = src_dateutil.timeToUntilString(this.date.getTime(), this.isUTC); - if (!this.isUTC) { - return ";TZID=" + this.tzid + ":" + datestr; - } - return ":" + datestr; - }; - DateWithZone.prototype.getTime = function () { - return this.date.getTime(); - }; - DateWithZone.prototype.rezonedDate = function () { - if (this.isUTC) { - return this.date; - } - try { - var datetime = fake_luxon_DateTime - .fromJSDate(this.date); - var rezoned = datetime.setZone(this.tzid, { keepLocalTime: true }); - return rezoned.toJSDate(); - } - catch (e) { - if (e instanceof TypeError) { - console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone'); - } - return this.date; - } - }; - return DateWithZone; -}()); - - -// CONCATENATED MODULE: ./src/optionstostring.ts - - - - - -function optionsToString(options) { - var rrule = []; - var dtstart = ''; - var keys = Object.keys(options); - var defaultKeys = Object.keys(DEFAULT_OPTIONS); - for (var i = 0; i < keys.length; i++) { - if (keys[i] === 'tzid') - continue; - if (!Object(helpers["c" /* includes */])(defaultKeys, keys[i])) - continue; - var key = keys[i].toUpperCase(); - var value = options[keys[i]]; - var outValue = ''; - if (!Object(helpers["f" /* isPresent */])(value) || (Object(helpers["d" /* isArray */])(value) && !value.length)) - continue; - switch (key) { - case 'FREQ': - outValue = src_rrule.FREQUENCIES[options.freq]; - break; - case 'WKST': - if (Object(helpers["e" /* isNumber */])(value)) { - outValue = new weekday["b" /* Weekday */](value).toString(); - } - else { - outValue = value.toString(); - } - break; - case 'BYWEEKDAY': - /* - NOTE: BYWEEKDAY is a special case. - RRule() deconstructs the rule.options.byweekday array - into an array of Weekday arguments. - On the other hand, rule.origOptions is an array of Weekdays. - We need to handle both cases here. - It might be worth change RRule to keep the Weekdays. - - Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC) - - */ - key = 'BYDAY'; - outValue = Object(helpers["n" /* toArray */])(value).map(function (wday) { - if (wday instanceof weekday["b" /* Weekday */]) { - return wday; - } - if (Object(helpers["d" /* isArray */])(wday)) { - return new weekday["b" /* Weekday */](wday[0], wday[1]); - } - return new weekday["b" /* Weekday */](wday); - }).toString(); - break; - case 'DTSTART': - dtstart = buildDtstart(value, options.tzid); - break; - case 'UNTIL': - outValue = src_dateutil.timeToUntilString(value, !options.tzid); - break; - default: - if (Object(helpers["d" /* isArray */])(value)) { - var strValues = []; - for (var j = 0; j < value.length; j++) { - strValues[j] = String(value[j]); - } - outValue = strValues.toString(); - } - else { - outValue = String(value); - } - } - if (outValue) { - rrule.push([key, outValue]); - } - } - var rules = rrule.map(function (_a) { - var key = _a[0], value = _a[1]; - return key + "=" + value.toString(); - }).join(';'); - var ruleString = ''; - if (rules !== '') { - ruleString = "RRULE:" + rules; - } - return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\n'); -} -function buildDtstart(dtstart, tzid) { - if (!dtstart) { - return ''; - } - return 'DTSTART' + new datewithzone_DateWithZone(new Date(dtstart), tzid).toString(); -} - -// CONCATENATED MODULE: ./src/cache.ts - - - -var cache_Cache = /** @class */ (function () { - function Cache() { - this.all = false; - this.before = []; - this.after = []; - this.between = []; - } - /** - * @param {String} what - all/before/after/between - * @param {Array,Date} value - an array of dates, one date, or null - * @param {Object?} args - _iter arguments - */ - Cache.prototype._cacheAdd = function (what, value, args) { - if (value) { - value = - value instanceof Date - ? src_dateutil.clone(value) - : src_dateutil.cloneDates(value); - } - if (what === 'all') { - this.all = value; - } - else { - args._value = value; - this[what].push(args); - } - }; - /** - * @return false - not in the cache - * null - cached, but zero occurrences (before/after) - * Date - cached (before/after) - * [] - cached, but zero occurrences (all/between) - * [Date1, DateN] - cached (all/between) - */ - Cache.prototype._cacheGet = function (what, args) { - var cached = false; - var argsKeys = args ? Object.keys(args) : []; - var findCacheDiff = function (item) { - for (var i = 0; i < argsKeys.length; i++) { - var key = argsKeys[i]; - if (String(args[key]) !== String(item[key])) { - return true; - } - } - return false; - }; - var cachedObject = this[what]; - if (what === 'all') { - cached = this.all; - } - else if (Object(helpers["d" /* isArray */])(cachedObject)) { - // Let's see whether we've already called the - // 'what' method with the same 'args' - for (var i = 0; i < cachedObject.length; i++) { - var item = cachedObject[i]; - if (argsKeys.length && findCacheDiff(item)) - continue; - cached = item._value; - break; - } - } - if (!cached && this.all) { - // Not in the cache, but we already know all the occurrences, - // so we can find the correct dates from the cached ones. - var iterResult = new iterresult(what, args); - for (var i = 0; i < this.all.length; i++) { - if (!iterResult.accept(this.all[i])) - break; - } - cached = iterResult.getValue(); - this._cacheAdd(what, cached, args); - } - return Object(helpers["d" /* isArray */])(cached) - ? src_dateutil.cloneDates(cached) - : cached instanceof Date - ? src_dateutil.clone(cached) - : cached; - }; - return Cache; -}()); - - -// CONCATENATED MODULE: ./src/masks.ts - - -// ============================================================================= -// Date masks -// ============================================================================= -// Every mask is 7 days longer to handle cross-year weekly periods. -var M365MASK = __spreadArrays(Object(helpers["l" /* repeat */])(1, 31), Object(helpers["l" /* repeat */])(2, 28), Object(helpers["l" /* repeat */])(3, 31), Object(helpers["l" /* repeat */])(4, 30), Object(helpers["l" /* repeat */])(5, 31), Object(helpers["l" /* repeat */])(6, 30), Object(helpers["l" /* repeat */])(7, 31), Object(helpers["l" /* repeat */])(8, 31), Object(helpers["l" /* repeat */])(9, 30), Object(helpers["l" /* repeat */])(10, 31), Object(helpers["l" /* repeat */])(11, 30), Object(helpers["l" /* repeat */])(12, 31), Object(helpers["l" /* repeat */])(1, 7)); -var M366MASK = __spreadArrays(Object(helpers["l" /* repeat */])(1, 31), Object(helpers["l" /* repeat */])(2, 29), Object(helpers["l" /* repeat */])(3, 31), Object(helpers["l" /* repeat */])(4, 30), Object(helpers["l" /* repeat */])(5, 31), Object(helpers["l" /* repeat */])(6, 30), Object(helpers["l" /* repeat */])(7, 31), Object(helpers["l" /* repeat */])(8, 31), Object(helpers["l" /* repeat */])(9, 30), Object(helpers["l" /* repeat */])(10, 31), Object(helpers["l" /* repeat */])(11, 30), Object(helpers["l" /* repeat */])(12, 31), Object(helpers["l" /* repeat */])(1, 7)); -var M28 = Object(helpers["k" /* range */])(1, 29); -var M29 = Object(helpers["k" /* range */])(1, 30); -var M30 = Object(helpers["k" /* range */])(1, 31); -var M31 = Object(helpers["k" /* range */])(1, 32); -var MDAY366MASK = __spreadArrays(M31, M29, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7)); -var MDAY365MASK = __spreadArrays(M31, M28, M31, M30, M31, M30, M31, M31, M30, M31, M30, M31, M31.slice(0, 7)); -var NM28 = Object(helpers["k" /* range */])(-28, 0); -var NM29 = Object(helpers["k" /* range */])(-29, 0); -var NM30 = Object(helpers["k" /* range */])(-30, 0); -var NM31 = Object(helpers["k" /* range */])(-31, 0); -var NMDAY366MASK = __spreadArrays(NM31, NM29, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7)); -var NMDAY365MASK = __spreadArrays(NM31, NM28, NM31, NM30, NM31, NM30, NM31, NM31, NM30, NM31, NM30, NM31, NM31.slice(0, 7)); -var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; -var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; -var WDAYMASK = (function () { - var wdaymask = []; - for (var i = 0; i < 55; i++) - wdaymask = wdaymask.concat(Object(helpers["k" /* range */])(7)); - return wdaymask; -})(); - - -// CONCATENATED MODULE: ./src/iterinfo/yearinfo.ts - - - - -function rebuildYear(year, options) { - var firstyday = new Date(Date.UTC(year, 0, 1)); - var yearlen = src_dateutil.isLeapYear(year) ? 366 : 365; - var nextyearlen = src_dateutil.isLeapYear(year + 1) ? 366 : 365; - var yearordinal = src_dateutil.toOrdinal(firstyday); - var yearweekday = src_dateutil.getWeekday(firstyday); - var result = __assign(__assign({ yearlen: yearlen, - nextyearlen: nextyearlen, - yearordinal: yearordinal, - yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null }); - if (Object(helpers["b" /* empty */])(options.byweekno)) { - return result; - } - result.wnomask = Object(helpers["l" /* repeat */])(0, yearlen + 7); - var firstwkst; - var wyearlen; - var no1wkst = firstwkst = Object(helpers["j" /* pymod */])(7 - yearweekday + options.wkst, 7); - if (no1wkst >= 4) { - no1wkst = 0; - // Number of days in the year, plus the days we got - // from last year. - wyearlen = - result.yearlen + Object(helpers["j" /* pymod */])(yearweekday - options.wkst, 7); - } - else { - // Number of days in the year, minus the days we - // left in last year. - wyearlen = yearlen - no1wkst; - } - var div = Math.floor(wyearlen / 7); - var mod = Object(helpers["j" /* pymod */])(wyearlen, 7); - var numweeks = Math.floor(div + mod / 4); - for (var j = 0; j < options.byweekno.length; j++) { - var n = options.byweekno[j]; - if (n < 0) { - n += numweeks + 1; - } - if (!(n > 0 && n <= numweeks)) { - continue; - } - var i = void 0; - if (n > 1) { - i = no1wkst + (n - 1) * 7; - if (no1wkst !== firstwkst) { - i -= 7 - firstwkst; - } - } - else { - i = no1wkst; - } - for (var k = 0; k < 7; k++) { - result.wnomask[i] = 1; - i++; - if (result.wdaymask[i] === options.wkst) - break; - } - } - if (Object(helpers["c" /* includes */])(options.byweekno, 1)) { - // Check week number 1 of next year as well - // orig-TODO : Check -numweeks for next year. - var i = no1wkst + numweeks * 7; - if (no1wkst !== firstwkst) - i -= 7 - firstwkst; - if (i < yearlen) { - // If week starts in next year, we - // don't care about it. - for (var j = 0; j < 7; j++) { - result.wnomask[i] = 1; - i += 1; - if (result.wdaymask[i] === options.wkst) - break; - } - } - } - if (no1wkst) { - // Check last week number of last year as - // well. If no1wkst is 0, either the year - // started on week start, or week number 1 - // got days from last year, so there are no - // days from last year's last week number in - // this year. - var lnumweeks = void 0; - if (!Object(helpers["c" /* includes */])(options.byweekno, -1)) { - var lyearweekday = src_dateutil.getWeekday(new Date(Date.UTC(year - 1, 0, 1))); - var lno1wkst = Object(helpers["j" /* pymod */])(7 - lyearweekday.valueOf() + options.wkst, 7); - var lyearlen = src_dateutil.isLeapYear(year - 1) ? 366 : 365; - var weekst = void 0; - if (lno1wkst >= 4) { - lno1wkst = 0; - weekst = lyearlen + Object(helpers["j" /* pymod */])(lyearweekday - options.wkst, 7); - } - else { - weekst = yearlen - no1wkst; - } - lnumweeks = Math.floor(52 + Object(helpers["j" /* pymod */])(weekst, 7) / 4); - } - else { - lnumweeks = -1; - } - if (Object(helpers["c" /* includes */])(options.byweekno, lnumweeks)) { - for (var i = 0; i < no1wkst; i++) - result.wnomask[i] = 1; - } - } - return result; -} -function baseYearMasks(year) { - var yearlen = src_dateutil.isLeapYear(year) ? 366 : 365; - var firstyday = new Date(Date.UTC(year, 0, 1)); - var wday = src_dateutil.getWeekday(firstyday); - if (yearlen === 365) { - return { - mmask: M365MASK, - mdaymask: MDAY365MASK, - nmdaymask: NMDAY365MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M365RANGE - }; - } - return { - mmask: M366MASK, - mdaymask: MDAY366MASK, - nmdaymask: NMDAY366MASK, - wdaymask: WDAYMASK.slice(wday), - mrange: M366RANGE - }; -} - -// CONCATENATED MODULE: ./src/iterinfo/monthinfo.ts - - -function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { - var result = { - lastyear: year, - lastmonth: month, - nwdaymask: [] - }; - var ranges = []; - if (options.freq === src_rrule.YEARLY) { - if (Object(helpers["b" /* empty */])(options.bymonth)) { - ranges = [[0, yearlen]]; - } - else { - for (var j = 0; j < options.bymonth.length; j++) { - month = options.bymonth[j]; - ranges.push(mrange.slice(month - 1, month + 1)); - } - } - } - else if (options.freq === src_rrule.MONTHLY) { - ranges = [mrange.slice(month - 1, month + 1)]; - } - if (Object(helpers["b" /* empty */])(ranges)) { - return result; - } - // Weekly frequency won't get here, so we may not - // care about cross-year weekly periods. - result.nwdaymask = Object(helpers["l" /* repeat */])(0, yearlen); - for (var j = 0; j < ranges.length; j++) { - var rang = ranges[j]; - var first = rang[0]; - var last = rang[1] - 1; - for (var k = 0; k < options.bynweekday.length; k++) { - var i = void 0; - var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; - if (n < 0) { - i = last + (n + 1) * 7; - i -= Object(helpers["j" /* pymod */])(wdaymask[i] - wday, 7); - } - else { - i = first + (n - 1) * 7; - i += Object(helpers["j" /* pymod */])(7 - wdaymask[i] + wday, 7); - } - if (first <= i && i <= last) - result.nwdaymask[i] = 1; - } - } - return result; -} - -// CONCATENATED MODULE: ./src/iterinfo/easter.ts -function easter(y, offset) { - if (offset === void 0) { offset = 0; } - var a = y % 19; - var b = Math.floor(y / 100); - var c = y % 100; - var d = Math.floor(b / 4); - var e = b % 4; - var f = Math.floor((b + 8) / 25); - var g = Math.floor((b - f + 1) / 3); - var h = Math.floor(19 * a + b - d - g + 15) % 30; - var i = Math.floor(c / 4); - var k = c % 4; - var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; - var m = Math.floor((a + 11 * h + 22 * l) / 451); - var month = Math.floor((h + l - 7 * m + 114) / 31); - var day = ((h + l - 7 * m + 114) % 31) + 1; - var date = Date.UTC(y, month - 1, day + offset); - var yearStart = Date.UTC(y, 0, 1); - return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))]; -} - -// CONCATENATED MODULE: ./src/iterinfo/index.ts - - - - - - - -// ============================================================================= -// Iterinfo -// ============================================================================= -var iterinfo_Iterinfo = /** @class */ (function () { - function Iterinfo(options) { - this.options = options; - } - Iterinfo.prototype.rebuild = function (year, month) { - var options = this.options; - if (year !== this.lastyear) { - this.yearinfo = rebuildYear(year, options); - } - if (Object(helpers["h" /* notEmpty */])(options.bynweekday) && - (month !== this.lastmonth || year !== this.lastyear)) { - var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; - this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); - } - if (Object(helpers["f" /* isPresent */])(options.byeaster)) { - this.eastermask = easter(year, options.byeaster); - } - }; - Object.defineProperty(Iterinfo.prototype, "lastyear", { - get: function () { - return this.monthinfo ? this.monthinfo.lastyear : null; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "lastmonth", { - get: function () { - return this.monthinfo ? this.monthinfo.lastmonth : null; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "yearlen", { - get: function () { - return this.yearinfo.yearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "yearordinal", { - get: function () { - return this.yearinfo.yearordinal; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mrange", { - get: function () { - return this.yearinfo.mrange; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wdaymask", { - get: function () { - return this.yearinfo.wdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mmask", { - get: function () { - return this.yearinfo.mmask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "wnomask", { - get: function () { - return this.yearinfo.wnomask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nwdaymask", { - get: function () { - return this.monthinfo ? this.monthinfo.nwdaymask : []; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nextyearlen", { - get: function () { - return this.yearinfo.nextyearlen; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "mdaymask", { - get: function () { - return this.yearinfo.mdaymask; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Iterinfo.prototype, "nmdaymask", { - get: function () { - return this.yearinfo.nmdaymask; - }, - enumerable: true, - configurable: true - }); - Iterinfo.prototype.ydayset = function () { - return [Object(helpers["k" /* range */])(this.yearlen), 0, this.yearlen]; - }; - Iterinfo.prototype.mdayset = function (_, month, __) { - var start = this.mrange[month - 1]; - var end = this.mrange[month]; - var set = Object(helpers["l" /* repeat */])(null, this.yearlen); - for (var i = start; i < end; i++) - set[i] = i; - return [set, start, end]; - }; - Iterinfo.prototype.wdayset = function (year, month, day) { - // We need to handle cross-year weeks here. - var set = Object(helpers["l" /* repeat */])(null, this.yearlen + 7); - var i = src_dateutil.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - var start = i; - for (var j = 0; j < 7; j++) { - set[i] = i; - ++i; - if (this.wdaymask[i] === this.options.wkst) - break; - } - return [set, start, i]; - }; - Iterinfo.prototype.ddayset = function (year, month, day) { - var set = Object(helpers["l" /* repeat */])(null, this.yearlen); - var i = src_dateutil.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal; - set[i] = i; - return [set, i, i + 1]; - }; - Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) { - var _this = this; - var set = []; - this.options.byminute.forEach(function (minute) { - set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); - }); - src_dateutil.sort(set); - return set; - }; - Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) { - var set = this.options.bysecond.map(function (second) { - return new Time(hour, minute, second, millisecond); - }); - src_dateutil.sort(set); - return set; - }; - Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) { - return [new Time(hour, minute, second, millisecond)]; - }; - Iterinfo.prototype.getdayset = function (freq) { - switch (freq) { - case Frequency.YEARLY: return this.ydayset.bind(this); - case Frequency.MONTHLY: return this.mdayset.bind(this); - case Frequency.WEEKLY: return this.wdayset.bind(this); - case Frequency.DAILY: return this.ddayset.bind(this); - default: return this.ddayset.bind(this); - } - }; - Iterinfo.prototype.gettimeset = function (freq) { - switch (freq) { - case Frequency.HOURLY: return this.htimeset.bind(this); - case Frequency.MINUTELY: return this.mtimeset.bind(this); - case Frequency.SECONDLY: return this.stimeset.bind(this); - } - }; - return Iterinfo; -}()); -/* harmony default export */ var iterinfo = (iterinfo_Iterinfo); - -// CONCATENATED MODULE: ./src/iter/poslist.ts - - -function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { - var poslist = []; - for (var j = 0; j < bysetpos.length; j++) { - var daypos = void 0; - var timepos = void 0; - var pos = bysetpos[j]; - if (pos < 0) { - daypos = Math.floor(pos / timeset.length); - timepos = Object(helpers["j" /* pymod */])(pos, timeset.length); - } - else { - daypos = Math.floor((pos - 1) / timeset.length); - timepos = Object(helpers["j" /* pymod */])(pos - 1, timeset.length); - } - var tmp = []; - for (var k = start; k < end; k++) { - var val = dayset[k]; - if (!Object(helpers["f" /* isPresent */])(val)) - continue; - tmp.push(val); - } - var i = void 0; - if (daypos < 0) { - i = tmp.slice(daypos)[0]; - } - else { - i = tmp[daypos]; - } - var time = timeset[timepos]; - var date = src_dateutil.fromOrdinal(ii.yearordinal + i); - var res = src_dateutil.combine(date, time); - // XXX: can this ever be in the array? - // - compare the actual date instead? - if (!Object(helpers["c" /* includes */])(poslist, res)) - poslist.push(res); - } - src_dateutil.sort(poslist); - return poslist; -} - -// CONCATENATED MODULE: ./src/iter/index.ts - - - - - - - - - -function iter(iterResult, options) { - var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; - var count = options.count; - if (count <= 0 || interval <= 0) { - return emitResult(iterResult); - } - var counterDate = datetime_DateTime.fromDate(dtstart); - var ii = new iterinfo(options); - ii.rebuild(counterDate.year, counterDate.month); - var timeset = makeTimeset(ii, counterDate, options); - while (true) { - var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; - var filtered = removeFilteredDays(dayset, start, end, ii, options); - if (Object(helpers["h" /* notEmpty */])(bysetpos)) { - var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); - for (var j = 0; j < poslist.length; j++) { - var res = poslist[j]; - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - else { - for (var j = start; j < end; j++) { - var currentDay = dayset[j]; - if (!Object(helpers["f" /* isPresent */])(currentDay)) { - continue; - } - var date = src_dateutil.fromOrdinal(ii.yearordinal + currentDay); - for (var k = 0; k < timeset.length; k++) { - var time = timeset[k]; - var res = src_dateutil.combine(date, time); - if (until && res > until) { - return emitResult(iterResult); - } - if (res >= dtstart) { - var rezonedDate = rezoneIfNeeded(res, options); - if (!iterResult.accept(rezonedDate)) { - return emitResult(iterResult); - } - if (count) { - --count; - if (!count) { - return emitResult(iterResult); - } - } - } - } - } - } - if (options.interval === 0) { - return emitResult(iterResult); - } - // Handle frequency and interval - counterDate.add(options, filtered); - if (counterDate.year > src_dateutil.MAXYEAR) { - return emitResult(iterResult); - } - if (!freqIsDailyOrGreater(freq)) { - timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); - } - ii.rebuild(counterDate.year, counterDate.month); - } -} -function isFiltered(ii, currentDay, options) { - var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; - return ((Object(helpers["h" /* notEmpty */])(bymonth) && !Object(helpers["c" /* includes */])(bymonth, ii.mmask[currentDay])) || - (Object(helpers["h" /* notEmpty */])(byweekno) && !ii.wnomask[currentDay]) || - (Object(helpers["h" /* notEmpty */])(byweekday) && !Object(helpers["c" /* includes */])(byweekday, ii.wdaymask[currentDay])) || - (Object(helpers["h" /* notEmpty */])(ii.nwdaymask) && !ii.nwdaymask[currentDay]) || - (byeaster !== null && !Object(helpers["c" /* includes */])(ii.eastermask, currentDay)) || - ((Object(helpers["h" /* notEmpty */])(bymonthday) || Object(helpers["h" /* notEmpty */])(bynmonthday)) && - !Object(helpers["c" /* includes */])(bymonthday, ii.mdaymask[currentDay]) && - !Object(helpers["c" /* includes */])(bynmonthday, ii.nmdaymask[currentDay])) || - (Object(helpers["h" /* notEmpty */])(byyearday) && - ((currentDay < ii.yearlen && - !Object(helpers["c" /* includes */])(byyearday, currentDay + 1) && - !Object(helpers["c" /* includes */])(byyearday, -ii.yearlen + currentDay)) || - (currentDay >= ii.yearlen && - !Object(helpers["c" /* includes */])(byyearday, currentDay + 1 - ii.yearlen) && - !Object(helpers["c" /* includes */])(byyearday, -ii.nextyearlen + currentDay - ii.yearlen))))); -} -function rezoneIfNeeded(date, options) { - return new datewithzone_DateWithZone(date, options.tzid).rezonedDate(); -} -function emitResult(iterResult) { - return iterResult.getValue(); -} -function removeFilteredDays(dayset, start, end, ii, options) { - var filtered = false; - for (var dayCounter = start; dayCounter < end; dayCounter++) { - var currentDay = dayset[dayCounter]; - filtered = isFiltered(ii, currentDay, options); - if (filtered) - dayset[currentDay] = null; - } - return filtered; -} -function makeTimeset(ii, counterDate, options) { - var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; - if (freqIsDailyOrGreater(freq)) { - return buildTimeset(options); - } - if ((freq >= src_rrule.HOURLY && - Object(helpers["h" /* notEmpty */])(byhour) && - !Object(helpers["c" /* includes */])(byhour, counterDate.hour)) || - (freq >= src_rrule.MINUTELY && - Object(helpers["h" /* notEmpty */])(byminute) && - !Object(helpers["c" /* includes */])(byminute, counterDate.minute)) || - (freq >= src_rrule.SECONDLY && - Object(helpers["h" /* notEmpty */])(bysecond) && - !Object(helpers["c" /* includes */])(bysecond, counterDate.second))) { - return []; - } - return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); -} - -// CONCATENATED MODULE: ./src/rrule.ts - - - - - - - - - - -var getnlp = function () { - // Lazy, runtime import to avoid circular refs. - if (!getnlp._nlp) { - getnlp._nlp = __webpack_require__(3); - } - return getnlp._nlp; -}; -// ============================================================================= -// RRule -// ============================================================================= -var Days = { - MO: new weekday["b" /* Weekday */](0), - TU: new weekday["b" /* Weekday */](1), - WE: new weekday["b" /* Weekday */](2), - TH: new weekday["b" /* Weekday */](3), - FR: new weekday["b" /* Weekday */](4), - SA: new weekday["b" /* Weekday */](5), - SU: new weekday["b" /* Weekday */](6) -}; -var DEFAULT_OPTIONS = { - freq: Frequency.YEARLY, - dtstart: null, - interval: 1, - wkst: Days.MO, - count: null, - until: null, - tzid: null, - bysetpos: null, - bymonth: null, - bymonthday: null, - bynmonthday: null, - byyearday: null, - byweekno: null, - byweekday: null, - bynweekday: null, - byhour: null, - byminute: null, - bysecond: null, - byeaster: null -}; -var rrule_defaultKeys = Object.keys(DEFAULT_OPTIONS); -/** - * - * @param {Options?} options - see - * The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... - * @constructor - */ -var rrule_RRule = /** @class */ (function () { - function RRule(options, noCache) { - if (options === void 0) { options = {}; } - if (noCache === void 0) { noCache = false; } - // RFC string - this._cache = noCache ? null : new cache_Cache(); - // used by toString() - this.origOptions = initializeOptions(options); - var parsedOptions = parseOptions(options).parsedOptions; - this.options = parsedOptions; - } - RRule.parseText = function (text, language) { - return getnlp().parseText(text, language); - }; - RRule.fromText = function (text, language) { - return getnlp().fromText(text, language); - }; - RRule.fromString = function (str) { - return new RRule(RRule.parseString(str) || undefined); - }; - RRule.prototype._iter = function (iterResult) { - return iter(iterResult, this.options); - }; - RRule.prototype._cacheGet = function (what, args) { - if (!this._cache) - return false; - return this._cache._cacheGet(what, args); - }; - RRule.prototype._cacheAdd = function (what, value, args) { - if (!this._cache) - return; - return this._cache._cacheAdd(what, value, args); - }; - /** - * @param {Function} iterator - optional function that will be called - * on each date that is added. It can return false - * to stop the iteration. - * @return Array containing all recurrences. - */ - RRule.prototype.all = function (iterator) { - if (iterator) { - return this._iter(new callbackiterresult('all', {}, iterator)); - } - var result = this._cacheGet('all'); - if (result === false) { - result = this._iter(new iterresult('all', {})); - this._cacheAdd('all', result); - } - return result; - }; - /** - * Returns all the occurrences of the rrule between after and before. - * The inc keyword defines what happens if after and/or before are - * themselves occurrences. With inc == True, they will be included in the - * list, if they are found in the recurrence set. - * @return Array - */ - RRule.prototype.between = function (after, before, inc, iterator) { - if (inc === void 0) { inc = false; } - if (!src_dateutil.isValidDate(after) || !src_dateutil.isValidDate(before)) - throw new Error('Invalid date passed in to RRule.between'); - var args = { - before: before, - after: after, - inc: inc - }; - if (iterator) { - return this._iter(new callbackiterresult('between', args, iterator)); - } - var result = this._cacheGet('between', args); - if (result === false) { - result = this._iter(new iterresult('between', args)); - this._cacheAdd('between', result, args); - } - return result; - }; - /** - * Returns the last recurrence before the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.before = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!src_dateutil.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.before'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('before', args); - if (result === false) { - result = this._iter(new iterresult('before', args)); - this._cacheAdd('before', result, args); - } - return result; - }; - /** - * Returns the first recurrence after the given datetime instance. - * The inc keyword defines what happens if dt is an occurrence. - * With inc == True, if dt itself is an occurrence, it will be returned. - * @return Date or null - */ - RRule.prototype.after = function (dt, inc) { - if (inc === void 0) { inc = false; } - if (!src_dateutil.isValidDate(dt)) - throw new Error('Invalid date passed in to RRule.after'); - var args = { dt: dt, inc: inc }; - var result = this._cacheGet('after', args); - if (result === false) { - result = this._iter(new iterresult('after', args)); - this._cacheAdd('after', result, args); - } - return result; - }; - /** - * Returns the number of recurrences in this set. It will have go trough - * the whole recurrence, if this hasn't been done before. - */ - RRule.prototype.count = function () { - return this.all().length; - }; - /** - * Converts the rrule into its string representation - * @see - * @return String - */ - RRule.prototype.toString = function () { - return optionsToString(this.origOptions); - }; - /** - * Will convert all rules described in nlp:ToText - * to text. - */ - RRule.prototype.toText = function (gettext, language, dateFormatter) { - return getnlp().toText(this, gettext, language, dateFormatter); - }; - RRule.prototype.isFullyConvertibleToText = function () { - return getnlp().isFullyConvertible(this); - }; - /** - * @return a RRule instance with the same freq and options - * as this one (cache is not cloned) - */ - RRule.prototype.clone = function () { - return new RRule(this.origOptions); - }; - // RRule class 'constants' - RRule.FREQUENCIES = [ - 'YEARLY', - 'MONTHLY', - 'WEEKLY', - 'DAILY', - 'HOURLY', - 'MINUTELY', - 'SECONDLY' - ]; - RRule.YEARLY = Frequency.YEARLY; - RRule.MONTHLY = Frequency.MONTHLY; - RRule.WEEKLY = Frequency.WEEKLY; - RRule.DAILY = Frequency.DAILY; - RRule.HOURLY = Frequency.HOURLY; - RRule.MINUTELY = Frequency.MINUTELY; - RRule.SECONDLY = Frequency.SECONDLY; - RRule.MO = Days.MO; - RRule.TU = Days.TU; - RRule.WE = Days.WE; - RRule.TH = Days.TH; - RRule.FR = Days.FR; - RRule.SA = Days.SA; - RRule.SU = Days.SU; - RRule.parseString = parseString; - RRule.optionsToString = optionsToString; - return RRule; -}()); -/* harmony default export */ var src_rrule = (rrule_RRule); - -// CONCATENATED MODULE: ./src/iterset.ts - - - -function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { - var _exdateHash = {}; - var _accept = iterResult.accept; - function evalExdate(after, before) { - _exrule.forEach(function (rrule) { - rrule.between(after, before, true).forEach(function (date) { - _exdateHash[Number(date)] = true; - }); - }); - } - _exdate.forEach(function (date) { - var zonedDate = new datewithzone_DateWithZone(date, tzid).rezonedDate(); - _exdateHash[Number(zonedDate)] = true; - }); - iterResult.accept = function (date) { - var dt = Number(date); - if (isNaN(dt)) - return _accept.call(this, date); - if (!_exdateHash[dt]) { - evalExdate(new Date(dt - 1), new Date(dt + 1)); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - } - return true; - }; - if (iterResult.method === 'between') { - evalExdate(iterResult.args.after, iterResult.args.before); - iterResult.accept = function (date) { - var dt = Number(date); - if (!_exdateHash[dt]) { - _exdateHash[dt] = true; - return _accept.call(this, date); - } - return true; - }; - } - for (var i = 0; i < _rdate.length; i++) { - var zonedDate = new datewithzone_DateWithZone(_rdate[i], tzid).rezonedDate(); - if (!iterResult.accept(new Date(zonedDate.getTime()))) - break; - } - _rrule.forEach(function (rrule) { - iter(iterResult, rrule.options); - }); - var res = iterResult._result; - src_dateutil.sort(res); - switch (iterResult.method) { - case 'all': - case 'between': - return res; - case 'before': - return ((res.length && res[res.length - 1]) || null); - case 'after': - default: - return ((res.length && res[0]) || null); - } -} - -// CONCATENATED MODULE: ./src/rrulestr.ts - - - - - - -/** - * RRuleStr - * To parse a set of rrule strings - */ -var rrulestr_DEFAULT_OPTIONS = { - dtstart: null, - cache: false, - unfold: false, - forceset: false, - compatible: false, - tzid: null -}; -function parseInput(s, options) { - var rrulevals = []; - var rdatevals = []; - var exrulevals = []; - var exdatevals = []; - var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid; - var lines = splitIntoLines(s, options.unfold); - lines.forEach(function (line) { - if (!line) - return; - var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value; - switch (name.toUpperCase()) { - case 'RRULE': - if (parms.length) { - throw new Error("unsupported RRULE parm: " + parms.join(',')); - } - rrulevals.push(parseString(line)); - break; - case 'RDATE': - var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line), _ = _b[0], rdateTzid = _b[1]; - if (rdateTzid && !tzid) { - tzid = rdateTzid; - } - rdatevals = rdatevals.concat(parseRDate(value, parms)); - break; - case 'EXRULE': - if (parms.length) { - throw new Error("unsupported EXRULE parm: " + parms.join(',')); - } - exrulevals.push(parseString(value)); - break; - case 'EXDATE': - exdatevals = exdatevals.concat(parseRDate(value, parms)); - break; - case 'DTSTART': - break; - default: - throw new Error('unsupported property: ' + name); - } - }); - return { - dtstart: dtstart, - tzid: tzid, - rrulevals: rrulevals, - rdatevals: rdatevals, - exrulevals: exrulevals, - exdatevals: exdatevals - }; -} -function buildRule(s, options) { - var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; - var noCache = options.cache === false; - if (options.compatible) { - options.forceset = true; - options.unfold = true; - } - if (options.forceset || - rrulevals.length > 1 || - rdatevals.length || - exrulevals.length || - exdatevals.length) { - var rset_1 = new rruleset(noCache); - rset_1.dtstart(dtstart); - rset_1.tzid(tzid || undefined); - rrulevals.forEach(function (val) { - rset_1.rrule(new src_rrule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - rdatevals.forEach(function (date) { - rset_1.rdate(date); - }); - exrulevals.forEach(function (val) { - rset_1.exrule(new src_rrule(groomRruleOptions(val, dtstart, tzid), noCache)); - }); - exdatevals.forEach(function (date) { - rset_1.exdate(date); - }); - if (options.compatible && options.dtstart) - rset_1.rdate(dtstart); - return rset_1; - } - var val = rrulevals[0] || {}; - return new src_rrule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); -} -function rrulestr(s, options) { - if (options === void 0) { options = {}; } - return buildRule(s, rrulestr_initializeOptions(options)); -} -function groomRruleOptions(val, dtstart, tzid) { - return __assign(__assign({}, val), { dtstart: dtstart, - tzid: tzid }); -} -function rrulestr_initializeOptions(options) { - var invalid = []; - var keys = Object.keys(options); - var defaultKeys = Object.keys(rrulestr_DEFAULT_OPTIONS); - keys.forEach(function (key) { - if (!Object(helpers["c" /* includes */])(defaultKeys, key)) - invalid.push(key); - }); - if (invalid.length) { - throw new Error('Invalid options: ' + invalid.join(', ')); - } - return __assign(__assign({}, rrulestr_DEFAULT_OPTIONS), options); -} -function extractName(line) { - if (line.indexOf(':') === -1) { - return { - name: 'RRULE', - value: line - }; - } - var _a = Object(helpers["m" /* split */])(line, ':', 1), name = _a[0], value = _a[1]; - return { - name: name, - value: value - }; -} -function breakDownLine(line) { - var _a = extractName(line), name = _a.name, value = _a.value; - var parms = name.split(';'); - if (!parms) - throw new Error('empty property name'); - return { - name: parms[0].toUpperCase(), - parms: parms.slice(1), - value: value - }; -} -function splitIntoLines(s, unfold) { - if (unfold === void 0) { unfold = false; } - s = s && s.trim(); - if (!s) - throw new Error('Invalid empty string'); - // More info about 'unfold' option - // Go head to http://www.ietf.org/rfc/rfc2445.txt - if (!unfold) { - return s.split(/\s/); - } - var lines = s.split('\n'); - var i = 0; - while (i < lines.length) { - // TODO - var line = (lines[i] = lines[i].replace(/\s+$/g, '')); - if (!line) { - lines.splice(i, 1); - } - else if (i > 0 && line[0] === ' ') { - lines[i - 1] += line.slice(1); - lines.splice(i, 1); - } - else { - i += 1; - } - } - return lines; -} -function validateDateParm(parms) { - parms.forEach(function (parm) { - if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { - throw new Error('unsupported RDATE/EXDATE parm: ' + parm); - } - }); -} -function parseRDate(rdateval, parms) { - validateDateParm(parms); - return rdateval - .split(',') - .map(function (datestr) { return src_dateutil.untilStringToDate(datestr); }); -} - -// CONCATENATED MODULE: ./src/rruleset.ts - - - - - - - -function createGetterSetter(fieldName) { - var _this = this; - return function (field) { - if (field !== undefined) { - _this["_" + fieldName] = field; - } - if (_this["_" + fieldName] !== undefined) { - return _this["_" + fieldName]; - } - for (var i = 0; i < _this._rrule.length; i++) { - var field_1 = _this._rrule[i].origOptions[fieldName]; - if (field_1) { - return field_1; - } - } - }; -} -var rruleset_RRuleSet = /** @class */ (function (_super) { - __extends(RRuleSet, _super); - /** - * - * @param {Boolean?} noCache - * The same stratagy as RRule on cache, default to false - * @constructor - */ - function RRuleSet(noCache) { - if (noCache === void 0) { noCache = false; } - var _this = _super.call(this, {}, noCache) || this; - _this.dtstart = createGetterSetter.apply(_this, ['dtstart']); - _this.tzid = createGetterSetter.apply(_this, ['tzid']); - _this._rrule = []; - _this._rdate = []; - _this._exrule = []; - _this._exdate = []; - return _this; - } - RRuleSet.prototype._iter = function (iterResult) { - return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); - }; - /** - * Adds an RRule to the set - * - * @param {RRule} - */ - RRuleSet.prototype.rrule = function (rrule) { - _addRule(rrule, this._rrule); - }; - /** - * Adds an EXRULE to the set - * - * @param {RRule} - */ - RRuleSet.prototype.exrule = function (rrule) { - _addRule(rrule, this._exrule); - }; - /** - * Adds an RDate to the set - * - * @param {Date} - */ - RRuleSet.prototype.rdate = function (date) { - _addDate(date, this._rdate); - }; - /** - * Adds an EXDATE to the set - * - * @param {Date} - */ - RRuleSet.prototype.exdate = function (date) { - _addDate(date, this._exdate); - }; - /** - * Get list of included rrules in this recurrence set. - * - * @return List of rrules - */ - RRuleSet.prototype.rrules = function () { - return this._rrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of excluded rrules in this recurrence set. - * - * @return List of exrules - */ - RRuleSet.prototype.exrules = function () { - return this._exrule.map(function (e) { return rrulestr(e.toString()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of rdates - */ - RRuleSet.prototype.rdates = function () { - return this._rdate.map(function (e) { return new Date(e.getTime()); }); - }; - /** - * Get list of included datetimes in this recurrence set. - * - * @return List of exdates - */ - RRuleSet.prototype.exdates = function () { - return this._exdate.map(function (e) { return new Date(e.getTime()); }); - }; - RRuleSet.prototype.valueOf = function () { - var result = []; - if (!this._rrule.length && this._dtstart) { - result = result.concat(optionsToString({ dtstart: this._dtstart })); - } - this._rrule.forEach(function (rrule) { - result = result.concat(rrule.toString().split('\n')); - }); - this._exrule.forEach(function (exrule) { - result = result.concat(exrule.toString().split('\n') - .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); }) - .filter(function (line) { return !/^DTSTART/.test(line); })); - }); - if (this._rdate.length) { - result.push(rdatesToString('RDATE', this._rdate, this.tzid())); - } - if (this._exdate.length) { - result.push(rdatesToString('EXDATE', this._exdate, this.tzid())); - } - return result; - }; - /** - * to generate recurrence field such as: - * DTSTART:19970902T010000Z - * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU - * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH - */ - RRuleSet.prototype.toString = function () { - return this.valueOf().join('\n'); - }; - /** - * Create a new RRuleSet Object completely base on current instance - */ - RRuleSet.prototype.clone = function () { - var rrs = new RRuleSet(!!this._cache); - this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); }); - this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); }); - this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); }); - this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); }); - return rrs; - }; - return RRuleSet; -}(src_rrule)); -/* harmony default export */ var rruleset = (rruleset_RRuleSet); -function _addRule(rrule, collection) { - if (!(rrule instanceof src_rrule)) { - throw new TypeError(String(rrule) + ' is not RRule instance'); - } - if (!Object(helpers["c" /* includes */])(collection.map(String), String(rrule))) { - collection.push(rrule); - } -} -function _addDate(date, collection) { - if (!(date instanceof Date)) { - throw new TypeError(String(date) + ' is not Date instance'); - } - if (!Object(helpers["c" /* includes */])(collection.map(Number), Number(date))) { - collection.push(date); - src_dateutil.sort(collection); - } -} -function rdatesToString(param, rdates, tzid) { - var isUTC = !tzid || tzid.toUpperCase() === 'UTC'; - var header = isUTC ? param + ":" : param + ";TZID=" + tzid + ":"; - var dateString = rdates - .map(function (rdate) { return src_dateutil.timeToUntilString(rdate.valueOf(), isUTC); }) - .join(','); - return "" + header + dateString; -} - -// CONCATENATED MODULE: ./src/index.ts -/* concated harmony reexport rrulestr */__webpack_require__.d(__webpack_exports__, "rrulestr", function() { return rrulestr; }); -/* concated harmony reexport Frequency */__webpack_require__.d(__webpack_exports__, "Frequency", function() { return Frequency; }); -/* concated harmony reexport Weekday */__webpack_require__.d(__webpack_exports__, "Weekday", function() { return weekday["b" /* Weekday */]; }); -/* concated harmony reexport RRule */__webpack_require__.d(__webpack_exports__, "RRule", function() { return src_rrule; }); -/* concated harmony reexport RRuleSet */__webpack_require__.d(__webpack_exports__, "RRuleSet", function() { return rruleset; }); -/*! - * rrule.js - Library for working with recurrence rules for calendar dates. - * https://github.com/jakubroztocil/rrule - * - * Copyright 2010, Jakub Roztocil and Lars Schoning - * Licenced under the BSD licence. - * https://github.com/jakubroztocil/rrule/blob/master/LICENCE - * - * Based on: - * python-dateutil - Extensions to the standard Python datetime module. - * Copyright (c) 2003-2011 - Gustavo Niemeyer - * Copyright (c) 2012 - Tomi Pieviläinen - * https://github.com/jakubroztocil/rrule/blob/master/LICENCE - * - */ - - - - - - -/* harmony default export */ var src = __webpack_exports__["default"] = (src_rrule); - - -/***/ }), -/* 2 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ALL_WEEKDAYS; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Weekday; }); -// ============================================================================= -// Weekday -// ============================================================================= -var ALL_WEEKDAYS = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']; -var Weekday = /** @class */ (function () { - function Weekday(weekday, n) { - if (n === 0) - throw new Error("Can't create weekday with n == 0"); - this.weekday = weekday; - this.n = n; - } - Weekday.fromStr = function (str) { - return new Weekday(ALL_WEEKDAYS.indexOf(str)); - }; - // __call__ - Cannot call the object directly, do it through - // e.g. RRule.TH.nth(-1) instead, - Weekday.prototype.nth = function (n) { - return this.n === n ? this : new Weekday(this.weekday, n); - }; - // __eq__ - Weekday.prototype.equals = function (other) { - return this.weekday === other.weekday && this.n === other.n; - }; - // __repr__ - Weekday.prototype.toString = function () { - var s = ALL_WEEKDAYS[this.weekday]; - if (this.n) - s = (this.n > 0 ? '+' : '') + String(this.n) + s; - return s; - }; - Weekday.prototype.getJsWeekday = function () { - return this.weekday === 6 ? 0 : this.weekday + 1; - }; - return Weekday; -}()); - - - -/***/ }), -/* 3 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); - -// CONCATENATED MODULE: ./src/nlp/i18n.ts +;// CONCATENATED MODULE: ./src/nlp/i18n.ts // ============================================================================= // i18n // ============================================================================= var ENGLISH = { dayNames: [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', ], monthNames: [ - 'January', 'February', 'March', 'April', 'May', - 'June', 'July', 'August', 'September', 'October', - 'November', 'December' + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', ], tokens: { - 'SKIP': /^[ \r\n\t]+|^\.$/, - 'number': /^[1-9][0-9]*/, - 'numberAsText': /^(one|two|three)/i, - 'every': /^every/i, + SKIP: /^[ \r\n\t]+|^\.$/, + number: /^[1-9][0-9]*/, + numberAsText: /^(one|two|three)/i, + every: /^every/i, 'day(s)': /^days?/i, 'weekday(s)': /^weekdays?/i, 'week(s)': /^weeks?/i, @@ -2834,48 +799,42 @@ var ENGLISH = { 'minute(s)': /^minutes?/i, 'month(s)': /^months?/i, 'year(s)': /^years?/i, - 'on': /^(on|in)/i, - 'at': /^(at)/i, - 'the': /^the/i, - 'first': /^first/i, - 'second': /^second/i, - 'third': /^third/i, - 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, - 'last': /^last/i, - 'for': /^for/i, + on: /^(on|in)/i, + at: /^(at)/i, + the: /^the/i, + first: /^first/i, + second: /^second/i, + third: /^third/i, + nth: /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + last: /^last/i, + for: /^for/i, 'time(s)': /^times?/i, - 'until': /^(un)?til/i, - 'monday': /^mo(n(day)?)?/i, - 'tuesday': /^tu(e(s(day)?)?)?/i, - 'wednesday': /^we(d(n(esday)?)?)?/i, - 'thursday': /^th(u(r(sday)?)?)?/i, - 'friday': /^fr(i(day)?)?/i, - 'saturday': /^sa(t(urday)?)?/i, - 'sunday': /^su(n(day)?)?/i, - 'january': /^jan(uary)?/i, - 'february': /^feb(ruary)?/i, - 'march': /^mar(ch)?/i, - 'april': /^apr(il)?/i, - 'may': /^may/i, - 'june': /^june?/i, - 'july': /^july?/i, - 'august': /^aug(ust)?/i, - 'september': /^sep(t(ember)?)?/i, - 'october': /^oct(ober)?/i, - 'november': /^nov(ember)?/i, - 'december': /^dec(ember)?/i, - 'comma': /^(,\s*|(and|or)\s*)+/i - } + until: /^(un)?til/i, + monday: /^mo(n(day)?)?/i, + tuesday: /^tu(e(s(day)?)?)?/i, + wednesday: /^we(d(n(esday)?)?)?/i, + thursday: /^th(u(r(sday)?)?)?/i, + friday: /^fr(i(day)?)?/i, + saturday: /^sa(t(urday)?)?/i, + sunday: /^su(n(day)?)?/i, + january: /^jan(uary)?/i, + february: /^feb(ruary)?/i, + march: /^mar(ch)?/i, + april: /^apr(il)?/i, + may: /^may/i, + june: /^june?/i, + july: /^july?/i, + august: /^aug(ust)?/i, + september: /^sep(t(ember)?)?/i, + october: /^oct(ober)?/i, + november: /^nov(ember)?/i, + december: /^dec(ember)?/i, + comma: /^(,\s*|(and|or)\s*)+/i, + }, }; -/* harmony default export */ var i18n = (ENGLISH); +/* harmony default export */ const i18n = (ENGLISH); -// EXTERNAL MODULE: ./src/index.ts + 23 modules -var src = __webpack_require__(1); - -// EXTERNAL MODULE: ./src/helpers.ts -var helpers = __webpack_require__(0); - -// CONCATENATED MODULE: ./src/nlp/totext.ts +;// CONCATENATED MODULE: ./src/nlp/totext.ts @@ -2889,7 +848,7 @@ var contains = function (arr, val) { return arr.indexOf(val) !== -1; }; var defaultGetText = function (id) { return id.toString(); }; -var defaultDateFormatter = function (year, month, day) { return month + " " + day + ", " + year; }; +var defaultDateFormatter = function (year, month, day) { return "".concat(month, " ").concat(day, ", ").concat(year); }; /** * * @param {RRule} rrule @@ -2898,7 +857,7 @@ var defaultDateFormatter = function (year, month, day) { return month + " " + da * @param {Object} language definition * @constructor */ -var totext_ToText = /** @class */ (function () { +var ToText = /** @class */ (function () { function ToText(rrule, gettext, language, dateFormatter) { if (gettext === void 0) { gettext = defaultGetText; } if (language === void 0) { language = i18n; } @@ -2920,8 +879,8 @@ var totext_ToText = /** @class */ (function () { if (!this.bymonthday.length) this.bymonthday = null; } - if (Object(helpers["f" /* isPresent */])(this.origOptions.byweekday)) { - var byweekday = !Object(helpers["d" /* isArray */])(this.origOptions.byweekday) + if (isPresent(this.origOptions.byweekday)) { + var byweekday = !isArray(this.origOptions.byweekday) ? [this.origOptions.byweekday] : this.origOptions.byweekday; var days = String(byweekday); @@ -2945,7 +904,7 @@ var totext_ToText = /** @class */ (function () { days.indexOf('TH') !== -1 && days.indexOf('FR') !== -1 && days.indexOf('SA') !== -1 && - days.indexOf('SU') !== -1 + days.indexOf('SU') !== -1, }; var sortWeekDays = function (a, b) { return a.weekday - b.weekday; @@ -2963,6 +922,7 @@ var totext_ToText = /** @class */ (function () { } /** * Test whether the rrule can be fully converted to text. + * * @param {RRule} rrule * @return {Boolean} */ @@ -2973,7 +933,7 @@ var totext_ToText = /** @class */ (function () { if (rrule.origOptions.until && rrule.origOptions.count) return false; for (var key in rrule.origOptions) { - if (contains(['dtstart', 'wkst', 'freq'], key)) + if (contains(['dtstart', 'tzid', 'wkst', 'freq'], key)) return true; if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key)) return false; @@ -2987,6 +947,7 @@ var totext_ToText = /** @class */ (function () { * Perform the conversion. Only some of the frequencies are supported. * If some of the rrule's options aren't supported, they'll * be omitted from the output an "(~ approximate)" will be appended. + * * @return {*} */ ToText.prototype.toString = function () { @@ -2995,8 +956,9 @@ var totext_ToText = /** @class */ (function () { return gettext('RRule error: Unable to fully convert this rrule to text'); } this.text = [gettext('every')]; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - this[src["default"].FREQUENCIES[this.options.freq]](); + this[RRule.FREQUENCIES[this.options.freq]](); if (this.options.until) { this.add(gettext('until')); var until = this.options.until; @@ -3082,6 +1044,9 @@ var totext_ToText = /** @class */ (function () { else if (this.byweekday) { this._byweekday(); } + if (this.origOptions.byhour) { + this._byhour(); + } } }; ToText.prototype.MONTHLY = function () { @@ -3098,8 +1063,9 @@ var totext_ToText = /** @class */ (function () { this._bymonth(); } else { - if (this.options.interval !== 1) + if (this.options.interval !== 1) { this.add(this.options.interval.toString()); + } this.add(this.plural(this.options.interval) ? gettext('months') : gettext('month')); @@ -3127,8 +1093,9 @@ var totext_ToText = /** @class */ (function () { this._bymonth(); } else { - if (this.options.interval !== 1) + if (this.options.interval !== 1) { this.add(this.options.interval.toString()); + } this.add(this.plural(this.options.interval) ? gettext('years') : gettext('year')); } if (this.bymonthday) { @@ -3184,11 +1151,10 @@ var totext_ToText = /** @class */ (function () { ToText.prototype.nth = function (n) { n = parseInt(n.toString(), 10); var nth; - var npos; var gettext = this.gettext; if (n === -1) return gettext('last'); - npos = Math.abs(n); + var npos = Math.abs(n); switch (npos) { case 1: case 21: @@ -3212,8 +1178,9 @@ var totext_ToText = /** @class */ (function () { return this.language.monthNames[m - 1]; }; ToText.prototype.weekdaytext = function (wday) { - var weekday = Object(helpers["e" /* isNumber */])(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); - return ((wday.n ? this.nth(wday.n) + ' ' : '') + this.language.dayNames[weekday]); + var weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday(); + return ((wday.n ? this.nth(wday.n) + ' ' : '') + + this.language.dayNames[weekday]); }; ToText.prototype.plural = function (n) { return n % 100 !== 1; @@ -3224,8 +1191,9 @@ var totext_ToText = /** @class */ (function () { return this; }; ToText.prototype.list = function (arr, callback, finalDelim, delim) { + var _this = this; if (delim === void 0) { delim = ','; } - if (!Object(helpers["d" /* isArray */])(arr)) { + if (!isArray(arr)) { arr = [arr]; } var delimJoin = function (array, delimiter, finalDelimiter) { @@ -3248,9 +1216,8 @@ var totext_ToText = /** @class */ (function () { function (o) { return o.toString(); }; - var self = this; var realCallback = function (arg) { - return callback && callback.call(self, arg); + return callback && callback.call(_this, arg); }; if (finalDelim) { return delimJoin(arr.map(realCallback), delim, finalDelim); @@ -3261,9 +1228,9 @@ var totext_ToText = /** @class */ (function () { }; return ToText; }()); -/* harmony default export */ var totext = (totext_ToText); +/* harmony default export */ const totext = (ToText); -// CONCATENATED MODULE: ./src/nlp/parsetext.ts +;// CONCATENATED MODULE: ./src/nlp/parsetext.ts // ============================================================================= @@ -3285,7 +1252,6 @@ var Parser = /** @class */ (function () { Parser.prototype.nextSymbol = function () { var best; var bestSymbol; - var p = this; this.symbol = null; this.value = null; do { @@ -3295,7 +1261,7 @@ var Parser = /** @class */ (function () { best = null; for (var name_1 in this.rules) { rule = this.rules[name_1]; - var match = rule.exec(p.text); + var match = rule.exec(this.text); if (match) { if (best === null || match[0].length > best[0].length) { best = match; @@ -3314,9 +1280,7 @@ var Parser = /** @class */ (function () { this.value = null; return; } - // @ts-ignore } while (bestSymbol === 'SKIP'); - // @ts-ignore this.symbol = bestSymbol; this.value = best; return true; @@ -3361,7 +1325,7 @@ function parseText(text, language) { throw new Error('Unexpected end'); switch (ttr.symbol) { case 'day(s)': - options.freq = src["default"].DAILY; + options.freq = RRule.DAILY; if (ttr.nextSymbol()) { AT(); F(); @@ -3370,47 +1334,43 @@ function parseText(text, language) { // FIXME Note: every 2 weekdays != every two weeks on weekdays. // DAILY on weekdays is not a valid rule case 'weekday(s)': - options.freq = src["default"].WEEKLY; - options.byweekday = [ - src["default"].MO, - src["default"].TU, - src["default"].WE, - src["default"].TH, - src["default"].FR - ]; + options.freq = RRule.WEEKLY; + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; ttr.nextSymbol(); + AT(); F(); break; case 'week(s)': - options.freq = src["default"].WEEKLY; + options.freq = RRule.WEEKLY; if (ttr.nextSymbol()) { ON(); + AT(); F(); } break; case 'hour(s)': - options.freq = src["default"].HOURLY; + options.freq = RRule.HOURLY; if (ttr.nextSymbol()) { ON(); F(); } break; case 'minute(s)': - options.freq = src["default"].MINUTELY; + options.freq = RRule.MINUTELY; if (ttr.nextSymbol()) { ON(); F(); } break; case 'month(s)': - options.freq = src["default"].MONTHLY; + options.freq = RRule.MONTHLY; if (ttr.nextSymbol()) { ON(); F(); } break; case 'year(s)': - options.freq = src["default"].YEARLY; + options.freq = RRule.YEARLY; if (ttr.nextSymbol()) { ON(); F(); @@ -3423,9 +1383,11 @@ function parseText(text, language) { case 'friday': case 'saturday': case 'sunday': - options.freq = src["default"].WEEKLY; - var key = ttr.symbol.substr(0, 2).toUpperCase(); - options.byweekday = [src["default"][key]]; + options.freq = RRule.WEEKLY; + var key = ttr.symbol + .substr(0, 2) + .toUpperCase(); + options.byweekday = [RRule[key]]; if (!ttr.nextSymbol()) return; // TODO check for duplicates @@ -3436,10 +1398,10 @@ function parseText(text, language) { if (!wkd) { throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday'); } - // @ts-ignore - options.byweekday.push(src["default"][wkd]); + options.byweekday.push(RRule[wkd]); ttr.nextSymbol(); } + AT(); MDAYs(); F(); break; @@ -3455,7 +1417,7 @@ function parseText(text, language) { case 'october': case 'november': case 'december': - options.freq = src["default"].YEARLY; + options.freq = RRule.YEARLY; options.bymonth = [decodeM()]; if (!ttr.nextSymbol()) return; @@ -3493,13 +1455,11 @@ function parseText(text, language) { ttr.nextSymbol(); if (!options.byweekday) options.byweekday = []; - // @ts-ignore - options.byweekday.push(src["default"][wkd].nth(nth)); + options.byweekday.push(RRule[wkd].nth(nth)); } else { if (!options.bymonthday) options.bymonthday = []; - // @ts-ignore options.bymonthday.push(nth); ttr.accept('day(s)'); } @@ -3509,19 +1469,12 @@ function parseText(text, language) { ttr.nextSymbol(); if (!options.byweekday) options.byweekday = []; - // @ts-ignore - options.byweekday.push(src["default"][wkd]); + options.byweekday.push(RRule[wkd]); } else if (ttr.symbol === 'weekday(s)') { ttr.nextSymbol(); if (!options.byweekday) { - options.byweekday = [ - src["default"].MO, - src["default"].TU, - src["default"].WE, - src["default"].TH, - src["default"].FR - ]; + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR]; } } else if (ttr.symbol === 'week(s)') { @@ -3543,7 +1496,6 @@ function parseText(text, language) { ttr.nextSymbol(); if (!options.bymonth) options.bymonth = []; - // @ts-ignore options.bymonth.push(m); } else { @@ -3670,24 +1622,36 @@ function parseText(text, language) { } } -// CONCATENATED MODULE: ./src/nlp/index.ts -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromText", function() { return fromText; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFullyConvertible", function() { return isFullyConvertible; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toText", function() { return toText; }); -/* concated harmony reexport parseText */__webpack_require__.d(__webpack_exports__, "parseText", function() { return parseText; }); +;// CONCATENATED MODULE: ./src/types.ts +var Frequency; +(function (Frequency) { + Frequency[Frequency["YEARLY"] = 0] = "YEARLY"; + Frequency[Frequency["MONTHLY"] = 1] = "MONTHLY"; + Frequency[Frequency["WEEKLY"] = 2] = "WEEKLY"; + Frequency[Frequency["DAILY"] = 3] = "DAILY"; + Frequency[Frequency["HOURLY"] = 4] = "HOURLY"; + Frequency[Frequency["MINUTELY"] = 5] = "MINUTELY"; + Frequency[Frequency["SECONDLY"] = 6] = "SECONDLY"; +})(Frequency || (Frequency = {})); +function freqIsDailyOrGreater(freq) { + return freq < Frequency.HOURLY; +} + +;// CONCATENATED MODULE: ./src/nlp/index.ts -/*! -* rrule.js - Library for working with recurrence rules for calendar dates. -* https://github.com/jakubroztocil/rrule -* -* Copyright 2010, Jakub Roztocil and Lars Schoning -* Licenced under the BSD licence. -* https://github.com/jakubroztocil/rrule/blob/master/LICENCE -* -*/ + +/* ! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jakubroztocil/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + */ /** * * Implementation of RRule.fromText() and RRule::toText(). @@ -3708,13 +1672,13 @@ function parseText(text, language) { * RULES * * Every ([n]) - * day(s) - * | [weekday], ..., (and) [weekday] - * | weekday(s) - * | week(s) - * | month(s) - * | [month], ..., (and) [month] - * | year(s) + * day(s) + * | [weekday], ..., (and) [weekday] + * | weekday(s) + * | week(s) + * | month(s) + * | [month], ..., (and) [month] + * | year(s) * * * Plus 0, 1, or multiple of these: @@ -3740,10 +1704,10 @@ function parseText(text, language) { * Definitely no supported for parsing: * * (for year): - * in week(s) [n], ..., (and) [n] + * in week(s) [n], ..., (and) [n] * - * on the [yearday], ..., (and) [n] day of the year - * on day [yearday], ..., (and) [n] + * on the [yearday], ..., (and) [n] day of the year + * on day [yearday], ..., (and) [n] * * * NON-TERMINALS @@ -3754,10 +1718,10 @@ function parseText(text, language) { * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ... * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, .. * [date]: - * [month] (0-31(,) ([year])), - * (the) 0-31.(1-12.([year])), - * (the) 0-31/(1-12/([year])), - * [weekday] + * - [month] (0-31(,) ([year])), + * - (the) 0-31.(1-12.([year])), + * - (the) 0-31/(1-12/([year])), + * - [weekday] * * [year]: 0000, 0001, ... 01, 02, .. * @@ -3770,7 +1734,7 @@ function parseText(text, language) { */ var fromText = function (text, language) { if (language === void 0) { language = i18n; } - return new src["default"](parseText(text, language) || undefined); + return new RRule(parseText(text, language) || undefined); }; var common = [ 'count', @@ -3778,15 +1742,15 @@ var common = [ 'interval', 'byweekday', 'bymonthday', - 'bymonth' + 'bymonth', ]; totext.IMPLEMENTED = []; -totext.IMPLEMENTED[src["default"].HOURLY] = common; -totext.IMPLEMENTED[src["default"].MINUTELY] = common; -totext.IMPLEMENTED[src["default"].DAILY] = ['byhour'].concat(common); -totext.IMPLEMENTED[src["default"].WEEKLY] = common; -totext.IMPLEMENTED[src["default"].MONTHLY] = common; -totext.IMPLEMENTED[src["default"].YEARLY] = ['byweekno', 'byyearday'].concat(common); +totext.IMPLEMENTED[Frequency.HOURLY] = common; +totext.IMPLEMENTED[Frequency.MINUTELY] = common; +totext.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common); +totext.IMPLEMENTED[Frequency.WEEKLY] = common; +totext.IMPLEMENTED[Frequency.MONTHLY] = common; +totext.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common); // ============================================================================= // Export // ============================================================================= @@ -3796,7 +1760,2054 @@ var toText = function (rrule, gettext, language, dateFormatter) { var isFullyConvertible = totext.isFullyConvertible; +;// CONCATENATED MODULE: ./src/datetime.ts -/***/ }) -/******/ ]); -}); + + + +var Time = /** @class */ (function () { + function Time(hour, minute, second, millisecond) { + this.hour = hour; + this.minute = minute; + this.second = second; + this.millisecond = millisecond || 0; + } + Time.prototype.getHours = function () { + return this.hour; + }; + Time.prototype.getMinutes = function () { + return this.minute; + }; + Time.prototype.getSeconds = function () { + return this.second; + }; + Time.prototype.getMilliseconds = function () { + return this.millisecond; + }; + Time.prototype.getTime = function () { + return ((this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + + this.millisecond); + }; + return Time; +}()); + +var DateTime = /** @class */ (function (_super) { + __extends(DateTime, _super); + function DateTime(year, month, day, hour, minute, second, millisecond) { + var _this = _super.call(this, hour, minute, second, millisecond) || this; + _this.year = year; + _this.month = month; + _this.day = day; + return _this; + } + DateTime.fromDate = function (date) { + return new this(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.valueOf() % 1000); + }; + DateTime.prototype.getWeekday = function () { + return getWeekday(new Date(this.getTime())); + }; + DateTime.prototype.getTime = function () { + return new Date(Date.UTC(this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond)).getTime(); + }; + DateTime.prototype.getDay = function () { + return this.day; + }; + DateTime.prototype.getMonth = function () { + return this.month; + }; + DateTime.prototype.getYear = function () { + return this.year; + }; + DateTime.prototype.addYears = function (years) { + this.year += years; + }; + DateTime.prototype.addMonths = function (months) { + this.month += months; + if (this.month > 12) { + var yearDiv = Math.floor(this.month / 12); + var monthMod = pymod(this.month, 12); + this.month = monthMod; + this.year += yearDiv; + if (this.month === 0) { + this.month = 12; + --this.year; + } + } + }; + DateTime.prototype.addWeekly = function (days, wkst) { + if (wkst > this.getWeekday()) { + this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7; + } + else { + this.day += -(this.getWeekday() - wkst) + days * 7; + } + this.fixDay(); + }; + DateTime.prototype.addDaily = function (days) { + this.day += days; + this.fixDay(); + }; + DateTime.prototype.addHours = function (hours, filtered, byhour) { + if (filtered) { + // Jump to one iteration before next day + this.hour += Math.floor((23 - this.hour) / hours) * hours; + } + for (;;) { + this.hour += hours; + var _a = divmod(this.hour, 24), dayDiv = _a.div, hourMod = _a.mod; + if (dayDiv) { + this.hour = hourMod; + this.addDaily(dayDiv); + } + if (empty(byhour) || includes(byhour, this.hour)) + break; + } + }; + DateTime.prototype.addMinutes = function (minutes, filtered, byhour, byminute) { + if (filtered) { + // Jump to one iteration before next day + this.minute += + Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes; + } + for (;;) { + this.minute += minutes; + var _a = divmod(this.minute, 60), hourDiv = _a.div, minuteMod = _a.mod; + if (hourDiv) { + this.minute = minuteMod; + this.addHours(hourDiv, false, byhour); + } + if ((empty(byhour) || includes(byhour, this.hour)) && + (empty(byminute) || includes(byminute, this.minute))) { + break; + } + } + }; + DateTime.prototype.addSeconds = function (seconds, filtered, byhour, byminute, bysecond) { + if (filtered) { + // Jump to one iteration before next day + this.second += + Math.floor((86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / + seconds) * seconds; + } + for (;;) { + this.second += seconds; + var _a = divmod(this.second, 60), minuteDiv = _a.div, secondMod = _a.mod; + if (minuteDiv) { + this.second = secondMod; + this.addMinutes(minuteDiv, false, byhour, byminute); + } + if ((empty(byhour) || includes(byhour, this.hour)) && + (empty(byminute) || includes(byminute, this.minute)) && + (empty(bysecond) || includes(bysecond, this.second))) { + break; + } + } + }; + DateTime.prototype.fixDay = function () { + if (this.day <= 28) { + return; + } + var daysinmonth = monthRange(this.year, this.month - 1)[1]; + if (this.day <= daysinmonth) { + return; + } + while (this.day > daysinmonth) { + this.day -= daysinmonth; + ++this.month; + if (this.month === 13) { + this.month = 1; + ++this.year; + if (this.year > MAXYEAR) { + return; + } + } + daysinmonth = monthRange(this.year, this.month - 1)[1]; + } + }; + DateTime.prototype.add = function (options, filtered) { + var freq = options.freq, interval = options.interval, wkst = options.wkst, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + switch (freq) { + case Frequency.YEARLY: + return this.addYears(interval); + case Frequency.MONTHLY: + return this.addMonths(interval); + case Frequency.WEEKLY: + return this.addWeekly(interval, wkst); + case Frequency.DAILY: + return this.addDaily(interval); + case Frequency.HOURLY: + return this.addHours(interval, filtered, byhour); + case Frequency.MINUTELY: + return this.addMinutes(interval, filtered, byhour, byminute); + case Frequency.SECONDLY: + return this.addSeconds(interval, filtered, byhour, byminute, bysecond); + } + }; + return DateTime; +}(Time)); + + +;// CONCATENATED MODULE: ./src/parseoptions.ts + + + + + + + +function initializeOptions(options) { + var invalid = []; + var keys = Object.keys(options); + // Shallow copy for options and origOptions and check for invalid + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + if (!includes(defaultKeys, key)) + invalid.push(key); + if (isDate(options[key]) && !isValidDate(options[key])) { + invalid.push(key); + } + } + if (invalid.length) { + throw new Error('Invalid options: ' + invalid.join(', ')); + } + return __assign({}, options); +} +function parseOptions(options) { + var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options)); + if (isPresent(opts.byeaster)) + opts.freq = RRule.YEARLY; + if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) { + throw new Error("Invalid frequency: ".concat(opts.freq, " ").concat(options.freq)); + } + if (!opts.dtstart) + opts.dtstart = new Date(new Date().setMilliseconds(0)); + if (!isPresent(opts.wkst)) { + opts.wkst = RRule.MO.weekday; + } + else if (isNumber(opts.wkst)) { + // cool, just keep it like that + } + else { + opts.wkst = opts.wkst.weekday; + } + if (isPresent(opts.bysetpos)) { + if (isNumber(opts.bysetpos)) + opts.bysetpos = [opts.bysetpos]; + for (var i = 0; i < opts.bysetpos.length; i++) { + var v = opts.bysetpos[i]; + if (v === 0 || !(v >= -366 && v <= 366)) { + throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1'); + } + } + } + if (!(Boolean(opts.byweekno) || + notEmpty(opts.byweekno) || + notEmpty(opts.byyearday) || + Boolean(opts.bymonthday) || + notEmpty(opts.bymonthday) || + isPresent(opts.byweekday) || + isPresent(opts.byeaster))) { + switch (opts.freq) { + case RRule.YEARLY: + if (!opts.bymonth) + opts.bymonth = opts.dtstart.getUTCMonth() + 1; + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case RRule.MONTHLY: + opts.bymonthday = opts.dtstart.getUTCDate(); + break; + case RRule.WEEKLY: + opts.byweekday = [getWeekday(opts.dtstart)]; + break; + } + } + // bymonth + if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) { + opts.bymonth = [opts.bymonth]; + } + // byyearday + if (isPresent(opts.byyearday) && + !isArray(opts.byyearday) && + isNumber(opts.byyearday)) { + opts.byyearday = [opts.byyearday]; + } + // bymonthday + if (!isPresent(opts.bymonthday)) { + opts.bymonthday = []; + opts.bynmonthday = []; + } + else if (isArray(opts.bymonthday)) { + var bymonthday = []; + var bynmonthday = []; + for (var i = 0; i < opts.bymonthday.length; i++) { + var v = opts.bymonthday[i]; + if (v > 0) { + bymonthday.push(v); + } + else if (v < 0) { + bynmonthday.push(v); + } + } + opts.bymonthday = bymonthday; + opts.bynmonthday = bynmonthday; + } + else if (opts.bymonthday < 0) { + opts.bynmonthday = [opts.bymonthday]; + opts.bymonthday = []; + } + else { + opts.bynmonthday = []; + opts.bymonthday = [opts.bymonthday]; + } + // byweekno + if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) { + opts.byweekno = [opts.byweekno]; + } + // byweekday / bynweekday + if (!isPresent(opts.byweekday)) { + opts.bynweekday = null; + } + else if (isNumber(opts.byweekday)) { + opts.byweekday = [opts.byweekday]; + opts.bynweekday = null; + } + else if (isWeekdayStr(opts.byweekday)) { + opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday]; + opts.bynweekday = null; + } + else if (opts.byweekday instanceof Weekday) { + if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { + opts.byweekday = [opts.byweekday.weekday]; + opts.bynweekday = null; + } + else { + opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]]; + opts.byweekday = null; + } + } + else { + var byweekday = []; + var bynweekday = []; + for (var i = 0; i < opts.byweekday.length; i++) { + var wday = opts.byweekday[i]; + if (isNumber(wday)) { + byweekday.push(wday); + continue; + } + else if (isWeekdayStr(wday)) { + byweekday.push(Weekday.fromStr(wday).weekday); + continue; + } + if (!wday.n || opts.freq > RRule.MONTHLY) { + byweekday.push(wday.weekday); + } + else { + bynweekday.push([wday.weekday, wday.n]); + } + } + opts.byweekday = notEmpty(byweekday) ? byweekday : null; + opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null; + } + // byhour + if (!isPresent(opts.byhour)) { + opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null; + } + else if (isNumber(opts.byhour)) { + opts.byhour = [opts.byhour]; + } + // byminute + if (!isPresent(opts.byminute)) { + opts.byminute = + opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null; + } + else if (isNumber(opts.byminute)) { + opts.byminute = [opts.byminute]; + } + // bysecond + if (!isPresent(opts.bysecond)) { + opts.bysecond = + opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null; + } + else if (isNumber(opts.bysecond)) { + opts.bysecond = [opts.bysecond]; + } + return { parsedOptions: opts }; +} +function buildTimeset(opts) { + var millisecondModulo = opts.dtstart.getTime() % 1000; + if (!freqIsDailyOrGreater(opts.freq)) { + return []; + } + var timeset = []; + opts.byhour.forEach(function (hour) { + opts.byminute.forEach(function (minute) { + opts.bysecond.forEach(function (second) { + timeset.push(new Time(hour, minute, second, millisecondModulo)); + }); + }); + }); + return timeset; +} + +;// CONCATENATED MODULE: ./src/parsestring.ts + + + + + +function parseString(rfcString) { + var options = rfcString + .split('\n') + .map(parseLine) + .filter(function (x) { return x !== null; }); + return __assign(__assign({}, options[0]), options[1]); +} +function parseDtstart(line) { + var options = {}; + var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line); + if (!dtstartWithZone) { + return options; + } + var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2]; + if (tzid) { + options.tzid = tzid; + } + options.dtstart = untilStringToDate(dtstart); + return options; +} +function parseLine(rfcString) { + rfcString = rfcString.replace(/^\s+|\s+$/, ''); + if (!rfcString.length) + return null; + var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase()); + if (!header) { + return parseRrule(rfcString); + } + var key = header[1]; + switch (key.toUpperCase()) { + case 'RRULE': + case 'EXRULE': + return parseRrule(rfcString); + case 'DTSTART': + return parseDtstart(rfcString); + default: + throw new Error("Unsupported RFC prop ".concat(key, " in ").concat(rfcString)); + } +} +function parseRrule(line) { + var strippedLine = line.replace(/^RRULE:/i, ''); + var options = parseDtstart(strippedLine); + var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';'); + attrs.forEach(function (attr) { + var _a = attr.split('='), key = _a[0], value = _a[1]; + switch (key.toUpperCase()) { + case 'FREQ': + options.freq = Frequency[value.toUpperCase()]; + break; + case 'WKST': + options.wkst = Days[value.toUpperCase()]; + break; + case 'COUNT': + case 'INTERVAL': + case 'BYSETPOS': + case 'BYMONTH': + case 'BYMONTHDAY': + case 'BYYEARDAY': + case 'BYWEEKNO': + case 'BYHOUR': + case 'BYMINUTE': + case 'BYSECOND': + var num = parseNumber(value); + var optionKey = key.toLowerCase(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + options[optionKey] = num; + break; + case 'BYWEEKDAY': + case 'BYDAY': + options.byweekday = parseWeekday(value); + break; + case 'DTSTART': + case 'TZID': + // for backwards compatibility + var dtstart = parseDtstart(line); + options.tzid = dtstart.tzid; + options.dtstart = dtstart.dtstart; + break; + case 'UNTIL': + options.until = untilStringToDate(value); + break; + case 'BYEASTER': + options.byeaster = Number(value); + break; + default: + throw new Error("Unknown RRULE property '" + key + "'"); + } + }); + return options; +} +function parseNumber(value) { + if (value.indexOf(',') !== -1) { + var values = value.split(','); + return values.map(parseIndividualNumber); + } + return parseIndividualNumber(value); +} +function parseIndividualNumber(value) { + if (/^[+-]?\d+$/.test(value)) { + return Number(value); + } + return value; +} +function parseWeekday(value) { + var days = value.split(','); + return days.map(function (day) { + if (day.length === 2) { + // MO, TU, ... + return Days[day]; // wday instanceof Weekday + } + // -1MO, +3FR, 1SO, 13TU ... + var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/); + if (!parts || parts.length < 3) { + throw new SyntaxError("Invalid weekday string: ".concat(day)); + } + var n = Number(parts[1]); + var wdaypart = parts[2]; + var wday = Days[wdaypart].weekday; + return new Weekday(wday, n); + }); +} + +;// CONCATENATED MODULE: ./src/datewithzone.ts + +var DateWithZone = /** @class */ (function () { + function DateWithZone(date, tzid) { + if (isNaN(date.getTime())) { + throw new RangeError('Invalid date passed to DateWithZone'); + } + this.date = date; + this.tzid = tzid; + } + Object.defineProperty(DateWithZone.prototype, "isUTC", { + get: function () { + return !this.tzid || this.tzid.toUpperCase() === 'UTC'; + }, + enumerable: false, + configurable: true + }); + DateWithZone.prototype.toString = function () { + var datestr = timeToUntilString(this.date.getTime(), this.isUTC); + if (!this.isUTC) { + return ";TZID=".concat(this.tzid, ":").concat(datestr); + } + return ":".concat(datestr); + }; + DateWithZone.prototype.getTime = function () { + return this.date.getTime(); + }; + DateWithZone.prototype.rezonedDate = function () { + if (this.isUTC) { + return this.date; + } + return dateInTimeZone(this.date, this.tzid); + }; + return DateWithZone; +}()); + + +;// CONCATENATED MODULE: ./src/optionstostring.ts + + + + + +function optionsToString(options) { + var rrule = []; + var dtstart = ''; + var keys = Object.keys(options); + var defaultKeys = Object.keys(DEFAULT_OPTIONS); + for (var i = 0; i < keys.length; i++) { + if (keys[i] === 'tzid') + continue; + if (!includes(defaultKeys, keys[i])) + continue; + var key = keys[i].toUpperCase(); + var value = options[keys[i]]; + var outValue = ''; + if (!isPresent(value) || (isArray(value) && !value.length)) + continue; + switch (key) { + case 'FREQ': + outValue = RRule.FREQUENCIES[options.freq]; + break; + case 'WKST': + if (isNumber(value)) { + outValue = new Weekday(value).toString(); + } + else { + outValue = value.toString(); + } + break; + case 'BYWEEKDAY': + /* + NOTE: BYWEEKDAY is a special case. + RRule() deconstructs the rule.options.byweekday array + into an array of Weekday arguments. + On the other hand, rule.origOptions is an array of Weekdays. + We need to handle both cases here. + It might be worth change RRule to keep the Weekdays. + + Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC) + + */ + key = 'BYDAY'; + outValue = toArray(value) + .map(function (wday) { + if (wday instanceof Weekday) { + return wday; + } + if (isArray(wday)) { + return new Weekday(wday[0], wday[1]); + } + return new Weekday(wday); + }) + .toString(); + break; + case 'DTSTART': + dtstart = buildDtstart(value, options.tzid); + break; + case 'UNTIL': + outValue = timeToUntilString(value, !options.tzid); + break; + default: + if (isArray(value)) { + var strValues = []; + for (var j = 0; j < value.length; j++) { + strValues[j] = String(value[j]); + } + outValue = strValues.toString(); + } + else { + outValue = String(value); + } + } + if (outValue) { + rrule.push([key, outValue]); + } + } + var rules = rrule + .map(function (_a) { + var key = _a[0], value = _a[1]; + return "".concat(key, "=").concat(value.toString()); + }) + .join(';'); + var ruleString = ''; + if (rules !== '') { + ruleString = "RRULE:".concat(rules); + } + return [dtstart, ruleString].filter(function (x) { return !!x; }).join('\n'); +} +function buildDtstart(dtstart, tzid) { + if (!dtstart) { + return ''; + } + return 'DTSTART' + new DateWithZone(new Date(dtstart), tzid).toString(); +} + +;// CONCATENATED MODULE: ./src/cache.ts + + + +function argsMatch(left, right) { + if (Array.isArray(left)) { + if (!Array.isArray(right)) + return false; + if (left.length !== right.length) + return false; + return left.every(function (date, i) { return date.getTime() === right[i].getTime(); }); + } + if (left instanceof Date) { + return right instanceof Date && left.getTime() === right.getTime(); + } + return left === right; +} +var Cache = /** @class */ (function () { + function Cache() { + this.all = false; + this.before = []; + this.after = []; + this.between = []; + } + /** + * @param {String} what - all/before/after/between + * @param {Array,Date} value - an array of dates, one date, or null + * @param {Object?} args - _iter arguments + */ + Cache.prototype._cacheAdd = function (what, value, args) { + if (value) { + value = value instanceof Date ? dateutil_clone(value) : cloneDates(value); + } + if (what === 'all') { + this.all = value; + } + else { + args._value = value; + this[what].push(args); + } + }; + /** + * @return false - not in the cache + * @return null - cached, but zero occurrences (before/after) + * @return Date - cached (before/after) + * @return [] - cached, but zero occurrences (all/between) + * @return [Date1, DateN] - cached (all/between) + */ + Cache.prototype._cacheGet = function (what, args) { + var cached = false; + var argsKeys = args ? Object.keys(args) : []; + var findCacheDiff = function (item) { + for (var i = 0; i < argsKeys.length; i++) { + var key = argsKeys[i]; + if (!argsMatch(args[key], item[key])) { + return true; + } + } + return false; + }; + var cachedObject = this[what]; + if (what === 'all') { + cached = this.all; + } + else if (isArray(cachedObject)) { + // Let's see whether we've already called the + // 'what' method with the same 'args' + for (var i = 0; i < cachedObject.length; i++) { + var item = cachedObject[i]; + if (argsKeys.length && findCacheDiff(item)) + continue; + cached = item._value; + break; + } + } + if (!cached && this.all) { + // Not in the cache, but we already know all the occurrences, + // so we can find the correct dates from the cached ones. + var iterResult = new iterresult(what, args); + for (var i = 0; i < this.all.length; i++) { + if (!iterResult.accept(this.all[i])) + break; + } + cached = iterResult.getValue(); + this._cacheAdd(what, cached, args); + } + return isArray(cached) + ? cloneDates(cached) + : cached instanceof Date + ? dateutil_clone(cached) + : cached; + }; + return Cache; +}()); + + +;// CONCATENATED MODULE: ./src/masks.ts + + +// ============================================================================= +// Date masks +// ============================================================================= +// Every mask is 7 days longer to handle cross-year weekly periods. +var M365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 28), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); +var M366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], repeat(1, 31), true), repeat(2, 29), true), repeat(3, 31), true), repeat(4, 30), true), repeat(5, 31), true), repeat(6, 30), true), repeat(7, 31), true), repeat(8, 31), true), repeat(9, 30), true), repeat(10, 31), true), repeat(11, 30), true), repeat(12, 31), true), repeat(1, 7), true); +var M28 = range(1, 29); +var M29 = range(1, 30); +var M30 = range(1, 31); +var M31 = range(1, 32); +var MDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M29, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); +var MDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], M31, true), M28, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31, true), M30, true), M31, true), M30, true), M31, true), M31.slice(0, 7), true); +var NM28 = range(-28, 0); +var NM29 = range(-29, 0); +var NM30 = range(-30, 0); +var NM31 = range(-31, 0); +var NMDAY366MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM29, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); +var NMDAY365MASK = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], NM31, true), NM28, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31, true), NM30, true), NM31, true), NM30, true), NM31, true), NM31.slice(0, 7), true); +var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; +var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; +var WDAYMASK = (function () { + var wdaymask = []; + for (var i = 0; i < 55; i++) + wdaymask = wdaymask.concat(range(7)); + return wdaymask; +})(); + + +;// CONCATENATED MODULE: ./src/iterinfo/yearinfo.ts + + + + +function rebuildYear(year, options) { + var firstyday = datetime(year, 1, 1); + var yearlen = isLeapYear(year) ? 366 : 365; + var nextyearlen = isLeapYear(year + 1) ? 366 : 365; + var yearordinal = toOrdinal(firstyday); + var yearweekday = getWeekday(firstyday); + var result = __assign(__assign({ yearlen: yearlen, nextyearlen: nextyearlen, yearordinal: yearordinal, yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null }); + if (empty(options.byweekno)) { + return result; + } + result.wnomask = repeat(0, yearlen + 7); + var firstwkst; + var wyearlen; + var no1wkst = (firstwkst = pymod(7 - yearweekday + options.wkst, 7)); + if (no1wkst >= 4) { + no1wkst = 0; + // Number of days in the year, plus the days we got + // from last year. + wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7); + } + else { + // Number of days in the year, minus the days we + // left in last year. + wyearlen = yearlen - no1wkst; + } + var div = Math.floor(wyearlen / 7); + var mod = pymod(wyearlen, 7); + var numweeks = Math.floor(div + mod / 4); + for (var j = 0; j < options.byweekno.length; j++) { + var n = options.byweekno[j]; + if (n < 0) { + n += numweeks + 1; + } + if (!(n > 0 && n <= numweeks)) { + continue; + } + var i = void 0; + if (n > 1) { + i = no1wkst + (n - 1) * 7; + if (no1wkst !== firstwkst) { + i -= 7 - firstwkst; + } + } + else { + i = no1wkst; + } + for (var k = 0; k < 7; k++) { + result.wnomask[i] = 1; + i++; + if (result.wdaymask[i] === options.wkst) + break; + } + } + if (includes(options.byweekno, 1)) { + // Check week number 1 of next year as well + // orig-TODO : Check -numweeks for next year. + var i = no1wkst + numweeks * 7; + if (no1wkst !== firstwkst) + i -= 7 - firstwkst; + if (i < yearlen) { + // If week starts in next year, we + // don't care about it. + for (var j = 0; j < 7; j++) { + result.wnomask[i] = 1; + i += 1; + if (result.wdaymask[i] === options.wkst) + break; + } + } + } + if (no1wkst) { + // Check last week number of last year as + // well. If no1wkst is 0, either the year + // started on week start, or week number 1 + // got days from last year, so there are no + // days from last year's last week number in + // this year. + var lnumweeks = void 0; + if (!includes(options.byweekno, -1)) { + var lyearweekday = getWeekday(datetime(year - 1, 1, 1)); + var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7); + var lyearlen = isLeapYear(year - 1) ? 366 : 365; + var weekst = void 0; + if (lno1wkst >= 4) { + lno1wkst = 0; + weekst = lyearlen + pymod(lyearweekday - options.wkst, 7); + } + else { + weekst = yearlen - no1wkst; + } + lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4); + } + else { + lnumweeks = -1; + } + if (includes(options.byweekno, lnumweeks)) { + for (var i = 0; i < no1wkst; i++) + result.wnomask[i] = 1; + } + } + return result; +} +function baseYearMasks(year) { + var yearlen = isLeapYear(year) ? 366 : 365; + var firstyday = datetime(year, 1, 1); + var wday = getWeekday(firstyday); + if (yearlen === 365) { + return { + mmask: M365MASK, + mdaymask: MDAY365MASK, + nmdaymask: NMDAY365MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M365RANGE, + }; + } + return { + mmask: M366MASK, + mdaymask: MDAY366MASK, + nmdaymask: NMDAY366MASK, + wdaymask: WDAYMASK.slice(wday), + mrange: M366RANGE, + }; +} + +;// CONCATENATED MODULE: ./src/iterinfo/monthinfo.ts + + +function rebuildMonth(year, month, yearlen, mrange, wdaymask, options) { + var result = { + lastyear: year, + lastmonth: month, + nwdaymask: [], + }; + var ranges = []; + if (options.freq === RRule.YEARLY) { + if (empty(options.bymonth)) { + ranges = [[0, yearlen]]; + } + else { + for (var j = 0; j < options.bymonth.length; j++) { + month = options.bymonth[j]; + ranges.push(mrange.slice(month - 1, month + 1)); + } + } + } + else if (options.freq === RRule.MONTHLY) { + ranges = [mrange.slice(month - 1, month + 1)]; + } + if (empty(ranges)) { + return result; + } + // Weekly frequency won't get here, so we may not + // care about cross-year weekly periods. + result.nwdaymask = repeat(0, yearlen); + for (var j = 0; j < ranges.length; j++) { + var rang = ranges[j]; + var first = rang[0]; + var last = rang[1] - 1; + for (var k = 0; k < options.bynweekday.length; k++) { + var i = void 0; + var _a = options.bynweekday[k], wday = _a[0], n = _a[1]; + if (n < 0) { + i = last + (n + 1) * 7; + i -= pymod(wdaymask[i] - wday, 7); + } + else { + i = first + (n - 1) * 7; + i += pymod(7 - wdaymask[i] + wday, 7); + } + if (first <= i && i <= last) + result.nwdaymask[i] = 1; + } + } + return result; +} + +;// CONCATENATED MODULE: ./src/iterinfo/easter.ts +function easter(y, offset) { + if (offset === void 0) { offset = 0; } + var a = y % 19; + var b = Math.floor(y / 100); + var c = y % 100; + var d = Math.floor(b / 4); + var e = b % 4; + var f = Math.floor((b + 8) / 25); + var g = Math.floor((b - f + 1) / 3); + var h = Math.floor(19 * a + b - d - g + 15) % 30; + var i = Math.floor(c / 4); + var k = c % 4; + var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7; + var m = Math.floor((a + 11 * h + 22 * l) / 451); + var month = Math.floor((h + l - 7 * m + 114) / 31); + var day = ((h + l - 7 * m + 114) % 31) + 1; + var date = Date.UTC(y, month - 1, day + offset); + var yearStart = Date.UTC(y, 0, 1); + return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))]; +} + +;// CONCATENATED MODULE: ./src/iterinfo/index.ts + + + + + + + +// ============================================================================= +// Iterinfo +// ============================================================================= +var Iterinfo = /** @class */ (function () { + // eslint-disable-next-line no-empty-function + function Iterinfo(options) { + this.options = options; + } + Iterinfo.prototype.rebuild = function (year, month) { + var options = this.options; + if (year !== this.lastyear) { + this.yearinfo = rebuildYear(year, options); + } + if (notEmpty(options.bynweekday) && + (month !== this.lastmonth || year !== this.lastyear)) { + var _a = this.yearinfo, yearlen = _a.yearlen, mrange = _a.mrange, wdaymask = _a.wdaymask; + this.monthinfo = rebuildMonth(year, month, yearlen, mrange, wdaymask, options); + } + if (isPresent(options.byeaster)) { + this.eastermask = easter(year, options.byeaster); + } + }; + Object.defineProperty(Iterinfo.prototype, "lastyear", { + get: function () { + return this.monthinfo ? this.monthinfo.lastyear : null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "lastmonth", { + get: function () { + return this.monthinfo ? this.monthinfo.lastmonth : null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "yearlen", { + get: function () { + return this.yearinfo.yearlen; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "yearordinal", { + get: function () { + return this.yearinfo.yearordinal; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "mrange", { + get: function () { + return this.yearinfo.mrange; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "wdaymask", { + get: function () { + return this.yearinfo.wdaymask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "mmask", { + get: function () { + return this.yearinfo.mmask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "wnomask", { + get: function () { + return this.yearinfo.wnomask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "nwdaymask", { + get: function () { + return this.monthinfo ? this.monthinfo.nwdaymask : []; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "nextyearlen", { + get: function () { + return this.yearinfo.nextyearlen; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "mdaymask", { + get: function () { + return this.yearinfo.mdaymask; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Iterinfo.prototype, "nmdaymask", { + get: function () { + return this.yearinfo.nmdaymask; + }, + enumerable: false, + configurable: true + }); + Iterinfo.prototype.ydayset = function () { + return [range(this.yearlen), 0, this.yearlen]; + }; + Iterinfo.prototype.mdayset = function (_, month) { + var start = this.mrange[month - 1]; + var end = this.mrange[month]; + var set = repeat(null, this.yearlen); + for (var i = start; i < end; i++) + set[i] = i; + return [set, start, end]; + }; + Iterinfo.prototype.wdayset = function (year, month, day) { + // We need to handle cross-year weeks here. + var set = repeat(null, this.yearlen + 7); + var i = toOrdinal(datetime(year, month, day)) - this.yearordinal; + var start = i; + for (var j = 0; j < 7; j++) { + set[i] = i; + ++i; + if (this.wdaymask[i] === this.options.wkst) + break; + } + return [set, start, i]; + }; + Iterinfo.prototype.ddayset = function (year, month, day) { + var set = repeat(null, this.yearlen); + var i = toOrdinal(datetime(year, month, day)) - this.yearordinal; + set[i] = i; + return [set, i, i + 1]; + }; + Iterinfo.prototype.htimeset = function (hour, _, second, millisecond) { + var _this = this; + var set = []; + this.options.byminute.forEach(function (minute) { + set = set.concat(_this.mtimeset(hour, minute, second, millisecond)); + }); + sort(set); + return set; + }; + Iterinfo.prototype.mtimeset = function (hour, minute, _, millisecond) { + var set = this.options.bysecond.map(function (second) { return new Time(hour, minute, second, millisecond); }); + sort(set); + return set; + }; + Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) { + return [new Time(hour, minute, second, millisecond)]; + }; + Iterinfo.prototype.getdayset = function (freq) { + switch (freq) { + case Frequency.YEARLY: + return this.ydayset.bind(this); + case Frequency.MONTHLY: + return this.mdayset.bind(this); + case Frequency.WEEKLY: + return this.wdayset.bind(this); + case Frequency.DAILY: + return this.ddayset.bind(this); + default: + return this.ddayset.bind(this); + } + }; + Iterinfo.prototype.gettimeset = function (freq) { + switch (freq) { + case Frequency.HOURLY: + return this.htimeset.bind(this); + case Frequency.MINUTELY: + return this.mtimeset.bind(this); + case Frequency.SECONDLY: + return this.stimeset.bind(this); + } + }; + return Iterinfo; +}()); +/* harmony default export */ const iterinfo = (Iterinfo); + +;// CONCATENATED MODULE: ./src/iter/poslist.ts + + +function buildPoslist(bysetpos, timeset, start, end, ii, dayset) { + var poslist = []; + for (var j = 0; j < bysetpos.length; j++) { + var daypos = void 0; + var timepos = void 0; + var pos = bysetpos[j]; + if (pos < 0) { + daypos = Math.floor(pos / timeset.length); + timepos = pymod(pos, timeset.length); + } + else { + daypos = Math.floor((pos - 1) / timeset.length); + timepos = pymod(pos - 1, timeset.length); + } + var tmp = []; + for (var k = start; k < end; k++) { + var val = dayset[k]; + if (!isPresent(val)) + continue; + tmp.push(val); + } + var i = void 0; + if (daypos < 0) { + i = tmp.slice(daypos)[0]; + } + else { + i = tmp[daypos]; + } + var time = timeset[timepos]; + var date = fromOrdinal(ii.yearordinal + i); + var res = combine(date, time); + // XXX: can this ever be in the array? + // - compare the actual date instead? + if (!includes(poslist, res)) + poslist.push(res); + } + sort(poslist); + return poslist; +} + +;// CONCATENATED MODULE: ./src/iter/index.ts + + + + + + + + + +function iter(iterResult, options) { + var dtstart = options.dtstart, freq = options.freq, interval = options.interval, until = options.until, bysetpos = options.bysetpos; + var count = options.count; + if (count === 0 || interval === 0) { + return emitResult(iterResult); + } + var counterDate = DateTime.fromDate(dtstart); + var ii = new iterinfo(options); + ii.rebuild(counterDate.year, counterDate.month); + var timeset = makeTimeset(ii, counterDate, options); + for (;;) { + var _a = ii.getdayset(freq)(counterDate.year, counterDate.month, counterDate.day), dayset = _a[0], start = _a[1], end = _a[2]; + var filtered = removeFilteredDays(dayset, start, end, ii, options); + if (notEmpty(bysetpos)) { + var poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset); + for (var j = 0; j < poslist.length; j++) { + var res = poslist[j]; + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } + else { + for (var j = start; j < end; j++) { + var currentDay = dayset[j]; + if (!isPresent(currentDay)) { + continue; + } + var date = fromOrdinal(ii.yearordinal + currentDay); + for (var k = 0; k < timeset.length; k++) { + var time = timeset[k]; + var res = combine(date, time); + if (until && res > until) { + return emitResult(iterResult); + } + if (res >= dtstart) { + var rezonedDate = rezoneIfNeeded(res, options); + if (!iterResult.accept(rezonedDate)) { + return emitResult(iterResult); + } + if (count) { + --count; + if (!count) { + return emitResult(iterResult); + } + } + } + } + } + } + if (options.interval === 0) { + return emitResult(iterResult); + } + // Handle frequency and interval + counterDate.add(options, filtered); + if (counterDate.year > MAXYEAR) { + return emitResult(iterResult); + } + if (!freqIsDailyOrGreater(freq)) { + timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0); + } + ii.rebuild(counterDate.year, counterDate.month); + } +} +function isFiltered(ii, currentDay, options) { + var bymonth = options.bymonth, byweekno = options.byweekno, byweekday = options.byweekday, byeaster = options.byeaster, bymonthday = options.bymonthday, bynmonthday = options.bynmonthday, byyearday = options.byyearday; + return ((notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) || + (notEmpty(byweekno) && !ii.wnomask[currentDay]) || + (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) || + (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) || + (byeaster !== null && !includes(ii.eastermask, currentDay)) || + ((notEmpty(bymonthday) || notEmpty(bynmonthday)) && + !includes(bymonthday, ii.mdaymask[currentDay]) && + !includes(bynmonthday, ii.nmdaymask[currentDay])) || + (notEmpty(byyearday) && + ((currentDay < ii.yearlen && + !includes(byyearday, currentDay + 1) && + !includes(byyearday, -ii.yearlen + currentDay)) || + (currentDay >= ii.yearlen && + !includes(byyearday, currentDay + 1 - ii.yearlen) && + !includes(byyearday, -ii.nextyearlen + currentDay - ii.yearlen))))); +} +function rezoneIfNeeded(date, options) { + return new DateWithZone(date, options.tzid).rezonedDate(); +} +function emitResult(iterResult) { + return iterResult.getValue(); +} +function removeFilteredDays(dayset, start, end, ii, options) { + var filtered = false; + for (var dayCounter = start; dayCounter < end; dayCounter++) { + var currentDay = dayset[dayCounter]; + filtered = isFiltered(ii, currentDay, options); + if (filtered) + dayset[currentDay] = null; + } + return filtered; +} +function makeTimeset(ii, counterDate, options) { + var freq = options.freq, byhour = options.byhour, byminute = options.byminute, bysecond = options.bysecond; + if (freqIsDailyOrGreater(freq)) { + return buildTimeset(options); + } + if ((freq >= RRule.HOURLY && + notEmpty(byhour) && + !includes(byhour, counterDate.hour)) || + (freq >= RRule.MINUTELY && + notEmpty(byminute) && + !includes(byminute, counterDate.minute)) || + (freq >= RRule.SECONDLY && + notEmpty(bysecond) && + !includes(bysecond, counterDate.second))) { + return []; + } + return ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, counterDate.millisecond); +} + +;// CONCATENATED MODULE: ./src/rrule.ts + + + + + + + + + + + +// ============================================================================= +// RRule +// ============================================================================= +var Days = { + MO: new Weekday(0), + TU: new Weekday(1), + WE: new Weekday(2), + TH: new Weekday(3), + FR: new Weekday(4), + SA: new Weekday(5), + SU: new Weekday(6), +}; +var DEFAULT_OPTIONS = { + freq: Frequency.YEARLY, + dtstart: null, + interval: 1, + wkst: Days.MO, + count: null, + until: null, + tzid: null, + bysetpos: null, + bymonth: null, + bymonthday: null, + bynmonthday: null, + byyearday: null, + byweekno: null, + byweekday: null, + bynweekday: null, + byhour: null, + byminute: null, + bysecond: null, + byeaster: null, +}; +var defaultKeys = Object.keys(DEFAULT_OPTIONS); +/** + * + * @param {Options?} options - see + * - The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... + * @constructor + */ +var RRule = /** @class */ (function () { + function RRule(options, noCache) { + if (options === void 0) { options = {}; } + if (noCache === void 0) { noCache = false; } + // RFC string + this._cache = noCache ? null : new Cache(); + // used by toString() + this.origOptions = initializeOptions(options); + var parsedOptions = parseOptions(options).parsedOptions; + this.options = parsedOptions; + } + RRule.parseText = function (text, language) { + return parseText(text, language); + }; + RRule.fromText = function (text, language) { + return fromText(text, language); + }; + RRule.fromString = function (str) { + return new RRule(RRule.parseString(str) || undefined); + }; + RRule.prototype._iter = function (iterResult) { + return iter(iterResult, this.options); + }; + RRule.prototype._cacheGet = function (what, args) { + if (!this._cache) + return false; + return this._cache._cacheGet(what, args); + }; + RRule.prototype._cacheAdd = function (what, value, args) { + if (!this._cache) + return; + return this._cache._cacheAdd(what, value, args); + }; + /** + * @param {Function} iterator - optional function that will be called + * on each date that is added. It can return false + * to stop the iteration. + * @return Array containing all recurrences. + */ + RRule.prototype.all = function (iterator) { + if (iterator) { + return this._iter(new callbackiterresult('all', {}, iterator)); + } + var result = this._cacheGet('all'); + if (result === false) { + result = this._iter(new iterresult('all', {})); + this._cacheAdd('all', result); + } + return result; + }; + /** + * Returns all the occurrences of the rrule between after and before. + * The inc keyword defines what happens if after and/or before are + * themselves occurrences. With inc == True, they will be included in the + * list, if they are found in the recurrence set. + * + * @return Array + */ + RRule.prototype.between = function (after, before, inc, iterator) { + if (inc === void 0) { inc = false; } + if (!isValidDate(after) || !isValidDate(before)) { + throw new Error('Invalid date passed in to RRule.between'); + } + var args = { + before: before, + after: after, + inc: inc, + }; + if (iterator) { + return this._iter(new callbackiterresult('between', args, iterator)); + } + var result = this._cacheGet('between', args); + if (result === false) { + result = this._iter(new iterresult('between', args)); + this._cacheAdd('between', result, args); + } + return result; + }; + /** + * Returns the last recurrence before the given datetime instance. + * The inc keyword defines what happens if dt is an occurrence. + * With inc == True, if dt itself is an occurrence, it will be returned. + * + * @return Date or null + */ + RRule.prototype.before = function (dt, inc) { + if (inc === void 0) { inc = false; } + if (!isValidDate(dt)) { + throw new Error('Invalid date passed in to RRule.before'); + } + var args = { dt: dt, inc: inc }; + var result = this._cacheGet('before', args); + if (result === false) { + result = this._iter(new iterresult('before', args)); + this._cacheAdd('before', result, args); + } + return result; + }; + /** + * Returns the first recurrence after the given datetime instance. + * The inc keyword defines what happens if dt is an occurrence. + * With inc == True, if dt itself is an occurrence, it will be returned. + * + * @return Date or null + */ + RRule.prototype.after = function (dt, inc) { + if (inc === void 0) { inc = false; } + if (!isValidDate(dt)) { + throw new Error('Invalid date passed in to RRule.after'); + } + var args = { dt: dt, inc: inc }; + var result = this._cacheGet('after', args); + if (result === false) { + result = this._iter(new iterresult('after', args)); + this._cacheAdd('after', result, args); + } + return result; + }; + /** + * Returns the number of recurrences in this set. It will have go trough + * the whole recurrence, if this hasn't been done before. + */ + RRule.prototype.count = function () { + return this.all().length; + }; + /** + * Converts the rrule into its string representation + * + * @see + * @return String + */ + RRule.prototype.toString = function () { + return optionsToString(this.origOptions); + }; + /** + * Will convert all rules described in nlp:ToText + * to text. + */ + RRule.prototype.toText = function (gettext, language, dateFormatter) { + return toText(this, gettext, language, dateFormatter); + }; + RRule.prototype.isFullyConvertibleToText = function () { + return isFullyConvertible(this); + }; + /** + * @return a RRule instance with the same freq and options + * as this one (cache is not cloned) + */ + RRule.prototype.clone = function () { + return new RRule(this.origOptions); + }; + // RRule class 'constants' + RRule.FREQUENCIES = [ + 'YEARLY', + 'MONTHLY', + 'WEEKLY', + 'DAILY', + 'HOURLY', + 'MINUTELY', + 'SECONDLY', + ]; + RRule.YEARLY = Frequency.YEARLY; + RRule.MONTHLY = Frequency.MONTHLY; + RRule.WEEKLY = Frequency.WEEKLY; + RRule.DAILY = Frequency.DAILY; + RRule.HOURLY = Frequency.HOURLY; + RRule.MINUTELY = Frequency.MINUTELY; + RRule.SECONDLY = Frequency.SECONDLY; + RRule.MO = Days.MO; + RRule.TU = Days.TU; + RRule.WE = Days.WE; + RRule.TH = Days.TH; + RRule.FR = Days.FR; + RRule.SA = Days.SA; + RRule.SU = Days.SU; + RRule.parseString = parseString; + RRule.optionsToString = optionsToString; + return RRule; +}()); + + +;// CONCATENATED MODULE: ./src/iterset.ts + + + +function iterSet(iterResult, _rrule, _exrule, _rdate, _exdate, tzid) { + var _exdateHash = {}; + var _accept = iterResult.accept; + function evalExdate(after, before) { + _exrule.forEach(function (rrule) { + rrule.between(after, before, true).forEach(function (date) { + _exdateHash[Number(date)] = true; + }); + }); + } + _exdate.forEach(function (date) { + var zonedDate = new DateWithZone(date, tzid).rezonedDate(); + _exdateHash[Number(zonedDate)] = true; + }); + iterResult.accept = function (date) { + var dt = Number(date); + if (isNaN(dt)) + return _accept.call(this, date); + if (!_exdateHash[dt]) { + evalExdate(new Date(dt - 1), new Date(dt + 1)); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + } + return true; + }; + if (iterResult.method === 'between') { + evalExdate(iterResult.args.after, iterResult.args.before); + iterResult.accept = function (date) { + var dt = Number(date); + if (!_exdateHash[dt]) { + _exdateHash[dt] = true; + return _accept.call(this, date); + } + return true; + }; + } + for (var i = 0; i < _rdate.length; i++) { + var zonedDate = new DateWithZone(_rdate[i], tzid).rezonedDate(); + if (!iterResult.accept(new Date(zonedDate.getTime()))) + break; + } + _rrule.forEach(function (rrule) { + iter(iterResult, rrule.options); + }); + var res = iterResult._result; + sort(res); + switch (iterResult.method) { + case 'all': + case 'between': + return res; + case 'before': + return ((res.length && res[res.length - 1]) || null); + case 'after': + default: + return ((res.length && res[0]) || null); + } +} + +;// CONCATENATED MODULE: ./src/rrulestr.ts + + + + + + +/** + * RRuleStr + * To parse a set of rrule strings + */ +var rrulestr_DEFAULT_OPTIONS = { + dtstart: null, + cache: false, + unfold: false, + forceset: false, + compatible: false, + tzid: null, +}; +function parseInput(s, options) { + var rrulevals = []; + var rdatevals = []; + var exrulevals = []; + var exdatevals = []; + var parsedDtstart = parseDtstart(s); + var dtstart = parsedDtstart.dtstart; + var tzid = parsedDtstart.tzid; + var lines = splitIntoLines(s, options.unfold); + lines.forEach(function (line) { + var _a; + if (!line) + return; + var _b = breakDownLine(line), name = _b.name, parms = _b.parms, value = _b.value; + switch (name.toUpperCase()) { + case 'RRULE': + if (parms.length) { + throw new Error("unsupported RRULE parm: ".concat(parms.join(','))); + } + rrulevals.push(parseString(line)); + break; + case 'RDATE': + var _c = (_a = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)) !== null && _a !== void 0 ? _a : [], rdateTzid = _c[1]; + if (rdateTzid && !tzid) { + tzid = rdateTzid; + } + rdatevals = rdatevals.concat(parseRDate(value, parms)); + break; + case 'EXRULE': + if (parms.length) { + throw new Error("unsupported EXRULE parm: ".concat(parms.join(','))); + } + exrulevals.push(parseString(value)); + break; + case 'EXDATE': + exdatevals = exdatevals.concat(parseRDate(value, parms)); + break; + case 'DTSTART': + break; + default: + throw new Error('unsupported property: ' + name); + } + }); + return { + dtstart: dtstart, + tzid: tzid, + rrulevals: rrulevals, + rdatevals: rdatevals, + exrulevals: exrulevals, + exdatevals: exdatevals, + }; +} +function buildRule(s, options) { + var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; + var noCache = options.cache === false; + if (options.compatible) { + options.forceset = true; + options.unfold = true; + } + if (options.forceset || + rrulevals.length > 1 || + rdatevals.length || + exrulevals.length || + exdatevals.length) { + var rset_1 = new RRuleSet(noCache); + rset_1.dtstart(dtstart); + rset_1.tzid(tzid || undefined); + rrulevals.forEach(function (val) { + rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); + }); + rdatevals.forEach(function (date) { + rset_1.rdate(date); + }); + exrulevals.forEach(function (val) { + rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); + }); + exdatevals.forEach(function (date) { + rset_1.exdate(date); + }); + if (options.compatible && options.dtstart) + rset_1.rdate(dtstart); + return rset_1; + } + var val = rrulevals[0] || {}; + return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); +} +function rrulestr(s, options) { + if (options === void 0) { options = {}; } + return buildRule(s, rrulestr_initializeOptions(options)); +} +function groomRruleOptions(val, dtstart, tzid) { + return __assign(__assign({}, val), { dtstart: dtstart, tzid: tzid }); +} +function rrulestr_initializeOptions(options) { + var invalid = []; + var keys = Object.keys(options); + var defaultKeys = Object.keys(rrulestr_DEFAULT_OPTIONS); + keys.forEach(function (key) { + if (!includes(defaultKeys, key)) + invalid.push(key); + }); + if (invalid.length) { + throw new Error('Invalid options: ' + invalid.join(', ')); + } + return __assign(__assign({}, rrulestr_DEFAULT_OPTIONS), options); +} +function extractName(line) { + if (line.indexOf(':') === -1) { + return { + name: 'RRULE', + value: line, + }; + } + var _a = split(line, ':', 1), name = _a[0], value = _a[1]; + return { + name: name, + value: value, + }; +} +function breakDownLine(line) { + var _a = extractName(line), name = _a.name, value = _a.value; + var parms = name.split(';'); + if (!parms) + throw new Error('empty property name'); + return { + name: parms[0].toUpperCase(), + parms: parms.slice(1), + value: value, + }; +} +function splitIntoLines(s, unfold) { + if (unfold === void 0) { unfold = false; } + s = s && s.trim(); + if (!s) + throw new Error('Invalid empty string'); + // More info about 'unfold' option + // Go head to http://www.ietf.org/rfc/rfc2445.txt + if (!unfold) { + return s.split(/\s/); + } + var lines = s.split('\n'); + var i = 0; + while (i < lines.length) { + // TODO + var line = (lines[i] = lines[i].replace(/\s+$/g, '')); + if (!line) { + lines.splice(i, 1); + } + else if (i > 0 && line[0] === ' ') { + lines[i - 1] += line.slice(1); + lines.splice(i, 1); + } + else { + i += 1; + } + } + return lines; +} +function validateDateParm(parms) { + parms.forEach(function (parm) { + if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { + throw new Error('unsupported RDATE/EXDATE parm: ' + parm); + } + }); +} +function parseRDate(rdateval, parms) { + validateDateParm(parms); + return rdateval.split(',').map(function (datestr) { return untilStringToDate(datestr); }); +} + +;// CONCATENATED MODULE: ./src/rruleset.ts + + + + + + + +function createGetterSetter(fieldName) { + var _this = this; + return function (field) { + if (field !== undefined) { + _this["_".concat(fieldName)] = field; + } + if (_this["_".concat(fieldName)] !== undefined) { + return _this["_".concat(fieldName)]; + } + for (var i = 0; i < _this._rrule.length; i++) { + var field_1 = _this._rrule[i].origOptions[fieldName]; + if (field_1) { + return field_1; + } + } + }; +} +var RRuleSet = /** @class */ (function (_super) { + __extends(RRuleSet, _super); + /** + * + * @param {Boolean?} noCache + * The same stratagy as RRule on cache, default to false + * @constructor + */ + function RRuleSet(noCache) { + if (noCache === void 0) { noCache = false; } + var _this = _super.call(this, {}, noCache) || this; + _this.dtstart = createGetterSetter.apply(_this, ['dtstart']); + _this.tzid = createGetterSetter.apply(_this, ['tzid']); + _this._rrule = []; + _this._rdate = []; + _this._exrule = []; + _this._exdate = []; + return _this; + } + RRuleSet.prototype._iter = function (iterResult) { + return iterSet(iterResult, this._rrule, this._exrule, this._rdate, this._exdate, this.tzid()); + }; + /** + * Adds an RRule to the set + * + * @param {RRule} + */ + RRuleSet.prototype.rrule = function (rrule) { + _addRule(rrule, this._rrule); + }; + /** + * Adds an EXRULE to the set + * + * @param {RRule} + */ + RRuleSet.prototype.exrule = function (rrule) { + _addRule(rrule, this._exrule); + }; + /** + * Adds an RDate to the set + * + * @param {Date} + */ + RRuleSet.prototype.rdate = function (date) { + _addDate(date, this._rdate); + }; + /** + * Adds an EXDATE to the set + * + * @param {Date} + */ + RRuleSet.prototype.exdate = function (date) { + _addDate(date, this._exdate); + }; + /** + * Get list of included rrules in this recurrence set. + * + * @return List of rrules + */ + RRuleSet.prototype.rrules = function () { + return this._rrule.map(function (e) { return rrulestr(e.toString()); }); + }; + /** + * Get list of excluded rrules in this recurrence set. + * + * @return List of exrules + */ + RRuleSet.prototype.exrules = function () { + return this._exrule.map(function (e) { return rrulestr(e.toString()); }); + }; + /** + * Get list of included datetimes in this recurrence set. + * + * @return List of rdates + */ + RRuleSet.prototype.rdates = function () { + return this._rdate.map(function (e) { return new Date(e.getTime()); }); + }; + /** + * Get list of included datetimes in this recurrence set. + * + * @return List of exdates + */ + RRuleSet.prototype.exdates = function () { + return this._exdate.map(function (e) { return new Date(e.getTime()); }); + }; + RRuleSet.prototype.valueOf = function () { + var result = []; + if (!this._rrule.length && this._dtstart) { + result = result.concat(optionsToString({ dtstart: this._dtstart })); + } + this._rrule.forEach(function (rrule) { + result = result.concat(rrule.toString().split('\n')); + }); + this._exrule.forEach(function (exrule) { + result = result.concat(exrule + .toString() + .split('\n') + .map(function (line) { return line.replace(/^RRULE:/, 'EXRULE:'); }) + .filter(function (line) { return !/^DTSTART/.test(line); })); + }); + if (this._rdate.length) { + result.push(rdatesToString('RDATE', this._rdate, this.tzid())); + } + if (this._exdate.length) { + result.push(rdatesToString('EXDATE', this._exdate, this.tzid())); + } + return result; + }; + /** + * to generate recurrence field such as: + * DTSTART:19970902T010000Z + * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU + * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH + */ + RRuleSet.prototype.toString = function () { + return this.valueOf().join('\n'); + }; + /** + * Create a new RRuleSet Object completely base on current instance + */ + RRuleSet.prototype.clone = function () { + var rrs = new RRuleSet(!!this._cache); + this._rrule.forEach(function (rule) { return rrs.rrule(rule.clone()); }); + this._exrule.forEach(function (rule) { return rrs.exrule(rule.clone()); }); + this._rdate.forEach(function (date) { return rrs.rdate(new Date(date.getTime())); }); + this._exdate.forEach(function (date) { return rrs.exdate(new Date(date.getTime())); }); + return rrs; + }; + return RRuleSet; +}(RRule)); + +function _addRule(rrule, collection) { + if (!(rrule instanceof RRule)) { + throw new TypeError(String(rrule) + ' is not RRule instance'); + } + if (!includes(collection.map(String), String(rrule))) { + collection.push(rrule); + } +} +function _addDate(date, collection) { + if (!(date instanceof Date)) { + throw new TypeError(String(date) + ' is not Date instance'); + } + if (!includes(collection.map(Number), Number(date))) { + collection.push(date); + sort(collection); + } +} +function rdatesToString(param, rdates, tzid) { + var isUTC = !tzid || tzid.toUpperCase() === 'UTC'; + var header = isUTC ? "".concat(param, ":") : "".concat(param, ";TZID=").concat(tzid, ":"); + var dateString = rdates + .map(function (rdate) { return timeToUntilString(rdate.valueOf(), isUTC); }) + .join(','); + return "".concat(header).concat(dateString); +} + +;// CONCATENATED MODULE: ./src/index.ts +/* ! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jakubroztocil/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + * Based on: + * python-dateutil - Extensions to the standard Python datetime module. + * Copyright (c) 2003-2011 - Gustavo Niemeyer + * Copyright (c) 2012 - Tomi Pieviläinen + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + */ + + + + + + + +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/src/pretix/testutils/__init__.py b/src/pretix/testutils/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/pretix/testutils/__init__.py +++ b/src/pretix/testutils/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/api.py b/src/pretix/testutils/api.py index a0e19255b..2ddd3ae92 100644 --- a/src/pretix/testutils/api.py +++ b/src/pretix/testutils/api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/mail.py b/src/pretix/testutils/mail.py index 134989720..29a569894 100644 --- a/src/pretix/testutils/mail.py +++ b/src/pretix/testutils/mail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/middleware.py b/src/pretix/testutils/middleware.py index 9fe07857c..b76ca9d98 100644 --- a/src/pretix/testutils/middleware.py +++ b/src/pretix/testutils/middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/mock.py b/src/pretix/testutils/mock.py index 68fefae00..501d6e7b7 100644 --- a/src/pretix/testutils/mock.py +++ b/src/pretix/testutils/mock.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/queries.py b/src/pretix/testutils/queries.py index 267ad2103..bd9dfa32a 100644 --- a/src/pretix/testutils/queries.py +++ b/src/pretix/testutils/queries.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/scope.py b/src/pretix/testutils/scope.py index 40c7d2afc..d592d79f3 100644 --- a/src/pretix/testutils/scope.py +++ b/src/pretix/testutils/scope.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/sessions.py b/src/pretix/testutils/sessions.py index cc785e2e3..8e94a1b96 100644 --- a/src/pretix/testutils/sessions.py +++ b/src/pretix/testutils/sessions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/testutils/settings.py b/src/pretix/testutils/settings.py index 9c5bf7145..c73440dea 100644 --- a/src/pretix/testutils/settings.py +++ b/src/pretix/testutils/settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/urls.py b/src/pretix/urls.py index 8d1b3b7f3..f5a3d6a9c 100644 --- a/src/pretix/urls.py +++ b/src/pretix/urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/pretix/wsgi.py b/src/pretix/wsgi.py index 38ae94184..4e0a63943 100644 --- a/src/pretix/wsgi.py +++ b/src/pretix/wsgi.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/__init__.py b/src/tests/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/__init__.py +++ b/src/tests/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/__init__.py b/src/tests/api/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/api/__init__.py +++ b/src/tests/api/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/conftest.py b/src/tests/api/conftest.py index bc2e2742c..4947708d7 100644 --- a/src/tests/api/conftest.py +++ b/src/tests/api/conftest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_append_slash.py b/src/tests/api/test_append_slash.py index c7c044add..5f1f1ee87 100644 --- a/src/tests/api/test_append_slash.py +++ b/src/tests/api/test_append_slash.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_auth.py b/src/tests/api/test_auth.py index 2fb4cb32f..fd7eec6a9 100644 --- a/src/tests/api/test_auth.py +++ b/src/tests/api/test_auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_cart.py b/src/tests/api/test_cart.py index d39b722e4..5bf7c3ad1 100644 --- a/src/tests/api/test_cart.py +++ b/src/tests/api/test_cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_checkin.py b/src/tests/api/test_checkin.py index 52af8a8cf..fd18b497d 100644 --- a/src/tests/api/test_checkin.py +++ b/src/tests/api/test_checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_checkinrpc.py b/src/tests/api/test_checkinrpc.py index 9021c7c0f..77d1b0329 100644 --- a/src/tests/api/test_checkinrpc.py +++ b/src/tests/api/test_checkinrpc.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_customers.py b/src/tests/api/test_customers.py index 9d8f38168..c59c58aeb 100644 --- a/src/tests/api/test_customers.py +++ b/src/tests/api/test_customers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_device_event_selection.py b/src/tests/api/test_device_event_selection.py index c8a309065..cd07c7bb4 100644 --- a/src/tests/api/test_device_event_selection.py +++ b/src/tests/api/test_device_event_selection.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_deviceauth.py b/src/tests/api/test_deviceauth.py index bed8fb0e3..dd29809b7 100644 --- a/src/tests/api/test_deviceauth.py +++ b/src/tests/api/test_deviceauth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_devices.py b/src/tests/api/test_devices.py index e1856ad06..dafdb7097 100644 --- a/src/tests/api/test_devices.py +++ b/src/tests/api/test_devices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_discounts.py b/src/tests/api/test_discounts.py index 22451135e..de461c129 100644 --- a/src/tests/api/test_discounts.py +++ b/src/tests/api/test_discounts.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_events.py b/src/tests/api/test_events.py index 60a1522ee..b2b350216 100644 --- a/src/tests/api/test_events.py +++ b/src/tests/api/test_events.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_exporters.py b/src/tests/api/test_exporters.py index 822fcad84..a7fdb45e1 100644 --- a/src/tests/api/test_exporters.py +++ b/src/tests/api/test_exporters.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_giftcards.py b/src/tests/api/test_giftcards.py index bbc50fec2..4fdb89cfe 100644 --- a/src/tests/api/test_giftcards.py +++ b/src/tests/api/test_giftcards.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_idempotency.py b/src/tests/api/test_idempotency.py index 884df388c..83fb8d283 100644 --- a/src/tests/api/test_idempotency.py +++ b/src/tests/api/test_idempotency.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_invoices.py b/src/tests/api/test_invoices.py index 829008226..37c3db609 100644 --- a/src/tests/api/test_invoices.py +++ b/src/tests/api/test_invoices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -231,7 +231,9 @@ TEST_INVOICE_RES = { "description": "Budget Ticket
Attendee: Peter", 'subevent': None, 'event_date_from': '2017-12-27T10:00:00Z', - 'event_date_to': None, + 'event_date_to': '2017-12-27T10:00:00Z', + 'period_start': '2017-12-27T10:00:00Z', + 'period_end': '2017-12-27T10:00:00Z', 'event_location': None, 'attendee_name': 'Peter', 'item': None, @@ -249,7 +251,9 @@ TEST_INVOICE_RES = { "description": "Payment fee", 'subevent': None, 'event_date_from': '2017-12-27T10:00:00Z', - 'event_date_to': None, + 'event_date_to': '2017-12-27T10:00:00Z', + 'period_start': '2017-12-27T10:00:00Z', + 'period_end': '2017-12-27T10:00:00Z', 'event_location': None, 'attendee_name': None, 'fee_type': "payment", diff --git a/src/tests/api/test_item_meta_properties.py b/src/tests/api/test_item_meta_properties.py index 7c0bfd346..78afd4fb7 100644 --- a/src/tests/api/test_item_meta_properties.py +++ b/src/tests/api/test_item_meta_properties.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index 4b011a4c9..4b10b80bf 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_membership.py b/src/tests/api/test_membership.py index 356762cb8..c40bc789a 100644 --- a/src/tests/api/test_membership.py +++ b/src/tests/api/test_membership.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_membershiptypes.py b/src/tests/api/test_membershiptypes.py index aa89815e9..7af3e12b4 100644 --- a/src/tests/api/test_membershiptypes.py +++ b/src/tests/api/test_membershiptypes.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_oauth.py b/src/tests/api/test_oauth.py index 8c93b6bf7..8a9054c9c 100644 --- a/src/tests/api/test_oauth.py +++ b/src/tests/api/test_oauth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_order_change.py b/src/tests/api/test_order_change.py index f137e352b..0e628d20a 100644 --- a/src/tests/api/test_order_change.py +++ b/src/tests/api/test_order_change.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -608,7 +608,9 @@ def test_order_create_invoice(token_client, organizer, event, order): 'description': 'Budget Ticket
Attendee: Peter', 'subevent': None, 'event_date_from': '2017-12-27T10:00:00Z', - 'event_date_to': None, + 'event_date_to': '2017-12-27T10:00:00Z', + 'period_start': '2017-12-27T10:00:00Z', + 'period_end': '2017-12-27T10:00:00Z', 'event_location': None, 'fee_type': None, 'fee_internal_type': None, @@ -626,7 +628,9 @@ def test_order_create_invoice(token_client, organizer, event, order): 'description': 'Payment fee', 'subevent': None, 'event_date_from': '2017-12-27T10:00:00Z', - 'event_date_to': None, + 'event_date_to': '2017-12-27T10:00:00Z', + 'period_start': '2017-12-27T10:00:00Z', + 'period_end': '2017-12-27T10:00:00Z', 'event_location': None, 'fee_type': "payment", 'fee_internal_type': None, diff --git a/src/tests/api/test_order_create.py b/src/tests/api/test_order_create.py index fae1581f6..e954da047 100644 --- a/src/tests/api/test_order_create.py +++ b/src/tests/api/test_order_create.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -3134,3 +3134,128 @@ def test_order_create_create_medium(token_client, organizer, event, item, quota, m = organizer.reusable_media.get(identifier=i) assert m.linked_orderposition == o.positions.first() assert m.type == "barcode" + + +@pytest.mark.django_db +def test_order_create_auto_pricing_discount(token_client, organizer, event, item, quota, question, taxrule): + with scopes_disabled(): + event.discounts.create( + condition_min_count=2, + benefit_discount_matching_percent=50, + benefit_only_apply_to_cheapest_n_matches=1, + ) + + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + del res['positions'][0]['positionid'] + del res['positions'][0]['price'] + res['positions'].append(dict(res['positions'][0])) + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + with scopes_disabled(): + o = Order.objects.get(code=resp.data['code']) + p1 = o.positions.first() + p2 = o.positions.last() + assert p1.price == Decimal('23') + assert p2.price == Decimal('11.50') + assert o.total == Decimal('34.75') + + +@pytest.mark.django_db +def test_order_create_auto_pricing_do_not_discount_if_price_explcitly_set(token_client, organizer, event, item, quota, question, taxrule): + with scopes_disabled(): + event.discounts.create( + condition_min_count=2, + benefit_discount_matching_percent=50, + benefit_only_apply_to_cheapest_n_matches=1, + ) + + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + del res['positions'][0]['positionid'] + res['positions'].append(dict(res['positions'][0])) + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + with scopes_disabled(): + o = Order.objects.get(code=resp.data['code']) + p1 = o.positions.first() + p2 = o.positions.last() + assert p1.price == Decimal('23.00') + assert p2.price == Decimal('23.00') + assert o.total == Decimal('46.25') + + +@pytest.mark.django_db +def test_order_create_auto_pricing_believe_wrong_discounts_by_client(token_client, organizer, event, item, quota, question, taxrule): + with scopes_disabled(): + discount = event.discounts.create( + condition_min_count=2, + benefit_discount_matching_percent=50, + benefit_only_apply_to_cheapest_n_matches=1, + ) + + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + del res['positions'][0]['positionid'] + res['positions'].append(dict(res['positions'][0])) + res['positions'][0]['price'] = Decimal("10.00") + res['positions'][1]['price'] = Decimal("7.00") + res['positions'][1]['discount'] = discount.pk + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + with scopes_disabled(): + o = Order.objects.get(code=resp.data['code']) + p1 = o.positions.first() + p2 = o.positions.last() + assert p1.price == Decimal('10.00') + assert p1.discount is None + assert p2.price == Decimal('7.00') + assert p2.discount == discount + assert o.total == Decimal('17.25') + + +@pytest.mark.django_db +def test_order_create_auto_pricing_explicit_discount_not_allowed(token_client, organizer, event, item, quota, question, taxrule): + with scopes_disabled(): + discount = event.discounts.create( + condition_min_count=2, + benefit_discount_matching_percent=50, + benefit_only_apply_to_cheapest_n_matches=1, + ) + + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + del res['positions'][0]['positionid'] + del res['positions'][0]['price'] + res['positions'].append(dict(res['positions'][0])) + res['positions'][1]['discount'] = discount.pk + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 400 + assert resp.data == { + "positions": [ + {}, + { + "discount": ["You can only specify a discount if you do the price computation, but price is not set."] + } + ] + } diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index e4cc678fa..08b7bd16b 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -845,6 +845,7 @@ def test_payment_refund_success(token_client, organizer, event, order, monkeypat organizer.slug, event.slug, order.code, p1.local_id ), format='json', data={ 'amount': '23.00', + 'comment': 'Foo', 'mark_canceled': False, }) assert resp.status_code == 200 @@ -853,6 +854,7 @@ def test_payment_refund_success(token_client, organizer, event, order, monkeypat assert r.provider == "stripe" assert r.state == OrderRefund.REFUND_STATE_DONE assert r.source == OrderRefund.REFUND_SOURCE_ADMIN + assert r.comment == "Foo" @pytest.mark.django_db diff --git a/src/tests/api/test_organizers.py b/src/tests/api/test_organizers.py index 55d9da30b..2109e8de1 100644 --- a/src/tests/api/test_organizers.py +++ b/src/tests/api/test_organizers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_permissions.py b/src/tests/api/test_permissions.py index c3c08f439..91249dd75 100644 --- a/src/tests/api/test_permissions.py +++ b/src/tests/api/test_permissions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_reusable_media.py b/src/tests/api/test_reusable_media.py index a415b3f54..2938e524a 100644 --- a/src/tests/api/test_reusable_media.py +++ b/src/tests/api/test_reusable_media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_saleschannels.py b/src/tests/api/test_saleschannels.py index 09a60004a..75171975b 100644 --- a/src/tests/api/test_saleschannels.py +++ b/src/tests/api/test_saleschannels.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_seatingplans.py b/src/tests/api/test_seatingplans.py index d95a24778..2e7d31140 100644 --- a/src/tests/api/test_seatingplans.py +++ b/src/tests/api/test_seatingplans.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_sendmail.py b/src/tests/api/test_sendmail.py index 4e876ef1e..86ee820a4 100644 --- a/src/tests/api/test_sendmail.py +++ b/src/tests/api/test_sendmail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_shredders.py b/src/tests/api/test_shredders.py index 81d456726..a84d644e4 100644 --- a/src/tests/api/test_shredders.py +++ b/src/tests/api/test_shredders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_subevents.py b/src/tests/api/test_subevents.py index 4bc26bc50..24478d89b 100644 --- a/src/tests/api/test_subevents.py +++ b/src/tests/api/test_subevents.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_taxrules.py b/src/tests/api/test_taxrules.py index b342e09c3..383272e47 100644 --- a/src/tests/api/test_taxrules.py +++ b/src/tests/api/test_taxrules.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_teams.py b/src/tests/api/test_teams.py index 71ce6fd2e..e687d9650 100644 --- a/src/tests/api/test_teams.py +++ b/src/tests/api/test_teams.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_transactions.py b/src/tests/api/test_transactions.py index f38bc2cbc..9a0dea305 100644 --- a/src/tests/api/test_transactions.py +++ b/src/tests/api/test_transactions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_upload.py b/src/tests/api/test_upload.py index 955130f37..7bba13a14 100644 --- a/src/tests/api/test_upload.py +++ b/src/tests/api/test_upload.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_vouchers.py b/src/tests/api/test_vouchers.py index 20b1fde4d..83cc42fef 100644 --- a/src/tests/api/test_vouchers.py +++ b/src/tests/api/test_vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_waitinglist.py b/src/tests/api/test_waitinglist.py index 40ddf1e2b..8178a0fa7 100644 --- a/src/tests/api/test_waitinglist.py +++ b/src/tests/api/test_waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/api/test_webhooks.py b/src/tests/api/test_webhooks.py index c13e34015..1445933b9 100644 --- a/src/tests/api/test_webhooks.py +++ b/src/tests/api/test_webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/__init__.py b/src/tests/base/__init__.py index e0186bbc3..14301c534 100644 --- a/src/tests/base/__init__.py +++ b/src/tests/base/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_addressvalidation.py b/src/tests/base/test_addressvalidation.py index b8e26edc8..a8ee487a3 100644 --- a/src/tests/base/test_addressvalidation.py +++ b/src/tests/base/test_addressvalidation.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_cache.py b/src/tests/base/test_cache.py index f1bf2e953..b7ffaf215 100644 --- a/src/tests/base/test_cache.py +++ b/src/tests/base/test_cache.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_cancelevent.py b/src/tests/base/test_cancelevent.py index d4ef4eea2..dbb97c153 100644 --- a/src/tests/base/test_cancelevent.py +++ b/src/tests/base/test_cancelevent.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -63,6 +63,15 @@ class EventCancelTests(TestCase): generate_invoice(self.order) djmail.outbox = [] + def _cancel_with_dryrun(self, *args, expected_refunds, **kwargs): + dry_run = cancel_event( + *args, **kwargs, dry_run=True + ) + assert dry_run["refund_total"] == expected_refunds + cancel_event( + *args, **kwargs, + ) + @classscope(attr='o') def test_cancel_send_mail(self): gc = self.o.issued_gift_cards.create(currency="EUR") @@ -74,11 +83,11 @@ class EventCancelTests(TestCase): ) self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", - user=None + user=None, expected_refunds=Decimal("46.00") ) assert len(djmail.outbox) == 1 self.order.refresh_from_db() @@ -114,11 +123,11 @@ class EventCancelTests(TestCase): self.op1.blocked = ["admin"] self.op1.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("23.00") ) self.op1.refresh_from_db() @@ -147,11 +156,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("46.00") ) r = self.order.refunds.get() @@ -175,11 +184,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=False, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("46.00") ) self.order.refresh_from_db() @@ -198,11 +207,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="2.00", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("42.00") ) r = self.order.refunds.get() @@ -226,11 +235,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="2.00", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("44.00") ) r = self.order.refunds.get() @@ -252,11 +261,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="2.00", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("44.00") ) r = self.order.refunds.get() @@ -276,11 +285,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="10.00", keep_fee_percentage="10.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("31.40") ) r = self.order.refunds.get() @@ -304,11 +313,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PENDING self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="10.00", keep_fee_percentage="10.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("12.00") ) assert not self.order.refunds.exists() @@ -335,10 +344,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="10.00", keep_fees=[OrderFee.FEE_TYPE_PAYMENT], keep_fee_per_ticket="", - send=False, send_subject="Event canceled", send_message="Event canceled :-(", user=None + send=False, send_subject="Event canceled", send_message="Event canceled :-(", user=None, + expected_refunds=Decimal("36.90") ) r = self.order.refunds.get() assert r.state == OrderRefund.REFUND_STATE_DONE @@ -371,11 +381,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="10.00", keep_fees=[OrderFee.FEE_TYPE_PAYMENT], keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("39.40") ) r = self.order.refunds.get() assert r.amount == Decimal('39.40') @@ -400,11 +410,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, manual_refund=True, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("46.00") ) assert self.order.refunds.count() == 2 @@ -436,11 +446,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, manual_refund=False, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("46.00") ) assert self.order.refunds.count() == 1 @@ -467,11 +477,11 @@ class EventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, manual_refund=True, auto_refund=False, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("46.00") ) assert self.order.refunds.count() == 1 @@ -511,17 +521,26 @@ class SubEventCancelTests(TestCase): generate_invoice(self.order) djmail.outbox = [] + def _cancel_with_dryrun(self, *args, expected_refunds, **kwargs): + dry_run = cancel_event( + *args, **kwargs, dry_run=True + ) + assert dry_run["refund_total"] == expected_refunds + cancel_event( + *args, **kwargs, + ) + @classscope(attr='o') def test_cancel_partially_send_mail_attendees(self): self.op1.attendee_email = 'foo@example.com' self.op1.save() self.op2.attendee_email = 'foo@example.org' self.op2.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) assert len(djmail.outbox) == 2 self.order.refresh_from_db() @@ -532,19 +551,19 @@ class SubEventCancelTests(TestCase): def test_cancel_subevent_range(self): self.op2.subevent = self.se1 self.op2.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, subevents_from=self.se1.date_from - timedelta(days=3), subevents_to=self.se1.date_from - timedelta(days=2), auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_PENDING - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, subevents_from=self.se1.date_from - timedelta(days=3), subevents_to=self.se1.date_from + timedelta(days=2), auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_CANCELED @@ -553,11 +572,11 @@ class SubEventCancelTests(TestCase): def test_cancel_simple_order(self): self.op2.subevent = self.se1 self.op2.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_CANCELED @@ -567,11 +586,11 @@ class SubEventCancelTests(TestCase): self.op2.subevent = self.se1 self.op2.blocked = ["admin"] self.op2.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_PENDING @@ -582,11 +601,11 @@ class SubEventCancelTests(TestCase): @classscope(attr='o') def test_cancel_all_subevents(self): - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_CANCELED @@ -602,11 +621,12 @@ class SubEventCancelTests(TestCase): ) self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self.order.refresh_from_db() + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", - user=None + user=None, expected_refunds=Decimal("23.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_PAID @@ -614,20 +634,20 @@ class SubEventCancelTests(TestCase): @classscope(attr='o') def test_cancel_mixed_order_range(self): - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, subevents_from=self.se1.date_from - timedelta(days=3), subevents_to=self.se1.date_from - timedelta(days=2), auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_PENDING assert self.order.positions.count() == 2 - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=None, subevents_from=self.se1.date_from - timedelta(days=3), subevents_to=self.se1.date_from + timedelta(days=2), auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="", send=True, send_subject="Event canceled", send_message="Event canceled :-( {refund_amount}", - user=None + user=None, expected_refunds=Decimal("0.00") ) self.order.refresh_from_db() assert self.order.status == Order.STATUS_PENDING @@ -651,11 +671,11 @@ class SubEventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="10.00", keep_fee_per_ticket="", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("16.20") ) r = self.order.refunds.get() assert r.state == OrderRefund.REFUND_STATE_DONE @@ -682,11 +702,11 @@ class SubEventCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() - cancel_event( + self._cancel_with_dryrun( self.event.pk, subevent=self.se1.pk, auto_refund=True, keep_fee_fixed="0.00", keep_fee_percentage="0.00", keep_fee_per_ticket="2.00", send=False, send_subject="Event canceled", send_message="Event canceled :-(", - user=None + user=None, expected_refunds=Decimal("21.00") ) r = self.order.refunds.get() assert r.state == OrderRefund.REFUND_STATE_DONE diff --git a/src/tests/base/test_checkin.py b/src/tests/base/test_checkin.py index 7ce184933..04f51d4a6 100644 --- a/src/tests/base/test_checkin.py +++ b/src/tests/base/test_checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_cross_selling.py b/src/tests/base/test_cross_selling.py index ab0d2a5b6..635a0d2e8 100644 --- a/src/tests/base/test_cross_selling.py +++ b/src/tests/base/test_cross_selling.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -414,7 +414,7 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Regular Ticket 42.00 42.00 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} ''' ) check_cart_behaviour( @@ -424,8 +424,8 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Regular Ticket 42.00 42.00 Date2 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} - Tickets (Date2 - Wed, Jan. 1st, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date2 - Wed, Jan. 1, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} ''' ) check_cart_behaviour( @@ -460,8 +460,8 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Regular Ticket 42.00 42.00 Date2 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 2 {prefix_date1} - Tickets (Date2 - Wed, Jan. 1st, 2020 11:00) Reduced Ticket 23.00 11.50 2 {prefix_date2} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 2 {prefix_date1} + Tickets (Date2 - Wed, Jan. 1, 2020 11:00) Reduced Ticket 23.00 11.50 2 {prefix_date2} ''' ) check_cart_behaviour( @@ -475,7 +475,7 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Reduced Ticket 23.00 11.50 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} ''' ) check_cart_behaviour( @@ -490,7 +490,7 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Reduced Ticket 23.00 11.50 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} ''' ) check_cart_behaviour( @@ -506,7 +506,7 @@ def test_2f1r_discount_cross_selling_eventseries_mixed(eventseries): Reduced Ticket 23.00 11.50 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 2 {prefix_date1} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 2 {prefix_date1} ''' ) @@ -531,8 +531,8 @@ def test_2f1r_discount_cross_selling_eventseries_same(eventseries): Regular Ticket 42.00 42.00 Date2 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} - Tickets (Date2 - Wed, Jan. 1st, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date2 - Wed, Jan. 1, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} ''' ) check_cart_behaviour( @@ -546,8 +546,8 @@ def test_2f1r_discount_cross_selling_eventseries_same(eventseries): Regular Ticket 42.00 42.00 Date2 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} - Tickets (Date2 - Wed, Jan. 1st, 2020 11:00) Reduced Ticket 23.00 11.50 2 {prefix_date2} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date2 - Wed, Jan. 1, 2020 11:00) Reduced Ticket 23.00 11.50 2 {prefix_date2} ''' ) check_cart_behaviour( @@ -561,7 +561,7 @@ def test_2f1r_discount_cross_selling_eventseries_same(eventseries): Reduced Ticket 23.00 11.50 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date1 - Wed, Jan. 1st, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} + Tickets (Date1 - Wed, Jan. 1, 2020 10:00) Reduced Ticket 23.00 11.50 1 {prefix_date1} ''' ) check_cart_behaviour( @@ -589,7 +589,7 @@ def test_2f1r_discount_cross_selling_eventseries_same(eventseries): Reduced Ticket 23.00 11.50 Date1 ''', recommendations=f''' Price Discounted Price Max Count Prefix - Tickets (Date2 - Wed, Jan. 1st, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} + Tickets (Date2 - Wed, Jan. 1, 2020 11:00) Reduced Ticket 23.00 11.50 1 {prefix_date2} ''' ) diff --git a/src/tests/base/test_customer_oidc_rp.py b/src/tests/base/test_customer_oidc_rp.py index a0af12928..80ffb4b68 100644 --- a/src/tests/base/test_customer_oidc_rp.py +++ b/src/tests/base/test_customer_oidc_rp.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_datasync.py b/src/tests/base/test_datasync.py index 1d2f35d0b..94fafb1e7 100644 --- a/src/tests/base/test_datasync.py +++ b/src/tests/base/test_datasync.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -327,6 +327,26 @@ def test_enqueue_order_twice(event): SimpleOrderSync.enqueue_order(order, 'testcase_2nd') +class DoNothingSync(SimpleOrderSync): + + def should_sync_order(self, order): + return False + + +@pytest.mark.django_db +def test_should_not_sync(event): + _register_with_fake_plugin_name(datasync_providers, DoNothingSync, 'testplugin') + + DoNothingSync.fake_api_client = FakeSyncAPI() + + for order in event.orders.order_by("code").all(): + DoNothingSync.enqueue_order(order, 'testcase') + + sync_all() + + assert DoNothingSync.fake_api_client.fake_database == {} + + StaticMappingWithAssociations = namedtuple('StaticMappingWithAssociations', ( 'id', 'pretix_model', 'external_object_type', 'pretix_id_field', 'external_id_field', 'property_mappings', 'association_mappings' )) diff --git a/src/tests/base/test_event_clone.py b/src/tests/base/test_event_clone.py index 7f81478a1..c01339be7 100644 --- a/src/tests/base/test_event_clone.py +++ b/src/tests/base/test_event_clone.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_export.py b/src/tests/base/test_export.py index 4355f330e..d07bb576d 100644 --- a/src/tests/base/test_export.py +++ b/src/tests/base/test_export.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_i18n.py b/src/tests/base/test_i18n.py index 5a84a117b..afd7c45ef 100644 --- a/src/tests/base/test_i18n.py +++ b/src/tests/base/test_i18n.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_invoices.py b/src/tests/base/test_invoices.py index 584a2bb01..a3032ce80 100644 --- a/src/tests/base/test_invoices.py +++ b/src/tests/base/test_invoices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -33,7 +33,7 @@ # License for the specific language governing permissions and limitations under the License. import json -from datetime import date, timedelta +from datetime import date, datetime, timedelta, timezone from decimal import Decimal import pytest @@ -42,6 +42,7 @@ from django.utils.itercompat import is_iterable from django.utils.timezone import now from django_countries.fields import Country from django_scopes import scope, scopes_disabled +from i18nfield.strings import LazyI18nString from pretix.base.invoice import addon_aware_groupby from pretix.base.models import ( @@ -62,7 +63,8 @@ def env(): with scope(organizer=o): event = Event.objects.create( organizer=o, name='Dummy', slug='dummy', - date_from=now(), plugins='pretix.plugins.banktransfer' + date_from=datetime(2024, 12, 1, 9, 0, 0, tzinfo=timezone.utc), + plugins='pretix.plugins.banktransfer' ) o = Order.objects.create( code='FOO', event=event, email='dummy@dummy.test', @@ -660,3 +662,154 @@ def test_addon_aware_groupby(): [True, 102, 3.00], ]], ] + + +@pytest.mark.django_db +@pytest.mark.parametrize("period", ["auto", "event_date"]) +def test_period_from_event_start(env, period): + event, order = env + event.settings.invoice_period = period + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == event.date_from + assert l1.period_end == event.date_from + + +@pytest.mark.django_db +@pytest.mark.parametrize("period", ["auto", "event_date"]) +def test_period_from_event_range(env, period): + event, order = env + event.date_to = event.date_from + timedelta(days=1) + event.settings.invoice_period = period + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == event.date_from + assert l1.period_end == event.date_to + + +@pytest.mark.django_db +@pytest.mark.parametrize("period", ["auto", "auto_no_event"]) +def test_period_from_ticket_validity(env, period): + event, order = env + p1 = order.positions.first() + p1.valid_from = datetime(2025, 1, 1, 0, 0, 0, tzinfo=event.timezone) + p1.valid_until = datetime(2025, 12, 31, 23, 59, 59, tzinfo=event.timezone) + p1.save() + event.date_to = event.date_from + timedelta(days=1) + event.settings.invoice_period = period + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == p1.valid_from + assert l1.period_end == p1.valid_until + + +@pytest.mark.django_db +@pytest.mark.parametrize("period", ["auto", "auto_no_event"]) +def test_period_from_subevent(env, period): + event, order = env + event.has_subevents = True + event.save() + se1 = event.subevents.create( + name=event.name, + active=True, + date_from=datetime((now().year + 1), 7, 31, 9, 0, 0, tzinfo=timezone.utc), + date_to=datetime((now().year + 1), 7, 31, 17, 0, 0, tzinfo=timezone.utc), + ) + p1 = order.positions.first() + p1.subevent = se1 + p1.save() + event.date_to = event.date_from + timedelta(days=1) + event.settings.invoice_period = period + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == se1.date_from + assert l1.period_end == se1.date_to + + +@pytest.mark.django_db +@pytest.mark.parametrize("period", ["auto", "auto_no_event"]) +def test_period_from_memberships(env, period): + event, order = env + event.date_to = event.date_from + timedelta(days=1) + event.settings.invoice_period = period + p1 = order.positions.first() + membershiptype = event.organizer.membership_types.create( + name=LazyI18nString({"en": "Week pass"}), + transferable=True, + allow_parallel_usage=False, + max_usages=15, + ) + customer = event.organizer.customers.create( + identifier="8WSAJCJ", + email="foo@example.org", + name_parts={"_legacy": "Foo"}, + name_cached="Foo", + is_verified=False, + ) + m = customer.memberships.create( + membership_type=membershiptype, + granted_in=p1, + date_start=datetime(2021, 4, 1, 0, 0, 0, 0, tzinfo=timezone.utc), + date_end=datetime(2021, 4, 8, 23, 59, 59, 999999, tzinfo=timezone.utc), + attendee_name_parts={ + "_scheme": "given_family", + 'given_name': 'John', + 'family_name': 'Doe', + } + ) + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == m.date_start + assert l1.period_end == m.date_end + + +@pytest.mark.django_db +def test_period_auto_no_event_from_invoice(env): + event, order = env + event.settings.invoice_period = "auto_no_event" + inv = generate_invoice(order) + l1 = inv.lines.first() + assert abs(l1.period_start - now()) < timedelta(seconds=10) + assert abs(l1.period_end - now()) < timedelta(seconds=10) + + +@pytest.mark.django_db +def test_period_always_invoice_date(env): + event, order = env + p1 = order.positions.first() + p1.valid_from = datetime(2025, 1, 1, 0, 0, 0, tzinfo=event.timezone) + p1.valid_until = datetime(2025, 12, 31, 23, 59, 59, tzinfo=event.timezone) + p1.save() + event.settings.invoice_period = "invoice_date" + inv = generate_invoice(order) + l1 = inv.lines.first() + assert abs(l1.period_start - now()) < timedelta(seconds=10) + assert abs(l1.period_end - now()) < timedelta(seconds=10) + + +@pytest.mark.django_db +def test_period_always_event_date(env): + event, order = env + p1 = order.positions.first() + p1.valid_from = datetime(2025, 1, 1, 0, 0, 0, tzinfo=event.timezone) + p1.valid_until = datetime(2025, 12, 31, 23, 59, 59, tzinfo=event.timezone) + p1.save() + event.settings.invoice_period = "event_date" + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == event.date_from + assert l1.period_end == event.date_from + + +@pytest.mark.django_db +def test_period_always_order_date(env): + event, order = env + p1 = order.positions.first() + p1.valid_from = datetime(2025, 1, 1, 0, 0, 0, tzinfo=event.timezone) + p1.valid_until = datetime(2025, 12, 31, 23, 59, 59, tzinfo=event.timezone) + p1.save() + event.settings.invoice_period = "order_date" + inv = generate_invoice(order) + l1 = inv.lines.first() + assert l1.period_start == order.datetime + assert l1.period_end == order.datetime diff --git a/src/tests/base/test_item_validity.py b/src/tests/base/test_item_validity.py index c18ba130f..3eca15ab6 100644 --- a/src/tests/base/test_item_validity.py +++ b/src/tests/base/test_item_validity.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_js_helpers.py b/src/tests/base/test_js_helpers.py index 2fbb477d1..654abeb86 100644 --- a/src/tests/base/test_js_helpers.py +++ b/src/tests/base/test_js_helpers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_mail.py b/src/tests/base/test_mail.py index a8e4c338a..a9ca4f20e 100644 --- a/src/tests/base/test_mail.py +++ b/src/tests/base/test_mail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_memberships.py b/src/tests/base/test_memberships.py index ca3aae96c..1b074ccec 100644 --- a/src/tests/base/test_memberships.py +++ b/src/tests/base/test_memberships.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_metrics.py b/src/tests/base/test_metrics.py index 4f24bd71a..e0246189b 100644 --- a/src/tests/base/test_metrics.py +++ b/src/tests/base/test_metrics.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_middleware.py b/src/tests/base/test_middleware.py index 2b7bd3c4a..87da80a33 100644 --- a/src/tests/base/test_middleware.py +++ b/src/tests/base/test_middleware.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_modelimport_orders.py b/src/tests/base/test_modelimport_orders.py index 634e40664..2cb57aed6 100644 --- a/src/tests/base/test_modelimport_orders.py +++ b/src/tests/base/test_modelimport_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -443,6 +443,37 @@ def test_variation_invalid(user, event, item): assert 'Error while importing value "Foo" for column "Product variation" in line "1": No matching variation was found.' in str(excinfo.value) +@pytest.mark.django_db +@scopes_disabled() +def test_variation_wrong_item(user, event, item): + settings = dict(DEFAULT_SETTINGS) + settings['item'] = 'static:{}'.format(item.pk) + settings['variation'] = 'csv:E' + item2 = Item.objects.create(event=event, name="Ticket", default_price=23) + v1 = item2.variations.create(value='Foo') + data = [{ + 'A': 'Dieter', + 'B': 'Schneider', + 'C': 'schneider@example.org', + 'D': 'Test', + 'E': str(v1.pk), + 'F': '0.00', + 'G': 'US', + 'H': 'Texas', + 'I': 'Foo', + 'J': '2021-06-28 11:00:00', + 'K': '06221/32177-50', + 'L': 'True', + 'M': 'baz', + 'N': 'Seat-1', + }] + with pytest.raises(DataImportError) as excinfo: + import_orders.apply( + args=(event.pk, inputfile_factory(data).id, settings, 'en', user.pk) + ).get() + assert f'Error while importing value "{str(v1.pk)}" for column "Product variation" in line "1": No matching variation was found.' in str(excinfo.value) + + @pytest.mark.django_db @scopes_disabled() def test_variation_dynamic(user, event, item): diff --git a/src/tests/base/test_modelimport_vouchers.py b/src/tests/base/test_modelimport_vouchers.py index 98fd044ef..f0fc81c80 100644 --- a/src/tests/base/test_modelimport_vouchers.py +++ b/src/tests/base/test_modelimport_vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index a4091694a..6f2359db1 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -64,6 +64,7 @@ from pretix.base.models.items import ( from pretix.base.reldate import RelativeDate, RelativeDateWrapper from pretix.base.services.orders import OrderError, cancel_order, perform_order from pretix.base.services.quotas import QuotaAvailability +from pretix.helpers import repeatable_reads_transaction from pretix.testutils.scope import classscope @@ -99,6 +100,29 @@ class BaseQuotaTestCase(TestCase): self.var3 = ItemVariation.objects.create(item=self.item3, value='Fancy') +@pytest.mark.django_db(transaction=True) +@scopes_disabled() +def test_verify_repeatable_read_check(): + if 'sqlite' in settings.DATABASES['default']['ENGINE']: + pytest.skip('Not supported on SQLite') + + o = Organizer.objects.create(name='Dummy', slug='dummy') + event = Event.objects.create( + organizer=o, name='Dummy', slug='dummy', + date_from=now(), plugins='tests.testdummy' + ) + quota = Quota.objects.create(name="Test", size=2, event=event) + + with repeatable_reads_transaction(): + with pytest.raises(ValueError): + qa = QuotaAvailability(full_results=True) + qa.queue(quota) + qa.compute() + qa = QuotaAvailability(full_results=True, allow_repeatable_read=True) + qa.queue(quota) + qa.compute() + + @pytest.mark.usefixtures("fakeredis_client") class QuotaTestCase(BaseQuotaTestCase): @classscope(attr='o') @@ -2465,44 +2489,44 @@ class EventTest(TestCase): ( datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz), datetime.datetime(2025, 3, 9, 22, 0, 0, tzinfo=tz), - 'Sun, March 9th, 2025', - '', - 'Sun, March 9th, 2025 20:00–21:00', - ' ' + 'Sun, March 9, 2025', + '', + 'Sun, March 9, 2025 20:00–21:00', + ' ' '' ), ( datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz), datetime.datetime(2025, 3, 10, 3, 0, 0, tzinfo=tz), - 'March 9th – 10th, 2025', - ' ' + 'March 9 – 10, 2025', + ' ' ' until ' - '', - 'March 9th – 10th, 2025 20:00–02:00', - ' ' + '', + 'March 9 – 10, 2025 20:00–02:00', + ' ' ' until ' - ' ' + ' ' '' ), ( datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz), datetime.datetime(2025, 3, 12, 14, 0, 0, tzinfo=tz), - 'March 9th – 12th, 2025', - ' ' + 'March 9 – 12, 2025', + ' ' ' until ' - '', - 'March 9th – 12th, 2025', - ' ' + '', + 'March 9 – 12, 2025', + ' ' ' until ' - '', + '', ), ( datetime.datetime(2025, 3, 9, 21, 0, 0, tzinfo=tz), None, - 'Sun, March 9th, 2025', - '', - 'Sun, March 9th, 2025 20:00', - ' ' + 'Sun, March 9, 2025', + '', + 'Sun, March 9, 2025 20:00', + ' ' '' ), ) diff --git a/src/tests/base/test_notifications.py b/src/tests/base/test_notifications.py index 79727d867..c3570be10 100644 --- a/src/tests/base/test_notifications.py +++ b/src/tests/base/test_notifications.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 0d9ce2b8d..032c648c8 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_ordersecrets.py b/src/tests/base/test_ordersecrets.py index 54db74d73..f2715e523 100644 --- a/src/tests/base/test_ordersecrets.py +++ b/src/tests/base/test_ordersecrets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_payment.py b/src/tests/base/test_payment.py index 0bc7ab220..9b88e37a7 100644 --- a/src/tests/base/test_payment.py +++ b/src/tests/base/test_payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_permissions.py b/src/tests/base/test_permissions.py index ed1f09590..366c40cfa 100644 --- a/src/tests/base/test_permissions.py +++ b/src/tests/base/test_permissions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_plugins.py b/src/tests/base/test_plugins.py index d9cb02585..bbfdc082b 100644 --- a/src/tests/base/test_plugins.py +++ b/src/tests/base/test_plugins.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_pricing.py b/src/tests/base/test_pricing.py index 92491a83f..feb88d90a 100644 --- a/src/tests/base/test_pricing.py +++ b/src/tests/base/test_pricing.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_pricing_discount.py b/src/tests/base/test_pricing_discount.py index 5b7dc801e..1d1aa3de8 100644 --- a/src/tests/base/test_pricing_discount.py +++ b/src/tests/base/test_pricing_discount.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_questions.py b/src/tests/base/test_questions.py index ca5101d82..23f5b434c 100644 --- a/src/tests/base/test_questions.py +++ b/src/tests/base/test_questions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_registry.py b/src/tests/base/test_registry.py index c170a1d95..ce1e22754 100644 --- a/src/tests/base/test_registry.py +++ b/src/tests/base/test_registry.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_reldate.py b/src/tests/base/test_reldate.py index 0e340cd9e..d5f0db9ec 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_rich_text.py b/src/tests/base/test_rich_text.py index cfec1df68..c893b7d3b 100644 --- a/src/tests/base/test_rich_text.py +++ b/src/tests/base/test_rich_text.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -73,10 +73,34 @@ from pretix.base.templatetags.rich_text import ( 'goodsite.com', 'https://goodsite.com.evilsite.com', ), + ( + 'evilsite.com/bad/path/', + 'https://evilsite.com/deep/path', + ), + ( + 'evilsite.com/deep', + 'evilsite.com/deep', + ), ( 'evilsite.com', 'evilsite.com', ), + ( + 'evilsite.com', + 'evilsite.com', + ), + ( + 'https://foo:bar@goodsite.com', + 'https://foo:bar@evilsite.com/deep/path', + ), + ( + '@pretix@pretix.social', + '@pretix@pretix.social', + ), + ( + '@pretix@pretix.social', + 'https://evilsite.social/@pretix', + ), ("broken", "broken"), ], ) diff --git a/src/tests/base/test_runperiodic.py b/src/tests/base/test_runperiodic.py index f7a0d4562..52e7a7679 100644 --- a/src/tests/base/test_runperiodic.py +++ b/src/tests/base/test_runperiodic.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_secrets.py b/src/tests/base/test_secrets.py index c64067d63..1c6ea4bf0 100644 --- a/src/tests/base/test_secrets.py +++ b/src/tests/base/test_secrets.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_settings.py b/src/tests/base/test_settings.py index d6a7ac728..34bc4f40e 100644 --- a/src/tests/base/test_settings.py +++ b/src/tests/base/test_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_shredders.py b/src/tests/base/test_shredders.py index a7f6aabe6..b8ebd7828 100644 --- a/src/tests/base/test_shredders.py +++ b/src/tests/base/test_shredders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_taxrules.py b/src/tests/base/test_taxrules.py index 6498ab967..095d0276b 100644 --- a/src/tests/base/test_taxrules.py +++ b/src/tests/base/test_taxrules.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_templatetag.py b/src/tests/base/test_templatetag.py index a9c9518de..d310deedd 100644 --- a/src/tests/base/test_templatetag.py +++ b/src/tests/base/test_templatetag.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_timeframes.py b/src/tests/base/test_timeframes.py index 246873143..80d51f50a 100644 --- a/src/tests/base/test_timeframes.py +++ b/src/tests/base/test_timeframes.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -48,10 +48,10 @@ ref_date = date(2023, 3, 28) (ref_date, 'days_tomorrow', date(2023, 3, 29), date(2023, 3, 29), None), (ref_date, 'days_next7', date(2023, 3, 29), date(2023, 4, 4), None), (ref_date, 'days_next14', date(2023, 3, 29), date(2023, 4, 11), None), - (ref_date, 'week_this', date(2023, 3, 27), date(2023, 4, 2), 'W 13, 2023 - March 27th – April 2nd, 2023'), - (ref_date, 'week_to_date', date(2023, 3, 27), date(2023, 3, 28), 'W 13, 2023 - March 27th – 28th, 2023'), - (ref_date, 'week_previous', date(2023, 3, 20), date(2023, 3, 26), 'W 12, 2023 - March 20th – 26th, 2023'), - (ref_date, 'week_next', date(2023, 4, 3), date(2023, 4, 9), 'W 14, 2023 - April 3rd – 9th, 2023'), + (ref_date, 'week_this', date(2023, 3, 27), date(2023, 4, 2), 'W 13, 2023 - March 27 – April 2, 2023'), + (ref_date, 'week_to_date', date(2023, 3, 27), date(2023, 3, 28), 'W 13, 2023 - March 27 – 28, 2023'), + (ref_date, 'week_previous', date(2023, 3, 20), date(2023, 3, 26), 'W 12, 2023 - March 20 – 26, 2023'), + (ref_date, 'week_next', date(2023, 4, 3), date(2023, 4, 9), 'W 14, 2023 - April 3 – 9, 2023'), (ref_date, 'month_this', date(2023, 3, 1), date(2023, 3, 31), 'March 2023'), (ref_date, 'month_to_date', date(2023, 3, 1), date(2023, 3, 28), 'March 2023'), (ref_date, 'month_previous', date(2023, 2, 1), date(2023, 2, 28), 'February 2023'), diff --git a/src/tests/base/test_timeline.py b/src/tests/base/test_timeline.py index c61befa1e..718bc645c 100644 --- a/src/tests/base/test_timeline.py +++ b/src/tests/base/test_timeline.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_updatecheck.py b/src/tests/base/test_updatecheck.py index 6bcfba3da..1317eef29 100644 --- a/src/tests/base/test_updatecheck.py +++ b/src/tests/base/test_updatecheck.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_urls.py b/src/tests/base/test_urls.py index 2b6ed8566..5acedad4c 100644 --- a/src/tests/base/test_urls.py +++ b/src/tests/base/test_urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py index 36602d9ca..1963cd130 100644 --- a/src/tests/base/test_vat_id_validation.py +++ b/src/tests/base/test_vat_id_validation.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_waitinglist.py b/src/tests/base/test_waitinglist.py index ec7472d7f..df90eaa87 100644 --- a/src/tests/base/test_waitinglist.py +++ b/src/tests/base/test_waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/base/test_webhooks.py b/src/tests/base/test_webhooks.py index 5affcecf8..ab5a905dd 100644 --- a/src/tests/base/test_webhooks.py +++ b/src/tests/base/test_webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/__init__.py b/src/tests/concurrency_tests/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/concurrency_tests/__init__.py +++ b/src/tests/concurrency_tests/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/conftest.py b/src/tests/concurrency_tests/conftest.py index 454110429..eea651711 100644 --- a/src/tests/concurrency_tests/conftest.py +++ b/src/tests/concurrency_tests/conftest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/test_api_order_creation_code.py b/src/tests/concurrency_tests/test_api_order_creation_code.py index fcb2a1aa3..158891121 100644 --- a/src/tests/concurrency_tests/test_api_order_creation_code.py +++ b/src/tests/concurrency_tests/test_api_order_creation_code.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/test_cart_creation_locking.py b/src/tests/concurrency_tests/test_cart_creation_locking.py index a18f75348..6fcac8a96 100644 --- a/src/tests/concurrency_tests/test_cart_creation_locking.py +++ b/src/tests/concurrency_tests/test_cart_creation_locking.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/test_order_creation_locking.py b/src/tests/concurrency_tests/test_order_creation_locking.py index f67f4ed21..4220131f5 100644 --- a/src/tests/concurrency_tests/test_order_creation_locking.py +++ b/src/tests/concurrency_tests/test_order_creation_locking.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/test_order_paid_locking.py b/src/tests/concurrency_tests/test_order_paid_locking.py index c4853d4a0..5a713982d 100644 --- a/src/tests/concurrency_tests/test_order_paid_locking.py +++ b/src/tests/concurrency_tests/test_order_paid_locking.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/concurrency_tests/utils.py b/src/tests/concurrency_tests/utils.py index 59f65add6..6fc63d5d3 100644 --- a/src/tests/concurrency_tests/utils.py +++ b/src/tests/concurrency_tests/utils.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/conftest.py b/src/tests/conftest.py index abedc3192..418c20ab6 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/const.py b/src/tests/const.py index b744653fe..248bb6f3a 100644 --- a/src/tests/const.py +++ b/src/tests/const.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/__init__.py b/src/tests/control/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/control/__init__.py +++ b/src/tests/control/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_auth.py b/src/tests/control/test_auth.py index 5a23a56af..8500c77f3 100644 --- a/src/tests/control/test_auth.py +++ b/src/tests/control/test_auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_checkins.py b/src/tests/control/test_checkins.py index 45cb19d19..bad7b5303 100644 --- a/src/tests/control/test_checkins.py +++ b/src/tests/control/test_checkins.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_customer.py b/src/tests/control/test_customer.py index 1d660986b..a973a1986 100644 --- a/src/tests/control/test_customer.py +++ b/src/tests/control/test_customer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_devices.py b/src/tests/control/test_devices.py index d3a678410..afbca7b3b 100644 --- a/src/tests/control/test_devices.py +++ b/src/tests/control/test_devices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index 4708d8c9c..904247056 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_export.py b/src/tests/control/test_export.py index dfa7d366c..ed28cb869 100644 --- a/src/tests/control/test_export.py +++ b/src/tests/control/test_export.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_giftcards.py b/src/tests/control/test_giftcards.py index 8488d80d5..eb6215212 100644 --- a/src/tests/control/test_giftcards.py +++ b/src/tests/control/test_giftcards.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index dccadfc12..ef938206d 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_mail_settings_preview.py b/src/tests/control/test_mail_settings_preview.py index 8d2972ec4..141fc043d 100644 --- a/src/tests/control/test_mail_settings_preview.py +++ b/src/tests/control/test_mail_settings_preview.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_modelimport.py b/src/tests/control/test_modelimport.py index f8726a7f3..31801950d 100644 --- a/src/tests/control/test_modelimport.py +++ b/src/tests/control/test_modelimport.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index d72148875..577cf0efe 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_orders_bulk.py b/src/tests/control/test_orders_bulk.py index aa86160c2..e3bd60d64 100644 --- a/src/tests/control/test_orders_bulk.py +++ b/src/tests/control/test_orders_bulk.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_organizer.py b/src/tests/control/test_organizer.py index 52feecafb..d1d42f5a0 100644 --- a/src/tests/control/test_organizer.py +++ b/src/tests/control/test_organizer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_permissions.py b/src/tests/control/test_permissions.py index d2a35284d..3b3c11fc0 100644 --- a/src/tests/control/test_permissions.py +++ b/src/tests/control/test_permissions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_reusable_media.py b/src/tests/control/test_reusable_media.py index 9a4d9a12b..2ef20df84 100644 --- a/src/tests/control/test_reusable_media.py +++ b/src/tests/control/test_reusable_media.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_search.py b/src/tests/control/test_search.py index b2d898763..83c94cc01 100644 --- a/src/tests/control/test_search.py +++ b/src/tests/control/test_search.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_shredders.py b/src/tests/control/test_shredders.py index 2c03eb9e2..c409716ad 100644 --- a/src/tests/control/test_shredders.py +++ b/src/tests/control/test_shredders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_subevents.py b/src/tests/control/test_subevents.py index 55d41f38b..2b82b7094 100644 --- a/src/tests/control/test_subevents.py +++ b/src/tests/control/test_subevents.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_taxrates.py b/src/tests/control/test_taxrates.py index 78cc1953e..62a58a26d 100644 --- a/src/tests/control/test_taxrates.py +++ b/src/tests/control/test_taxrates.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_teams.py b/src/tests/control/test_teams.py index 6391414a4..65c3f2b0b 100644 --- a/src/tests/control/test_teams.py +++ b/src/tests/control/test_teams.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_updatecheck.py b/src/tests/control/test_updatecheck.py index b6fcc63bf..3bf41ffdb 100644 --- a/src/tests/control/test_updatecheck.py +++ b/src/tests/control/test_updatecheck.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_user.py b/src/tests/control/test_user.py index 553ab55b6..8c80ac280 100644 --- a/src/tests/control/test_user.py +++ b/src/tests/control/test_user.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_views.py b/src/tests/control/test_views.py index 6f06dd104..d73021ddd 100644 --- a/src/tests/control/test_views.py +++ b/src/tests/control/test_views.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_vouchers.py b/src/tests/control/test_vouchers.py index 81682f2f2..874b44574 100644 --- a/src/tests/control/test_vouchers.py +++ b/src/tests/control/test_vouchers.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_waitinglist.py b/src/tests/control/test_waitinglist.py index 13221bbdb..ea92dae2c 100644 --- a/src/tests/control/test_waitinglist.py +++ b/src/tests/control/test_waitinglist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/control/test_webhooks.py b/src/tests/control/test_webhooks.py index e59e5bd34..97f1e773b 100644 --- a/src/tests/control/test_webhooks.py +++ b/src/tests/control/test_webhooks.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/doc/__init__.py b/src/tests/doc/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/doc/__init__.py +++ b/src/tests/doc/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/doc/test_signals.py b/src/tests/doc/test_signals.py index af73a530d..7526fa101 100644 --- a/src/tests/doc/test_signals.py +++ b/src/tests/doc/test_signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/__init__.py b/src/tests/helpers/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/helpers/__init__.py +++ b/src/tests/helpers/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_daterange.py b/src/tests/helpers/test_daterange.py index 8acd60716..1779e0852 100644 --- a/src/tests/helpers/test_daterange.py +++ b/src/tests/helpers/test_daterange.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -50,8 +50,8 @@ def test_same_day_german(): def test_same_day_english(): with translation.override('en'): df = date(2003, 2, 1) - assert daterange(df, df) == "Sat, Feb. 1st, 2003" - assert daterange(df, df, as_html=True) == '' + assert daterange(df, df) == "Sat, Feb. 1, 2003" + assert daterange(df, df, as_html=True) == '' def test_same_day_spanish(): @@ -82,10 +82,10 @@ def test_same_month_english(): with translation.override('en'): df = date(2003, 2, 1) dt = date(2003, 2, 3) - assert daterange(df, dt) == "Feb. 1st – 3rd, 2003" - assert daterange(df, dt, as_html=True) == ' ' \ + assert daterange(df, dt) == "Feb. 1 – 3, 2003" + assert daterange(df, dt, as_html=True) == ' ' \ ' until ' \ - '' + '' def test_same_month_spanish(): @@ -112,10 +112,10 @@ def test_same_year_english(): with translation.override('en'): df = date(2003, 2, 1) dt = date(2003, 4, 3) - assert daterange(df, dt) == "Feb. 1st – April 3rd, 2003" - assert daterange(df, dt, as_html=True) == ' ' \ + assert daterange(df, dt) == "Feb. 1 – April 3, 2003" + assert daterange(df, dt, as_html=True) == ' ' \ ' until ' \ - '' + '' def test_same_year_spanish(): diff --git a/src/tests/helpers/test_format.py b/src/tests/helpers/test_format.py index 6165fe622..5ab5c2569 100644 --- a/src/tests/helpers/test_format.py +++ b/src/tests/helpers/test_format.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_i18n.py b/src/tests/helpers/test_i18n.py index 07cee55ad..1c1306dce 100644 --- a/src/tests/helpers/test_i18n.py +++ b/src/tests/helpers/test_i18n.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_jsonlogic.py b/src/tests/helpers/test_jsonlogic.py index 674c1c943..ab73f8295 100644 --- a/src/tests/helpers/test_jsonlogic.py +++ b/src/tests/helpers/test_jsonlogic.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_jsonlogic_boolalg.py b/src/tests/helpers/test_jsonlogic_boolalg.py index db17bc7f1..63c11f934 100644 --- a/src/tests/helpers/test_jsonlogic_boolalg.py +++ b/src/tests/helpers/test_jsonlogic_boolalg.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_safe_openpyxl.py b/src/tests/helpers/test_safe_openpyxl.py index 64e53e155..050878ca7 100644 --- a/src/tests/helpers/test_safe_openpyxl.py +++ b/src/tests/helpers/test_safe_openpyxl.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_thumb.py b/src/tests/helpers/test_thumb.py index 9757b1d05..29a7904f6 100644 --- a/src/tests/helpers/test_thumb.py +++ b/src/tests/helpers/test_thumb.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/helpers/test_urls.py b/src/tests/helpers/test_urls.py index 300a731e6..eabbed0f3 100644 --- a/src/tests/helpers/test_urls.py +++ b/src/tests/helpers/test_urls.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/multidomain/__init__.py b/src/tests/multidomain/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/multidomain/__init__.py +++ b/src/tests/multidomain/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/multidomain/test_middlewares.py b/src/tests/multidomain/test_middlewares.py index acbba5c03..9fc488d41 100644 --- a/src/tests/multidomain/test_middlewares.py +++ b/src/tests/multidomain/test_middlewares.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/multidomain/test_plugin_handler.py b/src/tests/multidomain/test_plugin_handler.py index 384765ef3..8a8057cb1 100644 --- a/src/tests/multidomain/test_plugin_handler.py +++ b/src/tests/multidomain/test_plugin_handler.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/multidomain/test_templatetag.py b/src/tests/multidomain/test_templatetag.py index a95edf83b..3a7d36190 100644 --- a/src/tests/multidomain/test_templatetag.py +++ b/src/tests/multidomain/test_templatetag.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/multidomain/test_urlreverse.py b/src/tests/multidomain/test_urlreverse.py index 69c13f67b..61211c4ef 100644 --- a/src/tests/multidomain/test_urlreverse.py +++ b/src/tests/multidomain/test_urlreverse.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/__init__.py b/src/tests/plugins/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/__init__.py +++ b/src/tests/plugins/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/autocheckin/__init__.py b/src/tests/plugins/autocheckin/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/autocheckin/__init__.py +++ b/src/tests/plugins/autocheckin/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/autocheckin/conftest.py b/src/tests/plugins/autocheckin/conftest.py index bbd24d975..d8b3b9e48 100644 --- a/src/tests/plugins/autocheckin/conftest.py +++ b/src/tests/plugins/autocheckin/conftest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/autocheckin/test_api.py b/src/tests/plugins/autocheckin/test_api.py index 8ec9bb96e..af5f45762 100644 --- a/src/tests/plugins/autocheckin/test_api.py +++ b/src/tests/plugins/autocheckin/test_api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/autocheckin/test_checkin.py b/src/tests/plugins/autocheckin/test_checkin.py index 3c765877a..fb757778b 100644 --- a/src/tests/plugins/autocheckin/test_checkin.py +++ b/src/tests/plugins/autocheckin/test_checkin.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -54,7 +54,7 @@ def test_sales_channel_all(event, item, order, checkin_list): mode=AutoCheckinRule.MODE_PLACED, all_sales_channels=True, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -67,12 +67,12 @@ def test_sales_channel_limit(event, item, order, checkin_list): all_sales_channels=False, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert not order.positions.first().checkins.exists() acr.limit_sales_channels.add(order.sales_channel) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -84,7 +84,7 @@ def test_items_all(event, item, order, checkin_list): mode=AutoCheckinRule.MODE_PLACED, all_products=True, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -97,12 +97,12 @@ def test_items_limit(event, item, order, checkin_list): all_products=False, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert not order.positions.first().checkins.exists() acr.limit_products.add(item) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -124,7 +124,7 @@ def test_variations_limit_mixed_order(event, item, order, checkin_list): ) acr.limit_variations.add(var) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() assert not order.positions.last().checkins.exists() @@ -143,19 +143,19 @@ def test_variations_limit(event, item, order, checkin_list): all_products=False, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert not order.positions.first().checkins.exists() acr.limit_variations.add(var) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() order.positions.first().checkins.all().delete() acr.limit_products.add(item) acr.limit_variations.clear() - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -170,7 +170,7 @@ def test_mode_placed(event, item, order, checkin_list): order_paid.send(event, order=order) assert not order.positions.first().checkins.exists() - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert order.positions.first().checkins.exists() @@ -182,7 +182,7 @@ def test_mode_paid(event, item, order, checkin_list): mode=AutoCheckinRule.MODE_PAID, ) - order_placed.send(event, order=order) + order_placed.send(event, order=order, bulk=False) assert not order.positions.first().checkins.exists() order_paid.send(event, order=order) diff --git a/src/tests/plugins/autocheckin/test_control.py b/src/tests/plugins/autocheckin/test_control.py index 04b36e12c..610400f60 100644 --- a/src/tests/plugins/autocheckin/test_control.py +++ b/src/tests/plugins/autocheckin/test_control.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/badges/__init__.py b/src/tests/plugins/badges/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/badges/__init__.py +++ b/src/tests/plugins/badges/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/badges/test_api.py b/src/tests/plugins/badges/test_api.py index 0bb854f3b..f7feca60f 100644 --- a/src/tests/plugins/badges/test_api.py +++ b/src/tests/plugins/badges/test_api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/badges/test_control.py b/src/tests/plugins/badges/test_control.py index 1615258c9..9053e18a1 100644 --- a/src/tests/plugins/badges/test_control.py +++ b/src/tests/plugins/badges/test_control.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/badges/test_pdf.py b/src/tests/plugins/badges/test_pdf.py index 57dd2e863..8dcdc8554 100644 --- a/src/tests/plugins/badges/test_pdf.py +++ b/src/tests/plugins/badges/test_pdf.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/__init__.py b/src/tests/plugins/banktransfer/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/banktransfer/__init__.py +++ b/src/tests/plugins/banktransfer/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_actions.py b/src/tests/plugins/banktransfer/test_actions.py index 81d0e5ad8..11dd96311 100644 --- a/src/tests/plugins/banktransfer/test_actions.py +++ b/src/tests/plugins/banktransfer/test_actions.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_api.py b/src/tests/plugins/banktransfer/test_api.py index 6d3c9107e..4300c8525 100644 --- a/src/tests/plugins/banktransfer/test_api.py +++ b/src/tests/plugins/banktransfer/test_api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_csvparser.py b/src/tests/plugins/banktransfer/test_csvparser.py index c2aea00ac..9939a1ba5 100644 --- a/src/tests/plugins/banktransfer/test_csvparser.py +++ b/src/tests/plugins/banktransfer/test_csvparser.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_import.py b/src/tests/plugins/banktransfer/test_import.py index f0cb54a5f..925289119 100644 --- a/src/tests/plugins/banktransfer/test_import.py +++ b/src/tests/plugins/banktransfer/test_import.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_mt940.py b/src/tests/plugins/banktransfer/test_mt940.py index 8a6a46aa6..3fa4c8e93 100644 --- a/src/tests/plugins/banktransfer/test_mt940.py +++ b/src/tests/plugins/banktransfer/test_mt940.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_parsing.py b/src/tests/plugins/banktransfer/test_parsing.py index e338c3c6d..78bac2aae 100644 --- a/src/tests/plugins/banktransfer/test_parsing.py +++ b/src/tests/plugins/banktransfer/test_parsing.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_refund.py b/src/tests/plugins/banktransfer/test_refund.py index 8cdcb8a51..02b689e8a 100644 --- a/src/tests/plugins/banktransfer/test_refund.py +++ b/src/tests/plugins/banktransfer/test_refund.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/banktransfer/test_refund_export.py b/src/tests/plugins/banktransfer/test_refund_export.py index 527985ecb..b054afff7 100644 --- a/src/tests/plugins/banktransfer/test_refund_export.py +++ b/src/tests/plugins/banktransfer/test_refund_export.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal/__init__.py b/src/tests/plugins/paypal/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/tests/plugins/paypal/__init__.py +++ b/src/tests/plugins/paypal/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal/test_checkout.py b/src/tests/plugins/paypal/test_checkout.py index 0dd923a46..9eb068736 100644 --- a/src/tests/plugins/paypal/test_checkout.py +++ b/src/tests/plugins/paypal/test_checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal/test_settings.py b/src/tests/plugins/paypal/test_settings.py index d9a4729d1..eb78411dd 100644 --- a/src/tests/plugins/paypal/test_settings.py +++ b/src/tests/plugins/paypal/test_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal/test_webhook.py b/src/tests/plugins/paypal/test_webhook.py index 31c60cb9c..1d5c74516 100644 --- a/src/tests/plugins/paypal/test_webhook.py +++ b/src/tests/plugins/paypal/test_webhook.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal2/__init__.py b/src/tests/plugins/paypal2/__init__.py index c4b4deab3..fe627f44f 100644 --- a/src/tests/plugins/paypal2/__init__.py +++ b/src/tests/plugins/paypal2/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal2/test_checkout.py b/src/tests/plugins/paypal2/test_checkout.py index 41b71345a..4bea8edc3 100644 --- a/src/tests/plugins/paypal2/test_checkout.py +++ b/src/tests/plugins/paypal2/test_checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal2/test_settings.py b/src/tests/plugins/paypal2/test_settings.py index 686c37dba..24a2a74ef 100644 --- a/src/tests/plugins/paypal2/test_settings.py +++ b/src/tests/plugins/paypal2/test_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/paypal2/test_webhook.py b/src/tests/plugins/paypal2/test_webhook.py index 390b1c7dd..2c0cf68a2 100644 --- a/src/tests/plugins/paypal2/test_webhook.py +++ b/src/tests/plugins/paypal2/test_webhook.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/sendmail/__init__.py b/src/tests/plugins/sendmail/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/sendmail/__init__.py +++ b/src/tests/plugins/sendmail/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/sendmail/conftest.py b/src/tests/plugins/sendmail/conftest.py index 6c4d7ef32..3081c975b 100644 --- a/src/tests/plugins/sendmail/conftest.py +++ b/src/tests/plugins/sendmail/conftest.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/sendmail/test_rules.py b/src/tests/plugins/sendmail/test_rules.py index bb2900b0a..58f26aaae 100644 --- a/src/tests/plugins/sendmail/test_rules.py +++ b/src/tests/plugins/sendmail/test_rules.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/sendmail/test_sendmail.py b/src/tests/plugins/sendmail/test_sendmail.py index d43408b7b..e1322b393 100644 --- a/src/tests/plugins/sendmail/test_sendmail.py +++ b/src/tests/plugins/sendmail/test_sendmail.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/stripe/__init__.py b/src/tests/plugins/stripe/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/stripe/__init__.py +++ b/src/tests/plugins/stripe/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/stripe/test_checkout.py b/src/tests/plugins/stripe/test_checkout.py index fbeb0c4cd..ee6a77684 100644 --- a/src/tests/plugins/stripe/test_checkout.py +++ b/src/tests/plugins/stripe/test_checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/stripe/test_provider.py b/src/tests/plugins/stripe/test_provider.py index 9234709f6..43f9e6317 100644 --- a/src/tests/plugins/stripe/test_provider.py +++ b/src/tests/plugins/stripe/test_provider.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/stripe/test_settings.py b/src/tests/plugins/stripe/test_settings.py index 0b3dc1f04..12ecbf4b2 100644 --- a/src/tests/plugins/stripe/test_settings.py +++ b/src/tests/plugins/stripe/test_settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/stripe/test_webhook.py b/src/tests/plugins/stripe/test_webhook.py index 40b98480d..3885e6762 100644 --- a/src/tests/plugins/stripe/test_webhook.py +++ b/src/tests/plugins/stripe/test_webhook.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/test_checkinlist.py b/src/tests/plugins/test_checkinlist.py index 795474a77..6f53bd35b 100644 --- a/src/tests/plugins/test_checkinlist.py +++ b/src/tests/plugins/test_checkinlist.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/test_returnurl.py b/src/tests/plugins/test_returnurl.py index 7b55c1d6c..c37a1346f 100644 --- a/src/tests/plugins/test_returnurl.py +++ b/src/tests/plugins/test_returnurl.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/ticketoutputpdf/__init__.py b/src/tests/plugins/ticketoutputpdf/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/plugins/ticketoutputpdf/__init__.py +++ b/src/tests/plugins/ticketoutputpdf/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/ticketoutputpdf/test_api.py b/src/tests/plugins/ticketoutputpdf/test_api.py index 7f6551e0b..533eb1bf3 100644 --- a/src/tests/plugins/ticketoutputpdf/test_api.py +++ b/src/tests/plugins/ticketoutputpdf/test_api.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/ticketoutputpdf/test_control.py b/src/tests/plugins/ticketoutputpdf/test_control.py index c217be890..e0ca09b1d 100644 --- a/src/tests/plugins/ticketoutputpdf/test_control.py +++ b/src/tests/plugins/ticketoutputpdf/test_control.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/ticketoutputpdf/test_defaults_and_copy.py b/src/tests/plugins/ticketoutputpdf/test_defaults_and_copy.py index 8f555ee93..d5b12ba90 100644 --- a/src/tests/plugins/ticketoutputpdf/test_defaults_and_copy.py +++ b/src/tests/plugins/ticketoutputpdf/test_defaults_and_copy.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py index d4e9a6bc3..11bb8be74 100644 --- a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py +++ b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/__init__.py b/src/tests/presale/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/presale/__init__.py +++ b/src/tests/presale/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_bundle_prices.py b/src/tests/presale/test_bundle_prices.py index ca56062e7..8693dea28 100644 --- a/src/tests/presale/test_bundle_prices.py +++ b/src/tests/presale/test_bundle_prices.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index da78c4628..219a46ed9 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 553db80cf..2241e4300 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -5488,3 +5488,22 @@ class CustomerCheckoutTestCase(BaseCheckoutTestCase, TestCase): with scopes_disabled(): assert order.positions.first().used_membership == m_correct1 assert order.positions.first().attendee_name == 'John Doe' + + def test_giftcard_customer_offered(self): + with scopes_disabled(): + gc = self.orga.issued_gift_cards.create(currency="EUR", customer=self.customer) + gc.transactions.create(value=23, acceptor=self.orga) + ugc = self.customer.usable_gift_cards() + assert len(ugc) == 1 + CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10) + ) + self.client.post('/%s/%s/checkout/customer/' % (self.orga.slug, self.event.slug), { + 'customer_mode': 'login', + 'login-email': 'john@example.org', + 'login-password': 'foo', + }, follow=True) + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + assert 'Gift card' in response.content.decode() + assert '(1 available)' in response.content.decode() diff --git a/src/tests/presale/test_checkoutflow.py b/src/tests/presale/test_checkoutflow.py index 055b2415c..1d4a39e0a 100644 --- a/src/tests/presale/test_checkoutflow.py +++ b/src/tests/presale/test_checkoutflow.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_customer.py b/src/tests/presale/test_customer.py index 01474734f..82d18f85a 100644 --- a/src/tests/presale/test_customer.py +++ b/src/tests/presale/test_customer.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_event.py b/src/tests/presale/test_event.py index 4e5fb89b0..078dbb735 100644 --- a/src/tests/presale/test_event.py +++ b/src/tests/presale/test_event.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1621,7 +1621,7 @@ class EventLocaleTest(EventTestMixin, SoupTest): '/%s/%s/' % (self.orga.slug, self.event.slug) ) self.assertEqual(response.status_code, 200) - self.assertIn('Thu, Dec. 26th,', response.rendered_content) + self.assertIn('Thu, Dec. 26,', response.rendered_content) self.assertIn('14:00', response.rendered_content) def test_english_region_US(self): @@ -1631,7 +1631,7 @@ class EventLocaleTest(EventTestMixin, SoupTest): '/%s/%s/' % (self.orga.slug, self.event.slug) ) self.assertEqual(response.status_code, 200) - self.assertIn('Thu, Dec. 26th,', response.rendered_content) + self.assertIn('Thu, Dec. 26,', response.rendered_content) self.assertIn('2 p.m.', response.rendered_content) def test_german_region_US(self): diff --git a/src/tests/presale/test_locale.py b/src/tests/presale/test_locale.py index 4ed4b62f6..bb1874b1b 100644 --- a/src/tests/presale/test_locale.py +++ b/src/tests/presale/test_locale.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_oidc_op.py b/src/tests/presale/test_oidc_op.py index 161c16d55..af3e76b9d 100644 --- a/src/tests/presale/test_oidc_op.py +++ b/src/tests/presale/test_oidc_op.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_order_change.py b/src/tests/presale/test_order_change.py index af49fc0f1..0bcafeb4e 100644 --- a/src/tests/presale/test_order_change.py +++ b/src/tests/presale/test_order_change.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -1915,6 +1915,47 @@ class OrderChangeAddonsTest(BaseOrdersTest): r = self.order.refunds.get() assert r.provider == 'giftcard' + def test_refund_giftcard_to_customer_account(self): + with scopes_disabled(): + customer = self.orga.customers.create(email='john@example.org', is_verified=True) + customer.set_password('foo') + customer.save() + + self.order.customer = customer + self.event.settings.cancel_allow_user_paid_refund_as_giftcard = 'force' + with scopes_disabled(): + gc = customer.usable_gift_cards() + assert len(gc) == 0 + OrderPosition.objects.create( + order=self.order, + item=self.workshop1, + variation=None, + price=Decimal("12"), + addon_to=self.ticket_pos, + attendee_name_parts={'full_name': "Peter"}, + ) + self.order.status = Order.STATUS_PAID + self.order.total += Decimal("12") + self.order.save() + self.order.payments.create(provider='testdummy_partialrefund', amount=self.order.total, + state=OrderPayment.PAYMENT_STATE_CONFIRMED) + + response = self.client.post( + '/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {}, + follow=True + ) + doc = BeautifulSoup(response.content.decode(), "lxml") + form_data = extract_form_fields(doc.select('.main-box form')[0]) + form_data['confirm'] = 'true' + self.client.post( + '/%s/%s/order/%s/%s/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + form_data, follow=True + ) + + with scopes_disabled(): + gc = customer.usable_gift_cards() + assert len(gc) == 1 + def test_attendee(self): self.workshop2a.default_price = Decimal('0.00') self.workshop2a.save() diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 8ce916cae..be4d7d033 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -702,6 +702,46 @@ class OrdersTest(BaseOrdersTest): assert r.provider == "giftcard" assert r.amount == Decimal('20.00') + def test_orders_cancel_autorefund_gift_card_customer(self): + self.order.status = Order.STATUS_PAID + self.order.save() + with scopes_disabled(): + customer = self.orga.customers.create(email='john@example.org', is_verified=True) + customer.set_password('foo') + customer.save() + self.order.customer = customer + self.order.save() + with scopes_disabled(): + self.order.payments.create(provider='testdummy_partialrefund', amount=self.order.total, + state=OrderPayment.PAYMENT_STATE_CONFIRMED) + self.event.settings.cancel_allow_user_paid = True + self.event.settings.cancel_allow_user_paid_refund_as_giftcard = 'option' + gc = customer.usable_gift_cards() + assert len(gc) == 0 + response = self.client.get( + '/%s/%s/order/%s/%s/cancel' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret) + ) + assert response.status_code == 200 + assert 'manually' not in response.content.decode() + assert "gift card" in response.content.decode() + response = self.client.post( + '/%s/%s/order/%s/%s/cancel/do' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), { + 'giftcard': 'true' + }, follow=True) + self.assertRedirects(response, + '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret), + target_status_code=200) + assert "gift card" in response.content.decode() + self.order.refresh_from_db() + assert self.order.status == Order.STATUS_CANCELED + with scopes_disabled(): + r = self.order.refunds.get() + assert r.provider == "giftcard" + assert r.amount == Decimal('23.00') + gc = customer.usable_gift_cards() + assert len(gc) == 1 + def test_orders_cancel_unpaid_fee(self): self.order.status = Order.STATUS_PENDING self.order.save() @@ -1583,6 +1623,35 @@ class OrdersTest(BaseOrdersTest): assert self.order.status == Order.STATUS_PAID assert gc.value == Decimal('87.00') + def test_change_paymentmethod_customeraccount_giftcard_offered(self): + with scopes_disabled(): + self.orga.settings.customer_accounts = True + customer = self.orga.customers.create(email='john@example.org', is_verified=True) + customer.set_password('foo') + customer.save() + self.order.customer = customer + self.order.payments.create( + provider='manual', + state=OrderPayment.PAYMENT_STATE_CONFIRMED, + amount=Decimal('10.00'), + ) + gc = self.orga.issued_gift_cards.create(currency="EUR", customer=customer) + gc.transactions.create(value=100, acceptor=self.orga) + ugc = customer.usable_gift_cards() + assert len(ugc) == 1 + r = self.client.post('/%s/account/login' % (self.orga.slug), { + 'email': 'john@example.org', + 'password': 'foo', + }) + assert r.status_code == 302 + r = self.client.get('/%s/account/' % (self.orga.slug)) + assert r.status_code == 200 + response = self.client.get( + '/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + ) + assert 'Gift card' in response.content.decode() + assert '1 available' in response.content.decode() + def test_answer_download_token(self): with scopes_disabled(): q = self.event.questions.create(question="Foo", type="F") diff --git a/src/tests/presale/test_organizer_page.py b/src/tests/presale/test_organizer_page.py index 053f281e0..ead641455 100644 --- a/src/tests/presale/test_organizer_page.py +++ b/src/tests/presale/test_organizer_page.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_style.py b/src/tests/presale/test_style.py index e71124f88..158cfef25 100644 --- a/src/tests/presale/test_style.py +++ b/src/tests/presale/test_style.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_timemachine.py b/src/tests/presale/test_timemachine.py index 0eed1de6d..92261b328 100644 --- a/src/tests/presale/test_timemachine.py +++ b/src/tests/presale/test_timemachine.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/presale/test_widget.py b/src/tests/presale/test_widget.py index a11b3c909..9b338ec91 100644 --- a/src/tests/presale/test_widget.py +++ b/src/tests/presale/test_widget.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. @@ -169,7 +169,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "target_url": "http://example.com/ccc/30c3/", "subevent": None, "name": "30C3", - "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26th, {self.event.date_from.year} 00:00", + "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26, {self.event.date_from.year} 00:00", "frontpage_text": "", "location": "", "currency": "EUR", @@ -375,7 +375,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "target_url": "http://example.com/ccc/30c3/", "subevent": None, "name": "30C3", - "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26th, {self.event.date_from.year} 00:00", + "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26, {self.event.date_from.year} 00:00", "frontpage_text": "", "location": "", "currency": "EUR", @@ -435,7 +435,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "target_url": "http://example.com/ccc/30c3/", "subevent": None, "name": "30C3", - "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26th, {self.event.date_from.year} 00:00", + "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26, {self.event.date_from.year} 00:00", "frontpage_text": "", "location": "", "currency": "EUR", @@ -520,7 +520,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "target_url": "http://example.com/ccc/30c3/", "subevent": None, "name": "30C3", - "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26th, {self.event.date_from.year} 00:00", + "date_range": f"{self.event.date_from.strftime('%a')}, Dec. 26, {self.event.date_from.year} 00:00", "frontpage_text": "", "location": "", "currency": "EUR", @@ -627,9 +627,9 @@ class WidgetCartTest(CartTestMixin, TestCase): 'poweredby': 'ticketing powered by pretix', 'has_more_events': False, 'events': [ - {'name': 'Present', 'date_range': 'Tue, Jan. 1st, 2019 11:00', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, + {'name': 'Present', 'date_range': 'Tue, Jan. 1, 2019 11:00', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se1.pk, 'location': ''}, - {'name': 'Future', 'date_range': 'Fri, Jan. 4th, 2019 11:00', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, + {'name': 'Future', 'date_range': 'Fri, Jan. 4, 2019 11:00', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se2.pk, 'location': ''} ] } @@ -659,14 +659,14 @@ class WidgetCartTest(CartTestMixin, TestCase): [ None, {'day': 1, 'date': '2019-01-01', 'events': [ - {'name': 'Present', 'time': '11:00', 'continued': False, 'date_range': 'Tue, Jan. 1st, 2019 11:00', + {'name': 'Present', 'time': '11:00', 'continued': False, 'date_range': 'Tue, Jan. 1, 2019 11:00', 'location': '', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se1.pk}]}, {'day': 2, 'date': '2019-01-02', 'events': []}, {'day': 3, 'date': '2019-01-03', 'events': []}, {'day': 4, 'date': '2019-01-04', 'events': [ - {'name': 'Future', 'time': '11:00', 'continued': False, 'date_range': 'Fri, Jan. 4th, 2019 11:00', + {'name': 'Future', 'time': '11:00', 'continued': False, 'date_range': 'Fri, Jan. 4, 2019 11:00', 'location': '', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se2.pk}]}, @@ -732,21 +732,21 @@ class WidgetCartTest(CartTestMixin, TestCase): 'week': [2019, 1], 'poweredby': 'ticketing powered by pretix', 'days': [ - {'day_formatted': 'Mon, Dec 31st', 'date': '2018-12-31', 'events': [], 'today': False}, - {'day_formatted': 'Tue, Jan 1st', 'date': '2019-01-01', 'events': [ - {'name': 'Present', 'time': '11:00', 'continued': False, 'date_range': 'Tue, Jan. 1st, 2019 11:00', + {'day_formatted': 'Mon, Dec 31', 'date': '2018-12-31', 'events': [], 'today': False}, + {'day_formatted': 'Tue, Jan 1', 'date': '2019-01-01', 'events': [ + {'name': 'Present', 'time': '11:00', 'continued': False, 'date_range': 'Tue, Jan. 1, 2019 11:00', 'location': '', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se1.pk}], 'today': True}, - {'day_formatted': 'Wed, Jan 2nd', 'date': '2019-01-02', 'events': [], 'today': False}, - {'day_formatted': 'Thu, Jan 3rd', 'date': '2019-01-03', 'events': [], 'today': False}, - {'day_formatted': 'Fri, Jan 4th', 'date': '2019-01-04', 'events': [ - {'name': 'Future', 'time': '11:00', 'continued': False, 'date_range': 'Fri, Jan. 4th, 2019 11:00', + {'day_formatted': 'Wed, Jan 2', 'date': '2019-01-02', 'events': [], 'today': False}, + {'day_formatted': 'Thu, Jan 3', 'date': '2019-01-03', 'events': [], 'today': False}, + {'day_formatted': 'Fri, Jan 4', 'date': '2019-01-04', 'events': [ + {'name': 'Future', 'time': '11:00', 'continued': False, 'date_range': 'Fri, Jan. 4, 2019 11:00', 'location': '', 'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'event_url': 'http://example.com/ccc/30c3/', 'subevent': se2.pk}], 'today': False}, - {'day_formatted': 'Sat, Jan 5th', 'date': '2019-01-05', 'events': [], 'today': False}, - {'day_formatted': 'Sun, Jan 6th', 'date': '2019-01-06', 'events': [], 'today': False} + {'day_formatted': 'Sat, Jan 5', 'date': '2019-01-05', 'events': [], 'today': False}, + {'day_formatted': 'Sun, Jan 6', 'date': '2019-01-06', 'events': [], 'today': False} ], } @@ -773,17 +773,17 @@ class WidgetCartTest(CartTestMixin, TestCase): 'poweredby': 'ticketing powered by pretix', 'events': [ {'availability': {'color': 'none', 'text': 'Event series'}, - 'date_range': 'Jan. 1st – 4th, 2019', + 'date_range': 'Jan. 1 – 4, 2019', 'event_url': 'http://example.com/ccc/30c3/', 'location': '', 'name': '30C3'}, {'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, - 'date_range': 'Tue, Jan. 1st, 2019 10:00', + 'date_range': 'Tue, Jan. 1, 2019 10:00', 'location': '', 'event_url': 'http://example.com/ccc/present/', 'name': 'Present'}, {'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, - 'date_range': 'Fri, Jan. 4th, 2019 10:00', + 'date_range': 'Fri, Jan. 4, 2019 10:00', 'location': '', 'event_url': 'http://example.com/ccc/future/', 'name': 'Future'} @@ -884,7 +884,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'day': 1, 'events': [{'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'continued': False, - 'date_range': 'Tue, Jan. 1st, 2019 10:00', + 'date_range': 'Tue, Jan. 1, 2019 10:00', 'event_url': 'http://example.com/ccc/present/', 'name': 'Present', 'location': '', @@ -892,7 +892,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'time': '10:00'}, {'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'continued': False, - 'date_range': 'Tue, Jan. 1st, 2019 11:00', + 'date_range': 'Tue, Jan. 1, 2019 11:00', 'event_url': 'http://example.com/ccc/30c3/', 'name': 'Present', 'location': '', @@ -904,7 +904,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'day': 4, 'events': [{'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'continued': False, - 'date_range': 'Fri, Jan. 4th, 2019 10:00', + 'date_range': 'Fri, Jan. 4, 2019 10:00', 'event_url': 'http://example.com/ccc/future/', 'name': 'Future', 'location': '', @@ -912,7 +912,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'time': '10:00'}, {'availability': {'color': 'none', 'text': 'More info', 'reason': 'unknown'}, 'continued': False, - 'date_range': 'Fri, Jan. 4th, 2019 11:00', + 'date_range': 'Fri, Jan. 4, 2019 11:00', 'event_url': 'http://example.com/ccc/30c3/', 'name': 'Future', 'location': '', diff --git a/src/tests/settings.py b/src/tests/settings.py index 39ab239a1..e5d6f96de 100644 --- a/src/tests/settings.py +++ b/src/tests/settings.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/test_crashing.py b/src/tests/test_crashing.py index a6db06e44..6356f83c0 100644 --- a/src/tests/test_crashing.py +++ b/src/tests/test_crashing.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/__init__.py b/src/tests/testdummy/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummy/__init__.py +++ b/src/tests/testdummy/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/apps.py b/src/tests/testdummy/apps.py index 818642209..e85c69de4 100644 --- a/src/tests/testdummy/apps.py +++ b/src/tests/testdummy/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/auth.py b/src/tests/testdummy/auth.py index ccfef92c8..9cb558c7b 100644 --- a/src/tests/testdummy/auth.py +++ b/src/tests/testdummy/auth.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/models.py b/src/tests/testdummy/models.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummy/models.py +++ b/src/tests/testdummy/models.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/payment.py b/src/tests/testdummy/payment.py index c8b4f2345..827ce3de9 100644 --- a/src/tests/testdummy/payment.py +++ b/src/tests/testdummy/payment.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/signals.py b/src/tests/testdummy/signals.py index d2bd30ae2..3fcc84a8f 100644 --- a/src/tests/testdummy/signals.py +++ b/src/tests/testdummy/signals.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummy/ticketoutput.py b/src/tests/testdummy/ticketoutput.py index df02557ad..204f4a661 100644 --- a/src/tests/testdummy/ticketoutput.py +++ b/src/tests/testdummy/ticketoutput.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyhidden/__init__.py b/src/tests/testdummyhidden/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummyhidden/__init__.py +++ b/src/tests/testdummyhidden/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyhidden/apps.py b/src/tests/testdummyhidden/apps.py index 23e499b80..788763145 100644 --- a/src/tests/testdummyhidden/apps.py +++ b/src/tests/testdummyhidden/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyhybrid/__init__.py b/src/tests/testdummyhybrid/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummyhybrid/__init__.py +++ b/src/tests/testdummyhybrid/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyhybrid/apps.py b/src/tests/testdummyhybrid/apps.py index fac15229a..bcd78473c 100644 --- a/src/tests/testdummyhybrid/apps.py +++ b/src/tests/testdummyhybrid/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyorga/__init__.py b/src/tests/testdummyorga/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummyorga/__init__.py +++ b/src/tests/testdummyorga/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyorga/apps.py b/src/tests/testdummyorga/apps.py index d7af97e5b..afa831eb6 100644 --- a/src/tests/testdummyorga/apps.py +++ b/src/tests/testdummyorga/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyorgarestricted/__init__.py b/src/tests/testdummyorgarestricted/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummyorgarestricted/__init__.py +++ b/src/tests/testdummyorgarestricted/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyorgarestricted/apps.py b/src/tests/testdummyorgarestricted/apps.py index 324b99545..397113538 100644 --- a/src/tests/testdummyorgarestricted/apps.py +++ b/src/tests/testdummyorgarestricted/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyrestricted/__init__.py b/src/tests/testdummyrestricted/__init__.py index 9fd5bdc50..9616a7bf6 100644 --- a/src/tests/testdummyrestricted/__init__.py +++ b/src/tests/testdummyrestricted/__init__.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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. diff --git a/src/tests/testdummyrestricted/apps.py b/src/tests/testdummyrestricted/apps.py index ea3d938fb..685674947 100644 --- a/src/tests/testdummyrestricted/apps.py +++ b/src/tests/testdummyrestricted/apps.py @@ -1,8 +1,8 @@ # # This file is part of pretix (Community Edition). # -# Copyright (C) 2014-2020 Raphael Michel and contributors -# Copyright (C) 2020-2021 rami.io GmbH and contributors +# 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.