mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
New implementation of sales channels (#4111)
Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
176
src/tests/api/test_saleschannels.py
Normal file
176
src/tests/api/test_saleschannels.py
Normal file
@@ -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'),
|
||||
|
||||
Reference in New Issue
Block a user