New implementation of sales channels (#4111)

Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
Raphael Michel
2024-06-30 19:24:30 +02:00
committed by GitHub
parent 95511b0330
commit 4fb5c6bef0
174 changed files with 2902 additions and 616 deletions

View File

@@ -47,7 +47,6 @@ class BundlePricesTest(TestCase):
date_from=datetime.datetime(now().year + 1, 12, 26, tzinfo=datetime.timezone.utc),
live=True,
plugins="pretix.plugins.banktransfer",
sales_channels=['web', 'bar']
)
self.tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))

View File

@@ -71,7 +71,6 @@ class CartTestMixin:
date_from=datetime.datetime(now().year + 1, 12, 26, tzinfo=datetime.timezone.utc),
live=True,
plugins="pretix.plugins.banktransfer",
sales_channels=['web', 'bar']
)
self.tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
self.category = ItemCategory.objects.create(event=self.event, name="Everything", position=0)
@@ -914,8 +913,10 @@ class CartTest(CartTestMixin, TestCase):
self.assertFalse(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).exists())
def test_wrong_sales_channel(self):
self.ticket.sales_channels = ['bar']
self.ticket.save()
with scopes_disabled():
self.ticket.all_sales_channels = False
self.ticket.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
self.ticket.save()
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'item_%d' % self.ticket.id: '1',
}, follow=True)
@@ -923,17 +924,22 @@ class CartTest(CartTestMixin, TestCase):
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 0)
def test_variation_wrong_sales_channel(self):
self.shirt_blue.sales_channels = ['bar']
self.shirt_blue.save()
with scopes_disabled():
self.shirt_blue.all_sales_channels = False
self.shirt_blue.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
self.shirt_blue.save()
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'variation_%d_%d' % (self.shirt.id, self.shirt_blue.id): '1',
}, follow=True)
with scopes_disabled():
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 0)
self.shirt_blue.sales_channels = ['bar', 'web']
self.shirt_blue.save()
self.shirt.sales_channels = ['bar']
self.shirt.save()
self.shirt_blue.all_sales_channels = False
self.shirt_blue.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
self.shirt_blue.limit_sales_channels.add(self.orga.sales_channels.get(identifier="web"))
self.shirt_blue.save()
self.shirt.all_sales_channels = False
self.shirt.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
self.shirt.save()
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'variation_%d_%d' % (self.shirt.id, self.shirt_blue.id): '1',
}, follow=True)
@@ -941,11 +947,13 @@ class CartTest(CartTestMixin, TestCase):
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 0)
def test_other_sales_channel(self):
self.ticket.sales_channels = ['bar']
self.ticket.save()
with scopes_disabled():
self.ticket.all_sales_channels = False
self.ticket.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
self.ticket.save()
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'item_%d' % self.ticket.id: '1',
}, follow=True, PRETIX_SALES_CHANNEL=FoobarSalesChannel)
}, follow=True, PRETIX_SALES_CHANNEL=FoobarSalesChannel.identifier)
with scopes_disabled():
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 1)
@@ -1020,13 +1028,13 @@ class CartTest(CartTestMixin, TestCase):
self.event.settings.max_items_per_order = 5
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
'item_%d' % self.ticket.id: '5',
}, follow=True, PRETIX_SALES_CHANNEL=FoobarSalesChannel)
}, follow=True, PRETIX_SALES_CHANNEL=FoobarSalesChannel.identifier)
self.assertRedirects(response, '/%s/%s/?require_cookie=true' % (self.orga.slug, self.event.slug),
target_status_code=200)
doc = BeautifulSoup(response.rendered_content, "lxml")
self.assertNotIn('more than', doc.select('.alert-danger')[0].text)
with scopes_disabled():
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 1)
self.assertEqual(CartPosition.objects.filter(cart_id=self.session_key, event=self.event).count(), 5)
def test_max_per_item_variations_failed(self):
self.shirt.max_per_order = 1
@@ -2392,7 +2400,8 @@ class CartAddonTest(CartTestMixin, TestCase):
self.workshopquota.variations.add(self.workshop3a)
self.workshopquota.variations.add(self.workshop3b)
self.addon1 = ItemAddOn.objects.create(base_item=self.ticket, addon_category=self.workshopcat)
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key,
sales_channel=self.orga.sales_channels.get(identifier="web"))
@classscope(attr='orga')
def test_cart_set_simple_addon_included(self):
@@ -2715,7 +2724,7 @@ class CartAddonTest(CartTestMixin, TestCase):
self.addon1.multi_allowed = True
self.addon1.save()
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
self.cm.set_addons([
{
'addon_to': cp1.pk,
@@ -2729,7 +2738,7 @@ class CartAddonTest(CartTestMixin, TestCase):
assert cp1.addons.count() == 3
assert all(a.price == Decimal('24.00') for a in cp1.addons.all())
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
self.cm.set_addons([
{
'addon_to': cp1.pk,
@@ -2763,7 +2772,7 @@ class CartAddonTest(CartTestMixin, TestCase):
self.cm.commit()
assert cp1.addons.count() == 3
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
self.cm.set_addons([
{
'addon_to': cp1.pk,
@@ -2775,7 +2784,7 @@ class CartAddonTest(CartTestMixin, TestCase):
self.cm.commit()
assert cp1.addons.count() == 4
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
self.cm.set_addons([
{
'addon_to': cp1.pk,
@@ -3117,7 +3126,7 @@ class CartBundleTest(CartTestMixin, TestCase):
designated_price=1.5,
count=1
)
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
@classscope(attr='orga')
def test_simple_bundle(self):
@@ -3537,7 +3546,7 @@ class CartBundleTest(CartTestMixin, TestCase):
b = cp.addons.first()
assert b.item == self.trans
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
self.cm.set_addons([
{
'addon_to': cp.pk,
@@ -4093,7 +4102,7 @@ class CartSeatingTest(CartTestMixin, TestCase):
self.seat_a1 = self.event.seats.create(seat_number="A1", product=self.ticket, seat_guid="A1")
self.seat_a2 = self.event.seats.create(seat_number="A2", product=self.ticket, seat_guid="A2")
self.seat_a3 = self.event.seats.create(seat_number="A3", product=self.ticket, seat_guid="A3")
self.cm = CartManager(event=self.event, cart_id=self.session_key)
self.cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
def test_add_with_seat_without_variation(self):
self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {

View File

@@ -3760,6 +3760,7 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
o3 = QuestionAnswer.objects.get(question=q3)
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
expires=now() + timedelta(days=3),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=4)
op = OrderPosition.objects.create(order=order, item=self.ticket, price=42)
o1.cartposition, o2.cartposition, o3.cartposition = None, None, None
@@ -4454,7 +4455,7 @@ class CheckoutBundleTest(BaseCheckoutTestCase, TestCase):
)
CartPosition.objects.filter(addon_to__isnull=False).delete()
CartPosition.objects.all().delete()
cm = CartManager(event=self.event, cart_id="temp")
cm = CartManager(event=self.event, cart_id="temp", sales_channel=self.orga.sales_channels.get(identifier="web"))
cm.add_new_items([{
'item': self.ticket.pk,
'variation': None,
@@ -4473,7 +4474,7 @@ class CheckoutBundleTest(BaseCheckoutTestCase, TestCase):
cp.cart_id = self.session_key
cp.addon_to = map[cp.addon_to_id]
cp.save()
cm = CartManager(event=self.event, cart_id=self.session_key)
cm = CartManager(event=self.event, cart_id=self.session_key, sales_channel=self.orga.sales_channels.get(identifier="web"))
cm.commit() # execute discounts on resorted cart
self._set_payment()

View File

@@ -466,6 +466,7 @@ def test_org_order_list(env, client):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=o1,
@@ -481,6 +482,7 @@ def test_org_order_list(env, client):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=o2,
@@ -497,6 +499,7 @@ def test_org_order_list(env, client):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=o3,

View File

@@ -65,7 +65,7 @@ class EventTestMixin:
self.event = Event.objects.create(
organizer=self.orga, name='30C3', slug='30c3',
date_from=datetime.datetime(now().year + 1, 12, 26, 14, 0, tzinfo=datetime.timezone.utc),
live=True, sales_channels=['web', 'bar']
live=True,
)
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
t = Team.objects.create(organizer=self.orga, can_change_event_settings=True)
@@ -153,11 +153,15 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
with scopes_disabled():
q = Quota.objects.create(event=self.event, name='Quota', size=2)
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True,
sales_channels=['bar'])
all_sales_channels=False)
item.limit_sales_channels.add(self.orga.sales_channels.get(identifier="bar"))
q.items.add(item)
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
self.assertNotIn("Early-bird", html)
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug), PRETIX_SALES_CHANNEL=FoobarSalesChannel).rendered_content
html = self.client.get(
'/%s/%s/' % (self.orga.slug, self.event.slug),
PRETIX_SALES_CHANNEL=FoobarSalesChannel.identifier
).rendered_content
self.assertIn("Early-bird", html)
def test_timely_available(self):
@@ -550,7 +554,8 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
q = Quota.objects.create(event=self.event, name='Quota', size=None)
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
var1 = ItemVariation.objects.create(item=item, value='Red')
var2 = ItemVariation.objects.create(item=item, value='Blue', sales_channels=['foobar'])
var2 = ItemVariation.objects.create(item=item, value='Blue', all_sales_channels=False)
var2.limit_sales_channels.add(self.orga.sales_channels.get(identifier='bar'))
q.items.add(item)
q.variations.add(var1)
q.variations.add(var2)
@@ -1278,7 +1283,7 @@ class DeadlineTest(EventTestMixin, TestCase):
def test_saleschannel_disabled(self):
self.event.presale_start = None
self.event.presale_end = None
self.event.sales_channels = []
self.event.all_sales_channels = False
self.event.save()
response = self.client.get(
'/%s/%s/' % (self.orga.slug, self.event.slug)
@@ -1325,6 +1330,7 @@ class TestResendLink(EventTestMixin, SoupTest):
Order.objects.create(
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
email='dummy@dummy.dummy', datetime=now(), expires=now(),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=0,
)
mail.outbox = []
@@ -1339,6 +1345,7 @@ class TestResendLink(EventTestMixin, SoupTest):
Order.objects.create(
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
email='dummy@dummy.dummy', datetime=now(), expires=now(),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=0,
)
mail.outbox = []
@@ -1354,11 +1361,13 @@ class TestResendLink(EventTestMixin, SoupTest):
Order.objects.create(
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
email='dummy@dummy.dummy', datetime=now(), expires=now(),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=0,
)
Order.objects.create(
code='DUMMY2', status=Order.STATUS_PENDING, event=self.event,
email='dummy@dummy.dummy', datetime=now(), expires=now(),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=0,
)
mail.outbox = []

View File

@@ -92,6 +92,7 @@ class BaseOrdersTest(TestCase):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
sales_channel=self.orga.sales_channels.get(identifier="web"),
locale='en'
)
self.ticket_pos = OrderPosition.objects.create(
@@ -1349,12 +1350,12 @@ class OrderChangeAddonsTest(BaseOrdersTest):
self._assert_ws2a_not_allowed()
def test_forbidden_sales_channel(self):
self.workshop2.sales_channels = ['pretixpos']
self.workshop2.all_sales_channels = False
self.workshop2.save()
self._assert_ws2a_not_allowed()
def test_forbidden_var_sales_channel(self):
self.workshop2a.sales_channels = ['pretixpos']
self.workshop2a.all_sales_channels = False
self.workshop2a.save()
self._assert_ws2a_not_allowed()

View File

@@ -91,6 +91,7 @@ class BaseOrdersTest(TestCase):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
sales_channel=self.orga.sales_channels.get(identifier="web"),
locale='en'
)
self.ticket_pos = OrderPosition.objects.create(
@@ -114,7 +115,8 @@ class BaseOrdersTest(TestCase):
email='user@localhost',
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23")
total=Decimal("23"),
sales_channel=self.orga.sales_channels.get(identifier="web"),
)

View File

@@ -46,7 +46,8 @@ class WidgetCartTest(CartTestMixin, TestCase):
datetime=now() - datetime.timedelta(days=3),
expires=now() + datetime.timedelta(days=11),
total=Decimal("23"),
locale='en'
locale='en',
sales_channel=self.orga.sales_channels.get(identifier="web"),
)
self.ticket_pos = OrderPosition.objects.create(
order=self.order,
@@ -146,7 +147,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
self.assertIn('23', doc.select('.cart .cart-row')[0].select('.price')[1].text)
def test_saleschannel_disabled(self):
self.event.sales_channels = []
self.event.all_sales_channels = False
self.event.save()
response = self.client.get('/%s/%s/widget/product_list' % (self.orga.slug, self.event.slug))
data = json.loads(response.content.decode())