mirror of
https://github.com/pretix/pretix.git
synced 2026-08-21 12:36:26 +00:00
New implementation of sales channels (#4111)
Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
co-authored by
Martin Gross
parent
95511b0330
commit
4fb5c6bef0
@@ -65,7 +65,8 @@ def order(event, item, other_item, taxrule):
|
||||
status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
total=46, locale='en'
|
||||
total=46, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
|
||||
op1 = OrderPosition.objects.create(
|
||||
@@ -250,7 +251,7 @@ def test_list_list(token_client, organizer, event, clist, item, subevent, django
|
||||
res["limit_products"] = [item.pk]
|
||||
res["auto_checkin_sales_channels"] = []
|
||||
|
||||
with django_assert_num_queries(11):
|
||||
with django_assert_num_queries(12):
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/'.format(organizer.slug, event.slug))
|
||||
assert resp.status_code == 200
|
||||
assert [res] == resp.data['results']
|
||||
@@ -335,7 +336,7 @@ def test_list_create(token_client, organizer, event, item, item_on_wrong_event):
|
||||
assert cl.name == "VIP"
|
||||
assert cl.limit_products.count() == 1
|
||||
assert not cl.all_products
|
||||
assert "web" in cl.auto_checkin_sales_channels
|
||||
assert cl.auto_checkin_sales_channels.filter(identifier="web").exists()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/checkinlists/'.format(organizer.slug, event.slug),
|
||||
@@ -381,7 +382,7 @@ def test_list_create_with_subevent(token_client, organizer, event, event3, item,
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
assert "web" in cl.auto_checkin_sales_channels
|
||||
assert cl.auto_checkin_sales_channels.filter(identifier="web").exists()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/checkinlists/'.format(organizer.slug, event.slug),
|
||||
@@ -448,7 +449,7 @@ def test_list_update(token_client, organizer, event, clist):
|
||||
assert resp.status_code == 200
|
||||
with scopes_disabled():
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
assert "web" in cl.auto_checkin_sales_channels
|
||||
assert cl.auto_checkin_sales_channels.filter(identifier="web").exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -67,6 +67,7 @@ def order(event, item, other_item, taxrule):
|
||||
status=Order.STATUS_PAID, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=46, locale='en'
|
||||
)
|
||||
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
|
||||
@@ -114,6 +115,7 @@ def order2(event2, item_on_event2):
|
||||
status=Order.STATUS_PAID, secret="ylptCPNOxTyA",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event2.organizer.sales_channels.get(identifier="web"),
|
||||
total=46, locale='en'
|
||||
)
|
||||
InvoiceAddress.objects.create(order=o, company="Sample company", country=Country('NZ'))
|
||||
|
||||
@@ -41,7 +41,9 @@ TEST_DISCOUNT_RES = {
|
||||
"active": True,
|
||||
"internal_name": "3 for 2",
|
||||
"position": 1,
|
||||
"sales_channels": ["web"],
|
||||
"all_sales_channels": True,
|
||||
"limit_sales_channels": [],
|
||||
"sales_channels": ["bar", "baz", "web"],
|
||||
"available_from": None,
|
||||
"available_until": None,
|
||||
"subevent_mode": "mixed",
|
||||
|
||||
@@ -70,6 +70,7 @@ def order(event, item, taxrule):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc),
|
||||
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
|
||||
@@ -121,7 +122,9 @@ TEST_EVENT_RES = {
|
||||
'item_meta_properties': {
|
||||
'day': 'Monday',
|
||||
},
|
||||
'sales_channels': ['web', 'bar', 'baz'],
|
||||
'sales_channels': ['bar', 'baz', 'web'],
|
||||
'all_sales_channels': True,
|
||||
'limit_sales_channels': [],
|
||||
'public_url': 'http://example.com/dummy/dummy/'
|
||||
}
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ def test_giftcard_detail_expand(token_client, organizer, event, giftcard):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
ticket = event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
|
||||
@@ -196,6 +197,7 @@ def test_giftcard_patch_owner_by_id(token_client, organizer, event, giftcard):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
ticket = event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
|
||||
@@ -220,6 +222,7 @@ def test_giftcard_patch_owner_by_secret(token_client, organizer, event, giftcard
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
ticket = event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
|
||||
|
||||
@@ -160,6 +160,7 @@ def order(event):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ def order(event, item, taxrule, question):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
p1 = o.payments.create(
|
||||
@@ -148,6 +149,7 @@ def order2(event2, item2):
|
||||
status=Order.STATUS_PENDING, secret="asd436cvbfd1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event2.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
o.payments.create(
|
||||
|
||||
+49
-34
@@ -44,7 +44,6 @@ from django_countries.fields import Country
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.const import SAMPLE_PNG
|
||||
|
||||
from pretix.base.channels import get_all_sales_channels
|
||||
from pretix.base.models import (
|
||||
CartPosition, InvoiceAddress, Item, ItemAddOn, ItemBundle, ItemCategory,
|
||||
ItemVariation, Order, OrderPosition, Question, QuestionOption, Quota,
|
||||
@@ -81,6 +80,7 @@ def order(event, item, taxrule):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc),
|
||||
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
|
||||
@@ -254,7 +254,9 @@ TEST_ITEM_RES = {
|
||||
"name": {"en": "Budget Ticket"},
|
||||
"internal_name": None,
|
||||
"default_price": "23.00",
|
||||
"sales_channels": ["web"],
|
||||
"sales_channels": ["bar", "baz", "web"],
|
||||
"all_sales_channels": True,
|
||||
"limit_sales_channels": [],
|
||||
"category": None,
|
||||
"active": True,
|
||||
"description": None,
|
||||
@@ -383,32 +385,34 @@ def test_item_detail(token_client, organizer, event, team, item):
|
||||
def test_item_detail_variations(token_client, organizer, event, team, item):
|
||||
with scopes_disabled():
|
||||
var = item.variations.create(value="Children")
|
||||
res = dict(TEST_ITEM_RES)
|
||||
res["id"] = item.pk
|
||||
res["variations"] = [{
|
||||
"id": var.pk,
|
||||
"value": {"en": "Children"},
|
||||
"default_price": None,
|
||||
"free_price_suggestion": None,
|
||||
"price": "23.00",
|
||||
"active": True,
|
||||
"description": None,
|
||||
"position": 0,
|
||||
"checkin_attention": False,
|
||||
"checkin_text": None,
|
||||
"require_approval": False,
|
||||
"require_membership": False,
|
||||
"require_membership_hidden": False,
|
||||
"require_membership_types": [],
|
||||
"sales_channels": list(get_all_sales_channels().keys()),
|
||||
"available_from": None,
|
||||
"available_until": None,
|
||||
"available_from_mode": "hide",
|
||||
"available_until_mode": "hide",
|
||||
"hide_without_voucher": False,
|
||||
"original_price": None,
|
||||
"meta_data": {}
|
||||
}]
|
||||
res = dict(TEST_ITEM_RES)
|
||||
res["id"] = item.pk
|
||||
res["variations"] = [{
|
||||
"id": var.pk,
|
||||
"value": {"en": "Children"},
|
||||
"default_price": None,
|
||||
"free_price_suggestion": None,
|
||||
"price": "23.00",
|
||||
"active": True,
|
||||
"description": None,
|
||||
"position": 0,
|
||||
"checkin_attention": False,
|
||||
"checkin_text": None,
|
||||
"require_approval": False,
|
||||
"require_membership": False,
|
||||
"require_membership_hidden": False,
|
||||
"require_membership_types": [],
|
||||
"sales_channels": sorted(organizer.sales_channels.values_list("identifier", flat=True)),
|
||||
"all_sales_channels": True,
|
||||
"limit_sales_channels": [],
|
||||
"available_from": None,
|
||||
"available_until": None,
|
||||
"available_from_mode": "hide",
|
||||
"available_until_mode": "hide",
|
||||
"hide_without_voucher": False,
|
||||
"original_price": None,
|
||||
"meta_data": {}
|
||||
}]
|
||||
res["has_variations"] = True
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug,
|
||||
item.pk))
|
||||
@@ -466,7 +470,7 @@ def test_item_create(token_client, organizer, event, item, category, taxrule, me
|
||||
"en": "Ticket"
|
||||
},
|
||||
"active": True,
|
||||
"sales_channels": ["web", "pretixpos"],
|
||||
"sales_channels": ["web", "bar"],
|
||||
"description": None,
|
||||
"default_price": "23.00",
|
||||
"free_price": False,
|
||||
@@ -496,7 +500,8 @@ def test_item_create(token_client, organizer, event, item, category, taxrule, me
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
i = Item.objects.get(pk=resp.data['id'])
|
||||
assert i.sales_channels == ["web", "pretixpos"]
|
||||
assert not i.all_sales_channels
|
||||
assert sorted(i.limit_sales_channels.values_list("identifier", flat=True)) == ["bar", "web"]
|
||||
assert i.meta_data == {'day': 'Wednesday'}
|
||||
assert i.require_membership_types.count() == 1
|
||||
assert i.personalized is True # auto-set for backwards-compatibility
|
||||
@@ -596,7 +601,8 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego
|
||||
assert new_item.variations.first().value.localize('de') == "Kommentar"
|
||||
assert new_item.variations.first().value.localize('en') == "Comment"
|
||||
assert new_item.variations.first().require_approval is True
|
||||
assert set(new_item.variations.first().sales_channels) == set(get_all_sales_channels().keys())
|
||||
assert new_item.variations.first().all_sales_channels is True
|
||||
assert not new_item.variations.first().limit_sales_channels.exists()
|
||||
assert new_item.variations.first().meta_data == {"day": "Wednesday"}
|
||||
|
||||
|
||||
@@ -1192,7 +1198,7 @@ def test_item_file_upload(token_client, organizer, event, item):
|
||||
"en": "Ticket"
|
||||
},
|
||||
"active": True,
|
||||
"sales_channels": ["web", "pretixpos"],
|
||||
"sales_channels": ["web"],
|
||||
"picture": file_id_png,
|
||||
"description": None,
|
||||
"default_price": "23.00",
|
||||
@@ -1331,7 +1337,8 @@ TEST_VARIATIONS_RES = {
|
||||
"require_membership": False,
|
||||
"require_membership_hidden": False,
|
||||
"require_membership_types": [],
|
||||
"sales_channels": list(get_all_sales_channels().keys()),
|
||||
"all_sales_channels": True,
|
||||
"limit_sales_channels": [],
|
||||
"available_from": None,
|
||||
"available_until": None,
|
||||
"available_from_mode": "hide",
|
||||
@@ -1357,6 +1364,8 @@ TEST_VARIATIONS_UPDATE = {
|
||||
"require_membership_hidden": False,
|
||||
"require_membership_types": [],
|
||||
"sales_channels": ["web"],
|
||||
"all_sales_channels": False,
|
||||
"limit_sales_channels": ["web"],
|
||||
"available_from": None,
|
||||
"available_until": None,
|
||||
"available_from_mode": "hide",
|
||||
@@ -1372,6 +1381,8 @@ TEST_VARIATIONS_UPDATE = {
|
||||
def test_variations_list(token_client, organizer, event, item, variation):
|
||||
res = dict(TEST_VARIATIONS_RES)
|
||||
res["id"] = variation.pk
|
||||
with scopes_disabled():
|
||||
res["sales_channels"] = sorted(organizer.sales_channels.values_list("identifier", flat=True))
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/variations/'.format(organizer.slug, event.slug, item.pk))
|
||||
assert resp.status_code == 200
|
||||
assert res['value'] == resp.data['results'][0]['value']
|
||||
@@ -1383,6 +1394,8 @@ def test_variations_list(token_client, organizer, event, item, variation):
|
||||
def test_variations_detail(token_client, organizer, event, item, variation):
|
||||
res = dict(TEST_VARIATIONS_RES)
|
||||
res["id"] = variation.pk
|
||||
with scopes_disabled():
|
||||
res["sales_channels"] = sorted(organizer.sales_channels.values_list("identifier", flat=True))
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variation.pk))
|
||||
assert resp.status_code == 200
|
||||
assert res == resp.data
|
||||
@@ -1413,7 +1426,9 @@ def test_variations_create(token_client, organizer, event, item, variation):
|
||||
var = ItemVariation.objects.get(pk=resp.data['id'])
|
||||
assert var.position == 1
|
||||
assert var.price == 23.0
|
||||
assert set(var.sales_channels) == set(get_all_sales_channels().keys())
|
||||
assert var.all_sales_channels
|
||||
with scopes_disabled():
|
||||
assert not var.limit_sales_channels.exists()
|
||||
assert var.meta_data == {"day": "Wednesday"}
|
||||
|
||||
|
||||
|
||||
@@ -100,7 +100,8 @@ def order(event, item, taxrule, question):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
total=23, locale='en'
|
||||
total=23, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
p1 = o.payments.create(
|
||||
provider='stripe',
|
||||
|
||||
@@ -112,6 +112,7 @@ def order(event, item, taxrule, question):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
p1 = o.payments.create(
|
||||
@@ -166,7 +167,8 @@ def order(event, item, taxrule, question):
|
||||
|
||||
@pytest.fixture
|
||||
def clist_autocheckin(event):
|
||||
c = event.checkin_lists.create(name="Default", all_products=True, auto_checkin_sales_channels=['web'])
|
||||
c = event.checkin_lists.create(name="Default", all_products=True)
|
||||
c.auto_checkin_sales_channels.add(event.organizer.sales_channels.get(identifier="web"))
|
||||
return c
|
||||
|
||||
|
||||
@@ -245,7 +247,7 @@ def test_order_create(token_client, organizer, event, item, quota, question):
|
||||
assert o.locale == "en"
|
||||
assert o.total == Decimal('23.25')
|
||||
assert o.status == Order.STATUS_PENDING
|
||||
assert o.sales_channel == "web"
|
||||
assert o.sales_channel.identifier == "web"
|
||||
assert o.valid_if_pending
|
||||
assert o.expires > now()
|
||||
assert not o.testmode
|
||||
@@ -550,11 +552,10 @@ def test_order_create_autocheckin(token_client, organizer, event, item, quota, q
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
assert "web" in clist_autocheckin.auto_checkin_sales_channels
|
||||
assert clist_autocheckin.auto_checkin_sales_channels.contains(organizer.sales_channels.get(identifier="web"))
|
||||
assert o.positions.first().checkins.first().auto_checked_in
|
||||
|
||||
clist_autocheckin.auto_checkin_sales_channels = []
|
||||
clist_autocheckin.save()
|
||||
clist_autocheckin.auto_checkin_sales_channels.clear()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
@@ -564,7 +565,7 @@ def test_order_create_autocheckin(token_client, organizer, event, item, quota, q
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
assert clist_autocheckin.auto_checkin_sales_channels == []
|
||||
assert clist_autocheckin.auto_checkin_sales_channels.count() == 0
|
||||
assert o.positions.first().checkins.count() == 0
|
||||
|
||||
|
||||
@@ -625,7 +626,7 @@ def test_order_create_sales_channel_optional(token_client, organizer, event, ite
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
o = Order.objects.get(code=resp.data['code'])
|
||||
assert o.sales_channel == "web"
|
||||
assert o.sales_channel.identifier == "web"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -640,7 +641,7 @@ def test_order_create_sales_channel_invalid(token_client, organizer, event, item
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {'sales_channel': ['Unknown sales channel.']}
|
||||
assert resp.data == {'sales_channel': ['Object with identifier=foo does not exist.']}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -88,6 +88,7 @@ def order(event, item, taxrule, question):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
p1 = o.payments.create(
|
||||
@@ -151,6 +152,7 @@ def order2(event2, item2):
|
||||
status=Order.STATUS_PENDING, secret="asd436cvbfd1",
|
||||
datetime=datetime.datetime(2017, 12, 1, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
expires=datetime.datetime(2017, 12, 10, 10, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
sales_channel=event2.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
o.payments.create(
|
||||
@@ -173,7 +175,8 @@ def order2(event2, item2):
|
||||
|
||||
@pytest.fixture
|
||||
def clist_autocheckin(event):
|
||||
c = event.checkin_lists.create(name="Default", all_products=True, auto_checkin_sales_channels=['web'])
|
||||
c = event.checkin_lists.create(name="Default", all_products=True)
|
||||
c.auto_checkin_sales_channels.add(event.organizer.sales_channels.get(identifier="web"))
|
||||
return c
|
||||
|
||||
|
||||
|
||||
@@ -215,6 +215,12 @@ org_permission_sub_urls = [
|
||||
('patch', 'can_manage_customers', 'memberships/1/', 404),
|
||||
('put', 'can_manage_customers', 'memberships/1/', 404),
|
||||
('delete', 'can_manage_customers', 'memberships/1/', 404),
|
||||
('get', 'can_change_organizer_settings', 'saleschannels/', 200),
|
||||
('post', 'can_change_organizer_settings', 'saleschannels/', 400),
|
||||
('get', 'can_change_organizer_settings', 'saleschannels/web/', 200),
|
||||
('patch', 'can_change_organizer_settings', 'saleschannels/web/', 200),
|
||||
('put', 'can_change_organizer_settings', 'saleschannels/api.1/', 404),
|
||||
('delete', 'can_change_organizer_settings', 'saleschannels/api.1/', 404),
|
||||
('get', 'can_change_organizer_settings', 'membershiptypes/', 200),
|
||||
('post', 'can_change_organizer_settings', 'membershiptypes/', 400),
|
||||
('get', 'can_change_organizer_settings', 'membershiptypes/1/', 404),
|
||||
|
||||
@@ -132,6 +132,7 @@ def test_medium_detail(token_client, organizer, event, medium, giftcard, custome
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
ticket = event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
|
||||
@@ -409,6 +410,7 @@ def test_medium_lookup_cross_organizer(token_client, organizer, organizer2, org2
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=org2_event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=org2_event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
ticket = org2_event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
#
|
||||
# This file is part of pretix (Community Edition).
|
||||
#
|
||||
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||
# Copyright (C) 2020-2021 rami.io GmbH and contributors
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||
#
|
||||
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||
# this file, see <https://pretix.eu/about/en/license>.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import pytest
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_list(token_client, organizer):
|
||||
resp = token_client.get('/api/v1/organizers/{}/saleschannels/'.format(organizer.slug))
|
||||
assert resp.status_code == 200
|
||||
assert resp.data['results'][0]["label"]["en"] == "Online shop"
|
||||
assert resp.data['results'][0]["position"] == 0
|
||||
assert resp.data['results'][0]["identifier"] == "web"
|
||||
assert resp.data['results'][0]["type"] == "web"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_detail(token_client, organizer):
|
||||
resp = token_client.get('/api/v1/organizers/{}/saleschannels/web/'.format(organizer.slug))
|
||||
assert resp.status_code == 200
|
||||
assert resp.data["label"]["en"] == "Online shop"
|
||||
assert resp.data["position"] == 0
|
||||
assert resp.data["identifier"] == "web"
|
||||
assert resp.data["type"] == "web"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_create(token_client, organizer):
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/saleschannels/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
"label": {
|
||||
"en": "API 1"
|
||||
},
|
||||
"type": "api",
|
||||
"identifier": "api.1",
|
||||
"position": 5,
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
with scopes_disabled():
|
||||
sc = organizer.sales_channels.get(identifier="api.1")
|
||||
assert sc.type == "api"
|
||||
assert sc.identifier == "api.1"
|
||||
assert sc.position == 5
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_create_invalid(token_client, organizer):
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/saleschannels/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
"label": {
|
||||
"en": "API 1"
|
||||
},
|
||||
"type": "foo",
|
||||
"identifier": "api.1",
|
||||
"position": 5,
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {"type": ["You can currently only create channels of type 'api' through the API."]}
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/saleschannels/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
"label": {
|
||||
"en": "API 1"
|
||||
},
|
||||
"type": "api",
|
||||
"identifier": "foo.1",
|
||||
"position": 5,
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {"identifier": ["Your identifier needs to start with 'api.'."]}
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/saleschannels/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
"label": {
|
||||
"en": "API 1"
|
||||
},
|
||||
"type": "api",
|
||||
"identifier": "api.Ungültig",
|
||||
"position": 5,
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {"identifier": ["The identifier may only contain letters, numbers, dots, dashes, and underscores."]}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_patch(token_client, organizer):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/saleschannels/web/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
'label': {
|
||||
"en": "World Wide Web"
|
||||
},
|
||||
'position': 9000,
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
with scopes_disabled():
|
||||
assert str(organizer.sales_channels.get(identifier="web").label) == "World Wide Web"
|
||||
assert organizer.sales_channels.get(identifier="web").position == 9000
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_patch_invalid(token_client, organizer):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/saleschannels/web/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
'identifier': 'foobar',
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {"identifier": ["You cannot change the identifier of a sales channel."]}
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/saleschannels/web/'.format(organizer.slug),
|
||||
format='json',
|
||||
data={
|
||||
'type': 'foobar',
|
||||
}
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {"type": ["You cannot change the type of a sales channel."]}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_delete(token_client, organizer):
|
||||
with scopes_disabled():
|
||||
organizer.sales_channels.create(identifier="api.1", type="api", label="api")
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/saleschannels/api.1/'.format(organizer.slug),
|
||||
)
|
||||
assert resp.status_code == 204
|
||||
with scopes_disabled():
|
||||
assert not organizer.sales_channels.filter(identifier="api.1").exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_channel_delete_invalid(token_client, organizer):
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/saleschannels/web/'.format(organizer.slug),
|
||||
)
|
||||
assert resp.status_code == 403
|
||||
with scopes_disabled():
|
||||
assert organizer.sales_channels.filter(identifier="web").exists()
|
||||
@@ -57,6 +57,7 @@ def order(event, item):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc),
|
||||
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
|
||||
@@ -60,6 +60,7 @@ def order(event, item, taxrule):
|
||||
status=Order.STATUS_PENDING, secret="k24fiuwvu8kxz3y1",
|
||||
datetime=datetime(2017, 12, 1, 10, 0, 0, tzinfo=timezone.utc),
|
||||
expires=datetime(2017, 12, 10, 10, 0, 0, tzinfo=timezone.utc),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=23, locale='en'
|
||||
)
|
||||
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
|
||||
|
||||
@@ -47,6 +47,7 @@ class EventCancelTests(TestCase):
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
@@ -495,6 +496,7 @@ class SubEventCancelTests(TestCase):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
|
||||
@@ -68,6 +68,7 @@ def position(event, item):
|
||||
datetime=now() - timedelta(days=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('23.00'),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
return OrderPosition.objects.create(
|
||||
order=order, item=item, variation=None,
|
||||
|
||||
@@ -49,6 +49,7 @@ def test_full_clone_same_organizer():
|
||||
organizer = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
membership_type = organizer.membership_types.create(name="Membership")
|
||||
plan = SeatingPlan.objects.create(name="Plan", organizer=organizer, layout="{}")
|
||||
sc = organizer.sales_channels.get(identifier="web")
|
||||
|
||||
event = Event.objects.create(
|
||||
organizer=organizer, name='Dummy', slug='dummy',
|
||||
@@ -57,7 +58,9 @@ def test_full_clone_same_organizer():
|
||||
date_to=now() + timedelta(hours=1),
|
||||
testmode=True,
|
||||
seating_plan=plan,
|
||||
all_sales_channels=False,
|
||||
)
|
||||
event.limit_sales_channels.add(sc)
|
||||
|
||||
item_meta = event.item_meta_properties.create(name="Bla")
|
||||
tax_rule = event.tax_rules.create(name="VAT", rate=19)
|
||||
@@ -67,13 +70,16 @@ def test_full_clone_same_organizer():
|
||||
q2 = event.quotas.create(name="Quota 2", size=0, closed=True)
|
||||
|
||||
item1 = event.items.create(category=category, tax_rule=tax_rule, name="Ticket", default_price=23,
|
||||
grant_membership_type=membership_type, hidden_if_available=q2)
|
||||
grant_membership_type=membership_type, hidden_if_available=q2,
|
||||
all_sales_channels=False)
|
||||
item1.limit_sales_channels.add(sc)
|
||||
# todo: test that item pictures are copied, not linked
|
||||
ItemMetaValue.objects.create(item=item1, property=item_meta, value="Foo")
|
||||
assert item1.meta_data
|
||||
item2 = event.items.create(category=category, tax_rule=tax_rule, name="T-shirt", default_price=15,
|
||||
hidden_if_item_available=item1)
|
||||
item2v = item2.variations.create(value="red", default_price=15)
|
||||
item2v = item2.variations.create(value="red", default_price=15, all_sales_channels=False)
|
||||
item2v.limit_sales_channels.add(sc)
|
||||
item2v.meta_values.create(property=item_meta, value="Bar")
|
||||
item2.require_membership_types.add(membership_type)
|
||||
ItemAddOn.objects.create(base_item=item1, addon_category=category)
|
||||
@@ -117,6 +123,7 @@ def test_full_clone_same_organizer():
|
||||
],
|
||||
})
|
||||
clist.limit_products.add(item1)
|
||||
clist.auto_checkin_sales_channels.add(sc)
|
||||
|
||||
copied_event = Event.objects.create(
|
||||
organizer=organizer, name='Dummy2', slug='dummy2',
|
||||
@@ -129,6 +136,7 @@ def test_full_clone_same_organizer():
|
||||
# Verify event properties
|
||||
assert abs(copied_event.date_admission - (copied_event.date_from - timedelta(hours=1))) < timedelta(minutes=1)
|
||||
assert copied_event.testmode
|
||||
assert copied_event.limit_sales_channels.get() == sc
|
||||
|
||||
# Verify that we actually *copied*, not just moved objects over
|
||||
assert event.tax_rules.count() == copied_event.tax_rules.count() == 1
|
||||
@@ -139,6 +147,7 @@ def test_full_clone_same_organizer():
|
||||
assert event.questions.count() == copied_event.questions.count() == 2
|
||||
assert event.seat_category_mappings.count() == copied_event.seat_category_mappings.count() == 1
|
||||
assert event.seats.count() == copied_event.seats.count() == 1
|
||||
assert event.limit_sales_channels.get() == sc
|
||||
|
||||
# Verify relationship integrity
|
||||
copied_q1 = copied_event.quotas.get(name=q1.name)
|
||||
@@ -148,11 +157,14 @@ def test_full_clone_same_organizer():
|
||||
copied_item2 = copied_event.items.get(name=item2.name)
|
||||
assert copied_item1.tax_rule == copied_event.tax_rules.get()
|
||||
assert copied_item1.category == copied_event.categories.get()
|
||||
assert copied_item1.limit_sales_channels.get() == sc
|
||||
assert copied_item1.meta_data == item1.meta_data
|
||||
assert copied_item2.variations.get().meta_data == item2v.meta_data
|
||||
assert copied_item1.hidden_if_available == copied_q2
|
||||
assert copied_item1.grant_membership_type == membership_type
|
||||
assert copied_item2.variations.count() == 1
|
||||
assert copied_item2.variations.get().limit_sales_channels.get() == sc
|
||||
assert copied_item2.require_membership_types.count() == 1
|
||||
assert copied_item2.require_membership_types.get() == membership_type
|
||||
assert copied_item1.addons.get().addon_category == copied_event.categories.get()
|
||||
assert copied_item1.bundles.get().bundled_item == copied_item2
|
||||
@@ -194,6 +206,7 @@ def test_full_clone_same_organizer():
|
||||
],
|
||||
}
|
||||
assert copied_clist.limit_products.get() == copied_item1
|
||||
assert copied_clist.auto_checkin_sales_channels.get() == sc
|
||||
|
||||
# todo: test that the plugin hook is called
|
||||
# todo: test custom style
|
||||
@@ -208,6 +221,8 @@ def test_full_clone_cross_organizer_differences():
|
||||
organizer2 = Organizer.objects.create(name='Dummy2', slug='dummy2')
|
||||
membership_type = organizer.membership_types.create(name="Membership")
|
||||
plan = SeatingPlan.objects.create(name="Plan", organizer=organizer, layout="{}")
|
||||
sc = organizer.sales_channels.get(identifier="web")
|
||||
sc2 = organizer2.sales_channels.get(identifier="web")
|
||||
|
||||
event = Event.objects.create(
|
||||
organizer=organizer, name='Dummy', slug='dummy',
|
||||
@@ -216,13 +231,20 @@ def test_full_clone_cross_organizer_differences():
|
||||
date_to=now() + timedelta(hours=1),
|
||||
testmode=True,
|
||||
seating_plan=plan,
|
||||
all_sales_channels=False,
|
||||
)
|
||||
event.limit_sales_channels.add(sc)
|
||||
|
||||
item1 = event.items.create(name="Ticket", default_price=23,
|
||||
grant_membership_type=membership_type)
|
||||
grant_membership_type=membership_type,
|
||||
all_sales_channels=False)
|
||||
item1.limit_sales_channels.add(sc)
|
||||
item2 = event.items.create(name="T-shirt", default_price=15)
|
||||
item2.require_membership_types.add(membership_type)
|
||||
|
||||
clist = event.checkin_lists.create(name="Default")
|
||||
clist.auto_checkin_sales_channels.add(sc)
|
||||
|
||||
copied_event = Event.objects.create(
|
||||
organizer=organizer2, name='Dummy2', slug='dummy2',
|
||||
date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc),
|
||||
@@ -234,9 +256,14 @@ def test_full_clone_cross_organizer_differences():
|
||||
assert organizer2.seating_plans.count() == 1
|
||||
assert organizer2.seating_plans.get().layout == plan.layout
|
||||
assert copied_event.seating_plan.organizer == organizer2
|
||||
assert copied_event.limit_sales_channels.get() == sc2
|
||||
assert event.seating_plan.organizer == organizer
|
||||
|
||||
copied_item1 = copied_event.items.get(name=item1.name)
|
||||
copied_item2 = copied_event.items.get(name=item2.name)
|
||||
assert copied_item1.grant_membership_type is None
|
||||
assert copied_item2.require_membership_types.count() == 0
|
||||
assert copied_item1.limit_sales_channels.get() == sc2
|
||||
|
||||
copied_clist = copied_event.checkin_lists.get()
|
||||
assert copied_clist.auto_checkin_sales_channels.get() == sc2
|
||||
|
||||
@@ -66,7 +66,8 @@ def env():
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, locale='en'
|
||||
total=0, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
tr = event.tax_rules.create(rate=Decimal('19.00'))
|
||||
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
|
||||
@@ -442,7 +443,8 @@ def test_invoice_numbers(env):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0,
|
||||
locale='en'
|
||||
locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
order2.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('0.00'),
|
||||
tax_value=Decimal('0.00'))
|
||||
@@ -451,7 +453,8 @@ def test_invoice_numbers(env):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, testmode=True,
|
||||
locale='en'
|
||||
locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
inv1 = generate_invoice(order)
|
||||
inv2 = generate_invoice(order)
|
||||
@@ -519,7 +522,8 @@ def test_invoice_number_prefixes(env):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0,
|
||||
locale='en'
|
||||
locale='en',
|
||||
sales_channel=event2.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
order2.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('0.00'),
|
||||
tax_value=Decimal('0.00'))
|
||||
|
||||
@@ -366,6 +366,7 @@ def test_validate_membership_max_usages(event, customer, membership, requiring_t
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
@@ -446,6 +447,7 @@ def test_validate_membership_parallel(event, customer, membership, subevent, req
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
@@ -549,6 +551,7 @@ def test_validate_membership_parallel_validity_dynamic(event, customer, membersh
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
@@ -664,6 +667,7 @@ def test_validate_membership_parallel_validity_fixed(event, customer, membership
|
||||
datetime=now() - timedelta(days=3),
|
||||
expires=now() + timedelta(days=11),
|
||||
total=Decimal("23"),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1,
|
||||
@@ -743,6 +747,7 @@ def test_use_membership(event, customer, membership, requiring_ticket):
|
||||
)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=now(),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "banktransfer",
|
||||
@@ -790,6 +795,7 @@ def test_grant_when_paid_and_changed(event, customer, granting_ticket):
|
||||
q.items.add(granting_ticket)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=now(),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "banktransfer",
|
||||
|
||||
@@ -118,6 +118,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.items.add(self.item1)
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
@@ -131,6 +132,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item2, variation=self.var1, price=2)
|
||||
self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_GONE, 0))
|
||||
@@ -140,12 +142,14 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.items.add(self.item1)
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1))
|
||||
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PENDING,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0))
|
||||
@@ -168,6 +172,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item2, variation=self.var1, price=2)
|
||||
|
||||
@@ -180,6 +185,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.save()
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
op = OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 2))
|
||||
@@ -194,12 +200,14 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.save()
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 2))
|
||||
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PENDING,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=4)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1))
|
||||
@@ -246,6 +254,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.items.add(self.item1)
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
@@ -589,6 +598,7 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
# Create orders
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
expires=now() + timedelta(days=3),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
total=6)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, price=2, blocked=["foo"])
|
||||
@@ -610,12 +620,14 @@ class QuotaTestCase(BaseQuotaTestCase):
|
||||
|
||||
# Create orders
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
expires=now() + timedelta(days=3),
|
||||
total=6)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, subevent=se1, price=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, subevent=se1, price=2)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, subevent=se2, price=2)
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PENDING,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
expires=now() + timedelta(days=3),
|
||||
total=8)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, subevent=se1, price=2)
|
||||
@@ -686,6 +698,7 @@ class CheckinQuotaTestCase(BaseQuotaTestCase):
|
||||
self.quota.items.add(self.item1)
|
||||
self.cl = self.event.checkin_lists.create(name="Test", allow_entry_after_exit=False)
|
||||
order = Order.objects.create(event=self.event, status=Order.STATUS_PAID,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
expires=now() + timedelta(days=3),
|
||||
total=4)
|
||||
self.op = OrderPosition.objects.create(order=order, item=self.item1, price=2)
|
||||
@@ -1071,14 +1084,18 @@ class VoucherTestCase(BaseQuotaTestCase):
|
||||
|
||||
order = Order.objects.create(
|
||||
status=Order.STATUS_PENDING, event=self.event,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
datetime=now() - timedelta(days=5), expires=now() + timedelta(days=5), total=46,
|
||||
)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, voucher=v, price=Decimal('20.00'),
|
||||
voucher_budget_use=Decimal('3.00'))
|
||||
OrderPosition.objects.create(
|
||||
order=order, item=self.item1, voucher=v, price=Decimal('20.00'),
|
||||
voucher_budget_use=Decimal('3.00')
|
||||
)
|
||||
assert v.budget_used() == Decimal('3.00')
|
||||
|
||||
order = Order.objects.create(
|
||||
status=Order.STATUS_PAID, event=self.event,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
datetime=now() - timedelta(days=5), expires=now() + timedelta(days=5), total=46,
|
||||
)
|
||||
OrderPosition.objects.create(order=order, item=self.item1, voucher=v, price=Decimal('20.00'),
|
||||
@@ -1095,6 +1112,7 @@ class OrderTestCase(BaseQuotaTestCase):
|
||||
status=Order.STATUS_PENDING, event=self.event,
|
||||
datetime=now() - timedelta(days=5),
|
||||
expires=now() + timedelta(days=5), total=46,
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.quota.items.add(self.item1)
|
||||
self.op1 = OrderPosition.objects.create(order=self.order, item=self.item1,
|
||||
@@ -2079,7 +2097,9 @@ class ItemTest(TestCase):
|
||||
i = Item.objects.create(
|
||||
event=self.event, name="Ticket", default_price=23,
|
||||
active=True, available_until=now() + timedelta(days=1),
|
||||
all_sales_channels=False,
|
||||
)
|
||||
i.limit_sales_channels.add(self.o.sales_channels.get(identifier="web"))
|
||||
assert Item.objects.filter_available().exists()
|
||||
assert not Item.objects.filter_available(channel='foo').exists()
|
||||
|
||||
@@ -2300,10 +2320,12 @@ class EventTest(TestCase):
|
||||
def test_active_quotas_annotation(self):
|
||||
event = Event.objects.create(
|
||||
organizer=self.organizer, name='Download', slug='download',
|
||||
date_from=now()
|
||||
date_from=now(),
|
||||
)
|
||||
q = Quota.objects.create(event=event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
|
||||
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True,
|
||||
all_sales_channels=False)
|
||||
item.limit_sales_channels.add(self.organizer.sales_channels.get(identifier="web"))
|
||||
item2 = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=False)
|
||||
q.items.add(item)
|
||||
q.items.add(item2)
|
||||
@@ -2407,8 +2429,9 @@ class EventTest(TestCase):
|
||||
)
|
||||
q = Quota.objects.create(event=event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
|
||||
v = item.variations.create(value="foo")
|
||||
v = item.variations.create(value="foo", all_sales_channels=False)
|
||||
item.variations.create(value="bar")
|
||||
v.limit_sales_channels.add(self.organizer.sales_channels.get(identifier="web"))
|
||||
q.items.add(item)
|
||||
q.variations.add(v)
|
||||
assert Event.annotated(Event.objects).first().active_quotas == [q]
|
||||
@@ -2475,7 +2498,9 @@ class SubEventTest(TestCase):
|
||||
def test_active_quotas_annotation(self):
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2,
|
||||
subevent=self.se)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True,
|
||||
all_sales_channels=False)
|
||||
item.limit_sales_channels.add(self.organizer.sales_channels.get(identifier="web"))
|
||||
q.items.add(item)
|
||||
assert SubEvent.annotated(SubEvent.objects).first().active_quotas == [q]
|
||||
assert SubEvent.annotated(SubEvent.objects, 'foo').first().active_quotas == []
|
||||
@@ -2497,6 +2522,7 @@ class SubEventTest(TestCase):
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True)
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal("30"), locale='en'
|
||||
@@ -2594,6 +2620,7 @@ class CheckinListTestCase(TestCase):
|
||||
self.cl_tickets.limit_products.add(self.item1)
|
||||
o = Order.objects.create(
|
||||
code='FOO1', event=self.event, email='dummy@dummy.test',
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal("30"), locale='en'
|
||||
@@ -2621,6 +2648,7 @@ class CheckinListTestCase(TestCase):
|
||||
|
||||
o = Order.objects.create(
|
||||
code='FOO2', event=self.event, email='dummy@dummy.test',
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal("30"), locale='en'
|
||||
@@ -2687,6 +2715,7 @@ class SeatingTestCase(TestCase):
|
||||
def test_blocked_in_proximity(self):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_PENDING, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2709,6 +2738,7 @@ class SeatingTestCase(TestCase):
|
||||
def test_order_pending(self):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_PENDING, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2723,6 +2753,7 @@ class SeatingTestCase(TestCase):
|
||||
def test_order_paid(self):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_PAID, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2737,6 +2768,7 @@ class SeatingTestCase(TestCase):
|
||||
def test_order_expired(self):
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_EXPIRED, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2772,6 +2804,7 @@ class SeatingTestCase(TestCase):
|
||||
self.seat_a1.save()
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_PAID, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2789,6 +2822,7 @@ class SeatingTestCase(TestCase):
|
||||
self.seat_a1.save()
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test', total=Decimal("30"),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='en', status=Order.STATUS_CANCELED, datetime=now(),
|
||||
expires=now() + timedelta(days=10),
|
||||
)
|
||||
@@ -2982,9 +3016,15 @@ def test_subevent_date_updates_order_date():
|
||||
se1 = event.subevents.create(date_from=now(), name="SE 1")
|
||||
se2 = event.subevents.create(date_from=now(), name="SE 2")
|
||||
|
||||
order1 = Order.objects.create(event=event, status=Order.STATUS_PAID, expires=now() + timedelta(days=3), total=6)
|
||||
order1 = Order.objects.create(
|
||||
event=event, status=Order.STATUS_PAID, expires=now() + timedelta(days=3), total=6,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(order=order1, item=item1, subevent=se1, price=2)
|
||||
order2 = Order.objects.create(event=event, status=Order.STATUS_PAID, expires=now() + timedelta(days=3), total=6)
|
||||
order2 = Order.objects.create(
|
||||
event=event, status=Order.STATUS_PAID, expires=now() + timedelta(days=3), total=6,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(order=order2, item=item1, subevent=se2, price=2)
|
||||
|
||||
o1lm = order1.last_modified
|
||||
|
||||
@@ -50,6 +50,7 @@ def order(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
tr19 = event.tax_rules.create(rate=Decimal('19.00'))
|
||||
|
||||
@@ -73,7 +73,8 @@ def event():
|
||||
|
||||
@pytest.fixture
|
||||
def clist_autocheckin(event):
|
||||
c = event.checkin_lists.create(name="Default", all_products=True, auto_checkin_sales_channels=['web'])
|
||||
c = event.checkin_lists.create(name="Default", all_products=True)
|
||||
c.auto_checkin_sales_channels.add(event.organizer.sales_channels.get(identifier="web"))
|
||||
return c
|
||||
|
||||
|
||||
@@ -83,6 +84,7 @@ def test_expiry_days(event):
|
||||
event.settings.set('payment_term_days', 5)
|
||||
event.settings.set('payment_term_weekdays', False)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=today,
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
@@ -104,6 +106,7 @@ def test_expiry_weekdays(event):
|
||||
event.settings.set('payment_term_weekdays', True)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -120,6 +123,7 @@ def test_expiry_weekdays(event):
|
||||
today = make_aware(datetime(2016, 9, 19, 15, 0, 0, 0))
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -143,6 +147,7 @@ def test_expiry_minutes(event):
|
||||
event.settings.set('payment_term_weekdays', False)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -164,6 +169,7 @@ def test_expiry_last(event):
|
||||
event.settings.set('payment_term_weekdays', False)
|
||||
event.settings.set('payment_term_last', now() + timedelta(days=3))
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=today,
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
@@ -178,6 +184,7 @@ def test_expiry_last(event):
|
||||
assert (order.expires - today).days == 3
|
||||
event.settings.set('payment_term_last', now() + timedelta(days=7))
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=today,
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
@@ -204,6 +211,7 @@ def test_expiry_last_relative(event):
|
||||
))
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -244,6 +252,7 @@ def test_expiry_last_relative_subevents(event):
|
||||
))
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1, cp2],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -264,6 +273,7 @@ def test_expiry_dst(event):
|
||||
utc = ZoneInfo('UTC')
|
||||
today = datetime(2016, 10, 29, 12, 0, 0, tzinfo=tz).astimezone(utc)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=today,
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
@@ -286,12 +296,14 @@ def test_expiring(event):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='FO2', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -325,6 +337,7 @@ def test_expiring_paid_invoice(event):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
default_price=Decimal('12.00'), admission=True)
|
||||
@@ -358,6 +371,7 @@ def test_expire_twice(event):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
generate_invoice(o2)
|
||||
expire_orders(None)
|
||||
@@ -380,6 +394,7 @@ def test_expire_skipped_if_canceled_with_fee(event):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2.fees.create(fee_type=OrderFee.FEE_TYPE_CANCELLATION, value=12)
|
||||
generate_invoice(o2)
|
||||
@@ -396,12 +411,14 @@ def test_expiring_auto_disabled(event):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='FO2', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
expire_orders(None)
|
||||
o1 = Order.objects.get(id=o1.id)
|
||||
@@ -422,6 +439,7 @@ def test_expiring_auto_delayed(event):
|
||||
datetime=datetime(2023, 6, 22, 12, 13, 14, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
expires=datetime(2023, 6, 30, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='FO2', event=event, email='dummy@dummy.test',
|
||||
@@ -429,6 +447,7 @@ def test_expiring_auto_delayed(event):
|
||||
datetime=datetime(2023, 6, 22, 12, 13, 14, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
expires=datetime(2023, 6, 28, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
assert o1.payment_term_expire_date == o1.expires + timedelta(days=2) # limited by term_last
|
||||
assert o2.payment_term_expire_date == o2.expires + timedelta(days=3)
|
||||
@@ -472,6 +491,7 @@ def test_expiring_auto_delayed_weekdays(event):
|
||||
datetime=datetime(2023, 6, 22, 12, 13, 14, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
expires=datetime(2023, 6, 30, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("Europe/Berlin")),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
assert o1.payment_term_expire_date == o1.expires + timedelta(days=3)
|
||||
|
||||
@@ -482,13 +502,15 @@ def test_do_not_expire_if_approval_pending(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0, require_approval=True
|
||||
total=0, require_approval=True,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='FO2', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
expire_orders(None)
|
||||
o1 = Order.objects.get(id=o1.id)
|
||||
@@ -505,7 +527,8 @@ def test_approve(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=10, require_approval=True, locale='en'
|
||||
total=10, require_approval=True, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -536,7 +559,8 @@ def test_approve_send_to_attendees(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=10, require_approval=True, locale='en'
|
||||
total=10, require_approval=True, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -564,7 +588,8 @@ def test_approve_free(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0, require_approval=True
|
||||
total=0, require_approval=True,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
approve_order(o1)
|
||||
o1.refresh_from_db()
|
||||
@@ -586,7 +611,8 @@ def test_approve_free_send_to_attendees(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0, require_approval=True
|
||||
total=0, require_approval=True,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
ticket = Item.objects.create(event=event, name='Free ticket',
|
||||
default_price=Decimal('0.00'), admission=True)
|
||||
@@ -617,7 +643,8 @@ def test_approve_free_after_last_payment_date(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=0, require_approval=True
|
||||
total=0, require_approval=True,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
approve_order(o1)
|
||||
o1.refresh_from_db()
|
||||
@@ -636,7 +663,8 @@ def test_deny(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
total=10, require_approval=True, locale='en'
|
||||
total=10, require_approval=True, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
generate_invoice(o1)
|
||||
deny_order(o1)
|
||||
@@ -665,6 +693,7 @@ class PaymentReminderTests(TestCase):
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now().replace(hour=12, minute=0, second=0) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -788,6 +817,7 @@ class PaymentFailedTests(TestCase):
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -829,6 +859,7 @@ class DownloadReminderTests(TestCase):
|
||||
datetime=now() - timedelta(days=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -1021,6 +1052,7 @@ class OrderCancelTests(TestCase):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -1227,6 +1259,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.order.payments.create(
|
||||
provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CREATED, amount=self.order.total
|
||||
@@ -3405,6 +3438,7 @@ def test_autocheckin(clist_autocheckin, event):
|
||||
)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -3415,17 +3449,17 @@ def test_autocheckin(clist_autocheckin, event):
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de')[0]
|
||||
assert "web" in clist_autocheckin.auto_checkin_sales_channels
|
||||
assert clist_autocheckin.auto_checkin_sales_channels.contains(event.organizer.sales_channels.get(identifier="web"))
|
||||
assert order.positions.first().checkins.first().auto_checked_in
|
||||
|
||||
clist_autocheckin.auto_checkin_sales_channels = []
|
||||
clist_autocheckin.save()
|
||||
clist_autocheckin.auto_checkin_sales_channels.clear()
|
||||
|
||||
cp1 = CartPosition.objects.create(
|
||||
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
|
||||
)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -3436,7 +3470,7 @@ def test_autocheckin(clist_autocheckin, event):
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de')[0]
|
||||
assert clist_autocheckin.auto_checkin_sales_channels == []
|
||||
assert clist_autocheckin.auto_checkin_sales_channels.count() == 0
|
||||
assert order.positions.first().checkins.count() == 0
|
||||
|
||||
|
||||
@@ -3451,6 +3485,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
)
|
||||
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=today,
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
@@ -3461,7 +3496,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
"info_data": {},
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de', sales_channel='web')[0]
|
||||
locale='de')[0]
|
||||
assert not order.testmode
|
||||
|
||||
cp1 = CartPosition.objects.create(
|
||||
@@ -3469,6 +3504,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier=FoobazSalesChannel.identifier),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -3478,7 +3514,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
"info_data": {},
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
|
||||
locale='de')[0]
|
||||
assert not order.testmode
|
||||
|
||||
cp1 = CartPosition.objects.create(
|
||||
@@ -3487,6 +3523,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
event.testmode = True
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -3496,7 +3533,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
"info_data": {},
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de', sales_channel='web')[0]
|
||||
locale='de')[0]
|
||||
assert order.testmode
|
||||
|
||||
cp1 = CartPosition.objects.create(
|
||||
@@ -3504,6 +3541,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
)
|
||||
order = _create_order(event, email='dummy@example.org', positions=[cp1],
|
||||
now_dt=today,
|
||||
sales_channel=event.organizer.sales_channels.get(identifier=FoobazSalesChannel.identifier),
|
||||
payment_requests=[{
|
||||
"id": "test0",
|
||||
"provider": "free",
|
||||
@@ -3513,7 +3551,7 @@ def test_saleschannel_testmode_restriction(event):
|
||||
"info_data": {},
|
||||
"pprov": FreeOrderProvider(event),
|
||||
}],
|
||||
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
|
||||
locale='de')[0]
|
||||
assert not order.testmode
|
||||
|
||||
|
||||
@@ -3530,6 +3568,7 @@ def test_giftcard_multiple(event):
|
||||
gc2.transactions.create(value=12, acceptor=event.organizer)
|
||||
order = _create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3580,6 +3619,7 @@ def test_giftcard_partial(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
order = _create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3627,6 +3667,7 @@ def test_giftcard_payment_fee(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
order = _create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3673,6 +3714,7 @@ def test_giftcard_invalid_currency(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
_create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3715,6 +3757,7 @@ def test_giftcard_invalid_organizer(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
_create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3756,6 +3799,7 @@ def test_giftcard_test_mode_invalid(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
_create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3799,6 +3843,7 @@ def test_giftcard_test_mode_event(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
_create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3840,6 +3885,7 @@ def test_giftcard_swap(event):
|
||||
gc1.transactions.create(value=12, acceptor=event.organizer)
|
||||
_create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3881,6 +3927,7 @@ def test_issue_when_paid_and_changed(event):
|
||||
q.items.add(ticket)
|
||||
order = _create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
@@ -3930,6 +3977,7 @@ class OrderReactivateTest(TestCase):
|
||||
datetime=now(), expires=now() + timedelta(days=1),
|
||||
cancellation_date=now(),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=self.event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
@@ -4066,6 +4114,7 @@ def test_autocreate_medium(event):
|
||||
q.items.add(ticket)
|
||||
order = _create_order(
|
||||
event, email='dummy@example.org', positions=[cp1],
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
now_dt=now(),
|
||||
payment_requests=[
|
||||
{
|
||||
|
||||
@@ -220,6 +220,7 @@ def test_availability_date_order_relative_subevents(event):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + datetime.timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order, item=ticket, variation=None, subevent=se1,
|
||||
|
||||
@@ -998,17 +998,20 @@ def test_limit_products_subevents_distinct(event, item, item2):
|
||||
@pytest.mark.django_db
|
||||
@scopes_disabled()
|
||||
def test_sales_channels(event, item):
|
||||
d1 = Discount(event=event, condition_min_count=2, benefit_discount_matching_percent=20, sales_channels=['resellers'])
|
||||
d1 = Discount(event=event, condition_min_count=2, benefit_discount_matching_percent=20, all_sales_channels=False)
|
||||
d1.save()
|
||||
d2 = Discount(event=event, condition_min_count=2, benefit_discount_matching_percent=50, sales_channels=['web', 'resellers'])
|
||||
d1.limit_sales_channels.add(event.organizer.sales_channels.get(identifier="bar"))
|
||||
d2 = Discount(event=event, condition_min_count=2, benefit_discount_matching_percent=50, all_sales_channels=False)
|
||||
d2.save()
|
||||
d2.limit_sales_channels.add(event.organizer.sales_channels.get(identifier="web"))
|
||||
d2.limit_sales_channels.add(event.organizer.sales_channels.get(identifier="bar"))
|
||||
|
||||
positions = (
|
||||
(item.pk, None, Decimal('100.00'), False, False, Decimal('0.00')),
|
||||
(item.pk, None, Decimal('100.00'), False, False, Decimal('0.00')),
|
||||
)
|
||||
|
||||
assert sorted([p for p, d in apply_discounts(event, 'resellers', positions)]) == [Decimal('80.00'), Decimal('80.00')]
|
||||
assert sorted([p for p, d in apply_discounts(event, 'bar', positions)]) == [Decimal('80.00'), Decimal('80.00')]
|
||||
assert sorted([p for p, d in apply_discounts(event, 'web', positions)]) == [Decimal('50.00'), Decimal('50.00')]
|
||||
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ def order(event, item):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=14, locale='en'
|
||||
)
|
||||
event.settings.set('attendee_names_asked', True)
|
||||
|
||||
@@ -65,6 +65,7 @@ def order(event):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
tr19 = event.tax_rules.create(rate=Decimal('19.00'))
|
||||
|
||||
@@ -43,6 +43,7 @@ def order1_expired(event, organizer, item):
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_EXPIRED, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
sales_channel=organizer.sales_channels.get(identifier="web"),
|
||||
total=Decimal('0.00'),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
@@ -62,6 +63,7 @@ def order2_expired(event, organizer, item, customer):
|
||||
code='BAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_EXPIRED, locale='en',
|
||||
datetime=now(), expires=now() - timedelta(days=10),
|
||||
sales_channel=organizer.sales_channels.get(identifier="web"),
|
||||
total=Decimal('0.00'),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ def env():
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
shirt = Item.objects.create(event=event, name='T-Shirt', default_price=12)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
|
||||
|
||||
@@ -49,12 +49,14 @@ def env():
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='6789Z', event=event,
|
||||
status=Order.STATUS_CANCELED,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
quota = Quota.objects.create(name="Test", size=2, event=event)
|
||||
item1 = Item.objects.create(event=event, name="Ticket", default_price=23)
|
||||
|
||||
@@ -49,13 +49,15 @@ def env():
|
||||
code='1Z3AS', event=event,
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='6789Z', event=event,
|
||||
status=Order.STATUS_CANCELED,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
quota = Quota.objects.create(name="Test", size=2, event=event)
|
||||
item1 = Item.objects.create(event=event, name="Ticket", default_price=23)
|
||||
|
||||
@@ -68,19 +68,22 @@ def env():
|
||||
code='1Z3AS', event=event, email='admin@localhost',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o2 = Order.objects.create(
|
||||
code='6789Z', event=event,
|
||||
status=Order.STATUS_CANCELED,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
Order.objects.create(
|
||||
code='GS89Z', event=event,
|
||||
status=Order.STATUS_CANCELED,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
quota = Quota.objects.create(name="Test", size=2, event=event)
|
||||
item1 = Item.objects.create(event=event, name="Ticket", default_price=23)
|
||||
@@ -442,12 +445,14 @@ def test_keep_unmatched(env, orga_job):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_split_payment_success(env, orga_job):
|
||||
o4 = Order.objects.create(
|
||||
code='99999', event=env[0],
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=12
|
||||
)
|
||||
with scopes_disabled():
|
||||
o4 = Order.objects.create(
|
||||
code='99999', event=env[0],
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
process_banktransfers(orga_job, [{
|
||||
'payer': 'Karla Kundin',
|
||||
'reference': 'Bestellungen DUMMY-1Z3AS DUMMY-99999',
|
||||
@@ -468,12 +473,14 @@ def test_split_payment_success(env, orga_job):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_split_payment_mismatch(env, orga_job):
|
||||
o4 = Order.objects.create(
|
||||
code='99999', event=env[0],
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=12
|
||||
)
|
||||
with scopes_disabled():
|
||||
o4 = Order.objects.create(
|
||||
code='99999', event=env[0],
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=12,
|
||||
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
process_banktransfers(orga_job, [{
|
||||
'payer': 'Karla Kundin',
|
||||
'reference': 'Bestellungen DUMMY-1Z3AS DUMMY-99999',
|
||||
|
||||
@@ -47,6 +47,7 @@ def env():
|
||||
code='1Z3AS', event=event, email='admin@localhost',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
total=23
|
||||
)
|
||||
payment = OrderPayment.objects.create(
|
||||
|
||||
@@ -48,7 +48,8 @@ def env():
|
||||
code='1Z3AS', event=event, email='admin@localhost',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=23
|
||||
total=23,
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
refund = OrderRefund.objects.create(
|
||||
order=order,
|
||||
@@ -74,7 +75,8 @@ def refund_huf(env):
|
||||
code='HUFFY', event=event, email='admin@localhost',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=42
|
||||
total=42,
|
||||
sales_channel=env[0].organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
refund = OrderRefund.objects.create(
|
||||
order=order,
|
||||
|
||||
@@ -49,6 +49,7 @@ def env():
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o1.payments.create(
|
||||
amount=o1.total,
|
||||
|
||||
@@ -50,6 +50,7 @@ def env():
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('43.59'),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
o1.payments.create(
|
||||
amount=o1.total,
|
||||
|
||||
@@ -57,11 +57,12 @@ def checkin_list(event):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def order(item):
|
||||
def order(event, item):
|
||||
"""Returns an order instance"""
|
||||
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=event.organizer.sales_channels.get(identifier="web"),
|
||||
datetime=now(), locale='en')
|
||||
return o
|
||||
|
||||
|
||||
@@ -284,12 +284,14 @@ def test_sendmail_rule_all_subevents(event_series, subevent1, subevent2, item):
|
||||
o1 = Order.objects.create(event=item.event, status=Order.STATUS_PAID,
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY1', email='dummy1@dummy.test',
|
||||
sales_channel=event_series.organizer.sales_channels.get(identifier="web"),
|
||||
datetime=now(), locale='en')
|
||||
o1.all_positions.create(item=item, price=13, subevent=subevent1)
|
||||
o1.all_positions.create(item=item, price=13, subevent=subevent2)
|
||||
o2 = Order.objects.create(event=item.event, status=Order.STATUS_PAID,
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY2', email='dummy2@dummy.test',
|
||||
sales_channel=event_series.organizer.sales_channels.get(identifier="web"),
|
||||
datetime=now(), locale='en')
|
||||
o2.all_positions.create(item=item, price=23, subevent=subevent1)
|
||||
o2.all_positions.create(item=item, price=23, subevent=subevent2)
|
||||
|
||||
@@ -173,10 +173,11 @@ def test_sendmail_multi_locales(logged_in_client, sendmail_url, event, item):
|
||||
event.settings.set('locales', ['en', 'de'])
|
||||
|
||||
with scopes_disabled():
|
||||
o = Order.objects.create(event=item.event, status=Order.STATUS_PAID,
|
||||
o = Order.objects.create(event=event, status=Order.STATUS_PAID,
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY', email='dummy@dummy.test',
|
||||
datetime=now(),
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
locale='de')
|
||||
OrderPosition.objects.create(order=o, item=item, price=13)
|
||||
|
||||
|
||||
@@ -60,7 +60,8 @@ def env():
|
||||
code='FOOBAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37')
|
||||
total=Decimal('13.37'),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
yield event, o1
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ def env():
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
return event, o1
|
||||
|
||||
|
||||
@@ -51,7 +51,8 @@ def event():
|
||||
code='FOO', event=event, email='dummy@dummy.test', phone="+498912345678",
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=datetime.timezone.utc), expires=now() + datetime.timedelta(days=10),
|
||||
total=33, locale='en'
|
||||
total=33, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True)
|
||||
OrderPosition.objects.create(
|
||||
@@ -150,7 +151,8 @@ def test_csv_order_by_inherited_name_parts(event): # noqa
|
||||
code='BAR', event=event, email='dummy@dummy.test', phone='+498912345678',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=datetime.timezone.utc), expires=now() + datetime.timedelta(days=10),
|
||||
total=33, locale='en'
|
||||
total=33, locale='en',
|
||||
sales_channel=event.organizer.sales_channels.get(identifier="web"),
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order2,
|
||||
|
||||
@@ -43,7 +43,7 @@ def env():
|
||||
t.limit_events.add(event)
|
||||
item1 = Item.objects.create(event=event, name="Ticket", default_price=23)
|
||||
tl = event.ticket_layouts.create(name="Foo", default=True, layout='[{"a": 2}]')
|
||||
TicketLayoutItem.objects.create(layout=tl, item=item1)
|
||||
TicketLayoutItem.objects.create(layout=tl, item=item1, sales_channel=o.sales_channels.get(identifier="web"))
|
||||
return event, tl, item1
|
||||
|
||||
|
||||
|
||||
@@ -134,7 +134,7 @@ class TicketLayoutFormTest(SoupTest):
|
||||
def test_item_copy(self):
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2, sales_channel=self.orga1.sales_channels.get(identifier="web"))
|
||||
self.client.post('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), {
|
||||
'name_0': 'Intermediate',
|
||||
'default_price': '23.00',
|
||||
@@ -150,7 +150,7 @@ class TicketLayoutFormTest(SoupTest):
|
||||
def test_copy_event(self):
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2, sales_channel=self.orga1.sales_channels.get(identifier="web"))
|
||||
self.post_doc('/control/events/add', {
|
||||
'event_wizard-current_step': 'foundation',
|
||||
'event_wizard-prefix': 'event_wizard',
|
||||
|
||||
@@ -46,6 +46,7 @@ def env0():
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
sales_channel=o.sales_channels.get(identifier="web"),
|
||||
)
|
||||
shirt = Item.objects.create(event=event, name='T-Shirt', default_price=12)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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), {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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"),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
#
|
||||
from django.dispatch import receiver
|
||||
|
||||
from pretix.base.channels import SalesChannel
|
||||
from pretix.base.channels import SalesChannelType
|
||||
from pretix.base.signals import (
|
||||
register_payment_providers, register_sales_channels,
|
||||
register_payment_providers, register_sales_channel_types,
|
||||
register_ticket_outputs,
|
||||
)
|
||||
|
||||
@@ -43,14 +43,14 @@ def register_payment_provider(sender, **kwargs):
|
||||
return [DummyPaymentProvider, DummyFullRefundablePaymentProvider, DummyPartialRefundablePaymentProvider]
|
||||
|
||||
|
||||
class FoobazSalesChannel(SalesChannel):
|
||||
class FoobazSalesChannel(SalesChannelType):
|
||||
identifier = "baz"
|
||||
verbose_name = "Foobar"
|
||||
icon = "home"
|
||||
testmode_supported = False
|
||||
|
||||
|
||||
class FoobarSalesChannel(SalesChannel):
|
||||
class FoobarSalesChannel(SalesChannelType):
|
||||
identifier = "bar"
|
||||
verbose_name = "Foobar"
|
||||
icon = "home"
|
||||
@@ -58,6 +58,6 @@ class FoobarSalesChannel(SalesChannel):
|
||||
unlimited_items_per_order = True
|
||||
|
||||
|
||||
@receiver(register_sales_channels, dispatch_uid="sc_dummy")
|
||||
@receiver(register_sales_channel_types, dispatch_uid="sc_dummy")
|
||||
def register_sc(sender, **kwargs):
|
||||
return [FoobarSalesChannel, FoobazSalesChannel]
|
||||
|
||||
Reference in New Issue
Block a user