mirror of
https://github.com/pretix/pretix.git
synced 2026-08-10 10:47:00 +00:00
Check-in API: Fall back from attendee_name
This commit is contained in:
@@ -184,8 +184,40 @@ class RequireAttentionField(serializers.Field):
|
||||
return instance.order.checkin_attention or instance.item.checkin_attention
|
||||
|
||||
|
||||
class AttendeeNameField(serializers.Field):
|
||||
def to_representation(self, instance: OrderPosition):
|
||||
an = instance.attendee_name
|
||||
if not an:
|
||||
if instance.addon_to_id:
|
||||
an = instance.addon_to.attendee_name
|
||||
if not an:
|
||||
try:
|
||||
an = instance.order.invoice_address.name
|
||||
except InvoiceAddress.DoesNotExist:
|
||||
pass
|
||||
return an
|
||||
|
||||
|
||||
class AttendeeNamePartsField(serializers.Field):
|
||||
def to_representation(self, instance: OrderPosition):
|
||||
an = instance.attendee_name
|
||||
p = instance.attendee_name_parts
|
||||
if not an:
|
||||
if instance.addon_to_id:
|
||||
an = instance.addon_to.attendee_name
|
||||
p = instance.addon_to.attendee_name_parts
|
||||
if not an:
|
||||
try:
|
||||
p = instance.order.invoice_address.name_parts
|
||||
except InvoiceAddress.DoesNotExist:
|
||||
pass
|
||||
return p
|
||||
|
||||
|
||||
class CheckinListOrderPositionSerializer(OrderPositionSerializer):
|
||||
require_attention = RequireAttentionField(source='*')
|
||||
attendee_name = AttendeeNameField(source='*')
|
||||
attendee_name_parts = AttendeeNamePartsField(source='*')
|
||||
order__status = serializers.SlugRelatedField(read_only=True, slug_field='status', source='order')
|
||||
|
||||
class Meta:
|
||||
|
||||
@@ -229,7 +229,7 @@ class CheckinListPositionViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
)
|
||||
))
|
||||
).select_related(
|
||||
'item', 'variation', 'item__category', 'addon_to', 'order'
|
||||
'item', 'variation', 'item__category', 'addon_to', 'order', 'order__invoice_address'
|
||||
)
|
||||
else:
|
||||
qs = qs.prefetch_related(
|
||||
|
||||
@@ -474,6 +474,23 @@ def test_custom_datetime(token_client, organizer, clist, event, order):
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_name_fallback(token_client, organizer, clist, event, order):
|
||||
order.invoice_address.name_parts = {'_legacy': 'Paul'}
|
||||
order.invoice_address.save()
|
||||
op = order.positions.first()
|
||||
op.attendee_name_cached = None
|
||||
op.attendee_name_parts = {}
|
||||
op.save()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, op.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
assert resp.data['position']['attendee_name'] == 'Paul'
|
||||
assert resp.data['position']['attendee_name_parts'] == {'_legacy': 'Paul'}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_by_secret(token_client, organizer, clist, event, order):
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
|
||||
Reference in New Issue
Block a user