forked from CGM_Public/pretix_original
Order import: Support phone number
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user