Fix #978 -- Allow to split names (#1049)

- [x] attendee names
- [x] Invoice address names
- [x] Data migration
- [x] API serializers
  - [x] orderposition
  - [x] cartposition
  - [x] invoiceaddress
  - [x] checkinlistposition
- [x] position API search
- [x] invoice API search
- [x] business/individual required toggle
- [x] Split columns in CSV exports
- [x] ticket editor
- [x] shredder
- [x] ticket/invoice sample data
- [x] order search
- [x] Handle changed naming scheme
- [x] tests
- [x] make use in:
  - [x] Boabee
  - [x] Certificate download order
  - [x] Badge download order
  - [x] Ticket download order
- [x] Document new MySQL requirement
- [x] Plugins
This commit is contained in:
Raphael Michel
2018-11-05 15:43:21 +01:00
committed by GitHub
parent 7039374588
commit 94be46ffdb
71 changed files with 1219 additions and 244 deletions

View File

@@ -29,11 +29,11 @@ def env():
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='1234'
price=12, attendee_name_parts={}, secret='1234'
)
OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='5678'
price=12, attendee_name_parts={}, secret='5678'
)
return event, o1, shirt

View File

@@ -36,11 +36,11 @@ def env():
)
op1 = OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='1234'
price=12, attendee_name_parts={}, secret='1234'
)
op2 = OrderPosition.objects.create(
order=o1, item=ticket,
price=23, attendee_name="Peter", secret='5678910'
price=23, attendee_name_parts={"full_name": "Peter", "_scheme": "full"}, secret='5678910'
)
cl1 = event.checkin_lists.create(name="Foo", all_products=True)
cl2 = event.checkin_lists.create(name="Bar", all_products=True)
@@ -273,7 +273,7 @@ def test_search_restricted(client, env):
@pytest.mark.django_db
def test_search_invoice_name(client, env):
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[5])
InvoiceAddress.objects.create(order=env[2], name="John")
InvoiceAddress.objects.create(order=env[2], name_parts={"full_name": "John", "_scheme": "full"})
resp = client.get('/pretixdroid/api/%s/%s/search/?key=%s&query=%s' % (
env[0].organizer.slug, env[0].slug, 'abcdefg', 'John'))
jdata = json.loads(resp.content.decode("utf-8"))

View File

@@ -39,11 +39,11 @@ def env():
)
op1 = OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='1234', subevent=se1
price=12, attendee_name_parts={}, secret='1234', subevent=se1
)
op2 = OrderPosition.objects.create(
order=o1, item=ticket,
price=23, attendee_name="Peter", secret='5678910', subevent=se2
price=23, attendee_name_parts={'full_name': "Peter"}, secret='5678910', subevent=se2
)
cl1 = event.checkin_lists.create(name="Foo", all_products=True, subevent=se1)
cl2 = event.checkin_lists.create(name="Foo", all_products=True, subevent=se2)

View File

@@ -0,0 +1,108 @@
import datetime
from decimal import Decimal
import pytest
from django.utils.timezone import now
from pretix.base.models import Event, Item, Order, OrderPosition, Organizer
from pretix.plugins.checkinlists.exporters import CSVCheckinList
@pytest.fixture
def event():
"""Returns an event instance"""
o = Organizer.objects.create(name='Dummy', slug='dummy')
event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=now(),
plugins='pretix.plugins.checkinlists,tests.testdummy',
)
event.settings.set('attendee_names_asked', True)
event.settings.set('name_scheme', 'title_given_middle_family')
event.settings.set('locales', ['en', 'de'])
event.checkin_lists.create(name="Default", all_products=True)
order_paid = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=33, locale='en'
)
item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True)
OrderPosition.objects.create(
order=order_paid,
item=item_ticket,
variation=None,
price=Decimal("23"),
attendee_name_parts={"title": "Mr", "given_name": "Peter", "middle_name": "A", "family_name": "Jones"},
secret='hutjztuxhkbtwnesv2suqv26k6ttytxx'
)
OrderPosition.objects.create(
order=order_paid,
item=item_ticket,
variation=None,
price=Decimal("13"),
attendee_name_parts={"title": "Mrs", "given_name": "Andrea", "middle_name": "J", "family_name": "Zulu"},
secret='ggsngqtnmhx74jswjngw3fk8pfwz2a7k'
)
return event
def clean(d):
return d.replace("\r", "").replace("\n", "")
@pytest.mark.django_db
def test_csv_simple(event):
c = CSVCheckinList(event)
_, _, content = c.render({
'list': event.checkin_lists.first().pk,
'secrets': True,
'sort': 'name',
'questions': []
})
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title","Attendee name:
First name","Attendee name: Middle name","Attendee name: Family name","Product","Price","Checked in","Secret",
"E-mail"
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test"
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test"
""")
@pytest.mark.django_db
def test_csv_order_by_name_parts(event): # noqa
from django.conf import settings
if not settings.JSON_FIELD_AVAILABLE:
raise pytest.skip("Not supported on this database")
c = CSVCheckinList(event)
_, _, content = c.render({
'list': event.checkin_lists.first().pk,
'secrets': True,
'sort': 'name:given_name',
'questions': []
})
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title",
"Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price",
"Checked in","Secret","E-mail"
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test"
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test"
""")
c = CSVCheckinList(event)
_, _, content = c.render({
'list': event.checkin_lists.first().pk,
'secrets': True,
'sort': 'name:family_name',
'questions': []
})
assert clean(content.decode()) == clean(""""Order code","Attendee name","Attendee name: Title",
"Attendee name: First name","Attendee name: Middle name","Attendee name: Family name","Product","Price",
"Checked in","Secret","E-mail"
"FOO","Mr Peter A Jones","Mr","Peter","A","Jones","Ticket","23.00","","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test"
"FOO","Mrs Andrea J Zulu","Mrs","Andrea","J","Zulu","Ticket","13.00","","ggsngqtnmhx74jswjngw3fk8pfwz2a7k",
"dummy@dummy.test"
""")

View File

@@ -29,11 +29,11 @@ def env0():
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='1234'
price=12, attendee_name_parts={}, secret='1234'
)
OrderPosition.objects.create(
order=o1, item=shirt, variation=shirt_red,
price=12, attendee_name=None, secret='5678'
price=12, attendee_name_parts={}, secret='5678'
)
return event, o1