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

@@ -74,7 +74,8 @@ def dashboard_env():
code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=33, locale='en'
total=33, locale='en',
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=order_paid,
@@ -108,7 +109,8 @@ def test_dashboard_pending_not_count(dashboard_env):
code='BAR', event=dashboard_env[0], email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=dashboard_env[0].organizer.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=order_pending,
@@ -161,25 +163,29 @@ def checkin_list_env():
code='PENDING', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
order_a1 = Order.objects.create(
code='A1', event=event, email='a1dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=33, locale='en'
total=33, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
order_a2 = Order.objects.create(
code='A2', event=event, email='a2dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
order_a3 = Order.objects.create(
code='A3', event=event, email='a3dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
# order position
@@ -381,19 +387,22 @@ def checkin_list_with_addon_env():
code='PENDING', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
order_a1 = Order.objects.create(
code='A1', event=event, email='a1dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=33, locale='en'
total=33, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
order_a2 = Order.objects.create(
code='A2', event=event, email='a2dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + timedelta(days=10),
total=23, locale='en'
total=23, locale='en',
sales_channel=orga.sales_channels.get(identifier="web"),
)
# order position

View File

@@ -68,6 +68,7 @@ def order(event, customer):
email='admin@localhost',
datetime=now() - timedelta(days=3),
expires=now() + timedelta(days=11),
sales_channel=event.organizer.sales_channels.get(identifier="web"),
total=Decimal("23"),
)
OrderPosition.objects.create(

View File

@@ -322,13 +322,15 @@ class EventsTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
total=14, locale='en', testmode=True,
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
self.event1.testmode = True
self.event1.save()
@@ -346,13 +348,15 @@ class EventsTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en', testmode=True
total=14, locale='en', testmode=True,
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
o2 = Order.objects.create(
code='FOO2', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
self.event1.testmode = True
self.event1.save()
@@ -1267,12 +1271,14 @@ class EventDeletionTest(SoupTest):
assert self.orga1.events.exists()
def test_delete_orders(self):
Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now(),
total=14, locale='en'
)
with scopes_disabled():
Order.objects.create(
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now(),
total=14, locale='en',
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
self.post_doc('/control/event/ccc/30c3/delete/', {
'user_pw': 'dummy',
'slug': '30c3'

View File

@@ -133,7 +133,8 @@ def test_card_detail_view_transact_revert_refund(organizer, admin_user, gift_car
code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_CANCELED,
datetime=now(), expires=now() + timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
o.payments.create(
amount=o.total, provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CONFIRMED

View File

@@ -225,6 +225,7 @@ class QuestionsTest(ItemFormTest):
o = Order.objects.create(code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING, datetime=now(),
expires=now() + datetime.timedelta(days=10),
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
total=14, locale='en')
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
attendee_name_parts={'full_name': "Peter"})
@@ -634,6 +635,7 @@ class ItemsTest(ItemFormTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
total=14, locale='en'
)
OrderPosition.objects.create(
@@ -679,7 +681,7 @@ class ItemsTest(ItemFormTest):
assert i_new.require_voucher == i_old.require_voucher
assert i_new.hide_without_voucher == i_old.hide_without_voucher
assert i_new.allow_cancel == i_old.allow_cancel
assert i_new.sales_channels == i_old.sales_channels
assert set(i_new.limit_sales_channels.all()) == set(i_old.limit_sales_channels.all())
assert i_new.meta_data == i_old.meta_data == {"Foo": "Bar"}
assert set(i_new.questions.all()) == set(i_old.questions.all())
assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()])

View File

@@ -74,7 +74,8 @@ def env():
code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
o.payments.create(
amount=o.total, provider='banktransfer', state=OrderPayment.PAYMENT_STATE_PENDING
@@ -873,6 +874,7 @@ def test_order_extend_expired_seat_taken(client, env):
code='BAR', event=env[0], email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=14, locale='en'
)
OrderPosition.objects.create(
@@ -1103,6 +1105,7 @@ def test_order_mark_paid_expired_seat_taken(client, env):
code='BAR', event=env[0], email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=14, locale='en'
)
OrderPosition.objects.create(
@@ -1263,6 +1266,7 @@ class OrderChangeTests(SoupTest):
code='FOO', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
total=Decimal('46.00'),
)
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
@@ -2216,6 +2220,7 @@ def test_refund_paid_order_offsetting_to_wrong_currency(client, env):
code='BAZ', event=event2, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=event2.organizer.sales_channels.get(identifier="web"),
total=5, locale='en'
)
o.positions.create(price=5, item=ticket2)
@@ -2244,6 +2249,7 @@ def test_refund_paid_order_offsetting(client, env):
code='BAZ', event=env[0], email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=5, locale='en'
)
@@ -2284,6 +2290,7 @@ def test_refund_prevent_duplicate_submit(client, env):
code='BAZ', event=env[0], email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=5, locale='en'
)
env[2].refunds.create(provider="manual", amount=Decimal("2.00"), state=OrderRefund.REFUND_STATE_CREATED)

View File

@@ -73,6 +73,7 @@ def order1(env):
code='FOO', event=env[0], email='foo@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=14, locale='en'
)
o.payments.create(
@@ -94,6 +95,7 @@ def order2(env):
code='BAR', event=env[0], email='bar@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
total=14, locale='en'
)
o.payments.create(

View File

@@ -323,3 +323,60 @@ class OrganizerTest(SoupTest):
p = self.orga1.sso_providers.get()
assert p.configuration['scope'] == 'openid email'
assert p.configuration['provider_config'] == conf
def test_sales_channel_add_edit_remove(self):
doc = self.post_doc(
'/control/organizer/%s/channel/add?type=api' % self.orga1.slug,
{
'label_0': 'API 1',
'identifier': 'custom',
},
follow=True
)
assert not doc.select('.has-error, .alert-danger')
with scopes_disabled():
assert str(self.orga1.sales_channels.get(identifier="api.custom").label) == "API 1"
doc = self.post_doc(
'/control/organizer/%s/channel/api.custom/edit' % self.orga1.slug,
{
'label_0': 'API 2',
},
follow=True
)
assert not doc.select('.has-error, .alert-danger')
with scopes_disabled():
assert str(self.orga1.sales_channels.get(identifier="api.custom").label) == "API 2"
doc = self.post_doc(
'/control/organizer/%s/channel/api.custom/delete' % self.orga1.slug,
{},
follow=True
)
assert not doc.select('.has-error, .alert-danger')
with scopes_disabled():
assert not self.orga1.sales_channels.filter(identifier="api.custom").exists()
def test_sales_channel_add_invalid_type(self):
doc = self.post_doc(
'/control/organizer/%s/channel/add?type=web' % self.orga1.slug,
{
'label_0': 'API 1',
'identifier': 'custom',
},
follow=True
)
assert doc.select('.large-link-group')
def test_sales_channel_delete_invalid(self):
doc = self.post_doc(
'/control/organizer/%s/channel/web/delete' % self.orga1.slug,
{
'label_0': 'API 1',
'identifier': 'custom',
},
follow=True
)
assert doc.select('.alert-danger')
with scopes_disabled():
assert self.orga1.sales_channels.filter(identifier="web").exists()

View File

@@ -55,6 +55,7 @@ def env():
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + timedelta(days=10),
total=0,
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
Team.objects.create(pk=1, organizer=o)
return event, user, o
@@ -536,6 +537,10 @@ organizer_permission_urls = [
("can_change_organizer_settings", "organizer/dummy/property/add", 200),
("can_change_organizer_settings", "organizer/dummy/property/1/edit", 404),
("can_change_organizer_settings", "organizer/dummy/property/1/delete", 404),
("can_change_organizer_settings", "organizer/dummy/channels", 200),
("can_change_organizer_settings", "organizer/dummy/channel/add", 200),
("can_change_organizer_settings", "organizer/dummy/channel/web/edit", 200),
("can_change_organizer_settings", "organizer/dummy/channel/web/delete", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptypes", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptype/add", 200),
("can_change_organizer_settings", "organizer/dummy/membershiptype/1/edit", 404),

View File

@@ -112,7 +112,8 @@ def test_typeahead(organizer, admin_user, client, gift_card):
o = Order.objects.create(
code='FOO', event=event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=event.organizer.sales_channels.get(identifier="web"),
)
ticket = event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True, personalized=True)
op = o.positions.create(item=ticket, price=Decimal("14"))

View File

@@ -52,7 +52,8 @@ class OrderSearchTest(SoupTest):
code='FO1A', event=self.event1, email='dummy1@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
InvoiceAddress.objects.create(order=o1, company="Test Ltd.", name_parts={'full_name': "Peter Miller", "_scheme": "full"})
ticket1 = Item.objects.create(event=self.event1, name='Early-bird ticket',
@@ -71,7 +72,8 @@ class OrderSearchTest(SoupTest):
code='FO2', event=self.event2, email='dummy2@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.event2.organizer.sales_channels.get(identifier="web"),
)
ticket2 = Item.objects.create(event=self.event1, name='Early-bird ticket',
category=None, default_price=23,
@@ -192,7 +194,8 @@ class PaymentSearchTest(SoupTest):
code='FO1A', event=self.event1, email='dummy1@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.event1.organizer.sales_channels.get(identifier="web"),
)
InvoiceAddress.objects.create(order=o1, company="Test Ltd.", name_parts={'full_name': "Peter Miller", "_scheme": "full"})
ticket1 = Item.objects.create(event=self.event1, name='Early-bird ticket',
@@ -246,7 +249,8 @@ class PaymentSearchTest(SoupTest):
code='FO2', event=self.event2, email='dummy2@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=15, locale='en'
total=15, locale='en',
sales_channel=self.event2.organizer.sales_channels.get(identifier="web"),
)
ticket2 = Item.objects.create(event=self.event1, name='Early-bird ticket',
category=None, default_price=23,

View File

@@ -66,7 +66,8 @@ class EventShredderTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now(),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.orga1.sales_channels.get(identifier="web"),
)
self.client.login(email='dummy@dummy.dummy', password='dummy')

View File

@@ -176,7 +176,8 @@ class SubEventsTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.orga1.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=o,
@@ -755,7 +756,8 @@ class SubEventsTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en'
total=14, locale='en',
sales_channel=self.orga1.sales_channels.get(identifier="web"),
)
OrderPosition.objects.create(
order=o,

View File

@@ -116,6 +116,7 @@ class TaxRateFormTest(SoupTest):
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=14, locale='en',
sales_channel=self.orga1.sales_channels.get(identifier="web"),
)
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
tax_value=Decimal('0.05'), tax_rule=tr)
@@ -135,7 +136,8 @@ class TaxRateFormTest(SoupTest):
code='FOO', event=self.event1, email='dummy@dummy.test',
status=Order.STATUS_PENDING,
datetime=now(), expires=now() + datetime.timedelta(days=10),
total=12, locale='en'
total=12, locale='en',
sales_channel=self.orga1.sales_channels.get(identifier="web"),
)
o.positions.create(
item=i, price=12, tax_rule=tr, tax_rate=19, tax_value=12 - 12 / 1.19

View File

@@ -70,6 +70,7 @@ def order(item):
o = Order.objects.create(event=item.event, status=Order.STATUS_PENDING,
expires=now() + datetime.timedelta(hours=1),
total=13, code='DUMMY', email='dummy@dummy.test',
sales_channel=item.event.organizer.sales_channels.get(identifier="web"),
datetime=now())
OrderPosition.objects.create(order=o, item=item, price=13)
p1 = o.payments.create(

View File

@@ -744,6 +744,7 @@ class VoucherFormTest(SoupTestMixin, TransactionTestCase):
code='DEDUP', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PAID,
datetime=now(), expires=now() + datetime.timedelta(days=10),
sales_channel=self.orga.sales_channels.get(identifier="web"),
total=0, locale='en'
)