Add company and address fields to attendees (#1633)

* Add company and address fields to attendees

* Update src/pretix/control/templates/pretixcontrol/event/settings.html

Co-Authored-By: Martin Gross <gross@rami.io>

Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
Raphael Michel
2020-04-02 14:41:09 +02:00
committed by GitHub
parent b498d45621
commit 2c9b2620ea
24 changed files with 632 additions and 40 deletions

View File

@@ -167,6 +167,12 @@ TEST_ORDERPOSITION_RES = {
"checkins": [],
"downloads": [],
"seat": None,
"company": None,
"street": None,
"zipcode": None,
"city": None,
"country": None,
"state": None,
"answers": [
{
"question": 1,
@@ -1503,6 +1509,7 @@ ORDER_CREATE_PAYLOAD = {
"attendee_name_parts": {"full_name": "Peter"},
"attendee_email": None,
"addon_to": None,
"company": "FOOCORP",
"answers": [
{
"question": 1,
@@ -1556,6 +1563,7 @@ def test_order_create(token_client, organizer, event, item, quota, question):
assert pos.item == item
assert pos.price == Decimal("23.00")
assert pos.attendee_name_parts == {"full_name": "Peter", "_scheme": "full"}
assert pos.company == "FOOCORP"
with scopes_disabled():
answ = pos.answers.first()
assert answ.question == question
@@ -1655,6 +1663,12 @@ def test_order_create_simulate(token_client, organizer, event, item, quota, ques
'tax_rule': None,
'pseudonymization_id': 'PREVIEW',
'seat': None,
'company': "FOOCORP",
'street': None,
'city': None,
'zipcode': None,
'state': None,
'country': None,
'canceled': False
}
],

View File

@@ -15,7 +15,7 @@ from pretix.base.models import (
from pretix.base.services.invoices import generate_invoice, invoice_pdf_task
from pretix.base.services.tickets import generate
from pretix.base.shredder import (
AttendeeNameShredder, CachedTicketShredder, EmailAddressShredder,
AttendeeInfoShredder, CachedTicketShredder, EmailAddressShredder,
InvoiceAddressShredder, InvoiceShredder, PaymentInfoShredder,
QuestionAnswerShredder, WaitingListShredder, shred_constraints,
)
@@ -57,7 +57,8 @@ def order(event, item):
variation=None,
price=Decimal("14"),
attendee_name_parts={'full_name': "Peter", "_scheme": "full"},
attendee_email="foo@example.org"
attendee_email="foo@example.org",
company='Foobar',
)
return o
@@ -145,15 +146,23 @@ def test_attendee_name_shredder(event, order):
l1 = order.log_action(
'pretix.event.order.modified',
data={
"data": [{"attendee_name": "Hans", "question_1": "Test"}],
"data": [{"attendee_name": "Peter", "question_1": "Test", "company": "Foobar"}],
"invoice_data": {"name": "Foo"}
}
)
s = AttendeeNameShredder(event)
s = AttendeeInfoShredder(event)
f = list(s.generate_files())
assert json.loads(f[0][2]) == {
'{}-{}'.format(order.code, 1): 'Peter'
'{}-{}'.format(order.code, 1): {
'name': 'Peter',
'company': 'Foobar',
'street': None,
'zipcode': None,
'city': None,
'country': None,
'state': None
}
}
s.shred_data()
order.refresh_from_db()
@@ -161,6 +170,7 @@ def test_attendee_name_shredder(event, order):
l1.refresh_from_db()
assert 'Hans' not in l1.data
assert 'Foo' in l1.data
assert 'Foobar' not in l1.data
assert 'Test' in l1.data

View File

@@ -139,15 +139,18 @@ def test_csv_order_by_inherited_name_parts(event): # noqa
order=order2,
item=event.items.first(),
variation=None,
company='BARCORP',
price=Decimal("23"),
secret='hutjztuxhkbtwnesv2suqv26k6ttytyy'
)
InvoiceAddress.objects.create(
order=event.orders.get(code='BAR'),
company='FOOCORP',
name_parts={"title": "Mr", "given_name": "Albert", "middle_name": "J", "family_name": "Zulu", "_scheme": "title_given_middle_family"}
)
InvoiceAddress.objects.create(
order=event.orders.get(code='FOO'),
company='FOOCORP',
name_parts={"title": "Mr", "given_name": "Paul", "middle_name": "A", "family_name": "Jones", "_scheme": "title_given_middle_family"}
)
@@ -164,9 +167,9 @@ def test_csv_order_by_inherited_name_parts(event): # noqa
"Checked in","Automatically checked in","Secret","E-mail","Company","Voucher code","Order date","Requires special
attention","Comment"
"BAR","Mr Albert J Zulu","Mr","Albert","J","Zulu","Ticket","23.00","","No","hutjztuxhkbtwnesv2suqv26k6ttytyy",
"dummy@dummy.test","","","2019-02-22","No",""
"dummy@dummy.test","BARCORP","","2019-02-22","No",""
"FOO","Mr Paul A Jones","Mr","Paul","A","Jones","Ticket","23.00","","No","hutjztuxhkbtwnesv2suqv26k6ttytxx",
"dummy@dummy.test","","","2019-02-22","No",""
"dummy@dummy.test","FOOCORP","","2019-02-22","No",""
""")
c = CSVCheckinList(event)
_, _, content = c.render({

View File

@@ -436,6 +436,81 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
cr1 = CartPosition.objects.get(id=cr1.id)
self.assertEqual(cr1.attendee_email, 'foo@localhost')
def test_attendee_company_required(self):
self.event.settings.set('attendee_company_asked', True)
self.event.settings.set('attendee_company_required', True)
with scopes_disabled():
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-company"]' % 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-company' % cr1.id: '',
'email': 'admin@localhost'
}, follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertGreaterEqual(len(doc.select('.has-error')), 1)
# Corrected request
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
'%s-company' % cr1.id: 'foobar',
'email': 'admin@localhost'
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)
with scopes_disabled():
cr1 = CartPosition.objects.get(id=cr1.id)
self.assertEqual(cr1.company, 'foobar')
def test_attendee_address_required(self):
self.event.settings.set('attendee_addresses_asked', True)
self.event.settings.set('attendee_addresses_required', True)
with scopes_disabled():
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('textarea[name="%s-street"]' % 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-street' % cr1.id: '',
'%s-zipcode' % cr1.id: '',
'%s-city' % cr1.id: '',
'%s-country' % cr1.id: '',
'%s-state' % cr1.id: '',
'email': 'admin@localhost'
}, follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertGreaterEqual(len(doc.select('.has-error')), 1)
# Corrected request
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
'%s-street' % cr1.id: 'Musterstrasse',
'%s-zipcode' % cr1.id: '12345',
'%s-city' % cr1.id: 'Musterstadt',
'%s-country' % cr1.id: 'DE',
'%s-state' % cr1.id: '',
'email': 'admin@localhost'
}, follow=True)
self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug),
target_status_code=200)
with scopes_disabled():
cr1 = CartPosition.objects.get(id=cr1.id)
self.assertEqual(cr1.street, 'Musterstrasse')
self.assertEqual(cr1.zipcode, '12345')
self.assertEqual(cr1.city, 'Musterstadt')
self.assertEqual(cr1.country, 'DE')
def test_attendee_name_required(self):
self.event.settings.set('attendee_names_asked', True)
self.event.settings.set('attendee_names_required', True)