def approve(self, request, **kwargs): send_mail = request.data.get('send_email', True) order = self.get_object() try: approve_order( order, user=request.user if request.user.is_authenticated else None, auth=request.auth if isinstance(request.auth, (Device, TeamAPIToken, OAuthAccessToken)) else None, send_mail=send_mail, ) except Quota.QuotaExceededException as e: return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST) except OrderError as e: return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST) return self.retrieve(request, [], **kwargs)
def test_approve_free(event): djmail.outbox = [] event.settings.invoice_generate = 'True' o1 = Order.objects.create( code='FOO', event=event, email='*****@*****.**', status=Order.STATUS_PENDING, datetime=now(), expires=now() - timedelta(days=10), total=0, require_approval=True ) approve_order(o1) o1.refresh_from_db() assert o1.expires > now() assert o1.status == Order.STATUS_PAID assert not o1.require_approval assert o1.invoices.count() == 0 assert len(djmail.outbox) == 1 assert 'confirmed' in djmail.outbox[0].subject
def approve_orders(self, positions, count): """WARNING DANGER ATTENTION This only works when there is only one orderposition per order!!!""" approved = 0 for position in positions: if approved >= count: break try: SwapApproval.objects.create(order=position.order) approve_order( position.order, user=self.request.user, send_mail=True, ) approved += 1 except OrderError as e: position.order.log_action( "pretix_swap.cancelation.approve_failed", data={"detail": str(e)}, user=self.request.user, ) return approved
def run_raffle(self, event: Event, subevent_id: int, user_id: int, raffle_size: int): subevent = SubEvent.objects.get(pk=subevent_id) if subevent_id else None user = User.objects.get(pk=user_id) other_subevent_count = OrderPosition.objects.filter( order=OuterRef('pk'), item__admission=True ).exclude( subevent_id=subevent_id, ).order_by().values('order').annotate(k=Count('id')).values('k') subevent_count = OrderPosition.objects.filter( order=OuterRef('pk'), subevent_id=subevent_id, item__admission=True ).order_by().values('order').annotate(k=Count('id')).values('k') eligible_orders = event.orders.annotate( pcnt_othersub=Subquery(other_subevent_count, output_field=IntegerField()), pcnt_subevent=Subquery(subevent_count, output_field=IntegerField()), ).filter( pcnt_othersub__isnull=True, pcnt_subevent__gte=1, require_approval=True, status=Order.STATUS_PENDING, ).select_related('raffle_override', 'orderclique', 'orderclique__clique').prefetch_related('positions') clique_ids_remove = set() raffle_keys_prefer = set() raffle_tickets = defaultdict(list) for order in eligible_orders: try: rom = order.raffle_override.mode except OrderRaffleOverride.DoesNotExist: rom = None if rom == OrderRaffleOverride.MODE_NEVER: # banned ticket, ban whole clique if getattr(order, 'orderclique', None): clique_ids_remove.add(order.orderclique.clique_id) continue if getattr(order, 'orderclique', None): raffle_tickets['clique', order.orderclique.clique_id].append(order) if rom == OrderRaffleOverride.MODE_ALWAYS: raffle_keys_prefer.add(('clique', order.orderclique.clique_id)) else: raffle_tickets['order', order.code].append(order) if rom == OrderRaffleOverride.MODE_ALWAYS: raffle_keys_prefer.add(('order', order.code)) for k in clique_ids_remove: try: del raffle_tickets['clique', k] raffle_keys_prefer.remove(('clique', k)) except KeyError: pass raffle_keys_not_preferred = [k for k in raffle_tickets.keys() if k not in raffle_keys_prefer] random.shuffle(raffle_keys_not_preferred) raffle_order = list(raffle_keys_prefer) + raffle_keys_not_preferred approvals_left = raffle_size orders_to_approve = [] while raffle_order and approvals_left > 0: orders = raffle_tickets[raffle_order.pop(0)] n_tickets = sum(o.pcnt_subevent for o in orders) orders_to_approve += orders approvals_left -= n_tickets self.update_state( state='PROGRESS', meta={'value': 0} ) for i, order in enumerate(orders_to_approve): try: approve_order( order, user=user, send_mail=True, ) except OrderError as e: order.log_action('pretix_cliques.raffle.approve_failed', data={'detail': str(e)}, user=user) if i % 50 == 0: self.update_state( state='PROGRESS', meta={'value': round(i / len(orders_to_approve) * 100, 2)} ) return len(orders_to_approve)