mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
- [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:
@@ -54,7 +54,8 @@ TEST_CARTPOSITION_RES = {
|
||||
'item': 1,
|
||||
'variation': None,
|
||||
'price': '23.00',
|
||||
'attendee_name': None,
|
||||
'attendee_name_parts': {'full_name': 'Peter'},
|
||||
'attendee_name': 'Peter',
|
||||
'attendee_email': None,
|
||||
'voucher': None,
|
||||
'addon_to': None,
|
||||
@@ -74,7 +75,7 @@ def test_cp_list(token_client, organizer, event, item, taxrule, question):
|
||||
mock_now.return_value = testtime
|
||||
cr = CartPosition.objects.create(
|
||||
event=event, cart_id="aaa", item=item,
|
||||
price=23,
|
||||
price=23, attendee_name_parts={'full_name': 'Peter'},
|
||||
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0),
|
||||
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0)
|
||||
)
|
||||
@@ -95,7 +96,7 @@ def test_cp_list_api(token_client, organizer, event, item, taxrule, question):
|
||||
mock_now.return_value = testtime
|
||||
cr = CartPosition.objects.create(
|
||||
event=event, cart_id="aaa@api", item=item,
|
||||
price=23,
|
||||
price=23, attendee_name_parts={'full_name': 'Peter'},
|
||||
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0),
|
||||
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0)
|
||||
)
|
||||
@@ -116,7 +117,7 @@ def test_cp_detail(token_client, organizer, event, item, taxrule, question):
|
||||
mock_now.return_value = testtime
|
||||
cr = CartPosition.objects.create(
|
||||
event=event, cart_id="aaa@api", item=item,
|
||||
price=23,
|
||||
price=23, attendee_name_parts={'full_name': 'Peter'},
|
||||
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0),
|
||||
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0)
|
||||
)
|
||||
@@ -137,7 +138,7 @@ def test_cp_delete(token_client, organizer, event, item, taxrule, question):
|
||||
mock_now.return_value = testtime
|
||||
cr = CartPosition.objects.create(
|
||||
event=event, cart_id="aaa@api", item=item,
|
||||
price=23,
|
||||
price=23, attendee_name_parts={'full_name': 'Peter'},
|
||||
datetime=datetime.datetime(2018, 6, 11, 10, 0, 0, 0),
|
||||
expires=datetime.datetime(2018, 6, 11, 10, 0, 0, 0)
|
||||
)
|
||||
@@ -154,7 +155,7 @@ CARTPOS_CREATE_PAYLOAD = {
|
||||
'item': 1,
|
||||
'variation': None,
|
||||
'price': '23.00',
|
||||
'attendee_name': None,
|
||||
'attendee_name_parts': {'full_name': 'Peter'},
|
||||
'attendee_email': None,
|
||||
'addon_to': None,
|
||||
'subevent': None,
|
||||
@@ -177,6 +178,31 @@ def test_cartpos_create(token_client, organizer, event, item, quota, question):
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.attendee_name_parts == {'full_name': 'Peter'}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_cartpos_create_legacy_name(token_client, organizer, event, item, quota, question):
|
||||
res = copy.deepcopy(CARTPOS_CREATE_PAYLOAD)
|
||||
res['item'] = item.pk
|
||||
res['attendee_name'] = 'Peter'
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
del res['attendee_name_parts']
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/cartpositions/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.attendee_name_parts == {'_legacy': 'Peter'}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -50,7 +50,7 @@ def order(event, item, other_item, taxrule):
|
||||
item=item,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={'full_name': "Peter"},
|
||||
secret="z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
|
||||
pseudonymization_id="ABCDEFGHKL",
|
||||
)
|
||||
@@ -60,7 +60,7 @@ def order(event, item, other_item, taxrule):
|
||||
item=other_item,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Michael",
|
||||
attendee_name_parts={'full_name': "Michael"},
|
||||
secret="sf4HZG73fU6kwddgjg2QOusFbYZwVKpK",
|
||||
pseudonymization_id="BACDEFGHKL",
|
||||
)
|
||||
@@ -75,6 +75,7 @@ TEST_ORDERPOSITION1_RES = {
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {'full_name': "Peter"},
|
||||
"attendee_email": None,
|
||||
"voucher": None,
|
||||
"tax_rate": "0.00",
|
||||
@@ -97,6 +98,7 @@ TEST_ORDERPOSITION2_RES = {
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Michael",
|
||||
"attendee_name_parts": {'full_name': "Michael"},
|
||||
"attendee_email": None,
|
||||
"voucher": None,
|
||||
"tax_rate": "0.00",
|
||||
|
||||
@@ -49,7 +49,7 @@ def order_position(item, order, taxrule, variations):
|
||||
tax_rate=taxrule.rate,
|
||||
tax_value=Decimal("3"),
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={'full_name': "Peter"},
|
||||
secret="z3fsn8jyufm5kpk768q69gkbyr5f4h6w"
|
||||
)
|
||||
return op
|
||||
|
||||
@@ -61,7 +61,7 @@ def order_position(item, order, taxrule, variations):
|
||||
tax_rate=taxrule.rate,
|
||||
tax_value=Decimal("3"),
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={'full_name': "Peter"},
|
||||
secret="z3fsn8jyufm5kpk768q69gkbyr5f4h6w"
|
||||
)
|
||||
return op
|
||||
|
||||
@@ -100,7 +100,7 @@ def order(event, item, taxrule, question):
|
||||
item=item,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={"full_name": "Peter", "_scheme": "full"},
|
||||
secret="z3fsn8jyufm5kpk768q69gkbyr5f4h6w",
|
||||
pseudonymization_id="ABCDEFGHKL",
|
||||
)
|
||||
@@ -115,6 +115,7 @@ TEST_ORDERPOSITION_RES = {
|
||||
"item": 1,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name_parts": {"full_name": "Peter", "_scheme": "full"},
|
||||
"attendee_name": "Peter",
|
||||
"attendee_email": None,
|
||||
"voucher": None,
|
||||
@@ -195,6 +196,7 @@ TEST_ORDER_RES = {
|
||||
"is_business": False,
|
||||
"company": "Sample company",
|
||||
"name": "",
|
||||
"name_parts": {},
|
||||
"street": "",
|
||||
"zipcode": "",
|
||||
"city": "",
|
||||
@@ -703,7 +705,7 @@ def test_orderposition_delete(token_client, organizer, event, order, item, quest
|
||||
item=item,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={"full_name": "Peter", "_scheme": "full"},
|
||||
secret="foobar",
|
||||
pseudonymization_id="BAZ",
|
||||
)
|
||||
@@ -1249,7 +1251,7 @@ ORDER_CREATE_PAYLOAD = {
|
||||
"invoice_address": {
|
||||
"is_business": False,
|
||||
"company": "Sample company",
|
||||
"name": "Fo",
|
||||
"name_parts": {"full_name": "Fo"},
|
||||
"street": "Bar",
|
||||
"zipcode": "",
|
||||
"city": "Sample City",
|
||||
@@ -1263,7 +1265,7 @@ ORDER_CREATE_PAYLOAD = {
|
||||
"item": 1,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": None,
|
||||
"answers": [
|
||||
@@ -1306,10 +1308,13 @@ def test_order_create(token_client, organizer, event, item, quota, question):
|
||||
assert fee.value == Decimal('0.25')
|
||||
ia = o.invoice_address
|
||||
assert ia.company == "Sample company"
|
||||
assert ia.name_parts == {"full_name": "Fo", "_scheme": "full"}
|
||||
assert ia.name_cached == "Fo"
|
||||
assert o.positions.count() == 1
|
||||
pos = o.positions.first()
|
||||
assert pos.item == item
|
||||
assert pos.price == Decimal("23.00")
|
||||
assert pos.attendee_name_parts == {"full_name": "Peter", "_scheme": "full"}
|
||||
answ = pos.answers.first()
|
||||
assert answ.question == question
|
||||
assert answ.answer == "S"
|
||||
@@ -1332,6 +1337,54 @@ def test_order_create_invoice_address_optional(token_client, organizer, event, i
|
||||
o.invoice_address
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_legacy_attendee_name(token_client, organizer, event, item, quota, question):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['positions'][0]['attendee_name'] = 'Peter'
|
||||
res['positions'][0]['item'] = item.pk
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
del res['positions'][0]['attendee_name_parts']
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
assert o.positions.first().attendee_name_parts == {"_legacy": "Peter"}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_legacy_invoice_name(token_client, organizer, event, item, quota, question):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['invoice_address']['name'] = 'Peter'
|
||||
res['positions'][0]['item'] = item.pk
|
||||
res['positions'][0]['answers'][0]['question'] = question.pk
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
del res['invoice_address']['name_parts']
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
assert o.invoice_address.name_parts == {"_legacy": "Peter"}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_code_optional(token_client, organizer, event, item, quota, question):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
@@ -1646,7 +1699,7 @@ def test_order_create_positionids_addons(token_client, organizer, event, item, q
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": None,
|
||||
"answers": [],
|
||||
@@ -1657,7 +1710,7 @@ def test_order_create_positionids_addons(token_client, organizer, event, item, q
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": 1,
|
||||
"answers": [],
|
||||
@@ -1685,7 +1738,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": None,
|
||||
"answers": [],
|
||||
@@ -1696,7 +1749,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": 2,
|
||||
"answers": [],
|
||||
@@ -1727,7 +1780,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": None,
|
||||
"answers": [],
|
||||
@@ -1737,7 +1790,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": 2,
|
||||
"answers": [],
|
||||
@@ -1761,7 +1814,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"answers": [],
|
||||
"subevent": None
|
||||
@@ -1770,7 +1823,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"answers": [],
|
||||
"subevent": None
|
||||
@@ -1797,7 +1850,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"answers": [],
|
||||
"subevent": None
|
||||
@@ -1807,7 +1860,7 @@ def test_order_create_positionid_validation(token_client, organizer, event, item
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"answers": [],
|
||||
"subevent": None
|
||||
@@ -2066,7 +2119,7 @@ def test_order_create_quota_validation(token_client, organizer, event, item, quo
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": None,
|
||||
"answers": [],
|
||||
@@ -2077,7 +2130,7 @@ def test_order_create_quota_validation(token_client, organizer, event, item, quo
|
||||
"item": item.pk,
|
||||
"variation": None,
|
||||
"price": "23.00",
|
||||
"attendee_name": "Peter",
|
||||
"attendee_name_parts": {"full_name": "Peter"},
|
||||
"attendee_email": None,
|
||||
"addon_to": 1,
|
||||
"answers": [],
|
||||
|
||||
@@ -121,7 +121,10 @@ def test_address_vat_id(env):
|
||||
event, order = env
|
||||
event.settings.set('invoice_language', 'en')
|
||||
InvoiceAddress.objects.create(company='Acme Company', street='221B Baker Street',
|
||||
name='Sherlock Holmes', zipcode='12345', city='London', country_old='UK',
|
||||
name_parts={'full_name': 'Sherlock Holmes', '_scheme': 'full'},
|
||||
zipcode='12345',
|
||||
city='London',
|
||||
country_old='UK',
|
||||
country='', vat_id='UK1234567', order=order)
|
||||
inv = generate_invoice(order)
|
||||
assert inv.invoice_to == "Acme Company\nSherlock Holmes\n221B Baker Street\n12345 London\nUK\nVAT-ID: UK1234567"
|
||||
|
||||
@@ -34,7 +34,7 @@ def order(event):
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
OrderPosition.objects.create(
|
||||
order=o, item=ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Peter", positionid=1
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
return o
|
||||
|
||||
|
||||
@@ -309,7 +309,7 @@ class PaymentReminderTests(TestCase):
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Peter", positionid=1
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
|
||||
@@ -357,7 +357,7 @@ class DownloadReminderTests(TestCase):
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Peter", positionid=1
|
||||
price=Decimal("23.00"), attendee_name_parts={"full_name": "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
|
||||
@@ -411,11 +411,11 @@ class OrderChangeManagerTests(TestCase):
|
||||
default_price=Decimal('12.00'))
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Peter", positionid=1
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Dieter", positionid=2
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
self.ocm = OrderChangeManager(self.order, None)
|
||||
self.quota = self.event.quotas.create(name='Test', size=None)
|
||||
|
||||
@@ -154,11 +154,11 @@ def test_availability_date_order_relative_subevents(event):
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order, item=ticket, variation=None, subevent=se1,
|
||||
price=Decimal("23.00"), attendee_name="Peter", positionid=1
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order, item=ticket, variation=None, subevent=se2,
|
||||
price=Decimal("23.00"), attendee_name="Dieter", positionid=2
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
|
||||
prov = DummyPaymentProvider(event)
|
||||
|
||||
@@ -54,7 +54,7 @@ def order(event, item):
|
||||
item=item,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={'full_name': "Peter", "_scheme": "full"},
|
||||
attendee_email="foo@example.org"
|
||||
)
|
||||
return o
|
||||
@@ -155,7 +155,7 @@ def test_attendee_name_shredder(event, order):
|
||||
}
|
||||
s.shred_data()
|
||||
order.refresh_from_db()
|
||||
assert order.positions.first().attendee_name is None
|
||||
assert not order.positions.first().attendee_name
|
||||
l1.refresh_from_db()
|
||||
assert 'Hans' not in l1.data
|
||||
assert 'Foo' in l1.data
|
||||
@@ -186,6 +186,7 @@ def test_invoice_address_shredder(event, order):
|
||||
'is_business': False,
|
||||
'last_modified': ia.last_modified.isoformat().replace('+00:00', 'Z'),
|
||||
'name': '',
|
||||
'name_parts': {},
|
||||
'street': '221B Baker Street',
|
||||
'vat_id': '',
|
||||
'vat_id_validated': False,
|
||||
|
||||
@@ -45,7 +45,7 @@ def dashboard_env():
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={"full_name": "Peter"}
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order_paid,
|
||||
@@ -77,7 +77,7 @@ def test_dashboard_pending_not_count(dashboard_env):
|
||||
item=dashboard_env[4],
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="NotPaid"
|
||||
attendee_name_parts={'full_name': "NotPaid"}
|
||||
)
|
||||
assert '0/2' in c[0]['content']
|
||||
|
||||
@@ -149,14 +149,14 @@ def checkin_list_env():
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Pending"
|
||||
attendee_name_parts={'full_name': "Pending"}
|
||||
)
|
||||
op_a1_ticket = OrderPosition.objects.create(
|
||||
order=order_a1,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="A1"
|
||||
attendee_name_parts={'full_name': "A1"}
|
||||
)
|
||||
op_a1_mascot = OrderPosition.objects.create(
|
||||
order=order_a1,
|
||||
@@ -169,14 +169,14 @@ def checkin_list_env():
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="A2"
|
||||
attendee_name_parts={'full_name': "A2"}
|
||||
)
|
||||
op_a3_ticket = OrderPosition.objects.create(
|
||||
order=order_a3,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="a4", # a3 attendee is a4
|
||||
attendee_name_parts={'full_name': "a4"}, # a3 attendee is a4
|
||||
attendee_email="a3company@dummy.test"
|
||||
)
|
||||
|
||||
@@ -339,14 +339,14 @@ def checkin_list_with_addon_env():
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Pending"
|
||||
attendee_name_parts={'full_name': "Pending"}
|
||||
)
|
||||
op_a1_ticket = OrderPosition.objects.create(
|
||||
order=order_a1,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="A1"
|
||||
attendee_name_parts={'full_name': "A1"}
|
||||
)
|
||||
op_a1_workshop = OrderPosition.objects.create(
|
||||
order=order_a1,
|
||||
@@ -360,7 +360,7 @@ def checkin_list_with_addon_env():
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="A2"
|
||||
attendee_name_parts={'full_name': "A2"}
|
||||
)
|
||||
|
||||
# checkin
|
||||
|
||||
@@ -187,13 +187,13 @@ class QuestionsTest(ItemFormTest):
|
||||
expires=now() + datetime.timedelta(days=10),
|
||||
total=14, locale='en')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name="Peter")
|
||||
attendee_name_parts={'full_name': "Peter"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name="Michael")
|
||||
attendee_name_parts={'full_name': "Michael"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name="Petra")
|
||||
attendee_name_parts={'full_name': "Petra"})
|
||||
op.answers.create(question=c, answer='39')
|
||||
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
@@ -414,7 +414,7 @@ class ItemsTest(ItemFormTest):
|
||||
item=self.item1,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={'full_name': "Peter"}
|
||||
)
|
||||
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item1.id),
|
||||
{})
|
||||
|
||||
@@ -51,7 +51,7 @@ def env():
|
||||
item=ticket,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={'full_name': "Peter", "_scheme": "full"}
|
||||
)
|
||||
return event, user, o, ticket
|
||||
|
||||
@@ -333,7 +333,7 @@ def test_order_invoice_create_ok(client, env):
|
||||
def test_order_invoice_regenerate(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
InvoiceAddress.objects.create(name='Foo', order=env[2])
|
||||
InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2])
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % i.pk, {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
@@ -362,7 +362,7 @@ def test_order_invoice_regenerate_unknown(client, env):
|
||||
def test_order_invoice_reissue(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
i = generate_invoice(env[2])
|
||||
InvoiceAddress.objects.create(name='Foo', order=env[2])
|
||||
InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2])
|
||||
env[0].settings.set('invoice_generate', 'admin')
|
||||
response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % i.pk, {}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
@@ -528,7 +528,7 @@ def test_order_extend_expired_quota_partial(client, env):
|
||||
item=env[3],
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={'full_name': "Peter", "_scheme": "full"}
|
||||
)
|
||||
o.expires = now() - timedelta(days=5)
|
||||
o.status = Order.STATUS_EXPIRED
|
||||
@@ -745,11 +745,11 @@ class OrderChangeTests(SoupTest):
|
||||
default_price=Decimal('12.00'))
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Peter"
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter", "_scheme": "full"}
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name="Dieter"
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter", "_scheme": "full"}
|
||||
)
|
||||
self.quota = self.event.quotas.create(name="All", size=100)
|
||||
self.quota.items.add(self.ticket)
|
||||
|
||||
@@ -30,7 +30,7 @@ class OrderSearchTest(SoupTest):
|
||||
datetime=now(), expires=now() + datetime.timedelta(days=10),
|
||||
total=14, locale='en'
|
||||
)
|
||||
InvoiceAddress.objects.create(order=o1, company="Test Ltd.", name="Peter Miller")
|
||||
InvoiceAddress.objects.create(order=o1, company="Test Ltd.", name_parts={'full_name': "Peter Miller", "_scheme": "full"})
|
||||
ticket1 = Item.objects.create(event=self.event1, name='Early-bird ticket',
|
||||
category=None, default_price=23,
|
||||
admission=True)
|
||||
@@ -39,7 +39,7 @@ class OrderSearchTest(SoupTest):
|
||||
item=ticket1,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Peter",
|
||||
attendee_name_parts={'full_name': "Peter", "_scheme": "full"},
|
||||
attendee_email="att@att.com"
|
||||
)
|
||||
|
||||
@@ -57,7 +57,7 @@ class OrderSearchTest(SoupTest):
|
||||
item=ticket2,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name="Mark"
|
||||
attendee_name_parts={'full_name': "Mark", "_scheme": "full"}
|
||||
)
|
||||
|
||||
self.team = Team.objects.create(organizer=self.orga1, can_view_orders=True)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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)
|
||||
|
||||
108
src/tests/plugins/test_checkinlist.py
Normal file
108
src/tests/plugins/test_checkinlist.py
Normal 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"
|
||||
""")
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -539,11 +539,11 @@ class CheckoutTestCase(TestCase):
|
||||
)
|
||||
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % cr1.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_0]' % cr1.id)), 1)
|
||||
|
||||
# Not all required fields filled out, expect failure
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'%s-attendee_name' % cr1.id: '',
|
||||
'%s-attendee_name_parts_0' % cr1.id: '',
|
||||
'email': 'admin@localhost'
|
||||
}, follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
@@ -551,7 +551,7 @@ class CheckoutTestCase(TestCase):
|
||||
|
||||
# Corrected request
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'%s-attendee_name' % cr1.id: 'Peter',
|
||||
'%s-attendee_name_parts_0' % cr1.id: 'Peter',
|
||||
'email': 'admin@localhost'
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
@@ -560,6 +560,42 @@ class CheckoutTestCase(TestCase):
|
||||
cr1 = CartPosition.objects.get(id=cr1.id)
|
||||
self.assertEqual(cr1.attendee_name, 'Peter')
|
||||
|
||||
def test_attendee_name_scheme(self):
|
||||
self.event.settings.set('attendee_names_asked', True)
|
||||
self.event.settings.set('attendee_names_required', True)
|
||||
self.event.settings.set('name_scheme', 'title_given_middle_family')
|
||||
cr1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() + timedelta(minutes=10)
|
||||
)
|
||||
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_0]' % cr1.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_1]' % cr1.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_2]' % cr1.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_3]' % cr1.id)), 1)
|
||||
|
||||
# Not all required fields filled out, expect failure
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'%s-attendee_name_parts_0' % cr1.id: 'Mr',
|
||||
'%s-attendee_name_parts_1' % cr1.id: 'John',
|
||||
'%s-attendee_name_parts_2' % cr1.id: 'F',
|
||||
'%s-attendee_name_parts_3' % cr1.id: 'Kennedy',
|
||||
'email': 'admin@localhost'
|
||||
})
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
cr1 = CartPosition.objects.get(id=cr1.id)
|
||||
self.assertEqual(cr1.attendee_name, 'Mr John F Kennedy')
|
||||
self.assertEqual(cr1.attendee_name_parts, {
|
||||
'given_name': 'John',
|
||||
'title': 'Mr',
|
||||
'middle_name': 'F',
|
||||
'family_name': 'Kennedy',
|
||||
"_scheme": "title_given_middle_family"
|
||||
})
|
||||
|
||||
def test_attendee_name_optional(self):
|
||||
self.event.settings.set('attendee_names_asked', True)
|
||||
self.event.settings.set('attendee_names_required', False)
|
||||
@@ -569,22 +605,23 @@ class CheckoutTestCase(TestCase):
|
||||
)
|
||||
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % cr1.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_0]' % cr1.id)), 1)
|
||||
|
||||
# Not all fields filled out, expect success
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'%s-attendee_name' % cr1.id: '',
|
||||
'%s-attendee_name_parts_0' % cr1.id: '',
|
||||
'email': 'admin@localhost'
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
cr1 = CartPosition.objects.get(id=cr1.id)
|
||||
self.assertIsNone(cr1.attendee_name)
|
||||
assert not cr1.attendee_name
|
||||
|
||||
def test_invoice_address_required(self):
|
||||
self.event.settings.invoice_address_asked = True
|
||||
self.event.settings.invoice_address_required = True
|
||||
self.event.settings.set('name_scheme', 'title_given_middle_family')
|
||||
|
||||
CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
@@ -609,7 +646,10 @@ class CheckoutTestCase(TestCase):
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'is_business': 'business',
|
||||
'company': 'Foo',
|
||||
'name': 'Bar',
|
||||
'name_parts_0': 'Mr',
|
||||
'name_parts_1': 'John',
|
||||
'name_parts_2': '',
|
||||
'name_parts_3': 'Kennedy',
|
||||
'street': 'Baz',
|
||||
'zipcode': '12345',
|
||||
'city': 'Here',
|
||||
@@ -619,6 +659,15 @@ class CheckoutTestCase(TestCase):
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
ia = InvoiceAddress.objects.last()
|
||||
assert ia.name_parts == {
|
||||
'title': 'Mr',
|
||||
'given_name': 'John',
|
||||
'middle_name': '',
|
||||
'family_name': 'Kennedy',
|
||||
"_scheme": "title_given_middle_family"
|
||||
}
|
||||
assert ia.name_cached == 'Mr John Kennedy'
|
||||
|
||||
def test_invoice_address_optional(self):
|
||||
self.event.settings.invoice_address_asked = True
|
||||
@@ -653,7 +702,7 @@ class CheckoutTestCase(TestCase):
|
||||
)
|
||||
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=name]')), 1)
|
||||
self.assertEqual(len(doc.select('input[name=name_parts_0]')), 1)
|
||||
self.assertEqual(len(doc.select('input[name=street]')), 0)
|
||||
|
||||
# Not all required fields filled out, expect failure
|
||||
@@ -665,7 +714,7 @@ class CheckoutTestCase(TestCase):
|
||||
|
||||
# Corrected request
|
||||
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
|
||||
'name': 'Raphael',
|
||||
'name_parts_0': 'Raphael',
|
||||
'email': 'admin@localhost'
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
|
||||
@@ -762,7 +811,7 @@ class CheckoutTestCase(TestCase):
|
||||
self.event.settings.set('invoice_address_required', True)
|
||||
ia = InvoiceAddress.objects.create(
|
||||
is_business=True, vat_id='ATU1234567', vat_id_validated=True,
|
||||
country=Country('DE'), name='Foo', street='Foo'
|
||||
country=Country('DE'), name_parts={'full_name': 'Foo', "_scheme": "full"}, name_cached='Foo', street='Foo'
|
||||
)
|
||||
self._set_session('invoice_address', ia.pk)
|
||||
CartPosition.objects.create(
|
||||
@@ -786,7 +835,7 @@ class CheckoutTestCase(TestCase):
|
||||
self.event.settings.set('invoice_address_required', True)
|
||||
ia = InvoiceAddress.objects.create(
|
||||
is_business=True, vat_id='ATU1234567', vat_id_validated=True,
|
||||
country=Country('CH'), name='Foo', street='Foo'
|
||||
country=Country('CH'), name_parts={'full_name': 'Foo', "_scheme": "full"}, name_cached='Foo', street='Foo'
|
||||
)
|
||||
self._set_session('invoice_address', ia.pk)
|
||||
CartPosition.objects.create(
|
||||
@@ -828,7 +877,7 @@ class CheckoutTestCase(TestCase):
|
||||
self.assertRedirects(response, '/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
cr1.attendee_name = 'Peter'
|
||||
cr1.attendee_name_parts = {"full_name": 'Peter', "_scheme": "full"}
|
||||
cr1.save()
|
||||
q1 = Question.objects.create(
|
||||
event=self.event, question='Age', type=Question.TYPE_NUMBER,
|
||||
|
||||
@@ -61,7 +61,7 @@ class OrdersTest(TestCase):
|
||||
item=self.ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={'full_name': "Peter"}
|
||||
)
|
||||
self.not_my_order = Order.objects.create(
|
||||
status=Order.STATUS_PENDING,
|
||||
@@ -147,12 +147,12 @@ class OrdersTest(TestCase):
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret))
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % self.ticket_pos.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_0]' % self.ticket_pos.id)), 1)
|
||||
|
||||
# Not all fields filled out, expect success
|
||||
response = self.client.post(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {
|
||||
'%s-attendee_name' % self.ticket_pos.id: '',
|
||||
'%s-attendee_name_parts_0' % self.ticket_pos.id: '',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response,
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
@@ -168,19 +168,19 @@ class OrdersTest(TestCase):
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret))
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name]' % self.ticket_pos.id)), 1)
|
||||
self.assertEqual(len(doc.select('input[name=%s-attendee_name_parts_0]' % self.ticket_pos.id)), 1)
|
||||
|
||||
# Not all required fields filled out, expect failure
|
||||
response = self.client.post(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {
|
||||
'%s-attendee_name' % self.ticket_pos.id: '',
|
||||
'%s-attendee_name_parts_0' % self.ticket_pos.id: '',
|
||||
}, follow=True)
|
||||
doc = BeautifulSoup(response.rendered_content, "lxml")
|
||||
self.assertGreaterEqual(len(doc.select('.has-error')), 1)
|
||||
|
||||
response = self.client.post(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {
|
||||
'%s-attendee_name' % self.ticket_pos.id: 'Peter',
|
||||
'%s-attendee_name_parts_0' % self.ticket_pos.id: 'Peter',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
self.order.secret),
|
||||
|
||||
@@ -30,7 +30,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
item=self.ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name="Peter"
|
||||
attendee_name_parts={'full_name': "Peter"}
|
||||
)
|
||||
|
||||
def test_iframe_entry_view_wrapper(self):
|
||||
|
||||
Reference in New Issue
Block a user