From f244c11f5eee3c9b015b1ae8062095091734f927 Mon Sep 17 00:00:00 2001 From: pretix translation bot Date: Tue, 26 Jul 2022 11:23:52 +0200 Subject: [PATCH 01/54] Update translations (#2737) Co-authored-by: Raphael Michel --- src/pretix/locale/de/LC_MESSAGES/django.po | 70 +++++++------------ src/pretix/locale/de/LC_MESSAGES/djangojs.po | 6 +- .../locale/de_Informal/LC_MESSAGES/django.po | 70 +++++++------------ .../de_Informal/LC_MESSAGES/djangojs.po | 6 +- 4 files changed, 58 insertions(+), 94 deletions(-) diff --git a/src/pretix/locale/de/LC_MESSAGES/django.po b/src/pretix/locale/de/LC_MESSAGES/django.po index 8f2c0a0ef..7a774a011 100644 --- a/src/pretix/locale/de/LC_MESSAGES/django.po +++ b/src/pretix/locale/de/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-25 16:59+0000\n" -"PO-Revision-Date: 2022-07-22 11:11+0000\n" +"PO-Revision-Date: 2022-07-26 09:01+0000\n" "Last-Translator: Raphael Michel \n" "Language-Team: German \n" @@ -1076,22 +1076,16 @@ msgid "Event end date" msgstr "Veranstaltungsenddatum" #: pretix/base/exporters/items.py:50 -#, fuzzy -#| msgid "Product name" msgid "Product data" -msgstr "Produktbezeichnung" +msgstr "Produktdaten" #: pretix/base/exporters/items.py:56 -#, fuzzy -#| msgid "Product" msgid "Product ID" -msgstr "Produkt" +msgstr "Produkt-ID" #: pretix/base/exporters/items.py:57 -#, fuzzy -#| msgid "Variation" msgid "Variation ID" -msgstr "Variante" +msgstr "Varianten-ID" #: pretix/base/exporters/items.py:58 pretix/base/models/items.py:108 #: pretix/base/pdf.py:141 @@ -2444,18 +2438,14 @@ msgid "Outstanding payments" msgstr "Offener Betrag" #: pretix/base/invoice.py:615 -#, fuzzy -#| msgid "Issued gift cards" msgctxt "invoice" msgid "Paid by gift card" -msgstr "Ausgestellte Wertgutscheine" +msgstr "Mit Wertgutschein beglichen" #: pretix/base/invoice.py:618 -#, fuzzy -#| msgid "Pending amount" msgctxt "invoice" msgid "Remaining amount" -msgstr "Offener Betrag" +msgstr "Restbetrag" #: pretix/base/invoice.py:658 msgctxt "invoice" @@ -2596,7 +2586,7 @@ msgstr "" #: pretix/base/models/checkin.py:60 msgid "Allow checking in add-on tickets by scanning the main ticket" -msgstr "" +msgstr "Check-in von Zusatzprodukten durch Scan des Haupttickets erlauben" #: pretix/base/models/checkin.py:62 msgid "" @@ -2604,6 +2594,9 @@ msgid "" "there is always exactly one matching add-on ticket. Ambiguous scans will be " "rejected.." msgstr "" +"Ein Scan ist nur möglich, wenn die Check-in-Liste so konfiguriert ist, dass " +"es immer genau ein passendes Zusatzprodukt gibt. Uneindeutige Scans werden " +"abgelehnt." #: pretix/base/models/checkin.py:66 pretix/control/navigation.py:579 #: pretix/control/templates/pretixcontrol/organizers/gates.html:5 @@ -2691,10 +2684,8 @@ msgid "Ticket type not allowed here" msgstr "Ticketart hier nicht erlaubt" #: pretix/base/models/checkin.py:278 -#, fuzzy -#| msgid "Ticket code y position (mm)" msgid "Ticket code is ambiguous on list" -msgstr "Ticket-Code-y-Position (mm)" +msgstr "Ticket-Code ist nicht eindeutig auf der Liste" #: pretix/base/models/checkin.py:279 msgid "Server error" @@ -5872,18 +5863,13 @@ msgid "Random (default, works with all pretix apps)" msgstr "Zufällig (Standard, funktioniert mit allen pretix-Apps)" #: pretix/base/secrets.py:146 -#, fuzzy -#| msgid "" -#| "pretix signature scheme 1 (for very large events, does not work with " -#| "pretixSCAN on iOS and changes semantics of offline scanning – please " -#| "refer to documentation or support for details)" msgid "" "pretix signature scheme 1 (for very large events, changes semantics of " "offline scanning – please refer to documentation or support for details)" msgstr "" -"pretix Signaturverfahren 1 (für sehr große Veranstaltungen, funktioniert " -"nicht mit pretixSCAN auf iOS und ändert die Funktionsweise des Offline-" -"Modus, bitte informieren Sie sich in der Dokumentation oder beim Support)" +"pretix Signaturverfahren 1 (für sehr große Veranstaltungen, ändert die " +"Funktionsweise des Offline-Modus, bitte informiere dich in der Dokumentation " +"oder beim Support)" #: pretix/base/services/cancelevent.py:221 #: pretix/base/services/cancelevent.py:279 @@ -8081,6 +8067,8 @@ msgstr "" msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" +"Zeige keine Stornogebühr für Benutzer an, wenn die Stornierung angefragt " +"wird." #: pretix/base/settings.py:1532 pretix/base/settings.py:1542 msgid "All refunds are issued to the original payment method" @@ -9944,6 +9932,9 @@ msgid "" "must select a specific set of products for this check-in list, only " "including the possible add-on products." msgstr "" +"Wenn Sie erlauben, Zusatzprodukte mit dem Ticket-Code des Hauptproduktes zu " +"scannen, müssen Sie eine Auswahl bestimmter Produkte treffen, die nur die " +"Zusatzprodukte enthält." #: pretix/control/forms/event.py:82 msgid "Use languages" @@ -12555,16 +12546,12 @@ msgid "An unidentified type email has been sent." msgstr "Eine E-Mail unbekannten Typs wurde verschickt." #: pretix/control/logdisplay.py:369 -#, fuzzy -#| msgid "" -#| "The email has been sent without attachments since they would have been " -#| "too large to be likely to arrive." msgid "" "The email has been sent without attached tickets since they would have been " "too large to be likely to arrive." msgstr "" -"Eine E-Mail wurde ohne Anhänge verschickt, da diese größer sind als " -"üblicherweise akzeptiert sind." +"Eine E-Mail wurde ohne angehängte Tickets verschickt, da diese größer sind " +"als üblicherweise akzeptiert sind." #: pretix/control/logdisplay.py:371 msgid "A custom email has been sent." @@ -14286,18 +14273,12 @@ msgstr "" "verwenden, damit diese Optionen funktionieren." #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:51 -#, fuzzy -#| msgid "" -#| "If you make use of these advanced options, we recommend using our Android " -#| "and Desktop apps. Custom check-in rules do not work offline with our iOS " -#| "scanning app." msgid "" "If you make use of these advanced options, we recommend using our Android " "and Desktop apps." msgstr "" "Wenn Sie diese erweiterten Optionen verwenden, empfehlen wir unsere Android- " -"und Desktop-Apps. Eigene Regeln funktionieren derzeit in unserer iOS-App " -"nicht offline." +"und Desktop-Apps." #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:65 msgid "Custom check-in rule" @@ -27049,10 +27030,8 @@ msgstr "Bestellung umbuchen" #: pretix/presale/templates/pretixpresale/event/order.html:378 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:27 -#, fuzzy -#| msgid "You cannot cancel this order." msgid "You can request to cancel this order." -msgstr "Sie können diese Bestellung nicht stornieren." +msgstr "Sie können eine Stornierung dieser Bestellung anfragen." #: pretix/presale/templates/pretixpresale/event/order.html:381 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:30 @@ -27061,6 +27040,9 @@ msgid "" "receive a full refund or if a cancellation fee is deducted according to " "their cancellation policy." msgstr "" +"Wenn die Anfrage genehmigt wird, wird der Veranstalter aufgrund seiner " +"Stornobedingungen festlegen, ob Sie eine volle Erstattung erhalten oder ob " +"eine Stornogebühr abgezogen wird." #: pretix/presale/templates/pretixpresale/event/order.html:387 #: pretix/presale/templates/pretixpresale/event/order.html:423 diff --git a/src/pretix/locale/de/LC_MESSAGES/djangojs.po b/src/pretix/locale/de/LC_MESSAGES/djangojs.po index 7890681d6..e642c09bf 100644 --- a/src/pretix/locale/de/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-25 16:59+0000\n" -"PO-Revision-Date: 2022-04-28 18:04+0000\n" +"PO-Revision-Date: 2022-07-26 08:58+0000\n" "Last-Translator: Raphael Michel \n" "Language-Team: German \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12\n" +"X-Generator: Weblate 4.13.1\n" #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62 @@ -290,7 +290,7 @@ msgstr "Bestellung storniert" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62 msgid "Ticket code is ambiguous on list" -msgstr "" +msgstr "Ticket-Code ist nicht eindeutig auf der Liste" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63 msgid "Checked-in Tickets" diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po index 9da5f14d1..ae71966d3 100644 --- a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po +++ b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-25 16:59+0000\n" -"PO-Revision-Date: 2022-07-22 11:11+0000\n" +"PO-Revision-Date: 2022-07-26 08:58+0000\n" "Last-Translator: Raphael Michel \n" "Language-Team: German (informal) \n" @@ -1077,22 +1077,16 @@ msgid "Event end date" msgstr "Veranstaltungsenddatum" #: pretix/base/exporters/items.py:50 -#, fuzzy -#| msgid "Product name" msgid "Product data" -msgstr "Produktbezeichnung" +msgstr "Produktdaten" #: pretix/base/exporters/items.py:56 -#, fuzzy -#| msgid "Product" msgid "Product ID" -msgstr "Produkt" +msgstr "Produkt-ID" #: pretix/base/exporters/items.py:57 -#, fuzzy -#| msgid "Variation" msgid "Variation ID" -msgstr "Variante" +msgstr "Varianten-ID" #: pretix/base/exporters/items.py:58 pretix/base/models/items.py:108 #: pretix/base/pdf.py:141 @@ -2444,18 +2438,14 @@ msgid "Outstanding payments" msgstr "Offener Betrag" #: pretix/base/invoice.py:615 -#, fuzzy -#| msgid "Issued gift cards" msgctxt "invoice" msgid "Paid by gift card" -msgstr "Ausgestellte Wertgutscheine" +msgstr "Mit Wertgutschein beglichen" #: pretix/base/invoice.py:618 -#, fuzzy -#| msgid "Pending amount" msgctxt "invoice" msgid "Remaining amount" -msgstr "Offener Betrag" +msgstr "Restbetrag" #: pretix/base/invoice.py:658 msgctxt "invoice" @@ -2596,7 +2586,7 @@ msgstr "" #: pretix/base/models/checkin.py:60 msgid "Allow checking in add-on tickets by scanning the main ticket" -msgstr "" +msgstr "Check-in von Zusatzprodukten durch Scan des Haupttickets erlauben" #: pretix/base/models/checkin.py:62 msgid "" @@ -2604,6 +2594,9 @@ msgid "" "there is always exactly one matching add-on ticket. Ambiguous scans will be " "rejected.." msgstr "" +"Ein Scan ist nur möglich, wenn die Check-in-Liste so konfiguriert ist, dass " +"es immer genau ein passendes Zusatzprodukt gibt. Uneindeutige Scans werden " +"abgelehnt." #: pretix/base/models/checkin.py:66 pretix/control/navigation.py:579 #: pretix/control/templates/pretixcontrol/organizers/gates.html:5 @@ -2691,10 +2684,8 @@ msgid "Ticket type not allowed here" msgstr "Ticketart hier nicht erlaubt" #: pretix/base/models/checkin.py:278 -#, fuzzy -#| msgid "Ticket code y position (mm)" msgid "Ticket code is ambiguous on list" -msgstr "Ticket-Code-y-Position (mm)" +msgstr "Ticket-Code ist nicht eindeutig auf der Liste" #: pretix/base/models/checkin.py:279 msgid "Server error" @@ -5864,18 +5855,13 @@ msgid "Random (default, works with all pretix apps)" msgstr "Zufällig (Standard, funktioniert mit allen pretix-Apps)" #: pretix/base/secrets.py:146 -#, fuzzy -#| msgid "" -#| "pretix signature scheme 1 (for very large events, does not work with " -#| "pretixSCAN on iOS and changes semantics of offline scanning – please " -#| "refer to documentation or support for details)" msgid "" "pretix signature scheme 1 (for very large events, changes semantics of " "offline scanning – please refer to documentation or support for details)" msgstr "" -"pretix Signaturverfahren 1 (für sehr große Veranstaltungen, funktioniert " -"nicht mit pretixSCAN auf iOS und ändert die Funktionsweise des Offline-" -"Modus, bitte informiere dich in der Dokumentation oder beim Support)" +"pretix Signaturverfahren 1 (für sehr große Veranstaltungen, ändert die " +"Funktionsweise des Offline-Modus, bitte informiere dich in der Dokumentation " +"oder beim Support)" #: pretix/base/services/cancelevent.py:221 #: pretix/base/services/cancelevent.py:279 @@ -8070,6 +8056,8 @@ msgstr "" msgid "" "Do not show the cancellation fee to users when they request cancellation." msgstr "" +"Zeige keine Stornogebühr für Benutzer an, wenn die Stornierung angefragt " +"wird." #: pretix/base/settings.py:1532 pretix/base/settings.py:1542 msgid "All refunds are issued to the original payment method" @@ -9928,6 +9916,9 @@ msgid "" "must select a specific set of products for this check-in list, only " "including the possible add-on products." msgstr "" +"Wenn du erlaubst, Zusatzprodukte mit dem Ticket-Code des Hauptproduktes zu " +"scannen, musst du eine Auswahl bestimmter Produkte treffen, die nur die " +"Zusatzprodukte enthält." #: pretix/control/forms/event.py:82 msgid "Use languages" @@ -12535,16 +12526,12 @@ msgid "An unidentified type email has been sent." msgstr "Eine E-Mail unbekannten Typs wurde verschickt." #: pretix/control/logdisplay.py:369 -#, fuzzy -#| msgid "" -#| "The email has been sent without attachments since they would have been " -#| "too large to be likely to arrive." msgid "" "The email has been sent without attached tickets since they would have been " "too large to be likely to arrive." msgstr "" -"Eine E-Mail wurde ohne Anhänge verschickt, da diese größer sind als " -"üblicherweise akzeptiert sind." +"Eine E-Mail wurde ohne angehängte Tickets verschickt, da diese größer sind " +"als üblicherweise akzeptiert sind." #: pretix/control/logdisplay.py:371 msgid "A custom email has been sent." @@ -14263,18 +14250,12 @@ msgstr "" "verwendest, damit diese Optionen funktionieren." #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:51 -#, fuzzy -#| msgid "" -#| "If you make use of these advanced options, we recommend using our Android " -#| "and Desktop apps. Custom check-in rules do not work offline with our iOS " -#| "scanning app." msgid "" "If you make use of these advanced options, we recommend using our Android " "and Desktop apps." msgstr "" "Wenn du diese erweiterten Optionen verwendest, empfehlen wir unsere Android- " -"und Desktop-Apps. Eigene Regeln funktionieren derzeit in unserer iOS-App " -"nicht offline." +"und Desktop-Apps." #: pretix/control/templates/pretixcontrol/checkin/list_edit.html:65 msgid "Custom check-in rule" @@ -26995,10 +26976,8 @@ msgstr "Bestellung umbuchen" #: pretix/presale/templates/pretixpresale/event/order.html:378 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:27 -#, fuzzy -#| msgid "You cannot cancel this order." msgid "You can request to cancel this order." -msgstr "Du kannst diese Bestellung nicht stornieren." +msgstr "Du kannst eine Stornierung dieser Bestellung anfragen." #: pretix/presale/templates/pretixpresale/event/order.html:381 #: pretix/presale/templates/pretixpresale/event/order_cancel.html:30 @@ -27007,6 +26986,9 @@ msgid "" "receive a full refund or if a cancellation fee is deducted according to " "their cancellation policy." msgstr "" +"Wenn die Anfrage genehmigt wird, wird der Veranstalter aufgrund seiner " +"Stornobedingungen festlegen, ob du eine volle Erstattung erhältst oder ob " +"eine Stornogebühr abgezogen wird." #: pretix/presale/templates/pretixpresale/event/order.html:387 #: pretix/presale/templates/pretixpresale/event/order.html:423 diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/djangojs.po b/src/pretix/locale/de_Informal/LC_MESSAGES/djangojs.po index f400a1b2a..da1e9187e 100644 --- a/src/pretix/locale/de_Informal/LC_MESSAGES/djangojs.po +++ b/src/pretix/locale/de_Informal/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-25 16:59+0000\n" -"PO-Revision-Date: 2022-04-28 18:04+0000\n" +"PO-Revision-Date: 2022-07-26 08:58+0000\n" "Last-Translator: Raphael Michel \n" "Language-Team: German (informal) \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12\n" +"X-Generator: Weblate 4.13.1\n" #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56 #: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62 @@ -290,7 +290,7 @@ msgstr "Bestellung storniert" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62 msgid "Ticket code is ambiguous on list" -msgstr "" +msgstr "Ticket-Code ist nicht eindeutig auf der Liste" #: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63 msgid "Checked-in Tickets" From d7922571e7fac095bd8e16319060e70dbf86ec3e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 26 Jul 2022 10:59:22 +0200 Subject: [PATCH 02/54] Docs: Add missing constraints on order codes --- doc/api/resources/orders.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 429fdb58b..1282dc3ec 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -853,7 +853,7 @@ Creating orders You can supply the following fields of the resource: - * ``code`` (optional) + * ``code`` (optional) – Only ``A-Z`` and ``0-9``, but without ``O`` and ``1``. * ``status`` (optional) – Defaults to pending for non-free orders and paid for free orders. You can only set this to ``"n"`` for pending or ``"p"`` for paid. We will create a payment object for this order either in state ``created`` or in state ``confirmed``, depending on this value. If you create a paid order, the ``order_paid`` signal will From 8a8171bd242af0b2f21d454a460fad2f4f0f817d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 27 Jul 2022 11:12:58 +0200 Subject: [PATCH 03/54] Expose name scheme over the settings API, including details for device clients --- src/pretix/api/serializers/event.py | 27 ++++++++++++++++++++++++++- src/pretix/base/settings.py | 7 ++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index e2f3b507d..2e8ba1dc1 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -54,7 +54,10 @@ from pretix.base.models.items import SubEventItem, SubEventItemVariation from pretix.base.services.seating import ( SeatProtected, generate_seats, validate_plan_change, ) -from pretix.base.settings import LazyI18nStringList, validate_event_settings +from pretix.base.settings import ( + PERSON_NAME_SALUTATIONS, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, + LazyI18nStringList, validate_event_settings, +) from pretix.base.signals import api_event_settings_fields logger = logging.getLogger(__name__) @@ -777,6 +780,7 @@ class EventSettingsSerializer(SettingsSerializer): 'logo_image_large', 'logo_show_title', 'og_image', + 'name_scheme', ] def __init__(self, *args, **kwargs): @@ -842,4 +846,25 @@ class DeviceEventSettingsSerializer(EventSettingsSerializer): 'invoice_address_from_country', 'invoice_address_from_tax_id', 'invoice_address_from_vat_id', + 'name_scheme', ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['_name_scheme_fields'] = serializers.JSONField( + read_only=True, + default=[{"key": k, "label": str(v), "weight": w} for k, v, w, *__ in PERSON_NAME_SCHEMES.get(self.event.settings.name_scheme)['fields']] + ) + self.fields['_name_scheme_salutations'] = serializers.JSONField( + read_only=True, + default=[{"key": k, "label": str(v)} for k, v in PERSON_NAME_SALUTATIONS] + ) + self.fields['_name_scheme_titles'] = serializers.JSONField( + read_only=True, + default=( + [{"key": k, "label": k} + for k in PERSON_NAME_TITLE_GROUPS.get(self.event.settings.name_scheme_titles)[1]] + if self.event.settings.name_scheme_titles + else [] + ) + ) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 4c1dbbd08..f3459a6e1 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -2594,7 +2594,9 @@ Your {organizer} team""")) }, 'name_scheme': { 'default': 'full', # default for new events is 'given_family' - 'type': str + 'type': str, + 'serializer_class': serializers.ChoiceField, + 'serializer_kwargs': {}, }, 'giftcard_length': { 'default': settings.ENTROPY['giftcard_secret'], @@ -2989,6 +2991,9 @@ PERSON_NAME_SCHEMES = OrderedDict([ }, }), ]) + +DEFAULTS['name_scheme']['serializer_kwargs']['choices'] = ((k, k) for k in PERSON_NAME_SCHEMES) + COUNTRIES_WITH_STATE_IN_ADDRESS = { # Source: http://www.bitboost.com/ref/international-address-formats.html # This is not a list of countries that *have* states, this is a list of countries where states From 8cf539a57397c690d16526bcb4f23bce9c5d8059 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 27 Jul 2022 15:10:07 +0200 Subject: [PATCH 04/54] Fix og:description field for event series --- src/pretix/presale/templates/pretixpresale/event/index.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index a1cf99ff7..c8a868415 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -27,7 +27,11 @@ {% block custom_header %} {{ block.super }} - + {% if request.event.has_subevents and not subevent %} + + {% else %} + + {% endif %} {% if subevent %} {% else %} From 713b13b0271d2678e5ef91621bf06fb75ac8062d Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 28 Jul 2022 11:27:51 +0200 Subject: [PATCH 05/54] Checkout: fix membership being selected when only one is available --- src/pretix/presale/forms/checkout.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py index 3b67b5978..19b2d997b 100644 --- a/src/pretix/presale/forms/checkout.py +++ b/src/pretix/presale/forms/checkout.py @@ -221,15 +221,13 @@ class MembershipForm(forms.Form): else: types = self.position.item.require_membership_types.all() - initial = None - memberships = [ m for m in self.memberships if m.is_valid(ev) and m.membership_type in types ] if len(memberships) == 1: - initial = str(memberships[0].pk) + self.initial['membership'] = str(memberships[0].pk) self.fields['membership'] = forms.ChoiceField( label=_('Membership'), @@ -237,7 +235,6 @@ class MembershipForm(forms.Form): (str(m.pk), self._label_from_instance(m)) for m in memberships ], - initial=initial, widget=forms.RadioSelect, ) self.is_empty = not memberships From c65bb13ba4f9ce233170ee020b03e84726a51677 Mon Sep 17 00:00:00 2001 From: Richard Schreiber Date: Fri, 29 Jul 2022 09:48:34 +0200 Subject: [PATCH 06/54] Presale: fix doubled error messages (Z#23104019) (#2739) --- src/pretix/static/pretixpresale/js/ui/main.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index 34a85db5b..b1fe04f21 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -191,6 +191,7 @@ function setup_basics(el) { else $(":input", this).get(0).focus(); }); el.find(".alert-danger").first().each(function() { + var container = this; var content = $("
    ").click(function(e) { var input = $(e.target.hash).get(0); if (input) input.focus(); @@ -199,13 +200,14 @@ function setup_basics(el) { }); $(".has-error").each(function() { var target = target = $(":input", this); - if (!target || !target.attr("aria-describedby")) return; - var desc = $("#" + target.attr("aria-describedby").split(' ', 1)[0]); + var desc = target && target.attr("aria-describedby") ? document.getElementById(target.attr("aria-describedby").split(' ', 1)[0]) : null; + if (!target || !desc || desc == container) return; + // multi-input fields have a role=group with aria-labelledby var label = this.hasAttribute("aria-labelledby") ? $("#" + this.getAttribute("aria-labelledby")) : $("[for="+target.attr("id")+"]"); var $li = $("
  • "); - $li.text(": " + desc.text()) + $li.text(": " + desc.textContent) $li.prepend($("").attr("href", "#" + target.attr("id")).text(label.get(0).childNodes[0].nodeValue)) content.append($li); }); From 40574a00f75f08fabbb256664459ead675c5ae05 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 29 Jul 2022 09:48:46 +0200 Subject: [PATCH 07/54] Stripe: Show connected account ID --- src/pretix/plugins/stripe/payment.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 7d50f244f..604ed4968 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -166,6 +166,11 @@ class StripeSettingsHolder(BasePaymentProvider): label=_('Stripe account'), disabled=True )), + ('connect_user_id', + forms.CharField( + label=_('Stripe account'), + disabled=True + )), ('endpoint', forms.ChoiceField( label=_('Endpoint'), From e57fa635eddacadcdcc2b7901c3d0255bd8225fd Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 29 Jul 2022 16:09:31 +0200 Subject: [PATCH 08/54] Bump version to 4.12.0 --- src/pretix/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 09290226f..1daa720fa 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "4.12.0.dev1" +__version__ = "4.12.0" From 69b482849a6bd1f89f47db7cea75be09f420cbe2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 29 Jul 2022 16:10:21 +0200 Subject: [PATCH 09/54] Bump to 4.13.0.dev0 --- src/pretix/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 1daa720fa..d97a0dbd2 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "4.12.0" +__version__ = "4.13.0.dev0" From 1f9b0b842f0c692b4560a12dbf68c318256db0ef Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 1 Aug 2022 13:06:01 +0200 Subject: [PATCH 10/54] Docs: Clarify information on search= parameter for orders --- doc/api/resources/orders.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 1282dc3ec..fcfd2b98d 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -428,7 +428,7 @@ List of all orders ``last_modified``, and ``status``. Default: ``datetime`` :query string code: Only return orders that match the given order code :query string status: Only return orders in the given order status (see above) - :query string search: Only return orders matching a given search query + :query string search: Only return orders matching a given search query (matching for names, email addresses, and company names) :query integer item: Only return orders with a position that contains this item ID. *Warning:* Result will also include orders if they contain mixed items, and it will even return orders where the item is only contained in a canceled position. :query integer variation: Only return orders with a position that contains this variation ID. *Warning:* Result will also include orders if they contain mixed items and variations, and it will even return orders where the variation is only contained in a canceled position. :query boolean testmode: Only return orders with ``testmode`` set to ``true`` or ``false`` From 9ce519bb0b37b53fb0b436964aee655603fde414 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 1 Aug 2022 13:07:06 +0200 Subject: [PATCH 11/54] Docs: Fix missing redirect from http to https --- doc/admin/installation/docker_smallscale.rst | 3 +++ doc/admin/installation/manual_smallscale.rst | 3 +++ 2 files changed, 6 insertions(+) diff --git a/doc/admin/installation/docker_smallscale.rst b/doc/admin/installation/docker_smallscale.rst index adbcb9d95..6c5f2a85a 100644 --- a/doc/admin/installation/docker_smallscale.rst +++ b/doc/admin/installation/docker_smallscale.rst @@ -240,6 +240,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix listen 80 default_server; listen [::]:80 ipv6only=on default_server; server_name pretix.mydomain.com; + location / { + return 301 https://$host$request_uri; + } } server { listen 443 default_server; diff --git a/doc/admin/installation/manual_smallscale.rst b/doc/admin/installation/manual_smallscale.rst index 02e33e5bd..51870878a 100644 --- a/doc/admin/installation/manual_smallscale.rst +++ b/doc/admin/installation/manual_smallscale.rst @@ -225,6 +225,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix listen 80 default_server; listen [::]:80 ipv6only=on default_server; server_name pretix.mydomain.com; + location / { + return 301 https://$host$request_uri; + } } server { listen 443 default_server; From bddeb35520f4d3d185d4b7b769772588a7eac6c2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 1 Aug 2022 19:12:56 +0200 Subject: [PATCH 12/54] Don't crash if an order can't be paid manually Fixes PRETIXEU-5Q6 --- src/pretix/control/views/orders.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index efb4eb8a5..bb3cf4775 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1186,13 +1186,17 @@ class OrderTransition(OrderView): if ps == Decimal('0.00') and self.order.pending_sum <= Decimal('0.00'): p = self.order.payments.filter(state=OrderPayment.PAYMENT_STATE_CONFIRMED).last() if p: - p._mark_order_paid( - user=self.request.user, - send_mail=self.mark_paid_form.cleaned_data['send_email'], - force=self.mark_paid_form.cleaned_data.get('force', False), - payment_refund_sum=self.order.payment_refund_sum, - ) - messages.success(self.request, _('The order has been marked as paid.')) + try: + p._mark_order_paid( + user=self.request.user, + send_mail=self.mark_paid_form.cleaned_data['send_email'], + force=self.mark_paid_form.cleaned_data.get('force', False), + payment_refund_sum=self.order.payment_refund_sum, + ) + except Quota.QuotaExceededException as e: + messages.error(self.request, str(e)) + else: + messages.success(self.request, _('The order has been marked as paid.')) return redirect(self.get_order_url()) try: From c13d873f1f6b1fe7f8617073ac6af0ef8f7cf78a Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 4 Aug 2022 15:41:45 +0200 Subject: [PATCH 13/54] Invalidate tickets when item meta data is changed --- src/pretix/control/views/item.py | 40 +++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index d677322b3..2cdec6efc 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1344,22 +1344,36 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE def form_valid(self, form): self.save_meta() messages.success(self.request, _('Your changes have been saved.')) - if form.has_changed() or any(f.has_changed() for f in self.plugin_forms): - data = { - k: form.cleaned_data.get(k) - for k in form.changed_data - } - for f in self.plugin_forms: - data.update({ - k: (f.cleaned_data.get(k).name - if isinstance(f.cleaned_data.get(k), File) - else f.cleaned_data.get(k)) - for k in f.changed_data - }) + + change_data = { + k: form.cleaned_data.get(k) + for k in form.changed_data + } + for f in self.plugin_forms: + change_data.update({ + k: (f.cleaned_data.get(k).name + if isinstance(f.cleaned_data.get(k), File) + else f.cleaned_data.get(k)) + for k in f.changed_data + }) + + meta_changed = {} + for f in self.meta_forms: + meta_changed.update({ + k: (f.cleaned_data.get(k).name + if isinstance(f.cleaned_data.get(k), File) + else f.cleaned_data.get(k)) + for k in f.changed_data + }) + if meta_changed: + change_data['meta_data'] = meta_changed + + if change_data: self.object.log_action( - 'pretix.event.item.changed', user=self.request.user, data=data + 'pretix.event.item.changed', user=self.request.user, data=change_data ) invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'item': self.object.pk}) + for f in self.plugin_forms: f.save() From 6c7f5f48885efe90978d6041fda6be9b005aaa54 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 4 Aug 2022 17:01:04 +0200 Subject: [PATCH 14/54] Fix performance issue in sendmail_run_rules cronjob --- src/pretix/plugins/sendmail/signals.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index 6472a8c6d..b5a572a07 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -42,6 +42,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.urls import resolve, reverse from django.utils import timezone +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django_scopes import scope, scopes_disabled @@ -134,6 +135,7 @@ def sendmail_run_rules(sender, **kwargs): with scopes_disabled(): mails = ScheduledMail.objects.all() + unchanged = [] for m in mails.filter(Q(last_computed__isnull=True) | Q(subevent__last_modified__gt=F('last_computed')) | Q(event__last_modified__gt=F('last_computed'))): @@ -141,6 +143,17 @@ def sendmail_run_rules(sender, **kwargs): m.recompute() if m.computed_datetime != previous: m.save(update_fields=['last_computed', 'computed_datetime']) + else: + unchanged.append(m.pk) + + if unchanged: + # Theoretically, we don't need to write back the unchanged ones to the database… but that will cause us to + # recompute them on every run until eternity. So we want to set their last_computed date to something more + # recent... but not for all of them at once, in case it's millions, so we don't stress the database without + # cause + batch_size = max(connection.ops.bulk_batch_size(['id'], unchanged) - 2, 100) + for i in range(max(1, 5000 // batch_size)): + ScheduledMail.objects.filter(pk__in=unchanged[i * batch_size:batch_size]).update(last_computed=now()) mails.filter( state=ScheduledMail.STATE_SCHEDULED, From 0bb41cc44e508ad5452c951d50f636989c86b0d1 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 4 Aug 2022 17:55:25 +0200 Subject: [PATCH 15/54] Navigation typeahead: only match order numbers and vouchers at the beginning and only >3 characters --- src/pretix/control/views/typeahead.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 64977e69d..0c89ae337 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -228,9 +228,9 @@ def nav_context_list(request): if query: qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query)) - if query: + if query and len(query) >= 3: qs_orders = Order.objects.filter( - code__icontains=query + code__istartswith=query ).select_related('event', 'event__organizer').only('event', 'code', 'pk').order_by() if not request.user.has_active_staff_session(request.session.session_key): qs_orders = qs_orders.filter( @@ -241,7 +241,7 @@ def nav_context_list(request): ) qs_vouchers = Voucher.objects.filter( - code__icontains=query + code__istartswith=query ).select_related('event', 'event__organizer').only('event', 'code', 'pk').order_by() if not request.user.has_active_staff_session(request.session.session_key): qs_vouchers = qs_vouchers.filter( From e6c45e40a9c5176477e7841696b2e9cc3922800f Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 4 Aug 2022 17:59:19 +0200 Subject: [PATCH 16/54] Add a delay to the navigation typeahead to prevent many lookups --- .../static/pretixcontrol/js/ui/typeahead.js | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/pretix/static/pretixcontrol/js/ui/typeahead.js b/src/pretix/static/pretixcontrol/js/ui/typeahead.js index 1e10f53ca..b3067706f 100644 --- a/src/pretix/static/pretixcontrol/js/ui/typeahead.js +++ b/src/pretix/static/pretixcontrol/js/ui/typeahead.js @@ -12,13 +12,8 @@ $(function () { var $query = $(this).find('[data-typeahead-query]').length ? $(this).find('[data-typeahead-query]') : $($(this).attr("data-typeahead-field")); $container.find("li:not(.query-holder)").remove(); var lastQuery = ""; - - $query.on("change", function () { - if ($container.attr("data-typeahead-field") && $query.val() === "") { - $container.removeClass('focused'); - $container.find("li:not(.query-holder)").remove(); - return; - } + var runQueryTimeout = null; + function runQuery() { lastQuery = $query.val(); var thisQuery = $query.val(); $.getJSON( @@ -119,6 +114,17 @@ $(function () { $container.toggleClass('focused', $query.is(":focus") && $container.children().length > 0); } ); + } + $query.on("change", function () { + if ($container.attr("data-typeahead-field") && $query.val() === "") { + $container.removeClass('focused'); + $container.find("li:not(.query-holder)").remove(); + return; + } + if (runQueryTimeout != null) { + window.clearTimeout(runQueryTimeout) + } + runQueryTimeout = window.setTimeout(runQuery, 250) }); $query.on("keydown", function (event) { var $selected = $container.find(".active"); From 4eca90e28746ee0e809127188fca61791056aff6 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2022 09:27:05 +0200 Subject: [PATCH 17/54] Order data exporter: Do not use same colum name twice on same sheet --- src/pretix/base/exporters/orderlist.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index d03ebe2c5..81510f326 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -610,7 +610,10 @@ class OrderListExporter(MultiSheetListExporter): for k, label, w in name_scheme['fields']: headers.append(_('Invoice address name') + ': ' + str(label)) headers += [ - _('Address'), _('ZIP code'), _('City'), _('Country'), pgettext('address', 'State'), _('VAT ID'), + _('Invoice address street'), _('Invoice address ZIP code'), _('Invoice address city'), + _('Invoice address country'), + pgettext('address', 'Invoice address state'), + _('VAT ID'), ] headers += [ _('Sales channel'), _('Order locale'), From 62f1e8d64b2a3e4bba3a9b981beb2ae04f5227e2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2022 09:29:31 +0200 Subject: [PATCH 18/54] Order import: Allow custom country codes (like XK) --- src/pretix/base/orderimport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/orderimport.py b/src/pretix/base/orderimport.py index b83d5b5c9..d4f850790 100644 --- a/src/pretix/base/orderimport.py +++ b/src/pretix/base/orderimport.py @@ -392,7 +392,7 @@ class InvoiceAddressCountry(ImportColumn): return list(countries) def clean(self, value, previous_values): - if value and not Country(value).numeric: + if value and not (Country(value).numeric or value in settings.COUNTRIES_OVERRIDE): raise ValidationError(_("Please enter a valid country code.")) return value @@ -538,7 +538,7 @@ class AttendeeCountry(ImportColumn): return list(countries) def clean(self, value, previous_values): - if value and not Country(value).numeric: + if value and not (Country(value).numeric or value in settings.COUNTRIES_OVERRIDE): raise ValidationError(_("Please enter a valid country code.")) return value From 6cd8fb5b58681cd7d408226987c654737bb4118e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2022 09:29:31 +0200 Subject: [PATCH 19/54] Order import: Add test for country code XK --- src/tests/base/test_orderimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/base/test_orderimport.py b/src/tests/base/test_orderimport.py index cd6c82455..e2cbf9bf4 100644 --- a/src/tests/base/test_orderimport.py +++ b/src/tests/base/test_orderimport.py @@ -93,7 +93,7 @@ def inputfile_factory(): 'D': 'Test', 'E': 'Baz', 'F': '0.00', - 'G': 'AU', + 'G': 'XK', 'H': '', 'I': 'Foo,Bar', 'J': '2021-06-28 11:00:00', From fd3311ed6002d3bf3ff68699c85ea96121496900 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 5 Aug 2022 09:31:22 +0200 Subject: [PATCH 20/54] Set default for SITE_URL to localhost:8000 (#2757) --- src/pretix/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/settings.py b/src/pretix/settings.py index 1a68d21e9..f58bd0d53 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -170,7 +170,7 @@ PRETIX_SESSION_TIMEOUT_RELATIVE = 3600 * 3 PRETIX_SESSION_TIMEOUT_ABSOLUTE = 3600 * 12 PRETIX_PRIMARY_COLOR = '#8E44B3' -SITE_URL = config.get('pretix', 'url', fallback='http://localhost') +SITE_URL = config.get('pretix', 'url', fallback='http://localhost:8000') if SITE_URL.endswith('/'): SITE_URL = SITE_URL[:-1] From 441f32349ff5a6605cf85cf29334567c02d71d9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 09:31:30 +0200 Subject: [PATCH 21/54] Bump @babel/preset-env from 7.18.6 to 7.18.9 in /src/pretix/static/npm_dir (#2750) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pretix/static/npm_dir/package-lock.json | 1156 ++++++++----------- src/pretix/static/npm_dir/package.json | 2 +- 2 files changed, 511 insertions(+), 647 deletions(-) diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index 671dbd69d..dc14e26b1 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -22,9 +22,9 @@ } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" }, "@babel/core": { "version": "7.18.6", @@ -134,9 +134,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -150,12 +150,12 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -164,9 +164,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -208,30 +208,31 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -240,9 +241,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -265,14 +266,12 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -305,9 +304,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -383,10 +382,10 @@ } } }, - "@babel/helper-member-expression-to-functions": { + "@babel/helper-hoist-variables": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { "@babel/types": "^7.18.6" }, @@ -397,9 +396,38 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -478,9 +506,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -494,25 +522,25 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-validator-identifier": { "version": "7.18.6", @@ -520,9 +548,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -536,36 +564,87 @@ } }, "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "requires": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, + "@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" + }, + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -603,11 +682,11 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -616,9 +695,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -665,23 +744,44 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, - "@babel/helper-wrap-function": { + "@babel/helper-validator-option": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", "requires": { - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -689,40 +789,47 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -792,13 +899,13 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -810,13 +917,6 @@ "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - } } }, "@babel/plugin-proposal-class-properties": { @@ -848,11 +948,11 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -866,11 +966,11 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -893,21 +993,32 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.18.8" }, "dependencies": { - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -921,12 +1032,12 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -1111,9 +1222,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1135,39 +1246,40 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -1176,9 +1288,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1192,19 +1304,19 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-dotall-regex": { @@ -1217,11 +1329,11 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -1234,29 +1346,75 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "dependencies": { + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + } } }, "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { @@ -1275,104 +1433,6 @@ "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-modules-commonjs": { @@ -1384,137 +1444,42 @@ "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { @@ -1526,34 +1491,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "requires": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -1561,40 +1510,47 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1609,104 +1565,6 @@ "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -1736,9 +1594,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -1777,12 +1635,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { @@ -1794,19 +1652,19 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { @@ -1827,28 +1685,28 @@ } }, "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -1870,37 +1728,37 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", + "@babel/types": "^7.18.9", "babel-plugin-polyfill-corejs2": "^0.3.1", "babel-plugin-polyfill-corejs3": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.3.1", @@ -1908,25 +1766,26 @@ "semver": "^6.3.0" }, "dependencies": { - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1957,9 +1816,9 @@ } }, "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -2356,12 +2215,12 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" }, "dependencies": { @@ -2373,11 +2232,11 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" } }, @@ -2639,34 +2498,39 @@ "optional": true }, "core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", "requires": { - "browserslist": "^4.21.0", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "dependencies": { "browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "requires": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "caniuse-lite": { - "version": "1.0.30001361", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001361.tgz", - "integrity": "sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==" + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==" }, "electron-to-chromium": { - "version": "1.4.176", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.176.tgz", - "integrity": "sha512-92JdgyRlcNDwuy75MjuFSb3clt6DGJ2IXSpg0MCjKd3JV9eSmuUAIyWiGAp/EtT0z2D4rqbYqThQLV90maH3Zw==" + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==" + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "semver": { "version": "7.0.0", @@ -3980,9 +3844,9 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index f1eaad2ea..9f8407fbb 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -5,7 +5,7 @@ "scripts": {}, "dependencies": { "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", + "@babel/preset-env": "^7.18.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-node-resolve": "^13.3.0", "vue": "^2.7.0", From 395dbedbedcb7aee2a34e3bb1e11398e86f3ee96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 09:34:21 +0200 Subject: [PATCH 22/54] Bump rollup from 2.75.7 to 2.77.2 in /src/pretix/static/npm_dir (#2751) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pretix/static/npm_dir/package-lock.json | 6 +++--- src/pretix/static/npm_dir/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index dc14e26b1..a530d681d 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -3611,9 +3611,9 @@ } }, "rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", "requires": { "fsevents": "~2.3.2" } diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index 9f8407fbb..a372a93e0 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -9,7 +9,7 @@ "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-node-resolve": "^13.3.0", "vue": "^2.7.0", - "rollup": "^2.75.7", + "rollup": "^2.77.2", "rollup-plugin-vue": "^5.0.1", "vue-template-compiler": "^2.7.0" } From a27a5c65aad26b91a0b76933408e4141566faaef Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 5 Aug 2022 09:34:52 +0200 Subject: [PATCH 23/54] Docker: Set AUTOMIGRATE=skip for subprocesses (#2742) --- deployment/docker/supervisord/base.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/docker/supervisord/base.conf b/deployment/docker/supervisord/base.conf index 2ddfdc6dc..c5f89de9c 100644 --- a/deployment/docker/supervisord/base.conf +++ b/deployment/docker/supervisord/base.conf @@ -2,6 +2,7 @@ file=/tmp/supervisor.sock [supervisord] +environment = AUTOMIGRATE="skip" logfile=/dev/stdout logfile_maxbytes=0 loglevel=info From 9ae25caf5c206630e11232313266e67f78158515 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 09:35:37 +0200 Subject: [PATCH 24/54] Bump vue and vue-template-compiler in /src/pretix/static/npm_dir (#2749) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pretix/static/npm_dir/package-lock.json | 25 +++++++++------------ src/pretix/static/npm_dir/package.json | 4 ++-- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index a530d681d..946db19f9 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -2066,20 +2066,15 @@ } }, "@vue/compiler-sfc": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.0.tgz", - "integrity": "sha512-hPOI15RsXO1G8aK6FNF93ld9C/D4e/uAJBE59K8NnL8giuKqeVksvamgu4jKhCJ9f9bbUpj5BuSV3sufIx2hmw==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.8.tgz", + "integrity": "sha512-2DK4YWKfgLnW9VDR9gnju1gcYRk3flKj8UNsms7fsRmFcg35slVTZEkqwBtX+wJBXaamFfn6NxSsZh3h12Ix/Q==", "requires": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", "source-map": "^0.6.1" }, "dependencies": { - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, "postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -3870,11 +3865,11 @@ "optional": true }, "vue": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.0.tgz", - "integrity": "sha512-su25f1hocH+QNkVEqk+Oj7B+mkDIWU70l0YY7nYSJFEs3Z64njXxo65RUXnWH46ooEhKmEWyLdW6HcYn8coNrg==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.8.tgz", + "integrity": "sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ==", "requires": { - "@vue/compiler-sfc": "2.7.0", + "@vue/compiler-sfc": "2.7.8", "csstype": "^3.1.0" } }, @@ -3884,9 +3879,9 @@ "integrity": "sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q==" }, "vue-template-compiler": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.0.tgz", - "integrity": "sha512-b9kKOPNS6J2BVf9skXkKsUwQLP3Bjfb/gG6UoBt3fn4xUVEDko5TSWmkPGW6dSSeAOOvYEMALdouv9caKlTq0Q==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz", + "integrity": "sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==", "requires": { "de-indent": "^1.0.2", "he": "^1.2.0" diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index a372a93e0..9d2f79e8f 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -8,9 +8,9 @@ "@babel/preset-env": "^7.18.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-node-resolve": "^13.3.0", - "vue": "^2.7.0", + "vue": "^2.7.8", "rollup": "^2.77.2", "rollup-plugin-vue": "^5.0.1", - "vue-template-compiler": "^2.7.0" + "vue-template-compiler": "^2.7.8" } } From 50ebda332a9ccc8b8cc147f356437c90de12dd0b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2022 09:53:32 +0200 Subject: [PATCH 25/54] Bump PyPDF to version 2 (#2755) --- src/pretix/base/pdf.py | 22 +++++++-------- src/pretix/base/settings.py | 2 ++ src/pretix/control/views/pdf.py | 10 +++---- src/pretix/plugins/badges/exporters.py | 28 +++++++++---------- .../plugins/ticketoutputpdf/exporters.py | 4 +-- .../plugins/ticketoutputpdf/ticketoutput.py | 4 +-- src/setup.py | 2 +- src/tests/plugins/badges/test_pdf.py | 10 +++---- .../ticketoutputpdf/test_ticketoutputpdf.py | 6 ++-- 9 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index cc584072c..cbc529a70 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -57,7 +57,7 @@ from django.utils.html import conditional_escape from django.utils.timezone import now from django.utils.translation import gettext_lazy as _, pgettext from i18nfield.strings import LazyI18nString -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pytz import timezone from reportlab.graphics import renderPDF from reportlab.graphics.barcode.qr import QrCodeWidget @@ -646,7 +646,7 @@ class Renderer: self.event = event if self.background_file: self.bg_bytes = self.background_file.read() - self.bg_pdf = PdfFileReader(BytesIO(self.bg_bytes), strict=False) + self.bg_pdf = PdfReader(BytesIO(self.bg_bytes), strict=False) else: self.bg_bytes = None self.bg_pdf = None @@ -861,7 +861,7 @@ class Renderer: canvas.restoreState() def draw_page(self, canvas: Canvas, order: Order, op: OrderPosition, show_page=True, only_page=None): - page_count = self.bg_pdf.getNumPages() + page_count = len(self.bg_pdf.pages) if not only_page and not show_page: raise ValueError("only_page=None and show_page=False cannot be combined") @@ -881,7 +881,7 @@ class Renderer: elif o['type'] == "poweredby": self._draw_poweredby(canvas, op, o) if self.bg_pdf: - canvas.setPageSize((self.bg_pdf.getPage(page).mediaBox[2], self.bg_pdf.getPage(page).mediaBox[3])) + canvas.setPageSize((self.bg_pdf.pages[0].mediabox[2], self.bg_pdf.pages[0].mediabox[3])) if show_page: canvas.showPage() @@ -905,17 +905,17 @@ class Renderer: with open(os.path.join(d, 'out.pdf'), 'rb') as f: return BytesIO(f.read()) else: - from PyPDF2 import PdfFileReader, PdfFileWriter + from PyPDF2 import PdfReader, PdfWriter buffer.seek(0) - new_pdf = PdfFileReader(buffer) - output = PdfFileWriter() + new_pdf = PdfReader(buffer) + output = PdfWriter() for i, page in enumerate(new_pdf.pages): - bg_page = copy.copy(self.bg_pdf.getPage(i)) - bg_page.mergePage(page) - output.addPage(bg_page) + bg_page = copy.copy(self.bg_pdf.pages[i]) + bg_page.merge_page(page) + output.add_page(bg_page) - output.addMetadata({ + output.add_metadata({ '/Title': str(title), '/Creator': 'pretix', }) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index f3459a6e1..a0518ad21 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -57,6 +57,7 @@ from django_countries.fields import Country from hierarkey.models import GlobalSettingsBase, Hierarkey from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from i18nfield.strings import LazyI18nString +from phonenumbers import PhoneNumber, parse from rest_framework import serializers from pretix.api.serializers.fields import ( @@ -3030,6 +3031,7 @@ settings_hierarkey.add_type(LazyI18nStringList, settings_hierarkey.add_type(RelativeDateWrapper, serialize=lambda rdw: rdw.to_string(), unserialize=lambda s: RelativeDateWrapper.from_string(s)) +settings_hierarkey.add_type(PhoneNumber, lambda pn: pn.as_international, lambda s: parse(s)) @settings_hierarkey.set_global(cache_namespace='global') diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index 5fbb79bd3..38553a7b3 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -39,8 +39,8 @@ from django.utils.crypto import get_random_string from django.utils.timezone import now from django.utils.translation import gettext as _ from django.views.generic import TemplateView -from PyPDF2 import PdfFileReader, PdfFileWriter -from PyPDF2.utils import PdfReadError +from PyPDF2 import PdfReader, PdfWriter +from PyPDF2.errors import PdfReadError from reportlab.lib.units import mm from pretix.base.i18n import language @@ -153,9 +153,9 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): def post(self, request, *args, **kwargs): if "emptybackground" in request.POST: - p = PdfFileWriter() + p = PdfWriter() try: - p.addBlankPage( + p.add_blank_page( width=float(request.POST.get('width')) * mm, height=float(request.POST.get('height')) * mm, ) @@ -203,7 +203,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): try: bg_bytes = c.file.read() - PdfFileReader(BytesIO(bg_bytes), strict=False) + PdfReader(BytesIO(bg_bytes), strict=False) except PdfReadError as e: return JsonResponse({ "status": "error", diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index c324cc10a..76469a716 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -48,6 +48,7 @@ from django.db.models import Exists, OuterRef, Q from django.db.models.functions import Coalesce from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy +from PyPDF2 import Transformation from reportlab.lib import pagesizes from reportlab.lib.units import mm from reportlab.pdfgen import canvas @@ -157,7 +158,7 @@ OPTIONS = OrderedDict([ def render_pdf(event, positions, opt): - from PyPDF2 import PdfFileReader, PdfFileWriter + from PyPDF2 import PdfReader, PdfWriter Renderer._register_fonts() renderermap = { @@ -168,7 +169,7 @@ def render_pdf(event, positions, opt): default_renderer = _renderer(event, event.badge_layouts.get(default=True)) except BadgeLayout.DoesNotExist: default_renderer = None - output_pdf_writer = PdfFileWriter() + output_pdf_writer = PdfWriter() any = False npp = opt['cols'] * opt['rows'] @@ -189,22 +190,19 @@ def render_pdf(event, positions, opt): p.showPage() p.save() buffer.seek(0) - canvas_pdf_reader = PdfFileReader(buffer) - empty_pdf_page = output_pdf_writer.addBlankPage( - width=opt['pagesize'][0] if opt['pagesize'] else positions[0][1].bg_pdf.getPage(0).mediaBox[2], - height=opt['pagesize'][1] if opt['pagesize'] else positions[0][1].bg_pdf.getPage(0).mediaBox[3], + canvas_pdf_reader = PdfReader(buffer) + empty_pdf_page = output_pdf_writer.add_blank_page( + width=opt['pagesize'][0] if opt['pagesize'] else positions[0][1].bg_pdf.pages[0].mediabox[2], + height=opt['pagesize'][1] if opt['pagesize'] else positions[0][1].bg_pdf.pages[0].mediabox[3], ) for i, (op, r) in enumerate(positions): - bg_page = copy.copy(r.bg_pdf.getPage(0)) - bg_page.trimBox = bg_page.mediaBox + bg_page = copy.copy(r.bg_pdf.pages[0]) + bg_page.trimbox = bg_page.mediabox offsetx = opt['margins'][3] + (i % opt['cols']) * opt['offsets'][0] offsety = opt['margins'][2] + (opt['rows'] - 1 - i // opt['cols']) * opt['offsets'][1] - empty_pdf_page.mergeTranslatedPage( - bg_page, - tx=offsetx, - ty=offsety - ) - empty_pdf_page.mergePage(canvas_pdf_reader.getPage(0)) + bg_page.add_transformation(Transformation().translate(offsetx, offsety)) + empty_pdf_page.merge_page(bg_page) + empty_pdf_page.merge_page(canvas_pdf_reader.pages[0]) pagebuffer = [] outbuffer = BytesIO() @@ -221,7 +219,7 @@ def render_pdf(event, positions, opt): if pagebuffer: render_page(pagebuffer) - output_pdf_writer.addMetadata({ + output_pdf_writer.add_metadata({ '/Title': 'Badges', '/Creator': 'pretix', }) diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index f686f6300..cc1545b48 100644 --- a/src/pretix/plugins/ticketoutputpdf/exporters.py +++ b/src/pretix/plugins/ticketoutputpdf/exporters.py @@ -43,7 +43,7 @@ from django.db.models import Q from django.db.models.functions import Coalesce from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy -from PyPDF2.merger import PdfFileMerger +from PyPDF2 import PdfMerger from pretix.base.exporter import BaseExporter from pretix.base.i18n import language @@ -105,7 +105,7 @@ class AllTicketsPDF(BaseExporter): return d def render(self, form_data): - merger = PdfFileMerger() + merger = PdfMerger() qs = OrderPosition.objects.filter( order__event__in=self.events ).prefetch_related( diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index b05a8517c..dd99310e7 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -44,7 +44,7 @@ from django.http import HttpRequest from django.template.loader import get_template from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ -from PyPDF2 import PdfFileMerger +from PyPDF2 import PdfMerger from pretix.base.i18n import language from pretix.base.models import Order, OrderPosition @@ -112,7 +112,7 @@ class PdfTicketOutput(BaseTicketOutput): return renderer.render_background(buffer, _('Ticket')) def generate_order(self, order: Order): - merger = PdfFileMerger() + merger = PdfMerger() with language(order.locale, self.event.settings.region): for op in order.positions_with_tickets: layout = override_layout.send_chained( diff --git a/src/setup.py b/src/setup.py index 8dabe0061..e4214688d 100644 --- a/src/setup.py +++ b/src/setup.py @@ -211,7 +211,7 @@ setup( 'psycopg2-binary', 'pycountry', 'pycparser==2.21', - 'PyPDF2==1.27.9', + 'PyPDF2==2.9.*', 'python-bidi==0.4.*', # Support for Arabic in reportlab 'python-dateutil==2.8.*', 'python-u2flib-server==4.*', diff --git a/src/tests/plugins/badges/test_pdf.py b/src/tests/plugins/badges/test_pdf.py index 6a1f354b7..82cd64a3c 100644 --- a/src/tests/plugins/badges/test_pdf.py +++ b/src/tests/plugins/badges/test_pdf.py @@ -39,7 +39,7 @@ from io import BytesIO import pytest from django.utils.timezone import now from django_scopes import scope -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pretix.base.models import ( Event, Item, ItemVariation, Order, OrderPosition, Organizer, @@ -100,8 +100,8 @@ def test_generate_pdf(env): 'include_pending': True }) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 2 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 2 @pytest.mark.django_db @@ -115,5 +115,5 @@ def test_generate_pdf_multi(env): 'include_pending': True }) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 1 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 1 diff --git a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py index c20186b23..c98bdddb7 100644 --- a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py +++ b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py @@ -26,7 +26,7 @@ from io import BytesIO import pytest from django.utils.timezone import now from django_scopes import scope -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pretix.base.models import ( Event, Item, ItemVariation, Order, OrderPosition, Organizer, @@ -70,5 +70,5 @@ def test_generate_pdf(env0): o = PdfTicketOutput(event) fname, ftype, buf = o.generate(order.positions.first()) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 1 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 1 From a563881659ba6ba764e23e42968158b56e86d90c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Aug 2022 10:00:05 +0200 Subject: [PATCH 26/54] Bump @babel/core from 7.18.6 to 7.18.10 in /src/pretix/static/npm_dir (#2759) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/pretix/static/npm_dir/package-lock.json | 211 +++++++++++++++++--- src/pretix/static/npm_dir/package.json | 2 +- 2 files changed, 188 insertions(+), 25 deletions(-) diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index 946db19f9..87a57a1ac 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -27,20 +27,20 @@ "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" }, "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -48,20 +48,121 @@ "semver": "^6.3.0" }, "dependencies": { + "@babel/generator": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -739,6 +840,11 @@ } } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", @@ -838,29 +944,86 @@ } }, "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "requires": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { + "@babel/generator": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index 9d2f79e8f..0adf9cf6c 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.18.6", + "@babel/core": "^7.18.10", "@babel/preset-env": "^7.18.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-node-resolve": "^13.3.0", From 9a5e07e078fbe674a614553622e4496db15abab5 Mon Sep 17 00:00:00 2001 From: Richard Schreiber Date: Fri, 5 Aug 2022 15:44:08 +0200 Subject: [PATCH 27/54] PDF-Editor: fix other/other-i18n input prefill bug (Z#23104692) (#2756) --- .../static/pretixcontrol/js/ui/editor.js | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/pretix/static/pretixcontrol/js/ui/editor.js b/src/pretix/static/pretixcontrol/js/ui/editor.js index 381e10eea..f2b5a33f4 100644 --- a/src/pretix/static/pretixcontrol/js/ui/editor.js +++ b/src/pretix/static/pretixcontrol/js/ui/editor.js @@ -300,7 +300,6 @@ var editor = { // Fetch the required page editor.pdf.getPage(page_number).then(function (page) { - console.log('Page loaded'); var canvas = document.getElementById('pdf-canvas'); var scale = editor.$cva.width() / page.getViewport(1.0).width; @@ -326,7 +325,6 @@ var editor = { editor.pdf_page_number = page_number editor._init_page_nav(); - console.log('Page rendered'); if (dump || !editor._fabric_loaded) { editor._init_fabric(dump); } else { @@ -349,7 +347,6 @@ var editor = { } $("#page_nav").append($li) $a.on("click", function (event) { - console.log("switch to page", $(this).attr("data-page")); editor.fabric.deactivateAll(); editor._load_page(parseInt($(this).attr("data-page"))); event.preventDefault(); @@ -369,7 +366,6 @@ var editor = { // Asynchronous download of PDF var loadingTask = PDFJS.getDocument(url); loadingTask.promise.then(function (pdf) { - console.log('PDF loaded'); editor.pdf = pdf; editor.pdf_page_count = pdf.numPages; @@ -422,7 +418,6 @@ var editor = { } editor._fabric_loaded = true; - console.log("Fabric loaded"); if (editor._window_loaded) { editor._ready(); } @@ -430,7 +425,6 @@ var editor = { _window_load_event: function () { editor._window_loaded = true; - console.log("Window loaded"); if (editor._fabric_loaded) { editor._ready(); } @@ -520,7 +514,7 @@ var editor = { } }, - _update_values_from_toolbox: function () { + _update_values_from_toolbox: function (e) { var o = editor.fabric.getActiveObject(); if (!o) { o = editor.fabric.getActiveGroup(); @@ -553,8 +547,16 @@ var editor = { $("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n"); o.content = $("#toolbox-content").val(); if ($("#toolbox-content").val() === "other") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from i18n textarea + $("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val()); + } o.text = $("#toolbox-content-other").val(); } else if ($("#toolbox-content").val() === "other_i18n") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from "other" textarea + $("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val()); + } o.text_i18n = {} $("#toolbox-content-other-i18n textarea").each(function () { o.text_i18n[$(this).attr("lang")] = $(this).val(); @@ -608,8 +610,16 @@ var editor = { $("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n"); o.content = $("#toolbox-content").val(); if ($("#toolbox-content").val() === "other") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from i18n textarea + $("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val()); + } o.setText($("#toolbox-content-other").val()); } else if ($("#toolbox-content").val() === "other_i18n") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from "other" textarea + $("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val()); + } o.text_i18n = {} $("#toolbox-content-other-i18n textarea").each(function () { o.text_i18n[$(this).attr("lang")] = $(this).val(); @@ -620,6 +630,14 @@ var editor = { } } + // empty text-inputs if not in use + if ($("#toolbox-content").val() !== "other") { + $("#toolbox-content-other").val(""); + } + if ($("#toolbox-content").val() !== "other_i18n") { + $("#toolbox-content-other-i18n textarea").val(""); + } + o.setCoords(); editor.fabric.renderAll(); }, @@ -1055,14 +1073,14 @@ var editor = { $("#toolbox label.btn").bind('click change', editor._update_values_from_toolbox); $("#toolbox select").bind('change', editor._update_values_from_toolbox); $("#toolbox select").bind('change', editor._create_savepoint); - $("#toolbox button.toggling").bind('click change', function () { + $("#toolbox button.toggling").bind('click change', function (e) { if ($(this).is(".option")) { $(this).addClass("active"); $(this).parent().siblings().find("button").removeClass("active"); } else { $(this).toggleClass("active"); } - editor._update_values_from_toolbox(); + editor._update_values_from_toolbox(e); editor._create_savepoint(); }); $("#toolbox .colorpickerfield").bind('changeColor', editor._update_values_from_toolbox); From 3bb590c1ae3bfaa15577f49139dae2c148604af2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Aug 2022 10:01:50 +0200 Subject: [PATCH 28/54] Ensure /favicon.ico does not raise Resolver404 on custom domains --- src/pretix/presale/urls.py | 7 +++++++ src/pretix/presale/views/organizer.py | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 7d03beae5..db39986e0 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -93,6 +93,10 @@ event_patterns = [ name='event.payment.unlock'), re_path(r'resend/$', pretix.presale.views.user.ResendLinkView.as_view(), name='event.resend_link'), + re_path(r'^favicon.ico/?$', + pretix.presale.views.organizer.OrganizerFavicon.as_view(), + name='event.favicon'), + re_path(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/open/(?P[a-z0-9]+)/$', pretix.presale.views.order.OrderOpen.as_view(), name='event.order.open'), re_path(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/$', pretix.presale.views.order.OrderDetails.as_view(), @@ -164,6 +168,9 @@ event_patterns = [ organizer_patterns = [ re_path(r'^$', pretix.presale.views.organizer.OrganizerIndex.as_view(), name='organizer.index'), + re_path(r'^favicon.ico/?$', + pretix.presale.views.organizer.OrganizerFavicon.as_view(), + name='organizer.favicon'), re_path(r'^events/ical/$', pretix.presale.views.organizer.OrganizerIcalDownload.as_view(), name='organizer.ical'), diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index 1a5d96ee9..f76d78ecc 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -48,6 +48,7 @@ from django.db.models import Exists, Max, Min, OuterRef, Prefetch, Q from django.db.models.functions import Coalesce, Greatest from django.http import Http404, HttpResponse from django.shortcuts import redirect +from django.templatetags.static import static from django.utils.decorators import method_decorator from django.utils.formats import date_format, get_format from django.utils.timezone import get_current_timezone, now @@ -66,6 +67,7 @@ from pretix.helpers.daterange import daterange from pretix.helpers.formats.en.formats import ( SHORT_MONTH_DAY_FORMAT, WEEK_FORMAT, ) +from pretix.helpers.thumb import get_thumbnail from pretix.multidomain.urlreverse import eventreverse from pretix.presale.ical import get_public_ical from pretix.presale.views import OrganizerViewMixin @@ -1170,3 +1172,11 @@ class OrganizerIcalDownload(OrganizerViewMixin, View): if request.organizer.settings.meta_noindex: resp['X-Robots-Tag'] = 'noindex' return resp + + +class OrganizerFavicon(View): + def get(self, *args, **kwargs): + if self.request.organizer.settings.favicon: + return redirect(get_thumbnail(self.request.organizer.settings.favicon, '32x32^').thumb.url) + else: + return redirect(static("pretixbase/img/favicon.ico")) From 345a05e4ae37dc0da00e5593bbc8d4f0f3206994 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Aug 2022 10:19:32 +0200 Subject: [PATCH 29/54] Improve error message on mismatching host header on new installations --- src/pretix/base/templates/400_hostname.html | 52 +++++++++++++++++++++ src/pretix/multidomain/middlewares.py | 11 ++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/pretix/base/templates/400_hostname.html diff --git a/src/pretix/base/templates/400_hostname.html b/src/pretix/base/templates/400_hostname.html new file mode 100644 index 000000000..881d0582c --- /dev/null +++ b/src/pretix/base/templates/400_hostname.html @@ -0,0 +1,52 @@ +{% extends "error.html" %} +{% load i18n %} +{% load static %} +{% block title %}{% trans "Unknown host" %}{% endblock %} +{% block content %} + + +{% endblock %} diff --git a/src/pretix/multidomain/middlewares.py b/src/pretix/multidomain/middlewares.py index 566700bfe..985caff62 100644 --- a/src/pretix/multidomain/middlewares.py +++ b/src/pretix/multidomain/middlewares.py @@ -43,6 +43,7 @@ from django.core.cache import cache from django.core.exceptions import DisallowedHost from django.http.request import split_domain_port from django.middleware.csrf import CsrfViewMiddleware as BaseCsrfMiddleware +from django.shortcuts import render from django.urls import set_urlconf from django.utils.cache import patch_vary_headers from django.utils.deprecation import MiddlewareMixin @@ -112,7 +113,15 @@ class MultiDomainMiddleware(MiddlewareMixin): elif settings.DEBUG or domain in LOCAL_HOST_NAMES: request.urlconf = "pretix.multidomain.maindomain_urlconf" else: - raise DisallowedHost("Unknown host: %r" % host) + with scopes_disabled(): + is_fresh_install = not Event.objects.exists() + return render(request, '400_hostname.html', { + 'header_host': domain, + 'site_host': default_domain, + 'settings': settings, + 'xfh': request.headers.get('X-Forwarded-Host'), + 'is_fresh_install': is_fresh_install, + }) else: raise DisallowedHost("Invalid HTTP_HOST header: %r." % host) From bdb0a176da2b8ffb4e7f6da3228b1a171348431d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Aug 2022 10:20:32 +0200 Subject: [PATCH 30/54] Bring back status code 400 for unknown domains --- src/pretix/multidomain/middlewares.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/multidomain/middlewares.py b/src/pretix/multidomain/middlewares.py index 985caff62..004a36ed6 100644 --- a/src/pretix/multidomain/middlewares.py +++ b/src/pretix/multidomain/middlewares.py @@ -121,7 +121,7 @@ class MultiDomainMiddleware(MiddlewareMixin): 'settings': settings, 'xfh': request.headers.get('X-Forwarded-Host'), 'is_fresh_install': is_fresh_install, - }) + }, status=400) else: raise DisallowedHost("Invalid HTTP_HOST header: %r." % host) From 7bab5b16a2528dcc08cc1e6dcabf4b0918f10034 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Aug 2022 13:18:22 +0200 Subject: [PATCH 31/54] Badges: Add paper size HERMA 40x40 --- src/pretix/plugins/badges/exporters.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index 76469a716..fc1945886 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -154,6 +154,14 @@ OPTIONS = OrderedDict([ 'offsets': [95 * mm, 55 * mm], 'pagesize': pagesizes.A4, }), + ('herma_40x40', { + 'name': 'HERMA 40 x 40 mm (9642)', + 'cols': 4, + 'rows': 6, + 'margins': [13.5 * mm, 15 * mm, 13.5 * mm, 15 * mm], + 'offsets': [46 * mm, 46 * mm], + 'pagesize': pagesizes.A4, + }), ]) From f63fbaca4d2931f34262ec43ed1f51c3fbb72875 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 9 Aug 2022 09:53:43 +0200 Subject: [PATCH 32/54] Do not run control context processor for error pages --- src/pretix/control/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index 30d15f988..736887413 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -71,7 +71,7 @@ def _default_context(request): except Resolver404: return {} - if not request.path.startswith(get_script_prefix() + 'control'): + if not request.path.startswith(get_script_prefix() + 'control') or not hasattr(request, 'user'): return {} ctx = { 'url_name': url.url_name, From 4ce51b81ed6b29e47836ac3b1833980b930dd336 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 9 Aug 2022 16:01:07 +0200 Subject: [PATCH 33/54] Limit length of invoice number counter --- src/pretix/control/forms/event.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 2f54c24ea..b3c3521d6 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -39,7 +39,7 @@ from urllib.parse import urlencode, urlparse from django import forms from django.conf import settings from django.core.exceptions import ValidationError -from django.core.validators import validate_email +from django.core.validators import MaxValueValidator, validate_email from django.db.models import Prefetch, Q, prefetch_related_objects from django.forms import ( CheckboxSelectMultiple, formset_factory, inlineformset_factory, @@ -848,6 +848,7 @@ class InvoiceSettingsForm(SettingsForm): self.fields['invoice_generate_sales_channels'].choices = ( (c.identifier, c.verbose_name) for c in get_all_sales_channels().values() ) + self.fields['invoice_numbers_counter_length'].validators.append(MaxValueValidator(15)) def clean(self): data = super().clean() From 47989fd1395e6a143763e1c45cc900a2dfda0f2d Mon Sep 17 00:00:00 2001 From: Richard Schreiber Date: Wed, 10 Aug 2022 09:16:41 +0200 Subject: [PATCH 34/54] Fix: add alt attribute to default html email images --- src/pretix/base/templates/pretixbase/email/base.html | 4 ++-- src/pretix/base/templates/pretixbase/email/separator.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/templates/pretixbase/email/base.html b/src/pretix/base/templates/pretixbase/email/base.html index b7e24cbe4..b0e13c768 100644 --- a/src/pretix/base/templates/pretixbase/email/base.html +++ b/src/pretix/base/templates/pretixbase/email/base.html @@ -199,7 +199,7 @@ + style="max-height: 60px;" alt=""> @@ -233,7 +233,7 @@
    + style="max-height: 60px;" alt=""> diff --git a/src/pretix/base/templates/pretixbase/email/separator.html b/src/pretix/base/templates/pretixbase/email/separator.html index 0d2e44288..f0ff2f726 100644 --- a/src/pretix/base/templates/pretixbase/email/separator.html +++ b/src/pretix/base/templates/pretixbase/email/separator.html @@ -3,7 +3,7 @@
     
    + style="max-height: 4px;" alt="">
     
    From 000407bcafa52dfbc3c7d3e72e41546ffc76e2ff Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 10 Aug 2022 14:30:24 +0200 Subject: [PATCH 35/54] PPv2: Fix payment button on late payment page --- src/pretix/plugins/paypal2/payment.py | 2 +- src/pretix/plugins/paypal2/signals.py | 2 ++ .../paypal2/static/pretixplugins/paypal2/pretix-paypal.js | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/pretix/plugins/paypal2/payment.py b/src/pretix/plugins/paypal2/payment.py index 505a671d0..bee42ad79 100644 --- a/src/pretix/plugins/paypal2/payment.py +++ b/src/pretix/plugins/paypal2/payment.py @@ -582,7 +582,7 @@ class PaypalMethod(BasePaymentProvider): on the 'confirm order' page. """ template = get_template('pretixplugins/paypal2/checkout_payment_confirm.html') - ctx = {'request': request, 'event': self.event, 'settings': self.settings} + ctx = {'request': request, 'event': self.event, 'settings': self.settings, 'method': self.method} return template.render(ctx) def execute_payment(self, request: HttpRequest, payment: OrderPayment): diff --git a/src/pretix/plugins/paypal2/signals.py b/src/pretix/plugins/paypal2/signals.py index a35c458db..e37d50143 100644 --- a/src/pretix/plugins/paypal2/signals.py +++ b/src/pretix/plugins/paypal2/signals.py @@ -107,6 +107,7 @@ def html_head_presale(sender, request=None, **kwargs): if provider.settings.get('_enabled', as_type=bool) and ( url.url_name == "event.order.pay.change" or + url.url_name == "event.order.pay" or (url.url_name == "event.checkout" and url.kwargs['step'] == "payment") or (url.namespace == "plugins:paypal2" and url.url_name == "pay") ): @@ -137,6 +138,7 @@ def signal_process_response(sender, request: HttpRequest, response: HttpResponse if provider.settings.get('_enabled', as_type=bool) and ( url.url_name == "event.order.pay.change" or + url.url_name == "event.order.pay" or (url.url_name == "event.checkout" and url.kwargs['step'] == "payment") or (url.namespace == "plugins:paypal2" and url.url_name == "pay") ): diff --git a/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js b/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js index adf3816ca..20acd921c 100644 --- a/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js +++ b/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js @@ -141,11 +141,11 @@ var pretixpaypal = { pretixpaypal.restore(); }); - if ($("input[name=payment][value^='paypal']").is(':checked') || $(".payment-redo-form").length) { + if ($("input[name=payment][value^='paypal']").is(':checked')) { pretixpaypal.renderButton($("input[name=payment][value^='paypal']:checked").val()); - } - - if ($('#paypal-button-container').data('paypage')) { + } else if ($(".payment-redo-form").length) { + pretixpaypal.renderButton($("input[name=payment][value^='paypal']").val()); + } else if ($('#paypal-button-container').data('paypage')) { pretixpaypal.renderButton('paypal_apm'); } }, From b586a5281348d73daad5a5af22e2a9f78284bde5 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 11 Aug 2022 16:14:37 +0200 Subject: [PATCH 36/54] Improve settings link for propagated settings --- .../pretixcontrol/event/settings.html | 18 ++++++++++-------- .../control/templatetags/hierarkey_form.py | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 92029cf9b..0a01f8be2 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -207,14 +207,16 @@ {% bootstrap_field sform.logo_show_title layout="control" %} {% bootstrap_field sform.og_image layout="control" %} {% url "control:organizer.edit" organizer=request.organizer.slug as org_url %} - {% propagated request.event org_url "primary_color" "primary_font" "theme_color_success" "theme_color_danger" "theme_color_background" "theme_round_borders" %} - {% bootstrap_field sform.primary_color layout="control" %} - {% bootstrap_field sform.theme_color_success layout="control" %} - {% bootstrap_field sform.theme_color_danger layout="control" %} - {% bootstrap_field sform.theme_color_background layout="control" %} - {% bootstrap_field sform.theme_round_borders layout="control" %} - {% bootstrap_field sform.primary_font layout="control" %} - {% endpropagated %} + {% with org_url|add:"#tab-0-4-open" as org_url_tab %} + {% propagated request.event org_url_tab "primary_color" "primary_font" "theme_color_success" "theme_color_danger" "theme_color_background" "theme_round_borders" %} + {% bootstrap_field sform.primary_color layout="control" %} + {% bootstrap_field sform.theme_color_success layout="control" %} + {% bootstrap_field sform.theme_color_danger layout="control" %} + {% bootstrap_field sform.theme_color_background layout="control" %} + {% bootstrap_field sform.theme_round_borders layout="control" %} + {% bootstrap_field sform.primary_font layout="control" %} + {% endpropagated %} + {% endwith %}
    {% trans "Timeline" %} diff --git a/src/pretix/control/templatetags/hierarkey_form.py b/src/pretix/control/templatetags/hierarkey_form.py index 954dcf9ec..abf7371a6 100644 --- a/src/pretix/control/templatetags/hierarkey_form.py +++ b/src/pretix/control/templatetags/hierarkey_form.py @@ -55,7 +55,7 @@ class PropagatedNode(Node):
    {text_expl}
    - + {text_orga}
    From b6945687a67047914c21bbcd9fe7d99d7e68a76c Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 11 Aug 2022 21:41:13 +0200 Subject: [PATCH 37/54] Add last order modification time as an email placeholder (#2761) * Add last order modification time as an email placeholder * Update src/pretix/base/email.py Co-authored-by: Richard Schreiber Co-authored-by: Richard Schreiber --- src/pretix/base/email.py | 14 ++++++++++++++ src/pretix/base/models/orders.py | 24 ++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index fbab7f5ed..1bfbbd921 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -43,6 +43,7 @@ from pretix.base.i18n import ( LazyCurrencyNumber, LazyDate, LazyExpiresDate, LazyNumber, ) from pretix.base.models import Event +from pretix.base.reldate import RelativeDateWrapper from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.base.signals import ( register_html_mail_renderers, register_mail_placeholders, @@ -469,6 +470,19 @@ def base_placeholders(sender, **kwargs): } ), ), + SimpleFunctionalMailTextPlaceholder( + 'order_modification_deadline_date_and_time', ['order', 'event'], + lambda order, event: + date_format(order.modify_deadline.astimezone(event.timezone), 'SHORT_DATETIME_FORMAT') + if order.modify_deadline + else '', + lambda event: date_format( + event.settings.get( + 'last_order_modification_date', as_type=RelativeDateWrapper + ).datetime(event).astimezone(event.timezone), + 'SHORT_DATETIME_FORMAT' + ) if event.settings.get('last_order_modification_date') else '', + ), SimpleFunctionalMailTextPlaceholder( 'event_location', ['event_or_subevent'], lambda event_or_subevent: str(event_or_subevent.location or ''), lambda event: str(event.location or ''), diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 3c94cb80a..8ebb861a4 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -746,6 +746,19 @@ class Order(LockModel, LoggedModel): length += 1 iteration = 0 + @property + def modify_deadline(self): + modify_deadline = self.event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper) + if self.event.has_subevents and modify_deadline: + dates = [ + modify_deadline.datetime(se) + for se in self.event.subevents.filter(id__in=self.positions.values_list('subevent', flat=True)) + ] + return min(dates) if dates else None + elif modify_deadline: + return modify_deadline.datetime(self.event) + return None + @property def can_modify_answers(self) -> bool: """ @@ -758,16 +771,7 @@ class Order(LockModel, LoggedModel): if self.status not in (Order.STATUS_PENDING, Order.STATUS_PAID, Order.STATUS_EXPIRED): return False - modify_deadline = self.event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper) - if self.event.has_subevents and modify_deadline: - dates = [ - modify_deadline.datetime(se) - for se in self.event.subevents.filter(id__in=self.positions.values_list('subevent', flat=True)) - ] - modify_deadline = min(dates) if dates else None - elif modify_deadline: - modify_deadline = modify_deadline.datetime(self.event) - + modify_deadline = self.modify_deadline if modify_deadline is not None and now() > modify_deadline: return False From b5e57965492609bbfa4a53e335733116b2078fbc Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 14 Aug 2022 13:50:18 +0200 Subject: [PATCH 38/54] Move VAT ID validation logic from vat_moss to core, support Norway --- src/pretix/base/models/tax.py | 2 +- src/pretix/base/services/tax.py | 135 ++++++++++++++---- src/tests/base/test_vat_id_validation.py | 169 +++++++++++++++++++++++ src/tests/control/test_orders.py | 42 +++--- src/tests/presale/test_checkout.py | 85 ++++++------ 5 files changed, 339 insertions(+), 94 deletions(-) create mode 100644 src/tests/base/test_vat_id_validation.py diff --git a/src/pretix/base/models/tax.py b/src/pretix/base/models/tax.py index 4eda56f5a..34bbd93d1 100644 --- a/src/pretix/base/models/tax.py +++ b/src/pretix/base/models/tax.py @@ -114,7 +114,7 @@ EU_CURRENCIES = { 'RO': 'RON', 'SE': 'SEK' } -VAT_ID_COUNTRIES = EU_COUNTRIES | {'CH'} +VAT_ID_COUNTRIES = EU_COUNTRIES | {'CH', 'NO'} def is_eu_country(cc): diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index c2837d565..07255bfa0 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -22,9 +22,9 @@ import logging import os import re -from urllib.error import HTTPError +from xml.etree import ElementTree -import vat_moss.errors +import requests import vat_moss.id from django.conf import settings from django.utils.translation import gettext_lazy as _ @@ -35,6 +35,16 @@ from zeep.exceptions import Fault from pretix.base.models.tax import cc_to_vat_prefix, is_eu_country logger = logging.getLogger(__name__) +error_messages = { + 'unavailable': _( + 'Your VAT ID could not be checked, as the VAT checking service of ' + 'your country is currently not available. We will therefore ' + 'need to charge VAT on your invoice. You can get the tax amount ' + 'back via the VAT reimbursement process.' + ), + 'invalid': _('This VAT ID is not valid. Please re-check your input.'), + 'country_mismatch': _('Your VAT ID does not match the selected country.'), +} class VATIDError(Exception): @@ -50,33 +60,97 @@ class VATIDTemporaryError(VATIDError): pass -def _validate_vat_id_EU(vat_id, country_code): - if vat_id[:2] != cc_to_vat_prefix(country_code): - raise VATIDFinalError(_('Your VAT ID does not match the selected country.')) +def _validate_vat_id_NO(vat_id, country_code): + # Inspired by vat_moss library + vat_id = vat_moss.id.normalize(vat_id) + + if not vat_id or len(vat_id) < 3 or not re.match('^\\d{9}MVA$', vat_id[2:]): + raise VATIDFinalError(error_messages['invalid']) + + organization_number = vat_id[2:].replace('MVA', '') + validation_url = 'https://data.brreg.no/enhetsregisteret/api/enheter/%s' % organization_number try: - result = vat_moss.id.validate(vat_id) - if result: - country_code, normalized_id, company_name = result - return normalized_id - except (vat_moss.errors.InvalidError, ValueError): - raise VATIDFinalError(_('This VAT ID is not valid. Please re-check your input.')) - except vat_moss.errors.WebServiceUnavailableError: + response = requests.get(validation_url, timeout=10) + if response.status_code in (404, 400): + raise VATIDFinalError(error_messages['invalid']) + + response.raise_for_status() + + info = response.json() + # This should never happen, but keeping it incase the API is changed + if 'organisasjonsnummer' not in info or info['organisasjonsnummer'] != organization_number: + logger.warning( + 'VAT ID checking failed for Norway due to missing or mismatching organisasjonsnummer in repsonse' + ) + raise VATIDFinalError(error_messages['invalid']) + except requests.RequestException: logger.exception('VAT ID checking failed for country {}'.format(country_code)) - raise VATIDTemporaryError(_( - 'Your VAT ID could not be checked, as the VAT checking service of ' - 'your country is currently not available. We will therefore ' - 'need to charge VAT on your invoice. You can get the tax amount ' - 'back via the VAT reimbursement process.' - )) - except (vat_moss.errors.WebServiceError, HTTPError): + raise VATIDTemporaryError(error_messages['unavailable']) + else: + return vat_id + + +def _validate_vat_id_EU(vat_id, country_code): + # Inspired by vat_moss library + vat_id = vat_moss.id.normalize(vat_id) + number = vat_id[2:] + + if vat_id[:2] != cc_to_vat_prefix(country_code): + raise VATIDFinalError(error_messages['country_mismatch']) + + if not re.match(vat_moss.id.ID_PATTERNS[country_code]['regex'], number): + raise VATIDFinalError(error_messages['invalid']) + + payload = """ + + + + + %s + %s + + + + """.strip() % (country_code, number) + + try: + response = requests.post( + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + data=payload, + timeout=10, + ) + response.raise_for_status() + + return_xml = response.text + + try: + envelope = ElementTree.fromstring(return_xml) + except ElementTree.ParseError: + logger.error( + f'VAT ID checking failed for {country_code} due to XML parse error' + ) + raise VATIDTemporaryError(error_messages['unavailable']) + + namespaces = { + 'soap': 'http://schemas.xmlsoap.org/soap/envelope/', + 'vat': 'urn:ec.europa.eu:taxud:vies:services:checkVat:types' + } + valid_elements = envelope.findall('./soap:Body/vat:checkVatResponse/vat:valid', namespaces) + if not valid_elements: + logger.error( + f'VAT ID checking failed for {country_code} due to missing tag' + ) + raise VATIDTemporaryError(error_messages['unavailable']) + + if valid_elements[0].text.lower() != 'true': + raise VATIDFinalError(error_messages['invalid']) + + except requests.RequestException: logger.exception('VAT ID checking failed for country {}'.format(country_code)) - raise VATIDTemporaryError(_( - 'Your VAT ID could not be checked, as the VAT checking service of ' - 'your country returned an incorrect result. We will therefore ' - 'need to charge VAT on your invoice. Please contact support to ' - 'resolve this manually.' - )) + raise VATIDTemporaryError(error_messages['unavailable']) + else: + return vat_id def _validate_vat_id_CH(vat_id, country_code): @@ -85,10 +159,13 @@ def _validate_vat_id_CH(vat_id, country_code): vat_id = re.sub('[^A-Z0-9]', '', vat_id.replace('HR', '').replace('MWST', '')) try: - transport = Transport(cache=SqliteCache(os.path.join(settings.CACHE_DIR, "validate_vat_id_ch_zeep_cache.db"))) + transport = Transport( + cache=SqliteCache(os.path.join(settings.CACHE_DIR, "validate_vat_id_ch_zeep_cache.db")), + timeout=10 + ) client = Client( 'https://www.uid-wse.admin.ch/V5.0/PublicServices.svc?wsdl', - transport=transport + transport=transport, ) result = client.service.ValidateUID(uid=vat_id) except Fault as e: @@ -125,10 +202,14 @@ def _validate_vat_id_CH(vat_id, country_code): def validate_vat_id(vat_id, country_code): + if not vat_id: + return vat_id country_code = str(country_code) if is_eu_country(country_code): return _validate_vat_id_EU(vat_id, country_code) elif country_code == 'CH': return _validate_vat_id_CH(vat_id, country_code) + elif country_code == 'NO': + return _validate_vat_id_NO(vat_id, country_code) raise VATIDTemporaryError(f'VAT ID should not be entered for country {country_code}') diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py new file mode 100644 index 000000000..de65b87fe --- /dev/null +++ b/src/tests/base/test_vat_id_validation.py @@ -0,0 +1,169 @@ +import pytest +import responses +from requests import Timeout + +from pretix.base.services.tax import VATIDTemporaryError, validate_vat_id, VATIDFinalError + + +def test_unknown_country(): + with pytest.raises(VATIDTemporaryError): + validate_vat_id('TR12345', 'TR') + + +@responses.activate +def test_eu_invalid_format(): + with pytest.raises(VATIDFinalError): + validate_vat_id('AT12345', 'AT') + + +@responses.activate +def test_eu_country_mismatch(): + with pytest.raises(VATIDFinalError): + validate_vat_id('AT12345', 'DE') + + +@responses.activate +def test_eu_server_down(): + def _callback(request): + raise Timeout + + responses.add_callback( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + callback=_callback + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_server_error(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body='error', + status=500 + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_id_invalid(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body=""" + + + AT + U36801500 + 2014-12-17+01:00 + false + STADT WIEN +
    UNKNOWN
    +
    +
    +
    """, + status=200 + ) + + with pytest.raises(VATIDFinalError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_id_valid(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body=""" + + + AT + U36801500 + 2014-12-17+01:00 + true + STADT WIEN +
    UNKNOWN
    +
    +
    +
    """, + status=200 + ) + + assert validate_vat_id('ATU36801500', 'AT') == 'ATU36801500' + + +@responses.activate +def test_NO_invalid_format(): + with pytest.raises(VATIDFinalError): + validate_vat_id('NO12345', 'NO') + + +@responses.activate +def test_NO_server_down(): + def _callback(request): + raise Timeout + + responses.add_callback( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + callback=_callback + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_server_error(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body='error', + status=500 + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_id_invalid(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body="", + status=404 + ) + + with pytest.raises(VATIDFinalError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_id_valid(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body='{"organisasjonsnummer":"974760673","navn":"REGISTERENHETEN I BRØNNØYSUND","organisasjonsform":{"kode":' + '"ORGL","beskrivelse":"Organisasjonsledd","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/' + 'organisasjonsformer/ORGL"}}},"hjemmeside":"www.brreg.no","postadresse":{"land":"Norge","landkode":"NO","postn' + 'ummer":"8910","poststed":"BRØNNØYSUND","adresse":["Postboks 900"],"kommune":"BRØNNØY","kommunenummer":"1813"}' + ',"registreringsdatoEnhetsregisteret":"1995-08-09","registrertIMvaregisteret":false,"naeringskode1":{"beskrivels' + 'e":"Generell offentlig administrasjon","kode":"84.110"},"antallAnsatte":455,"overordnetEnhet":"912660680","for' + 'retningsadresse":{"land":"Norge","landkode":"NO","postnummer":"8900","poststed":"BRØNNØYSUND","adresse":["Havn' + 'egata 48"],"kommune":"BRØNNØY","kommunenummer":"1813"},"institusjonellSektorkode":{"kode":"6100","beskrivelse' + '":"Statsforvaltningen"},"registrertIForetaksregisteret":false,"registrertIStiftelsesregisteret":false,"registr' + 'ertIFrivillighetsregisteret":false,"konkurs":false,"underAvvikling":false,"underTvangsavviklingEllerTvangsopp' + 'losning":false,"maalform":"Bokmål","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter' + '/974760673"},"overordnetEnhet":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter/912660680"}}}', + status=200 + ) + + assert validate_vat_id('NO974760673 MVA', 'NO') == 'NO974760673MVA' + +# No tests for CH currently since it's harder to mock Zeep diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 2a88e481b..952c6a54a 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -42,6 +42,8 @@ from django.core import mail from django.utils.timezone import now from django_countries.fields import Country from django_scopes import scopes_disabled + +from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError from tests.base import SoupTest from tests.plugins.stripe.test_provider import MockedCharge @@ -1563,8 +1565,8 @@ def test_check_vatid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-success' in response.content.decode() ia.refresh_from_db() @@ -1576,8 +1578,8 @@ def test_check_vatid_no_entered(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1589,12 +1591,10 @@ def test_check_vatid_invalid_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('FR')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') - response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.content.decode() - ia.refresh_from_db() - assert not ia.vat_id_validated + response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) + assert 'alert-danger' in response.content.decode() + ia.refresh_from_db() + assert not ia.vat_id_validated @pytest.mark.django_db @@ -1602,8 +1602,8 @@ def test_check_vatid_noneu_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='CHU1234567', country=Country('CH')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1615,8 +1615,8 @@ def test_check_vatid_no_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1626,8 +1626,8 @@ def test_check_vatid_no_country(client, env): @pytest.mark.django_db def test_check_vatid_no_invoiceaddress(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() @@ -1637,10 +1637,9 @@ def test_check_vatid_invalid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.InvalidError('Fail') + raise VATIDFinalError('Fail') mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) @@ -1654,10 +1653,9 @@ def test_check_vatid_unavailable(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.WebServiceUnavailableError('Fail') + raise VATIDTemporaryError('Fail') mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 2e53ba828..e802d11dc 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -47,6 +47,7 @@ from pretix.base.models.items import ( ItemAddOn, ItemBundle, ItemVariation, SubEventItem, SubEventItemVariation, ) from pretix.base.services.orders import OrderError, _perform_order +from pretix.base.services.tax import VATIDTemporaryError, VATIDFinalError from pretix.testutils.scope import classscope from pretix.testutils.sessions import get_cart_session_key @@ -139,8 +140,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -163,8 +164,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): def test_reverse_charge_enable_then_disable(self): self.test_reverse_charge() - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -195,10 +196,9 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.InvalidError() + raise VATIDFinalError('final') mock_validate.side_effect = raiser resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { @@ -229,7 +229,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: mock_validate.return_value = ('AU', 'AU123456', 'Foo') self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', @@ -263,8 +263,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -296,20 +296,18 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') - resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { - 'is_business': 'business', - 'company': 'Foo', - 'name': 'Bar', - 'street': 'Baz', - 'zipcode': '12345', - 'city': 'Here', - 'country': 'FR', - 'vat_id': 'AT123456', - 'email': 'admin@localhost' - }, follow=True) - assert 'alert-danger' in resp.content.decode() + resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { + 'is_business': 'business', + 'company': 'Foo', + 'name': 'Bar', + 'street': 'Baz', + 'zipcode': '12345', + 'city': 'Here', + 'country': 'FR', + 'vat_id': 'AT123456', + 'email': 'admin@localhost' + }, follow=True) + assert 'alert-danger' in resp.content.decode() cr1.refresh_from_db() assert cr1.price == Decimal('23.00') @@ -326,10 +324,9 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.WebServiceUnavailableError('Fail') + raise VATIDTemporaryError('temp') mock_validate.side_effect = raiser self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { @@ -364,8 +361,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -401,8 +398,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -418,7 +415,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): cr1.refresh_from_db() assert cr1.price == Decimal('19.33') - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: mock_validate.return_value = ('DE', 'DE123456', 'Foo') self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', @@ -465,8 +462,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): cr1.refresh_from_db() assert cr1.price == Decimal('23.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' r = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -525,8 +522,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -577,8 +574,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): voucher=self.event.vouchers.create() ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -605,8 +602,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): def test_country_taxing_switch(self): self._test_country_taxing() - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -657,8 +654,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert cr1.price == Decimal('28.56') assert cr1.tax_rate == Decimal('19.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -721,8 +718,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert cr1.price == Decimal('47.60') assert cr1.tax_rate == Decimal('19.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', From 65b4741e27c75a30a73e5ae5c69884008bd0f209 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 14 Aug 2022 21:44:50 +0200 Subject: [PATCH 39/54] Fix crash on VAT IDs with missing country prefix --- src/pretix/base/services/tax.py | 4 ++++ src/tests/base/test_vat_id_validation.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index 07255bfa0..287632d11 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -94,6 +94,10 @@ def _validate_vat_id_NO(vat_id, country_code): def _validate_vat_id_EU(vat_id, country_code): # Inspired by vat_moss library vat_id = vat_moss.id.normalize(vat_id) + + if not vat_id or len(vat_id) < 3: + raise VATIDFinalError(error_messages['invalid']) + number = vat_id[2:] if vat_id[:2] != cc_to_vat_prefix(country_code): diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py index de65b87fe..cd5386ee5 100644 --- a/src/tests/base/test_vat_id_validation.py +++ b/src/tests/base/test_vat_id_validation.py @@ -16,6 +16,12 @@ def test_eu_invalid_format(): validate_vat_id('AT12345', 'AT') +@responses.activate +def test_eu_no_prefix(): + with pytest.raises(VATIDFinalError): + validate_vat_id('12345', 'AT') + + @responses.activate def test_eu_country_mismatch(): with pytest.raises(VATIDFinalError): From e66506fa5b3a91c18ed7d59af1fd4d88ed06b2d9 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 15 Aug 2022 14:18:29 +0200 Subject: [PATCH 40/54] Order import: Do not lock if not necessary --- src/pretix/base/services/orderimport.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/pretix/base/services/orderimport.py b/src/pretix/base/services/orderimport.py index ff6665df8..65773c924 100644 --- a/src/pretix/base/services/orderimport.py +++ b/src/pretix/base/services/orderimport.py @@ -36,6 +36,7 @@ from pretix.base.models import ( from pretix.base.models.orders import Transaction from pretix.base.orderimport import get_all_columns from pretix.base.services.invoices import generate_invoice, invoice_qualified +from pretix.base.services.locking import NoLockManager from pretix.base.services.tasks import ProfiledEventTask from pretix.base.signals import order_paid, order_placed from pretix.celery_app import app @@ -85,9 +86,9 @@ def setif(record, obj, attr, setting): @app.task(base=ProfiledEventTask, throws=(DataImportError,)) def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) -> None: - # TODO: quotacheck? cf = CachedFile.objects.get(id=fileid) user = User.objects.get(pk=user) + seats_used = False with language(locale, event.settings.region): cols = get_all_columns(event) parsed = parse_csv(cf.file) @@ -133,6 +134,8 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) position = OrderPosition(positionid=len(order._positions) + 1) position.attendee_name_parts = {'_scheme': event.settings.name_scheme} position.meta_info = {} + if position.seat is not None: + seats_used = True order._positions.append(position) position.assign_pseudonymization_id() @@ -144,9 +147,12 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) _('Invalid data in row {row}: {message}').format(row=i, message=str(e)) ) - # quota check? - with event.lock(): - with transaction.atomic(): + # We don't support vouchers, quotas, or memberships here, so we only need to lock if seats + # are in use + lockfn = event.lock if seats_used else NoLockManager + + try: + with lockfn(), transaction.atomic(): save_transactions = [] for o in orders: o.total = sum([c.price for c in o._positions]) # currently no support for fees @@ -204,4 +210,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) ) and not o.invoices.last() if gen_invoice: generate_invoice(o, trigger_pdf=True) + except DataImportError: + raise ValidationError(_('We were not able to process your request completely as the server was too busy. ' + 'Please try again.')) cf.delete() From b02fb7ffa83e2a15a8c6ce5d64f051f85e6703a3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 15 Aug 2022 14:18:52 +0200 Subject: [PATCH 41/54] FIx a few inconsistencies in AsyncFormView --- src/pretix/base/views/tasks.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/views/tasks.py b/src/pretix/base/views/tasks.py index 023ea779a..9a82d228a 100644 --- a/src/pretix/base/views/tasks.py +++ b/src/pretix/base/views/tasks.py @@ -216,7 +216,8 @@ class AsyncFormView(AsyncMixin, FormView): task_base = ProfiledEventTask def __init_subclass__(cls): - def async_execute(self, *, request_path, query_string, form_kwargs, locale, tz, organizer=None, event=None, user=None, session_key=None): + def async_execute(self, *, request_path, query_string, form_kwargs, locale, tz, url_kwargs=None, url_args=None, + organizer=None, event=None, user=None, session_key=None): view_instance = cls() form_kwargs['data'] = QueryDict(form_kwargs['data']) req = RequestFactory().post( @@ -225,6 +226,8 @@ class AsyncFormView(AsyncMixin, FormView): content_type='application/x-www-form-urlencoded' ) view_instance.request = req + view_instance.kwargs = url_kwargs + view_instance.args = url_args if event: view_instance.request.event = event view_instance.request.organizer = event.organizer @@ -284,6 +287,8 @@ class AsyncFormView(AsyncMixin, FormView): 'request_path': self.request.path, 'query_string': self.request.GET.urlencode(), 'form_kwargs': form_kwargs, + 'url_args': self.args, + 'url_kwargs': self.kwargs, 'locale': get_language(), 'tz': get_current_timezone().zone, } @@ -336,6 +341,8 @@ class AsyncPostView(AsyncMixin, View): content_type='application/x-www-form-urlencoded' ) view_instance.request = req + view_instance.kwargs = url_kwargs + view_instance.args = url_args if event: view_instance.request.event = event view_instance.request.organizer = event.organizer From 2d584d115df1db35ae5ed357bc075fc5c172d399 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 15 Aug 2022 14:19:02 +0200 Subject: [PATCH 42/54] Reorganize main.js in control module --- src/pretix/static/pretixcontrol/js/ui/main.js | 93 ++++++++++--------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index 970b97fd7..79a44ec37 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -665,33 +665,8 @@ var form_handlers = function (el) { questions_init_photos(el); }; -$(function () { - "use strict"; - - $("body").removeClass("nojs"); - lightbox.init(); - - $(document).on("click", ".variations .variations-select-all", function (e) { - $(this).parent().parent().find("input[type=checkbox]").prop("checked", true).change(); - e.stopPropagation(); - return false; - }); - $(document).on("click", ".variations .variations-select-none", function (e) { - $(this).parent().parent().find("input[type=checkbox]").prop("checked", false).change(); - e.stopPropagation(); - return false; - }); - if ($(".items-on-quota").length) { - $(".items-on-quota .panel").each(function () { - var $panel = $(this); - $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); - $(this).find("input").change(function () { - $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); - }); - }); - } - - $("#sumtoggle").find("button").click(function () { +function setup_basics(el) { + el.find("#sumtoggle").find("button").click(function () { $(".table-product-overview .sum-gross").toggle($(this).attr("data-target") === ".sum-gross"); $(".table-product-overview .sum-net").toggle($(this).attr("data-target") === ".sum-net"); $(".table-product-overview .count").toggle($(this).attr("data-target") === ".count"); @@ -700,18 +675,18 @@ $(function () { $(this).addClass("active"); }); - $('.collapsible').collapse(); - $("input[data-toggle=radiocollapse]").change(function () { + el.find('.collapsible').collapse(); + el.find("input[data-toggle=radiocollapse]").change(function () { $($(this).attr("data-parent")).find(".collapse.in").collapse('hide'); $($(this).attr("data-target")).collapse('show'); }); - $("div.collapsed").removeClass("collapsed").addClass("collapse"); - $(".has-error").each(function () { + el.find("div.collapsed").removeClass("collapsed").addClass("collapse"); + el.find(".has-error").each(function () { $(this).closest("div.panel-collapse").collapse("show"); }); - $('[data-toggle="tooltip"]').tooltip(); - $('[data-toggle="tooltip_html"]').tooltip({ + el.find('[data-toggle="tooltip"]').tooltip(); + el.find('[data-toggle="tooltip_html"]').tooltip({ 'html': true, 'whiteList': { // Global attributes allowed on any supplied element below. @@ -733,7 +708,7 @@ $(function () { if (url.match('#')) { $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show'); } - $('a[data-toggle="tab"]').on('click', function (e) { + el.find('a[data-toggle="tab"]').on('click', function (e) { if (!$(this).closest(".tab-content").length) { // only append hash if not inside a .panel window.location.hash = this.hash; @@ -741,7 +716,7 @@ $(function () { }); // Event wizard - $("#event-slug-random-generate").click(function () { + el.find("#event-slug-random-generate").click(function () { var url = $(this).attr("data-rng-url"); $("#id_basics-slug").val("Generating..."); $.getJSON(url, function (data) { @@ -749,10 +724,7 @@ $(function () { }); }); - form_handlers($("body")); - $(document).trigger("pretix:bind-forms"); - - $(".qrcode-canvas").each(function () { + el.find(".qrcode-canvas").each(function () { $(this).qrcode( { text: $.trim($($(this).attr("data-qrdata")).html()) @@ -760,10 +732,10 @@ $(function () { ); }); - $(".propagated-settings-box").find("input, textarea, select").not("[readonly]") + el.find(".propagated-settings-box").find("input, textarea, select").not("[readonly]") .attr("data-propagated-locked", "true").prop("readonly", true); - $(".propagated-settings-box button[data-action=unlink]").click(function (ev) { + el.find(".propagated-settings-box button[data-action=unlink]").click(function (ev) { var $box = $(this).closest(".propagated-settings-box"); $box.find("input[name=decouple]").val($(this).val()); $box.find("[data-propagated-locked]").prop("readonly", false); @@ -773,7 +745,7 @@ $(function () { }); // Tables with bulk selection, e.g. subevent list - $("input[data-toggle-table]").each(function (ev) { + el.find("input[data-toggle-table]").each(function (ev) { var $toggle = $(this); var $actionButtons = $(".batch-select-actions button", this.form); var countLabels = $("").appendTo($actionButtons); @@ -852,7 +824,7 @@ $(function () { if (!nrOfChecked) countLabels.empty(); else countLabels.text(" ("+nrOfChecked+")"); - if (!allChecked) $selectAll.find("input").prop("checked", false); + if (!allChecked) $selectAll.find("input").prop("checked", false); $actionButtons.attr("disabled", !nrOfChecked); $toggle.prop("checked", allChecked).prop("indeterminate", nrOfChecked > 0 && !allChecked); @@ -875,7 +847,7 @@ $(function () { }); // Items and categories - $(".internal-name-wrapper").each(function () { + el.find(".internal-name-wrapper").each(function () { if ($(this).find("input").val() === "") { var $fg = $(this).find(".form-group"); $fg.hide(); @@ -896,7 +868,7 @@ $(function () { } }); - $("button[data-toggle=qrcode]").click(function (e) { + el.find("button[data-toggle=qrcode]").click(function (e) { e.preventDefault(); var $current = $(".qr-code-overlay[data-qrcode='" + $(this).attr("data-qrcode") + "']"); if ($current.length) { @@ -926,6 +898,37 @@ $(function () { }); return false; }); +} + +$(function () { + "use strict"; + + $("body").removeClass("nojs"); + lightbox.init(); + + $(document).on("click", ".variations .variations-select-all", function (e) { + $(this).parent().parent().find("input[type=checkbox]").prop("checked", true).change(); + e.stopPropagation(); + return false; + }); + $(document).on("click", ".variations .variations-select-none", function (e) { + $(this).parent().parent().find("input[type=checkbox]").prop("checked", false).change(); + e.stopPropagation(); + return false; + }); + if ($(".items-on-quota").length) { + $(".items-on-quota .panel").each(function () { + var $panel = $(this); + $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); + $(this).find("input").change(function () { + $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); + }); + }); + } + + setup_basics($("body")); + form_handlers($("body")); + $(document).trigger("pretix:bind-forms"); $("#ajaxerr").on("click", ".ajaxerr-close", ajaxErrDialog.hide); moment.locale($("body").attr("data-datetimelocale")); From b9feceba497579fc0e056f1cb36e8389ced34d30 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 15 Aug 2022 14:54:51 +0200 Subject: [PATCH 43/54] Do not show a price if there are mandatory non-free addons --- .../pretixpresale/event/fragment_product_list.html | 12 ++++++++---- src/pretix/presale/views/event.py | 9 ++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html index f8c600b0b..cc60c07eb 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html @@ -58,9 +58,9 @@ {% endblocktrans %} - {% elif not item.min_price and not item.max_price %} + {% elif not item.min_price and not item.max_price and not item.mandatory_priced_addons %} {% trans "free" context "price" %} - {% else %} + {% elif not item.mandatory_priced_addons %} {{ item.min_price|money:event.currency }} {% endif %} @@ -144,7 +144,9 @@

    {% elif not var.display_price.gross %} - {% trans "free" context "price" %} + {% if not item.mandatory_priced_addons %} + {% trans "free" context "price" %} + {% endif %} {% elif event.settings.display_net_prices %} {{ var.display_price.net|money:event.currency }} {% else %} @@ -276,7 +278,9 @@

    {% elif not item.display_price.gross %} - {% trans "free" context "price" %} + {% if not item.mandatory_priced_addons %} + {% trans "free" context "price" %} + {% endif %} {% elif event.settings.display_net_prices %} {{ item.display_price.net|money:event.currency }} {% else %} diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 08577ae65..18b0658ce 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -65,7 +65,7 @@ from pretix.base.models import ( ) from pretix.base.models.event import SubEvent from pretix.base.models.items import ( - ItemBundle, SubEventItem, SubEventItemVariation, + ItemAddOn, ItemBundle, SubEventItem, SubEventItemVariation, ) from pretix.base.services.quotas import QuotaAvailability from pretix.helpers.compat import date_fromisocalendar @@ -183,6 +183,13 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require subevent=subevent, ) ), + mandatory_priced_addons=Exists( + ItemAddOn.objects.filter( + base_item_id=OuterRef('pk'), + min_count__gte=1, + price_included=False + ) + ), requires_seat=requires_seat, ).filter( quotac__gt=0, subevent_disabled=False, From cff882edc02554689b2007ef25b8b8f72cd78de6 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 16 Aug 2022 13:58:42 +0200 Subject: [PATCH 44/54] aFix isort issues --- src/tests/base/test_vat_id_validation.py | 4 +++- src/tests/control/test_orders.py | 3 +-- src/tests/presale/test_checkout.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py index cd5386ee5..ba560f021 100644 --- a/src/tests/base/test_vat_id_validation.py +++ b/src/tests/base/test_vat_id_validation.py @@ -2,7 +2,9 @@ import pytest import responses from requests import Timeout -from pretix.base.services.tax import VATIDTemporaryError, validate_vat_id, VATIDFinalError +from pretix.base.services.tax import ( + VATIDFinalError, VATIDTemporaryError, validate_vat_id, +) def test_unknown_country(): diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 952c6a54a..92292dc12 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -42,8 +42,6 @@ from django.core import mail from django.utils.timezone import now from django_countries.fields import Country from django_scopes import scopes_disabled - -from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError from tests.base import SoupTest from tests.plugins.stripe.test_provider import MockedCharge @@ -56,6 +54,7 @@ from pretix.base.payment import PaymentException from pretix.base.services.invoices import ( generate_cancellation, generate_invoice, ) +from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError @pytest.fixture diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index e802d11dc..326b1f1db 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -47,7 +47,7 @@ from pretix.base.models.items import ( ItemAddOn, ItemBundle, ItemVariation, SubEventItem, SubEventItemVariation, ) from pretix.base.services.orders import OrderError, _perform_order -from pretix.base.services.tax import VATIDTemporaryError, VATIDFinalError +from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError from pretix.testutils.scope import classscope from pretix.testutils.sessions import get_cart_session_key From 95baca6920561016c382a3d97d513a89109b1d9e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 16 Aug 2022 14:00:42 +0200 Subject: [PATCH 45/54] Update oauthlib requirement from ==3.1.* to ==3.2.* --- src/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/setup.py b/src/setup.py index e4214688d..f14acae2c 100644 --- a/src/setup.py +++ b/src/setup.py @@ -199,7 +199,7 @@ setup( 'markdown==3.3.4', # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3. # We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7 'mt-940==4.23.*', - 'oauthlib==3.1.*', + 'oauthlib==3.2.*', 'openpyxl==3.0.*', 'packaging', 'paypalrestsdk==1.13.*', From 41a05adb44a24ab1336c1f4f72d9fffa32f9adf0 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 16 Aug 2022 14:03:34 +0200 Subject: [PATCH 46/54] Update pytest requirement to 7.*, pytest-mock to 3.8, pytest-rerunfailures to 10.2, pytest-xdist to 2.5 --- src/setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/setup.py b/src/setup.py index f14acae2c..8f95b91dc 100644 --- a/src/setup.py +++ b/src/setup.py @@ -248,11 +248,11 @@ setup( 'pytest-cache', 'pytest-cov', 'pytest-django==4.*', - 'pytest-mock>=2.0,<3.7', - 'pytest-rerunfailures>=9,<11', + 'pytest-mock==3.8.*', + 'pytest-rerunfailures==10.2', 'pytest-sugar', - 'pytest-xdist==1.31.*', - 'pytest==6.*', + 'pytest-xdist==2.5.*', + 'pytest==7.*', 'responses', ], 'memcached': ['pylibmc'], From 9199d24df25a11fdfea04ac71a8b57826b56a3c0 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 16 Aug 2022 14:05:39 +0200 Subject: [PATCH 47/54] Add missing license header --- src/tests/base/test_vat_id_validation.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py index ba560f021..e51935c1d 100644 --- a/src/tests/base/test_vat_id_validation.py +++ b/src/tests/base/test_vat_id_validation.py @@ -1,3 +1,24 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-2021 rami.io GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# import pytest import responses from requests import Timeout From 5a8c567d029b5c7339cdf05dc42737d715b1d111 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 16 Aug 2022 14:40:24 +0200 Subject: [PATCH 48/54] API: allow setting password when creating customer (#2758) Co-authored-by: Raphael Michel --- doc/api/resources/customers.rst | 7 +++++++ src/pretix/api/serializers/organizer.py | 3 ++- src/pretix/api/views/organizer.py | 6 +++--- src/tests/api/test_customers.py | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/api/resources/customers.rst b/doc/api/resources/customers.rst index 17d5d9279..d9fd2c14f 100644 --- a/doc/api/resources/customers.rst +++ b/doc/api/resources/customers.rst @@ -26,10 +26,16 @@ date_joined datetime Date and time o locale string Preferred language of the customer last_modified datetime Date and time of modification of the record notes string Internal notes and comments (or ``null``) +password string Can only be set during creation of a new customer, will + not be included in any responses. ===================================== ========================== ======================================================= .. versionadded:: 4.0 +.. versionchanged:: 4.3 + + Passwords can now be set through the API during customer creation. + Endpoints --------- @@ -146,6 +152,7 @@ Endpoints { "email": "test@example.org", + "password": "verysecret", "send_email": true } diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index a4e5c7593..f181b0f06 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -77,10 +77,11 @@ class CustomerSerializer(I18nAwareModelSerializer): class CustomerCreateSerializer(CustomerSerializer): send_email = serializers.BooleanField(default=False, required=False, allow_null=True) + password = serializers.CharField(write_only=True, required=False, allow_null=True) class Meta: model = Customer - fields = CustomerSerializer.Meta.fields + ('send_email',) + fields = CustomerSerializer.Meta.fields + ('send_email', 'password') class MembershipTypeSerializer(I18nAwareModelSerializer): diff --git a/src/pretix/api/views/organizer.py b/src/pretix/api/views/organizer.py index 65b899e94..05b689826 100644 --- a/src/pretix/api/views/organizer.py +++ b/src/pretix/api/views/organizer.py @@ -515,8 +515,8 @@ class CustomerViewSet(viewsets.ModelViewSet): raise MethodNotAllowed("Customers cannot be deleted.") @transaction.atomic() - def perform_create(self, serializer, send_email=False): - customer = serializer.save(organizer=self.request.organizer, password=make_password(None)) + def perform_create(self, serializer, send_email=False, password=None): + customer = serializer.save(organizer=self.request.organizer, password=make_password(password)) serializer.instance.log_action( 'pretix.customer.created', user=self.request.user, @@ -530,7 +530,7 @@ class CustomerViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): serializer = CustomerCreateSerializer(data=request.data, context=self.get_serializer_context()) serializer.is_valid(raise_exception=True) - self.perform_create(serializer, send_email=serializer.validated_data.pop('send_email', False)) + self.perform_create(serializer, send_email=serializer.validated_data.pop('send_email', False), password=serializer.validated_data.pop('password', None)) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) diff --git a/src/tests/api/test_customers.py b/src/tests/api/test_customers.py index 233b6eebf..54a18cac5 100644 --- a/src/tests/api/test_customers.py +++ b/src/tests/api/test_customers.py @@ -82,6 +82,7 @@ def test_customer_create(token_client, organizer): data={ 'identifier': 'IGNORED', 'email': 'bar@example.com', + 'password': 'foobar', 'name_parts': { "_scheme": "given_family", 'given_name': 'John', @@ -99,6 +100,7 @@ def test_customer_create(token_client, organizer): assert customer.is_active assert customer.name == 'John Doe' assert customer.is_verified + assert customer.check_password('foobar') assert len(djmail.outbox) == 0 From 80e09780541f853cfdc538e3a9eec0162ed17b5c Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Fri, 19 Aug 2022 15:13:58 +0200 Subject: [PATCH 49/54] PPv2: Check for OID and not PAYID in degraded failback-mode --- src/pretix/plugins/paypal2/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pretix/plugins/paypal2/views.py b/src/pretix/plugins/paypal2/views.py index 2f920c005..b0b420309 100644 --- a/src/pretix/plugins/paypal2/views.py +++ b/src/pretix/plugins/paypal2/views.py @@ -283,7 +283,7 @@ def success(request, *args, **kwargs): else: payment = None - if request.session.get('payment_paypal_id', None): + if request.session.get('payment_paypal_oid', None): if payment: prov = Paypal(request.event) try: @@ -296,7 +296,7 @@ def success(request, *args, **kwargs): return resp else: messages.error(request, _('Invalid response from PayPal received.')) - logger.error('Session did not contain payment_paypal_id') + logger.error('Session did not contain payment_paypal_oid') urlkwargs['step'] = 'payment' return redirect(eventreverse(request.event, 'presale:event.checkout', kwargs=urlkwargs)) From 0d453f34548bdf03bfec574914870a532fc80fa6 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Tue, 23 Aug 2022 11:43:39 +0200 Subject: [PATCH 50/54] EU VAT Check: Query VAT RegEx list based on sanatized vat_prefix (GR vs. EL) PRETIXEU-75A --- src/pretix/base/services/tax.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index 287632d11..6680bff1d 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -103,7 +103,7 @@ def _validate_vat_id_EU(vat_id, country_code): if vat_id[:2] != cc_to_vat_prefix(country_code): raise VATIDFinalError(error_messages['country_mismatch']) - if not re.match(vat_moss.id.ID_PATTERNS[country_code]['regex'], number): + if not re.match(vat_moss.id.ID_PATTERNS[cc_to_vat_prefix(country_code)]['regex'], number): raise VATIDFinalError(error_messages['invalid']) payload = """ From 8226e6c6d5ee40d7c10aa339314f3e5296370fd9 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Thu, 25 Aug 2022 10:25:01 +0200 Subject: [PATCH 51/54] Webhooks: Add order.expirychanged and all order.refund.* Events --- doc/api/resources/webhooks.rst | 6 ++++++ src/pretix/api/webhooks.py | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index 34980f40c..5f9773e90 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -36,10 +36,16 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.event.order.canceled`` * ``pretix.event.order.reactivated`` * ``pretix.event.order.expired`` + * ``pretix.event.order.expirychanged`` * ``pretix.event.order.modified`` * ``pretix.event.order.contact.changed`` * ``pretix.event.order.changed.*`` + * ``pretix.event.order.refund.created`` * ``pretix.event.order.refund.created.externally`` + * ``pretix.event.order.refund.requested`` + * ``pretix.event.order.refund.done`` + * ``pretix.event.order.refund.canceled`` + * ``pretix.event.order.refund.failed`` * ``pretix.event.order.approved`` * ``pretix.event.order.denied`` * ``pretix.event.checkin`` diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 49e058eac..85f94f45d 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -219,6 +219,10 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.event.order.expired', _('Order expired'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.expirychanged', + _('Order expiry date changed'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.modified', _('Order information changed'), @@ -231,10 +235,30 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.event.order.changed.*', _('Order changed'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.created', + _('Refund of payment created'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.refund.created.externally', _('External refund of payment'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.requested', + _('Refund of payment requested by customer'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.done', + _('Refund of payment completed'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.canceled', + _('Refund of payment canceled'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.failed', + _('Refund of payment failed'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.approved', _('Order approved'), From cdb56497096d6208e5656f3a61019ee81a1a2722 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Fri, 26 Aug 2022 17:06:08 +0200 Subject: [PATCH 52/54] API: Explicitly call order.create_transactions() on Order Position PATCH/updates (PRETIXEU-766) --- src/pretix/api/views/order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 5135fb1e6..7c791e6dc 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -1322,6 +1322,7 @@ class OrderPositionViewSet(viewsets.ModelViewSet): serializer.is_valid(raise_exception=True) serializer.save() new_data = serializer.data + instance.order.create_transactions() if old_data != new_data: log_data = self.request.data From cf060f353df08b4c26a3d3f0bc6445de0542fe08 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Mon, 29 Aug 2022 13:14:33 +0200 Subject: [PATCH 53/54] VAT Check: Surface validation errors during normalization --- src/pretix/base/services/tax.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index 6680bff1d..5ae1b8810 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -93,7 +93,10 @@ def _validate_vat_id_NO(vat_id, country_code): def _validate_vat_id_EU(vat_id, country_code): # Inspired by vat_moss library - vat_id = vat_moss.id.normalize(vat_id) + try: + vat_id = vat_moss.id.normalize(vat_id) + except ValueError: + raise VATIDFinalError(error_messages['invalid']) if not vat_id or len(vat_id) < 3: raise VATIDFinalError(error_messages['invalid']) From b65424ee3d2449f179235ac3185a83740f084254 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Fri, 2 Sep 2022 19:13:06 +0200 Subject: [PATCH 54/54] Webhooks: Add Shop live/offline and Testmode on/off --- doc/api/resources/webhooks.rst | 4 ++++ src/pretix/api/webhooks.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index 5f9773e90..051a2bd26 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -56,6 +56,10 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.subevent.added`` * ``pretix.subevent.changed`` * ``pretix.subevent.deleted`` + * ``pretix.event.live.activated`` + * ``pretix.event.live.deactivated`` + * ``pretix.event.testmode.activated`` + * ``pretix.event.testmode.deactivated`` Installed plugins might register more valid values. diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 85f94f45d..e8b42c972 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -299,6 +299,22 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.subevent.deleted', pgettext_lazy('subevent', 'Event series date deleted'), ), + ParametrizedEventWebhookEvent( + 'pretix.event.live.activated', + _('Shop taken live'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.live.deactivated', + _('Shop taken offline'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.testmode.activated', + _('Testmode of shop has been activated'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.testmode.deactivated', + _('Testmode of shop has been deactivated'), + ), )