mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
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:
@@ -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
|
||||
}
|
||||
],
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user