def dispatch(self, request, *args, **kwargs): self.request = request if not self.positions and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return redirect(reverse('presale:event.index', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug })) flow = get_checkout_flow(self.request.event) for step in flow: if not step.is_applicable(request): continue if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) if not is_selected and not step.is_completed(request, warn=not is_selected): return redirect(step.get_step_url()) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) raise Http404()
def dispatch(self, request, *args, **kwargs): self.request = request if not self.positions and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return redirect( eventreverse(self.request.event, 'presale:event.index')) flow = get_checkout_flow(self.request.event) for step in flow: if not step.is_applicable(request): continue if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed( request, warn=not is_selected): return redirect(step.get_step_url()) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) raise Http404()
def dispatch(self, request, *args, **kwargs): self.request = request cart_pos = CartPosition.objects.filter( cart_id=self.request.session.session_key, event=self.request.event) if not cart_pos.exists() and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return redirect( eventreverse(self.request.event, 'presale:event.index')) try: validate_cart.send(sender=self.request.event, positions=cart_pos) except CartError as e: messages.error(request, str(e)) return redirect( eventreverse(self.request.event, 'presale:event.index')) flow = get_checkout_flow(self.request.event) for step in flow: if not step.is_applicable(request): continue if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed( request, warn=not is_selected): return redirect(step.get_step_url()) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) raise Http404()
def test_flow_order(event): orig_flow = checkoutflow.DEFAULT_FLOW checkoutflow.DEFAULT_FLOW = ( checkoutflow.ConfirmStep, checkoutflow.PaymentStep, checkoutflow.QuestionsStep ) flow = checkoutflow.get_checkout_flow(event) assert all(flow[i].priority <= flow[i + 1].priority for i in range(len(flow) - 1)) checkoutflow.DEFAULT_FLOW = orig_flow
def dispatch(self, request, *args, **kwargs): self.request = request if not get_cart(request) and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return redirect( eventreverse(self.request.event, 'presale:event.index')) if not request.event.presale_is_running: messages.error( request, _("The presale for this event is over or has not yet started.") ) return redirect( eventreverse(self.request.event, 'presale:event.index')) cart_error = None try: validate_cart.send(sender=self.request.event, positions=get_cart(request)) except CartError as e: cart_error = e flow = get_checkout_flow(self.request.event) previous_step = None for step in flow: if not step.is_applicable(request): continue if step.requires_valid_cart and cart_error: messages.error(request, str(cart_error)) return redirect( previous_step.get_step_url() if previous_step else eventreverse(self.request.event, 'presale:event.index')) if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed( request, warn=not is_selected): return redirect(step.get_step_url()) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) else: previous_step = step raise Http404()
def dispatch(self, request, *args, **kwargs): self.request = request if not cart_exists(request) and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return self.redirect(self.get_index_url(self.request)) if not request.event.presale_is_running: messages.error(request, _("The presale for this event is over or has not yet started.")) return self.redirect(self.get_index_url(self.request)) cart_error = None try: validate_cart.send(sender=self.request.event, positions=get_cart(request)) except CartError as e: cart_error = e flow = request._checkout_flow = get_checkout_flow(self.request.event) previous_step = None for step in flow: if not step.is_applicable(request): continue if step.requires_valid_cart and cart_error: messages.error(request, str(cart_error)) return self.redirect(previous_step.get_step_url(request) if previous_step else self.get_index_url(request)) if 'step' not in kwargs: return self.redirect(step.get_step_url(request)) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed(request, warn=not is_selected): return self.redirect(step.get_step_url(request)) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) else: previous_step = step step.c_is_before = True step.c_resolved_url = step.get_step_url(request) raise Http404()
def dispatch(self, request, *args, **kwargs): self.request = request has_cart = CartPosition.objects.filter( cart_id=self.request.session.session_key, event=self.request.event).exists() if not has_cart and "async_id" not in request.GET: messages.error(request, _("Your cart is empty")) return redirect(eventreverse(self.request.event, 'presale:event.index')) flow = get_checkout_flow(self.request.event) for step in flow: if not step.is_applicable(request): continue if 'step' not in kwargs: return redirect(step.get_step_url()) is_selected = (step.identifier == kwargs.get('step', '')) if "async_id" not in request.GET and not is_selected and not step.is_completed(request, warn=not is_selected): return redirect(step.get_step_url()) if is_selected: if request.method.lower() in self.http_method_names: handler = getattr(step, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request) raise Http404()
def with_mocked_step(mocker, step, event): from pretix.presale.signals import checkout_flow_steps mocker.patch('pretix.presale.signals.checkout_flow_steps.send') checkout_flow_steps.send.return_value = [(None, step)] return checkoutflow.get_checkout_flow(event)
def test_plugins_called(event, mocker): from pretix.presale.signals import checkout_flow_steps mocker.patch('pretix.presale.signals.checkout_flow_steps.send') checkoutflow.get_checkout_flow(event) checkout_flow_steps.send.assert_called_once_with(event)
def test_double_linked_list(event): flow = checkoutflow.get_checkout_flow(event) assert all(flow[i]._next is flow[i + 1] for i in range(len(flow) - 1)) assert all(flow[i + 1]._previous is flow[i] for i in range(len(flow) - 1))
def test_step_first_last(event): flow = checkoutflow.get_checkout_flow(event) assert flow[0].get_prev_applicable(req_with_session) is None assert flow[-1].get_next_applicable(req_with_session) is None