forked from CGM_Public/pretix_original
Integrate django-scopes (#1319)
* Install django-scopes * Fix tests.api * Update tasks and cronjobs * Fix remaining tests * Remove unused import * Fix tests after rebase * Disable scopes for get_Events_with_any_permission * Disable scopes for a management command
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
from django.test import utils
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
@@ -15,16 +17,19 @@ def client():
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def organizer():
|
||||
return Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def meta_prop(organizer):
|
||||
return organizer.meta_properties.create(name="type", default="Concert")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def event(organizer, meta_prop):
|
||||
e = Event.objects.create(
|
||||
organizer=organizer, name='Dummy', slug='dummy',
|
||||
@@ -37,6 +42,7 @@ def event(organizer, meta_prop):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def event2(organizer, meta_prop):
|
||||
e = Event.objects.create(
|
||||
organizer=organizer, name='Dummy2', slug='dummy2',
|
||||
@@ -48,6 +54,7 @@ def event2(organizer, meta_prop):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def event3(organizer, meta_prop):
|
||||
e = Event.objects.create(
|
||||
organizer=organizer, name='Dummy3', slug='dummy3',
|
||||
@@ -59,6 +66,7 @@ def event3(organizer, meta_prop):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def team(organizer):
|
||||
return Team.objects.create(
|
||||
organizer=organizer,
|
||||
@@ -73,6 +81,7 @@ def team(organizer):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def device(organizer):
|
||||
return Device.objects.create(
|
||||
organizer=organizer,
|
||||
@@ -89,6 +98,7 @@ def user():
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def user_client(client, team, user):
|
||||
team.can_view_orders = True
|
||||
team.can_view_vouchers = True
|
||||
@@ -100,6 +110,7 @@ def user_client(client, team, user):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def token_client(client, team):
|
||||
team.can_view_orders = True
|
||||
team.can_view_vouchers = True
|
||||
@@ -117,6 +128,7 @@ def device_client(client, device):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def subevent(event, meta_prop):
|
||||
event.has_subevents = True
|
||||
event.save()
|
||||
@@ -127,6 +139,7 @@ def subevent(event, meta_prop):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def subevent2(event2, meta_prop):
|
||||
event2.has_subevents = True
|
||||
event2.save()
|
||||
@@ -137,10 +150,15 @@ def subevent2(event2, meta_prop):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def taxrule(event):
|
||||
return event.tax_rules.create(name="VAT", rate=19)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@scopes_disabled()
|
||||
def taxrule2(event2):
|
||||
return event2.tax_rules.create(name="VAT", rate=25)
|
||||
|
||||
|
||||
utils.setup_databases = scopes_disabled()(utils.setup_databases)
|
||||
|
||||
@@ -13,7 +13,6 @@ def test_no_auth(client):
|
||||
def test_session_auth_no_teams(client, user):
|
||||
client.login(email=user.email, password='dummy')
|
||||
resp = client.get('/api/v1/organizers/')
|
||||
print(resp.data)
|
||||
assert resp.status_code == 200
|
||||
assert len(resp.data['results']) == 0
|
||||
|
||||
|
||||
+38
-22
@@ -5,6 +5,7 @@ from unittest import mock
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import Question
|
||||
@@ -175,7 +176,8 @@ def test_cartpos_create(token_client, organizer, event, item, quota, question):
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.attendee_name_parts == {'full_name': 'Peter'}
|
||||
@@ -193,7 +195,8 @@ def test_cartpos_create_name_optional(token_client, organizer, event, item, quot
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.attendee_name_parts == {}
|
||||
@@ -217,7 +220,8 @@ def test_cartpos_create_legacy_name(token_client, organizer, event, item, quota,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.attendee_name_parts == {'_legacy': 'Peter'}
|
||||
@@ -247,7 +251,8 @@ def test_cartpos_cart_id_optional(token_client, organizer, event, item, quota, q
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert len(cp.cart_id) > 48
|
||||
@@ -300,7 +305,8 @@ def test_cartpos_create_item_validation(token_client, organizer, event, item, it
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {'item': ['The specified item does not belong to this event.']}
|
||||
|
||||
var2 = item2.variations.create(value="A")
|
||||
with scopes_disabled():
|
||||
var2 = item2.variations.create(value="A")
|
||||
|
||||
res['item'] = item.pk
|
||||
res['variation'] = var2.pk
|
||||
@@ -312,7 +318,8 @@ def test_cartpos_create_item_validation(token_client, organizer, event, item, it
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == {'non_field_errors': ['You cannot specify a variation for this item.']}
|
||||
|
||||
var1 = item.variations.create(value="A")
|
||||
with scopes_disabled():
|
||||
var1 = item.variations.create(value="A")
|
||||
res['item'] = item.pk
|
||||
res['variation'] = var1.pk
|
||||
resp = token_client.post(
|
||||
@@ -361,7 +368,8 @@ def test_cartpos_expires_optional(token_client, organizer, event, item, quota, q
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cp = CartPosition.objects.get(pk=resp.data['id'])
|
||||
assert cp.price == Decimal('23.00')
|
||||
assert cp.item == item
|
||||
assert cp.expires - now() > datetime.timedelta(minutes=25)
|
||||
@@ -410,7 +418,8 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
assert resp.data == {
|
||||
'answers': [{'non_field_errors': ['You need to specify options if the question is of a choice type.']}]}
|
||||
|
||||
question.options.create(answer="L")
|
||||
with scopes_disabled():
|
||||
question.options.create(answer="L")
|
||||
res['answers'][0]['options'] = [
|
||||
question.options.first().pk,
|
||||
question.options.last().pk,
|
||||
@@ -445,8 +454,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.question == question
|
||||
assert answ.answer == "XL, L"
|
||||
|
||||
@@ -460,8 +470,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "3.45"
|
||||
|
||||
question.type = Question.TYPE_NUMBER
|
||||
@@ -486,8 +497,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "True"
|
||||
|
||||
question.type = Question.TYPE_BOOLEAN
|
||||
@@ -499,8 +511,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "False"
|
||||
|
||||
question.type = Question.TYPE_BOOLEAN
|
||||
@@ -523,8 +536,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "2018-05-14"
|
||||
|
||||
question.type = Question.TYPE_DATE
|
||||
@@ -548,8 +562,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "2018-05-14 13:00:00+00:00"
|
||||
|
||||
question.type = Question.TYPE_DATETIME
|
||||
@@ -574,8 +589,9 @@ def test_cartpos_create_answer_validation(token_client, organizer, event, item,
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
with scopes_disabled():
|
||||
pos = CartPosition.objects.get(pk=resp.data['id'])
|
||||
answ = pos.answers.first()
|
||||
assert answ.answer == "13:00:00"
|
||||
|
||||
question.type = Question.TYPE_TIME
|
||||
|
||||
+113
-65
@@ -6,6 +6,7 @@ from unittest import mock
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scopes_disabled
|
||||
from i18nfield.strings import LazyI18nString
|
||||
from pytz import UTC
|
||||
|
||||
@@ -157,7 +158,8 @@ def test_list_list(token_client, organizer, event, clist, item, subevent):
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
|
||||
assert [res] == resp.data['results']
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
|
||||
assert [] == resp.data['results']
|
||||
@@ -188,10 +190,11 @@ def test_list_create(token_client, organizer, event, item, item_on_wrong_event):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
assert cl.name == "VIP"
|
||||
assert cl.limit_products.count() == 1
|
||||
assert not cl.all_products
|
||||
with scopes_disabled():
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
assert cl.name == "VIP"
|
||||
assert cl.limit_products.count() == 1
|
||||
assert not cl.all_products
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/checkinlists/'.format(organizer.slug, event.slug),
|
||||
@@ -271,18 +274,20 @@ def test_list_update(token_client, organizer, event, clist):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
cl = CheckinList.objects.get(pk=resp.data['id'])
|
||||
assert cl.name == "VIP"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_list_all_items_positions(token_client, organizer, event, clist, clist_all, item, other_item, order):
|
||||
p1 = dict(TEST_ORDERPOSITION1_RES)
|
||||
p1["id"] = order.positions.first().pk
|
||||
p1["item"] = item.pk
|
||||
p2 = dict(TEST_ORDERPOSITION2_RES)
|
||||
p2["id"] = order.positions.last().pk
|
||||
p2["item"] = other_item.pk
|
||||
with scopes_disabled():
|
||||
p1 = dict(TEST_ORDERPOSITION1_RES)
|
||||
p1["id"] = order.positions.first().pk
|
||||
p1["item"] = item.pk
|
||||
p2 = dict(TEST_ORDERPOSITION2_RES)
|
||||
p2["id"] = order.positions.last().pk
|
||||
p2["item"] = other_item.pk
|
||||
|
||||
# All items
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/?ordering=positionid'.format(
|
||||
@@ -292,7 +297,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
|
||||
assert [p1, p2] == resp.data['results']
|
||||
|
||||
# Check-ins on other list ignored
|
||||
order.positions.first().checkins.create(list=clist)
|
||||
with scopes_disabled():
|
||||
order.positions.first().checkins.create(list=clist)
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/?ordering=positionid'.format(
|
||||
organizer.slug, event.slug, clist_all.pk
|
||||
))
|
||||
@@ -305,7 +311,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
|
||||
assert [] == resp.data['results']
|
||||
|
||||
# Only checked in
|
||||
c = order.positions.first().checkins.create(list=clist_all)
|
||||
with scopes_disabled():
|
||||
c = order.positions.first().checkins.create(list=clist_all)
|
||||
p1['checkins'] = [
|
||||
{
|
||||
'list': clist_all.pk,
|
||||
@@ -341,7 +348,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
|
||||
|
||||
# Order by checkin date
|
||||
time.sleep(1)
|
||||
c = order.positions.last().checkins.create(list=clist_all)
|
||||
with scopes_disabled():
|
||||
c = order.positions.last().checkins.create(list=clist_all)
|
||||
p2['checkins'] = [
|
||||
{
|
||||
'list': clist_all.pk,
|
||||
@@ -388,7 +396,8 @@ def test_list_all_items_positions(token_client, organizer, event, clist, clist_a
|
||||
@pytest.mark.django_db
|
||||
def test_list_limited_items_positions(token_client, organizer, event, clist, item, order):
|
||||
p1 = dict(TEST_ORDERPOSITION1_RES)
|
||||
p1["id"] = order.positions.first().pk
|
||||
with scopes_disabled():
|
||||
p1["id"] = order.positions.first().pk
|
||||
p1["item"] = item.pk
|
||||
|
||||
# All items
|
||||
@@ -402,12 +411,13 @@ def test_list_limited_items_positions(token_client, organizer, event, clist, ite
|
||||
@pytest.mark.django_db
|
||||
def test_list_limited_items_position_detail(token_client, organizer, event, clist, item, order):
|
||||
p1 = dict(TEST_ORDERPOSITION1_RES)
|
||||
p1["id"] = order.positions.first().pk
|
||||
with scopes_disabled():
|
||||
p1["id"] = order.positions.first().pk
|
||||
p1["item"] = item.pk
|
||||
|
||||
# All items
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p1["id"]
|
||||
))
|
||||
assert resp.status_code == 200
|
||||
assert p1 == resp.data
|
||||
@@ -415,12 +425,13 @@ def test_list_limited_items_position_detail(token_client, organizer, event, clis
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_status(token_client, organizer, event, clist_all, item, other_item, order):
|
||||
op = order.positions.first()
|
||||
var1 = item.variations.create(value="XS")
|
||||
var2 = item.variations.create(value="S")
|
||||
op.variation = var1
|
||||
op.save()
|
||||
Checkin.objects.create(position=op, list=clist_all)
|
||||
with scopes_disabled():
|
||||
op = order.positions.first()
|
||||
var1 = item.variations.create(value="XS")
|
||||
var2 = item.variations.create(value="S")
|
||||
op.variation = var1
|
||||
op.save()
|
||||
Checkin.objects.create(position=op, list=clist_all)
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/checkinlists/{}/status/'.format(
|
||||
organizer.slug, event.slug, clist_all.pk,
|
||||
))
|
||||
@@ -464,21 +475,25 @@ def test_status(token_client, organizer, event, clist_all, item, other_item, ord
|
||||
def test_custom_datetime(token_client, organizer, clist, event, order):
|
||||
dt = now() - datetime.timedelta(days=1)
|
||||
dt = dt.replace(microsecond=0)
|
||||
with scopes_disabled():
|
||||
p = order.positions.first().pk
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p
|
||||
), {
|
||||
'datetime': dt.isoformat()
|
||||
}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
with scopes_disabled():
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_name_fallback(token_client, organizer, clist, event, order):
|
||||
order.invoice_address.name_parts = {'_legacy': 'Paul'}
|
||||
order.invoice_address.save()
|
||||
op = order.positions.first()
|
||||
with scopes_disabled():
|
||||
op = order.positions.first()
|
||||
op.attendee_name_cached = None
|
||||
op.attendee_name_parts = {}
|
||||
op.save()
|
||||
@@ -493,8 +508,10 @@ def test_name_fallback(token_client, organizer, clist, event, order):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_by_secret(token_client, organizer, clist, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().secret
|
||||
organizer.slug, event.slug, clist.pk, p.secret
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -502,13 +519,15 @@ def test_by_secret(token_client, organizer, clist, event, order):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_only_once(token_client, organizer, clist, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'error'
|
||||
@@ -517,13 +536,15 @@ def test_only_once(token_client, organizer, clist, event, order):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reupload_same_nonce(token_client, organizer, clist, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'nonce': 'foobar'}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'nonce': 'foobar'}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -531,13 +552,15 @@ def test_reupload_same_nonce(token_client, organizer, clist, event, order):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_multiple_different_list(token_client, organizer, clist, clist_all, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'nonce': 'foobar'}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist_all.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist_all.pk, p.pk
|
||||
), {'nonce': 'baz'}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -545,13 +568,15 @@ def test_multiple_different_list(token_client, organizer, clist, clist_all, even
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_forced_multiple(token_client, organizer, clist, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'force': True}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -559,17 +584,19 @@ def test_forced_multiple(token_client, organizer, clist, event, order):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_require_paid(token_client, organizer, clist, event, order):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
order.status = Order.STATUS_PENDING
|
||||
order.save()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'error'
|
||||
assert resp.data['reason'] == 'unpaid'
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'ignore_unpaid': True}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'error'
|
||||
@@ -579,14 +606,14 @@ def test_require_paid(token_client, organizer, clist, event, order):
|
||||
clist.save()
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'error'
|
||||
assert resp.data['reason'] == 'unpaid'
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'ignore_unpaid': True}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -603,88 +630,105 @@ def question(event, item):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_number(token_client, organizer, clist, event, order, question):
|
||||
question[0].options.all().delete()
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
question[0].options.all().delete()
|
||||
question[0].type = 'N'
|
||||
question[0].save()
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: "3.24"}}, format='json')
|
||||
print(resp.data)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == '3.24'
|
||||
with scopes_disabled():
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == '3.24'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_choice(token_client, organizer, clist, event, order, question):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: str(question[1].pk)}}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == 'M'
|
||||
assert list(order.positions.first().answers.get(question=question[0]).options.all()) == [question[1]]
|
||||
with scopes_disabled():
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == 'M'
|
||||
assert list(order.positions.first().answers.get(question=question[0]).options.all()) == [question[1]]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_invalid(token_client, organizer, clist, event, order, question):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: "A"}}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_required(token_client, organizer, clist, event, order, question):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
question[0].required = True
|
||||
question[0].save()
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: ""}}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_optional(token_client, organizer, clist, event, order, question):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
question[0].required = False
|
||||
question[0].save()
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: ""}}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
@@ -692,20 +736,24 @@ def test_question_optional(token_client, organizer, clist, event, order, questio
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_multiple_choice(token_client, organizer, clist, event, order, question):
|
||||
with scopes_disabled():
|
||||
p = order.positions.first()
|
||||
question[0].type = 'M'
|
||||
question[0].save()
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {}, format='json')
|
||||
assert resp.status_code == 400
|
||||
assert resp.data['status'] == 'incomplete'
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
with scopes_disabled():
|
||||
assert resp.data['questions'] == [QuestionSerializer(question[0]).data]
|
||||
|
||||
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/positions/{}/redeem/'.format(
|
||||
organizer.slug, event.slug, clist.pk, order.positions.first().pk
|
||||
organizer.slug, event.slug, clist.pk, p.pk
|
||||
), {'answers': {question[0].pk: "{},{}".format(question[1].pk, question[2].pk)}}, format='json')
|
||||
assert resp.status_code == 201
|
||||
assert resp.data['status'] == 'ok'
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == 'M, L'
|
||||
assert set(order.positions.first().answers.get(question=question[0]).options.all()) == {question[1], question[2]}
|
||||
with scopes_disabled():
|
||||
assert order.positions.first().answers.get(question=question[0]).answer == 'M, L'
|
||||
assert set(order.positions.first().answers.get(question=question[0]).options.all()) == {question[1], question[2]}
|
||||
|
||||
@@ -5,6 +5,7 @@ from unittest import mock
|
||||
import pytest
|
||||
from django.conf import settings
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import Event, InvoiceAddress, Order, OrderPosition
|
||||
@@ -161,11 +162,12 @@ def test_event_create(token_client, organizer, event, meta_prop):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert not organizer.events.get(slug="2030").testmode
|
||||
assert organizer.events.get(slug="2030").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
assert organizer.events.get(slug="2030").plugins == settings.PRETIX_PLUGINS_DEFAULT
|
||||
with scopes_disabled():
|
||||
assert not organizer.events.get(slug="2030").testmode
|
||||
assert organizer.events.get(slug="2030").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
assert organizer.events.get(slug="2030").plugins == settings.PRETIX_PLUGINS_DEFAULT
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/'.format(organizer.slug),
|
||||
@@ -278,13 +280,14 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
|
||||
)
|
||||
|
||||
assert resp.status_code == 201
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2030')
|
||||
assert cloned_event.plugins == 'pretix.plugins.ticketoutputpdf'
|
||||
assert cloned_event.is_public is False
|
||||
assert cloned_event.testmode
|
||||
assert organizer.events.get(slug="2030").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2030')
|
||||
assert cloned_event.plugins == 'pretix.plugins.ticketoutputpdf'
|
||||
assert cloned_event.is_public is False
|
||||
assert cloned_event.testmode
|
||||
assert organizer.events.get(slug="2030").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/clone/'.format(organizer.slug, event.slug),
|
||||
@@ -310,12 +313,13 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
|
||||
)
|
||||
|
||||
assert resp.status_code == 201
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2031')
|
||||
assert cloned_event.plugins == "pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf"
|
||||
assert cloned_event.is_public is True
|
||||
assert organizer.events.get(slug="2031").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2031')
|
||||
assert cloned_event.plugins == "pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf"
|
||||
assert cloned_event.is_public is True
|
||||
assert organizer.events.get(slug="2031").meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/clone/'.format(organizer.slug, event.slug),
|
||||
@@ -339,8 +343,9 @@ def test_event_create_with_clone(token_client, organizer, event, meta_prop):
|
||||
)
|
||||
|
||||
assert resp.status_code == 201
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2032')
|
||||
assert cloned_event.plugins == ""
|
||||
with scopes_disabled():
|
||||
cloned_event = Event.objects.get(organizer=organizer.pk, slug='2032')
|
||||
assert cloned_event.plugins == ""
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -388,11 +393,12 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
event = Event.objects.get(organizer=organizer.pk, slug=resp.data['slug'])
|
||||
assert event.currency == "DKK"
|
||||
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
event = Event.objects.get(organizer=organizer.pk, slug=resp.data['slug'])
|
||||
assert event.currency == "DKK"
|
||||
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
@@ -447,9 +453,10 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Workshop"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
assert organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Workshop"
|
||||
).exists()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
@@ -460,9 +467,10 @@ def test_event_update(token_client, organizer, event, item, meta_prop):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert not organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
assert not organizer.events.get(slug=resp.data['slug']).meta_values.filter(
|
||||
property__name=meta_prop.name
|
||||
).exists()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
@@ -598,7 +606,8 @@ def test_event_detail(token_client, organizer, event, team):
|
||||
def test_event_delete(token_client, organizer, event):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug))
|
||||
assert resp.status_code == 204
|
||||
assert not organizer.events.filter(pk=event.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not organizer.events.filter(pk=event.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -607,4 +616,5 @@ def test_event_with_order_position_not_delete(token_client, organizer, event, it
|
||||
assert resp.status_code == 403
|
||||
assert resp.content.decode() == '{"detail":"The event can not be deleted as it already contains orders. Please ' \
|
||||
'set \'live\' to false to hide the event and take the shop offline instead."}'
|
||||
assert organizer.events.filter(pk=event.id).exists()
|
||||
with scopes_disabled():
|
||||
assert organizer.events.filter(pk=event.id).exists()
|
||||
|
||||
+109
-62
@@ -5,6 +5,7 @@ from unittest import mock
|
||||
|
||||
import pytest
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -169,7 +170,8 @@ def test_category_update(token_client, organizer, event, team, category):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert ItemCategory.objects.get(pk=category.pk).name == {"en": "Test"}
|
||||
with scopes_disabled():
|
||||
assert ItemCategory.objects.get(pk=category.pk).name == {"en": "Test"}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -189,8 +191,9 @@ def test_category_delete(token_client, organizer, event, category3, item):
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/events/{}/categories/{}/'.format(organizer.slug, event.slug, category3.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.categories.filter(pk=category3.id).exists()
|
||||
assert Item.objects.get(pk=item.pk).category is None
|
||||
with scopes_disabled():
|
||||
assert not event.categories.filter(pk=category3.id).exists()
|
||||
assert Item.objects.get(pk=item.pk).category is None
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -308,7 +311,8 @@ def test_item_detail(token_client, organizer, event, team, item):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_item_detail_variations(token_client, organizer, event, team, item):
|
||||
var = item.variations.create(value="Children")
|
||||
with scopes_disabled():
|
||||
var = item.variations.create(value="Children")
|
||||
res = dict(TEST_ITEM_RES)
|
||||
res["id"] = item.pk
|
||||
res["variations"] = [{
|
||||
@@ -349,8 +353,9 @@ def test_item_detail_addons(token_client, organizer, event, team, item, category
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_item_detail_bundles(token_client, organizer, event, team, item, category):
|
||||
i = event.items.create(name="Included thing", default_price=2)
|
||||
item.bundles.create(bundled_item=i, count=1, designated_price=2)
|
||||
with scopes_disabled():
|
||||
i = event.items.create(name="Included thing", default_price=2)
|
||||
item.bundles.create(bundled_item=i, count=1, designated_price=2)
|
||||
res = dict(TEST_ITEM_RES)
|
||||
|
||||
res["id"] = item.pk
|
||||
@@ -398,7 +403,8 @@ def test_item_create(token_client, organizer, event, item, category, taxrule):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert Item.objects.get(pk=resp.data['id']).sales_channels == ["web", "pretixpos"]
|
||||
with scopes_disabled():
|
||||
assert Item.objects.get(pk=resp.data['id']).sales_channels == ["web", "pretixpos"]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -445,9 +451,10 @@ def test_item_create_with_variation(token_client, organizer, event, item, catego
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
new_item = Item.objects.get(pk=resp.data['id'])
|
||||
assert new_item.variations.first().value.localize('de') == "Kommentar"
|
||||
assert new_item.variations.first().value.localize('en') == "Comment"
|
||||
with scopes_disabled():
|
||||
new_item = Item.objects.get(pk=resp.data['id'])
|
||||
assert new_item.variations.first().value.localize('de') == "Kommentar"
|
||||
assert new_item.variations.first().value.localize('en') == "Comment"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -490,10 +497,11 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
item = Item.objects.get(pk=resp.data['id'])
|
||||
assert item.addons.first().addon_category == category
|
||||
assert item.addons.first().max_count == 10
|
||||
assert 2 == Item.objects.all().count()
|
||||
with scopes_disabled():
|
||||
item = Item.objects.get(pk=resp.data['id'])
|
||||
assert item.addons.first().addon_category == category
|
||||
assert item.addons.first().max_count == 10
|
||||
assert 2 == Item.objects.all().count()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
|
||||
@@ -534,7 +542,8 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.content.decode() == '{"addons":["The add-on\'s category must belong to the same event as the item."]}'
|
||||
assert 2 == Item.objects.all().count()
|
||||
with scopes_disabled():
|
||||
assert 2 == Item.objects.all().count()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
|
||||
@@ -575,7 +584,8 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.content.decode() == '{"addons":["The maximum count needs to be greater than the minimum count."]}'
|
||||
assert 2 == Item.objects.all().count()
|
||||
with scopes_disabled():
|
||||
assert 2 == Item.objects.all().count()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
|
||||
@@ -619,12 +629,14 @@ def test_item_create_with_addon(token_client, organizer, event, item, category,
|
||||
'{"addons":["The minimum count needs to be equal to or greater than zero."]}',
|
||||
'{"addons":[{"min_count":["Ensure this value is greater than or equal to 0."]}]}', # mysql
|
||||
]
|
||||
assert 2 == Item.objects.all().count()
|
||||
with scopes_disabled():
|
||||
assert 2 == Item.objects.all().count()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_item_create_with_bundle(token_client, organizer, event, item, category, item2, taxrule):
|
||||
i = event.items.create(name="Included thing", default_price=2)
|
||||
with scopes_disabled():
|
||||
i = event.items.create(name="Included thing", default_price=2)
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
@@ -662,8 +674,9 @@ def test_item_create_with_bundle(token_client, organizer, event, item, category,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
item = Item.objects.get(pk=resp.data['id'])
|
||||
b = item.bundles.first()
|
||||
with scopes_disabled():
|
||||
item = Item.objects.get(pk=resp.data['id'])
|
||||
b = item.bundles.first()
|
||||
assert b.bundled_item == i
|
||||
assert b.bundled_variation is None
|
||||
assert b.count == 2
|
||||
@@ -708,7 +721,8 @@ def test_item_create_with_bundle(token_client, organizer, event, item, category,
|
||||
assert resp.status_code == 400
|
||||
assert resp.content.decode() == '{"bundles":["The bundled item must belong to the same event as the item."]}'
|
||||
|
||||
v = item2.variations.create(value="foo")
|
||||
with scopes_disabled():
|
||||
v = item2.variations.create(value="foo")
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
@@ -760,7 +774,8 @@ def test_item_update(token_client, organizer, event, item, category, item2, cate
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert Item.objects.get(pk=item.pk).max_per_order == 2
|
||||
with scopes_disabled():
|
||||
assert Item.objects.get(pk=item.pk).max_per_order == 2
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk),
|
||||
@@ -896,21 +911,24 @@ def test_item_update_with_addon(token_client, organizer, event, item, category):
|
||||
def test_items_delete(token_client, organizer, event, item):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.items.filter(pk=item.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.items.filter(pk=item.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_items_with_order_position_not_delete(token_client, organizer, event, item, order_position):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
|
||||
assert resp.status_code == 403
|
||||
assert event.items.filter(pk=item.id).exists()
|
||||
with scopes_disabled():
|
||||
assert event.items.filter(pk=item.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_items_with_cart_position_delete(token_client, organizer, event, item, cart_position):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug, item.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.items.filter(pk=item.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.items.filter(pk=item.id).exists()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -996,7 +1014,8 @@ def test_variations_create(token_client, organizer, event, item, variation):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
var = ItemVariation.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
var = ItemVariation.objects.get(pk=resp.data['id'])
|
||||
assert var.position == 1
|
||||
assert var.price == 23.0
|
||||
|
||||
@@ -1060,40 +1079,47 @@ def test_variations_update(token_client, organizer, event, item, item3, variatio
|
||||
def test_variations_delete(token_client, organizer, event, item, variations, order):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
|
||||
assert resp.status_code == 204
|
||||
assert not item.variations.filter(pk=variations[0].pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not item.variations.filter(pk=variations[0].pk).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_variations_with_order_position_not_delete(token_client, organizer, event, item, order, variations, order_position):
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
|
||||
assert resp.status_code == 403
|
||||
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it has already been ordered ' \
|
||||
'by a user or currently is in a users\'s cart. Please set the variation as ' \
|
||||
'\'inactive\' instead."}'
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_variations_with_cart_position_not_delete(token_client, organizer, event, item, variations, cart_position):
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variations[0].pk))
|
||||
assert resp.status_code == 403
|
||||
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it has already been ordered ' \
|
||||
'by a user or currently is in a users\'s cart. Please set the variation as ' \
|
||||
'\'inactive\' instead."}'
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variations[0].id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_only_variation_not_delete(token_client, organizer, event, item, variation):
|
||||
assert item.variations.filter(pk=variation.id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variation.id).exists()
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/variations/{}/'.format(organizer.slug, event.slug, item.pk, variation.pk))
|
||||
assert resp.status_code == 403
|
||||
assert resp.content.decode() == '{"detail":"This variation cannot be deleted because it is the only variation. ' \
|
||||
'Changing a product with variations to a product without variations is not ' \
|
||||
'allowed."}'
|
||||
assert item.variations.filter(pk=variation.id).exists()
|
||||
with scopes_disabled():
|
||||
assert item.variations.filter(pk=variation.id).exists()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -1144,7 +1170,8 @@ def test_bundles_create(token_client, organizer, event, item, item2, item3):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
b = ItemBundle.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
b = ItemBundle.objects.get(pk=resp.data['id'])
|
||||
assert b.bundled_item == item3
|
||||
assert b.bundled_variation is None
|
||||
assert b.designated_price == 1.5
|
||||
@@ -1176,7 +1203,8 @@ def test_bundles_create(token_client, organizer, event, item, item2, item3):
|
||||
assert resp.status_code == 400
|
||||
assert resp.content.decode() == '{"non_field_errors":["The bundled item must not be the same item as the bundling one."]}'
|
||||
|
||||
item3.bundles.create(bundled_item=item, count=1, designated_price=3)
|
||||
with scopes_disabled():
|
||||
item3.bundles.create(bundled_item=item, count=1, designated_price=3)
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/items/{}/bundles/'.format(organizer.slug, event.slug, item.pk),
|
||||
{
|
||||
@@ -1201,7 +1229,8 @@ def test_bundles_update(token_client, organizer, event, item, bundle):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
a = ItemBundle.objects.get(pk=bundle.pk)
|
||||
with scopes_disabled():
|
||||
a = ItemBundle.objects.get(pk=bundle.pk)
|
||||
assert a.count == 3
|
||||
|
||||
|
||||
@@ -1210,7 +1239,8 @@ def test_bundles_delete(token_client, organizer, event, item, bundle):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/bundles/{}/'.format(organizer.slug, event.slug,
|
||||
item.pk, bundle.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not item.bundles.filter(pk=bundle.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not item.bundles.filter(pk=bundle.id).exists()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -1270,7 +1300,8 @@ def test_addons_create(token_client, organizer, event, item, category, category2
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
addon = ItemAddOn.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
addon = ItemAddOn.objects.get(pk=resp.data['id'])
|
||||
assert addon.position == 1
|
||||
assert addon.addon_category == category
|
||||
|
||||
@@ -1315,7 +1346,8 @@ def test_addons_update(token_client, organizer, event, item, addon):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
a = ItemAddOn.objects.get(pk=addon.pk)
|
||||
with scopes_disabled():
|
||||
a = ItemAddOn.objects.get(pk=addon.pk)
|
||||
assert a.min_count == 100
|
||||
assert a.max_count == 101
|
||||
|
||||
@@ -1337,7 +1369,8 @@ def test_addons_delete(token_client, organizer, event, item, addon):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug,
|
||||
item.pk, addon.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not item.addons.filter(pk=addon.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not item.addons.filter(pk=addon.id).exists()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -1372,7 +1405,8 @@ def test_quota_list(token_client, organizer, event, quota, item, subevent):
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
|
||||
assert [res] == resp.data['results']
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/quotas/?subevent={}'.format(organizer.slug, event.slug, se2.pk))
|
||||
assert [] == resp.data['results']
|
||||
@@ -1404,7 +1438,8 @@ def test_quota_create(token_client, organizer, event, event2, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
assert quota.name == "Ticket Quota"
|
||||
assert quota.size == 200
|
||||
|
||||
@@ -1550,7 +1585,8 @@ def test_quota_update(token_client, organizer, event, quota, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
assert quota.name == "Ticket Quota Update"
|
||||
assert quota.size == 111
|
||||
assert quota.all_logentries().count() == 1
|
||||
@@ -1566,7 +1602,8 @@ def test_quota_update_unchanged(token_client, organizer, event, quota, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
quota = Quota.objects.get(pk=resp.data['id'])
|
||||
assert quota.size == 200
|
||||
assert quota.all_logentries().count() == 0
|
||||
|
||||
@@ -1575,7 +1612,8 @@ def test_quota_update_unchanged(token_client, organizer, event, quota, item):
|
||||
def test_quota_delete(token_client, organizer, event, quota):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/quotas/{}/'.format(organizer.slug, event.slug, quota.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.quotas.filter(pk=quota.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.quotas.filter(pk=quota.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -1690,11 +1728,12 @@ def test_question_create(token_client, organizer, event, event2, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
assert question.question == "What's your name?"
|
||||
assert question.type == "S"
|
||||
assert question.identifier is not None
|
||||
assert len(question.items.all()) == 1
|
||||
with scopes_disabled():
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
assert question.question == "What's your name?"
|
||||
assert question.type == "S"
|
||||
assert question.identifier is not None
|
||||
assert len(question.items.all()) == 1
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/questions/'.format(organizer.slug, event2.slug),
|
||||
@@ -1784,7 +1823,8 @@ def test_question_create(token_client, organizer, event, event2, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
q2 = Question.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
q2 = Question.objects.get(pk=resp.data['id'])
|
||||
assert q2.dependency_question == question
|
||||
|
||||
|
||||
@@ -1799,14 +1839,16 @@ def test_question_update(token_client, organizer, event, question):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
assert question.question == "What's your shoe size?"
|
||||
assert question.type == "N"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_question_update_circular_dependency(token_client, organizer, event, question):
|
||||
q2 = event.questions.create(question="T-Shirt size", type="B", identifier="FOO", dependency_question=question)
|
||||
with scopes_disabled():
|
||||
q2 = event.questions.create(question="T-Shirt size", type="B", identifier="FOO", dependency_question=question)
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk),
|
||||
{
|
||||
@@ -1836,7 +1878,8 @@ def test_question_update_options(token_client, organizer, event, question, item)
|
||||
def test_question_delete(token_client, organizer, event, question):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/questions/{}/'.format(organizer.slug, event.slug, question.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.questions.filter(pk=question.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.questions.filter(pk=question.id).exists()
|
||||
|
||||
|
||||
TEST_OPTIONS_RES = {
|
||||
@@ -1881,7 +1924,8 @@ def test_options_create(token_client, organizer, event, question):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
option = QuestionOption.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
option = QuestionOption.objects.get(pk=resp.data['id'])
|
||||
assert option.answer == "A"
|
||||
|
||||
resp = token_client.post(
|
||||
@@ -1907,7 +1951,8 @@ def test_options_update(token_client, organizer, event, question, option):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
a = QuestionOption.objects.get(pk=option.pk)
|
||||
with scopes_disabled():
|
||||
a = QuestionOption.objects.get(pk=option.pk)
|
||||
assert a.answer == "B"
|
||||
|
||||
|
||||
@@ -1917,7 +1962,8 @@ def test_options_delete(token_client, organizer, event, question, option):
|
||||
organizer.slug, event.slug, question.pk, option.pk
|
||||
))
|
||||
assert resp.status_code == 204
|
||||
assert not question.options.filter(pk=option.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not question.options.filter(pk=option.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -1948,11 +1994,12 @@ def test_question_create_with_option(token_client, organizer, event, item):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
assert str(question.options.first().answer) == "A"
|
||||
assert question.options.first().identifier is not None
|
||||
assert str(question.options.last().answer) == "B"
|
||||
assert 2 == question.options.count()
|
||||
with scopes_disabled():
|
||||
question = Question.objects.get(pk=resp.data['id'])
|
||||
assert str(question.options.first().answer) == "A"
|
||||
assert question.options.first().identifier is not None
|
||||
assert str(question.options.last().answer) == "B"
|
||||
assert 2 == question.options.count()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/questions/'.format(organizer.slug, event.slug),
|
||||
|
||||
+298
-208
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ from unittest import mock
|
||||
|
||||
import pytest
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import InvoiceAddress, Order, OrderPosition
|
||||
@@ -159,9 +160,10 @@ def test_subevent_create(token_client, organizer, event, subevent, meta_prop, it
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert not subevent.active
|
||||
assert subevent.meta_values.filter(
|
||||
property__name=meta_prop.name, value="Workshop"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
assert subevent.meta_values.filter(
|
||||
property__name=meta_prop.name, value="Workshop"
|
||||
).exists()
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/'.format(organizer.slug, event.slug),
|
||||
@@ -217,7 +219,8 @@ def test_subevent_create(token_client, organizer, event, subevent, meta_prop, it
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert item.default_price == Decimal('23.00')
|
||||
assert event.subevents.get(id=resp.data['id']).item_price_overrides[item.pk] == Decimal('23.42')
|
||||
with scopes_disabled():
|
||||
assert event.subevents.get(id=resp.data['id']).item_price_overrides[item.pk] == Decimal('23.42')
|
||||
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/'.format(organizer.slug, event.slug),
|
||||
@@ -261,7 +264,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
subevent = event.subevents.get(id=subevent.id)
|
||||
with scopes_disabled():
|
||||
subevent = event.subevents.get(id=subevent.id)
|
||||
assert subevent.date_from == datetime(2018, 12, 27, 10, 0, tzinfo=UTC)
|
||||
assert subevent.date_to == datetime(2018, 12, 28, 10, 0, tzinfo=UTC)
|
||||
|
||||
@@ -297,9 +301,10 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert organizer.events.get(slug=event.slug).subevents.get(id=resp.data['id']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
assert organizer.events.get(slug=event.slug).subevents.get(id=resp.data['id']).meta_values.filter(
|
||||
property__name=meta_prop.name, value="Conference"
|
||||
).exists()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -310,9 +315,10 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert not subevent.meta_values.filter(
|
||||
property__name=meta_prop.name
|
||||
).exists()
|
||||
with scopes_disabled():
|
||||
assert not subevent.meta_values.filter(
|
||||
property__name=meta_prop.name
|
||||
).exists()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -339,7 +345,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert subevent.items.get(id=item.pk).default_price == Decimal('23.00')
|
||||
with scopes_disabled():
|
||||
assert subevent.items.get(id=item.pk).default_price == Decimal('23.00')
|
||||
assert subevent.item_price_overrides[item.pk] == Decimal('99.99')
|
||||
|
||||
resp = token_client.patch(
|
||||
@@ -355,7 +362,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('88.88')
|
||||
with scopes_disabled():
|
||||
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('88.88')
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -370,7 +378,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
|
||||
with scopes_disabled():
|
||||
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -385,7 +394,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('12.34')
|
||||
with scopes_disabled():
|
||||
assert event.subevents.get(id=subevent.id).item_price_overrides[item.pk] == Decimal('12.34')
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -395,7 +405,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
|
||||
with scopes_disabled():
|
||||
assert item.pk not in event.subevents.get(id=subevent.id).item_price_overrides
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -440,8 +451,9 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
|
||||
assert subevent.var_price_overrides[variations[0].pk] == Decimal('99.99')
|
||||
with scopes_disabled():
|
||||
assert subevent.variations.get(id=variations[0].pk).default_price == Decimal('12.00')
|
||||
assert subevent.var_price_overrides[variations[0].pk] == Decimal('99.99')
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -456,7 +468,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('88.88')
|
||||
with scopes_disabled():
|
||||
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('88.88')
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -471,7 +484,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
|
||||
with scopes_disabled():
|
||||
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -486,7 +500,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('12.34')
|
||||
with scopes_disabled():
|
||||
assert event.subevents.get(id=subevent.id).var_price_overrides[variations[0].pk] == Decimal('12.34')
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -496,7 +511,8 @@ def test_subevent_update(token_client, organizer, event, subevent, item, item2,
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
|
||||
with scopes_disabled():
|
||||
assert variations[0].pk not in event.subevents.get(id=subevent.id).var_price_overrides
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug, subevent.pk),
|
||||
@@ -544,7 +560,8 @@ def test_subevent_delete(token_client, organizer, event, subevent):
|
||||
resp = token_client.delete('/api/v1/organizers/{}/events/{}/subevents/{}/'.format(organizer.slug, event.slug,
|
||||
subevent.pk))
|
||||
assert resp.status_code == 204
|
||||
assert not event.subevents.filter(pk=subevent.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.subevents.filter(pk=subevent.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -554,4 +571,5 @@ def test_subevent_with_order_position_not_delete(token_client, organizer, event,
|
||||
assert resp.status_code == 403
|
||||
assert resp.content.decode() == '{"detail":"The sub-event can not be deleted as it has already been used in ' \
|
||||
'orders. Please set \'active\' to false instead to hide it from users."}'
|
||||
assert event.subevents.filter(pk=subevent.id).exists()
|
||||
with scopes_disabled():
|
||||
assert event.subevents.filter(pk=subevent.id).exists()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import TaxRule
|
||||
|
||||
@@ -80,7 +81,8 @@ def test_rule_delete(token_client, organizer, event, taxrule):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_rule_delete_forbidden(token_client, organizer, event, taxrule):
|
||||
event.items.create(name="Budget Ticket", default_price=23, tax_rule=taxrule)
|
||||
with scopes_disabled():
|
||||
event.items.create(name="Budget Ticket", default_price=23, tax_rule=taxrule)
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/events/{}/taxrules/{}/'.format(organizer.slug, event.slug, taxrule.pk),
|
||||
)
|
||||
|
||||
+146
-108
@@ -5,6 +5,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
from django.utils import timezone
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import Event, Voucher
|
||||
@@ -58,7 +59,8 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
|
||||
i2 = copy.copy(item)
|
||||
i2.pk = None
|
||||
i2.save()
|
||||
var2 = i2.variations.create(value="foo")
|
||||
with scopes_disabled():
|
||||
var2 = i2.variations.create(value="foo")
|
||||
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/vouchers/'.format(organizer.slug, event.slug))
|
||||
assert resp.status_code == 200
|
||||
@@ -136,9 +138,10 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
|
||||
)
|
||||
assert [] == resp.data['results']
|
||||
|
||||
var = item.variations.create(value='VIP')
|
||||
voucher.variation = var
|
||||
voucher.save()
|
||||
with scopes_disabled():
|
||||
var = item.variations.create(value='VIP')
|
||||
voucher.variation = var
|
||||
voucher.save()
|
||||
res['variation'] = var.pk
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/vouchers/?variation={}'.format(organizer.slug, event.slug, var.pk)
|
||||
@@ -208,7 +211,8 @@ def test_voucher_list(token_client, organizer, event, voucher, item, quota, sube
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
|
||||
assert [res] == resp.data['results']
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/vouchers/?subevent={}'.format(organizer.slug, event.slug,
|
||||
se2.pk))
|
||||
@@ -237,7 +241,8 @@ def create_voucher(token_client, organizer, event, data, expected_failure=False)
|
||||
assert resp.status_code == 400
|
||||
else:
|
||||
assert resp.status_code == 201
|
||||
return Voucher.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
return Voucher.objects.get(pk=resp.data['id'])
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -324,7 +329,8 @@ def test_create_non_blocking_item_voucher(token_client, organizer, event, item):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_non_blocking_variation_voucher(token_client, organizer, event, item):
|
||||
variation = item.variations.create(value="XL")
|
||||
with scopes_disabled():
|
||||
variation = item.variations.create(value="XL")
|
||||
v = create_voucher(
|
||||
token_client, organizer, event,
|
||||
data={
|
||||
@@ -394,7 +400,8 @@ def test_create_blocking_item_voucher_quota_full_invalid(token_client, organizer
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_blocking_variation_voucher_quota_free(token_client, organizer, event, item, quota):
|
||||
variation = item.variations.create(value="XL")
|
||||
with scopes_disabled():
|
||||
variation = item.variations.create(value="XL")
|
||||
quota.variations.add(variation)
|
||||
v = create_voucher(
|
||||
token_client, organizer, event,
|
||||
@@ -421,7 +428,8 @@ def test_create_short_code(token_client, organizer, event, item):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_blocking_variation_voucher_quota_full(token_client, organizer, event, item, quota):
|
||||
variation = item.variations.create(value="XL")
|
||||
with scopes_disabled():
|
||||
variation = item.variations.create(value="XL")
|
||||
quota.variations.add(variation)
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
@@ -463,7 +471,8 @@ def test_create_blocking_quota_voucher_quota_full(token_client, organizer, event
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_duplicate_code(token_client, organizer, event, quota):
|
||||
v = event.vouchers.create(quota=quota)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(quota=quota)
|
||||
create_voucher(
|
||||
token_client, organizer, event,
|
||||
data={
|
||||
@@ -501,11 +510,12 @@ def test_subevent_required_for_blocking(token_client, organizer, event, item, su
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_subevent_blocking_quota_free(token_client, organizer, event, item, quota, subevent):
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(item)
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(item)
|
||||
|
||||
v = create_voucher(
|
||||
token_client, organizer, event,
|
||||
@@ -521,12 +531,13 @@ def test_subevent_blocking_quota_free(token_client, organizer, event, item, quot
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_subevent_blocking_quota_full(token_client, organizer, event, item, quota, subevent):
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
quota.subevent = subevent
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(item)
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
quota.subevent = subevent
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(item)
|
||||
|
||||
create_voucher(
|
||||
token_client, organizer, event,
|
||||
@@ -553,15 +564,16 @@ def change_voucher(token_client, organizer, event, voucher, data, expected_failu
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_to_item_of_other_event(token_client, organizer, event, item):
|
||||
e2 = Event.objects.create(
|
||||
organizer=organizer,
|
||||
name='Dummy2',
|
||||
slug='dummy2',
|
||||
date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
|
||||
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
|
||||
)
|
||||
ticket2 = e2.items.create(name='Late-bird ticket', default_price=23)
|
||||
v = event.vouchers.create(item=item)
|
||||
with scopes_disabled():
|
||||
e2 = Event.objects.create(
|
||||
organizer=organizer,
|
||||
name='Dummy2',
|
||||
slug='dummy2',
|
||||
date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC),
|
||||
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
|
||||
)
|
||||
ticket2 = e2.items.create(name='Late-bird ticket', default_price=23)
|
||||
v = event.vouchers.create(item=item)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -575,7 +587,8 @@ def test_change_to_item_of_other_event(token_client, organizer, event, item):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_non_blocking_voucher(token_client, organizer, event, item, quota):
|
||||
v = event.vouchers.create(item=item)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -589,7 +602,8 @@ def test_change_non_blocking_voucher(token_client, organizer, event, item, quota
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_voucher_reduce_max_usages(token_client, organizer, event, item, quota):
|
||||
v = event.vouchers.create(item=item, max_usages=5, redeemed=3)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, max_usages=5, redeemed=3)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -604,7 +618,8 @@ def test_change_voucher_reduce_max_usages(token_client, organizer, event, item,
|
||||
def test_change_blocking_voucher_unchanged_quota_full(token_client, organizer, event, item, quota):
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -620,7 +635,8 @@ def test_change_blocking_voucher_unchanged_quota_full(token_client, organizer, e
|
||||
def test_change_voucher_to_blocking_quota_full(token_client, organizer, event, item, quota):
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
v = event.vouchers.create(item=item)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -632,7 +648,8 @@ def test_change_voucher_to_blocking_quota_full(token_client, organizer, event, i
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_voucher_to_blocking_quota_free(token_client, organizer, event, item, quota):
|
||||
v = event.vouchers.create(item=item)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -646,8 +663,9 @@ def test_change_voucher_to_blocking_quota_free(token_client, organizer, event, i
|
||||
def test_change_voucher_validity_to_valid_quota_full(token_client, organizer, event, item, quota):
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -660,8 +678,9 @@ def test_change_voucher_validity_to_valid_quota_full(token_client, organizer, ev
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_voucher_validity_to_valid_quota_free(token_client, organizer, event, item, quota):
|
||||
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -673,9 +692,10 @@ def test_change_voucher_validity_to_valid_quota_free(token_client, organizer, ev
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_item_of_blocking_voucher_quota_free(token_client, organizer, event, item, quota):
|
||||
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
|
||||
quota.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
with scopes_disabled():
|
||||
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
|
||||
quota.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -687,10 +707,11 @@ def test_change_item_of_blocking_voucher_quota_free(token_client, organizer, eve
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_item_of_blocking_voucher_quota_full(token_client, organizer, event, item, quota):
|
||||
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
|
||||
quota2 = event.quotas.create(name='Late', size=0)
|
||||
quota2.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
with scopes_disabled():
|
||||
ticket2 = event.items.create(name='Late-bird ticket', default_price=23)
|
||||
quota2 = event.quotas.create(name='Late', size=0)
|
||||
quota2.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -702,14 +723,15 @@ def test_change_item_of_blocking_voucher_quota_full(token_client, organizer, eve
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_variation_of_blocking_voucher_quota_free(token_client, organizer, event):
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qs.variations.add(vs)
|
||||
qm = event.quotas.create(name='M', size=2)
|
||||
qm.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
with scopes_disabled():
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qs.variations.add(vs)
|
||||
qm = event.quotas.create(name='M', size=2)
|
||||
qm.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -721,13 +743,14 @@ def test_change_variation_of_blocking_voucher_quota_free(token_client, organizer
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_variation_of_blocking_voucher_without_quota_change(token_client, organizer, event):
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
q = event.quotas.create(name='S', size=0)
|
||||
q.variations.add(vs)
|
||||
q.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
with scopes_disabled():
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
q = event.quotas.create(name='S', size=0)
|
||||
q.variations.add(vs)
|
||||
q.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -739,14 +762,15 @@ def test_change_variation_of_blocking_voucher_without_quota_change(token_client,
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_variation_of_blocking_voucher_quota_full(token_client, organizer, event):
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qs.variations.add(vs)
|
||||
qm = event.quotas.create(name='M', size=0)
|
||||
qm.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
with scopes_disabled():
|
||||
shirt = event.items.create(name='Shirt', default_price=23)
|
||||
vs = shirt.variations.create(value='S')
|
||||
vm = shirt.variations.create(value='M')
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qs.variations.add(vs)
|
||||
qm = event.quotas.create(name='M', size=0)
|
||||
qm.variations.add(vm)
|
||||
v = event.vouchers.create(item=shirt, variation=vs, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -758,9 +782,10 @@ def test_change_variation_of_blocking_voucher_quota_full(token_client, organizer
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_quota_of_blocking_voucher_quota_free(token_client, organizer, event):
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qm = event.quotas.create(name='M', size=2)
|
||||
v = event.vouchers.create(quota=qs, block_quota=True)
|
||||
with scopes_disabled():
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qm = event.quotas.create(name='M', size=2)
|
||||
v = event.vouchers.create(quota=qs, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -772,9 +797,10 @@ def test_change_quota_of_blocking_voucher_quota_free(token_client, organizer, ev
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_quota_of_blocking_voucher_quota_full(token_client, organizer, event):
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qm = event.quotas.create(name='M', size=0)
|
||||
v = event.vouchers.create(quota=qs, block_quota=True)
|
||||
with scopes_disabled():
|
||||
qs = event.quotas.create(name='S', size=2)
|
||||
qm = event.quotas.create(name='M', size=0)
|
||||
v = event.vouchers.create(quota=qs, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -786,11 +812,12 @@ def test_change_quota_of_blocking_voucher_quota_full(token_client, organizer, ev
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_item_of_blocking_voucher_without_quota_change(token_client, organizer, event, item, quota):
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
ticket2 = event.items.create(name='Standard Ticket', default_price=23)
|
||||
quota.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
with scopes_disabled():
|
||||
quota.size = 0
|
||||
quota.save()
|
||||
ticket2 = event.items.create(name='Standard Ticket', default_price=23)
|
||||
quota.items.add(ticket2)
|
||||
v = event.vouchers.create(item=item, block_quota=True)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -802,8 +829,9 @@ def test_change_item_of_blocking_voucher_without_quota_change(token_client, orga
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_code_to_duplicate(token_client, organizer, event, item, quota):
|
||||
v1 = event.vouchers.create(quota=quota)
|
||||
v2 = event.vouchers.create(quota=quota)
|
||||
with scopes_disabled():
|
||||
v1 = event.vouchers.create(quota=quota)
|
||||
v2 = event.vouchers.create(quota=quota)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v1,
|
||||
data={
|
||||
@@ -815,13 +843,14 @@ def test_change_code_to_duplicate(token_client, organizer, event, item, quota):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_subevent_blocking_quota_free(token_client, organizer, event, item, quota, subevent):
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(item)
|
||||
with scopes_disabled():
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(item)
|
||||
|
||||
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
|
||||
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -833,13 +862,14 @@ def test_change_subevent_blocking_quota_free(token_client, organizer, event, ite
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_change_subevent_blocking_quota_full(token_client, organizer, event, item, quota, subevent):
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(item)
|
||||
with scopes_disabled():
|
||||
quota.subevent = subevent
|
||||
quota.save()
|
||||
se2 = event.subevents.create(name="Bar", date_from=now())
|
||||
q2 = event.quotas.create(event=event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(item)
|
||||
|
||||
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
|
||||
v = event.vouchers.create(item=item, block_quota=True, subevent=subevent)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -851,27 +881,32 @@ def test_change_subevent_blocking_quota_full(token_client, organizer, event, ite
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_delete_voucher(token_client, organizer, event, quota):
|
||||
v = event.vouchers.create(quota=quota)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(quota=quota)
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/events/{}/vouchers/{}/'.format(organizer.slug, event.slug, v.pk),
|
||||
)
|
||||
assert resp.status_code == 204
|
||||
assert not event.vouchers.filter(pk=v.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.vouchers.filter(pk=v.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_delete_voucher_redeemed(token_client, organizer, event, quota):
|
||||
v = event.vouchers.create(quota=quota, redeemed=1)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(quota=quota, redeemed=1)
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/events/{}/vouchers/{}/'.format(organizer.slug, event.slug, v.pk),
|
||||
)
|
||||
assert resp.status_code == 403
|
||||
assert event.vouchers.filter(pk=v.id).exists()
|
||||
with scopes_disabled():
|
||||
assert event.vouchers.filter(pk=v.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_redeemed_is_not_writable(token_client, organizer, event, item):
|
||||
v = event.vouchers.create(item=item)
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item)
|
||||
change_voucher(
|
||||
token_client, organizer, event, v,
|
||||
data={
|
||||
@@ -919,13 +954,14 @@ def test_create_multiple_vouchers(token_client, organizer, event, item):
|
||||
], format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert Voucher.objects.count() == 2
|
||||
assert resp.data[0]['code'] == 'ABCDEFGHI'
|
||||
v1 = Voucher.objects.get(code='ABCDEFGHI')
|
||||
assert not v1.block_quota
|
||||
assert resp.data[1]['code'] == 'JKLMNOPQR'
|
||||
v2 = Voucher.objects.get(code='JKLMNOPQR')
|
||||
assert v2.block_quota
|
||||
with scopes_disabled():
|
||||
assert Voucher.objects.count() == 2
|
||||
assert resp.data[0]['code'] == 'ABCDEFGHI'
|
||||
v1 = Voucher.objects.get(code='ABCDEFGHI')
|
||||
assert not v1.block_quota
|
||||
assert resp.data[1]['code'] == 'JKLMNOPQR'
|
||||
v2 = Voucher.objects.get(code='JKLMNOPQR')
|
||||
assert v2.block_quota
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -967,7 +1003,8 @@ def test_create_multiple_vouchers_one_invalid(token_client, organizer, event, it
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == [{}, {'code': ['Ensure this field has at least 5 characters.']}]
|
||||
assert Voucher.objects.count() == 0
|
||||
with scopes_disabled():
|
||||
assert Voucher.objects.count() == 0
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -1009,4 +1046,5 @@ def test_create_multiple_vouchers_duplicate_code(token_client, organizer, event,
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert resp.data == [{}, {'code': ['Duplicate voucher code in request.']}]
|
||||
assert Voucher.objects.count() == 0
|
||||
with scopes_disabled():
|
||||
assert Voucher.objects.count() == 0
|
||||
|
||||
@@ -3,6 +3,7 @@ import datetime
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import WaitingListEntry
|
||||
@@ -44,8 +45,9 @@ TEST_WLE_RES = {
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_wle_list(token_client, organizer, event, wle, item, subevent):
|
||||
var = item.variations.create(value="Children")
|
||||
var2 = item.variations.create(value="Children")
|
||||
with scopes_disabled():
|
||||
var = item.variations.create(value="Children")
|
||||
var2 = item.variations.create(value="Children")
|
||||
res = dict(TEST_WLE_RES)
|
||||
wle.variation = var
|
||||
wle.save()
|
||||
@@ -97,7 +99,8 @@ def test_wle_list(token_client, organizer, event, wle, item, subevent):
|
||||
'/api/v1/organizers/{}/events/{}/waitinglistentries/?has_voucher=true'.format(organizer.slug, event.slug))
|
||||
assert [] == resp.data['results']
|
||||
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
wle.voucher = v
|
||||
wle.save()
|
||||
res['voucher'] = v.pk
|
||||
@@ -112,7 +115,8 @@ def test_wle_list(token_client, organizer, event, wle, item, subevent):
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
|
||||
assert [res] == resp.data['results']
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
with scopes_disabled():
|
||||
se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC))
|
||||
resp = token_client.get(
|
||||
'/api/v1/organizers/{}/events/{}/waitinglistentries/?subevent={}'.format(organizer.slug, event.slug,
|
||||
se2.pk))
|
||||
@@ -136,19 +140,22 @@ def test_delete_wle(token_client, organizer, event, wle, item):
|
||||
'/api/v1/organizers/{}/events/{}/waitinglistentries/{}/'.format(organizer.slug, event.slug, wle.pk),
|
||||
)
|
||||
assert resp.status_code == 204
|
||||
assert not event.waitinglistentries.filter(pk=wle.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not event.waitinglistentries.filter(pk=wle.id).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_delete_wle_assigned(token_client, organizer, event, wle, item):
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
wle.voucher = v
|
||||
wle.save()
|
||||
resp = token_client.delete(
|
||||
'/api/v1/organizers/{}/events/{}/waitinglistentries/{}/'.format(organizer.slug, event.slug, wle.pk),
|
||||
)
|
||||
assert resp.status_code == 403
|
||||
assert event.waitinglistentries.filter(pk=wle.id).exists()
|
||||
with scopes_disabled():
|
||||
assert event.waitinglistentries.filter(pk=wle.id).exists()
|
||||
|
||||
|
||||
def create_wle(token_client, organizer, event, data, expected_failure=False):
|
||||
@@ -159,9 +166,9 @@ def create_wle(token_client, organizer, event, data, expected_failure=False):
|
||||
if expected_failure:
|
||||
assert resp.status_code == 400
|
||||
else:
|
||||
print(resp.data)
|
||||
assert resp.status_code == 201
|
||||
return WaitingListEntry.objects.get(pk=resp.data['id'])
|
||||
with scopes_disabled():
|
||||
return WaitingListEntry.objects.get(pk=resp.data['id'])
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -205,7 +212,8 @@ def test_wle_require_fields(token_client, organizer, event, item, quota):
|
||||
},
|
||||
expected_failure=True
|
||||
)
|
||||
v = item.variations.create(value="S")
|
||||
with scopes_disabled():
|
||||
v = item.variations.create(value="S")
|
||||
create_wle(
|
||||
token_client, organizer, event,
|
||||
data={
|
||||
@@ -300,7 +308,8 @@ def test_wle_change_email(token_client, organizer, event, item, wle, quota):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_wle_change_assigned(token_client, organizer, event, item, wle, quota):
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
with scopes_disabled():
|
||||
v = event.vouchers.create(item=item, price_mode='set', value=12, tag='Foo')
|
||||
wle.voucher = v
|
||||
wle.save()
|
||||
change_wle(
|
||||
@@ -315,8 +324,9 @@ def test_wle_change_assigned(token_client, organizer, event, item, wle, quota):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_wle_change_to_available_item(token_client, organizer, event, item, wle, quota):
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
q = event.quotas.create(name="Budget Ticket", size=1)
|
||||
with scopes_disabled():
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
q = event.quotas.create(name="Budget Ticket", size=1)
|
||||
q.items.add(i)
|
||||
change_wle(
|
||||
token_client, organizer, event, wle,
|
||||
@@ -330,9 +340,10 @@ def test_wle_change_to_available_item(token_client, organizer, event, item, wle,
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_wle_change_to_unavailable_item(token_client, organizer, event, item, wle, quota):
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
v = i.variations.create(value="S")
|
||||
q = event.quotas.create(name="Budget Ticket", size=0)
|
||||
with scopes_disabled():
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
v = i.variations.create(value="S")
|
||||
q = event.quotas.create(name="Budget Ticket", size=0)
|
||||
q.items.add(i)
|
||||
q.variations.add(v)
|
||||
change_wle(
|
||||
@@ -349,9 +360,10 @@ def test_wle_change_to_unavailable_item(token_client, organizer, event, item, wl
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_wle_change_to_unavailable_item_missing_var(token_client, organizer, event, item, wle, quota):
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
v = i.variations.create(value="S")
|
||||
q = event.quotas.create(name="Budget Ticket", size=0)
|
||||
with scopes_disabled():
|
||||
i = event.items.create(name="Budget Ticket", default_price=23)
|
||||
v = i.variations.create(value="S")
|
||||
q = event.quotas.create(name="Budget Ticket", size=0)
|
||||
q.items.add(i)
|
||||
q.variations.add(v)
|
||||
change_wle(
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import copy
|
||||
|
||||
import pytest
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.api.models import WebHook
|
||||
|
||||
@@ -64,12 +65,13 @@ def test_hook_create(token_client, organizer, event):
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
cl = WebHook.objects.get(pk=resp.data['id'])
|
||||
assert cl.target_url == "https://google.com"
|
||||
assert cl.limit_events.count() == 1
|
||||
assert set(cl.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.paid'}
|
||||
assert not cl.all_events
|
||||
with scopes_disabled():
|
||||
cl = WebHook.objects.get(pk=resp.data['id'])
|
||||
assert cl.target_url == "https://google.com"
|
||||
assert cl.limit_events.count() == 1
|
||||
assert set(cl.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.paid'}
|
||||
assert not cl.all_events
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -136,9 +138,10 @@ def test_hook_patch_url(token_client, organizer, event, webhook):
|
||||
assert resp.status_code == 200
|
||||
webhook.refresh_from_db()
|
||||
assert webhook.target_url == "https://pretix.eu"
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.paid'}
|
||||
with scopes_disabled():
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.paid'}
|
||||
assert webhook.enabled
|
||||
|
||||
|
||||
@@ -153,9 +156,10 @@ def test_hook_patch_types(token_client, organizer, event, webhook):
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
webhook.refresh_from_db()
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.canceled'}
|
||||
with scopes_disabled():
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert set(webhook.listeners.values_list('action_type', flat=True)) == {'pretix.event.order.placed',
|
||||
'pretix.event.order.canceled'}
|
||||
assert webhook.enabled
|
||||
|
||||
|
||||
|
||||
@@ -6,13 +6,13 @@ class SoupTest(TestCase):
|
||||
|
||||
def get_doc(self, *args, **kwargs):
|
||||
response = self.client.get(*args, **kwargs)
|
||||
return BeautifulSoup(response.rendered_content, "lxml")
|
||||
return BeautifulSoup(response.render().content, "lxml")
|
||||
|
||||
def post_doc(self, *args, **kwargs):
|
||||
kwargs['follow'] = True
|
||||
response = self.client.post(*args, **kwargs)
|
||||
try:
|
||||
return BeautifulSoup(response.rendered_content, "lxml")
|
||||
return BeautifulSoup(response.render().content, "lxml")
|
||||
except AttributeError:
|
||||
return BeautifulSoup(response.content, "lxml")
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ from django.core.serializers.json import DjangoJSONEncoder
|
||||
from django.db import DatabaseError, transaction
|
||||
from django.utils.timezone import now
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scope, scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Invoice, InvoiceAddress, Item, ItemVariation, Order, OrderPosition,
|
||||
@@ -24,72 +25,74 @@ from pretix.base.settings import GlobalSettingsObject
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, locale='en'
|
||||
)
|
||||
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'),
|
||||
tax_value=Decimal('0.05'), tax_rule=tr)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True)
|
||||
t_shirt = Item.objects.create(event=event, name='T-Shirt',
|
||||
category=None, default_price=42, tax_rule=tr,
|
||||
admission=True)
|
||||
variation = ItemVariation.objects.create(value='M', item=t_shirt)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=ticket,
|
||||
variation=None,
|
||||
price=Decimal("23.00"),
|
||||
positionid=1,
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=t_shirt,
|
||||
variation=variation,
|
||||
price=Decimal("42.00"),
|
||||
positionid=2,
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=t_shirt,
|
||||
variation=variation,
|
||||
price=Decimal("42.00"),
|
||||
positionid=3,
|
||||
canceled=True
|
||||
)
|
||||
gs = GlobalSettingsObject()
|
||||
gs.settings.ecb_rates_date = date.today()
|
||||
gs.settings.ecb_rates_dict = json.dumps({
|
||||
"USD": "1.1648",
|
||||
"RON": "4.5638",
|
||||
"CZK": "26.024",
|
||||
"BGN": "1.9558",
|
||||
"HRK": "7.4098",
|
||||
"EUR": "1.0000",
|
||||
"NOK": "9.3525",
|
||||
"HUF": "305.15",
|
||||
"DKK": "7.4361",
|
||||
"PLN": "4.2408",
|
||||
"GBP": "0.89350",
|
||||
"SEK": "9.5883"
|
||||
}, cls=DjangoJSONEncoder)
|
||||
return event, o
|
||||
with scope(organizer=o):
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, locale='en'
|
||||
)
|
||||
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'),
|
||||
tax_value=Decimal('0.05'), tax_rule=tr)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True)
|
||||
t_shirt = Item.objects.create(event=event, name='T-Shirt',
|
||||
category=None, default_price=42, tax_rule=tr,
|
||||
admission=True)
|
||||
variation = ItemVariation.objects.create(value='M', item=t_shirt)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=ticket,
|
||||
variation=None,
|
||||
price=Decimal("23.00"),
|
||||
positionid=1,
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=t_shirt,
|
||||
variation=variation,
|
||||
price=Decimal("42.00"),
|
||||
positionid=2,
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=t_shirt,
|
||||
variation=variation,
|
||||
price=Decimal("42.00"),
|
||||
positionid=3,
|
||||
canceled=True
|
||||
)
|
||||
gs = GlobalSettingsObject()
|
||||
gs.settings.ecb_rates_date = date.today()
|
||||
gs.settings.ecb_rates_dict = json.dumps({
|
||||
"USD": "1.1648",
|
||||
"RON": "4.5638",
|
||||
"CZK": "26.024",
|
||||
"BGN": "1.9558",
|
||||
"HRK": "7.4098",
|
||||
"EUR": "1.0000",
|
||||
"NOK": "9.3525",
|
||||
"HUF": "305.15",
|
||||
"DKK": "7.4361",
|
||||
"PLN": "4.2408",
|
||||
"GBP": "0.89350",
|
||||
"SEK": "9.5883"
|
||||
}, cls=DjangoJSONEncoder)
|
||||
yield event, o
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_locale_setting(env):
|
||||
event, order = env
|
||||
event.settings.set('invoice_language', 'de')
|
||||
inv = generate_invoice(order)
|
||||
with scopes_disabled():
|
||||
inv = generate_invoice(order)
|
||||
assert inv.locale == 'de'
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import time
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope, scopes_disabled
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.base.services import locking
|
||||
@@ -17,16 +18,18 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now()
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_locking_exclusive(event):
|
||||
with event.lock():
|
||||
with pytest.raises(LockTimeoutException):
|
||||
ev = Event.objects.get(id=event.id)
|
||||
with ev.lock():
|
||||
pass
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(id=event.id)
|
||||
with ev.lock():
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -5,6 +5,7 @@ from django.conf import settings
|
||||
from django.core import mail as djmail
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Organizer, User
|
||||
from pretix.base.services.mail import mail
|
||||
@@ -20,7 +21,8 @@ def env():
|
||||
user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
user.email = 'dummy@dummy.dummy'
|
||||
user.save()
|
||||
return event, user, o
|
||||
with scope(organizer=o):
|
||||
yield event, user, o
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
+254
-127
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@ import pytest
|
||||
from django.core import mail as djmail
|
||||
from django.db import transaction
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, Order, OrderPosition, Organizer, User,
|
||||
@@ -18,7 +19,8 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now()
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
+186
-96
@@ -7,6 +7,7 @@ from django.core import mail as djmail
|
||||
from django.test import TestCase
|
||||
from django.utils.timezone import make_aware, now
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.decimal import round_decimal
|
||||
from pretix.base.models import (
|
||||
@@ -21,9 +22,10 @@ from pretix.base.services.orders import (
|
||||
OrderChangeManager, OrderError, _create_order, approve_order, cancel_order,
|
||||
deny_order, expire_orders, send_download_reminders, send_expiry_warnings,
|
||||
)
|
||||
from pretix.testutils.scope import classscope
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@pytest.fixture(scope='function')
|
||||
def event():
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
event = Event.objects.create(
|
||||
@@ -31,7 +33,8 @@ def event():
|
||||
date_from=now(),
|
||||
plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -312,42 +315,47 @@ def test_deny(event):
|
||||
class PaymentReminderTests(TestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
self.event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now() + timedelta(days=2),
|
||||
plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
self.o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
with scope(organizer=self.o):
|
||||
self.event = Event.objects.create(
|
||||
organizer=self.o, name='Dummy', slug='dummy',
|
||||
date_from=now() + timedelta(days=2),
|
||||
plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_disabled(self):
|
||||
send_expiry_warnings(sender=self.event)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_sent_once(self):
|
||||
self.event.settings.mail_days_order_expire_warning = 12
|
||||
send_expiry_warnings(sender=self.event)
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_paid(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
send_expiry_warnings(sender=self.event)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_sent_days(self):
|
||||
self.event.settings.mail_days_order_expire_warning = 9
|
||||
send_expiry_warnings(sender=self.event)
|
||||
@@ -356,6 +364,7 @@ class PaymentReminderTests(TestCase):
|
||||
send_expiry_warnings(sender=self.event)
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_sent_not_immediately_after_purchase(self):
|
||||
self.order.datetime = now()
|
||||
self.order.expires = now() + timedelta(hours=3)
|
||||
@@ -368,31 +377,34 @@ class PaymentReminderTests(TestCase):
|
||||
class DownloadReminderTests(TestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
self.event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now() + timedelta(days=2),
|
||||
plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID, locale='en',
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={"full_name": "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
self.o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
with scope(organizer=self.o):
|
||||
self.event = Event.objects.create(
|
||||
organizer=self.o, name='Dummy', slug='dummy',
|
||||
date_from=now() + timedelta(days=2),
|
||||
plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID, locale='en',
|
||||
datetime=now() - timedelta(hours=4),
|
||||
expires=now() - timedelta(hours=4) + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={"full_name": "Peter"}, positionid=1
|
||||
)
|
||||
djmail.outbox = []
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_disabled(self):
|
||||
send_download_reminders(sender=self.event)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_sent_once(self):
|
||||
self.event.settings.mail_days_download_reminder = 2
|
||||
send_download_reminders(sender=self.event)
|
||||
@@ -401,6 +413,7 @@ class DownloadReminderTests(TestCase):
|
||||
send_download_reminders(sender=self.event)
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_to_attendees(self):
|
||||
self.event.settings.mail_send_download_reminder_attendee = True
|
||||
self.event.settings.mail_days_download_reminder = 2
|
||||
@@ -413,6 +426,7 @@ class DownloadReminderTests(TestCase):
|
||||
assert '/ticket/' in djmail.outbox[1].body
|
||||
assert '/order/' not in djmail.outbox[1].body
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_not_to_attendees_with_same_address(self):
|
||||
self.event.settings.mail_send_download_reminder_attendee = True
|
||||
self.event.settings.mail_days_download_reminder = 2
|
||||
@@ -423,6 +437,7 @@ class DownloadReminderTests(TestCase):
|
||||
assert djmail.outbox[0].to == ['dummy@dummy.test']
|
||||
assert '/order/' in djmail.outbox[0].body
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_sent_paid_only(self):
|
||||
self.event.settings.mail_days_download_reminder = 2
|
||||
self.order.status = Order.STATUS_PENDING
|
||||
@@ -430,11 +445,13 @@ class DownloadReminderTests(TestCase):
|
||||
send_download_reminders(sender=self.event)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_not_sent_too_early(self):
|
||||
self.event.settings.mail_days_download_reminder = 1
|
||||
send_download_reminders(sender=self.event)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_not_sent_too_soon_after_purchase(self):
|
||||
self.order.datetime = now()
|
||||
self.order.save()
|
||||
@@ -446,42 +463,47 @@ class DownloadReminderTests(TestCase):
|
||||
class OrderCancelTests(TestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
self.event = Event.objects.create(organizer=o, name='Dummy', slug='dummy', date_from=now(),
|
||||
plugins='tests.testdummy')
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
generate_invoice(self.order)
|
||||
djmail.outbox = []
|
||||
self.o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
with scope(organizer=self.o):
|
||||
self.event = Event.objects.create(organizer=self.o, name='Dummy', slug='dummy', date_from=now(),
|
||||
plugins='tests.testdummy')
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket',
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
generate_invoice(self.order)
|
||||
djmail.outbox = []
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_canceled(self):
|
||||
self.order.status = Order.STATUS_CANCELED
|
||||
self.order.save()
|
||||
with pytest.raises(OrderError):
|
||||
cancel_order(self.order.pk)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_send_mail(self):
|
||||
cancel_order(self.order.pk, send_mail=True)
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_send_no_mail(self):
|
||||
cancel_order(self.order.pk, send_mail=False)
|
||||
assert len(djmail.outbox) == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_unpaid(self):
|
||||
cancel_order(self.order.pk)
|
||||
self.order.refresh_from_db()
|
||||
@@ -489,6 +511,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.order.all_logentries().last().action_type == 'pretix.event.order.canceled'
|
||||
assert self.order.invoices.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_unpaid_with_voucher(self):
|
||||
self.op1.voucher = self.event.vouchers.create(item=self.ticket, redeemed=1)
|
||||
self.op1.save()
|
||||
@@ -500,6 +523,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.op1.voucher.redeemed == 0
|
||||
assert self.order.invoices.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_paid(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -509,6 +533,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.order.all_logentries().last().action_type == 'pretix.event.order.canceled'
|
||||
assert self.order.invoices.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_paid_with_too_high_fee(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -519,6 +544,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
assert self.order.total == 46
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_paid_with_fee(self):
|
||||
f = self.order.fees.create(fee_type=OrderFee.FEE_TYPE_SHIPPING, value=2.5)
|
||||
self.order.status = Order.STATUS_PAID
|
||||
@@ -543,6 +569,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.order.invoices.count() == 3
|
||||
assert not self.order.invoices.last().is_cancellation
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_auto_refund_possible(self):
|
||||
p1 = self.order.payments.create(
|
||||
amount=Decimal('46.00'),
|
||||
@@ -558,6 +585,7 @@ class OrderCancelTests(TestCase):
|
||||
assert self.order.all_logentries().filter(action_type='pretix.event.order.refund.created').exists()
|
||||
assert not self.order.all_logentries().filter(action_type='pretix.event.order.refund.requested').exists()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_auto_refund_impossible(self):
|
||||
self.order.payments.create(
|
||||
amount=Decimal('46.00'),
|
||||
@@ -572,39 +600,40 @@ class OrderCancelTests(TestCase):
|
||||
class OrderChangeManagerTests(TestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
self.event = Event.objects.create(organizer=o, name='Dummy', slug='dummy', date_from=now(),
|
||||
plugins='pretix.plugins.banktransfer')
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.order.payments.create(
|
||||
provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CREATED, amount=self.order.total
|
||||
)
|
||||
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
self.tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', tax_rule=self.tr7,
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.ticket2 = Item.objects.create(event=self.event, name='Other ticket', tax_rule=self.tr7,
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.shirt = Item.objects.create(event=self.event, name='T-Shirt', tax_rule=self.tr19,
|
||||
default_price=Decimal('12.00'))
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
self.ocm = OrderChangeManager(self.order, None)
|
||||
self.quota = self.event.quotas.create(name='Test', size=None)
|
||||
self.quota.items.add(self.ticket)
|
||||
self.quota.items.add(self.ticket2)
|
||||
self.quota.items.add(self.shirt)
|
||||
self.o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
with scope(organizer=self.o):
|
||||
self.event = Event.objects.create(organizer=self.o, name='Dummy', slug='dummy', date_from=now(),
|
||||
plugins='pretix.plugins.banktransfer')
|
||||
self.order = Order.objects.create(
|
||||
code='FOO', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING, locale='en',
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('46.00'),
|
||||
)
|
||||
self.order.payments.create(
|
||||
provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CREATED, amount=self.order.total
|
||||
)
|
||||
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
self.tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', tax_rule=self.tr7,
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.ticket2 = Item.objects.create(event=self.event, name='Other ticket', tax_rule=self.tr7,
|
||||
default_price=Decimal('23.00'), admission=True)
|
||||
self.shirt = Item.objects.create(event=self.event, name='T-Shirt', tax_rule=self.tr19,
|
||||
default_price=Decimal('12.00'))
|
||||
self.op1 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Peter"}, positionid=1
|
||||
)
|
||||
self.op2 = OrderPosition.objects.create(
|
||||
order=self.order, item=self.ticket, variation=None,
|
||||
price=Decimal("23.00"), attendee_name_parts={'full_name': "Dieter"}, positionid=2
|
||||
)
|
||||
self.ocm = OrderChangeManager(self.order, None)
|
||||
self.quota = self.event.quotas.create(name='Test', size=None)
|
||||
self.quota.items.add(self.ticket)
|
||||
self.quota.items.add(self.ticket2)
|
||||
self.quota.items.add(self.shirt)
|
||||
|
||||
def _enable_reverse_charge(self):
|
||||
self.tr7.eu_reverse_charge = True
|
||||
@@ -618,6 +647,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
country=Country('AT')
|
||||
)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_multiple_commits_forbidden(self):
|
||||
self.ocm.change_price(self.op1, Decimal('10.00'))
|
||||
self.ocm.commit()
|
||||
@@ -625,6 +655,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.commit()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_subevent_quota_required(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -637,6 +668,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.change_subevent(self.op1, se2)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_subevent_success(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -656,6 +688,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.price == Decimal('23.00')
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_subevent_with_price_success(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -676,6 +709,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.price == Decimal('12.00')
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_subevent_sold_out(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -693,11 +727,13 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.subevent == se1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_item_quota_required(self):
|
||||
self.quota.delete()
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.change_item(self.op1, self.shirt, None)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_item_keep_price(self):
|
||||
p = self.op1.price
|
||||
self.ocm.change_item(self.op1, self.shirt, None)
|
||||
@@ -709,6 +745,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.tax_value == Decimal('3.67')
|
||||
assert self.op1.tax_rule == self.shirt.tax_rule
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_item_success(self):
|
||||
self.ocm.change_item(self.op1, self.shirt, None)
|
||||
self.ocm.commit()
|
||||
@@ -720,6 +757,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_item_with_price_success(self):
|
||||
self.ocm.change_item(self.op1, self.shirt, None)
|
||||
self.ocm.change_price(self.op1, Decimal('12.00'))
|
||||
@@ -732,6 +770,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_price_success(self):
|
||||
self.ocm.change_price(self.op1, Decimal('24.00'))
|
||||
self.ocm.commit()
|
||||
@@ -742,6 +781,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_price_net_success(self):
|
||||
self.tr7.price_includes_tax = False
|
||||
self.tr7.save()
|
||||
@@ -754,6 +794,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_success(self):
|
||||
self.ocm.cancel(self.op1)
|
||||
self.ocm.commit()
|
||||
@@ -763,6 +804,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.canceled
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_with_addon(self):
|
||||
self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True)
|
||||
self.ticket.addons.create(addon_category=self.shirt.category)
|
||||
@@ -781,6 +823,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.canceled
|
||||
assert self.op1.addons.first().canceled
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_free_to_paid(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -796,6 +839,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.price == Decimal('24.00')
|
||||
assert self.order.status == Order.STATUS_PENDING
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_cancel_all_in_order(self):
|
||||
self.ocm.cancel(self.op1)
|
||||
self.ocm.cancel(self.op2)
|
||||
@@ -803,9 +847,11 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
assert self.order.positions.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_empty(self):
|
||||
self.ocm.commit()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_quota_unlimited(self):
|
||||
q = self.event.quotas.create(name='Test', size=None)
|
||||
q.items.add(self.shirt)
|
||||
@@ -814,6 +860,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_quota_full(self):
|
||||
q = self.event.quotas.create(name='Test', size=0)
|
||||
q.items.add(self.shirt)
|
||||
@@ -823,6 +870,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.ticket
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_quota_ignore(self):
|
||||
q = self.event.quotas.create(name='Test', size=0)
|
||||
q.items.add(self.shirt)
|
||||
@@ -831,6 +879,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_quota_full_but_in_same(self):
|
||||
q = self.event.quotas.create(name='Test', size=0)
|
||||
q.items.add(self.shirt)
|
||||
@@ -840,6 +889,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_multiple_quotas_shared_full(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=0)
|
||||
q2 = self.event.quotas.create(name='Test', size=2)
|
||||
@@ -851,6 +901,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_multiple_quotas_unshared_full(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=2)
|
||||
q2 = self.event.quotas.create(name='Test', size=0)
|
||||
@@ -863,6 +914,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.ticket
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_multiple_items_success(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=2)
|
||||
q1.items.add(self.shirt)
|
||||
@@ -874,6 +926,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.item == self.shirt
|
||||
assert self.op2.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_multiple_items_quotas_partially_full(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=1)
|
||||
q1.items.add(self.shirt)
|
||||
@@ -886,6 +939,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.op1.item == self.ticket
|
||||
assert self.op2.item == self.ticket
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_payment_fee_calculation(self):
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
prov = self.ocm._get_payment_provider()
|
||||
@@ -899,6 +953,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert round_decimal(fee.value * (1 - 100 / (100 + fee.tax_rate))) == fee.tax_value
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_pending_free_order_stays_pending(self):
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
self.ocm.change_price(self.op1, Decimal('0.00'))
|
||||
@@ -914,6 +969,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.status == Order.STATUS_PENDING
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_require_pending(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -922,6 +978,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.op1.refresh_from_db()
|
||||
assert self.op1.item == self.shirt
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_price_to_free_marked_as_paid(self):
|
||||
self.ocm.change_price(self.op1, Decimal('0.00'))
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
@@ -931,6 +988,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
assert self.order.payments.last().provider == 'free'
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_price_to_free_require_approval(self):
|
||||
self.order.require_approval = True
|
||||
self.order.save()
|
||||
@@ -942,6 +1000,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == 0
|
||||
assert self.order.status == Order.STATUS_PENDING
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_paid_same_price(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -951,6 +1010,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == 46
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_paid_different_price(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -960,6 +1020,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == Decimal('28.00')
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_paid_to_pending(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -975,6 +1036,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.pending_sum == Decimal('2.00')
|
||||
assert self.order.status == Order.STATUS_PENDING
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_paid_stays_paid_when_overpaid(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -996,11 +1058,13 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.pending_sum == Decimal('0.00')
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_quota_required(self):
|
||||
self.quota.delete()
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.add_position(self.shirt, None, None, None)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_success(self):
|
||||
self.ocm.add_position(self.shirt, None, None, None)
|
||||
self.ocm.commit()
|
||||
@@ -1014,6 +1078,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == self.op1.price + self.op2.price + nop.price
|
||||
assert nop.positionid == 3
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_net_price_success(self):
|
||||
self.tr19.price_includes_tax = False
|
||||
self.tr19.save()
|
||||
@@ -1029,6 +1094,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == self.op1.price + self.op2.price + nop.price
|
||||
assert nop.positionid == 3
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_reverse_charge(self):
|
||||
self._enable_reverse_charge()
|
||||
self.ocm.add_position(self.shirt, None, None, None)
|
||||
@@ -1043,6 +1109,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.total == self.op1.price + self.op2.price + nop.price
|
||||
assert nop.positionid == 3
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_custom_price(self):
|
||||
self.ocm.add_position(self.shirt, None, Decimal('13.00'), None)
|
||||
self.ocm.commit()
|
||||
@@ -1055,6 +1122,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price + nop.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_custom_price_tax_always_included(self):
|
||||
self.tr19.price_includes_tax = False
|
||||
self.tr19.save()
|
||||
@@ -1069,6 +1137,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert round_decimal(nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value
|
||||
assert self.order.total == self.op1.price + self.op2.price + nop.price
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_quota_full(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=0)
|
||||
q1.items.add(self.shirt)
|
||||
@@ -1077,6 +1146,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
assert self.order.positions.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_addon(self):
|
||||
self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True)
|
||||
self.ticket.addons.create(addon_category=self.shirt.category)
|
||||
@@ -1088,6 +1158,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert nop.item == self.shirt
|
||||
assert nop.addon_to == self.op1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_addon_invalid(self):
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.add_position(self.shirt, None, Decimal('13.00'), self.op1)
|
||||
@@ -1095,12 +1166,14 @@ class OrderChangeManagerTests(TestCase):
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.add_position(self.shirt, None, Decimal('13.00'), None)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_subevent_required(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.add_position(self.ticket, None, None, None)
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_subevent_price(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
@@ -1118,6 +1191,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert nop.price == Decimal('12.00')
|
||||
assert nop.subevent == se1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_reissue_invoice(self):
|
||||
generate_invoice(self.order)
|
||||
assert self.order.invoices.count() == 1
|
||||
@@ -1125,6 +1199,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
assert self.order.invoices.count() == 3
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_dont_reissue_invoice_on_free_product_changes(self):
|
||||
self.event.settings.invoice_include_free = False
|
||||
generate_invoice(self.order)
|
||||
@@ -1133,6 +1208,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
assert self.order.invoices.count() == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_recalculate_reverse_charge(self):
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
prov = self.ocm._get_payment_provider()
|
||||
@@ -1179,6 +1255,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert fee.tax_value == Decimal('0.05')
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_simple(self):
|
||||
old_secret = self.op2.secret
|
||||
self.ocm.split(self.op2)
|
||||
@@ -1198,6 +1275,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert not self.order.invoices.exists()
|
||||
assert not o2.invoices.exists()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_require_approval(self):
|
||||
self.op2.item.require_approval = True
|
||||
self.op2.item.save()
|
||||
@@ -1222,6 +1300,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert not self.order.invoices.exists()
|
||||
assert not o2.invoices.exists()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_pending_payment_fees(self):
|
||||
# Set payment fees
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
@@ -1262,6 +1341,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.fees.count() == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_paid_no_payment_fees(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
@@ -1299,6 +1379,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert p.amount == Decimal('23.00')
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_invoice_address(self):
|
||||
ia = InvoiceAddress.objects.create(
|
||||
order=self.order, is_business=True, vat_id='ATU1234567', vat_id_validated=True,
|
||||
@@ -1325,6 +1406,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.invoice_address != ia
|
||||
assert o2.invoice_address.company == 'Sample'
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_change_price_of_pending_order_with_payment(self):
|
||||
self.order.status = Order.STATUS_PENDING
|
||||
self.order.save()
|
||||
@@ -1337,6 +1419,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.payments.last().state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
assert self.order.payments.last().amount == Decimal('46.00')
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_reverse_charge(self):
|
||||
ia = self._enable_reverse_charge()
|
||||
|
||||
@@ -1393,6 +1476,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.invoice_address != ia
|
||||
assert o2.invoice_address.vat_id_validated is True
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_other_fees(self):
|
||||
# Check if reverse charge is active
|
||||
self.order.fees.create(fee_type=OrderFee.FEE_TYPE_SHIPPING, tax_rule=self.tr19, value=Decimal('2.50'))
|
||||
@@ -1424,12 +1508,14 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.positions.first().price == Decimal('23.00')
|
||||
assert o2.fees.count() == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_to_empty(self):
|
||||
self.ocm.split(self.op1)
|
||||
self.ocm.split(self.op2)
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.commit()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_paid_payment_fees(self):
|
||||
# Set payment fees
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
@@ -1472,6 +1558,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.fees.count() == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_invoice(self):
|
||||
generate_invoice(self.order)
|
||||
assert self.order.invoices.count() == 1
|
||||
@@ -1487,6 +1574,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.invoices.count() == 1
|
||||
assert o2.invoices.last().lines.count() == 1
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_to_free_invoice(self):
|
||||
self.event.settings.invoice_include_free = False
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
@@ -1508,6 +1596,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert self.order.invoices.last().lines.count() == 1
|
||||
assert o2.invoices.count() == 0
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_to_original_free(self):
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
self.ocm.commit()
|
||||
@@ -1525,6 +1614,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.status == Order.STATUS_PENDING
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_split_to_new_free(self):
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
self.ocm.commit()
|
||||
|
||||
@@ -4,6 +4,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
import pytz
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
from tests.testdummy.payment import DummyPaymentProvider
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -19,7 +20,8 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now()
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import pytest
|
||||
from django.test import RequestFactory
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Organizer, Team, User
|
||||
from pretix.multidomain.middlewares import SessionMiddleware
|
||||
@@ -8,7 +9,9 @@ from pretix.multidomain.middlewares import SessionMiddleware
|
||||
|
||||
@pytest.fixture
|
||||
def organizer():
|
||||
return Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
with scope(organizer=o):
|
||||
yield o
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -251,25 +254,26 @@ def test_list_of_events(event, user, admin, admin_request):
|
||||
team2.limit_events.add(event)
|
||||
team3.limit_events.add(event3)
|
||||
|
||||
events = list(user.get_events_with_any_permission(request=admin_request))
|
||||
assert event in events
|
||||
assert event2 in events
|
||||
assert event3 in events
|
||||
assert event4 not in events
|
||||
with scope(organizer=[event.organizer, orga2]):
|
||||
events = list(user.get_events_with_any_permission(request=admin_request))
|
||||
assert event in events
|
||||
assert event2 in events
|
||||
assert event3 in events
|
||||
assert event4 not in events
|
||||
|
||||
events = list(user.get_events_with_permission('can_change_event_settings', request=admin_request))
|
||||
assert event not in events
|
||||
assert event2 not in events
|
||||
assert event3 in events
|
||||
assert event4 not in events
|
||||
events = list(user.get_events_with_permission('can_change_event_settings', request=admin_request))
|
||||
assert event not in events
|
||||
assert event2 not in events
|
||||
assert event3 in events
|
||||
assert event4 not in events
|
||||
|
||||
assert set(event.get_users_with_any_permission()) == {user}
|
||||
assert set(event2.get_users_with_any_permission()) == {user}
|
||||
assert set(event3.get_users_with_any_permission()) == {user}
|
||||
assert set(event4.get_users_with_any_permission()) == set()
|
||||
assert set(event.get_users_with_any_permission()) == {user}
|
||||
assert set(event2.get_users_with_any_permission()) == {user}
|
||||
assert set(event3.get_users_with_any_permission()) == {user}
|
||||
assert set(event4.get_users_with_any_permission()) == set()
|
||||
|
||||
assert set(event.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event2.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event3.get_users_with_permission('can_change_event_settings')) == {user}
|
||||
assert set(event4.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event.get_users_with_permission('can_change_orders')) == {user}
|
||||
assert set(event.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event2.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event3.get_users_with_permission('can_change_event_settings')) == {user}
|
||||
assert set(event4.get_users_with_permission('can_change_event_settings')) == set()
|
||||
assert set(event.get_users_with_permission('can_change_orders')) == {user}
|
||||
|
||||
@@ -2,6 +2,7 @@ from datetime import datetime, time
|
||||
|
||||
import pytest
|
||||
import pytz
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.base.reldate import RelativeDate, RelativeDateWrapper
|
||||
@@ -41,27 +42,28 @@ def test_relative_date_without_time(event):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_relative_date_other_base_point(event):
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start'))
|
||||
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
|
||||
assert rdw.to_string() == 'RELDATE/1/-/presale_start/'
|
||||
with scope(organizer=event.organizer):
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start'))
|
||||
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
|
||||
assert rdw.to_string() == 'RELDATE/1/-/presale_start/'
|
||||
|
||||
# presale_end is unset, defaults to date_from
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end'))
|
||||
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0))
|
||||
assert rdw.to_string() == 'RELDATE/1/-/presale_end/'
|
||||
# presale_end is unset, defaults to date_from
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end'))
|
||||
assert rdw.datetime(event) == TOKYO.localize(datetime(2017, 12, 26, 5, 0, 0))
|
||||
assert rdw.to_string() == 'RELDATE/1/-/presale_end/'
|
||||
|
||||
# subevent base
|
||||
se = event.subevents.create(name="SE1", date_from=TOKYO.localize(datetime(2017, 11, 27, 5, 0, 0)))
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
|
||||
# subevent base
|
||||
se = event.subevents.create(name="SE1", date_from=TOKYO.localize(datetime(2017, 11, 27, 5, 0, 0)))
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='date_from'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
|
||||
|
||||
# presale_start is unset on subevent, default to event
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
|
||||
# presale_start is unset on subevent, default to event
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_start'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 30, 5, 0, 0))
|
||||
|
||||
# presale_end is unset on all, default to date_from of subevent
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
|
||||
# presale_end is unset on all, default to date_from of subevent
|
||||
rdw = RelativeDateWrapper(RelativeDate(days_before=1, time=None, base_date_name='presale_end'))
|
||||
assert rdw.datetime(se) == TOKYO.localize(datetime(2017, 11, 26, 5, 0, 0))
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from django.test import TestCase
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from i18nfield.strings import LazyI18nString
|
||||
|
||||
from pretix.base import settings
|
||||
@@ -43,7 +44,8 @@ class SettingsTestCase(TestCase):
|
||||
sandbox['bar'] = 'baz'
|
||||
sandbox.baz = 42
|
||||
|
||||
self.event = Event.objects.get(id=self.event.id)
|
||||
with scopes_disabled():
|
||||
self.event = Event.objects.get(id=self.event.id)
|
||||
sandbox = SettingsSandbox('testing', 'foo', self.event)
|
||||
self.assertEqual(sandbox['bar'], 'baz')
|
||||
self.assertEqual(sandbox.baz, '42')
|
||||
|
||||
@@ -6,6 +6,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
from django.core.files.base import ContentFile
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import (
|
||||
CachedCombinedTicket, CachedTicket, Event, InvoiceAddress, Order,
|
||||
@@ -27,7 +28,8 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -4,6 +4,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_countries.fields import Country
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, InvoiceAddress, Organizer, TaxRule
|
||||
|
||||
@@ -15,7 +16,8 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now()
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -3,6 +3,7 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
import pytz
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.base.timeline import timeline_for_event
|
||||
@@ -29,7 +30,8 @@ def event():
|
||||
date_from=datetime(2017, 10, 22, 12, 0, 0, tzinfo=tz),
|
||||
date_to=datetime(2017, 10, 23, 23, 0, 0, tzinfo=tz),
|
||||
)
|
||||
return event
|
||||
with scope(organizer=o):
|
||||
yield event
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -3,6 +3,7 @@ from datetime import timedelta
|
||||
from django.core import mail as djmail
|
||||
from django.test import TestCase
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, ItemVariation, Organizer, Quota, Voucher, WaitingListEntry,
|
||||
@@ -11,28 +12,31 @@ from pretix.base.models.waitinglist import WaitingListException
|
||||
from pretix.base.services.waitinglist import (
|
||||
assign_automatically, process_waitinglist,
|
||||
)
|
||||
from pretix.testutils.scope import classscope
|
||||
|
||||
|
||||
class WaitingListTestCase(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
cls.o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
cls.event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
organizer=cls.o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
djmail.outbox = []
|
||||
self.quota = Quota.objects.create(name="Test", size=2, event=self.event)
|
||||
self.item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23,
|
||||
admission=True)
|
||||
self.item2 = Item.objects.create(event=self.event, name="T-Shirt", default_price=23)
|
||||
self.item3 = Item.objects.create(event=self.event, name="Goodie", default_price=23)
|
||||
self.var1 = ItemVariation.objects.create(item=self.item2, value='S')
|
||||
self.var2 = ItemVariation.objects.create(item=self.item2, value='M')
|
||||
self.var3 = ItemVariation.objects.create(item=self.item3, value='Fancy')
|
||||
with scope(organizer=self.o):
|
||||
self.quota = Quota.objects.create(name="Test", size=2, event=self.event)
|
||||
self.item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23,
|
||||
admission=True)
|
||||
self.item2 = Item.objects.create(event=self.event, name="T-Shirt", default_price=23)
|
||||
self.item3 = Item.objects.create(event=self.event, name="Goodie", default_price=23)
|
||||
self.var1 = ItemVariation.objects.create(item=self.item2, value='S')
|
||||
self.var2 = ItemVariation.objects.create(item=self.item2, value='M')
|
||||
self.var3 = ItemVariation.objects.create(item=self.item3, value='Fancy')
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_unavailable(self):
|
||||
self.quota.items.add(self.item1)
|
||||
self.quota.size = 0
|
||||
@@ -43,6 +47,7 @@ class WaitingListTestCase(TestCase):
|
||||
with self.assertRaises(WaitingListException):
|
||||
wle.send_voucher()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_double(self):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = 1
|
||||
@@ -54,6 +59,7 @@ class WaitingListTestCase(TestCase):
|
||||
with self.assertRaises(WaitingListException):
|
||||
wle.send_voucher()
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_variation(self):
|
||||
wle = WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo@bar.com'
|
||||
@@ -72,6 +78,7 @@ class WaitingListTestCase(TestCase):
|
||||
assert len(djmail.outbox) == 1
|
||||
assert djmail.outbox[0].to == [wle.email]
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_send_custom_validity(self):
|
||||
self.event.settings.set('waiting_list_hours', 24)
|
||||
wle = WaitingListEntry.objects.create(
|
||||
@@ -83,103 +90,117 @@ class WaitingListTestCase(TestCase):
|
||||
assert 3600 * 23 < (wle.voucher.valid_until - now()).seconds < 3600 * 24
|
||||
|
||||
def test_send_auto(self):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = 7
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = 7
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i)
|
||||
)
|
||||
|
||||
assign_automatically.apply(args=(self.event.pk,))
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 3
|
||||
assert Voucher.objects.count() == 17
|
||||
assert sorted(list(WaitingListEntry.objects.filter(voucher__isnull=True).values_list('email', flat=True))) == [
|
||||
'foo7@bar.com', 'foo8@bar.com', 'foo9@bar.com'
|
||||
]
|
||||
with scope(organizer=self.o):
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 3
|
||||
assert Voucher.objects.count() == 17
|
||||
assert sorted(list(WaitingListEntry.objects.filter(voucher__isnull=True).values_list('email', flat=True))) == [
|
||||
'foo7@bar.com', 'foo8@bar.com', 'foo9@bar.com'
|
||||
]
|
||||
|
||||
def test_send_auto_respect_priority(self):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = 7
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i),
|
||||
priority=i
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i),
|
||||
priority=i
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = 7
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i),
|
||||
priority=i
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i),
|
||||
priority=i
|
||||
)
|
||||
|
||||
assign_automatically.apply(args=(self.event.pk,))
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 3
|
||||
assert Voucher.objects.count() == 17
|
||||
assert sorted(list(WaitingListEntry.objects.filter(voucher__isnull=True).values_list('email', flat=True))) == [
|
||||
'foo0@bar.com', 'foo1@bar.com', 'foo2@bar.com'
|
||||
]
|
||||
with scope(organizer=self.o):
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 3
|
||||
assert Voucher.objects.count() == 17
|
||||
assert sorted(list(WaitingListEntry.objects.filter(voucher__isnull=True).values_list('email', flat=True))) == [
|
||||
'foo0@bar.com', 'foo1@bar.com', 'foo2@bar.com'
|
||||
]
|
||||
|
||||
def test_send_auto_quota_infinite(self):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = None
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
self.quota.variations.add(self.var1)
|
||||
self.quota.size = None
|
||||
self.quota.save()
|
||||
for i in range(10):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item1, email='bar{}@bar.com'.format(i)
|
||||
)
|
||||
|
||||
assign_automatically.apply(args=(self.event.pk,))
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 10
|
||||
assert Voucher.objects.count() == 10
|
||||
with scope(organizer=self.o):
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 10
|
||||
assert Voucher.objects.count() == 10
|
||||
|
||||
def test_send_periodic_event_over(self):
|
||||
self.event.settings.set('waiting_list_enabled', True)
|
||||
self.event.settings.set('waiting_list_auto', True)
|
||||
self.event.presale_end = now() - timedelta(days=1)
|
||||
self.event.save()
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
process_waitinglist(None)
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 5
|
||||
assert Voucher.objects.count() == 0
|
||||
self.event.presale_end = now() + timedelta(days=1)
|
||||
self.event.save()
|
||||
with scope(organizer=self.o):
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 5
|
||||
assert Voucher.objects.count() == 0
|
||||
self.event.presale_end = now() + timedelta(days=1)
|
||||
self.event.save()
|
||||
|
||||
def test_send_periodic(self):
|
||||
self.event.settings.set('waiting_list_enabled', True)
|
||||
self.event.settings.set('waiting_list_auto', True)
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
process_waitinglist(None)
|
||||
assert Voucher.objects.count() == 5
|
||||
with scope(organizer=self.o):
|
||||
assert Voucher.objects.count() == 5
|
||||
|
||||
def test_send_periodic_disabled(self):
|
||||
self.event.settings.set('waiting_list_enabled', True)
|
||||
self.event.settings.set('waiting_list_auto', False)
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
process_waitinglist(None)
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 5
|
||||
assert Voucher.objects.count() == 0
|
||||
with scope(organizer=self.o):
|
||||
assert WaitingListEntry.objects.filter(voucher__isnull=True).count() == 5
|
||||
assert Voucher.objects.count() == 0
|
||||
|
||||
def test_send_periodic_disabled2(self):
|
||||
self.event.settings.set('waiting_list_enabled', False)
|
||||
self.event.settings.set('waiting_list_auto', True)
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
with scope(organizer=self.o):
|
||||
for i in range(5):
|
||||
WaitingListEntry.objects.create(
|
||||
event=self.event, item=self.item2, variation=self.var1, email='foo{}@bar.com'.format(i)
|
||||
)
|
||||
process_waitinglist(None)
|
||||
assert Voucher.objects.count() == 5
|
||||
with scope(organizer=self.o):
|
||||
assert Voucher.objects.count() == 5
|
||||
|
||||
@@ -6,6 +6,7 @@ import pytest
|
||||
import responses
|
||||
from django.db import transaction
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import Event, Item, Order, OrderPosition, Organizer
|
||||
|
||||
@@ -83,13 +84,14 @@ def test_webhook_trigger_event_specific(event, order, webhook, monkeypatch_on_co
|
||||
"code": "FOO",
|
||||
"action": "pretix.event.order.paid"
|
||||
}
|
||||
first = webhook.calls.last()
|
||||
assert first.webhook == webhook
|
||||
assert first.target_url == 'https://google.com'
|
||||
assert first.action_type == 'pretix.event.order.paid'
|
||||
assert not first.is_retry
|
||||
assert first.return_code == 200
|
||||
assert first.success
|
||||
with scopes_disabled():
|
||||
first = webhook.calls.last()
|
||||
assert first.webhook == webhook
|
||||
assert first.target_url == 'https://google.com'
|
||||
assert first.action_type == 'pretix.event.order.paid'
|
||||
assert not first.is_retry
|
||||
assert first.return_code == 200
|
||||
assert first.success
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -170,8 +172,9 @@ def test_webhook_retry(event, order, webhook, monkeypatch_on_commit):
|
||||
with transaction.atomic():
|
||||
order.log_action('pretix.event.order.paid', {})
|
||||
assert len(responses.calls) == 2
|
||||
second = webhook.objects.first()
|
||||
first = webhook.objects.last()
|
||||
with scopes_disabled():
|
||||
second = webhook.objects.first()
|
||||
first = webhook.objects.last()
|
||||
|
||||
assert first.webhook == webhook
|
||||
assert first.target_url == 'https://google.com'
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import inspect
|
||||
|
||||
import pytest
|
||||
from django_scopes import scopes_disabled
|
||||
from xdist.dsession import DSession
|
||||
|
||||
CRASHED_ITEMS = set()
|
||||
@@ -31,3 +34,16 @@ def pytest_configure(config):
|
||||
self.sched.check_schedule(node)
|
||||
|
||||
DSession.handle_crashitem = _handle_crashitem
|
||||
|
||||
|
||||
@pytest.hookimpl(hookwrapper=True)
|
||||
def pytest_fixture_setup(fixturedef, request):
|
||||
"""
|
||||
This hack automatically disables django-scopes for all fixtures which are not yield fixtures.
|
||||
This saves us a *lot* of decorcators…
|
||||
"""
|
||||
if inspect.isgeneratorfunction(fixturedef.func):
|
||||
yield
|
||||
else:
|
||||
with scopes_disabled():
|
||||
yield
|
||||
|
||||
@@ -239,7 +239,7 @@ class Login2FAFormTest(TestCase):
|
||||
|
||||
def test_totp_invalid(self):
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.rendered_content
|
||||
assert 'token' in response.content.decode()
|
||||
d = TOTPDevice.objects.create(user=self.user, name='test')
|
||||
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
|
||||
totp.time = time.time()
|
||||
@@ -251,7 +251,7 @@ class Login2FAFormTest(TestCase):
|
||||
|
||||
def test_totp_valid(self):
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.rendered_content
|
||||
assert 'token' in response.content.decode()
|
||||
d = TOTPDevice.objects.create(user=self.user, name='test')
|
||||
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
|
||||
totp.time = time.time()
|
||||
@@ -274,7 +274,7 @@ class Login2FAFormTest(TestCase):
|
||||
d = U2FDevice.objects.create(user=self.user, name='test', json_data="{}")
|
||||
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.rendered_content
|
||||
assert 'token' in response.content.decode()
|
||||
response = self.client.post('/control/login/2fa'.format(d.pk), {
|
||||
'token': '{"response": "true"}'
|
||||
})
|
||||
@@ -291,7 +291,7 @@ class Login2FAFormTest(TestCase):
|
||||
d = U2FDevice.objects.create(user=self.user, name='test', json_data="{}")
|
||||
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.rendered_content
|
||||
assert 'token' in response.content.decode()
|
||||
response = self.client.post('/control/login/2fa'.format(d.pk), {
|
||||
'token': '{"response": "true"}'
|
||||
})
|
||||
|
||||
@@ -3,6 +3,7 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Checkin, Event, Item, ItemAddOn, ItemCategory, LogEntry, Order,
|
||||
@@ -58,12 +59,14 @@ def dashboard_env():
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@scopes_disabled()
|
||||
def test_dashboard(dashboard_env):
|
||||
c = checkin_widget(dashboard_env[0])
|
||||
assert '0/2' in c[0]['content']
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@scopes_disabled()
|
||||
def test_dashboard_pending_not_count(dashboard_env):
|
||||
c = checkin_widget(dashboard_env[0])
|
||||
order_pending = Order.objects.create(
|
||||
@@ -83,6 +86,7 @@ def test_dashboard_pending_not_count(dashboard_env):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@scopes_disabled()
|
||||
def test_dashboard_with_checkin(dashboard_env):
|
||||
op = OrderPosition.objects.get(
|
||||
order=dashboard_env[3],
|
||||
@@ -256,11 +260,13 @@ def test_checkins_list_mixed(client, checkin_list_env, query, expected):
|
||||
@pytest.mark.django_db
|
||||
def test_manual_checkins(client, checkin_list_env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
with scopes_disabled():
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
client.post('/control/event/dummy/dummy/checkinlists/{}/'.format(checkin_list_env[6].pk), {
|
||||
'checkin': [checkin_list_env[5][3].pk]
|
||||
})
|
||||
assert checkin_list_env[5][3].checkins.exists()
|
||||
with scopes_disabled():
|
||||
assert checkin_list_env[5][3].checkins.exists()
|
||||
assert LogEntry.objects.filter(
|
||||
action_type='pretix.event.checkin', object_id=checkin_list_env[5][3].order.pk
|
||||
).exists()
|
||||
@@ -269,7 +275,8 @@ def test_manual_checkins(client, checkin_list_env):
|
||||
@pytest.mark.django_db
|
||||
def test_manual_checkins_revert(client, checkin_list_env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
with scopes_disabled():
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
client.post('/control/event/dummy/dummy/checkinlists/{}/'.format(checkin_list_env[6].pk), {
|
||||
'checkin': [checkin_list_env[5][3].pk]
|
||||
})
|
||||
@@ -277,7 +284,8 @@ def test_manual_checkins_revert(client, checkin_list_env):
|
||||
'checkin': [checkin_list_env[5][3].pk],
|
||||
'revert': 'true'
|
||||
})
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
with scopes_disabled():
|
||||
assert not checkin_list_env[5][3].checkins.exists()
|
||||
assert LogEntry.objects.filter(
|
||||
action_type='pretix.event.checkin', object_id=checkin_list_env[5][3].order.pk
|
||||
).exists()
|
||||
@@ -381,11 +389,11 @@ def test_checkins_attendee_name_from_addon_available(client, checkin_list_with_a
|
||||
|
||||
|
||||
class CheckinListFormTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
self.orga1 = Organizer.objects.create(name='CCC', slug='ccc')
|
||||
self.orga2 = Organizer.objects.create(name='MRM', slug='mrm')
|
||||
self.event1 = Event.objects.create(
|
||||
organizer=self.orga1, name='30C3', slug='30c3',
|
||||
date_from=datetime(2013, 12, 26, tzinfo=timezone.utc),
|
||||
@@ -404,12 +412,14 @@ class CheckinListFormTest(SoupTest):
|
||||
doc = self.post_doc('/control/event/%s/%s/checkinlists/add' % (self.orga1.slug, self.event1.slug), form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertIn("All", doc.select("#page-wrapper table")[0].text)
|
||||
assert self.event1.checkin_lists.get(
|
||||
name='All', all_products=True
|
||||
)
|
||||
with scopes_disabled():
|
||||
assert self.event1.checkin_lists.get(
|
||||
name='All', all_products=True
|
||||
)
|
||||
|
||||
def test_update(self):
|
||||
cl = self.event1.checkin_lists.create(name='All', all_products=True)
|
||||
with scopes_disabled():
|
||||
cl = self.event1.checkin_lists.create(name='All', all_products=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/checkinlists/%s/change' % (self.orga1.slug, self.event1.slug, cl.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['all_products'] = ''
|
||||
@@ -419,14 +429,17 @@ class CheckinListFormTest(SoupTest):
|
||||
assert doc.select(".alert-success")
|
||||
cl.refresh_from_db()
|
||||
assert not cl.all_products
|
||||
assert list(cl.limit_products.all()) == [self.item_ticket]
|
||||
with scopes_disabled():
|
||||
assert list(cl.limit_products.all()) == [self.item_ticket]
|
||||
|
||||
def test_delete(self):
|
||||
cl = self.event1.checkin_lists.create(name='All', all_products=True)
|
||||
with scopes_disabled():
|
||||
cl = self.event1.checkin_lists.create(name='All', all_products=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/checkinlists/%s/delete' % (self.orga1.slug, self.event1.slug, cl.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/checkinlists/%s/delete' % (self.orga1.slug, self.event1.slug, cl.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert not self.event1.checkin_lists.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.event1.checkin_lists.exists()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import Device, Event, Organizer, Team, User
|
||||
from pretix.base.models.devices import generate_api_token
|
||||
@@ -40,7 +41,7 @@ def admin_team(organizer):
|
||||
def test_list_of_devices(event, admin_user, client, device):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
resp = client.get('/control/organizer/dummy/devices')
|
||||
assert 'Cashdesk' in resp.rendered_content
|
||||
assert 'Cashdesk' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -50,11 +51,13 @@ def test_create_device(event, admin_user, admin_team, client):
|
||||
'name': 'Foo',
|
||||
'limit_events': str(event.pk),
|
||||
}, follow=True)
|
||||
d = Device.objects.last()
|
||||
assert d.name == 'Foo'
|
||||
assert not d.all_events
|
||||
assert list(d.limit_events.all()) == [event]
|
||||
assert d.initialization_token in resp.content.decode()
|
||||
print(resp.status_code, resp.content)
|
||||
with scopes_disabled():
|
||||
d = Device.objects.last()
|
||||
assert d.name == 'Foo'
|
||||
assert not d.all_events
|
||||
assert list(d.limit_events.all()) == [event]
|
||||
assert d.initialization_token in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -67,13 +70,15 @@ def test_update_device(event, admin_user, admin_team, device, client):
|
||||
device.refresh_from_db()
|
||||
assert device.name == 'Cashdesk 2'
|
||||
assert not device.all_events
|
||||
assert list(device.limit_events.all()) == [event]
|
||||
with scopes_disabled():
|
||||
assert list(device.limit_events.all()) == [event]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_revoke_device(event, admin_user, admin_team, device, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
device.api_token = generate_api_token()
|
||||
with scopes_disabled():
|
||||
device.api_token = generate_api_token()
|
||||
device.initialized = now()
|
||||
device.save()
|
||||
|
||||
|
||||
+292
-244
@@ -3,6 +3,7 @@ from decimal import Decimal
|
||||
|
||||
import pytz
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from i18nfield.strings import LazyI18nString
|
||||
from pytz import timezone
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
@@ -15,6 +16,7 @@ from pretix.testutils.mock import mocker_context
|
||||
|
||||
|
||||
class EventsTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -49,7 +51,8 @@ class EventsTest(SoupTest):
|
||||
self.assertNotIn("MRMCD14", tabletext)
|
||||
|
||||
def test_quick_setup_later(self):
|
||||
self.event1.quotas.create(name='foo', size=2)
|
||||
with scopes_disabled():
|
||||
self.event1.quotas.create(name='foo', size=2)
|
||||
resp = self.client.get('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
|
||||
self.assertRedirects(resp, '/control/event/%s/%s/' % (self.orga1.slug, self.event1.slug))
|
||||
|
||||
@@ -86,18 +89,19 @@ class EventsTest(SoupTest):
|
||||
assert self.event1.settings.payment_banktransfer__enabled
|
||||
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
|
||||
assert 'pretix.plugins.banktransfer' in self.event1.plugins
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 1
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Tickets'
|
||||
assert q.size == 300
|
||||
assert q.items.count() == 2
|
||||
with scopes_disabled():
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 1
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Tickets'
|
||||
assert q.size == 300
|
||||
assert q.items.count() == 2
|
||||
|
||||
def test_quick_setup_single_quota(self):
|
||||
doc = self.get_doc('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
|
||||
@@ -132,22 +136,23 @@ class EventsTest(SoupTest):
|
||||
assert self.event1.settings.payment_banktransfer__enabled
|
||||
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
|
||||
assert 'pretix.plugins.banktransfer' in self.event1.plugins
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 2
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Normal ticket'
|
||||
assert q.size == 100
|
||||
assert q.items.count() == 1
|
||||
q = self.event1.quotas.last()
|
||||
assert q.name == 'Reduced ticket'
|
||||
assert q.size == 50
|
||||
assert q.items.count() == 1
|
||||
with scopes_disabled():
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 2
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Normal ticket'
|
||||
assert q.size == 100
|
||||
assert q.items.count() == 1
|
||||
q = self.event1.quotas.last()
|
||||
assert q.name == 'Reduced ticket'
|
||||
assert q.size == 50
|
||||
assert q.items.count() == 1
|
||||
|
||||
def test_quick_setup_dual_quota(self):
|
||||
doc = self.get_doc('/control/event/%s/%s/quickstart/' % (self.orga1.slug, self.event1.slug))
|
||||
@@ -182,22 +187,23 @@ class EventsTest(SoupTest):
|
||||
assert self.event1.settings.payment_banktransfer__enabled
|
||||
assert self.event1.settings.get('payment_banktransfer_bank_details', as_type=LazyI18nString).localize('en') == "Foo"
|
||||
assert 'pretix.plugins.banktransfer' in self.event1.plugins
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 3
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Normal ticket'
|
||||
assert q.size == 100
|
||||
assert q.items.count() == 1
|
||||
q = self.event1.quotas.last()
|
||||
assert q.name == 'Tickets'
|
||||
assert q.size == 120
|
||||
assert q.items.count() == 2
|
||||
with scopes_disabled():
|
||||
assert self.event1.items.count() == 2
|
||||
i = self.event1.items.first()
|
||||
assert str(i.name) == "Normal ticket"
|
||||
assert i.default_price == Decimal('13.90')
|
||||
i = self.event1.items.last()
|
||||
assert str(i.name) == "Reduced ticket"
|
||||
assert i.default_price == Decimal('13.20')
|
||||
assert self.event1.quotas.count() == 3
|
||||
q = self.event1.quotas.first()
|
||||
assert q.name == 'Normal ticket'
|
||||
assert q.size == 100
|
||||
assert q.items.count() == 1
|
||||
q = self.event1.quotas.last()
|
||||
assert q.name == 'Tickets'
|
||||
assert q.size == 120
|
||||
assert q.items.count() == 2
|
||||
|
||||
def test_settings(self):
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/' % (self.orga1.slug, self.event1.slug))
|
||||
@@ -257,48 +263,52 @@ class EventsTest(SoupTest):
|
||||
assert self.event1.testmode
|
||||
|
||||
def test_testmode_disable(self):
|
||||
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),
|
||||
total=14, locale='en', testmode=True
|
||||
)
|
||||
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'
|
||||
)
|
||||
self.event1.testmode = True
|
||||
self.event1.save()
|
||||
with scopes_disabled():
|
||||
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),
|
||||
total=14, locale='en', testmode=True
|
||||
)
|
||||
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'
|
||||
)
|
||||
self.event1.testmode = True
|
||||
self.event1.save()
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
{'testmode': 'false'})
|
||||
self.event1.refresh_from_db()
|
||||
assert not self.event1.testmode
|
||||
assert Order.objects.filter(pk=o.pk).exists()
|
||||
assert Order.objects.filter(pk=o2.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert Order.objects.filter(pk=o.pk).exists()
|
||||
assert Order.objects.filter(pk=o2.pk).exists()
|
||||
|
||||
def test_testmode_disable_delete(self):
|
||||
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),
|
||||
total=14, locale='en', testmode=True
|
||||
)
|
||||
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'
|
||||
)
|
||||
self.event1.testmode = True
|
||||
self.event1.save()
|
||||
with scopes_disabled():
|
||||
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),
|
||||
total=14, locale='en', testmode=True
|
||||
)
|
||||
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'
|
||||
)
|
||||
self.event1.testmode = True
|
||||
self.event1.save()
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
{'testmode': 'false', 'delete': 'yes'})
|
||||
self.event1.refresh_from_db()
|
||||
assert not self.event1.testmode
|
||||
assert not Order.objects.filter(pk=o.pk).exists()
|
||||
assert Order.objects.filter(pk=o2.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not Order.objects.filter(pk=o.pk).exists()
|
||||
assert Order.objects.filter(pk=o2.pk).exists()
|
||||
|
||||
def test_live_disable(self):
|
||||
self.event1.live = True
|
||||
@@ -309,9 +319,10 @@ class EventsTest(SoupTest):
|
||||
assert not self.event1.live
|
||||
|
||||
def test_live_ok(self):
|
||||
self.event1.items.create(name='Test', default_price=5)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
with scopes_disabled():
|
||||
self.event1.items.create(name='Test', default_price=5)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
|
||||
assert len(doc.select("input[name=live]"))
|
||||
self.post_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug),
|
||||
@@ -320,16 +331,18 @@ class EventsTest(SoupTest):
|
||||
assert self.event1.live
|
||||
|
||||
def test_live_dont_require_payment_method_free(self):
|
||||
self.event1.items.create(name='Test', default_price=0)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', False)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
with scopes_disabled():
|
||||
self.event1.items.create(name='Test', default_price=0)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', False)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
|
||||
assert len(doc.select("input[name=live]"))
|
||||
|
||||
def test_live_require_payment_method(self):
|
||||
self.event1.items.create(name='Test', default_price=5)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', False)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
with scopes_disabled():
|
||||
self.event1.items.create(name='Test', default_price=5)
|
||||
self.event1.settings.set('payment_banktransfer__enabled', False)
|
||||
self.event1.quotas.create(name='Test quota')
|
||||
doc = self.get_doc('/control/event/%s/%s/live/' % (self.orga1.slug, self.event1.slug))
|
||||
assert len(doc.select("input[name=live]")) == 0
|
||||
|
||||
@@ -378,7 +391,8 @@ class EventsTest(SoupTest):
|
||||
self.event1.save(update_fields=['presale_end'])
|
||||
|
||||
def test_payment_settings_relative_date_payment_after_presale_end(self):
|
||||
tr19 = self.event1.tax_rules.create(rate=Decimal('19.00'))
|
||||
with scopes_disabled():
|
||||
tr19 = self.event1.tax_rules.create(rate=Decimal('19.00'))
|
||||
self.event1.presale_end = self.event1.date_from - datetime.timedelta(days=5)
|
||||
self.event1.save(update_fields=['presale_end'])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/payment' % (self.orga1.slug, self.event1.slug), {
|
||||
@@ -578,23 +592,24 @@ class EventsTest(SoupTest):
|
||||
'copy-copy_from_event': ''
|
||||
})
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).exists()
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).exists()
|
||||
|
||||
def test_create_event_with_subevents_success(self):
|
||||
doc = self.get_doc('/control/events/add')
|
||||
@@ -635,20 +650,22 @@ class EventsTest(SoupTest):
|
||||
'event_wizard-prefix': 'event_wizard',
|
||||
'copy-copy_from_event': ''
|
||||
})
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.has_subevents
|
||||
assert ev.subevents.count() == 1
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.has_subevents
|
||||
assert ev.subevents.count() == 1
|
||||
|
||||
def test_create_event_copy_success(self):
|
||||
tr = self.event1.tax_rules.create(
|
||||
rate=19, name="VAT"
|
||||
)
|
||||
self.event1.items.create(
|
||||
name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True
|
||||
)
|
||||
self.event1.settings.tax_rate_default = tr
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(
|
||||
rate=19, name="VAT"
|
||||
)
|
||||
self.event1.items.create(
|
||||
name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True
|
||||
)
|
||||
self.event1.settings.tax_rate_default = tr
|
||||
doc = self.get_doc('/control/events/add')
|
||||
|
||||
doc = self.post_doc('/control/events/add', {
|
||||
@@ -688,34 +705,36 @@ class EventsTest(SoupTest):
|
||||
'copy-copy_from_event': self.event1.pk
|
||||
})
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.items.count() == 1
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.items.count() == 1
|
||||
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
|
||||
|
||||
def test_create_event_clone_success(self):
|
||||
tr = self.event1.tax_rules.create(
|
||||
rate=19, name="VAT"
|
||||
)
|
||||
self.event1.items.create(
|
||||
name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True
|
||||
)
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(
|
||||
rate=19, name="VAT"
|
||||
)
|
||||
self.event1.items.create(
|
||||
name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True
|
||||
)
|
||||
self.event1.settings.tax_rate_default = tr
|
||||
doc = self.get_doc('/control/events/add?clone=' + str(self.event1.pk))
|
||||
tabletext = doc.select("form")[0].text
|
||||
@@ -754,24 +773,25 @@ class EventsTest(SoupTest):
|
||||
|
||||
assert not doc.select("#id_copy-copy_from_event_1")
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.items.count() == 1
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'de': '33C3', 'en': '33C3'})
|
||||
assert ev.settings.locales == ['en', 'de']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'Europe/Berlin'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'de': 'Hamburg', 'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.items.count() == 1
|
||||
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
berlin_tz = timezone('Europe/Berlin')
|
||||
assert ev.date_from == berlin_tz.localize(datetime.datetime(2016, 12, 27, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.date_to == berlin_tz.localize(datetime.datetime(2016, 12, 30, 19, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_start == berlin_tz.localize(datetime.datetime(2016, 11, 1, 10, 0, 0)).astimezone(pytz.utc)
|
||||
assert ev.presale_end == berlin_tz.localize(datetime.datetime(2016, 11, 30, 18, 0, 0)).astimezone(pytz.utc)
|
||||
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
|
||||
assert ev.tax_rules.filter(rate=Decimal('19.00')).count() == 1
|
||||
|
||||
def test_create_event_only_date_from(self):
|
||||
# date_to, presale_start & presale_end are optional fields
|
||||
@@ -806,19 +826,20 @@ class EventsTest(SoupTest):
|
||||
'copy-copy_from_event': ''
|
||||
})
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'en': '33C3'})
|
||||
assert ev.settings.locales == ['en']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'UTC'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
|
||||
assert ev.date_to is None
|
||||
assert ev.presale_start is None
|
||||
assert ev.presale_end is None
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
assert ev.name == LazyI18nString({'en': '33C3'})
|
||||
assert ev.settings.locales == ['en']
|
||||
assert ev.settings.locale == 'en'
|
||||
assert ev.currency == 'EUR'
|
||||
assert ev.settings.timezone == 'UTC'
|
||||
assert ev.organizer == self.orga1
|
||||
assert ev.location == LazyI18nString({'en': 'Hamburg'})
|
||||
assert Team.objects.filter(limit_events=ev, members=self.user).exists()
|
||||
assert ev.date_from == datetime.datetime(2016, 12, 27, 10, 0, 0, tzinfo=pytz.utc)
|
||||
assert ev.date_to is None
|
||||
assert ev.presale_start is None
|
||||
assert ev.presale_end is None
|
||||
|
||||
def test_create_event_missing_date_from(self):
|
||||
# date_from is mandatory
|
||||
@@ -909,6 +930,7 @@ class EventsTest(SoupTest):
|
||||
|
||||
|
||||
class SubEventsTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -967,22 +989,23 @@ class SubEventsTest(SoupTest):
|
||||
'item-%d-price' % self.ticket.pk: '12'
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
se = self.event1.subevents.first()
|
||||
assert str(se.name) == "SE2"
|
||||
assert se.active
|
||||
assert se.date_from.isoformat() == "2017-07-01T10:00:00+00:00"
|
||||
assert se.date_to.isoformat() == "2017-07-01T12:00:00+00:00"
|
||||
assert str(se.location) == "Hamburg"
|
||||
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
|
||||
assert not se.presale_end
|
||||
assert se.quotas.count() == 1
|
||||
q = se.quotas.last()
|
||||
assert q.name == "Q1"
|
||||
assert q.size == 50
|
||||
assert list(q.items.all()) == [self.ticket]
|
||||
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
|
||||
assert sei.price == 12
|
||||
assert se.checkinlist_set.count() == 1
|
||||
with scopes_disabled():
|
||||
se = self.event1.subevents.first()
|
||||
assert str(se.name) == "SE2"
|
||||
assert se.active
|
||||
assert se.date_from.isoformat() == "2017-07-01T10:00:00+00:00"
|
||||
assert se.date_to.isoformat() == "2017-07-01T12:00:00+00:00"
|
||||
assert str(se.location) == "Hamburg"
|
||||
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
|
||||
assert not se.presale_end
|
||||
assert se.quotas.count() == 1
|
||||
q = se.quotas.last()
|
||||
assert q.name == "Q1"
|
||||
assert q.size == 50
|
||||
assert list(q.items.all()) == [self.ticket]
|
||||
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
|
||||
assert sei.price == 12
|
||||
assert se.checkinlist_set.count() == 1
|
||||
|
||||
def test_modify(self):
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/' % self.subevent1.pk)
|
||||
@@ -1022,14 +1045,15 @@ class SubEventsTest(SoupTest):
|
||||
assert str(se.location) == "Hamburg"
|
||||
assert se.presale_start.isoformat() == "2017-06-20T10:00:00+00:00"
|
||||
assert not se.presale_end
|
||||
assert se.quotas.count() == 1
|
||||
q = se.quotas.last()
|
||||
assert q.name == "Q1"
|
||||
assert q.size == 50
|
||||
assert list(q.items.all()) == [self.ticket]
|
||||
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
|
||||
assert sei.price == 12
|
||||
assert se.checkinlist_set.count() == 1
|
||||
with scopes_disabled():
|
||||
assert se.quotas.count() == 1
|
||||
q = se.quotas.last()
|
||||
assert q.name == "Q1"
|
||||
assert q.size == 50
|
||||
assert list(q.items.all()) == [self.ticket]
|
||||
sei = SubEventItem.objects.get(subevent=se, item=self.ticket)
|
||||
assert sei.price == 12
|
||||
assert se.checkinlist_set.count() == 1
|
||||
|
||||
def test_delete(self):
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk)
|
||||
@@ -1039,30 +1063,34 @@ class SubEventsTest(SoupTest):
|
||||
# deleting the second event
|
||||
doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent2.pk, {})
|
||||
assert doc.select(".alert-success")
|
||||
assert not SubEvent.objects.filter(pk=self.subevent2.pk).exists()
|
||||
assert not SubEvent.objects.filter(pk=self.subevent1.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not SubEvent.objects.filter(pk=self.subevent2.pk).exists()
|
||||
assert not SubEvent.objects.filter(pk=self.subevent1.pk).exists()
|
||||
|
||||
def test_delete_with_orders(self):
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.ticket,
|
||||
subevent=self.subevent1,
|
||||
price=Decimal("14"),
|
||||
)
|
||||
with scopes_disabled():
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.ticket,
|
||||
subevent=self.subevent1,
|
||||
price=Decimal("14"),
|
||||
)
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk, follow=True)
|
||||
assert doc.select(".alert-danger")
|
||||
doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk, {}, follow=True)
|
||||
assert doc.select(".alert-danger")
|
||||
assert self.event1.subevents.filter(pk=self.subevent1.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.subevents.filter(pk=self.subevent1.pk).exists()
|
||||
|
||||
def test_create_bulk(self):
|
||||
self.event1.subevents.all().delete()
|
||||
with scopes_disabled():
|
||||
self.event1.subevents.all().delete()
|
||||
self.event1.settings.timezone = 'Europe/Berlin'
|
||||
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
|
||||
@@ -1120,7 +1148,8 @@ class SubEventsTest(SoupTest):
|
||||
'checkinlist_set-0-limit_products': str(self.ticket.pk),
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
with scopes_disabled():
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
assert len(ses) == 10
|
||||
|
||||
assert str(ses[0].name) == "Foo"
|
||||
@@ -1128,25 +1157,28 @@ class SubEventsTest(SoupTest):
|
||||
assert ses[0].date_to.isoformat() == "2018-04-03T13:29:31+00:00"
|
||||
assert not ses[0].presale_start
|
||||
assert ses[0].presale_end.isoformat() == "2018-04-02T11:29:31+00:00"
|
||||
assert ses[0].quotas.count() == 1
|
||||
assert list(ses[0].quotas.first().items.all()) == [self.ticket]
|
||||
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
|
||||
assert ses[0].checkinlist_set.count() == 1
|
||||
with scopes_disabled():
|
||||
assert ses[0].quotas.count() == 1
|
||||
assert list(ses[0].quotas.first().items.all()) == [self.ticket]
|
||||
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
|
||||
assert ses[0].checkinlist_set.count() == 1
|
||||
|
||||
assert str(ses[1].name) == "Foo"
|
||||
assert ses[1].date_from.isoformat() == "2019-04-03T11:29:31+00:00"
|
||||
assert ses[1].date_to.isoformat() == "2019-04-03T13:29:31+00:00"
|
||||
assert not ses[1].presale_start
|
||||
assert ses[1].presale_end.isoformat() == "2019-04-02T11:29:31+00:00"
|
||||
assert ses[1].quotas.count() == 1
|
||||
assert list(ses[1].quotas.first().items.all()) == [self.ticket]
|
||||
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
|
||||
assert ses[1].checkinlist_set.count() == 1
|
||||
with scopes_disabled():
|
||||
assert ses[1].quotas.count() == 1
|
||||
assert list(ses[1].quotas.first().items.all()) == [self.ticket]
|
||||
assert SubEventItem.objects.get(subevent=ses[0], item=self.ticket).price == 16
|
||||
assert ses[1].checkinlist_set.count() == 1
|
||||
|
||||
assert ses[-1].date_from.isoformat() == "2027-04-03T11:29:31+00:00"
|
||||
|
||||
def test_create_bulk_daily_interval(self):
|
||||
self.event1.subevents.all().delete()
|
||||
with scopes_disabled():
|
||||
self.event1.subevents.all().delete()
|
||||
self.event1.settings.timezone = 'Europe/Berlin'
|
||||
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
|
||||
@@ -1194,7 +1226,8 @@ class SubEventsTest(SoupTest):
|
||||
'checkinlist_set-MAX_NUM_FORMS': '1000',
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
with scopes_disabled():
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
assert len(ses) == 183
|
||||
|
||||
assert ses[0].date_from.isoformat() == "2018-04-03T11:29:31+00:00"
|
||||
@@ -1202,7 +1235,8 @@ class SubEventsTest(SoupTest):
|
||||
assert ses[-1].date_from.isoformat() == "2019-04-02T11:29:31+00:00"
|
||||
|
||||
def test_create_bulk_exclude(self):
|
||||
self.event1.subevents.all().delete()
|
||||
with scopes_disabled():
|
||||
self.event1.subevents.all().delete()
|
||||
self.event1.settings.timezone = 'Europe/Berlin'
|
||||
|
||||
doc = self.get_doc('/control/event/ccc/30c3/subevents/bulk_add')
|
||||
@@ -1265,7 +1299,8 @@ class SubEventsTest(SoupTest):
|
||||
'checkinlist_set-MAX_NUM_FORMS': '1000',
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
with scopes_disabled():
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
assert len(ses) == 314
|
||||
|
||||
assert ses[0].date_from.isoformat() == "2018-04-03T11:29:31+00:00"
|
||||
@@ -1273,7 +1308,8 @@ class SubEventsTest(SoupTest):
|
||||
assert ses[6].date_from.isoformat() == "2018-04-10T11:29:31+00:00"
|
||||
|
||||
def test_create_bulk_monthly_interval(self):
|
||||
self.event1.subevents.all().delete()
|
||||
with scopes_disabled():
|
||||
self.event1.subevents.all().delete()
|
||||
self.event1.settings.timezone = 'Europe/Berlin'
|
||||
|
||||
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_add', {
|
||||
@@ -1320,7 +1356,8 @@ class SubEventsTest(SoupTest):
|
||||
'checkinlist_set-MAX_NUM_FORMS': '1000',
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
with scopes_disabled():
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
assert len(ses) == 12
|
||||
|
||||
assert ses[0].date_from.isoformat() == "2018-04-30T11:29:31+00:00"
|
||||
@@ -1328,7 +1365,8 @@ class SubEventsTest(SoupTest):
|
||||
assert ses[-1].date_from.isoformat() == "2019-03-29T12:29:31+00:00"
|
||||
|
||||
def test_create_bulk_weekly_interval(self):
|
||||
self.event1.subevents.all().delete()
|
||||
with scopes_disabled():
|
||||
self.event1.subevents.all().delete()
|
||||
self.event1.settings.timezone = 'Europe/Berlin'
|
||||
|
||||
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_add', {
|
||||
@@ -1375,7 +1413,8 @@ class SubEventsTest(SoupTest):
|
||||
'checkinlist_set-MAX_NUM_FORMS': '1000',
|
||||
})
|
||||
assert doc.select(".alert-success")
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
with scopes_disabled():
|
||||
ses = list(self.event1.subevents.order_by('date_from'))
|
||||
assert len(ses) == 52
|
||||
|
||||
assert ses[0].date_from.isoformat() == "2018-04-05T11:29:31+00:00"
|
||||
@@ -1385,25 +1424,27 @@ class SubEventsTest(SoupTest):
|
||||
def test_delete_bulk(self):
|
||||
self.subevent2.active = True
|
||||
self.subevent2.save()
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.ticket,
|
||||
subevent=self.subevent1,
|
||||
price=Decimal("14"),
|
||||
)
|
||||
with scopes_disabled():
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.ticket,
|
||||
subevent=self.subevent1,
|
||||
price=Decimal("14"),
|
||||
)
|
||||
doc = self.post_doc('/control/event/ccc/30c3/subevents/bulk_action', {
|
||||
'subevent': [str(self.subevent1.pk), str(self.subevent2.pk)],
|
||||
'action': 'delete_confirm'
|
||||
}, follow=True)
|
||||
assert doc.select(".alert-success")
|
||||
assert not self.event1.subevents.filter(pk=self.subevent2.pk).exists()
|
||||
assert self.event1.subevents.get(pk=self.subevent1.pk).active is False
|
||||
with scopes_disabled():
|
||||
assert not self.event1.subevents.filter(pk=self.subevent2.pk).exists()
|
||||
assert self.event1.subevents.get(pk=self.subevent1.pk).active is False
|
||||
|
||||
def test_disable_bulk(self):
|
||||
self.subevent2.active = True
|
||||
@@ -1413,7 +1454,8 @@ class SubEventsTest(SoupTest):
|
||||
'action': 'disable'
|
||||
}, follow=True)
|
||||
assert doc.select(".alert-success")
|
||||
assert self.event1.subevents.get(pk=self.subevent2.pk).active is False
|
||||
with scopes_disabled():
|
||||
assert self.event1.subevents.get(pk=self.subevent2.pk).active is False
|
||||
|
||||
def test_enable_bulk(self):
|
||||
self.subevent2.active = False
|
||||
@@ -1423,10 +1465,12 @@ class SubEventsTest(SoupTest):
|
||||
'action': 'enable'
|
||||
}, follow=True)
|
||||
assert doc.select(".alert-success")
|
||||
assert self.event1.subevents.get(pk=self.subevent2.pk).active is True
|
||||
with scopes_disabled():
|
||||
assert self.event1.subevents.get(pk=self.subevent2.pk).active is True
|
||||
|
||||
|
||||
class EventDeletionTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -1454,21 +1498,24 @@ class EventDeletionTest(SoupTest):
|
||||
'slug': '30c3'
|
||||
})
|
||||
|
||||
assert not self.orga1.events.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.orga1.events.exists()
|
||||
|
||||
def test_delete_wrong_slug(self):
|
||||
self.post_doc('/control/event/ccc/30c3/delete/', {
|
||||
'user_pw': 'dummy',
|
||||
'slug': '31c3'
|
||||
})
|
||||
assert self.orga1.events.exists()
|
||||
with scopes_disabled():
|
||||
assert self.orga1.events.exists()
|
||||
|
||||
def test_delete_wrong_pw(self):
|
||||
self.post_doc('/control/event/ccc/30c3/delete/', {
|
||||
'user_pw': 'invalid',
|
||||
'slug': '30c3'
|
||||
})
|
||||
assert self.orga1.events.exists()
|
||||
with scopes_disabled():
|
||||
assert self.orga1.events.exists()
|
||||
|
||||
def test_delete_orders(self):
|
||||
Order.objects.create(
|
||||
@@ -1481,4 +1528,5 @@ class EventDeletionTest(SoupTest):
|
||||
'user_pw': 'dummy',
|
||||
'slug': '30c3'
|
||||
})
|
||||
assert self.orga1.events.exists()
|
||||
with scopes_disabled():
|
||||
assert self.orga1.events.exists()
|
||||
|
||||
+161
-114
@@ -2,6 +2,7 @@ import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -11,6 +12,7 @@ from pretix.base.models import (
|
||||
|
||||
|
||||
class ItemFormTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -47,11 +49,13 @@ class CategoriesTest(ItemFormTest):
|
||||
assert doc.select(".alert-success")
|
||||
self.assertIn("T-Shirts", doc.select("#page-wrapper table")[0].text)
|
||||
self.assertNotIn("Entry tickets", doc.select("#page-wrapper table")[0].text)
|
||||
assert str(ItemCategory.objects.get(id=c.id).name) == 'T-Shirts'
|
||||
with scopes_disabled():
|
||||
assert str(ItemCategory.objects.get(id=c.id).name) == 'T-Shirts'
|
||||
|
||||
def test_sort(self):
|
||||
c1 = ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0)
|
||||
ItemCategory.objects.create(event=self.event1, name="T-Shirts", position=1)
|
||||
with scopes_disabled():
|
||||
c1 = ItemCategory.objects.create(event=self.event1, name="Entry tickets", position=0)
|
||||
ItemCategory.objects.create(event=self.event1, name="T-Shirts", position=1)
|
||||
doc = self.get_doc('/control/event/%s/%s/categories/' % (self.orga1.slug, self.event1.slug))
|
||||
self.assertIn("Entry tickets", doc.select("table > tbody > tr")[0].text)
|
||||
self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text)
|
||||
@@ -67,14 +71,16 @@ class CategoriesTest(ItemFormTest):
|
||||
self.assertIn("T-Shirts", doc.select("table > tbody > tr")[1].text)
|
||||
|
||||
def test_delete(self):
|
||||
c = ItemCategory.objects.create(event=self.event1, name="Entry tickets")
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event1, name="Entry tickets")
|
||||
doc = self.get_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/categories/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("Entry tickets", doc.select("#page-wrapper")[0].text)
|
||||
assert not ItemCategory.objects.filter(id=c.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not ItemCategory.objects.filter(id=c.id).exists()
|
||||
|
||||
|
||||
class QuestionsTest(ItemFormTest):
|
||||
@@ -90,8 +96,9 @@ class QuestionsTest(ItemFormTest):
|
||||
self.assertIn("shoe size", doc.select("#page-wrapper table")[0].text)
|
||||
|
||||
def test_update_choices(self):
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = c.options.create(answer='Germany')
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = c.options.create(answer='Germany')
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['form-TOTAL_FORMS'] = '1'
|
||||
@@ -104,12 +111,14 @@ class QuestionsTest(ItemFormTest):
|
||||
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
c.refresh_from_db()
|
||||
assert c.options.exists()
|
||||
assert str(c.options.first().answer) == 'England'
|
||||
with scopes_disabled():
|
||||
assert c.options.exists()
|
||||
assert str(c.options.first().answer) == 'England'
|
||||
|
||||
def test_delete_choices(self):
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = c.options.create(answer='Germany')
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = c.options.create(answer='Germany')
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['form-TOTAL_FORMS'] = '1'
|
||||
@@ -123,10 +132,12 @@ class QuestionsTest(ItemFormTest):
|
||||
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
c.refresh_from_db()
|
||||
assert not c.options.exists()
|
||||
with scopes_disabled():
|
||||
assert not c.options.exists()
|
||||
|
||||
def test_add_choices(self):
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['type'] = 'C'
|
||||
@@ -139,12 +150,14 @@ class QuestionsTest(ItemFormTest):
|
||||
form_data['form-0-answer_0'] = 'Germany'
|
||||
self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
c = Question.objects.get(id=c.id)
|
||||
assert c.options.exists()
|
||||
assert str(c.options.first().answer) == 'Germany'
|
||||
with scopes_disabled():
|
||||
c = Question.objects.get(id=c.id)
|
||||
assert c.options.exists()
|
||||
assert str(c.options.first().answer) == 'Germany'
|
||||
|
||||
def test_update(self):
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['items'] = self.item1.id
|
||||
@@ -153,13 +166,15 @@ class QuestionsTest(ItemFormTest):
|
||||
form_data)
|
||||
self.assertIn("How old", doc.select("#page-wrapper table")[0].text)
|
||||
self.assertNotIn("shoe size", doc.select("#page-wrapper table")[0].text)
|
||||
c = Question.objects.get(id=c.id)
|
||||
self.assertTrue(c.required)
|
||||
assert str(Question.objects.get(id=c.id).question) == 'How old are you?'
|
||||
with scopes_disabled():
|
||||
c = Question.objects.get(id=c.id)
|
||||
self.assertTrue(c.required)
|
||||
assert str(Question.objects.get(id=c.id).question) == 'How old are you?'
|
||||
|
||||
def test_sort(self):
|
||||
q1 = Question.objects.create(event=self.event1, question="Vegetarian?", type="N", required=True, position=0)
|
||||
Question.objects.create(event=self.event1, question="Food allergies?", position=1)
|
||||
with scopes_disabled():
|
||||
q1 = Question.objects.create(event=self.event1, question="Vegetarian?", type="N", required=True, position=0)
|
||||
Question.objects.create(event=self.event1, question="Food allergies?", position=1)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/' % (self.orga1.slug, self.event1.slug))
|
||||
self.assertIn("Vegetarian?", doc.select("table > tbody > tr")[0].text)
|
||||
self.assertIn("Food allergies?", doc.select("table > tbody > tr")[1].text)
|
||||
@@ -175,32 +190,35 @@ class QuestionsTest(ItemFormTest):
|
||||
self.assertIn("Food allergies?", doc.select("table > tbody > tr")[1].text)
|
||||
|
||||
def test_delete(self):
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/questions/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("shoe size", doc.select("#page-wrapper")[0].text)
|
||||
assert not Question.objects.filter(id=c.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not Question.objects.filter(id=c.id).exists()
|
||||
|
||||
def test_question_view(self):
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
with scopes_disabled():
|
||||
c = Question.objects.create(event=self.event1, question="What is your shoe size?", type="N", required=True)
|
||||
|
||||
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0, position=1)
|
||||
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),
|
||||
total=14, locale='en')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Peter"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Michael"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Petra"})
|
||||
op.answers.create(question=c, answer='39')
|
||||
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0, position=1)
|
||||
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),
|
||||
total=14, locale='en')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Peter"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Michael"})
|
||||
op.answers.create(question=c, answer='42')
|
||||
op = OrderPosition.objects.create(order=o, item=item1, variation=None, price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Petra"})
|
||||
op.answers.create(question=c, answer='39')
|
||||
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
tbl = doc.select('.container-fluid table.table-bordered tbody')[0]
|
||||
@@ -219,9 +237,10 @@ class QuestionsTest(ItemFormTest):
|
||||
assert tbl.select('tr')[0].select('td')[0].text.strip() == '42'
|
||||
|
||||
def test_set_dependency(self):
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
|
||||
o1 = q1.options.create(answer='Germany')
|
||||
with scopes_disabled():
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
|
||||
o1 = q1.options.create(answer='Germany')
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['items'] = self.item1.id
|
||||
@@ -235,10 +254,11 @@ class QuestionsTest(ItemFormTest):
|
||||
assert q2.dependency_value == o1.identifier
|
||||
|
||||
def test_set_dependency_circular(self):
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = q1.options.create(answer='Germany')
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
|
||||
dependency_question=q1, dependency_value=o1.identifier)
|
||||
with scopes_disabled():
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="C", required=True)
|
||||
o1 = q1.options.create(answer='Germany')
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="C", required=True,
|
||||
dependency_question=q1, dependency_value=o1.identifier)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q1.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['dependency_question'] = q2.pk
|
||||
@@ -248,8 +268,9 @@ class QuestionsTest(ItemFormTest):
|
||||
assert not doc.select(".alert-success")
|
||||
|
||||
def test_set_dependency_to_non_choice(self):
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
|
||||
with scopes_disabled():
|
||||
q1 = Question.objects.create(event=self.event1, question="What country are you from?", type="N", required=True)
|
||||
q2 = Question.objects.create(event=self.event1, question="What city are you from?", type="T", required=True)
|
||||
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q2.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['dependency_question'] = q1.pk
|
||||
@@ -271,11 +292,12 @@ class QuotaTest(ItemFormTest):
|
||||
self.assertIn("Full house", doc.select("#page-wrapper table")[0].text)
|
||||
|
||||
def test_update(self):
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
|
||||
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0)
|
||||
item2 = Item.objects.create(event=self.event1, name="Business", default_price=0)
|
||||
ItemVariation.objects.create(item=item2, value="Silver")
|
||||
ItemVariation.objects.create(item=item2, value="Gold")
|
||||
with scopes_disabled():
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
|
||||
item1 = Item.objects.create(event=self.event1, name="Standard", default_price=0)
|
||||
item2 = Item.objects.create(event=self.event1, name="Business", default_price=0)
|
||||
ItemVariation.objects.create(item=item2, value="Silver")
|
||||
ItemVariation.objects.create(item=item2, value="Gold")
|
||||
doc = self.get_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
[i for i in doc.select('[name=itemvars]') if i.get('value') == str(item1.id)][0]['checked'] = 'checked'
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
@@ -285,35 +307,41 @@ class QuotaTest(ItemFormTest):
|
||||
doc = self.get_doc('/control/event/%s/%s/quotas/' % (self.orga1.slug, self.event1.slug))
|
||||
self.assertIn("350", doc.select("#page-wrapper table")[0].text)
|
||||
self.assertNotIn("500", doc.select("#page-wrapper table")[0].text)
|
||||
assert Quota.objects.get(id=c.id).size == 350
|
||||
assert item1 in Quota.objects.get(id=c.id).items.all()
|
||||
with scopes_disabled():
|
||||
assert Quota.objects.get(id=c.id).size == 350
|
||||
assert item1 in Quota.objects.get(id=c.id).items.all()
|
||||
|
||||
def test_update_subevent(self):
|
||||
self.event1.has_subevents = True
|
||||
self.event1.save()
|
||||
se1 = self.event1.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event1.subevents.create(name="Bar", date_from=now())
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500, subevent=se1)
|
||||
with scopes_disabled():
|
||||
se1 = self.event1.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event1.subevents.create(name="Bar", date_from=now())
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500, subevent=se1)
|
||||
doc = self.get_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['subevent'] = se2.pk
|
||||
self.post_doc('/control/event/%s/%s/quotas/%s/change' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
assert Quota.objects.get(id=c.id).subevent == se2
|
||||
with scopes_disabled():
|
||||
assert Quota.objects.get(id=c.id).subevent == se2
|
||||
|
||||
def test_delete(self):
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
|
||||
with scopes_disabled():
|
||||
c = Quota.objects.create(event=self.event1, name="Full house", size=500)
|
||||
doc = self.get_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/quotas/%s/delete' % (self.orga1.slug, self.event1.slug, c.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("Full house", doc.select("#page-wrapper")[0].text)
|
||||
assert not Quota.objects.filter(id=c.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not Quota.objects.filter(id=c.id).exists()
|
||||
|
||||
|
||||
class ItemsTest(ItemFormTest):
|
||||
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.item2 = Item.objects.create(event=self.event1, name="Business", default_price=0, position=2,
|
||||
@@ -341,7 +369,7 @@ class ItemsTest(ItemFormTest):
|
||||
'tax_rate': '19.00'
|
||||
})
|
||||
resp = self.client.get('/control/event/%s/%s/items/' % (self.orga1.slug, self.event1.slug))
|
||||
assert 'T-Shirt' in resp.rendered_content
|
||||
assert 'T-Shirt' in resp.content.decode()
|
||||
|
||||
def test_update(self):
|
||||
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
|
||||
@@ -366,20 +394,23 @@ class ItemsTest(ItemFormTest):
|
||||
'form-0-min_count': '1',
|
||||
'form-0-max_count': '2',
|
||||
})
|
||||
assert self.item2.addons.exists()
|
||||
assert self.item2.addons.first().addon_category == self.addoncat
|
||||
with scopes_disabled():
|
||||
assert self.item2.addons.exists()
|
||||
assert self.item2.addons.first().addon_category == self.addoncat
|
||||
a = self.item2.addons.first()
|
||||
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
'form-TOTAL_FORMS': '1',
|
||||
'form-INITIAL_FORMS': '1',
|
||||
'form-MIN_NUM_FORMS': '0',
|
||||
'form-MAX_NUM_FORMS': '1000',
|
||||
'form-0-id': str(self.item2.addons.first().pk),
|
||||
'form-0-id': str(a.pk),
|
||||
'form-0-addon_category': str(self.addoncat.pk),
|
||||
'form-0-min_count': '1',
|
||||
'form-0-max_count': '2',
|
||||
'form-0-DELETE': 'on',
|
||||
})
|
||||
assert not self.item2.addons.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.addons.exists()
|
||||
|
||||
# Do not allow duplicates
|
||||
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
@@ -396,7 +427,8 @@ class ItemsTest(ItemFormTest):
|
||||
'form-1-min_count': '1',
|
||||
'form-1-max_count': '2',
|
||||
})
|
||||
assert not self.item2.addons.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.addons.exists()
|
||||
|
||||
def test_manipulate_bundles(self):
|
||||
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
@@ -409,8 +441,9 @@ class ItemsTest(ItemFormTest):
|
||||
'form-0-count': '2',
|
||||
'form-0-designated_price': '2.00',
|
||||
})
|
||||
assert self.item2.bundles.exists()
|
||||
assert self.item2.bundles.first().bundled_item == self.item1
|
||||
with scopes_disabled():
|
||||
assert self.item2.bundles.exists()
|
||||
assert self.item2.bundles.first().bundled_item == self.item1
|
||||
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
'form-TOTAL_FORMS': '1',
|
||||
'form-INITIAL_FORMS': '1',
|
||||
@@ -422,7 +455,8 @@ class ItemsTest(ItemFormTest):
|
||||
'form-0-designated_price': '2.00',
|
||||
'form-0-DELETE': 'on',
|
||||
})
|
||||
assert not self.item2.bundles.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.bundles.exists()
|
||||
|
||||
# Do not allow self-reference
|
||||
self.client.post('/control/event/%s/%s/items/%d/addons' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
@@ -435,10 +469,12 @@ class ItemsTest(ItemFormTest):
|
||||
'form-0-count': '2',
|
||||
'form-0-designated_price': '2.00',
|
||||
})
|
||||
assert not self.item2.bundles.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.bundles.exists()
|
||||
|
||||
# Do not allow multi-level bundles
|
||||
self.item1.bundles.create(bundled_item=self.item1, count=1, designated_price=0)
|
||||
with scopes_disabled():
|
||||
self.item1.bundles.create(bundled_item=self.item1, count=1, designated_price=0)
|
||||
self.client.post('/control/event/%s/%s/items/%d/bundles' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
'form-TOTAL_FORMS': '1',
|
||||
'form-INITIAL_FORMS': '0',
|
||||
@@ -449,7 +485,8 @@ class ItemsTest(ItemFormTest):
|
||||
'form-0-count': '2',
|
||||
'form-0-designated_price': '2.00',
|
||||
})
|
||||
assert not self.item2.bundles.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.bundles.exists()
|
||||
|
||||
def test_update_variations(self):
|
||||
self.client.post('/control/event/%s/%s/items/%d/variations' % (self.orga1.slug, self.event1.slug, self.item2.id), {
|
||||
@@ -491,39 +528,45 @@ class ItemsTest(ItemFormTest):
|
||||
'active': 'yes',
|
||||
'allow_cancel': 'yes'
|
||||
})
|
||||
assert not self.item2.variations.filter(pk=self.var2.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not self.item2.variations.filter(pk=self.var2.pk).exists()
|
||||
|
||||
def test_delete(self):
|
||||
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item1.id),
|
||||
{})
|
||||
assert not self.event1.items.filter(pk=self.item1.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not self.event1.items.filter(pk=self.item1.pk).exists()
|
||||
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item2.id),
|
||||
{})
|
||||
assert not self.event1.items.filter(pk=self.item2.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert not self.event1.items.filter(pk=self.item2.pk).exists()
|
||||
|
||||
def test_delete_ordered(self):
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.item1,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Peter"}
|
||||
)
|
||||
with scopes_disabled():
|
||||
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),
|
||||
total=14, locale='en'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o,
|
||||
item=self.item1,
|
||||
variation=None,
|
||||
price=Decimal("14"),
|
||||
attendee_name_parts={'full_name': "Peter"}
|
||||
)
|
||||
self.client.post('/control/event/%s/%s/items/%d/delete' % (self.orga1.slug, self.event1.slug, self.item1.id),
|
||||
{})
|
||||
assert self.event1.items.filter(pk=self.item1.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.items.filter(pk=self.item1.pk).exists()
|
||||
self.item1.refresh_from_db()
|
||||
assert not self.item1.active
|
||||
|
||||
def test_create_copy(self):
|
||||
q = Question.objects.create(event=self.event1, question="Size", type="N")
|
||||
q.items.add(self.item2)
|
||||
with scopes_disabled():
|
||||
q = Question.objects.create(event=self.event1, question="Size", type="N")
|
||||
q.items.add(self.item2)
|
||||
self.item2.sales_channels = ["web", "bar"]
|
||||
|
||||
self.client.post('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), {
|
||||
@@ -533,22 +576,24 @@ class ItemsTest(ItemFormTest):
|
||||
'copy_from': str(self.item2.pk),
|
||||
'has_variations': '1'
|
||||
})
|
||||
i_old = Item.objects.get(name__icontains='Business')
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert i_new.category == i_old.category
|
||||
assert i_new.description == i_old.description
|
||||
assert i_new.active == i_old.active
|
||||
assert i_new.available_from == i_old.available_from
|
||||
assert i_new.available_until == i_old.available_until
|
||||
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.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()])
|
||||
with scopes_disabled():
|
||||
i_old = Item.objects.get(name__icontains='Business')
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert i_new.category == i_old.category
|
||||
assert i_new.description == i_old.description
|
||||
assert i_new.active == i_old.active
|
||||
assert i_new.available_from == i_old.available_from
|
||||
assert i_new.available_until == i_old.available_until
|
||||
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.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()])
|
||||
|
||||
def test_add_to_existing_quota(self):
|
||||
q = Quota.objects.create(event=self.event1, name="New Test Quota", size=50)
|
||||
with scopes_disabled():
|
||||
q = Quota.objects.create(event=self.event1, name="New Test Quota", size=50)
|
||||
|
||||
doc = self.get_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
@@ -558,10 +603,11 @@ class ItemsTest(ItemFormTest):
|
||||
form_data['quota_add_existing'] = str(q.pk)
|
||||
doc = self.post_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), form_data)
|
||||
|
||||
i = Item.objects.get(name__icontains='Existing')
|
||||
with scopes_disabled():
|
||||
i = Item.objects.get(name__icontains='Existing')
|
||||
|
||||
assert doc.select(".alert-success")
|
||||
assert q.items.filter(pk=i.pk).exists()
|
||||
assert doc.select(".alert-success")
|
||||
assert q.items.filter(pk=i.pk).exists()
|
||||
|
||||
def test_add_to_new_quota(self):
|
||||
doc = self.get_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug))
|
||||
@@ -574,8 +620,9 @@ class ItemsTest(ItemFormTest):
|
||||
doc = self.post_doc('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), form_data)
|
||||
|
||||
assert doc.select(".alert-success")
|
||||
assert Quota.objects.filter(name__icontains='New Quota').exists()
|
||||
assert Item.objects.filter(name__icontains='New Item').exists()
|
||||
i = Item.objects.get(name__icontains='New Item')
|
||||
q = Quota.objects.get(name__icontains='New Quota')
|
||||
assert q.items.filter(pk=i.pk).exists()
|
||||
with scopes_disabled():
|
||||
assert Quota.objects.filter(name__icontains='New Quota').exists()
|
||||
assert Item.objects.filter(name__icontains='New Item').exists()
|
||||
i = Item.objects.get(name__icontains='New Item')
|
||||
q = Quota.objects.get(name__icontains='New Quota')
|
||||
assert q.items.filter(pk=i.pk).exists()
|
||||
|
||||
+574
-463
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,13 @@
|
||||
import datetime
|
||||
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import Event, Organizer, Team, User
|
||||
|
||||
|
||||
class OrganizerTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
|
||||
@@ -2,6 +2,7 @@ import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -10,6 +11,7 @@ from pretix.base.models import (
|
||||
|
||||
|
||||
class OrderSearchTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -67,21 +69,21 @@ class OrderSearchTest(SoupTest):
|
||||
self.client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
def test_team_limit_event(self):
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' in resp
|
||||
assert 'FO2' not in resp
|
||||
|
||||
def test_team_limit_event_wrong_permission(self):
|
||||
self.team.can_view_orders = False
|
||||
self.team.save()
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
assert 'FO2' not in resp
|
||||
|
||||
def test_team_all_events(self):
|
||||
self.team.all_events = True
|
||||
self.team.save()
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' in resp
|
||||
assert 'FO2' in resp
|
||||
|
||||
@@ -89,13 +91,13 @@ class OrderSearchTest(SoupTest):
|
||||
self.team.all_events = True
|
||||
self.team.can_view_orders = False
|
||||
self.team.save()
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
assert 'FO2' not in resp
|
||||
|
||||
def test_team_none(self):
|
||||
self.team.members.clear()
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
assert 'FO2' not in resp
|
||||
|
||||
@@ -104,44 +106,44 @@ class OrderSearchTest(SoupTest):
|
||||
self.user.staffsession_set.create(date_start=now(), session_key=self.client.session.session_key)
|
||||
self.user.save()
|
||||
self.team.members.clear()
|
||||
resp = self.client.get('/control/search/orders/').rendered_content
|
||||
resp = self.client.get('/control/search/orders/').content.decode()
|
||||
assert 'FO1' in resp
|
||||
assert 'FO2' in resp
|
||||
|
||||
def test_filter_email(self):
|
||||
resp = self.client.get('/control/search/orders/?query=dummy1@dummy').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=dummy1@dummy').content.decode()
|
||||
assert 'FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=dummynope').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=dummynope').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
|
||||
def test_filter_attendee_name(self):
|
||||
resp = self.client.get('/control/search/orders/?query=Pete').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=Pete').content.decode()
|
||||
assert 'FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=Mark').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=Mark').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
|
||||
def test_filter_attendee_email(self):
|
||||
resp = self.client.get('/control/search/orders/?query=att.com').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=att.com').content.decode()
|
||||
assert 'FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=nope.com').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=nope.com').content.decode()
|
||||
assert 'FO1' not in resp
|
||||
|
||||
def test_filter_invoice_address(self):
|
||||
resp = self.client.get('/control/search/orders/?query=Ltd').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=Ltd').content.decode()
|
||||
assert 'FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=Miller').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=Miller').content.decode()
|
||||
assert 'FO1' in resp
|
||||
|
||||
def test_filter_code(self):
|
||||
resp = self.client.get('/control/search/orders/?query=FO1').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=FO1').content.decode()
|
||||
assert '30C3-FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=30c3-FO1').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=30c3-FO1').content.decode()
|
||||
assert '30C3-FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=30C3-fO1A').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=30C3-fO1A').content.decode()
|
||||
assert '30C3-FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=30C3-fo14').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=30C3-fo14').content.decode()
|
||||
assert '30C3-FO1' in resp
|
||||
resp = self.client.get('/control/search/orders/?query=31c3-FO1').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=31c3-FO1').content.decode()
|
||||
assert '30C3-FO1' not in resp
|
||||
resp = self.client.get('/control/search/orders/?query=FO2').rendered_content
|
||||
resp = self.client.get('/control/search/orders/?query=FO2').content.decode()
|
||||
assert '30C3-FO1' not in resp
|
||||
|
||||
@@ -2,12 +2,14 @@ import datetime
|
||||
import json
|
||||
import re
|
||||
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest
|
||||
|
||||
from pretix.base.models import Event, Organizer, Team, User
|
||||
|
||||
|
||||
class MailSettingPreviewTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
self.orga1 = Organizer.objects.create(name='CCC', slug='ccc')
|
||||
@@ -32,10 +34,11 @@ class MailSettingPreviewTest(SoupTest):
|
||||
self.target = '/control/event/{}/{}/settings/email/preview'
|
||||
|
||||
def test_permission(self):
|
||||
self.event2 = Event.objects.create(
|
||||
organizer=self.orga2, name='30M3', slug='30m3',
|
||||
date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc),
|
||||
)
|
||||
with scopes_disabled():
|
||||
self.event2 = Event.objects.create(
|
||||
organizer=self.orga2, name='30M3', slug='30m3',
|
||||
date_from=datetime.datetime(2013, 12, 26, tzinfo=datetime.timezone.utc),
|
||||
)
|
||||
response = self.client.post(self.target.format(
|
||||
self.orga2.slug, self.event2.slug), {
|
||||
'test': 'test1'
|
||||
|
||||
@@ -4,12 +4,14 @@ from io import BytesIO
|
||||
from zipfile import ZipFile
|
||||
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest
|
||||
|
||||
from pretix.base.models import Event, Order, Organizer, Team, User
|
||||
|
||||
|
||||
class EventShredderTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
|
||||
@@ -2,6 +2,7 @@ import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import Event, Order, Organizer, Team, User
|
||||
@@ -9,6 +10,7 @@ from pretix.base.models.orders import OrderFee
|
||||
|
||||
|
||||
class TaxRateFormTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -32,12 +34,14 @@ class TaxRateFormTest(SoupTest):
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/add' % (self.orga1.slug, self.event1.slug), form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertIn("VAT", doc.select("#page-wrapper table")[0].text)
|
||||
assert self.event1.tax_rules.get(
|
||||
rate=19, price_includes_tax=True, eu_reverse_charge=False
|
||||
)
|
||||
with scopes_disabled():
|
||||
assert self.event1.tax_rules.get(
|
||||
rate=19, price_includes_tax=True, eu_reverse_charge=False
|
||||
)
|
||||
|
||||
def test_update(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data['rate'] = '20.00'
|
||||
@@ -48,67 +52,77 @@ class TaxRateFormTest(SoupTest):
|
||||
assert tr.rate == Decimal('20.00')
|
||||
|
||||
def test_delete(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert not self.event1.tax_rules.exists()
|
||||
with scopes_disabled():
|
||||
assert not self.event1.tax_rules.exists()
|
||||
|
||||
def test_delete_item_existing(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
self.event1.items.create(name="foo", default_price=12, tax_rule=tr)
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
self.event1.items.create(name="foo", default_price=12, tax_rule=tr)
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
|
||||
form_data)
|
||||
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.tax_rules.exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.tax_rules.exists()
|
||||
|
||||
def test_delete_default_rule(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
self.event1.settings.tax_rate_default = tr
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
|
||||
form_data)
|
||||
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.tax_rules.exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.tax_rules.exists()
|
||||
|
||||
def test_delete_fee_existing(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
o = self.event1.orders.create(
|
||||
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',
|
||||
)
|
||||
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)
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
o = self.event1.orders.create(
|
||||
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',
|
||||
)
|
||||
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)
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
|
||||
form_data)
|
||||
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.tax_rules.exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.tax_rules.exists()
|
||||
|
||||
def test_delete_orderpos_existing(self):
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
i = self.event1.items.create(name="foo", default_price=12)
|
||||
o = self.event1.orders.create(
|
||||
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'
|
||||
)
|
||||
o.positions.create(
|
||||
item=i, price=12, tax_rule=tr, tax_rate=19, tax_value=12 - 12 / 1.19
|
||||
)
|
||||
with scopes_disabled():
|
||||
tr = self.event1.tax_rules.create(rate=19, name="VAT")
|
||||
i = self.event1.items.create(name="foo", default_price=12)
|
||||
o = self.event1.orders.create(
|
||||
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'
|
||||
)
|
||||
o.positions.create(
|
||||
item=i, price=12, tax_rule=tr, tax_rate=19, tax_value=12 - 12 / 1.19
|
||||
)
|
||||
doc = self.get_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/settings/tax/%s/delete' % (self.orga1.slug, self.event1.slug, tr.id),
|
||||
form_data)
|
||||
self.assertIn("VAT", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.tax_rules.exists()
|
||||
with scopes_disabled():
|
||||
assert self.event1.tax_rules.exists()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import pytest
|
||||
from django.core import mail as djmail
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import Event, Organizer, Team, User
|
||||
|
||||
@@ -35,15 +36,15 @@ def admin_user(admin_team):
|
||||
def test_list_of_teams(event, admin_user, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
resp = client.get('/control/organizer/dummy/teams')
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_team_detail_view(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
resp = client.get('/control/organizer/dummy/team/{}/'.format(admin_team.pk))
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -55,10 +56,11 @@ def test_team_add_user(event, admin_user, admin_team, client):
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'user': u.email
|
||||
}, follow=True)
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert u.email in resp.rendered_content
|
||||
assert u in admin_team.members.all()
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
assert u.email in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert u in admin_team.members.all()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -69,10 +71,11 @@ def test_team_create_invite(event, admin_user, admin_team, client):
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'user': 'foo@example.org'
|
||||
}, follow=True)
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert 'foo@example.org' in resp.rendered_content
|
||||
assert admin_team.invites.first().email == 'foo@example.org'
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
assert 'foo@example.org' in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_team.invites.first().email == 'foo@example.org'
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
|
||||
@@ -84,21 +87,23 @@ def test_team_create_token(event, admin_user, admin_team, client):
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'name': 'Test token'
|
||||
}, follow=True)
|
||||
assert 'Test token' in resp.rendered_content
|
||||
assert admin_team.tokens.first().name == 'Test token'
|
||||
assert admin_team.tokens.first().token in resp.rendered_content
|
||||
assert 'Test token' in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_team.tokens.first().name == 'Test token'
|
||||
assert admin_team.tokens.first().token in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_team_remove_token(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
tk = admin_team.tokens.create(name='Test token')
|
||||
with scopes_disabled():
|
||||
tk = admin_team.tokens.create(name='Test token')
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-token': str(tk.pk)
|
||||
}, follow=True)
|
||||
assert tk.token not in resp.rendered_content
|
||||
assert 'Test token' in resp.rendered_content
|
||||
assert tk.token not in resp.content.decode()
|
||||
assert 'Test token' in resp.content.decode()
|
||||
tk.refresh_from_db()
|
||||
assert not tk.active
|
||||
|
||||
@@ -112,9 +117,9 @@ def test_team_resend_invite(event, admin_user, admin_team, client):
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'resend-invite': str(inv.pk)
|
||||
}, follow=True)
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert 'foo@example.org' in resp.rendered_content
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
assert 'foo@example.org' in resp.content.decode()
|
||||
assert len(djmail.outbox) == 1
|
||||
|
||||
|
||||
@@ -122,13 +127,15 @@ def test_team_resend_invite(event, admin_user, admin_team, client):
|
||||
def test_team_revoke_invite(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
inv = admin_team.invites.create(email='foo@example.org')
|
||||
with scopes_disabled():
|
||||
inv = admin_team.invites.create(email='foo@example.org')
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-invite': str(inv.pk)
|
||||
}, follow=True)
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert not admin_team.invites.exists()
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert not admin_team.invites.exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -136,14 +143,16 @@ def test_team_remove_user(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
|
||||
admin_team.members.add(u)
|
||||
with scopes_disabled():
|
||||
admin_team.members.add(u)
|
||||
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-member': u.pk
|
||||
}, follow=True)
|
||||
assert 'Admin team' in resp.rendered_content
|
||||
assert admin_user.email in resp.rendered_content
|
||||
assert u not in admin_team.members.all()
|
||||
assert 'Admin team' in resp.content.decode()
|
||||
assert admin_user.email in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert u not in admin_team.members.all()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -153,30 +162,34 @@ def test_team_remove_last_admin(event, admin_user, admin_team, client):
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-member': admin_user.pk
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in resp.rendered_content
|
||||
assert admin_user in admin_team.members.all()
|
||||
assert 'alert-danger' in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_user in admin_team.members.all()
|
||||
|
||||
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-member': admin_user.pk
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in resp.rendered_content
|
||||
assert admin_user in admin_team.members.all()
|
||||
assert 'alert-danger' in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_user in admin_team.members.all()
|
||||
|
||||
t2.members.add(admin_user)
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-member': admin_user.pk
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in resp.rendered_content
|
||||
assert admin_user in admin_team.members.all()
|
||||
assert 'alert-danger' in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_user in admin_team.members.all()
|
||||
|
||||
t2.can_change_teams = True
|
||||
t2.save()
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'remove-member': admin_user.pk
|
||||
}, follow=True)
|
||||
assert 'alert-danger' not in resp.rendered_content
|
||||
assert admin_user not in admin_team.members.all()
|
||||
assert 'alert-danger' not in resp.content.decode()
|
||||
with scopes_disabled():
|
||||
assert admin_user not in admin_team.members.all()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -188,12 +201,13 @@ def test_create_team(event, admin_user, admin_team, client):
|
||||
'limit_events': str(event.pk),
|
||||
'can_change_event_settings': 'on'
|
||||
}, follow=True)
|
||||
t = Team.objects.last()
|
||||
assert t.can_change_event_settings
|
||||
assert t.can_create_events
|
||||
assert not t.can_change_organizer_settings
|
||||
assert list(t.limit_events.all()) == [event]
|
||||
assert list(t.members.all()) == [admin_user]
|
||||
with scopes_disabled():
|
||||
t = Team.objects.last()
|
||||
assert t.can_change_event_settings
|
||||
assert t.can_create_events
|
||||
assert not t.can_change_organizer_settings
|
||||
assert list(t.limit_events.all()) == [event]
|
||||
assert list(t.members.all()) == [admin_user]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -208,7 +222,8 @@ def test_update_team(event, admin_user, admin_team, client):
|
||||
admin_team.refresh_from_db()
|
||||
assert admin_team.can_change_event_settings
|
||||
assert not admin_team.can_change_organizer_settings
|
||||
assert list(admin_team.limit_events.all()) == [event]
|
||||
with scopes_disabled():
|
||||
assert list(admin_team.limit_events.all()) == [event]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -218,17 +233,19 @@ def test_update_last_team_to_be_no_admin(event, admin_user, admin_team, client):
|
||||
'name': 'Admin',
|
||||
'can_change_event_settings': 'on'
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in resp.rendered_content
|
||||
assert 'alert-danger' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_remove_team(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
|
||||
with scopes_disabled():
|
||||
t2 = Team.objects.create(organizer=event.organizer, name='Admin team 2')
|
||||
resp = client.post('/control/organizer/dummy/team/{}/delete'.format(t2.pk), {}, follow=True)
|
||||
assert Team.objects.count() == 1
|
||||
assert 'alert-success' in resp.rendered_content
|
||||
with scopes_disabled():
|
||||
assert Team.objects.count() == 1
|
||||
assert 'alert-success' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -236,8 +253,9 @@ def test_remove_last_admin_team(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
resp = client.post('/control/organizer/dummy/team/{}/delete'.format(admin_team.pk), {}, follow=True)
|
||||
assert Team.objects.count() == 1
|
||||
assert 'alert-danger' in resp.rendered_content
|
||||
with scopes_disabled():
|
||||
assert Team.objects.count() == 1
|
||||
assert 'alert-danger' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -245,7 +263,8 @@ def test_resend_invalid_invite(event, admin_user, admin_team, client):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
djmail.outbox = []
|
||||
|
||||
inv = admin_team.invites.create(email='foo@example.org')
|
||||
with scopes_disabled():
|
||||
inv = admin_team.invites.create(email='foo@example.org')
|
||||
resp = client.post('/control/organizer/dummy/team/{}/'.format(admin_team.pk), {
|
||||
'resend-invite': inv.pk + 1
|
||||
}, follow=True)
|
||||
@@ -256,7 +275,8 @@ def test_resend_invalid_invite(event, admin_user, admin_team, client):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_invite_invalid_token(event, admin_team, client):
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
with scopes_disabled():
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
resp = client.get('/control/invite/foo{}bar'.format(i.token), follow=True)
|
||||
assert b'alert-danger' in resp.content
|
||||
assert b'invalid link' in resp.content
|
||||
@@ -265,9 +285,10 @@ def test_invite_invalid_token(event, admin_team, client):
|
||||
@pytest.mark.django_db
|
||||
def test_invite_existing_team_member(event, admin_team, client):
|
||||
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
|
||||
admin_team.members.add(u)
|
||||
client.login(email='dummy2@dummy.dummy', password='dummy')
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
with scopes_disabled():
|
||||
admin_team.members.add(u)
|
||||
client.login(email='dummy2@dummy.dummy', password='dummy')
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
|
||||
assert b'alert-danger' in resp.content
|
||||
assert b'already are part of' in resp.content
|
||||
@@ -277,16 +298,19 @@ def test_invite_existing_team_member(event, admin_team, client):
|
||||
def test_invite_authenticated(event, admin_team, client):
|
||||
u = User.objects.create_user('dummy2@dummy.dummy', 'dummy')
|
||||
client.login(email='dummy2@dummy.dummy', password='dummy')
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
with scopes_disabled():
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
|
||||
assert b'alert-success' in resp.content
|
||||
assert u in admin_team.members.all()
|
||||
assert not admin_team.invites.exists()
|
||||
with scopes_disabled():
|
||||
assert u in admin_team.members.all()
|
||||
assert not admin_team.invites.exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_invite_new_user(event, admin_team, client):
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
with scopes_disabled():
|
||||
i = admin_team.invites.create(email='foo@bar.com')
|
||||
resp = client.get('/control/invite/{}'.format(i.token), follow=True)
|
||||
assert b'<form' in resp.content
|
||||
resp = client.post('/control/invite/{}'.format(i.token), {
|
||||
@@ -296,5 +320,6 @@ def test_invite_new_user(event, admin_team, client):
|
||||
}, follow=True)
|
||||
|
||||
assert b'alert-success' in resp.content
|
||||
assert admin_team.members.filter(email='dummy@example.org').exists()
|
||||
assert not admin_team.invites.exists()
|
||||
with scopes_disabled():
|
||||
assert admin_team.members.filter(email='dummy@example.org').exists()
|
||||
assert not admin_team.invites.exists()
|
||||
|
||||
@@ -146,14 +146,14 @@ class UserSettings2FATest(SoupTest):
|
||||
|
||||
def test_enable_require_device(self):
|
||||
r = self.client.post('/control/settings/2fa/enable', follow=True)
|
||||
assert 'alert-danger' in r.rendered_content
|
||||
assert 'alert-danger' in r.content.decode()
|
||||
self.user.refresh_from_db()
|
||||
assert not self.user.require_2fa
|
||||
|
||||
def test_enable(self):
|
||||
U2FDevice.objects.create(user=self.user, name='Test')
|
||||
r = self.client.post('/control/settings/2fa/enable', follow=True)
|
||||
assert 'alert-success' in r.rendered_content
|
||||
assert 'alert-success' in r.content.decode()
|
||||
self.user.refresh_from_db()
|
||||
assert self.user.require_2fa
|
||||
|
||||
@@ -161,7 +161,7 @@ class UserSettings2FATest(SoupTest):
|
||||
self.user.require_2fa = True
|
||||
self.user.save()
|
||||
r = self.client.post('/control/settings/2fa/disable', follow=True)
|
||||
assert 'alert-success' in r.rendered_content
|
||||
assert 'alert-success' in r.content.decode()
|
||||
self.user.refresh_from_db()
|
||||
assert not self.user.require_2fa
|
||||
|
||||
@@ -192,7 +192,7 @@ class UserSettings2FATest(SoupTest):
|
||||
'devicetype': 'u2f',
|
||||
'name': 'Foo'
|
||||
})
|
||||
assert 'alert-danger' in r.rendered_content
|
||||
assert 'alert-danger' in r.content.decode()
|
||||
|
||||
def test_create_u2f(self):
|
||||
with mocker_context() as mocker:
|
||||
@@ -227,7 +227,7 @@ class UserSettings2FATest(SoupTest):
|
||||
}, follow=True)
|
||||
d.refresh_from_db()
|
||||
assert d.confirmed
|
||||
assert 'alert-success' in r.rendered_content
|
||||
assert 'alert-success' in r.content.decode()
|
||||
self.user.refresh_from_db()
|
||||
assert self.user.require_2fa
|
||||
|
||||
@@ -242,7 +242,7 @@ class UserSettings2FATest(SoupTest):
|
||||
r = self.client.post('/control/settings/2fa/totp/{}/confirm'.format(d.pk), {
|
||||
'token': str(totp.token() - 2)
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in r.rendered_content
|
||||
assert 'alert-danger' in r.content.decode()
|
||||
d.refresh_from_db()
|
||||
assert not d.confirmed
|
||||
|
||||
@@ -257,7 +257,7 @@ class UserSettings2FATest(SoupTest):
|
||||
r = self.client.post('/control/settings/2fa/u2f/{}/confirm'.format(d.pk), {
|
||||
'token': 'FOO'
|
||||
}, follow=True)
|
||||
assert 'alert-danger' in r.rendered_content
|
||||
assert 'alert-danger' in r.content.decode()
|
||||
d.refresh_from_db()
|
||||
assert not d.confirmed
|
||||
|
||||
@@ -279,7 +279,7 @@ class UserSettings2FATest(SoupTest):
|
||||
}, follow=True)
|
||||
d.refresh_from_db()
|
||||
assert d.confirmed
|
||||
assert 'alert-success' in r.rendered_content
|
||||
assert 'alert-success' in r.content.decode()
|
||||
self.user.refresh_from_db()
|
||||
assert self.user.require_2fa
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, ItemCategory, Order, OrderPosition, Organizer, Question,
|
||||
@@ -167,18 +168,19 @@ def logged_in_client(client, event):
|
||||
])
|
||||
@pytest.mark.django_db
|
||||
def test_one_view(logged_in_client, url, expected, event, item, item_category, order, question, quota, voucher):
|
||||
payment = order.payments.first()
|
||||
refund = order.refunds.first()
|
||||
url = url.format(
|
||||
event=event.slug, orga=event.organizer.slug,
|
||||
category=item_category.pk,
|
||||
item=item.pk,
|
||||
order_code=order.code,
|
||||
question=question.pk,
|
||||
quota=quota.pk,
|
||||
voucher=voucher.pk,
|
||||
payment=payment.pk,
|
||||
refund=refund.pk
|
||||
)
|
||||
with scope(organizer=event.organizer):
|
||||
payment = order.payments.first()
|
||||
refund = order.refunds.first()
|
||||
url = url.format(
|
||||
event=event.slug, orga=event.organizer.slug,
|
||||
category=item_category.pk,
|
||||
item=item.pk,
|
||||
order_code=order.code,
|
||||
question=question.pk,
|
||||
quota=quota.pk,
|
||||
voucher=voucher.pk,
|
||||
payment=payment.pk,
|
||||
refund=refund.pk
|
||||
)
|
||||
response = logged_in_client.get(url)
|
||||
assert response.status_code == expected
|
||||
|
||||
+180
-133
@@ -3,6 +3,7 @@ import decimal
|
||||
import json
|
||||
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -12,6 +13,7 @@ from pretix.base.models import (
|
||||
|
||||
|
||||
class VoucherFormTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -38,30 +40,34 @@ class VoucherFormTest(SoupTest):
|
||||
self.quota_tickets.items.add(self.ticket)
|
||||
|
||||
def _create_voucher(self, data, expected_failure=False):
|
||||
count_before = self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
count_before = self.event.vouchers.count()
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data.update(data)
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug), form_data)
|
||||
if expected_failure:
|
||||
assert doc.select(".alert-danger, .has-error")
|
||||
assert count_before == self.event.vouchers.count()
|
||||
else:
|
||||
assert doc.select(".alert-success")
|
||||
assert count_before + 1 == self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
if expected_failure:
|
||||
assert doc.select(".alert-danger, .has-error")
|
||||
assert count_before == self.event.vouchers.count()
|
||||
else:
|
||||
assert doc.select(".alert-success")
|
||||
assert count_before + 1 == self.event.vouchers.count()
|
||||
|
||||
def _create_bulk_vouchers(self, data, expected_failure=False):
|
||||
count_before = self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
count_before = self.event.vouchers.count()
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/bulk_add' % (self.orga.slug, self.event.slug))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data.update(data)
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/bulk_add' % (self.orga.slug, self.event.slug), form_data)
|
||||
if expected_failure:
|
||||
assert doc.select(".alert-danger")
|
||||
assert count_before == self.event.vouchers.count()
|
||||
else:
|
||||
assert doc.select(".alert-success")
|
||||
assert count_before + len(form_data.get('codes').split("\n")) == self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
if expected_failure:
|
||||
assert doc.select(".alert-danger")
|
||||
assert count_before == self.event.vouchers.count()
|
||||
else:
|
||||
assert doc.select(".alert-success")
|
||||
assert count_before + len(form_data.get('codes').split("\n")) == self.event.vouchers.count()
|
||||
|
||||
def _change_voucher(self, v, data, expected_failure=False):
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/' % (self.orga.slug, self.event.slug, v.pk))
|
||||
@@ -74,59 +80,66 @@ class VoucherFormTest(SoupTest):
|
||||
assert doc.select(".alert-success")
|
||||
|
||||
def test_list(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
assert 'ABCDEFG' in doc.content.decode()
|
||||
|
||||
def test_csv(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?download=yes' % (self.orga.slug, self.event.slug))
|
||||
assert doc.content.strip() == '"Voucher code","Valid until","Product","Reserve quota","Bypass quota",' \
|
||||
'"Price effect","Value","Tag","Redeemed","Maximum usages"\r\n"ABCDEFG","",' \
|
||||
'"Early-bird ticket","No","No","No effect","","","0","1"'.encode('utf-8')
|
||||
assert doc.content.decode().strip() == '"Voucher code","Valid until","Product","Reserve quota",' \
|
||||
'"Bypass quota","Price effect","Value","Tag","Redeemed","Maximum usages"' \
|
||||
'\r\n"ABCDEFG","","Early-bird ticket","No","No","No effect","","","0","1"'
|
||||
|
||||
def test_filter_status_valid(self):
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
assert v.code in doc.content.decode()
|
||||
v.redeemed = 1
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=v' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
assert v.code not in doc.content.decode()
|
||||
|
||||
def test_filter_status_redeemed(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, redeemed=1)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, redeemed=1)
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
assert v.code in doc.content.decode()
|
||||
v.redeemed = 0
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=r' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
assert v.code not in doc.content.decode()
|
||||
|
||||
def test_filter_status_expired(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() + datetime.timedelta(days=1))
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() + datetime.timedelta(days=1))
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
|
||||
assert v.code not in doc.rendered_content
|
||||
assert v.code not in doc.content.decode()
|
||||
v.valid_until = now() - datetime.timedelta(days=1)
|
||||
v.save()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?status=e' % (self.orga.slug, self.event.slug))
|
||||
assert v.code in doc.rendered_content
|
||||
assert v.code in doc.content.decode()
|
||||
|
||||
def test_filter_tag(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo', tag='bar')
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo', tag='bar')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=bar' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
assert 'ABCDEFG' in doc.content.decode()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?tag=baz' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' not in doc.rendered_content
|
||||
assert 'ABCDEFG' not in doc.content.decode()
|
||||
|
||||
def test_search_code(self):
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo')
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code='ABCDEFG', comment='Foo')
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=ABCDEFG' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
assert 'ABCDEFG' in doc.content.decode()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=Foo' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' in doc.rendered_content
|
||||
assert 'ABCDEFG' in doc.content.decode()
|
||||
doc = self.client.get('/control/event/%s/%s/vouchers/?search=12345' % (self.orga.slug, self.event.slug))
|
||||
assert 'ABCDEFG' not in doc.rendered_content
|
||||
assert 'ABCDEFG' not in doc.content.decode()
|
||||
|
||||
def test_bulk_rng(self):
|
||||
rng = self.client.get('/control/event/%s/%s/vouchers/rng?num=7' % (self.orga.slug, self.event.slug))
|
||||
@@ -135,19 +148,22 @@ class VoucherFormTest(SoupTest):
|
||||
assert all([len(r) == 16 for r in codes])
|
||||
|
||||
def test_display_voucher_code(self):
|
||||
count_before = self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
count_before = self.event.vouchers.count()
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
form_data.update({
|
||||
'itemvar': '%d' % self.ticket.pk
|
||||
})
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/add' % (self.orga.slug, self.event.slug), form_data)
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert v.code in doc.select(".alert-success")[0].text
|
||||
assert count_before + 1 == self.event.vouchers.count()
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert v.code in doc.select(".alert-success")[0].text
|
||||
assert count_before + 1 == self.event.vouchers.count()
|
||||
|
||||
def test_create_voucher_for_addon_item(self):
|
||||
c = self.event.categories.create(name="Foo", is_addon=True)
|
||||
with scopes_disabled():
|
||||
c = self.event.categories.create(name="Foo", is_addon=True)
|
||||
self.ticket.category = c
|
||||
self.ticket.save()
|
||||
self._create_voucher({
|
||||
@@ -158,7 +174,8 @@ class VoucherFormTest(SoupTest):
|
||||
self._create_voucher({
|
||||
'itemvar': '%d' % self.ticket.pk
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert not v.block_quota
|
||||
assert v.item.pk == self.ticket.pk
|
||||
assert v.variation is None
|
||||
@@ -168,7 +185,8 @@ class VoucherFormTest(SoupTest):
|
||||
self._create_voucher({
|
||||
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_red.pk)
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert not v.block_quota
|
||||
assert v.item.pk == self.shirt.pk
|
||||
assert v.variation.pk == self.shirt_red.pk
|
||||
@@ -178,7 +196,8 @@ class VoucherFormTest(SoupTest):
|
||||
self._create_voucher({
|
||||
'itemvar': 'q-%d' % self.quota_tickets.pk
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert not v.block_quota
|
||||
assert v.item is None
|
||||
assert v.variation is None
|
||||
@@ -189,7 +208,8 @@ class VoucherFormTest(SoupTest):
|
||||
'itemvar': '%d' % self.ticket.pk,
|
||||
'block_quota': 'on'
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert v.block_quota
|
||||
|
||||
def test_create_blocking_item_voucher_quota_full(self):
|
||||
@@ -213,7 +233,8 @@ class VoucherFormTest(SoupTest):
|
||||
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_red.pk),
|
||||
'block_quota': 'on'
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert v.block_quota
|
||||
|
||||
def test_create_short_code(self):
|
||||
@@ -235,7 +256,8 @@ class VoucherFormTest(SoupTest):
|
||||
'itemvar': 'q-%d' % self.quota_tickets.pk,
|
||||
'block_quota': 'on'
|
||||
})
|
||||
v = Voucher.objects.latest('pk')
|
||||
with scopes_disabled():
|
||||
v = Voucher.objects.latest('pk')
|
||||
assert v.block_quota
|
||||
|
||||
def test_create_blocking_quota_voucher_quota_full(self):
|
||||
@@ -247,7 +269,8 @@ class VoucherFormTest(SoupTest):
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_non_blocking_voucher(self):
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': 'q-%d' % self.quota_tickets.pk
|
||||
})
|
||||
@@ -259,14 +282,16 @@ class VoucherFormTest(SoupTest):
|
||||
def test_change_blocking_voucher_unchanged_quota_full(self):
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
})
|
||||
v.refresh_from_db()
|
||||
assert v.block_quota
|
||||
|
||||
def test_change_voucher_reduce_max_usages(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, max_usages=5, redeemed=3)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, max_usages=5, redeemed=3)
|
||||
self._change_voucher(v, {
|
||||
'max_usages': '2'
|
||||
}, expected_failure=True)
|
||||
@@ -274,13 +299,15 @@ class VoucherFormTest(SoupTest):
|
||||
def test_change_voucher_to_blocking_quota_full(self):
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
self._change_voucher(v, {
|
||||
'block_quota': 'on'
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_voucher_to_blocking_quota_free(self):
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket)
|
||||
self._change_voucher(v, {
|
||||
'block_quota': 'on'
|
||||
})
|
||||
@@ -290,8 +317,9 @@ class VoucherFormTest(SoupTest):
|
||||
def test_change_voucher_validity_to_valid_quota_full(self):
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'valid_until_0': (now() + datetime.timedelta(days=3)).strftime('%Y-%m-%d'),
|
||||
'valid_until_1': (now() + datetime.timedelta(days=3)).strftime('%H:%M:%S')
|
||||
@@ -300,8 +328,9 @@ class VoucherFormTest(SoupTest):
|
||||
assert v.valid_until < now()
|
||||
|
||||
def test_change_voucher_validity_to_valid_quota_free(self):
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(item=self.ticket, valid_until=now() - datetime.timedelta(days=3),
|
||||
block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'valid_until_0': (now() + datetime.timedelta(days=3)).strftime('%Y-%m-%d'),
|
||||
'valid_until_1': (now() + datetime.timedelta(days=3)).strftime('%H:%M:%S')
|
||||
@@ -310,9 +339,10 @@ class VoucherFormTest(SoupTest):
|
||||
assert v.valid_until > now()
|
||||
|
||||
def test_change_item_of_blocking_voucher_quota_free(self):
|
||||
ticket2 = Item.objects.create(event=self.event, name='Late-bird ticket', default_price=23)
|
||||
self.quota_tickets.items.add(ticket2)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
with scopes_disabled():
|
||||
ticket2 = Item.objects.create(event=self.event, name='Late-bird ticket', default_price=23)
|
||||
self.quota_tickets.items.add(ticket2)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d' % ticket2.pk,
|
||||
})
|
||||
@@ -320,72 +350,81 @@ class VoucherFormTest(SoupTest):
|
||||
def test_change_item_of_blocking_voucher_quota_full(self):
|
||||
self.quota_shirts.size = 0
|
||||
self.quota_shirts.save()
|
||||
hoodie = Item.objects.create(event=self.event, name='Hoodie', default_price=23)
|
||||
self.quota_shirts.items.add(hoodie)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
with scopes_disabled():
|
||||
hoodie = Item.objects.create(event=self.event, name='Hoodie', default_price=23)
|
||||
self.quota_shirts.items.add(hoodie)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d' % hoodie.pk,
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_variation_of_blocking_voucher_quota_free(self):
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
self.quota_tickets.variations.add(self.shirt_blue)
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
with scopes_disabled():
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
self.quota_tickets.variations.add(self.shirt_blue)
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
|
||||
})
|
||||
|
||||
def test_change_variation_of_blocking_voucher_quota_full(self):
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
self.quota_tickets.variations.add(self.shirt_blue)
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
with scopes_disabled():
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
self.quota_tickets.variations.add(self.shirt_blue)
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_quota_of_blocking_voucher_quota_free(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': 'q-%d' % self.quota_shirts.pk,
|
||||
})
|
||||
|
||||
def test_change_quota_of_blocking_voucher_quota_full(self):
|
||||
self.quota_shirts.size = 0
|
||||
self.quota_shirts.save()
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
|
||||
with scopes_disabled():
|
||||
self.quota_shirts.size = 0
|
||||
self.quota_shirts.save()
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': 'q-%d' % self.quota_shirts.pk,
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_item_of_blocking_voucher_without_quota_change(self):
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
ticket2 = Item.objects.create(event=self.event, name='Standard Ticket', default_price=23)
|
||||
self.quota_tickets.items.add(ticket2)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
with scopes_disabled():
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
ticket2 = Item.objects.create(event=self.event, name='Standard Ticket', default_price=23)
|
||||
self.quota_tickets.items.add(ticket2)
|
||||
v = self.event.vouchers.create(item=self.ticket, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d' % ticket2.pk,
|
||||
})
|
||||
|
||||
def test_change_variation_of_blocking_voucher_without_quota_change(self):
|
||||
self.quota_shirts.size = 0
|
||||
self.quota_shirts.save()
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
with scopes_disabled():
|
||||
self.quota_shirts.size = 0
|
||||
self.quota_shirts.save()
|
||||
v = self.event.vouchers.create(item=self.shirt, variation=self.shirt_red, block_quota=True)
|
||||
self._change_voucher(v, {
|
||||
'itemvar': '%d-%d' % (self.shirt.pk, self.shirt_blue.pk),
|
||||
})
|
||||
|
||||
def test_create_duplicate_code(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
self._create_voucher({
|
||||
'code': v.code,
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_change_code_to_duplicate(self):
|
||||
v1 = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
v2 = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
with scopes_disabled():
|
||||
v1 = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
v2 = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
self._change_voucher(v1, {
|
||||
'code': v2.code
|
||||
}, expected_failure=True)
|
||||
@@ -430,14 +469,16 @@ class VoucherFormTest(SoupTest):
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_create_bulk_with_duplicate_code(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
self._create_bulk_vouchers({
|
||||
'codes': 'ABCDE\n%s' % v.code,
|
||||
'itemvar': '%d' % self.shirt.pk,
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_delete_voucher(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets)
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
follow=True)
|
||||
assert not doc.select(".alert-danger")
|
||||
@@ -445,10 +486,12 @@ class VoucherFormTest(SoupTest):
|
||||
doc = self.post_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
{}, follow=True)
|
||||
assert doc.select(".alert-success")
|
||||
assert not self.event.vouchers.filter(pk=v.id).exists()
|
||||
with scopes_disabled():
|
||||
assert not self.event.vouchers.filter(pk=v.id).exists()
|
||||
|
||||
def test_delete_voucher_redeemed(self):
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, redeemed=1)
|
||||
with scopes_disabled():
|
||||
v = self.event.vouchers.create(quota=self.quota_tickets, redeemed=1)
|
||||
doc = self.get_doc('/control/event/%s/%s/vouchers/%s/delete' % (self.orga.slug, self.event.slug, v.pk),
|
||||
follow=True)
|
||||
assert doc.select(".alert-danger")
|
||||
@@ -465,13 +508,14 @@ class VoucherFormTest(SoupTest):
|
||||
})
|
||||
|
||||
def test_subevent_non_blocking_quota_no_date(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
self.event.subevents.create(name="Bar", date_from=now())
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
self.event.subevents.create(name="Bar", date_from=now())
|
||||
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.save()
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.save()
|
||||
|
||||
self._create_voucher({
|
||||
'itemvar': 'q-%d' % self.quota_tickets.pk,
|
||||
@@ -486,15 +530,16 @@ class VoucherFormTest(SoupTest):
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_subevent_blocking_quota_free(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event.subevents.create(name="Bar", date_from=now())
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event.subevents.create(name="Bar", date_from=now())
|
||||
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.save()
|
||||
q2 = Quota.objects.create(event=self.event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(self.ticket)
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.save()
|
||||
q2 = Quota.objects.create(event=self.event, name='Tickets', size=0, subevent=se2)
|
||||
q2.items.add(self.ticket)
|
||||
|
||||
self._create_voucher({
|
||||
'itemvar': '%d' % self.ticket.pk,
|
||||
@@ -505,14 +550,15 @@ class VoucherFormTest(SoupTest):
|
||||
def test_subevent_blocking_quota_full(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event.subevents.create(name="Bar", date_from=now())
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now())
|
||||
se2 = self.event.subevents.create(name="Bar", date_from=now())
|
||||
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
q2 = Quota.objects.create(event=self.event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(self.ticket)
|
||||
self.quota_tickets.subevent = se1
|
||||
self.quota_tickets.size = 0
|
||||
self.quota_tickets.save()
|
||||
q2 = Quota.objects.create(event=self.event, name='Tickets', size=5, subevent=se2)
|
||||
q2.items.add(self.ticket)
|
||||
|
||||
self._create_voucher({
|
||||
'itemvar': '%d' % self.ticket.pk,
|
||||
@@ -521,32 +567,33 @@ class VoucherFormTest(SoupTest):
|
||||
}, expected_failure=True)
|
||||
|
||||
def test_order_warning_deduplication(self):
|
||||
shirt_voucher = Voucher.objects.create(
|
||||
event=self.event, item=self.shirt, price_mode='set', value=0.0, max_usages=100
|
||||
)
|
||||
with scopes_disabled():
|
||||
shirt_voucher = Voucher.objects.create(
|
||||
event=self.event, item=self.shirt, price_mode='set', value=0.0, max_usages=100
|
||||
)
|
||||
|
||||
shirt_order = Order.objects.create(
|
||||
code='DEDUP', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + datetime.timedelta(days=10),
|
||||
total=0, locale='en'
|
||||
)
|
||||
shirt_order = Order.objects.create(
|
||||
code='DEDUP', event=self.event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=now(), expires=now() + datetime.timedelta(days=10),
|
||||
total=0, locale='en'
|
||||
)
|
||||
|
||||
OrderPosition.objects.create(
|
||||
order=shirt_order,
|
||||
item=self.shirt,
|
||||
variation=self.shirt_red,
|
||||
price=decimal.Decimal("0"),
|
||||
voucher=shirt_voucher
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=shirt_order,
|
||||
item=self.shirt,
|
||||
variation=self.shirt_red,
|
||||
price=decimal.Decimal("0"),
|
||||
voucher=shirt_voucher
|
||||
)
|
||||
|
||||
OrderPosition.objects.create(
|
||||
order=shirt_order,
|
||||
item=self.shirt,
|
||||
variation=self.shirt_blue,
|
||||
price=decimal.Decimal("0"),
|
||||
voucher=shirt_voucher
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=shirt_order,
|
||||
item=self.shirt,
|
||||
variation=self.shirt_blue,
|
||||
price=decimal.Decimal("0"),
|
||||
voucher=shirt_voucher
|
||||
)
|
||||
|
||||
shirt_voucher.redeemed = 2
|
||||
shirt_voucher.save()
|
||||
|
||||
@@ -2,6 +2,7 @@ from datetime import timedelta
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, Organizer, Quota, Team, User, Voucher, WaitingListEntry,
|
||||
@@ -51,51 +52,52 @@ def test_list(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/')
|
||||
assert 'success@example.org' not in response.rendered_content
|
||||
assert 'expired@example.org' not in response.rendered_content
|
||||
assert 'foo0@bar.com' in response.rendered_content
|
||||
assert 'valid@example.org' not in response.rendered_content
|
||||
assert 'success@example.org' not in response.content.decode()
|
||||
assert 'expired@example.org' not in response.content.decode()
|
||||
assert 'foo0@bar.com' in response.content.decode()
|
||||
assert 'valid@example.org' not in response.content.decode()
|
||||
assert response.context['estimate'] == 23 * 5
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?status=a')
|
||||
assert 'success@example.org' in response.rendered_content
|
||||
assert 'foo0@bar.com' in response.rendered_content
|
||||
assert 'expired@example.org' in response.rendered_content
|
||||
assert 'valid@example.org' in response.rendered_content
|
||||
assert 'success@example.org' in response.content.decode()
|
||||
assert 'foo0@bar.com' in response.content.decode()
|
||||
assert 'expired@example.org' in response.content.decode()
|
||||
assert 'valid@example.org' in response.content.decode()
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?status=s')
|
||||
assert 'success@example.org' in response.rendered_content
|
||||
assert 'foo0@bar.com' not in response.rendered_content
|
||||
assert 'expired@example.org' in response.rendered_content
|
||||
assert 'valid@example.org' in response.rendered_content
|
||||
assert 'success@example.org' in response.content.decode()
|
||||
assert 'foo0@bar.com' not in response.content.decode()
|
||||
assert 'expired@example.org' in response.content.decode()
|
||||
assert 'valid@example.org' in response.content.decode()
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?status=v')
|
||||
assert 'success@example.org' not in response.rendered_content
|
||||
assert 'foo0@bar.com' not in response.rendered_content
|
||||
assert 'expired@example.org' not in response.rendered_content
|
||||
assert 'valid@example.org' in response.rendered_content
|
||||
assert 'success@example.org' not in response.content.decode()
|
||||
assert 'foo0@bar.com' not in response.content.decode()
|
||||
assert 'expired@example.org' not in response.content.decode()
|
||||
assert 'valid@example.org' in response.content.decode()
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?status=r')
|
||||
assert 'success@example.org' in response.rendered_content
|
||||
assert 'foo0@bar.com' not in response.rendered_content
|
||||
assert 'expired@example.org' not in response.rendered_content
|
||||
assert 'valid@example.org' not in response.rendered_content
|
||||
assert 'success@example.org' in response.content.decode()
|
||||
assert 'foo0@bar.com' not in response.content.decode()
|
||||
assert 'expired@example.org' not in response.content.decode()
|
||||
assert 'valid@example.org' not in response.content.decode()
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?status=e')
|
||||
assert 'success@example.org' not in response.rendered_content
|
||||
assert 'expired@example.org' in response.rendered_content
|
||||
assert 'foo0@bar.com' not in response.rendered_content
|
||||
assert 'valid@example.org' not in response.rendered_content
|
||||
assert 'success@example.org' not in response.content.decode()
|
||||
assert 'expired@example.org' in response.content.decode()
|
||||
assert 'foo0@bar.com' not in response.content.decode()
|
||||
assert 'valid@example.org' not in response.content.decode()
|
||||
|
||||
response = client.get('/control/event/dummy/dummy/waitinglist/?item=%d' % env[3].pk)
|
||||
assert 'item2@example.org' not in response.rendered_content
|
||||
assert 'foo0@bar.com' in response.rendered_content
|
||||
assert 'item2@example.org' not in response.content.decode()
|
||||
assert 'foo0@bar.com' in response.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_assign_single(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
|
||||
with scopes_disabled():
|
||||
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
|
||||
|
||||
client.post('/control/event/dummy/dummy/waitinglist/', {
|
||||
'assign': wle.pk
|
||||
@@ -107,7 +109,8 @@ def test_assign_single(client, env):
|
||||
@pytest.mark.django_db
|
||||
def test_priority_single(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
|
||||
with scopes_disabled():
|
||||
wle = WaitingListEntry.objects.filter(voucher__isnull=True).last()
|
||||
assert wle.priority == 0
|
||||
|
||||
client.post('/control/event/dummy/dummy/waitinglist/', {
|
||||
@@ -130,17 +133,20 @@ def test_priority_single(client, env):
|
||||
@pytest.mark.django_db
|
||||
def test_delete_single(client, env):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
wle = WaitingListEntry.objects.first()
|
||||
with scopes_disabled():
|
||||
wle = WaitingListEntry.objects.first()
|
||||
|
||||
client.post('/control/event/dummy/dummy/waitinglist/%s/delete' % (wle.id))
|
||||
with pytest.raises(WaitingListEntry.DoesNotExist):
|
||||
WaitingListEntry.objects.get(id=wle.id)
|
||||
with scopes_disabled():
|
||||
WaitingListEntry.objects.get(id=wle.id)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_dashboard(client, env):
|
||||
quota = Quota.objects.create(name="Test", size=2, event=env[0])
|
||||
quota.items.add(env[3])
|
||||
w = waitinglist_widgets(env[0])
|
||||
with scopes_disabled():
|
||||
quota = Quota.objects.create(name="Test", size=2, event=env[0])
|
||||
quota.items.add(env[3])
|
||||
w = waitinglist_widgets(env[0])
|
||||
assert '1' in w[0]['content']
|
||||
assert '5' in w[1]['content']
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.api.models import WebHook
|
||||
from pretix.base.models import Event, Organizer, Team, User
|
||||
@@ -48,7 +49,7 @@ def admin_team(organizer):
|
||||
def test_list_of_webhooks(event, admin_user, client, webhook):
|
||||
client.login(email='dummy@dummy.dummy', password='dummy')
|
||||
resp = client.get('/control/organizer/dummy/webhooks')
|
||||
assert 'https://google.com' in resp.rendered_content
|
||||
assert 'https://google.com' in resp.content.decode()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -60,11 +61,12 @@ def test_create_webhook(event, admin_user, admin_team, client):
|
||||
'events': 'pretix.event.order.paid',
|
||||
'limit_events': str(event.pk),
|
||||
}, follow=True)
|
||||
w = WebHook.objects.last()
|
||||
assert w.target_url == "https://google.com"
|
||||
assert w.limit_events.count() == 1
|
||||
assert list(w.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.paid']
|
||||
assert not w.all_events
|
||||
with scopes_disabled():
|
||||
w = WebHook.objects.last()
|
||||
assert w.target_url == "https://google.com"
|
||||
assert w.limit_events.count() == 1
|
||||
assert list(w.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.paid']
|
||||
assert not w.all_events
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -78,10 +80,11 @@ def test_update_webhook(event, admin_user, admin_team, webhook, client):
|
||||
}, follow=True)
|
||||
webhook.refresh_from_db()
|
||||
assert webhook.target_url == "https://google.com"
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert list(webhook.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.canceled',
|
||||
'pretix.event.order.paid']
|
||||
assert not webhook.all_events
|
||||
with scopes_disabled():
|
||||
assert webhook.limit_events.count() == 1
|
||||
assert list(webhook.listeners.values_list('action_type', flat=True)) == ['pretix.event.order.canceled',
|
||||
'pretix.event.order.paid']
|
||||
assert not webhook.all_events
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -98,4 +101,4 @@ def test_webhook_logs(event, admin_user, admin_team, webhook, client):
|
||||
response_body='bar'
|
||||
)
|
||||
resp = client.get('/control/organizer/dummy/webhook/{}/logs'.format(webhook.pk))
|
||||
assert 'pretix.event.order.paid' in resp.rendered_content
|
||||
assert 'pretix.event.order.paid' in resp.content.decode()
|
||||
|
||||
@@ -2,6 +2,7 @@ import pytest
|
||||
from django.conf import settings
|
||||
from django.test import override_settings
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from tests import assert_num_queries
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
@@ -97,6 +98,7 @@ def test_event_custom_domain_cache(env):
|
||||
'LOCATION': 'unique-snowflake',
|
||||
}
|
||||
})
|
||||
@scopes_disabled()
|
||||
def test_event_custom_domain_cache_clear(env):
|
||||
kd = KnownDomain.objects.create(domainname='foobar', organizer=env[0])
|
||||
env[0].cache.clear()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import datetime
|
||||
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import Event, Item, Organizer, Team, User
|
||||
@@ -36,8 +37,9 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
)
|
||||
|
||||
def test_set_default(self):
|
||||
bl1 = self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
bl1 = self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
self.post_doc('/control/event/%s/%s/badges/%s/default' % (self.orga1.slug, self.event1.slug, bl2.id), {})
|
||||
bl1.refresh_from_db()
|
||||
assert not bl1.default
|
||||
@@ -45,21 +47,24 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
assert bl2.default
|
||||
|
||||
def test_delete(self):
|
||||
bl1 = self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
bl1 = self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
doc = self.get_doc('/control/event/%s/%s/badges/%s/delete' % (self.orga1.slug, self.event1.slug, bl1.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/badges/%s/delete' % (self.orga1.slug, self.event1.slug, bl1.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("Layout 1", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.badge_layouts.count() == 1
|
||||
with scopes_disabled():
|
||||
assert self.event1.badge_layouts.count() == 1
|
||||
bl2.refresh_from_db()
|
||||
assert bl2.default
|
||||
|
||||
def test_set_on_item(self):
|
||||
self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
self.event1.badge_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
|
||||
'name_0': 'Standard',
|
||||
'default_price': '23.00',
|
||||
@@ -69,7 +74,8 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
'badgeitem-layout': bl2.pk,
|
||||
'sales_channels': 'web',
|
||||
})
|
||||
assert BadgeItem.objects.get(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
assert BadgeItem.objects.get(item=self.item1, layout=bl2)
|
||||
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
|
||||
'name_0': 'Standard',
|
||||
'default_price': '23.00',
|
||||
@@ -78,11 +84,13 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
'allow_cancel': 'yes',
|
||||
'sales_channels': 'web',
|
||||
})
|
||||
assert not BadgeItem.objects.filter(item=self.item1, layout=bl2).exists()
|
||||
with scopes_disabled():
|
||||
assert not BadgeItem.objects.filter(item=self.item1, layout=bl2).exists()
|
||||
|
||||
def test_item_copy(self):
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
BadgeItem.objects.create(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
BadgeItem.objects.create(item=self.item1, layout=bl2)
|
||||
self.client.post('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), {
|
||||
'name_0': 'Intermediate',
|
||||
'default_price': '23.00',
|
||||
@@ -90,13 +98,15 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
'copy_from': str(self.item1.pk),
|
||||
'has_variations': '1'
|
||||
})
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert BadgeItem.objects.get(item=i_new, layout=bl2)
|
||||
assert BadgeItem.objects.get(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert BadgeItem.objects.get(item=i_new, layout=bl2)
|
||||
assert BadgeItem.objects.get(item=self.item1, layout=bl2)
|
||||
|
||||
def test_copy_event(self):
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
BadgeItem.objects.create(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.badge_layouts.create(name="Layout 2")
|
||||
BadgeItem.objects.create(item=self.item1, layout=bl2)
|
||||
self.post_doc('/control/events/add', {
|
||||
'event_wizard-current_step': 'foundation',
|
||||
'event_wizard-prefix': 'event_wizard',
|
||||
@@ -124,7 +134,8 @@ class BadgeLayoutFormTest(SoupTest):
|
||||
'copy-copy_from_event': self.event1.pk
|
||||
})
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
i_new = ev.items.first()
|
||||
bl_new = ev.badge_layouts.first()
|
||||
assert BadgeItem.objects.get(item=i_new, layout=bl_new)
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
i_new = ev.items.first()
|
||||
bl_new = ev.badge_layouts.first()
|
||||
assert BadgeItem.objects.get(item=i_new, layout=bl_new)
|
||||
|
||||
@@ -4,6 +4,7 @@ from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
from PyPDF2 import PdfFileReader
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -16,27 +17,28 @@ from pretix.plugins.badges.exporters import BadgeExporter
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
o1 = Order.objects.create(
|
||||
code='FOOBAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
)
|
||||
shirt = Item.objects.create(event=event, name='T-Shirt', default_price=12)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
|
||||
OrderPosition.objects.create(
|
||||
order=o1, item=shirt, variation=shirt_red,
|
||||
price=12, attendee_name_parts={}, secret='1234'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1, item=shirt, variation=shirt_red,
|
||||
price=12, attendee_name_parts={}, secret='5678'
|
||||
)
|
||||
return event, o1, shirt
|
||||
with scope(organizer=o):
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
o1 = Order.objects.create(
|
||||
code='FOOBAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37'),
|
||||
)
|
||||
shirt = Item.objects.create(event=event, name='T-Shirt', default_price=12)
|
||||
shirt_red = ItemVariation.objects.create(item=shirt, default_price=14, value="Red")
|
||||
OrderPosition.objects.create(
|
||||
order=o1, item=shirt, variation=shirt_red,
|
||||
price=12, attendee_name_parts={}, secret='1234'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=o1, item=shirt, variation=shirt_red,
|
||||
price=12, attendee_name_parts={}, secret='5678'
|
||||
)
|
||||
yield event, o1, shirt
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
||||
from django.core import mail as djmail
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, Order, OrderFee, OrderPayment, OrderPosition, Organizer,
|
||||
@@ -125,10 +126,11 @@ def test_underpaid(env, job):
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PENDING
|
||||
p = env[2].payments.last()
|
||||
assert p.amount == Decimal('22.50')
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED
|
||||
assert env[2].pending_sum == Decimal('0.50')
|
||||
with scopes_disabled():
|
||||
p = env[2].payments.last()
|
||||
assert p.amount == Decimal('22.50')
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED
|
||||
assert env[2].pending_sum == Decimal('0.50')
|
||||
|
||||
assert len(djmail.outbox) == 1
|
||||
assert djmail.outbox[0].subject == 'Your order received an incomplete payment: 1Z3AS'
|
||||
@@ -150,7 +152,8 @@ def test_in_parts(env, job):
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PAID
|
||||
assert env[2].payments.count() == 2
|
||||
with scopes_disabled():
|
||||
assert env[2].payments.count() == 2
|
||||
assert env[2].pending_sum == Decimal('0.00')
|
||||
|
||||
|
||||
@@ -164,10 +167,11 @@ def test_overpaid(env, job):
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PAID
|
||||
p = env[2].payments.last()
|
||||
assert p.amount == Decimal('23.50')
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED
|
||||
assert env[2].pending_sum == Decimal('-0.50')
|
||||
with scopes_disabled():
|
||||
p = env[2].payments.last()
|
||||
assert p.amount == Decimal('23.50')
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED
|
||||
assert env[2].pending_sum == Decimal('-0.50')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -308,9 +312,10 @@ def test_keep_unmatched(env, orga_job):
|
||||
'date': '2016-01-26',
|
||||
'amount': '23.00'
|
||||
}])
|
||||
job = BankImportJob.objects.last()
|
||||
t = job.transactions.last()
|
||||
assert t.state == BankTransaction.STATE_NOMATCH
|
||||
with scopes_disabled():
|
||||
job = BankImportJob.objects.last()
|
||||
t = job.transactions.last()
|
||||
assert t.state == BankTransaction.STATE_NOMATCH
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -355,17 +360,18 @@ Buchungstag;Valuta;Buchungstext;Auftraggeber / Empfänger;Verwendungszweck;Betra
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_pending_paypal_drop_fee(env, job):
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
p = env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
with scopes_disabled():
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
p = env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
process_banktransfers(job, [{
|
||||
'payer': 'Karla Kundin',
|
||||
'reference': 'Bestellung DUMMY1234S',
|
||||
@@ -374,7 +380,8 @@ def test_pending_paypal_drop_fee(env, job):
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PAID
|
||||
assert env[2].fees.count() == 0
|
||||
with scopes_disabled():
|
||||
assert env[2].fees.count() == 0
|
||||
assert env[2].total == Decimal('23.00')
|
||||
p.refresh_from_db()
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
@@ -382,45 +389,48 @@ def test_pending_paypal_drop_fee(env, job):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_pending_paypal_replace_fee_included(env, job):
|
||||
env[0].settings.set('payment_banktransfer__fee_abs', '1.00')
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
with scopes_disabled():
|
||||
env[0].settings.set('payment_banktransfer__fee_abs', '1.00')
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
process_banktransfers(job, [{
|
||||
'payer': 'Karla Kundin',
|
||||
'reference': 'Bestellung DUMMY1234S',
|
||||
'date': '2016-01-26',
|
||||
'amount': '24.00'
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PAID
|
||||
assert env[2].fees.count() == 1
|
||||
assert env[2].fees.last().value == Decimal('1.00')
|
||||
assert env[2].total == Decimal('24.00')
|
||||
with scopes_disabled():
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PAID
|
||||
assert env[2].fees.count() == 1
|
||||
assert env[2].fees.last().value == Decimal('1.00')
|
||||
assert env[2].total == Decimal('24.00')
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_pending_paypal_replace_fee_missing(env, job):
|
||||
env[0].settings.set('payment_banktransfer__fee_abs', '1.00')
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
with scopes_disabled():
|
||||
fee = env[2].fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('2.00')
|
||||
)
|
||||
env[2].total += Decimal('2.00')
|
||||
env[2].save()
|
||||
env[2].payments.create(
|
||||
provider='paypal',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
fee=fee,
|
||||
amount=env[2].total
|
||||
)
|
||||
process_banktransfers(job, [{
|
||||
'payer': 'Karla Kundin',
|
||||
'reference': 'Bestellung DUMMY1234S',
|
||||
@@ -428,7 +438,8 @@ def test_pending_paypal_replace_fee_missing(env, job):
|
||||
'amount': '23.00'
|
||||
}])
|
||||
env[2].refresh_from_db()
|
||||
assert env[2].status == Order.STATUS_PENDING
|
||||
assert env[2].fees.count() == 1
|
||||
assert env[2].fees.last().value == Decimal('1.00')
|
||||
assert env[2].total == Decimal('24.00')
|
||||
with scopes_disabled():
|
||||
assert env[2].status == Order.STATUS_PENDING
|
||||
assert env[2].fees.count() == 1
|
||||
assert env[2].fees.last().value == Decimal('1.00')
|
||||
assert env[2].total == Decimal('24.00')
|
||||
|
||||
@@ -4,6 +4,7 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Order, OrderPayment, OrderRefund, Organizer, Team, User,
|
||||
@@ -223,7 +224,8 @@ def test_webhook_global(env, client, monkeypatch):
|
||||
order = env[1]
|
||||
order.status = Order.STATUS_PENDING
|
||||
order.save()
|
||||
order.payments.update(state=OrderPayment.PAYMENT_STATE_PENDING)
|
||||
with scopes_disabled():
|
||||
order.payments.update(state=OrderPayment.PAYMENT_STATE_PENDING)
|
||||
|
||||
charge = get_test_charge(env[1])
|
||||
monkeypatch.setattr("paypalrestsdk.Sale.find", lambda *args: charge)
|
||||
@@ -264,7 +266,8 @@ def test_webhook_mark_paid(env, client, monkeypatch):
|
||||
order = env[1]
|
||||
order.status = Order.STATUS_PENDING
|
||||
order.save()
|
||||
order.payments.update(state=OrderPayment.PAYMENT_STATE_PENDING)
|
||||
with scopes_disabled():
|
||||
order.payments.update(state=OrderPayment.PAYMENT_STATE_PENDING)
|
||||
|
||||
charge = get_test_charge(env[1])
|
||||
monkeypatch.setattr("paypalrestsdk.Sale.find", lambda *args: charge)
|
||||
@@ -345,12 +348,13 @@ def test_webhook_refund1(env, client, monkeypatch):
|
||||
order.refresh_from_db()
|
||||
assert order.status == Order.STATUS_PAID
|
||||
|
||||
r = order.refunds.first()
|
||||
assert r.provider == 'paypal'
|
||||
assert r.amount == order.total
|
||||
assert r.payment == order.payments.first()
|
||||
assert r.state == OrderRefund.REFUND_STATE_EXTERNAL
|
||||
assert r.source == OrderRefund.REFUND_SOURCE_EXTERNAL
|
||||
with scopes_disabled():
|
||||
r = order.refunds.first()
|
||||
assert r.provider == 'paypal'
|
||||
assert r.amount == order.total
|
||||
assert r.payment == order.payments.first()
|
||||
assert r.state == OrderRefund.REFUND_STATE_EXTERNAL
|
||||
assert r.source == OrderRefund.REFUND_SOURCE_EXTERNAL
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -393,9 +397,10 @@ def test_webhook_refund2(env, client, monkeypatch):
|
||||
order.refresh_from_db()
|
||||
assert order.status == Order.STATUS_PAID
|
||||
|
||||
r = order.refunds.first()
|
||||
assert r.provider == 'paypal'
|
||||
assert r.amount == order.total
|
||||
assert r.payment == order.payments.first()
|
||||
assert r.state == OrderRefund.REFUND_STATE_EXTERNAL
|
||||
assert r.source == OrderRefund.REFUND_SOURCE_EXTERNAL
|
||||
with scopes_disabled():
|
||||
r = order.refunds.first()
|
||||
assert r.provider == 'paypal'
|
||||
assert r.amount == order.total
|
||||
assert r.payment == order.payments.first()
|
||||
assert r.state == OrderRefund.REFUND_STATE_EXTERNAL
|
||||
assert r.source == OrderRefund.REFUND_SOURCE_EXTERNAL
|
||||
|
||||
@@ -3,6 +3,7 @@ from datetime import timedelta
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Checkin, Event, InvoiceAddress, Item, ItemVariation, Order, OrderPosition,
|
||||
@@ -57,7 +58,8 @@ def test_custom_datetime(client, env):
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['version'] == API_VERSION
|
||||
assert jdata['status'] == 'ok'
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
with scopes_disabled():
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -125,7 +127,8 @@ def test_reupload_same_nonce(client, env):
|
||||
data={'secret': '1234', 'nonce': 'fooobar'})
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['status'] == 'ok'
|
||||
assert Checkin.objects.count() == 1
|
||||
with scopes_disabled():
|
||||
assert Checkin.objects.count() == 1
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -273,7 +276,8 @@ def test_search_restricted(client, env):
|
||||
@pytest.mark.django_db
|
||||
def test_search_invoice_name(client, env):
|
||||
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[5])
|
||||
InvoiceAddress.objects.create(order=env[2], name_parts={"full_name": "John", "_scheme": "full"})
|
||||
with scopes_disabled():
|
||||
InvoiceAddress.objects.create(order=env[2], name_parts={"full_name": "John", "_scheme": "full"})
|
||||
resp = client.get('/pretixdroid/api/%s/%s/search/?key=%s&query=%s' % (
|
||||
env[0].organizer.slug, env[0].slug, 'abcdefg', 'John'))
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
@@ -283,11 +287,12 @@ def test_search_invoice_name(client, env):
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_download_all_data(client, env):
|
||||
op = OrderPosition.objects.last()
|
||||
OrderPosition.objects.create(
|
||||
order=Order.objects.first(), item=op.item, addon_to=op,
|
||||
price=12, secret='foooo'
|
||||
)
|
||||
with scopes_disabled():
|
||||
op = OrderPosition.objects.last()
|
||||
OrderPosition.objects.create(
|
||||
order=Order.objects.first(), item=op.item, addon_to=op,
|
||||
price=12, secret='foooo'
|
||||
)
|
||||
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[5])
|
||||
resp = client.get('/pretixdroid/api/%s/%s/download/?key=%s' % (env[0].organizer.slug, env[0].slug, 'abcdefg'))
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
@@ -323,39 +328,41 @@ def test_download_item_restricted_list(client, env):
|
||||
@pytest.mark.django_db
|
||||
def test_status(client, env):
|
||||
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[5])
|
||||
Checkin.objects.create(position=env[3], list=env[5])
|
||||
with scopes_disabled():
|
||||
Checkin.objects.create(position=env[3], list=env[5])
|
||||
resp = client.get('/pretixdroid/api/%s/%s/status/?key=%s' % (
|
||||
env[0].organizer.slug, env[0].slug, 'abcdefg'))
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['checkins'] == 1
|
||||
assert jdata['total'] == 2
|
||||
assert jdata['items'] == [
|
||||
{'name': 'T-Shirt',
|
||||
'id': env[3].item.pk,
|
||||
'checkins': 1,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': [
|
||||
{'name': 'Red',
|
||||
'id': env[3].variation.pk,
|
||||
'checkins': 1,
|
||||
'total': 1
|
||||
},
|
||||
{'name': 'Blue',
|
||||
'id': env[3].item.variations.get(value='Blue').pk,
|
||||
'checkins': 0,
|
||||
'total': 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{'name': 'Ticket',
|
||||
'id': env[4].item.pk,
|
||||
'checkins': 0,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': []
|
||||
}
|
||||
]
|
||||
with scopes_disabled():
|
||||
assert jdata['items'] == [
|
||||
{'name': 'T-Shirt',
|
||||
'id': env[3].item.pk,
|
||||
'checkins': 1,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': [
|
||||
{'name': 'Red',
|
||||
'id': env[3].variation.pk,
|
||||
'checkins': 1,
|
||||
'total': 1
|
||||
},
|
||||
{'name': 'Blue',
|
||||
'id': env[3].item.variations.get(value='Blue').pk,
|
||||
'checkins': 0,
|
||||
'total': 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{'name': 'Ticket',
|
||||
'id': env[4].item.pk,
|
||||
'checkins': 0,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': []
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -370,7 +377,8 @@ def question(env):
|
||||
@pytest.mark.django_db
|
||||
def test_question_number(client, env, question):
|
||||
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[5])
|
||||
question[0].options.all().delete()
|
||||
with scopes_disabled():
|
||||
question[0].options.all().delete()
|
||||
question[0].type = 'N'
|
||||
question[0].save()
|
||||
|
||||
@@ -399,7 +407,8 @@ def test_question_number(client, env, question):
|
||||
)
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['status'] == 'ok'
|
||||
assert env[3].answers.get(question=question[0]).answer == '3.24'
|
||||
with scopes_disabled():
|
||||
assert env[3].answers.get(question=question[0]).answer == '3.24'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -440,8 +449,9 @@ def test_question_choice(client, env, question):
|
||||
)
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['status'] == 'ok'
|
||||
assert env[3].answers.get(question=question[0]).answer == 'M'
|
||||
assert list(env[3].answers.get(question=question[0]).options.all()) == [question[1]]
|
||||
with scopes_disabled():
|
||||
assert env[3].answers.get(question=question[0]).answer == 'M'
|
||||
assert list(env[3].answers.get(question=question[0]).options.all()) == [question[1]]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -556,8 +566,9 @@ def test_question_multiple_choice(client, env, question):
|
||||
)
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['status'] == 'ok'
|
||||
assert env[3].answers.get(question=question[0]).answer == 'M, L'
|
||||
assert set(env[3].answers.get(question=question[0]).options.all()) == {question[1], question[2]}
|
||||
with scopes_disabled():
|
||||
assert env[3].answers.get(question=question[0]).answer == 'M, L'
|
||||
assert set(env[3].answers.get(question=question[0]).options.all()) == {question[1], question[2]}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
@@ -3,6 +3,7 @@ from datetime import timedelta
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Checkin, Event, Item, ItemVariation, Order, OrderPosition, Organizer, Team,
|
||||
@@ -61,7 +62,8 @@ def test_custom_datetime(client, env):
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['version'] == API_VERSION
|
||||
assert jdata['status'] == 'ok'
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
with scopes_disabled():
|
||||
assert Checkin.objects.last().datetime == dt
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@@ -143,36 +145,38 @@ def test_download_all_data(client, env):
|
||||
@pytest.mark.django_db
|
||||
def test_status(client, env):
|
||||
AppConfiguration.objects.create(event=env[0], key='abcdefg', list=env[7])
|
||||
Checkin.objects.create(position=env[3], list=env[7])
|
||||
with scopes_disabled():
|
||||
Checkin.objects.create(position=env[3], list=env[7])
|
||||
resp = client.get('/pretixdroid/api/%s/%s/%d/status/?key=%s' % (
|
||||
env[0].organizer.slug, env[0].slug, env[5].pk, 'abcdefg'))
|
||||
jdata = json.loads(resp.content.decode("utf-8"))
|
||||
assert jdata['checkins'] == 1
|
||||
assert jdata['total'] == 1
|
||||
assert jdata['items'] == [
|
||||
{'name': 'T-Shirt',
|
||||
'id': env[3].item.pk,
|
||||
'checkins': 1,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': [
|
||||
{'name': 'Red',
|
||||
'id': env[3].variation.pk,
|
||||
'checkins': 1,
|
||||
'total': 1
|
||||
},
|
||||
{'name': 'Blue',
|
||||
'id': env[3].item.variations.get(value='Blue').pk,
|
||||
'checkins': 0,
|
||||
'total': 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{'name': 'Ticket',
|
||||
'id': env[4].item.pk,
|
||||
'checkins': 0,
|
||||
'admission': False,
|
||||
'total': 0,
|
||||
'variations': []
|
||||
}
|
||||
]
|
||||
with scopes_disabled():
|
||||
assert jdata['checkins'] == 1
|
||||
assert jdata['total'] == 1
|
||||
assert jdata['items'] == [
|
||||
{'name': 'T-Shirt',
|
||||
'id': env[3].item.pk,
|
||||
'checkins': 1,
|
||||
'admission': False,
|
||||
'total': 1,
|
||||
'variations': [
|
||||
{'name': 'Red',
|
||||
'id': env[3].variation.pk,
|
||||
'checkins': 1,
|
||||
'total': 1
|
||||
},
|
||||
{'name': 'Blue',
|
||||
'id': env[3].item.variations.get(value='Blue').pk,
|
||||
'checkins': 0,
|
||||
'total': 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{'name': 'Ticket',
|
||||
'id': env[4].item.pk,
|
||||
'checkins': 0,
|
||||
'admission': False,
|
||||
'total': 0,
|
||||
'variations': []
|
||||
}
|
||||
]
|
||||
|
||||
@@ -5,6 +5,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
from django.test import RequestFactory
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
from stripe.error import APIConnectionError, CardError, StripeError
|
||||
|
||||
from pretix.base.models import Event, Order, OrderRefund, Organizer
|
||||
@@ -15,17 +16,18 @@ from pretix.plugins.stripe.payment import StripeCC
|
||||
@pytest.fixture
|
||||
def env():
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
o1 = Order.objects.create(
|
||||
code='FOOBAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37')
|
||||
)
|
||||
return event, o1
|
||||
with scope(organizer=o):
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
o1 = Order.objects.create(
|
||||
code='FOOBAR', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=Decimal('13.37')
|
||||
)
|
||||
yield event, o1
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
|
||||
@@ -4,6 +4,7 @@ from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Order, OrderPayment, OrderRefund, Organizer, Team, User,
|
||||
@@ -165,9 +166,10 @@ def test_webhook_mark_paid_without_reference_and_payment(env, client, monkeypatc
|
||||
def test_webhook_partial_refund(env, client, monkeypatch):
|
||||
charge = get_test_charge(env[1])
|
||||
|
||||
payment = env[1].payments.create(
|
||||
provider='stripe', amount=env[1].total, info=json.dumps(charge)
|
||||
)
|
||||
with scopes_disabled():
|
||||
payment = env[1].payments.create(
|
||||
provider='stripe', amount=env[1].total, info=json.dumps(charge)
|
||||
)
|
||||
ReferencedStripeObject.objects.create(order=env[1], reference="ch_18TY6GGGWE2Ias8TZHanef25",
|
||||
payment=payment)
|
||||
|
||||
@@ -216,7 +218,8 @@ def test_webhook_partial_refund(env, client, monkeypatch):
|
||||
order.refresh_from_db()
|
||||
assert order.status == Order.STATUS_PAID
|
||||
|
||||
ra = order.refunds.first()
|
||||
with scopes_disabled():
|
||||
ra = order.refunds.first()
|
||||
assert ra.state == OrderRefund.REFUND_STATE_EXTERNAL
|
||||
assert ra.source == 'external'
|
||||
assert ra.amount == Decimal('123.00')
|
||||
@@ -231,9 +234,10 @@ def test_webhook_global(env, client, monkeypatch):
|
||||
charge = get_test_charge(env[1])
|
||||
monkeypatch.setattr("stripe.Charge.retrieve", lambda *args, **kwargs: charge)
|
||||
|
||||
payment = order.payments.create(
|
||||
provider='stripe', amount=order.total, info=json.dumps(charge), state=OrderPayment.PAYMENT_STATE_CREATED
|
||||
)
|
||||
with scopes_disabled():
|
||||
payment = order.payments.create(
|
||||
provider='stripe', amount=order.total, info=json.dumps(charge), state=OrderPayment.PAYMENT_STATE_CREATED
|
||||
)
|
||||
ReferencedStripeObject.objects.create(order=order, reference="ch_18TY6GGGWE2Ias8TZHanef25",
|
||||
payment=payment)
|
||||
|
||||
@@ -270,9 +274,10 @@ def test_webhook_global_legacy_reference(env, client, monkeypatch):
|
||||
charge = get_test_charge(env[1])
|
||||
monkeypatch.setattr("stripe.Charge.retrieve", lambda *args, **kwargs: charge)
|
||||
|
||||
payment = order.payments.create(
|
||||
provider='stripe', amount=order.total, info=json.dumps(charge), state=OrderPayment.PAYMENT_STATE_CREATED
|
||||
)
|
||||
with scopes_disabled():
|
||||
payment = order.payments.create(
|
||||
provider='stripe', amount=order.total, info=json.dumps(charge), state=OrderPayment.PAYMENT_STATE_CREATED
|
||||
)
|
||||
ReferencedStripeObject.objects.create(order=order, reference="ch_18TY6GGGWE2Ias8TZHanef25")
|
||||
|
||||
client.post('/_stripe/webhook/', json.dumps(
|
||||
@@ -297,4 +302,5 @@ def test_webhook_global_legacy_reference(env, client, monkeypatch):
|
||||
|
||||
order.refresh_from_db()
|
||||
assert order.status == Order.STATUS_PAID
|
||||
assert list(order.payments.all()) == [payment]
|
||||
with scopes_disabled():
|
||||
assert list(order.payments.all()) == [payment]
|
||||
|
||||
@@ -4,6 +4,7 @@ from decimal import Decimal
|
||||
import pytest
|
||||
import pytz
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Item, Order, OrderPosition, Organizer
|
||||
from pretix.plugins.checkinlists.exporters import CSVCheckinList
|
||||
@@ -13,40 +14,41 @@ from pretix.plugins.checkinlists.exporters import CSVCheckinList
|
||||
def event():
|
||||
"""Returns an event instance"""
|
||||
o = Organizer.objects.create(name='Dummy', slug='dummy')
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(),
|
||||
plugins='pretix.plugins.checkinlists,tests.testdummy',
|
||||
)
|
||||
event.settings.set('attendee_names_asked', True)
|
||||
event.settings.set('name_scheme', 'title_given_middle_family')
|
||||
event.settings.set('locales', ['en', 'de'])
|
||||
event.checkin_lists.create(name="Default", all_products=True)
|
||||
with scope(organizer=o):
|
||||
event = Event.objects.create(
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(),
|
||||
plugins='pretix.plugins.checkinlists,tests.testdummy',
|
||||
)
|
||||
event.settings.set('attendee_names_asked', True)
|
||||
event.settings.set('name_scheme', 'title_given_middle_family')
|
||||
event.settings.set('locales', ['en', 'de'])
|
||||
event.checkin_lists.create(name="Default", all_products=True)
|
||||
|
||||
order_paid = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=pytz.UTC), expires=now() + datetime.timedelta(days=10),
|
||||
total=33, locale='en'
|
||||
)
|
||||
item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True)
|
||||
OrderPosition.objects.create(
|
||||
order=order_paid,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name_parts={"title": "Mr", "given_name": "Peter", "middle_name": "A", "family_name": "Jones"},
|
||||
secret='hutjztuxhkbtwnesv2suqv26k6ttytxx'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order_paid,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("13"),
|
||||
attendee_name_parts={"title": "Mrs", "given_name": "Andrea", "middle_name": "J", "family_name": "Zulu"},
|
||||
secret='ggsngqtnmhx74jswjngw3fk8pfwz2a7k'
|
||||
)
|
||||
return event
|
||||
order_paid = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PAID,
|
||||
datetime=datetime.datetime(2019, 2, 22, 14, 0, 0, tzinfo=pytz.UTC), expires=now() + datetime.timedelta(days=10),
|
||||
total=33, locale='en'
|
||||
)
|
||||
item_ticket = Item.objects.create(event=event, name="Ticket", default_price=23, admission=True)
|
||||
OrderPosition.objects.create(
|
||||
order=order_paid,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("23"),
|
||||
attendee_name_parts={"title": "Mr", "given_name": "Peter", "middle_name": "A", "family_name": "Jones"},
|
||||
secret='hutjztuxhkbtwnesv2suqv26k6ttytxx'
|
||||
)
|
||||
OrderPosition.objects.create(
|
||||
order=order_paid,
|
||||
item=item_ticket,
|
||||
variation=None,
|
||||
price=Decimal("13"),
|
||||
attendee_name_parts={"title": "Mrs", "given_name": "Andrea", "middle_name": "J", "family_name": "Zulu"},
|
||||
secret='ggsngqtnmhx74jswjngw3fk8pfwz2a7k'
|
||||
)
|
||||
yield event
|
||||
|
||||
|
||||
def clean(d):
|
||||
|
||||
@@ -3,6 +3,7 @@ import datetime
|
||||
import pytest
|
||||
from django.core import mail as djmail
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, Order, OrderPosition, Organizer, Team, User,
|
||||
@@ -34,10 +35,14 @@ def order(item):
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY', email='dummy@dummy.test',
|
||||
datetime=now(), locale='en')
|
||||
OrderPosition.objects.create(order=o, item=item, price=13)
|
||||
return o
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def pos(order, item):
|
||||
return OrderPosition.objects.create(order=order, item=item, price=13)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def logged_in_client(client, event):
|
||||
"""Returns a logged client"""
|
||||
@@ -66,12 +71,12 @@ def test_sendmail_view(logged_in_client, sendmail_url, expected=200):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_simple_case(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_simple_case(logged_in_client, sendmail_url, event, order, pos):
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -92,12 +97,12 @@ def test_sendmail_simple_case(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_email_not_sent_if_order_not_match(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_email_not_sent_if_order_not_match(logged_in_client, sendmail_url, event, order, pos):
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'p',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -108,12 +113,12 @@ def test_sendmail_email_not_sent_if_order_not_match(logged_in_client, sendmail_u
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_preview(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_preview(logged_in_client, sendmail_url, event, order, pos):
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.',
|
||||
'action': 'preview'
|
||||
@@ -126,12 +131,12 @@ def test_sendmail_preview(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_invalid_data(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_invalid_data(logged_in_client, sendmail_url, event, order, pos):
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
},
|
||||
follow=True)
|
||||
@@ -147,12 +152,13 @@ def test_sendmail_multi_locales(logged_in_client, sendmail_url, event, item):
|
||||
|
||||
event.settings.set('locales', ['en', 'de'])
|
||||
|
||||
o = Order.objects.create(event=item.event, status=Order.STATUS_PAID,
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY', email='dummy@dummy.test',
|
||||
datetime=now(),
|
||||
locale='de')
|
||||
OrderPosition.objects.create(order=o, item=item, price=13)
|
||||
with scopes_disabled():
|
||||
o = Order.objects.create(event=item.event, status=Order.STATUS_PAID,
|
||||
expires=now() + datetime.timedelta(hours=1),
|
||||
total=13, code='DUMMY', email='dummy@dummy.test',
|
||||
datetime=now(),
|
||||
locale='de')
|
||||
OrderPosition.objects.create(order=o, item=item, price=13)
|
||||
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'p',
|
||||
@@ -181,12 +187,13 @@ def test_sendmail_multi_locales(logged_in_client, sendmail_url, event, item):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_subevents(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_subevents(logged_in_client, sendmail_url, event, order, pos):
|
||||
event.has_subevents = True
|
||||
event.save()
|
||||
se1 = event.subevents.create(name='Subevent FOO', date_from=now())
|
||||
se2 = event.subevents.create(name='Bar', date_from=now())
|
||||
op = order.positions.last()
|
||||
with scopes_disabled():
|
||||
se1 = event.subevents.create(name='Subevent FOO', date_from=now())
|
||||
se2 = event.subevents.create(name='Bar', date_from=now())
|
||||
op = order.positions.last()
|
||||
op.subevent = se1
|
||||
op.save()
|
||||
|
||||
@@ -194,7 +201,7 @@ def test_sendmail_subevents(logged_in_client, sendmail_url, event, order):
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.',
|
||||
'subevent': se1.pk
|
||||
@@ -208,7 +215,7 @@ def test_sendmail_subevents(logged_in_client, sendmail_url, event, order):
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.',
|
||||
'subevent': se2.pk
|
||||
@@ -224,12 +231,12 @@ def test_sendmail_subevents(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_placeholder(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_placeholder(logged_in_client, sendmail_url, event, order, pos):
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'orders',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': '{code} Test subject',
|
||||
'message_0': 'This is a test file for sending mails.',
|
||||
'action': 'preview'
|
||||
@@ -243,8 +250,8 @@ def test_sendmail_placeholder(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_attendee_mails(logged_in_client, sendmail_url, event, order):
|
||||
p = order.positions.first()
|
||||
def test_sendmail_attendee_mails(logged_in_client, sendmail_url, event, order, pos):
|
||||
p = pos
|
||||
event.settings.attendee_emails_asked = True
|
||||
p.attendee_email = 'attendee@dummy.test'
|
||||
p.save()
|
||||
@@ -253,7 +260,7 @@ def test_sendmail_attendee_mails(logged_in_client, sendmail_url, event, order):
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'attendees',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -267,8 +274,8 @@ def test_sendmail_attendee_mails(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_both_mails(logged_in_client, sendmail_url, event, order):
|
||||
p = order.positions.first()
|
||||
def test_sendmail_both_mails(logged_in_client, sendmail_url, event, order, pos):
|
||||
p = pos
|
||||
event.settings.attendee_emails_asked = True
|
||||
p.attendee_email = 'attendee@dummy.test'
|
||||
p.save()
|
||||
@@ -277,7 +284,7 @@ def test_sendmail_both_mails(logged_in_client, sendmail_url, event, order):
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'both',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -294,8 +301,8 @@ def test_sendmail_both_mails(logged_in_client, sendmail_url, event, order):
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_both_but_same_address(logged_in_client, sendmail_url, event, order):
|
||||
p = order.positions.first()
|
||||
def test_sendmail_both_but_same_address(logged_in_client, sendmail_url, event, order, pos):
|
||||
p = pos
|
||||
event.settings.attendee_emails_asked = True
|
||||
p.attendee_email = 'dummy@dummy.test'
|
||||
p.save()
|
||||
@@ -304,7 +311,7 @@ def test_sendmail_both_but_same_address(logged_in_client, sendmail_url, event, o
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'both',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -318,8 +325,8 @@ def test_sendmail_both_but_same_address(logged_in_client, sendmail_url, event, o
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_attendee_fallback(logged_in_client, sendmail_url, event, order):
|
||||
p = order.positions.first()
|
||||
def test_sendmail_attendee_fallback(logged_in_client, sendmail_url, event, order, pos):
|
||||
p = pos
|
||||
event.settings.attendee_emails_asked = True
|
||||
p.attendee_email = None
|
||||
p.save()
|
||||
@@ -328,7 +335,7 @@ def test_sendmail_attendee_fallback(logged_in_client, sendmail_url, event, order
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
{'sendto': 'n',
|
||||
'recipients': 'attendees',
|
||||
'items': order.positions.first().item_id,
|
||||
'items': pos.item_id,
|
||||
'subject_0': 'Test subject',
|
||||
'message_0': 'This is a test file for sending mails.'
|
||||
},
|
||||
@@ -342,15 +349,16 @@ def test_sendmail_attendee_fallback(logged_in_client, sendmail_url, event, order
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_sendmail_attendee_product_filter(logged_in_client, sendmail_url, event, order):
|
||||
def test_sendmail_attendee_product_filter(logged_in_client, sendmail_url, event, order, pos):
|
||||
event.settings.attendee_emails_asked = True
|
||||
i2 = Item.objects.create(name='Test item', event=event, default_price=13)
|
||||
p = order.positions.first()
|
||||
p.attendee_email = 'attendee1@dummy.test'
|
||||
p.save()
|
||||
order.positions.create(
|
||||
item=i2, price=0, attendee_email='attendee2@dummy.test'
|
||||
)
|
||||
with scopes_disabled():
|
||||
i2 = Item.objects.create(name='Test item', event=event, default_price=13)
|
||||
p = pos
|
||||
p.attendee_email = 'attendee1@dummy.test'
|
||||
p.save()
|
||||
order.positions.create(
|
||||
item=i2, price=0, attendee_email='attendee2@dummy.test'
|
||||
)
|
||||
|
||||
djmail.outbox = []
|
||||
response = logged_in_client.post(sendmail_url,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import datetime
|
||||
|
||||
from django_scopes import scopes_disabled
|
||||
from tests.base import SoupTest, extract_form_fields
|
||||
|
||||
from pretix.base.models import Event, Item, Organizer, Team, User
|
||||
@@ -7,6 +8,7 @@ from pretix.plugins.ticketoutputpdf.models import TicketLayoutItem
|
||||
|
||||
|
||||
class TicketLayoutFormTest(SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy')
|
||||
@@ -31,13 +33,15 @@ class TicketLayoutFormTest(SoupTest):
|
||||
doc = self.post_doc('/control/event/%s/%s/pdfoutput/add' % (self.orga1.slug, self.event1.slug), form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertIn("Layout 1", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.ticket_layouts.get(
|
||||
default=True, name='Layout 1'
|
||||
)
|
||||
with scopes_disabled():
|
||||
assert self.event1.ticket_layouts.get(
|
||||
default=True, name='Layout 1'
|
||||
)
|
||||
|
||||
def test_set_default(self):
|
||||
bl1 = self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
bl1 = self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
self.post_doc('/control/event/%s/%s/pdfoutput/%s/default' % (self.orga1.slug, self.event1.slug, bl2.id), {})
|
||||
bl1.refresh_from_db()
|
||||
assert not bl1.default
|
||||
@@ -45,21 +49,24 @@ class TicketLayoutFormTest(SoupTest):
|
||||
assert bl2.default
|
||||
|
||||
def test_delete(self):
|
||||
bl1 = self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
bl1 = self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
doc = self.get_doc('/control/event/%s/%s/pdfoutput/%s/delete' % (self.orga1.slug, self.event1.slug, bl1.id))
|
||||
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
|
||||
doc = self.post_doc('/control/event/%s/%s/pdfoutput/%s/delete' % (self.orga1.slug, self.event1.slug, bl1.id),
|
||||
form_data)
|
||||
assert doc.select(".alert-success")
|
||||
self.assertNotIn("Layout 1", doc.select("#page-wrapper")[0].text)
|
||||
assert self.event1.ticket_layouts.count() == 1
|
||||
with scopes_disabled():
|
||||
assert self.event1.ticket_layouts.count() == 1
|
||||
bl2.refresh_from_db()
|
||||
assert bl2.default
|
||||
|
||||
def test_set_on_item(self):
|
||||
self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
with scopes_disabled():
|
||||
self.event1.ticket_layouts.create(name="Layout 1", default=True)
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
|
||||
'name_0': 'Standard',
|
||||
'default_price': '23.00',
|
||||
@@ -69,7 +76,8 @@ class TicketLayoutFormTest(SoupTest):
|
||||
'ticketlayoutitem_web-layout': bl2.pk,
|
||||
'sales_channels': 'web',
|
||||
})
|
||||
assert TicketLayoutItem.objects.get(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
assert TicketLayoutItem.objects.get(item=self.item1, layout=bl2)
|
||||
self.client.post('/control/event/%s/%s/items/%d/' % (self.orga1.slug, self.event1.slug, self.item1.id), {
|
||||
'name_0': 'Standard',
|
||||
'default_price': '23.00',
|
||||
@@ -78,11 +86,13 @@ class TicketLayoutFormTest(SoupTest):
|
||||
'allow_cancel': 'yes',
|
||||
'sales_channels': 'web',
|
||||
})
|
||||
assert not TicketLayoutItem.objects.filter(item=self.item1, layout=bl2).exists()
|
||||
with scopes_disabled():
|
||||
assert not TicketLayoutItem.objects.filter(item=self.item1, layout=bl2).exists()
|
||||
|
||||
def test_item_copy(self):
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
self.client.post('/control/event/%s/%s/items/add' % (self.orga1.slug, self.event1.slug), {
|
||||
'name_0': 'Intermediate',
|
||||
'default_price': '23.00',
|
||||
@@ -90,13 +100,15 @@ class TicketLayoutFormTest(SoupTest):
|
||||
'copy_from': str(self.item1.pk),
|
||||
'has_variations': '1'
|
||||
})
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert TicketLayoutItem.objects.get(item=i_new, layout=bl2)
|
||||
assert TicketLayoutItem.objects.get(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
i_new = Item.objects.get(name__icontains='Intermediate')
|
||||
assert TicketLayoutItem.objects.get(item=i_new, layout=bl2)
|
||||
assert TicketLayoutItem.objects.get(item=self.item1, layout=bl2)
|
||||
|
||||
def test_copy_event(self):
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
with scopes_disabled():
|
||||
bl2 = self.event1.ticket_layouts.create(name="Layout 2")
|
||||
TicketLayoutItem.objects.create(item=self.item1, layout=bl2)
|
||||
self.post_doc('/control/events/add', {
|
||||
'event_wizard-current_step': 'foundation',
|
||||
'event_wizard-prefix': 'event_wizard',
|
||||
@@ -124,7 +136,8 @@ class TicketLayoutFormTest(SoupTest):
|
||||
'copy-copy_from_event': self.event1.pk
|
||||
})
|
||||
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
i_new = ev.items.first()
|
||||
bl_new = ev.ticket_layouts.first()
|
||||
assert TicketLayoutItem.objects.get(item=i_new, layout=bl_new)
|
||||
with scopes_disabled():
|
||||
ev = Event.objects.get(slug='33c3')
|
||||
i_new = ev.items.first()
|
||||
bl_new = ev.ticket_layouts.first()
|
||||
assert TicketLayoutItem.objects.get(item=i_new, layout=bl_new)
|
||||
|
||||
@@ -4,6 +4,7 @@ from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
from PyPDF2 import PdfFileReader
|
||||
|
||||
from pretix.base.models import (
|
||||
@@ -41,11 +42,12 @@ def env0():
|
||||
@pytest.mark.django_db
|
||||
def test_generate_pdf(env0):
|
||||
event, order = env0
|
||||
event.settings.set('ticketoutput_pdf_code_x', 30)
|
||||
event.settings.set('ticketoutput_pdf_code_y', 50)
|
||||
event.settings.set('ticketoutput_pdf_code_s', 2)
|
||||
o = PdfTicketOutput(event)
|
||||
fname, ftype, buf = o.generate(order.positions.first())
|
||||
assert ftype == 'application/pdf'
|
||||
pdf = PdfFileReader(BytesIO(buf))
|
||||
assert pdf.numPages == 1
|
||||
with scope(organizer=event.organizer):
|
||||
event.settings.set('ticketoutput_pdf_code_x', 30)
|
||||
event.settings.set('ticketoutput_pdf_code_y', 50)
|
||||
event.settings.set('ticketoutput_pdf_code_s', 2)
|
||||
o = PdfTicketOutput(event)
|
||||
fname, ftype, buf = o.generate(order.positions.first())
|
||||
assert ftype == 'application/pdf'
|
||||
pdf = PdfFileReader(BytesIO(buf))
|
||||
assert pdf.numPages == 1
|
||||
|
||||
+610
-388
File diff suppressed because it is too large
Load Diff
+916
-744
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
import pytest
|
||||
from django.test import RequestFactory
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scope
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.middlewares import SessionMiddleware
|
||||
@@ -14,7 +15,8 @@ def event():
|
||||
organizer=o, name='MRMCD2015', slug='2015',
|
||||
date_from=now(), live=True
|
||||
)
|
||||
return e
|
||||
with scope(organizer=o):
|
||||
yield e
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
+299
-247
@@ -8,6 +8,7 @@ from django.core import mail
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.test import TestCase
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import timezone
|
||||
from tests.base import SoupTest
|
||||
|
||||
@@ -19,6 +20,7 @@ from pretix.base.models.items import SubEventItem, SubEventItemVariation
|
||||
|
||||
|
||||
class EventTestMixin:
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.orga = Organizer.objects.create(name='CCC', slug='ccc')
|
||||
@@ -69,10 +71,11 @@ class EventMiddlewareTest(EventTestMixin, SoupTest):
|
||||
|
||||
class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
def test_link_rewrite(self):
|
||||
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,
|
||||
description="http://example.org [Sample](http://example.net)")
|
||||
q.items.add(item)
|
||||
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,
|
||||
description="http://example.org [Sample](http://example.net)")
|
||||
q.items.add(item)
|
||||
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
|
||||
self.assertNotIn('href="http://example.org', html)
|
||||
@@ -81,83 +84,93 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertIn('href="/redirect/?url=http%3A//example.net%3A', html)
|
||||
|
||||
def test_not_active(self):
|
||||
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=False)
|
||||
q.items.add(item)
|
||||
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=False)
|
||||
q.items.add(item)
|
||||
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
self.assertNotIn("Early-bird", html)
|
||||
self.assertNotIn("btn-add-to-cart", html)
|
||||
|
||||
def test_without_category(self):
|
||||
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)
|
||||
q.items.add(item)
|
||||
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)
|
||||
q.items.add(item)
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("section .product-row")[0].text)
|
||||
self.assertEqual(len(doc.select("#btn-add-to-cart")), 1)
|
||||
|
||||
def test_sales_channel(self):
|
||||
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'])
|
||||
q.items.add(item)
|
||||
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'])
|
||||
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="bar").rendered_content
|
||||
self.assertIn("Early-bird", html)
|
||||
|
||||
def test_timely_available(self):
|
||||
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,
|
||||
available_until=now() + datetime.timedelta(days=2),
|
||||
available_from=now() - datetime.timedelta(days=2))
|
||||
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,
|
||||
available_until=now() + datetime.timedelta(days=2),
|
||||
available_from=now() - datetime.timedelta(days=2))
|
||||
q.items.add(item)
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("body")[0].text)
|
||||
|
||||
def test_no_longer_available(self):
|
||||
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,
|
||||
available_until=now() - datetime.timedelta(days=2))
|
||||
q.items.add(item)
|
||||
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,
|
||||
available_until=now() - datetime.timedelta(days=2))
|
||||
q.items.add(item)
|
||||
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
self.assertNotIn("Early-bird", html)
|
||||
|
||||
def test_not_yet_available(self):
|
||||
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,
|
||||
available_from=now() + datetime.timedelta(days=2))
|
||||
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,
|
||||
available_from=now() + datetime.timedelta(days=2))
|
||||
q.items.add(item)
|
||||
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
self.assertNotIn("Early-bird", html)
|
||||
|
||||
def test_hidden_without_voucher(self):
|
||||
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,
|
||||
hide_without_voucher=True)
|
||||
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,
|
||||
hide_without_voucher=True)
|
||||
q.items.add(item)
|
||||
html = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
self.assertNotIn("Early-bird", html)
|
||||
|
||||
def test_simple_with_category(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
q.items.add(item)
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
q.items.add(item)
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Entry tickets", doc.select("section:nth-of-type(1) h3")[0].text)
|
||||
self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
|
||||
|
||||
def test_simple_without_quota(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertNotIn("Early-bird", resp.rendered_content)
|
||||
|
||||
def test_subevents_inactive_unknown(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=False)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=False)
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
assert resp.status_code == 404
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk + 1000))
|
||||
@@ -166,8 +179,9 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
def test_subevent_list_activeness(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
self.event.subevents.create(name='Foo SE1', date_from=now() + datetime.timedelta(days=1), active=True)
|
||||
self.event.subevents.create(name='Foo SE2', date_from=now() + datetime.timedelta(days=1), active=False)
|
||||
with scopes_disabled():
|
||||
self.event.subevents.create(name='Foo SE1', date_from=now() + datetime.timedelta(days=1), active=True)
|
||||
self.event.subevents.create(name='Foo SE2', date_from=now() + datetime.timedelta(days=1), active=False)
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Foo SE1", resp.rendered_content)
|
||||
self.assertNotIn("Foo SE2", resp.rendered_content)
|
||||
@@ -175,8 +189,9 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
def test_subevent_list_ordering(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
self.event.subevents.create(name='Epic SE', date_from=now() + datetime.timedelta(days=1), active=True)
|
||||
self.event.subevents.create(name='Cool SE', date_from=now() + datetime.timedelta(days=2), active=True)
|
||||
with scopes_disabled():
|
||||
self.event.subevents.create(name='Epic SE', date_from=now() + datetime.timedelta(days=1), active=True)
|
||||
self.event.subevents.create(name='Cool SE', date_from=now() + datetime.timedelta(days=2), active=True)
|
||||
|
||||
self.event.settings.frontpage_subevent_ordering = 'date_ascending'
|
||||
content = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug)).rendered_content
|
||||
@@ -194,8 +209,9 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.event.settings.event_list_type = 'calendar'
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='Foo SE1', date_from=now() + datetime.timedelta(days=64), active=True)
|
||||
self.event.subevents.create(name='Foo SE2', date_from=now() + datetime.timedelta(days=32), active=True)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo SE1', date_from=now() + datetime.timedelta(days=64), active=True)
|
||||
self.event.subevents.create(name='Foo SE2', date_from=now() + datetime.timedelta(days=32), active=True)
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Foo SE2", resp.rendered_content)
|
||||
self.assertNotIn("Foo SE1", resp.rendered_content)
|
||||
@@ -207,11 +223,12 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
def test_subevents(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0)
|
||||
q.items.add(item)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0)
|
||||
q.items.add(item)
|
||||
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
self.assertIn("Early-bird", resp.rendered_content)
|
||||
@@ -221,14 +238,15 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
def test_subevent_prices(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
SubEventItem.objects.create(subevent=se1, item=item, price=12)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
SubEventItem.objects.create(subevent=se1, item=item, price=12)
|
||||
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
self.assertIn("12.00", resp.rendered_content)
|
||||
@@ -241,16 +259,17 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
self.event.settings.display_net_prices = True
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
tr = self.event.tax_rules.get_or_create(rate=Decimal('19.00'))[0]
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15,
|
||||
tax_rule=tr)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
SubEventItem.objects.create(subevent=se1, item=item, price=12)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='Foo', date_from=now(), active=True)
|
||||
tr = self.event.tax_rules.get_or_create(rate=Decimal('19.00'))[0]
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=15,
|
||||
tax_rule=tr)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
q.items.add(item)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
q.items.add(item)
|
||||
SubEventItem.objects.create(subevent=se1, item=item, price=12)
|
||||
|
||||
resp = self.client.get('/%s/%s/%d/' % (self.orga.slug, self.event.slug, se1.pk))
|
||||
self.assertIn("10.08", resp.rendered_content)
|
||||
@@ -262,30 +281,33 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertNotIn("15.00", resp.rendered_content)
|
||||
|
||||
def test_no_variations_in_quota(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertNotIn("Early-bird", resp.rendered_content)
|
||||
|
||||
def test_one_variation_in_quota(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=0)
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
q.variations.add(var1)
|
||||
self._assert_variation_found()
|
||||
|
||||
def test_one_variation_in_unlimited_quota(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
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')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
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')
|
||||
ItemVariation.objects.create(item=item, value='Blue')
|
||||
q.items.add(item)
|
||||
q.variations.add(var1)
|
||||
self._assert_variation_found()
|
||||
@@ -297,13 +319,14 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertNotIn("Black", doc.select("section:nth-of-type(1)")[0].text)
|
||||
|
||||
def test_variation_prices_in_quota(self):
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=12)
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=item, value='Black', position=2)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
with scopes_disabled():
|
||||
c = ItemCategory.objects.create(event=self.event, name="Entry tickets", position=0)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', category=c, default_price=12)
|
||||
var1 = ItemVariation.objects.create(item=item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=item, value='Black', position=2)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
q.items.add(item)
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
|
||||
@@ -313,40 +336,43 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertIn("12.00", doc.select("section:nth-of-type(1) div.variation")[1].text)
|
||||
|
||||
def test_require_bundling(self):
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, require_bundling=True)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
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=12)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, require_bundling=True)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertEqual(1, len(doc.select(".availability-box")))
|
||||
|
||||
def test_bundle_sold_out(self):
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
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=12)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
|
||||
self.assertIn("SOLD OUT", doc.select("section:nth-of-type(1)")[0].text)
|
||||
|
||||
def test_bundle_mixed_tax_rate(self):
|
||||
tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12, tax_rule=tr19)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, tax_rule=tr7, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
with scopes_disabled():
|
||||
tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12, tax_rule=tr19)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, tax_rule=tr7, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
|
||||
@@ -354,16 +380,17 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
self.assertIn("incl. taxes", doc.select("section:nth-of-type(1) div.price")[0].text)
|
||||
|
||||
def test_bundle_mixed_tax_rate_show_net(self):
|
||||
self.event.settings.display_net_prices = True
|
||||
tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12, tax_rule=tr19)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, tax_rule=tr7, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
with scopes_disabled():
|
||||
self.event.settings.display_net_prices = True
|
||||
tr19 = self.event.tax_rules.create(rate=Decimal('19.00'))
|
||||
tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=12, tax_rule=tr19)
|
||||
q.items.add(item)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
item2 = Item.objects.create(event=self.event, name='Dinner', default_price=12, tax_rule=tr7, position=10)
|
||||
q2.items.add(item2)
|
||||
item.bundles.create(bundled_item=item2, designated_price=2, count=1)
|
||||
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn("Early-bird", doc.select("section:nth-of-type(1) div:nth-of-type(1)")[0].text)
|
||||
@@ -372,6 +399,7 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
|
||||
|
||||
|
||||
class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
@@ -387,7 +415,8 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "Early-bird" not in html.rendered_content
|
||||
|
||||
def test_not_in_quota(self):
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
with scopes_disabled():
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
self.v.quota = q2
|
||||
self.v.save()
|
||||
html = self.client.get('/%s/%s/redeem?voucher=%s' % (self.orga.slug, self.event.slug, self.v.code))
|
||||
@@ -421,10 +450,11 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "Early-bird" in html.rendered_content
|
||||
|
||||
def test_variations_all(self):
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
with scopes_disabled():
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.v.item = self.item
|
||||
self.v.quota = None
|
||||
self.v.save()
|
||||
@@ -433,11 +463,12 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "Black" in html.rendered_content
|
||||
|
||||
def test_variations_specific(self):
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.v.item = self.item
|
||||
with scopes_disabled():
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.v.item = self.item
|
||||
self.v.variation = var1
|
||||
self.v.quota = None
|
||||
self.v.save()
|
||||
@@ -468,20 +499,22 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "_voucher_item" in html.rendered_content
|
||||
|
||||
def test_variations_sold_out(self):
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
with scopes_disabled():
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.q.size = 0
|
||||
self.q.save()
|
||||
html = self.client.get('/%s/%s/redeem?voucher=%s' % (self.orga.slug, self.event.slug, self.v.code))
|
||||
assert "_voucher_item" not in html.rendered_content
|
||||
|
||||
def test_variations_sold_out_blocking(self):
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
with scopes_disabled():
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.q.size = 0
|
||||
self.q.save()
|
||||
self.v.block_quota = True
|
||||
@@ -506,10 +539,11 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "10.80" in html.rendered_content
|
||||
|
||||
def test_voucher_price_variations(self):
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
with scopes_disabled():
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', default_price=14, position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
self.q.variations.add(var1)
|
||||
self.q.variations.add(var2)
|
||||
self.v.value = Decimal("10.00")
|
||||
self.v.price_mode = 'set'
|
||||
self.v.save()
|
||||
@@ -547,25 +581,26 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "alert-danger" in html.rendered_content
|
||||
|
||||
def test_subevent_net_prices(self):
|
||||
self.event.settings.display_net_prices = True
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
self.item.tax_rule = self.event.tax_rules.get_or_create(rate=Decimal('19.00'))[0]
|
||||
self.item.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
with scopes_disabled():
|
||||
self.event.settings.display_net_prices = True
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
self.item.tax_rule = self.event.tax_rules.get_or_create(rate=Decimal('19.00'))[0]
|
||||
self.item.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
SubEventItemVariation.objects.create(subevent=se1, variation=var1, price=10)
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
SubEventItemVariation.objects.create(subevent=se1, variation=var1, price=10)
|
||||
|
||||
self.v.quota = q
|
||||
self.v.value = Decimal("2.00")
|
||||
self.v.price_mode = 'subtract'
|
||||
self.v.save()
|
||||
self.v.quota = q
|
||||
self.v.value = Decimal("2.00")
|
||||
self.v.price_mode = 'subtract'
|
||||
self.v.save()
|
||||
html = self.client.get('/%s/%s/redeem?voucher=%s&subevent=%s' % (
|
||||
self.orga.slug, self.event.slug, self.v.code, se1.pk
|
||||
))
|
||||
@@ -575,22 +610,23 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "6.72" in html.rendered_content
|
||||
|
||||
def test_subevent_prices(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
SubEventItemVariation.objects.create(subevent=se1, variation=var1, price=10)
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
SubEventItemVariation.objects.create(subevent=se1, variation=var1, price=10)
|
||||
|
||||
self.v.quota = q
|
||||
self.v.value = Decimal("2.00")
|
||||
self.v.price_mode = 'subtract'
|
||||
self.v.save()
|
||||
self.v.quota = q
|
||||
self.v.value = Decimal("2.00")
|
||||
self.v.price_mode = 'subtract'
|
||||
self.v.save()
|
||||
html = self.client.get('/%s/%s/redeem?voucher=%s&subevent=%s' % (
|
||||
self.orga.slug, self.event.slug, self.v.code, se1.pk
|
||||
))
|
||||
@@ -602,17 +638,18 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "variation_%d_%d" % (self.item.pk, var2.pk) in html.rendered_content
|
||||
|
||||
def test_voucher_ignore_other_subevent(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='SE2', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='SE2', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se1)
|
||||
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.items.add(self.item)
|
||||
q.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
|
||||
self.v.subevent = se1
|
||||
self.v.save()
|
||||
@@ -622,19 +659,20 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
assert "SE1" in html.rendered_content
|
||||
|
||||
def test_voucher_quota(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='SE2', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=0, subevent=se1)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name='SE1', date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name='SE2', date_from=now(), active=True)
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=0, subevent=se1)
|
||||
q2 = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=se2)
|
||||
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.variations.add(var1)
|
||||
q2.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
q2.variations.add(var1)
|
||||
var1 = ItemVariation.objects.create(item=self.item, value='Red', position=1)
|
||||
var2 = ItemVariation.objects.create(item=self.item, value='Black', position=2)
|
||||
q.variations.add(var1)
|
||||
q2.variations.add(var1)
|
||||
q.variations.add(var2)
|
||||
q2.variations.add(var1)
|
||||
|
||||
self.v.save()
|
||||
html = self.client.get('/%s/%s/redeem?voucher=%s&subevent=%s' % (
|
||||
@@ -646,6 +684,7 @@ class VoucherRedeemItemDisplayTest(EventTestMixin, SoupTest):
|
||||
|
||||
|
||||
class WaitingListTest(EventTestMixin, SoupTest):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.q = Quota.objects.create(event=self.event, name='Quota', size=0)
|
||||
@@ -686,7 +725,8 @@ class WaitingListTest(EventTestMixin, SoupTest):
|
||||
}
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
wle = WaitingListEntry.objects.get(email='foo@bar.com')
|
||||
with scopes_disabled():
|
||||
wle = WaitingListEntry.objects.get(email='foo@bar.com')
|
||||
assert wle.event == self.event
|
||||
assert wle.item == self.item
|
||||
assert wle.variation is None
|
||||
@@ -694,14 +734,15 @@ class WaitingListTest(EventTestMixin, SoupTest):
|
||||
assert wle.locale == 'en'
|
||||
|
||||
def test_subevent_valid(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name="Foobar", date_from=now(), active=True)
|
||||
self.q.subevent = se1
|
||||
self.q.save()
|
||||
q2 = self.event.quotas.create(name="Foobar", size=100, subevent=se2)
|
||||
q2.items.add(self.item)
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name="Foobar", date_from=now(), active=True)
|
||||
self.q.subevent = se1
|
||||
self.q.save()
|
||||
q2 = self.event.quotas.create(name="Foobar", size=100, subevent=se2)
|
||||
q2.items.add(self.item)
|
||||
response = self.client.get(
|
||||
'/%s/%s/waitinglist/?item=%d&subevent=%d' % (self.orga.slug, self.event.slug, self.item.pk, se1.pk)
|
||||
)
|
||||
@@ -713,10 +754,11 @@ class WaitingListTest(EventTestMixin, SoupTest):
|
||||
}
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
wle = WaitingListEntry.objects.get(email='foo@bar.com')
|
||||
assert wle.event == self.event
|
||||
assert wle.item == self.item
|
||||
assert wle.subevent == se1
|
||||
with scopes_disabled():
|
||||
wle = WaitingListEntry.objects.get(email='foo@bar.com')
|
||||
assert wle.event == self.event
|
||||
assert wle.item == self.item
|
||||
assert wle.subevent == se1
|
||||
|
||||
def test_invalid_item(self):
|
||||
response = self.client.get(
|
||||
@@ -727,7 +769,8 @@ class WaitingListTest(EventTestMixin, SoupTest):
|
||||
def test_invalid_subevent(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=False)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=False)
|
||||
response = self.client.get(
|
||||
'/%s/%s/waitinglist/?item=%d' % (self.orga.slug, self.event.slug, self.item.pk)
|
||||
)
|
||||
@@ -750,28 +793,32 @@ class WaitingListTest(EventTestMixin, SoupTest):
|
||||
}
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
|
||||
with scopes_disabled():
|
||||
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
|
||||
|
||||
def test_subevent_available(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name="Foobar", date_from=now(), active=True)
|
||||
self.q.size = 1
|
||||
self.q.subevent = se1
|
||||
self.q.save()
|
||||
q2 = self.event.quotas.create(name="Foobar", size=0, subevent=se2)
|
||||
q2.items.add(self.item)
|
||||
with scopes_disabled():
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(name="Foo", date_from=now(), active=True)
|
||||
se2 = self.event.subevents.create(name="Foobar", date_from=now(), active=True)
|
||||
self.q.size = 1
|
||||
self.q.subevent = se1
|
||||
self.q.save()
|
||||
q2 = self.event.quotas.create(name="Foobar", size=0, subevent=se2)
|
||||
q2.items.add(self.item)
|
||||
response = self.client.post(
|
||||
'/%s/%s/waitinglist/?item=%d&subevent=%d' % (self.orga.slug, self.event.slug, self.item.pk, se1.pk), {
|
||||
'email': 'foo@bar.com'
|
||||
}
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
|
||||
with scopes_disabled():
|
||||
self.assertFalse(WaitingListEntry.objects.filter(email='foo@bar.com').exists())
|
||||
|
||||
|
||||
class DeadlineTest(EventTestMixin, TestCase):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
q = Quota.objects.create(event=self.event, name='Quota', size=2)
|
||||
@@ -883,11 +930,12 @@ class TestResendLink(EventTestMixin, SoupTest):
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_no_orders_from_user(self):
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
with scopes_disabled():
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
mail.outbox = []
|
||||
url = '/{}/{}/resend/'.format(self.orga.slug, self.event.slug)
|
||||
resp = self.client.post(url, data={'email': 'dummy@dummy.different'})
|
||||
@@ -896,11 +944,12 @@ class TestResendLink(EventTestMixin, SoupTest):
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_one_order(self):
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
with scopes_disabled():
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
mail.outbox = []
|
||||
url = '/{}/{}/resend/'.format(self.orga.slug, self.event.slug)
|
||||
resp = self.client.post(url, data={'email': 'dummy@dummy.dummy'})
|
||||
@@ -910,16 +959,17 @@ class TestResendLink(EventTestMixin, SoupTest):
|
||||
self.assertIn('DUMMY1', mail.outbox[0].body)
|
||||
|
||||
def test_multiple_orders(self):
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
Order.objects.create(
|
||||
code='DUMMY2', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
with scopes_disabled():
|
||||
Order.objects.create(
|
||||
code='DUMMY1', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
Order.objects.create(
|
||||
code='DUMMY2', status=Order.STATUS_PENDING, event=self.event,
|
||||
email='dummy@dummy.dummy', datetime=now(), expires=now(),
|
||||
total=0,
|
||||
)
|
||||
mail.outbox = []
|
||||
url = '/{}/{}/resend/'.format(self.orga.slug, self.event.slug)
|
||||
resp = self.client.post(url, data={'email': 'dummy@dummy.dummy'})
|
||||
@@ -1048,13 +1098,14 @@ class EventIcalDownloadTest(EventTestMixin, SoupTest):
|
||||
def test_subevent(self):
|
||||
self.event.has_subevents = True
|
||||
self.event.save()
|
||||
se1 = self.event.subevents.create(
|
||||
name='My fancy subevent',
|
||||
location='Heeeeeere',
|
||||
date_from=datetime.datetime(2014, 12, 26, 21, 57, 58, tzinfo=datetime.timezone.utc),
|
||||
date_to=datetime.datetime(2014, 12, 28, 21, 57, 58, tzinfo=datetime.timezone.utc),
|
||||
active=True
|
||||
)
|
||||
with scopes_disabled():
|
||||
se1 = self.event.subevents.create(
|
||||
name='My fancy subevent',
|
||||
location='Heeeeeere',
|
||||
date_from=datetime.datetime(2014, 12, 26, 21, 57, 58, tzinfo=datetime.timezone.utc),
|
||||
date_to=datetime.datetime(2014, 12, 28, 21, 57, 58, tzinfo=datetime.timezone.utc),
|
||||
active=True
|
||||
)
|
||||
self.event.settings.show_times = False
|
||||
ical = self.client.get('/%s/%s/ical/%d/' % (self.orga.slug, self.event.slug, se1.pk)).content.decode()
|
||||
self.assertIn('DTSTART;VALUE=DATE:20141226', ical, 'incorrect start date')
|
||||
@@ -1107,6 +1158,7 @@ class EventMicrodataTest(EventTestMixin, SoupTest):
|
||||
|
||||
|
||||
class EventSlugBlacklistValidatorTest(EventTestMixin, SoupTest):
|
||||
@scopes_disabled()
|
||||
def test_slug_validation(self):
|
||||
event = Event(
|
||||
organizer=self.orga,
|
||||
|
||||
+157
-125
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.test import TestCase
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import (
|
||||
Event, Item, ItemCategory, ItemVariation, Order, OrderPosition, Organizer,
|
||||
@@ -17,6 +18,7 @@ from pretix.base.services.invoices import generate_invoice
|
||||
|
||||
|
||||
class OrdersTest(TestCase):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.orga = Organizer.objects.create(name='CCC', slug='ccc')
|
||||
@@ -197,8 +199,9 @@ class OrdersTest(TestCase):
|
||||
self.client.get(
|
||||
'/%s/%s/order/%s/%s/modify' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)
|
||||
)
|
||||
self.order = Order.objects.get(id=self.order.id)
|
||||
assert self.order.status == Order.STATUS_CANCELED
|
||||
with scopes_disabled():
|
||||
self.order = Order.objects.get(id=self.order.id)
|
||||
assert self.order.status == Order.STATUS_CANCELED
|
||||
|
||||
def test_orders_modify_attendee_optional(self):
|
||||
self.event.settings.set('attendee_names_asked', True)
|
||||
@@ -218,7 +221,8 @@ class OrdersTest(TestCase):
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
self.order.secret),
|
||||
target_status_code=200)
|
||||
self.ticket_pos = OrderPosition.objects.get(id=self.ticket_pos.id)
|
||||
with scopes_disabled():
|
||||
self.ticket_pos = OrderPosition.objects.get(id=self.ticket_pos.id)
|
||||
assert self.ticket_pos.attendee_name in (None, '')
|
||||
|
||||
def test_orders_modify_attendee_required(self):
|
||||
@@ -247,7 +251,8 @@ class OrdersTest(TestCase):
|
||||
self.assertRedirects(response, '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
self.order.secret),
|
||||
target_status_code=200)
|
||||
self.ticket_pos = OrderPosition.objects.get(id=self.ticket_pos.id)
|
||||
with scopes_disabled():
|
||||
self.ticket_pos = OrderPosition.objects.get(id=self.ticket_pos.id)
|
||||
assert self.ticket_pos.attendee_name == 'Peter'
|
||||
|
||||
def test_orders_questions_optional(self):
|
||||
@@ -269,7 +274,8 @@ class OrdersTest(TestCase):
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
self.order.secret),
|
||||
target_status_code=200)
|
||||
assert not self.ticket_pos.answers.filter(question=self.question).exists()
|
||||
with scopes_disabled():
|
||||
assert not self.ticket_pos.answers.filter(question=self.question).exists()
|
||||
|
||||
def test_orders_questions_required(self):
|
||||
self.event.settings.set('attendee_names_asked', False)
|
||||
@@ -299,7 +305,8 @@ class OrdersTest(TestCase):
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
|
||||
self.order.secret),
|
||||
target_status_code=200)
|
||||
assert self.ticket_pos.answers.get(question=self.question).answer == 'ABC'
|
||||
with scopes_disabled():
|
||||
assert self.ticket_pos.answers.get(question=self.question).answer == 'ABC'
|
||||
|
||||
def test_orders_cancel_invalid(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
@@ -348,7 +355,8 @@ class OrdersTest(TestCase):
|
||||
def test_orders_cancel_paid_fee_autorefund(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
self.order.payments.create(provider='testdummy_partialrefund', amount=self.order.total, state=OrderPayment.PAYMENT_STATE_CONFIRMED)
|
||||
with scopes_disabled():
|
||||
self.order.payments.create(provider='testdummy_partialrefund', amount=self.order.total, state=OrderPayment.PAYMENT_STATE_CONFIRMED)
|
||||
self.event.settings.cancel_allow_user_paid = True
|
||||
self.event.settings.cancel_allow_user_paid_keep = Decimal('3.00')
|
||||
response = self.client.get(
|
||||
@@ -366,18 +374,22 @@ class OrdersTest(TestCase):
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
assert self.order.total == Decimal('3.00')
|
||||
assert self.order.refunds.count() == 1
|
||||
with scopes_disabled():
|
||||
assert self.order.refunds.count() == 1
|
||||
|
||||
def test_orders_cancel_paid_fee_no_autorefund(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
self.order.payments.create(provider='testdummy', amount=self.order.total, state=OrderPayment.PAYMENT_STATE_CONFIRMED)
|
||||
with scopes_disabled():
|
||||
self.order.payments.create(provider='testdummy', amount=self.order.total,
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED)
|
||||
self.event.settings.cancel_allow_user_paid = True
|
||||
self.event.settings.cancel_allow_user_paid_keep = Decimal('3.00')
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)
|
||||
)
|
||||
assert response.status_code == 200
|
||||
print(response.rendered_content)
|
||||
assert 'cancellation fee of <strong>€3.00</strong>' in response.rendered_content
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/cancel' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret)
|
||||
@@ -395,7 +407,8 @@ class OrdersTest(TestCase):
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
assert self.order.total == Decimal('3.00')
|
||||
assert self.order.refunds.count() == 0
|
||||
with scopes_disabled():
|
||||
assert self.order.refunds.count() == 0
|
||||
|
||||
def test_orders_cancel_forbidden(self):
|
||||
self.event.settings.set('cancel_allow_user', False)
|
||||
@@ -414,7 +427,8 @@ class OrdersTest(TestCase):
|
||||
|
||||
def test_invoice_create_duplicate(self):
|
||||
self.event.settings.set('invoice_generate', 'user')
|
||||
generate_invoice(self.order)
|
||||
with scopes_disabled():
|
||||
generate_invoice(self.order)
|
||||
response = self.client.post(
|
||||
'/%s/%s/order/%s/%s/invoice' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
{}, follow=True)
|
||||
@@ -422,7 +436,8 @@ class OrdersTest(TestCase):
|
||||
|
||||
def test_invoice_create_wrong_secret(self):
|
||||
self.event.settings.set('invoice_generate', 'user')
|
||||
generate_invoice(self.order)
|
||||
with scopes_disabled():
|
||||
generate_invoice(self.order)
|
||||
response = self.client.post(
|
||||
'/%s/%s/order/%s/%s/invoice' % (self.orga.slug, self.event.slug, self.order.code, '1234'),
|
||||
{})
|
||||
@@ -434,7 +449,8 @@ class OrdersTest(TestCase):
|
||||
'/%s/%s/order/%s/%s/invoice' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
{}, follow=True)
|
||||
assert 'alert-success' in response.rendered_content
|
||||
assert self.order.invoices.exists()
|
||||
with scopes_disabled():
|
||||
assert self.order.invoices.exists()
|
||||
|
||||
def test_orders_download_pending(self):
|
||||
self.event.settings.set('ticket_download', True)
|
||||
@@ -575,11 +591,12 @@ class OrdersTest(TestCase):
|
||||
assert 'alert-danger' in response.rendered_content
|
||||
|
||||
def test_pay_wrong_payment_state(self):
|
||||
p = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CANCELED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
with scopes_disabled():
|
||||
p = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CANCELED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/%d/' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret,
|
||||
p.pk),
|
||||
@@ -602,11 +619,12 @@ class OrdersTest(TestCase):
|
||||
def test_pay_wrong_order_state(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
p = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
with scopes_disabled():
|
||||
p = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/%d/' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret,
|
||||
p.pk),
|
||||
@@ -629,11 +647,12 @@ class OrdersTest(TestCase):
|
||||
def test_pay_change_link(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
p = self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=self.order.total,
|
||||
)
|
||||
with scopes_disabled():
|
||||
p = self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=self.order.total,
|
||||
)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
follow=True
|
||||
@@ -661,13 +680,14 @@ class OrdersTest(TestCase):
|
||||
self.event.settings.set('payment_testdummy__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__fee_reverse_calc', False)
|
||||
self.event.settings.set('payment_testdummy__fee_percent', '10.00')
|
||||
self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
with scopes_disabled():
|
||||
self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
|
||||
generate_invoice(self.order)
|
||||
generate_invoice(self.order)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
)
|
||||
@@ -680,35 +700,37 @@ class OrdersTest(TestCase):
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
fee = self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).last()
|
||||
assert fee.value == Decimal('1.30')
|
||||
assert self.order.total == Decimal('23.00') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
assert p.amount == Decimal('14.30')
|
||||
with scopes_disabled():
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
fee = self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).last()
|
||||
assert fee.value == Decimal('1.30')
|
||||
assert self.order.total == Decimal('23.00') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
assert p.amount == Decimal('14.30')
|
||||
|
||||
def test_change_paymentmethod_partial_with_previous_fee(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__fee_reverse_calc', False)
|
||||
self.event.settings.set('payment_testdummy__fee_percent', '10.00')
|
||||
f = self.order.fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT,
|
||||
value='1.40'
|
||||
)
|
||||
self.order.total += Decimal('1.4')
|
||||
self.order.save()
|
||||
self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=Decimal('11.40'),
|
||||
fee=f
|
||||
)
|
||||
with scopes_disabled():
|
||||
f = self.order.fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT,
|
||||
value='1.40'
|
||||
)
|
||||
self.order.total += Decimal('1.4')
|
||||
self.order.save()
|
||||
self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
|
||||
amount=Decimal('11.40'),
|
||||
fee=f
|
||||
)
|
||||
|
||||
generate_invoice(self.order)
|
||||
generate_invoice(self.order)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
)
|
||||
@@ -721,12 +743,13 @@ class OrdersTest(TestCase):
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
fee = self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).last()
|
||||
assert fee.value == Decimal('1.30')
|
||||
assert self.order.total == Decimal('24.40') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
p = self.order.payments.last()
|
||||
with scopes_disabled():
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
fee = self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).last()
|
||||
assert fee.value == Decimal('1.30')
|
||||
assert self.order.total == Decimal('24.40') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
assert p.amount == Decimal('14.30')
|
||||
@@ -744,11 +767,12 @@ class OrdersTest(TestCase):
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
|
||||
def test_change_paymentmethod_to_same(self):
|
||||
p_old = self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
with scopes_disabled():
|
||||
p_old = self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
self.client.post(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
{
|
||||
@@ -756,7 +780,8 @@ class OrdersTest(TestCase):
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
p_new = self.order.payments.last()
|
||||
with scopes_disabled():
|
||||
p_new = self.order.payments.last()
|
||||
assert p_new.provider == 'banktransfer'
|
||||
assert p_new.id != p_old.id
|
||||
assert p_new.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
@@ -765,11 +790,12 @@ class OrdersTest(TestCase):
|
||||
|
||||
def test_change_paymentmethod_cancel_old(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
p_old = self.order.payments.create(
|
||||
provider='testdummy',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
with scopes_disabled():
|
||||
p_old = self.order.payments.create(
|
||||
provider='testdummy',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('10.00'),
|
||||
)
|
||||
self.client.post(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
{
|
||||
@@ -777,32 +803,34 @@ class OrdersTest(TestCase):
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
p_new = self.order.payments.last()
|
||||
assert p_new.provider == 'banktransfer'
|
||||
assert p_new.id != p_old.id
|
||||
assert p_new.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
p_old.refresh_from_db()
|
||||
assert p_old.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
with scopes_disabled():
|
||||
p_new = self.order.payments.last()
|
||||
assert p_new.provider == 'banktransfer'
|
||||
assert p_new.id != p_old.id
|
||||
assert p_new.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
p_old.refresh_from_db()
|
||||
assert p_old.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
|
||||
def test_change_paymentmethod_delete_fee(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__fee_reverse_calc', False)
|
||||
self.event.settings.set('payment_testdummy__fee_percent', '0.00')
|
||||
f = self.order.fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT,
|
||||
value='1.40'
|
||||
)
|
||||
self.order.total += Decimal('1.4')
|
||||
self.order.save()
|
||||
p0 = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('24.40'),
|
||||
fee=f
|
||||
)
|
||||
with scopes_disabled():
|
||||
f = self.order.fees.create(
|
||||
fee_type=OrderFee.FEE_TYPE_PAYMENT,
|
||||
value='1.40'
|
||||
)
|
||||
self.order.total += Decimal('1.4')
|
||||
self.order.save()
|
||||
p0 = self.order.payments.create(
|
||||
provider='manual',
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=Decimal('24.40'),
|
||||
fee=f
|
||||
)
|
||||
|
||||
generate_invoice(self.order)
|
||||
generate_invoice(self.order)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
)
|
||||
@@ -814,28 +842,30 @@ class OrdersTest(TestCase):
|
||||
'payment': 'testdummy'
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
assert not self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).exists()
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert self.order.invoices.count() == 3
|
||||
p0.refresh_from_db()
|
||||
assert p0.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
assert p.amount == Decimal('23.00')
|
||||
with scopes_disabled():
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.payments.last().provider == 'testdummy'
|
||||
assert not self.order.fees.filter(fee_type=OrderFee.FEE_TYPE_PAYMENT).exists()
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert self.order.invoices.count() == 3
|
||||
p0.refresh_from_db()
|
||||
assert p0.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
assert p.amount == Decimal('23.00')
|
||||
|
||||
def test_change_paymentmethod_available(self):
|
||||
self.event.settings.set('payment_banktransfer__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__enabled', True)
|
||||
self.event.settings.set('payment_testdummy__fee_abs', '12.00')
|
||||
generate_invoice(self.order)
|
||||
self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
amount=self.order.total,
|
||||
)
|
||||
with scopes_disabled():
|
||||
generate_invoice(self.order)
|
||||
self.order.payments.create(
|
||||
provider='banktransfer',
|
||||
state=OrderPayment.PAYMENT_STATE_PENDING,
|
||||
amount=self.order.total,
|
||||
)
|
||||
response = self.client.get(
|
||||
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
|
||||
)
|
||||
@@ -848,24 +878,26 @@ class OrdersTest(TestCase):
|
||||
}
|
||||
)
|
||||
self.order.refresh_from_db()
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
p0 = self.order.payments.first()
|
||||
assert p0.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
assert p0.provider == 'banktransfer'
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('12.00')
|
||||
assert self.order.total == Decimal('23.00') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
with scopes_disabled():
|
||||
p = self.order.payments.last()
|
||||
assert p.provider == 'testdummy'
|
||||
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
|
||||
p0 = self.order.payments.first()
|
||||
assert p0.state == OrderPayment.PAYMENT_STATE_CANCELED
|
||||
assert p0.provider == 'banktransfer'
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('12.00')
|
||||
assert self.order.total == Decimal('23.00') + fee.value
|
||||
assert self.order.invoices.count() == 3
|
||||
|
||||
def test_answer_download_token(self):
|
||||
q = self.event.questions.create(question="Foo", type="F")
|
||||
q.items.add(self.ticket)
|
||||
a = self.ticket_pos.answers.create(question=q, answer="file")
|
||||
val = SimpleUploadedFile("testfile.txt", b"file_content")
|
||||
a.file.save("testfile.txt", val)
|
||||
a.save()
|
||||
with scopes_disabled():
|
||||
q = self.event.questions.create(question="Foo", type="F")
|
||||
q.items.add(self.ticket)
|
||||
a = self.ticket_pos.answers.create(question=q, answer="file")
|
||||
val = SimpleUploadedFile("testfile.txt", b"file_content")
|
||||
a.file.save("testfile.txt", val)
|
||||
a.save()
|
||||
|
||||
self.event.settings.set('ticket_download', True)
|
||||
del self.event.settings['ticket_download_date']
|
||||
|
||||
@@ -2,6 +2,7 @@ from datetime import datetime, timedelta
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from pytz import UTC
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
@@ -176,7 +177,8 @@ def test_ics_subevents(env, client):
|
||||
date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
|
||||
live=True, is_public=True, has_subevents=True
|
||||
)
|
||||
e.subevents.create(date_from=now(), name='SE1', active=True)
|
||||
with scopes_disabled():
|
||||
e.subevents.create(date_from=now(), name='SE1', active=True)
|
||||
r = client.get('/mrmcd/events/ical/')
|
||||
assert b'MRMCD2017' not in r.content
|
||||
assert b'SE1' in r.content
|
||||
@@ -194,7 +196,8 @@ def test_ics_subevents_attributes(env, client):
|
||||
date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
|
||||
live=True, is_public=True, has_subevents=True
|
||||
)
|
||||
se1 = e.subevents.create(date_from=now(), name='SE1', active=True)
|
||||
with scopes_disabled():
|
||||
se1 = e.subevents.create(date_from=now(), name='SE1', active=True)
|
||||
|
||||
prop = env[0].meta_properties.create(name='loc', default='HH')
|
||||
e0.meta_values.create(value='MA', property=prop)
|
||||
|
||||
@@ -3,6 +3,7 @@ import os.path
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import TestCase, override_settings
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.models import Event, Organizer
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
@@ -10,6 +11,7 @@ from pretix.presale.style import regenerate_css, regenerate_organizer_css
|
||||
|
||||
|
||||
class StyleTest(TestCase):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.orga = Organizer.objects.create(name='CCC', slug='ccc')
|
||||
|
||||
@@ -6,6 +6,7 @@ from bs4 import BeautifulSoup
|
||||
from django.conf import settings
|
||||
from django.test import TestCase, override_settings
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from freezegun import freeze_time
|
||||
|
||||
from pretix.base.models import Order, OrderPosition
|
||||
@@ -15,6 +16,7 @@ from .test_cart import CartTestMixin
|
||||
|
||||
|
||||
class WidgetCartTest(CartTestMixin, TestCase):
|
||||
@scopes_disabled()
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.order = Order.objects.create(
|
||||
@@ -202,7 +204,8 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
}
|
||||
|
||||
def test_product_list_view_with_voucher(self):
|
||||
self.event.vouchers.create(item=self.ticket, code="ABCDE")
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code="ABCDE")
|
||||
response = self.client.get('/%s/%s/widget/product_list?voucher=ABCDE' % (self.orga.slug, self.event.slug))
|
||||
assert response['Access-Control-Allow-Origin'] == '*'
|
||||
data = json.loads(response.content.decode())
|
||||
@@ -247,8 +250,9 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
}
|
||||
|
||||
def test_product_list_view_with_voucher_variation_through_quota(self):
|
||||
self.event.vouchers.create(quota=self.quota_shirts, code="ABCDE")
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(quota=self.quota_shirts, code="ABCDE")
|
||||
self.quota_shirts.variations.remove(self.shirt_blue)
|
||||
response = self.client.get('/%s/%s/widget/product_list?voucher=ABCDE' % (self.orga.slug, self.event.slug))
|
||||
assert response['Access-Control-Allow-Origin'] == '*'
|
||||
data = json.loads(response.content.decode())
|
||||
@@ -310,7 +314,8 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
}
|
||||
|
||||
def test_product_list_view_with_voucher_expired(self):
|
||||
self.event.vouchers.create(item=self.ticket, code="ABCDE", valid_until=now() - datetime.timedelta(days=1))
|
||||
with scopes_disabled():
|
||||
self.event.vouchers.create(item=self.ticket, code="ABCDE", valid_until=now() - datetime.timedelta(days=1))
|
||||
response = self.client.get('/%s/%s/widget/product_list?voucher=ABCDE' % (self.orga.slug, self.event.slug))
|
||||
assert response['Access-Control-Allow-Origin'] == '*'
|
||||
data = json.loads(response.content.decode())
|
||||
@@ -374,12 +379,13 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
assert data["items_by_category"][0]["items"][0]["avail"] == [0, None]
|
||||
|
||||
def test_product_list_view_with_bundle_mixed_tax_rate(self):
|
||||
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
self.shirt.tax_rule = self.tr7
|
||||
self.shirt.require_bundling = True
|
||||
self.shirt.save()
|
||||
self.ticket.bundles.create(bundled_item=self.shirt, bundled_variation=self.shirt_blue,
|
||||
designated_price=2, count=1)
|
||||
with scopes_disabled():
|
||||
self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00'))
|
||||
self.shirt.tax_rule = self.tr7
|
||||
self.shirt.require_bundling = True
|
||||
self.shirt.save()
|
||||
self.ticket.bundles.create(bundled_item=self.shirt, bundled_variation=self.shirt_blue,
|
||||
designated_price=2, count=1)
|
||||
response = self.client.get('/%s/%s/widget/product_list' % (self.orga.slug, self.event.slug))
|
||||
assert response['Access-Control-Allow-Origin'] == '*'
|
||||
data = json.loads(response.content.decode())
|
||||
@@ -398,11 +404,12 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
with scopes_disabled():
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
|
||||
response = self.client.get('/%s/%s/widget/product_list' % (self.orga.slug, self.event.slug))
|
||||
data = json.loads(response.content.decode())
|
||||
@@ -422,11 +429,12 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
with scopes_disabled():
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
|
||||
response = self.client.get('/%s/%s/widget/product_list?style=calendar' % (self.orga.slug, self.event.slug))
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
@@ -492,16 +500,17 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
self.orga.events.create(name="Past", live=True, is_public=True, slug='past', date_from=now() - datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Present", live=True, is_public=True, slug='present', date_from=now())
|
||||
self.orga.events.create(name="Future", live=True, is_public=True, slug='future', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Disabled", live=False, is_public=True, slug='disabled', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Secret", live=True, is_public=False, slug='secret', date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
with scopes_disabled():
|
||||
self.orga.events.create(name="Past", live=True, is_public=True, slug='past', date_from=now() - datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Present", live=True, is_public=True, slug='present', date_from=now())
|
||||
self.orga.events.create(name="Future", live=True, is_public=True, slug='future', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Disabled", live=False, is_public=True, slug='disabled', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Secret", live=True, is_public=False, slug='secret', date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
response = self.client.get('/%s/widget/product_list' % (self.orga.slug,))
|
||||
@@ -529,16 +538,17 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
self.event.settings.timezone = 'Europe/Berlin'
|
||||
self.event.save()
|
||||
with freeze_time("2019-01-01 10:00:00"):
|
||||
self.orga.events.create(name="Past", live=True, is_public=True, slug='past', date_from=now() - datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Present", live=True, is_public=True, slug='present', date_from=now())
|
||||
self.orga.events.create(name="Future", live=True, is_public=True, slug='future', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Disabled", live=False, is_public=True, slug='disabled', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Secret", live=True, is_public=False, slug='secret', date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
with scopes_disabled():
|
||||
self.orga.events.create(name="Past", live=True, is_public=True, slug='past', date_from=now() - datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Present", live=True, is_public=True, slug='present', date_from=now())
|
||||
self.orga.events.create(name="Future", live=True, is_public=True, slug='future', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Disabled", live=False, is_public=True, slug='disabled', date_from=now() + datetime.timedelta(days=3))
|
||||
self.orga.events.create(name="Secret", live=True, is_public=False, slug='secret', date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
|
||||
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
|
||||
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
|
||||
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
|
||||
|
||||
response = self.client.get('/%s/widget/product_list?style=calendar' % (self.orga.slug,))
|
||||
settings.SITE_URL = 'http://example.com'
|
||||
|
||||
Reference in New Issue
Block a user