diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 1a0977ea7..39c8e495e 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -3,7 +3,7 @@ {% block content %} {% if cart.positions %} -
+

{% trans "Your cart" %}

diff --git a/src/pretix/presale/tests/test_event.py b/src/pretix/presale/tests/test_event.py index ad84a732b..4de978a73 100644 --- a/src/pretix/presale/tests/test_event.py +++ b/src/pretix/presale/tests/test_event.py @@ -1,11 +1,10 @@ import datetime -from django.test import TestCase, Client +import time -from pretix.base.models import Item, Organizer, Event, ItemCategory, Quota, Property, PropertyValue, ItemVariation -from pretix.base.tests import BrowserTest, on_platforms +from pretix.base.models import Item, Organizer, Event, ItemCategory, Quota, Property, PropertyValue, ItemVariation, User +from pretix.base.tests import BrowserTest -@on_platforms() class EventMiddlewareTest(BrowserTest): def setUp(self): @@ -26,7 +25,6 @@ class EventMiddlewareTest(BrowserTest): self.assertEqual(resp.status_code, 404) -@on_platforms() class ItemDisplayTest(BrowserTest): def setUp(self): @@ -120,3 +118,58 @@ class ItemDisplayTest(BrowserTest): self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) self.assertIn("12.00", self.driver.find_elements_by_css_selector("section:nth-of-type(1) div.variation")[1].text) + + +class CartTest(BrowserTest): + + def setUp(self): + super().setUp() + self.orga = Organizer.objects.create(name='CCC', slug='ccc') + self.event = Event.objects.create( + organizer=self.orga, name='30C3', slug='30c3', + date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc), + ) + self.user = User.objects.create_local_user(self.event, 'demo', 'demo') + self.driver.implicitly_wait(10) + self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0) + self.quota_shirts = Quota.objects.create(event=self.event, name='Shirts', size=2) + self.shirt = Item.objects.create(event=self.event, name='T-Shirt', category=self.category, default_price=12) + prop1 = Property.objects.create(event=self.event, name="Color") + self.shirt.properties.add(prop1) + val1 = PropertyValue.objects.create(prop=prop1, value="Red", position=0) + val2 = PropertyValue.objects.create(prop=prop1, value="Black", position=1) + self.quota_shirts.items.add(self.shirt) + self.shirt_red = ItemVariation.objects.create(item=self.shirt, default_price=14) + self.shirt_red.values.add(val1) + var2 = ItemVariation.objects.create(item=self.shirt) + var2.values.add(val2) + self.quota_shirts.variations.add(self.shirt_red) + self.quota_shirts.variations.add(var2) + self.quota_tickets = Quota.objects.create(event=self.event, name='Tickets', size=1) + self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', + category=self.category, default_price=23) + self.quota_tickets.items.add(self.ticket) + + def test_not_logged_in(self): + self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) + # add the entry ticket to cart + self.driver.find_element_by_css_selector('input[type=number][name=item_%s]' % self.ticket.identity).send_keys('1') + self.scroll_and_click(self.driver.find_element_by_css_selector('.checkout-button-row button')) + # should redirect to login page + self.driver.find_element_by_name('username') + + def test_simple_login(self): + self.driver.get('%s/%s/%s/' % (self.live_server_url, self.orga.slug, self.event.slug)) + # add the entry ticket to cart + self.driver.find_element_by_css_selector('input[type=number][name=item_%s]' % self.ticket.identity).send_keys('1') + self.scroll_and_click(self.driver.find_element_by_css_selector('.checkout-button-row button')) + # should redirect to login page + # open the login accordion + self.scroll_and_click(self.driver.find_element_by_css_selector('a[href*=loginForm]')) + time.sleep(1) + # enter login details + self.driver.find_element_by_css_selector('#loginForm input[name=username]').send_keys('demo') + self.driver.find_element_by_css_selector('#loginForm input[name=password]').send_keys('demo') + self.scroll_and_click(self.driver.find_element_by_css_selector('#loginForm button.btn-primary')) + # should display our ticket + self.assertIn('Early-bird', self.driver.find_element_by_css_selector('.cart-row:first-child').text) diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 77b1fb839..c61c063fa 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -100,7 +100,7 @@ class CartAdd(EventViewMixin, CartActionMixin, View): (request.user.event is None or request.user.event == request.event): request.session['cart_tmp'] = json.dumps(items) return redirect_to_login( - request.path, reverse('presale:event.checkout.login', kwargs={ + self.get_success_url(), reverse('presale:event.checkout.login', kwargs={ 'organizer': request.event.organizer.slug, 'event': request.event.slug, }), 'next' @@ -239,8 +239,4 @@ class CartAdd(EventViewMixin, CartActionMixin, View): return redirect(self.get_success_url()) def get(self, request, *args, **kwargs): - if 'cart_tmp' in request.session and request.user.is_authenticated(): - items = json.loads(request.session['cart_tmp']) - del request.session['cart_tmp'] - return self.process(items) return redirect(self.get_failure_url()) diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 4a822196d..865d11c55 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -1,3 +1,4 @@ +import json from django.contrib.auth import authenticate from django.core.urlresolvers import reverse from django.core.validators import RegexValidator @@ -13,6 +14,7 @@ from django.conf import settings from pretix.base.models import User from pretix.presale.views import EventViewMixin, CartDisplayMixin +from pretix.presale.views.cart import CartAdd class EventIndex(EventViewMixin, CartDisplayMixin, TemplateView): @@ -205,6 +207,12 @@ class EventLogin(EventViewMixin, TemplateView): template_name = 'pretixpresale/event/login.html' def redirect_to_next(self): + if 'cart_tmp' in self.request.session and self.request.user.is_authenticated(): + items = json.loads(self.request.session['cart_tmp']) + del self.request.session['cart_tmp'] + ca = CartAdd() + ca.request = self.request + return ca.process(items) if 'next' in self.request.GET: return redirect(self.request.GET.get('next')) else: