Separate personalization from admission (#2990)

Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Raphael Michel
2023-01-09 14:57:35 +01:00
committed by GitHub
parent e5528f7784
commit 603225d042
30 changed files with 293 additions and 52 deletions

View File

@@ -262,6 +262,7 @@ TEST_ITEM_RES = {
"tax_rate": "0.00",
"tax_rule": None,
"admission": False,
"personalized": False,
"issue_giftcard": False,
"position": 0,
"generate_tickets": None,
@@ -472,9 +473,12 @@ def test_item_create(token_client, organizer, event, item, category, taxrule, me
)
assert resp.status_code == 201
with scopes_disabled():
assert Item.objects.get(pk=resp.data['id']).sales_channels == ["web", "pretixpos"]
assert Item.objects.get(pk=resp.data['id']).meta_data == {'day': 'Wednesday'}
assert Item.objects.get(pk=resp.data['id']).require_membership_types.count() == 1
i = Item.objects.get(pk=resp.data['id'])
assert i.sales_channels == ["web", "pretixpos"]
assert i.meta_data == {'day': 'Wednesday'}
assert i.require_membership_types.count() == 1
assert i.personalized is True # auto-set for backwards-compatibility
assert i.admission is True
@pytest.mark.django_db
@@ -1077,6 +1081,32 @@ def test_item_update(token_client, organizer, event, item, category, item2, cate
assert resp.status_code == 400
assert resp.content.decode() == '{"meta_data":["Item meta data property \'foo\' does not exist."]}'
item.personalized = True
item.admission = True
item.save()
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk),
{
"admission": False,
"personalized": True,
},
format='json'
)
assert resp.status_code == 400
assert resp.content.decode() == '{"non_field_errors":["Only admission products can currently be personalized."]}'
resp = token_client.patch(
'/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk),
{
"admission": False
},
format='json'
)
assert resp.status_code == 200
item.refresh_from_db()
assert not item.admission
assert not item.personalized # also set for backwards compatibility
@pytest.mark.django_db
def test_item_file_upload(token_client, organizer, event, item):

View File

@@ -89,7 +89,7 @@ class BaseQuotaTestCase(TestCase):
)
self.quota = Quota.objects.create(name="Test", size=2, event=self.event)
self.item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23,
admission=True)
admission=True, personalized=True)
self.item2 = Item.objects.create(event=self.event, name="T-Shirt", default_price=23)
self.item3 = Item.objects.create(event=self.event, name="Goodie", default_price=23)
self.var1 = ItemVariation.objects.create(item=self.item2, value='S')

View File

@@ -80,7 +80,7 @@ def env():
)
ticket = Item.objects.create(event=event, name='Early-bird ticket',
category=None, default_price=23,
admission=True)
admission=True, personalized=True)
event.settings.set('attendee_names_asked', True)
event.settings.set('locales', ['en', 'de'])
OrderPosition.objects.create(
@@ -106,7 +106,7 @@ def test_order_list(client, env):
with scopes_disabled():
otherticket = Item.objects.create(event=env[0], name='Early-bird ticket',
category=None, default_price=23,
admission=True)
admission=True, personalized=True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/')
assert 'FOO' in response.content.decode()
@@ -1354,7 +1354,7 @@ class OrderChangeTests(SoupTest):
mtype = self.event.organizer.membership_types.create(name='Week pass', transferable=True, allow_parallel_usage=True)
self.ticket.require_membership = True
self.ticket.require_membership_types.add(mtype)
self.ticket.admission = True
self.ticket.personalized = True
self.ticket.save()
customer = self.event.organizer.customers.create(email='john@example.org', is_verified=True)
self.order.customer = customer

View File

@@ -71,7 +71,7 @@ class BaseCheckoutTestCase:
self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=5)
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
category=self.category, default_price=23, admission=True,
tax_rule=self.tr19)
personalized=True, tax_rule=self.tr19)
self.quota_tickets.items.add(self.ticket)
self.event.settings.set('timezone', 'UTC')
self.event.settings.set('attendee_names_asked', False)
@@ -987,6 +987,31 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
cr1 = CartPosition.objects.get(id=cr1.id)
self.assertEqual(cr1.attendee_name, 'Peter')
def test_attendee_name_not_required_if_ticket_unpersonalized(self):
self.event.settings.set('attendee_names_asked', True)
self.event.settings.set('attendee_names_required', True)
self.ticket.personalized = False
self.ticket.save()
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.content.decode(), "lxml")
self.assertEqual(len(doc.select('input[name="%s-attendee_name_parts_0"]' % cr1.id)), 0)
# Accepted request
response = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), {
'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.attendee_name, None)
def test_attendee_name_scheme(self):
self.event.settings.set('attendee_names_asked', True)
self.event.settings.set('attendee_names_required', True)
@@ -4522,6 +4547,7 @@ class CustomerCheckoutTestCase(BaseCheckoutTestCase, TestCase):
self.ticket.require_membership = True
self.ticket.require_membership_types.add(mtype)
self.ticket.admission = True
self.ticket.personalized = True
self.ticket.save()
self.event.settings.attendee_names_asked = True

View File

@@ -77,7 +77,7 @@ class BaseOrdersTest(TestCase):
self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=5)
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
category=self.category, default_price=23,
admission=True)
admission=True, personalized=True)
self.quota_tickets.items.add(self.ticket)
self.event.settings.set('attendee_names_asked', True)
self.question = Question.objects.create(question='Foo', type=Question.TYPE_STRING, event=self.event,