def filter_qs(self, qs): fdata = self.cleaned_data if fdata.get('query'): u = fdata.get('query') if "-" in u: code = (Q(event__slug__icontains=u.rsplit("-", 1)[0]) & Q(code__icontains=Order.normalize_code(u.rsplit("-", 1)[1]))) else: code = Q(code__icontains=Order.normalize_code(u)) matching_invoices = Invoice.objects.filter( Q(invoice_no__iexact=u) | Q(invoice_no__iexact=u.zfill(5)) | Q(full_invoice_no__iexact=u) ).values_list('order_id', flat=True) matching_positions = OrderPosition.objects.filter( Q( Q(attendee_name_cached__icontains=u) | Q(attendee_email__icontains=u) | Q(secret__istartswith=u) | Q(pseudonymization_id__istartswith=u) ) ).values_list('order_id', flat=True) matching_invoice_addresses = InvoiceAddress.objects.filter( Q( Q(name_cached__icontains=u) | Q(company__icontains=u) ) ).values_list('order_id', flat=True) matching_orders = Order.objects.filter( code | Q(email__icontains=u) | Q(comment__icontains=u) ).values_list('id', flat=True) mainq = ( Q(pk__in=matching_orders) | Q(pk__in=matching_invoices) | Q(pk__in=matching_positions) | Q(pk__in=matching_invoice_addresses) | Q(pk__in=matching_invoices) ) for recv, q in order_search_filter_q.send(sender=getattr(self, 'event', None), query=u): mainq = mainq | q qs = qs.filter( mainq ) if fdata.get('status'): s = fdata.get('status') if s == 'o': qs = qs.filter(status=Order.STATUS_PENDING, expires__lt=now().replace(hour=0, minute=0, second=0)) elif s == 'np': qs = qs.filter(status__in=[Order.STATUS_PENDING, Order.STATUS_PAID]) elif s == 'ne': qs = qs.filter(status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED]) elif s in ('p', 'n', 'e', 'c', 'r'): qs = qs.filter(status=s) elif s == 'overpaid': qs = Order.annotate_overpayments(qs, refunds=False, results=False, sums=True) qs = qs.filter( Q(~Q(status=Order.STATUS_CANCELED) & Q(pending_sum_t__lt=0)) | Q(Q(status=Order.STATUS_CANCELED) & Q(pending_sum_rc__lt=0)) ) elif s == 'rc': qs = qs.filter( cancellation_requests__isnull=False ) elif s == 'pendingpaid': qs = Order.annotate_overpayments(qs, refunds=False, results=False, sums=True) qs = qs.filter( Q(status__in=(Order.STATUS_EXPIRED, Order.STATUS_PENDING)) & Q(pending_sum_t__lte=0) & Q(require_approval=False) ) elif s == 'underpaid': qs = Order.annotate_overpayments(qs, refunds=False, results=False, sums=True) qs = qs.filter( status=Order.STATUS_PAID, pending_sum_t__gt=0 ) elif s == 'pa': qs = qs.filter( status=Order.STATUS_PENDING, require_approval=True ) elif s == 'testmode': qs = qs.filter( testmode=True ) elif s == 'cp': s = OrderPosition.objects.filter( order=OuterRef('pk') ) qs = qs.annotate( has_pc=Exists(s) ).filter( Q(status=Order.STATUS_PAID, has_pc=False) | Q(status=Order.STATUS_CANCELED) ) if fdata.get('ordering'): qs = qs.order_by(self.get_order_by()) if fdata.get('provider'): qs = qs.annotate( has_payment_with_provider=Exists( OrderPayment.objects.filter( Q(order=OuterRef('pk')) & Q(provider=fdata.get('provider')) ) ) ) qs = qs.filter(has_payment_with_provider=1) return qs
def filter_qs(self, qs): fdata = self.cleaned_data if fdata.get('query'): u = fdata.get('query') if "-" in u: code = (Q(event__slug__icontains=u.rsplit("-", 1)[0]) & Q(code__icontains=Order.normalize_code( u.rsplit("-", 1)[1]))) else: code = Q(code__icontains=Order.normalize_code(u)) matching_invoices = Invoice.objects.filter( Q(invoice_no__iexact=u) | Q(invoice_no__iexact=u.zfill(5)) | Q(full_invoice_no__iexact=u)).values_list('order_id', flat=True) matching_positions = OrderPosition.objects.filter( Q(order=OuterRef('pk')) & Q( Q(attendee_name_cached__icontains=u) | Q(attendee_email__icontains=u) | Q(secret__istartswith=u) | Q(voucher__code__icontains=u))).values('id') mainq = (code | Q(email__icontains=u) | Q(invoice_address__name_cached__icontains=u) | Q(invoice_address__company__icontains=u) | Q(pk__in=matching_invoices) | Q(comment__icontains=u) | Q(has_pos=True)) for recv, q in order_search_filter_q.send(sender=getattr( self, 'event', None), query=u): mainq = mainq | q qs = qs.annotate(has_pos=Exists(matching_positions)).filter(mainq) if fdata.get('status'): s = fdata.get('status') if s == 'o': qs = qs.filter(status=Order.STATUS_PENDING, expires__lt=now().replace(hour=0, minute=0, second=0)) elif s == 'np': qs = qs.filter( status__in=[Order.STATUS_PENDING, Order.STATUS_PAID]) elif s == 'ne': qs = qs.filter( status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED]) elif s in ('p', 'n', 'e', 'c', 'r'): qs = qs.filter(status=s) if fdata.get('ordering'): qs = qs.order_by(self.get_order_by()) if fdata.get('provider'): qs = qs.annotate(has_payment_with_provider=Exists( OrderPayment.objects.filter( Q(order=OuterRef('pk')) & Q(provider=fdata.get('provider'))))) qs = qs.filter(has_payment_with_provider=1) return qs