Fix #1001 -- Add product bundles (#1041)

* Data model + Editor

* Cart and order management

* Rebase migrations

* Fix typos, add tests on cart handling

* Add tests for checkout and quotas

* Add API endpoints

* Validation of settings

* Front page tax display

* Voucher handling

* Widget foo

* Show correct net pricing

* Front page tests

* reverse charge foo

* Allow to require bundling

* Fix test failure on postgres
This commit is contained in:
Raphael Michel
2019-03-22 14:48:48 +00:00
committed by GitHub
parent c4b18a4c81
commit 90f881c48e
34 changed files with 2747 additions and 153 deletions

View File

@@ -20,7 +20,9 @@ from pretix.base.models import (
Organizer, Question, Quota, User, Voucher, WaitingListEntry,
)
from pretix.base.models.event import SubEvent
from pretix.base.models.items import SubEventItem, SubEventItemVariation
from pretix.base.models.items import (
ItemBundle, SubEventItem, SubEventItemVariation,
)
from pretix.base.reldate import RelativeDate, RelativeDateWrapper
from pretix.base.services.orders import OrderError, cancel_order, perform_order
@@ -453,6 +455,111 @@ class QuotaTestCase(BaseQuotaTestCase):
self.event.save()
class BundleQuotaTestCase(BaseQuotaTestCase):
def setUp(self):
super().setUp()
self.quota.size = 5
self.quota.save()
self.trans = Item.objects.create(event=self.event, name='Public Transport Ticket',
default_price=2.50)
self.transquota = Quota.objects.create(event=self.event, name='Transport', size=10)
self.transquota.items.add(self.trans)
self.quota.items.add(self.item1)
self.quota.items.add(self.item2)
self.quota.variations.add(self.var1)
self.bundle1 = ItemBundle.objects.create(
base_item=self.item1,
bundled_item=self.trans,
designated_price=1.5,
count=1
)
self.bundle2 = ItemBundle.objects.create(
base_item=self.item2,
bundled_item=self.trans,
designated_price=1.5,
count=1
)
def test_only_respect_with_flag(self):
assert self.item1.check_quotas() == (Quota.AVAILABILITY_OK, 5)
def test_do_not_exceed(self):
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5)
def test_limited_by_bundled_quita(self):
self.transquota.size = 3
self.transquota.save()
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 3)
def test_multiple_bundles(self):
ItemBundle.objects.create(
base_item=self.item1,
bundled_item=self.trans,
designated_price=1.5,
count=1
)
self.transquota.size = 3
self.transquota.save()
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1)
def test_bundle_count(self):
self.bundle1.count = 2
self.bundle1.save()
self.transquota.size = 3
self.transquota.save()
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1)
def test_bundled_unlimited(self):
self.transquota.size = None
self.transquota.save()
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5)
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5)
def test_item_unlimited(self):
self.quota.size = None
self.quota.save()
assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 10)
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 10)
def test_var_only_respect_with_flag(self):
assert self.var1.check_quotas() == (Quota.AVAILABILITY_OK, 5)
def test_var_do_not_exceed(self):
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5)
def test_var_limited_by_bundled_quita(self):
self.transquota.size = 3
self.transquota.save()
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 3)
def test_var_multiple_bundles(self):
ItemBundle.objects.create(
base_item=self.item2,
bundled_item=self.trans,
designated_price=1.5,
count=1
)
self.transquota.size = 3
self.transquota.save()
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1)
def test_var_bundle_count(self):
self.bundle2.count = 2
self.bundle2.save()
self.transquota.size = 3
self.transquota.save()
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1)
def test_bundled_variation(self):
v = self.trans.variations.create(value="foo", default_price=4)
self.transquota.variations.add(v)
self.bundle2.bundled_variation = v
self.bundle2.save()
self.transquota.size = 3
self.transquota.save()
assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 3)
class WaitingListTestCase(BaseQuotaTestCase):
def test_duplicate(self):