Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
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
Beispiel #4
0
 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)