Order import: Allow to assign a customer

This commit is contained in:
Raphael Michel
2023-06-27 17:07:30 +02:00
parent ccfdd364a3
commit 456bee7efa
2 changed files with 49 additions and 2 deletions

View File

@@ -28,6 +28,7 @@ import pycountry
from django.conf import settings
from django.core.exceptions import ValidationError
from django.core.validators import EmailValidator
from django.db.models import Q
from django.utils import formats
from django.utils.functional import cached_property
from django.utils.translation import (
@@ -42,8 +43,8 @@ from phonenumbers import SUPPORTED_REGIONS
from pretix.base.channels import get_all_sales_channels
from pretix.base.forms.questions import guess_country
from pretix.base.models import (
ItemVariation, OrderPosition, Question, QuestionAnswer, QuestionOption,
Seat, SubEvent,
Customer, ItemVariation, OrderPosition, Question, QuestionAnswer,
QuestionOption, Seat, SubEvent,
)
from pretix.base.services.pricing import get_price
from pretix.base.settings import (
@@ -826,6 +827,29 @@ class QuestionColumn(ImportColumn):
a.options.add(*a._options)
class CustomerColumn(ImportColumn):
identifier = 'customer'
verbose_name = gettext_lazy('Customer')
default_value = None
def clean(self, value, previous_values):
if value:
try:
value = self.event.organizer.customers.get(
Q(identifier=value) | Q(email=value) | Q(external_identifier=value)
)
except Customer.MultipleObjectsReturned:
value = self.event.organizer.customers.get(
Q(identifier=value)
)
except Customer.DoesNotExist:
raise ValidationError(_('No matching customer was found.'))
return value
def assign(self, value, order, position, invoice_address, **kwargs):
order.customer = value
def get_all_columns(event):
default = []
if event.has_subevents:
@@ -837,6 +861,10 @@ def get_all_columns(event):
Variation(event),
InvoiceAddressCompany(event),
]
if event.settings.customer_accounts:
default += [
CustomerColumn(event),
]
scheme = PERSON_NAME_SCHEMES.get(event.settings.name_scheme)
for n, l, w in scheme['fields']:
default.append(InvoiceAddressNamePart(event, n, l))

View File

@@ -308,6 +308,25 @@ def test_import_attendee_email(user, event, item):
assert OrderPosition.objects.filter(attendee_email__isnull=True).count() == 1
@pytest.mark.django_db
@scopes_disabled()
def test_import_customer(user, event, item):
event.organizer.settings.customer_accounts = True
settings = dict(DEFAULT_SETTINGS)
settings['item'] = 'static:{}'.format(item.pk)
settings['customer'] = 'csv:C'
c = event.organizer.customers.create(
email="daniel@example.org",
)
event.organizer.customers.create(
email="schneider@example.org",
)
import_orders.apply(
args=(event.pk, inputfile_factory().id, settings, 'en', user.pk)
)
assert c.orders.count() == 1
@pytest.mark.django_db
@scopes_disabled()
def test_import_attendee_email_invalid(user, event, item):