From 9f6ce81229a04d83b96b8ae8d442bae760749ca3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 5 Jul 2021 10:11:50 +0200 Subject: [PATCH] Order import: Support phone number --- src/pretix/base/orderimport.py | 26 ++++++++++++++++++++++ src/tests/base/test_orderimport.py | 35 +++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/orderimport.py b/src/pretix/base/orderimport.py index 09ef25c35e..13d664093e 100644 --- a/src/pretix/base/orderimport.py +++ b/src/pretix/base/orderimport.py @@ -36,6 +36,8 @@ from django.utils.translation import ( from django_countries import countries from django_countries.fields import Country from i18nfield.strings import LazyI18nString +from phonenumber_field.phonenumber import to_python +from phonenumbers import SUPPORTED_REGIONS from pretix.base.channels import get_all_sales_channels from pretix.base.forms.questions import guess_country @@ -156,6 +158,29 @@ class EmailColumn(ImportColumn): order.email = value +class PhoneColumn(ImportColumn): + identifier = 'phone' + verbose_name = gettext_lazy('Phone number') + + def clean(self, value, previous_values): + if value: + if self.event.settings.region in SUPPORTED_REGIONS: + region = self.event.settings.region + elif self.event.settings.locale[:2].upper() in SUPPORTED_REGIONS: + region = self.event.settings.locale[:2].upper() + else: + region = None + + phone_number = to_python(value, region) + if not phone_number or not phone_number.is_valid(): + raise ValidationError(_('Enter a valid phone number.')) + return phone_number + return value + + def assign(self, value, order, position, invoice_address, **kwargs): + order.phone = value + + class SubeventColumn(ImportColumn): identifier = 'subevent' verbose_name = pgettext_lazy('subevents', 'Date') @@ -756,6 +781,7 @@ def get_all_columns(event): default.append(SubeventColumn(event)) default += [ EmailColumn(event), + PhoneColumn(event), ItemColumn(event), Variation(event), InvoiceAddressCompany(event), diff --git a/src/tests/base/test_orderimport.py b/src/tests/base/test_orderimport.py index 1c5534e9fc..cd92354244 100644 --- a/src/tests/base/test_orderimport.py +++ b/src/tests/base/test_orderimport.py @@ -70,6 +70,7 @@ def inputfile_factory(): 'H': 'Texas', 'I': 'Foo', 'J': '2021-06-28 11:00:00', + 'K': '06221/32177-50', }, { 'A': 'Daniel', @@ -82,6 +83,7 @@ def inputfile_factory(): 'H': '', 'I': 'Bar', 'J': '2021-06-28 11:00:00', + 'K': '+4962213217750', }, { 'A': 'Anke', @@ -94,10 +96,11 @@ def inputfile_factory(): 'H': '', 'I': 'Foo,Bar', 'J': '2021-06-28 11:00:00', + 'K': '', }, ] f = StringIO() - w = csv.DictWriter(f, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dialect=csv.excel) + w = csv.DictWriter(f, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'], dialect=csv.excel) w.writeheader() w.writerows(d) f.seek(0) @@ -111,6 +114,7 @@ DEFAULT_SETTINGS = { 'testmode': False, 'status': 'paid', 'email': 'empty', + 'phone': 'empty', 'variation': 'empty', 'invoice_address_company': 'empty', 'invoice_address_name_full_name': 'empty', @@ -261,6 +265,35 @@ def test_import_email_invalid(user, event, item): assert 'Error while importing value "Dieter" for column "E-mail address" in line "1": Enter a valid email address.' in str(excinfo.value) +@pytest.mark.django_db +@scopes_disabled() +def test_import_phone(user, event, item): + event.settings.region = 'DE' + settings = dict(DEFAULT_SETTINGS) + settings['item'] = 'static:{}'.format(item.pk) + settings['email'] = 'csv:C' + settings['phone'] = 'csv:K' + import_orders.apply( + args=(event.pk, inputfile_factory().id, settings, 'en', user.pk) + ) + assert str(event.orders.get(email="schneider@example.org").phone) == "+4962213217750" + assert str(event.orders.get(email="daniel@example.org").phone) == "+4962213217750" + assert event.orders.filter(phone__isnull=True).count() == 1 + + +@pytest.mark.django_db +@scopes_disabled() +def test_import_phone_invalid(user, event, item): + settings = dict(DEFAULT_SETTINGS) + settings['item'] = 'static:{}'.format(item.pk) + settings['phone'] = 'csv:A' + with pytest.raises(DataImportError) as excinfo: + import_orders.apply( + args=(event.pk, inputfile_factory().id, settings, 'en', user.pk) + ).get() + assert 'Error while importing value "Dieter" for column "Phone number" in line "1": Enter a valid phone number.' in str(excinfo.value) + + @pytest.mark.django_db @scopes_disabled() def test_import_attendee_email(user, event, item):