Fix #782 -- Select2 widget for item selection for vouchers

This commit is contained in:
Raphael Michel
2018-04-03 12:10:34 +02:00
parent 7ec5adb6b4
commit bb10d25561
6 changed files with 163 additions and 36 deletions

View File

@@ -158,6 +158,85 @@ def checkinlist_select2(request, **kwargs):
return JsonResponse(doc)
@event_permission_required(None)
def itemvarquota_select2(request, **kwargs):
query = request.GET.get('query', '')
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
choices = []
if not request.event.has_subevents:
# We are very unlikely to need pagination
itemqs = request.event.items.prefetch_related('variations').filter(name__icontains=i18ncomp(query))
quotaqs = request.event.quotas.filter(name__icontains=query)
more = False
else:
# We can't do proper pagination on a UNION-like query, so we hack it.
if query:
# Don't paginate
quotaf = Q(name__icontains=query)
try:
dt = parse(query)
except ValueError:
pass
else:
tz = request.event.timezone
if dt and request.event.has_subevents:
dt_start = make_aware(datetime.combine(dt.date(), time(hour=0, minute=0, second=0)), tz)
dt_end = make_aware(datetime.combine(dt.date(), time(hour=23, minute=59, second=59)), tz)
quotaf |= Q(subevent__date_from__gte=dt_start) & Q(subevent__date_from__lte=dt_end)
itemqs = request.event.items.prefetch_related('variations').filter(name__icontains=i18ncomp(query))
quotaqs = request.event.quotas.filter(quotaf).select_related('subevent')
more = False
else:
if page == 1:
itemqs = request.event.items.prefetch_related('variations').filter(name__icontains=i18ncomp(query))
else:
itemqs = request.event.items.none()
quotaqs = request.event.quotas.filter(name__icontains=query).select_related('subevent')
total = quotaqs.count()
pagesize = 20
offset = (page - 1) * pagesize
quotaqs = quotaqs[offset:offset + pagesize]
more = total >= (offset + pagesize)
for i in itemqs:
variations = list(i.variations.all())
if variations:
choices.append((str(i.pk), _('{product} Any variation').format(product=i.name), ''))
for v in variations:
choices.append(('%d-%d' % (i.pk, v.pk), '%s %s' % (i.name, v.value), ''))
else:
choices.append((str(i.pk), i.name, ''))
for q in quotaqs:
if request.event.has_subevents:
choices.append(('q-%d' % q.pk,
_('Any product in quota "{quota}"').format(
quota=q
), str(q.subevent)))
else:
choices.append(('q-%d' % q.pk, _('Any product in quota "{quota}"').format(quota=q), ''))
doc = {
'results': [
{
'id': k,
'text': str(v),
'event': str(t),
}
for k, v, t in choices
],
'pagination': {
"more": more
}
}
return JsonResponse(doc)
def organizer_select2(request):
term = request.GET.get('query', '')
try: