mirror of
https://github.com/pretix/pretix.git
synced 2026-05-11 16:13:59 +00:00
Enabled asynchronous cart/order actions
This commit is contained in:
@@ -1,13 +1,15 @@
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.views.generic import View
|
||||
|
||||
from pretix.base.services.cart import (
|
||||
CartError, add_items_to_cart, remove_items_from_cart,
|
||||
)
|
||||
from pretix.presale.views import EventViewMixin
|
||||
from pretix.presale.views.async import AsyncAction
|
||||
|
||||
|
||||
class CartActionMixin:
|
||||
@@ -15,18 +17,16 @@ class CartActionMixin:
|
||||
def get_next_url(self):
|
||||
if "next" in self.request.GET and '://' not in self.request.GET:
|
||||
return self.request.GET.get('next')
|
||||
elif "HTTP_REFERER" in self.request.META:
|
||||
return self.request.META.get('HTTP_REFERER')
|
||||
else:
|
||||
return reverse('presale:event.index', kwargs={
|
||||
'event': self.request.event.slug,
|
||||
'organizer': self.request.event.organizer.slug,
|
||||
})
|
||||
|
||||
def get_success_url(self):
|
||||
def get_success_url(self, value=None):
|
||||
return self.get_next_url()
|
||||
|
||||
def get_failure_url(self):
|
||||
def get_error_url(self):
|
||||
return self.get_next_url()
|
||||
|
||||
def _items_from_post_data(self):
|
||||
@@ -61,27 +61,34 @@ class CartRemove(EventViewMixin, CartActionMixin, View):
|
||||
def post(self, *args, **kwargs):
|
||||
items = self._items_from_post_data()
|
||||
if not items:
|
||||
return redirect(self.get_failure_url())
|
||||
return redirect(self.get_error_url())
|
||||
|
||||
remove_items_from_cart(self.request.event.identity, items, self.request.session.session_key)
|
||||
messages.success(self.request, _('Your cart has been updated.'))
|
||||
return redirect(self.get_success_url())
|
||||
|
||||
|
||||
class CartAdd(EventViewMixin, CartActionMixin, View):
|
||||
class CartAdd(EventViewMixin, CartActionMixin, AsyncAction, View):
|
||||
task = add_items_to_cart
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
def get_success_message(self, value):
|
||||
return _('The products have been successfully added to your cart.')
|
||||
|
||||
def get_error_message(self, exception):
|
||||
if isinstance(exception, dict) and exception['exc_type'] == 'CartError':
|
||||
return exception['exc_message']
|
||||
elif isinstance(exception, CartError):
|
||||
return str(exception)
|
||||
return super().get_error_message(exception)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
items = self._items_from_post_data()
|
||||
return self.process(items)
|
||||
|
||||
def process(self, items):
|
||||
try:
|
||||
add_items_to_cart(self.request.event.identity, items, self.request.session.session_key)
|
||||
messages.success(self.request, _('The products have been successfully added to your cart.'))
|
||||
return redirect(self.get_success_url())
|
||||
except CartError as e:
|
||||
messages.error(self.request, str(e))
|
||||
return redirect(self.get_failure_url())
|
||||
if items:
|
||||
return self.do(self.request.event.identity, items, self.request.session.session_key)
|
||||
else:
|
||||
if 'ajax' in self.request.GET or 'ajax' in self.request.POST:
|
||||
return JsonResponse({
|
||||
'redirect': self.get_error_url()
|
||||
})
|
||||
else:
|
||||
return redirect(self.get_error_url())
|
||||
|
||||
Reference in New Issue
Block a user