diff --git a/src/pretix/plugins/pretixdroid/views.py b/src/pretix/plugins/pretixdroid/views.py index acfb96ea0d..d4618a3574 100644 --- a/src/pretix/plugins/pretixdroid/views.py +++ b/src/pretix/plugins/pretixdroid/views.py @@ -162,12 +162,20 @@ class ApiRedeemView(ApiView): def serialize_op(op): + name = op.attendee_name + if not name and op.addon_to: + name = op.addon_to.attendee_name + if not name: + try: + name = op.order.invoice_address.name + except: + pass return { 'secret': op.secret, 'order': op.order.code, 'item': str(op.item), 'variation': str(op.variation) if op.variation else None, - 'attendee_name': op.attendee_name or (op.addon_to.attendee_name if op.addon_to else ''), + 'attendee_name': name, 'redeemed': bool(op.checkin_cnt), 'paid': op.order.status == Order.STATUS_PAID, } @@ -181,10 +189,11 @@ class ApiSearchView(ApiView): } if len(query) >= 4: - ops = OrderPosition.objects.select_related('item', 'variation', 'order', 'addon_to').filter( + ops = OrderPosition.objects.select_related('item', 'variation', 'order', 'addon_to', 'order__invoice_address').filter( Q(order__event=self.event) & Q( Q(secret__istartswith=query) | Q(attendee_name__icontains=query) | Q(order__code__istartswith=query) + | Q(order__invoice_address__name__icontains=query) ) & Q(subevent=self.subevent) ).annotate(checkin_cnt=Count('checkins'))[:25] diff --git a/src/tests/plugins/pretixdroid/test_simple.py b/src/tests/plugins/pretixdroid/test_simple.py index 4ea026c563..50e77fa4fc 100644 --- a/src/tests/plugins/pretixdroid/test_simple.py +++ b/src/tests/plugins/pretixdroid/test_simple.py @@ -5,8 +5,8 @@ import pytest from django.utils.timezone import now from pretix.base.models import ( - Checkin, Event, Item, ItemVariation, Order, OrderPosition, Organizer, Team, - User, + Checkin, Event, InvoiceAddress, Item, ItemVariation, Order, OrderPosition, + Organizer, Team, User, ) from pretix.plugins.pretixdroid.views import API_VERSION @@ -166,6 +166,17 @@ def test_search(client, env): assert jdata['results'][0]['secret'] == '5678910' +@pytest.mark.django_db +def test_search_invoice_name(client, env): + env[0].settings.set('pretixdroid_key', 'abcdefg') + InvoiceAddress.objects.create(order=env[2], name="John") + 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")) + assert len(jdata['results']) == 2 + assert set([r['attendee_name'] for r in jdata['results']]) == {'John', 'Peter'} + + @pytest.mark.django_db def test_download_all_data(client, env): env[0].settings.set('pretixdroid_key', 'abcdefg')