From 3c2de09216794ca4dbeec13e2feaaa37c9d676d7 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 19 Jun 2019 09:16:33 +0200 Subject: [PATCH] Integrate orders and vouchers into navigation typeahead --- src/pretix/control/views/typeahead.py | 50 ++++++++++++++++++- .../static/pretixcontrol/js/ui/typeahead.js | 21 ++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index ca52596c1c..4ca3fad9c3 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -11,7 +11,7 @@ from django.utils.formats import get_format from django.utils.timezone import make_aware from django.utils.translation import pgettext, ugettext as _ -from pretix.base.models import Organizer, User +from pretix.base.models import Order, Organizer, User, Voucher from pretix.control.forms.event import EventWizardCopyForm from pretix.control.permissions import event_permission_required from pretix.helpers.daterange import daterange @@ -67,6 +67,32 @@ def serialize_event(e): } +def serialize_order(o): + return { + 'type': 'order', + 'event': str(o.event), + 'title': _('Order {}').format(str(o.code)), + 'url': reverse('control:event.order', kwargs={ + 'event': o.event.slug, + 'organizer': o.event.organizer.slug, + 'code': o.code + }) + } + + +def serialize_voucher(v): + return { + 'type': 'voucher', + 'event': str(v.event), + 'title': _('Voucher {}').format(str(v.code)), + 'url': reverse('control:event.voucher', kwargs={ + 'event': v.event.slug, + 'organizer': v.event.organizer.slug, + 'voucher': v.pk + }) + } + + def event_list(request): query = request.GET.get('query', '') try: @@ -132,6 +158,24 @@ def nav_context_list(request): if query: qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query)) + qs_orders = Order.objects.filter(code__icontains=query).select_related('event', 'event__organizer') + if not request.user.has_active_staff_session(request.session.session_key): + qs_orders = qs_orders.filter( + Q(event__organizer_id__in=request.user.teams.filter( + all_events=True, can_view_orders=True).values_list('organizer', flat=True)) + | Q(event_id__in=request.user.teams.filter( + can_view_orders=True).values_list('limit_events__id', flat=True)) + ) + + qs_vouchers = Voucher.objects.filter(code__icontains=query).select_related('event', 'event__organizer') + if not request.user.has_active_staff_session(request.session.session_key): + qs_orders = qs_orders.filter( + Q(event__organizer_id__in=request.user.teams.filter( + all_events=True, can_view_vouchers=True).values_list('organizer', flat=True)) + | Q(event_id__in=request.user.teams.filter( + can_view_vouchers=True).values_list('limit_events__id', flat=True)) + ) + show_user = not query or ( query and request.user.email and query.lower() in request.user.email.lower() ) or ( @@ -146,6 +190,10 @@ def nav_context_list(request): serialize_orga(e) for e in qs_orga[offset:offset + (pagesize if query else 5)] ] + [ serialize_event(e) for e in qs_events.select_related('organizer')[offset:offset + (pagesize if query else 5)] + ] + [ + serialize_order(e) for e in qs_orders[offset:offset + (pagesize if query else 5)] + ] + [ + serialize_voucher(e) for e in qs_vouchers[offset:offset + (pagesize if query else 5)] ] if show_user and organizer: diff --git a/src/pretix/static/pretixcontrol/js/ui/typeahead.js b/src/pretix/static/pretixcontrol/js/ui/typeahead.js index 9e480353aa..584fc53836 100644 --- a/src/pretix/static/pretixcontrol/js/ui/typeahead.js +++ b/src/pretix/static/pretixcontrol/js/ui/typeahead.js @@ -42,6 +42,27 @@ $(function () { }) ) ); + } else if (res.type === "order" || res.type === "voucher") { + $container.append( + $("
  • ").append( + $("").attr("href", res.url).append( + $("
    ").append( + $("").addClass("event-name-full").append($("
    ").text(res.title).html()) + ).append( + $("").addClass("event-organizer").append( + $("").addClass("fa fa-calendar fa-fw") + ).append(" ").append($("
    ").text(res.event).html()) + ) + ).on("mousedown", function (event) { + if ($(this).length) { + location.href = $(this).attr("href"); + } + $(this).parent().addClass("active"); + event.preventDefault(); + event.stopPropagation(); + }) + ) + ); } else if (res.type === "user") { $container.append( $("
  • ").append(