From 456bee7efae1369a010e9ef48fe17f98284854b2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 27 Jun 2023 17:07:30 +0200 Subject: [PATCH] Order import: Allow to assign a customer --- src/pretix/base/orderimport.py | 32 ++++++++++++++++++++++++++++-- src/tests/base/test_orderimport.py | 19 ++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/orderimport.py b/src/pretix/base/orderimport.py index e8bb6bb69f..c25b65a509 100644 --- a/src/pretix/base/orderimport.py +++ b/src/pretix/base/orderimport.py @@ -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)) diff --git a/src/tests/base/test_orderimport.py b/src/tests/base/test_orderimport.py index a56bb90710..e8e3183b8b 100644 --- a/src/tests/base/test_orderimport.py +++ b/src/tests/base/test_orderimport.py @@ -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):