mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
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:
@@ -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
|
||||
|
||||
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
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user