diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 35841618cf..7c51005eb3 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -181,7 +181,7 @@ def filter_available(qs, channel='web', voucher=None, allow_addons=False): class ItemQuerySet(models.QuerySet): def filter_available(self, channel='web', voucher=None, allow_addons=False): - return filter_available(self) + return filter_available(self, channel, voucher, allow_addons) class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__): @@ -190,7 +190,7 @@ class ItemQuerySetManager(ScopedManager(organizer='event__organizer').__class__) self._queryset_class = ItemQuerySet def filter_available(self, channel='web', voucher=None, allow_addons=False): - return filter_available(self.get_queryset()) + return filter_available(self.get_queryset(), channel, voucher, allow_addons) class Item(LoggedModel): diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index d98ba157c5..e8d507b886 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -26,7 +26,7 @@ from django.utils.functional import cached_property from django.utils.timezone import make_aware, now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from django_countries.fields import Country, CountryField -from django_scopes import ScopedManager +from django_scopes import ScopedManager, scopes_disabled from i18nfield.strings import LazyI18nString from jsonfallback.fields import FallbackJSONField @@ -234,6 +234,7 @@ class Order(LockModel, LoggedModel): return self.all_fees(manager='objects') @cached_property + @scopes_disabled() def count_positions(self): if hasattr(self, 'pcnt'): return self.pcnt or 0 @@ -257,6 +258,7 @@ class Order(LockModel, LoggedModel): return None @property + @scopes_disabled() def payment_refund_sum(self): payment_sum = self.payments.filter( state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED) @@ -268,6 +270,7 @@ class Order(LockModel, LoggedModel): return payment_sum - refund_sum @property + @scopes_disabled() def pending_sum(self): total = self.total if self.status == Order.STATUS_CANCELED: @@ -442,6 +445,7 @@ class Order(LockModel, LoggedModel): return round_decimal(fee, self.event.currency) @property + @scopes_disabled() def user_cancel_allowed(self) -> bool: """ Returns whether or not this order can be canceled by the user. diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index b767b08da0..378beacace 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -10,6 +10,7 @@ from django.db.models import Q from django.dispatch import receiver from django.utils.timezone import make_aware, now from django.utils.translation import pgettext_lazy, ugettext as _ +from django_scopes import scopes_disabled from pretix.base.i18n import language from pretix.base.models import ( @@ -916,7 +917,8 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, lo ia = False if invoice_address: try: - ia = InvoiceAddress.objects.get(pk=invoice_address) + with scopes_disabled(): + ia = InvoiceAddress.objects.get(pk=invoice_address) except InvoiceAddress.DoesNotExist: pass @@ -984,7 +986,8 @@ def set_cart_addons(self, event: Event, addons: List[dict], cart_id: str=None, l ia = False if invoice_address: try: - ia = InvoiceAddress.objects.get(pk=invoice_address) + with scopes_disabled(): + ia = InvoiceAddress.objects.get(pk=invoice_address) except InvoiceAddress.DoesNotExist: pass try: diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 7e069def3c..b2997d5f88 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -731,7 +731,8 @@ def _perform_order(event: Event, payment_provider: str, position_ids: List[str], addr = None if address is not None: try: - addr = InvoiceAddress.objects.get(pk=address) + with scopes_disabled(): + addr = InvoiceAddress.objects.get(pk=address) except InvoiceAddress.DoesNotExist: pass diff --git a/src/pretix/base/services/tasks.py b/src/pretix/base/services/tasks.py index 5204055787..71a461eefc 100644 --- a/src/pretix/base/services/tasks.py +++ b/src/pretix/base/services/tasks.py @@ -71,6 +71,11 @@ class EventTask(app.Task): event = Event.objects.select_related('organizer').get(pk=event_id) del kwargs['event_id'] kwargs['event'] = event + elif 'event' in kwargs: + event_id = kwargs.get('event') + with scopes_disabled(): + event = Event.objects.select_related('organizer').get(pk=event_id) + kwargs['event'] = event else: args = list(args) event_id = args[0] diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index dfa0999a18..8be6703bec 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -5,6 +5,7 @@ from django.conf import settings from django.db.models import Q from django.urls import Resolver404, get_script_prefix, resolve from django.utils.translation import get_language +from django_scopes import scope from pretix.base.models.auth import StaffSession from pretix.base.settings import GlobalSettingsObject @@ -53,10 +54,11 @@ def contextprocessor(request): ctx['has_domain'] = request.event.organizer.domains.exists() if not request.event.testmode: - complain_testmode_orders = request.event.cache.get('complain_testmode_orders') - if complain_testmode_orders is None: - complain_testmode_orders = request.event.orders.filter(testmode=True).exists() - request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30) + with scope(organizer=request.organizer): + complain_testmode_orders = request.event.cache.get('complain_testmode_orders') + if complain_testmode_orders is None: + complain_testmode_orders = request.event.orders.filter(testmode=True).exists() + request.event.cache.set('complain_testmode_orders', complain_testmode_orders, 30) ctx['complain_testmode_orders'] = complain_testmode_orders else: ctx['complain_testmode_orders'] = False diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index 9523a9fbec..118af4eefb 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -6,7 +6,7 @@ from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.utils.safestring import mark_safe from django.utils.translation import pgettext_lazy, ugettext_lazy as _ -from django_scopes.forms import SafeModelChoiceField +from django_scopes.forms import SafeModelMultipleChoiceField from i18nfield.forms import I18nFormField, I18nTextarea from pretix.api.models import WebHook @@ -151,7 +151,7 @@ class TeamForm(forms.ModelForm): }), } field_classes = { - 'limit_events': SafeModelChoiceField + 'limit_events': SafeModelMultipleChoiceField } def clean(self): @@ -182,7 +182,7 @@ class DeviceForm(forms.ModelForm): }), } field_classes = { - 'limit_events': SafeModelChoiceField + 'limit_events': SafeModelMultipleChoiceField } @@ -315,5 +315,5 @@ class WebHookForm(forms.ModelForm): }), } field_classes = { - 'limit_events': SafeModelChoiceField + 'limit_events': SafeModelMultipleChoiceField } diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 1e92c2dde7..4eb26ed0bd 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -4,6 +4,7 @@ from django.conf import settings from django.contrib.auth import REDIRECT_FIELD_NAME, logout from django.http import Http404 from django.shortcuts import get_object_or_404, redirect, resolve_url +from django.template.response import TemplateResponse from django.urls import get_script_prefix, resolve, reverse from django.utils.encoding import force_str from django.utils.translation import ugettext as _ @@ -110,7 +111,10 @@ class PermissionMiddleware: request.orgapermset = request.user.get_organizer_permission_set(request.organizer) with scope(organizer=getattr(request, 'organizer', None)): - return self.get_response(request) + r = self.get_response(request) + if isinstance(r, TemplateResponse): + r = r.render() + return r class AuditLogMiddleware: diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 1a00159808..31cf17d0f4 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -13,6 +13,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST +from django_scopes import scopes_disabled from paypalrestsdk.openid_connect import Tokeninfo from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota @@ -133,6 +134,7 @@ def abort(request, *args, **kwargs): @csrf_exempt @require_POST +@scopes_disabled() def webhook(request, *args, **kwargs): event_body = request.body.decode('utf-8').strip() event_json = json.loads(event_body) diff --git a/src/pretix/plugins/pretixdroid/views.py b/src/pretix/plugins/pretixdroid/views.py index 4dfd57b345..5523cbb154 100644 --- a/src/pretix/plugins/pretixdroid/views.py +++ b/src/pretix/plugins/pretixdroid/views.py @@ -17,6 +17,7 @@ from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView, View +from django_scopes import scope, scopes_disabled from pretix.base.models import Checkin, Event, Order, OrderPosition from pretix.base.models.event import SubEvent @@ -124,34 +125,35 @@ class ConfigView(EventPermissionRequiredMixin, TemplateView): class ApiView(View): @method_decorator(csrf_exempt) def dispatch(self, request, **kwargs): - try: - self.event = Event.objects.get( - slug=self.kwargs['event'], - organizer__slug=self.kwargs['organizer'] - ) - except Event.DoesNotExist: - return HttpResponseNotFound('Unknown event') + with scopes_disabled(): + try: + self.event = Event.objects.get( + slug=self.kwargs['event'], + organizer__slug=self.kwargs['organizer'] + ) + except Event.DoesNotExist: + return HttpResponseNotFound('Unknown event') + with scope(organizer=self.event.organizer): + try: + self.config = self.event.appconfiguration_set.get(key=request.GET.get("key", "-unset-")) + except AppConfiguration.DoesNotExist: + return HttpResponseForbidden('Invalid key') - try: - self.config = self.event.appconfiguration_set.get(key=request.GET.get("key", "-unset-")) - except AppConfiguration.DoesNotExist: - return HttpResponseForbidden('Invalid key') - - self.subevent = None - if self.event.has_subevents: - if self.config.list.subevent: - self.subevent = self.config.list.subevent - if 'subevent' in kwargs and kwargs['subevent'] != str(self.subevent.pk): - return HttpResponseForbidden('Invalid subevent selected.') - elif 'subevent' in kwargs: - self.subevent = get_object_or_404(SubEvent, event=self.event, pk=kwargs['subevent']) + self.subevent = None + if self.event.has_subevents: + if self.config.list.subevent: + self.subevent = self.config.list.subevent + if 'subevent' in kwargs and kwargs['subevent'] != str(self.subevent.pk): + return HttpResponseForbidden('Invalid subevent selected.') + elif 'subevent' in kwargs: + self.subevent = get_object_or_404(SubEvent, event=self.event, pk=kwargs['subevent']) + else: + return HttpResponseForbidden('No subevent selected.') else: - return HttpResponseForbidden('No subevent selected.') - else: - if 'subevent' in kwargs: - return HttpResponseForbidden('Subevents not enabled.') + if 'subevent' in kwargs: + return HttpResponseForbidden('Subevents not enabled.') - return super().dispatch(request, **kwargs) + return super().dispatch(request, **kwargs) class ApiRedeemView(ApiView): diff --git a/src/pretix/plugins/stripe/views.py b/src/pretix/plugins/stripe/views.py index 48d382b0fe..d50e77b49d 100644 --- a/src/pretix/plugins/stripe/views.py +++ b/src/pretix/plugins/stripe/views.py @@ -17,6 +17,7 @@ from django.views import View from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST +from django_scopes import scopes_disabled from pretix.base.models import Event, Order, OrderPayment, Quota from pretix.base.payment import PaymentException @@ -140,6 +141,7 @@ def oauth_return(request, *args, **kwargs): @csrf_exempt @require_POST +@scopes_disabled() def webhook(request, *args, **kwargs): event_json = json.loads(request.body.decode('utf-8')) diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py index c6171b7217..c88ed7ffd8 100644 --- a/src/pretix/presale/checkoutflow.py +++ b/src/pretix/presale/checkoutflow.py @@ -12,6 +12,7 @@ from django.utils.translation import ( get_language, pgettext_lazy, ugettext_lazy as _, ) from django.views.generic.base import TemplateResponseMixin +from django_scopes import scopes_disabled from pretix.base.models import Order from pretix.base.models.orders import InvoiceAddress, OrderPayment @@ -114,7 +115,10 @@ class BaseCheckoutFlowStep: self.request._checkout_flow_invoice_address = InvoiceAddress() else: try: - self.request._checkout_flow_invoice_address = InvoiceAddress.objects.get(pk=iapk, order__isnull=True) + with scopes_disabled(): + self.request._checkout_flow_invoice_address = InvoiceAddress.objects.get( + pk=iapk, order__isnull=True + ) except InvoiceAddress.DoesNotExist: self.request._checkout_flow_invoice_address = InvoiceAddress() return self.request._checkout_flow_invoice_address diff --git a/src/pretix/presale/views/__init__.py b/src/pretix/presale/views/__init__.py index ac85c2c116..76163a708e 100644 --- a/src/pretix/presale/views/__init__.py +++ b/src/pretix/presale/views/__init__.py @@ -9,6 +9,7 @@ from django.db.models import Prefetch, Sum from django.utils.decorators import available_attrs from django.utils.functional import cached_property from django.utils.timezone import now +from django_scopes import scopes_disabled from pretix.base.i18n import language from pretix.base.models import ( @@ -40,7 +41,10 @@ class CartMixin: self.request._checkout_flow_invoice_address = InvoiceAddress() else: try: - self.request._checkout_flow_invoice_address = InvoiceAddress.objects.get(pk=iapk, order__isnull=True) + with scopes_disabled(): + self.request._checkout_flow_invoice_address = InvoiceAddress.objects.get( + pk=iapk, order__isnull=True + ) except InvoiceAddress.DoesNotExist: self.request._checkout_flow_invoice_address = InvoiceAddress() return self.request._checkout_flow_invoice_address @@ -215,7 +219,8 @@ def get_cart_invoice_address(request): request._checkout_flow_invoice_address = InvoiceAddress() else: try: - request._checkout_flow_invoice_address = InvoiceAddress.objects.get(pk=iapk, order__isnull=True) + with scopes_disabled(): + request._checkout_flow_invoice_address = InvoiceAddress.objects.get(pk=iapk, order__isnull=True) except InvoiceAddress.DoesNotExist: request._checkout_flow_invoice_address = InvoiceAddress() return request._checkout_flow_invoice_address diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 5174584a22..6977873037 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -17,6 +17,7 @@ from django.utils.timezone import now from django.utils.translation import ugettext as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import TemplateView, View +from django_scopes import scopes_disabled from pretix.base.models import ( CartPosition, InvoiceAddress, QuestionAnswer, SubEvent, Voucher, @@ -80,7 +81,8 @@ class CartActionMixin: return InvoiceAddress() try: - return InvoiceAddress.objects.get(pk=iapk, order__isnull=True) + with scopes_disabled(): + return InvoiceAddress.objects.get(pk=iapk, order__isnull=True) except InvoiceAddress.DoesNotExist: return InvoiceAddress() diff --git a/src/pretix/testutils/scope.py b/src/pretix/testutils/scope.py new file mode 100644 index 0000000000..dc61f1e67f --- /dev/null +++ b/src/pretix/testutils/scope.py @@ -0,0 +1,10 @@ +from django_scopes import scope + + +def classscope(attr='o'): + def wrap(fn): + def wrapped(self, *args, **kwargs): + with scope(organizer=getattr(self, attr)): + return fn(self, *args, **kwargs) + return wrapped + return wrap diff --git a/src/pretix/testutils/settings.py b/src/pretix/testutils/settings.py index a78a3e4ccf..bf3dde10e3 100644 --- a/src/pretix/testutils/settings.py +++ b/src/pretix/testutils/settings.py @@ -12,6 +12,7 @@ from pretix.settings import * # NOQA DATA_DIR = tmpdir.name LOG_DIR = os.path.join(DATA_DIR, 'logs') MEDIA_ROOT = os.path.join(DATA_DIR, 'media') +SITE_URL = "http://example.com" atexit.register(tmpdir.cleanup) diff --git a/src/tests/api/test_taxrules.py b/src/tests/api/test_taxrules.py index 05c072027e..3899df9763 100644 --- a/src/tests/api/test_taxrules.py +++ b/src/tests/api/test_taxrules.py @@ -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), ) diff --git a/src/tests/base/__init__.py b/src/tests/base/__init__.py index 2bfc4affc7..6b5caff927 100644 --- a/src/tests/base/__init__.py +++ b/src/tests/base/__init__.py @@ -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") diff --git a/src/tests/base/test_invoices.py b/src/tests/base/test_invoices.py index 744574a4d7..a15a7e03cd 100644 --- a/src/tests/base/test_invoices.py +++ b/src/tests/base/test_invoices.py @@ -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' diff --git a/src/tests/base/test_locking.py b/src/tests/base/test_locking.py index 320cd6cf03..7e94f16a2e 100644 --- a/src/tests/base/test_locking.py +++ b/src/tests/base/test_locking.py @@ -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 diff --git a/src/tests/base/test_mail.py b/src/tests/base/test_mail.py index aa5d590ace..ab7ea62313 100644 --- a/src/tests/base/test_mail.py +++ b/src/tests/base/test_mail.py @@ -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 diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 6068a47ea7..97bb556096 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -12,6 +12,7 @@ from django.core.files.storage import default_storage from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase from django.utils.timezone import now +from django_scopes import scope from pretix.base.i18n import language from pretix.base.models import ( @@ -25,6 +26,7 @@ from pretix.base.models.items import ( ) from pretix.base.reldate import RelativeDate, RelativeDateWrapper from pretix.base.services.orders import OrderError, cancel_order, perform_order +from pretix.testutils.scope import classscope class UserTestCase(TestCase): @@ -44,9 +46,9 @@ class UserTestCase(TestCase): class BaseQuotaTestCase(TestCase): def setUp(self): - o = Organizer.objects.create(name='Dummy', slug='dummy') + self.o = Organizer.objects.create(name='Dummy', slug='dummy') self.event = Event.objects.create( - organizer=o, name='Dummy', slug='dummy', + organizer=self.o, name='Dummy', slug='dummy', date_from=now(), plugins='tests.testdummy' ) self.quota = Quota.objects.create(name="Test", size=2, event=self.event) @@ -60,6 +62,7 @@ class BaseQuotaTestCase(TestCase): class QuotaTestCase(BaseQuotaTestCase): + @classscope(attr='o') def test_available(self): self.quota.items.add(self.item1) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 2)) @@ -72,6 +75,7 @@ class QuotaTestCase(BaseQuotaTestCase): pass self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_OK, 2)) + @classscope(attr='o') def test_sold_out(self): self.quota.items.add(self.item1) order = Order.objects.create(event=self.event, status=Order.STATUS_PAID, @@ -93,6 +97,7 @@ class QuotaTestCase(BaseQuotaTestCase): OrderPosition.objects.create(order=order, item=self.item2, variation=self.var1, price=2) self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_GONE, 0)) + @classscope(attr='o') def test_ordered(self): self.quota.items.add(self.item1) order = Order.objects.create(event=self.event, status=Order.STATUS_PAID, @@ -115,6 +120,7 @@ class QuotaTestCase(BaseQuotaTestCase): order.save() self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_ordered_multi_quota(self): quota2 = Quota.objects.create(name="Test", size=2, event=self.event) quota2.items.add(self.item2) @@ -129,6 +135,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(quota2.availability(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_position_canceled(self): self.quota.items.add(self.item1) self.quota.size = 3 @@ -142,6 +149,7 @@ class QuotaTestCase(BaseQuotaTestCase): op.save() self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 3)) + @classscope(attr='o') def test_reserved(self): self.quota.items.add(self.item1) self.quota.size = 3 @@ -172,6 +180,7 @@ class QuotaTestCase(BaseQuotaTestCase): price=2, expires=now() + timedelta(days=3)) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_RESERVED, 0)) + @classscope(attr='o') def test_multiple(self): self.quota.items.add(self.item1) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 2)) @@ -184,6 +193,7 @@ class QuotaTestCase(BaseQuotaTestCase): quota2.save() self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_GONE, 0)) + @classscope(attr='o') def test_ignore_quotas(self): self.quota.items.add(self.item1) quota2 = Quota.objects.create(event=self.event, name="Test 2", size=0) @@ -193,6 +203,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.item1.check_quotas(ignored_quotas=[self.quota, quota2]), (Quota.AVAILABILITY_OK, sys.maxsize)) + @classscope(attr='o') def test_unlimited(self): self.quota.items.add(self.item1) order = Order.objects.create(event=self.event, status=Order.STATUS_PAID, @@ -206,6 +217,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.quota.save() self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, None)) + @classscope(attr='o') def test_voucher_product(self): self.quota.items.add(self.item1) self.quota.size = 1 @@ -219,6 +231,7 @@ class QuotaTestCase(BaseQuotaTestCase): v.save() self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) + @classscope(attr='o') def test_voucher_variation(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -232,6 +245,7 @@ class QuotaTestCase(BaseQuotaTestCase): v.save() self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) + @classscope(attr='o') def test_voucher_quota(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -245,6 +259,7 @@ class QuotaTestCase(BaseQuotaTestCase): v.save() self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) + @classscope(attr='o') def test_voucher_quota_multiuse(self): self.quota.size = 5 self.quota.variations.add(self.var1) @@ -254,12 +269,14 @@ class QuotaTestCase(BaseQuotaTestCase): Voucher.objects.create(quota=self.quota, event=self.event, block_quota=True, max_usages=2) self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) + @classscope(attr='o') def test_voucher_multiuse_count_overredeemed(self): if 'sqlite' not in settings.DATABASES['default']['ENGINE']: pytest.xfail('This should raise a type error on most databases') Voucher.objects.create(quota=self.quota, event=self.event, block_quota=True, max_usages=2, redeemed=4) self.assertEqual(self.quota.count_blocking_vouchers(), 0) + @classscope(attr='o') def test_voucher_quota_multiuse_multiproduct(self): q2 = Quota.objects.create(event=self.event, name="foo", size=10) q2.items.add(self.item1) @@ -278,6 +295,7 @@ class QuotaTestCase(BaseQuotaTestCase): redeemed=2) self.assertEqual(self.quota.count_blocking_vouchers(), 9) + @classscope(attr='o') def test_voucher_quota_expiring_soon(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -286,6 +304,7 @@ class QuotaTestCase(BaseQuotaTestCase): block_quota=True) self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) + @classscope(attr='o') def test_voucher_quota_expired(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -295,6 +314,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) self.assertFalse(v.is_active()) + @classscope(attr='o') def test_blocking_voucher_in_cart(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event, valid_until=now() + timedelta(days=5), @@ -306,6 +326,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.quota.count_in_cart(), 0) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_blocking_voucher_in_cart_inifinitely_valid(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event, block_quota=True) @@ -315,6 +336,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.quota.count_in_cart(), 0) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_blocking_expired_voucher_in_cart(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event, valid_until=now() - timedelta(days=5), @@ -325,6 +347,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.quota.count_in_cart(), 1) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_nonblocking_voucher_in_cart(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event) @@ -334,6 +357,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.quota.count_in_cart(), 1) self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_waitinglist_item_active(self): self.quota.items.add(self.item1) self.quota.size = 1 @@ -344,6 +368,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.item1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) self.assertEqual(self.item1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_waitinglist_variation_active(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -354,6 +379,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_ORDERED, 0)) self.assertEqual(self.var1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_waitinglist_variation_fulfilled(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -365,6 +391,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) self.assertEqual(self.var1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_waitinglist_variation_other(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -375,6 +402,7 @@ class QuotaTestCase(BaseQuotaTestCase): self.assertEqual(self.var1.check_quotas(), (Quota.AVAILABILITY_OK, 1)) self.assertEqual(self.var1.check_quotas(count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_quota_cache(self): self.quota.variations.add(self.var1) self.quota.size = 1 @@ -396,6 +424,7 @@ class QuotaTestCase(BaseQuotaTestCase): with self.assertNumQueries(1): self.assertEqual(self.var1.check_quotas(_cache=cache, count_waitinglist=False), (Quota.AVAILABILITY_OK, 1)) + @classscope(attr='o') def test_subevent_isolation(self): self.event.has_subevents = True self.event.save() @@ -480,17 +509,21 @@ class BundleQuotaTestCase(BaseQuotaTestCase): count=1 ) + @classscope(attr='o') def test_only_respect_with_flag(self): assert self.item1.check_quotas() == (Quota.AVAILABILITY_OK, 5) + @classscope(attr='o') def test_do_not_exceed(self): assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5) + @classscope(attr='o') def test_limited_by_bundled_quita(self): self.transquota.size = 3 self.transquota.save() assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 3) + @classscope(attr='o') def test_multiple_bundles(self): ItemBundle.objects.create( base_item=self.item1, @@ -502,6 +535,7 @@ class BundleQuotaTestCase(BaseQuotaTestCase): self.transquota.save() assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1) + @classscope(attr='o') def test_bundle_count(self): self.bundle1.count = 2 self.bundle1.save() @@ -509,29 +543,35 @@ class BundleQuotaTestCase(BaseQuotaTestCase): self.transquota.save() assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1) + @classscope(attr='o') def test_bundled_unlimited(self): self.transquota.size = None self.transquota.save() assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5) assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5) + @classscope(attr='o') def test_item_unlimited(self): self.quota.size = None self.quota.save() assert self.item1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 10) assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 10) + @classscope(attr='o') def test_var_only_respect_with_flag(self): assert self.var1.check_quotas() == (Quota.AVAILABILITY_OK, 5) + @classscope(attr='o') def test_var_do_not_exceed(self): assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 5) + @classscope(attr='o') def test_var_limited_by_bundled_quita(self): self.transquota.size = 3 self.transquota.save() assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 3) + @classscope(attr='o') def test_var_multiple_bundles(self): ItemBundle.objects.create( base_item=self.item2, @@ -543,6 +583,7 @@ class BundleQuotaTestCase(BaseQuotaTestCase): self.transquota.save() assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1) + @classscope(attr='o') def test_var_bundle_count(self): self.bundle2.count = 2 self.bundle2.save() @@ -550,6 +591,7 @@ class BundleQuotaTestCase(BaseQuotaTestCase): self.transquota.save() assert self.var1.check_quotas(include_bundled=True) == (Quota.AVAILABILITY_OK, 1) + @classscope(attr='o') def test_bundled_variation(self): v = self.trans.variations.create(value="foo", default_price=4) self.transquota.variations.add(v) @@ -562,6 +604,7 @@ class BundleQuotaTestCase(BaseQuotaTestCase): class WaitingListTestCase(BaseQuotaTestCase): + @classscope(attr='o') def test_duplicate(self): w1 = WaitingListEntry.objects.create( event=self.event, item=self.item2, variation=self.var1, email='foo@bar.com' @@ -573,6 +616,7 @@ class WaitingListTestCase(BaseQuotaTestCase): with self.assertRaises(ValidationError): w2.clean() + @classscope(attr='o') def test_duplicate_of_successful(self): v = Voucher.objects.create(quota=self.quota, event=self.event, block_quota=True, redeemed=1) w1 = WaitingListEntry.objects.create( @@ -585,6 +629,7 @@ class WaitingListTestCase(BaseQuotaTestCase): ) w2.clean() + @classscope(attr='o') def test_missing_variation(self): w2 = WaitingListEntry( event=self.event, item=self.item2, email='foo@bar.com' @@ -595,6 +640,7 @@ class WaitingListTestCase(BaseQuotaTestCase): class VoucherTestCase(BaseQuotaTestCase): + @classscope(attr='o') def test_voucher_reuse(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event, valid_until=now() + timedelta(days=5)) @@ -631,18 +677,21 @@ class VoucherTestCase(BaseQuotaTestCase): expires=now() + timedelta(days=3), voucher=v) perform_order(event=self.event.id, payment_provider='free', positions=[cart.id]) + @classscope(attr='o') def test_voucher_applicability_quota(self): self.quota.items.add(self.item1) v = Voucher.objects.create(quota=self.quota, event=self.event) self.assertTrue(v.applies_to(self.item1)) self.assertFalse(v.applies_to(self.item2)) + @classscope(attr='o') def test_voucher_applicability_item(self): v = Voucher.objects.create(item=self.var1.item, event=self.event) self.assertFalse(v.applies_to(self.item1)) self.assertTrue(v.applies_to(self.var1.item)) self.assertTrue(v.applies_to(self.var1.item, self.var1)) + @classscope(attr='o') def test_voucher_applicability_variation(self): v = Voucher.objects.create(item=self.var1.item, variation=self.var1, event=self.event) self.assertFalse(v.applies_to(self.item1)) @@ -650,6 +699,7 @@ class VoucherTestCase(BaseQuotaTestCase): self.assertTrue(v.applies_to(self.var1.item, self.var1)) self.assertFalse(v.applies_to(self.var1.item, self.var2)) + @classscope(attr='o') def test_voucher_applicability_variation_through_quota(self): self.quota.variations.add(self.var1) self.quota.items.add(self.var1.item) @@ -659,51 +709,62 @@ class VoucherTestCase(BaseQuotaTestCase): self.assertTrue(v.applies_to(self.var1.item, self.var1)) self.assertFalse(v.applies_to(self.var1.item, self.var2)) + @classscope(attr='o') def test_voucher_no_item_with_quota(self): with self.assertRaises(ValidationError): v = Voucher(quota=self.quota, item=self.item1, event=self.event) v.clean() + @classscope(attr='o') def test_voucher_item_with_no_variation(self): with self.assertRaises(ValidationError): v = Voucher(item=self.item1, variation=self.var1, event=self.event) v.clean() + @classscope(attr='o') def test_voucher_item_does_not_match_variation(self): with self.assertRaises(ValidationError): v = Voucher(item=self.item2, variation=self.var3, event=self.event) v.clean() + @classscope(attr='o') def test_voucher_specify_variation_for_block_quota(self): with self.assertRaises(ValidationError): v = Voucher(item=self.item2, block_quota=True, event=self.event) v.clean() + @classscope(attr='o') def test_voucher_no_item_but_variation(self): with self.assertRaises(ValidationError): v = Voucher(variation=self.var1, event=self.event) v.clean() + @classscope(attr='o') def test_calculate_price_none(self): v = Voucher.objects.create(event=self.event, price_mode='none', value=Decimal('10.00')) assert v.calculate_price(Decimal('23.42')) == Decimal('23.42') + @classscope(attr='o') def test_calculate_price_set_empty(self): v = Voucher.objects.create(event=self.event, price_mode='set') assert v.calculate_price(Decimal('23.42')) == Decimal('23.42') + @classscope(attr='o') def test_calculate_price_set(self): v = Voucher.objects.create(event=self.event, price_mode='set', value=Decimal('10.00')) assert v.calculate_price(Decimal('23.42')) == Decimal('10.00') + @classscope(attr='o') def test_calculate_price_set_zero(self): v = Voucher.objects.create(event=self.event, price_mode='set', value=Decimal('0.00')) assert v.calculate_price(Decimal('23.42')) == Decimal('0.00') + @classscope(attr='o') def test_calculate_price_subtract(self): v = Voucher.objects.create(event=self.event, price_mode='subtract', value=Decimal('10.00')) assert v.calculate_price(Decimal('23.42')) == Decimal('13.42') + @classscope(attr='o') def test_calculate_price_percent(self): v = Voucher.objects.create(event=self.event, price_mode='percent', value=Decimal('23.00')) assert v.calculate_price(Decimal('100.00')) == Decimal('77.00') @@ -712,18 +773,20 @@ class VoucherTestCase(BaseQuotaTestCase): class OrderTestCase(BaseQuotaTestCase): def setUp(self): super().setUp() - self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') - self.order = Order.objects.create( - status=Order.STATUS_PENDING, event=self.event, - datetime=now() - timedelta(days=5), - expires=now() + timedelta(days=5), total=46, - ) - self.quota.items.add(self.item1) - self.op1 = OrderPosition.objects.create(order=self.order, item=self.item1, - variation=None, price=23) - self.op2 = OrderPosition.objects.create(order=self.order, item=self.item1, - variation=None, price=23) + with scope(organizer=self.o): + self.user = User.objects.create_user('dummy@dummy.dummy', 'dummy') + self.order = Order.objects.create( + status=Order.STATUS_PENDING, event=self.event, + datetime=now() - timedelta(days=5), + expires=now() + timedelta(days=5), total=46, + ) + self.quota.items.add(self.item1) + self.op1 = OrderPosition.objects.create(order=self.order, item=self.item1, + variation=None, price=23) + self.op2 = OrderPosition.objects.create(order=self.order, item=self.item1, + variation=None, price=23) + @classscope(attr='o') def test_paid_in_time(self): self.quota.size = 0 self.quota.save() @@ -734,6 +797,7 @@ class OrderTestCase(BaseQuotaTestCase): self.assertEqual(self.order.status, Order.STATUS_PAID) assert not self.order.all_logentries().filter(action_type='pretix.event.order.overpaid').exists() + @classscope(attr='o') def test_paid_expired_available(self): self.event.settings.payment_term_last = (now() + timedelta(days=2)).strftime('%Y-%m-%d') self.order.status = Order.STATUS_EXPIRED @@ -745,6 +809,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_PAID) + @classscope(attr='o') def test_paid_expired_after_last_date(self): self.event.settings.payment_term_last = (now() - timedelta(days=2)).strftime('%Y-%m-%d') self.order.status = Order.STATUS_EXPIRED @@ -757,6 +822,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_EXPIRED) + @classscope(attr='o') def test_paid_expired_after_last_date_subevent_relative(self): self.event.has_subevents = True self.event.save() @@ -782,6 +848,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.has_subevents = False self.event.save() + @classscope(attr='o') def test_paid_expired_late_not_allowed(self): self.event.settings.payment_term_accept_late = False self.order.status = Order.STATUS_EXPIRED @@ -794,6 +861,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_EXPIRED) + @classscope(attr='o') def test_paid_expired_unavailable(self): self.event.settings.payment_term_accept_late = True self.order.expires = now() - timedelta(days=2) @@ -808,6 +876,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertIn(self.order.status, (Order.STATUS_PENDING, Order.STATUS_EXPIRED)) + @classscope(attr='o') def test_paid_after_deadline_but_not_expired(self): self.event.settings.payment_term_accept_late = True self.order.expires = now() - timedelta(days=2) @@ -818,6 +887,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_PAID) + @classscope(attr='o') def test_paid_expired_unavailable_force(self): self.event.settings.payment_term_accept_late = True self.order.expires = now() - timedelta(days=2) @@ -831,6 +901,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_PAID) + @classscope(attr='o') def test_paid_expired_unavailable_waiting_list(self): self.event.settings.payment_term_accept_late = True self.event.waitinglistentries.create(item=self.item1, email='foo@bar.com') @@ -846,6 +917,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_EXPIRED) + @classscope(attr='o') def test_paid_expired_unavailable_waiting_list_ignore(self): self.event.waitinglistentries.create(item=self.item1, email='foo@bar.com') self.order.expires = now() - timedelta(days=2) @@ -859,6 +931,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(id=self.order.id) self.assertEqual(self.order.status, Order.STATUS_PAID) + @classscope(attr='o') def test_paid_overpaid(self): self.quota.size = 2 self.quota.save() @@ -869,6 +942,7 @@ class OrderTestCase(BaseQuotaTestCase): self.assertEqual(self.order.status, Order.STATUS_PAID) assert self.order.all_logentries().filter(action_type='pretix.event.order.overpaid').exists() + @classscope(attr='o') def test_can_modify_answers(self): self.event.settings.set('invoice_address_asked', False) self.event.settings.set('attendee_names_asked', True) @@ -887,6 +961,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.settings.set('last_order_modification_date', now() - timedelta(days=1)) assert not self.order.can_modify_answers + @classscope(attr='o') def test_can_modify_answers_subevent(self): self.event.has_subevents = True self.event.save() @@ -907,6 +982,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.has_subevents = False self.event.save() + @classscope(attr='o') def test_payment_term_last_relative(self): self.event.settings.set('payment_term_last', date(2017, 5, 3)) assert self.order.payment_term_last == datetime.datetime(2017, 5, 3, 23, 59, 59, tzinfo=pytz.UTC) @@ -917,6 +993,7 @@ class OrderTestCase(BaseQuotaTestCase): )) assert self.order.payment_term_last == datetime.datetime(2017, 5, 1, 23, 59, 59, tzinfo=pytz.UTC) + @classscope(attr='o') def test_payment_term_last_subevent(self): self.event.has_subevents = True self.event.save() @@ -937,6 +1014,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.has_subevents = False self.event.save() + @classscope(attr='o') def test_ticket_download_date_relative(self): self.event.settings.set('ticket_download_date', datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=pytz.UTC)) assert self.order.ticket_download_date == datetime.datetime(2017, 5, 3, 12, 59, 59, tzinfo=pytz.UTC) @@ -947,6 +1025,7 @@ class OrderTestCase(BaseQuotaTestCase): )) assert self.order.ticket_download_date == datetime.datetime(2017, 5, 1, 12, 0, 0, tzinfo=pytz.UTC) + @classscope(attr='o') def test_ticket_download_date_subevent(self): self.event.has_subevents = True self.event.save() @@ -967,6 +1046,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.has_subevents = False self.event.save() + @classscope(attr='o') def test_can_cancel_order(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=True) @@ -976,6 +1056,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.settings.cancel_allow_user = False assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_can_cancel_order_free(self): self.order.status = Order.STATUS_PAID self.order.total = Decimal('0.00') @@ -984,6 +1065,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.settings.cancel_allow_user = False assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_can_cancel_order_paid(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -992,6 +1074,7 @@ class OrderTestCase(BaseQuotaTestCase): self.event.settings.cancel_allow_user_paid = True assert self.order.user_cancel_allowed + @classscope(attr='o') def test_can_cancel_checked_in(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1004,6 +1087,7 @@ class OrderTestCase(BaseQuotaTestCase): ) assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_can_cancel_order_multiple(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=True) @@ -1015,6 +1099,7 @@ class OrderTestCase(BaseQuotaTestCase): variation=None, price=23) assert self.order.user_cancel_allowed + @classscope(attr='o') def test_can_not_cancel_order(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=False) @@ -1022,6 +1107,7 @@ class OrderTestCase(BaseQuotaTestCase): variation=None, price=23) assert self.order.user_cancel_allowed is False + @classscope(attr='o') def test_can_not_cancel_order_multiple(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=False) @@ -1033,6 +1119,7 @@ class OrderTestCase(BaseQuotaTestCase): variation=None, price=23) assert self.order.user_cancel_allowed is False + @classscope(attr='o') def test_can_not_cancel_order_multiple_mixed(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=False) @@ -1044,6 +1131,7 @@ class OrderTestCase(BaseQuotaTestCase): variation=None, price=23) assert self.order.user_cancel_allowed is False + @classscope(attr='o') def test_no_duplicate_position_secret(self): item1 = Item.objects.create(event=self.event, name="Ticket", default_price=23, admission=True, allow_cancel=False) @@ -1054,6 +1142,7 @@ class OrderTestCase(BaseQuotaTestCase): assert p1.secret != p2.secret assert self.order.user_cancel_allowed is False + @classscope(attr='o') def test_user_cancel_absolute_deadline_unpaid_no_subevents(self): assert self.order.user_cancel_deadline is None self.event.settings.set('cancel_allow_user_until', RelativeDateWrapper( @@ -1069,6 +1158,7 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline < now() assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_user_cancel_relative_deadline_unpaid_no_subevents(self): self.event.date_from = now() + timedelta(days=3) self.event.save() @@ -1087,6 +1177,7 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline < now() assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_user_cancel_absolute_deadline_paid_no_subevents(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1105,6 +1196,7 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline < now() assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_user_cancel_relative_deadline_paid_no_subevents(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1126,6 +1218,7 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.user_cancel_deadline < now() assert not self.order.user_cancel_allowed + @classscope(attr='o') def test_user_cancel_relative_deadline_to_subevents(self): self.event.date_from = now() + timedelta(days=3) self.event.has_subevents = True @@ -1147,6 +1240,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_deadline > now() + @classscope(attr='o') def test_user_cancel_fee(self): self.order.fees.create(fee_type=OrderFee.FEE_TYPE_SHIPPING, value=Decimal('2.00')) self.order.total = 48 @@ -1166,6 +1260,7 @@ class OrderTestCase(BaseQuotaTestCase): self.order = Order.objects.get(pk=self.order.pk) assert self.order.user_cancel_fee == Decimal('9.30') + @classscope(attr='o') def test_paid_order_underpaid(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1186,6 +1281,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_pending_order_underpaid(self): self.order.payments.create( amount=Decimal('46.00'), @@ -1204,6 +1300,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_canceled_order_overpaid(self): self.order.status = Order.STATUS_CANCELED self.order.save() @@ -1224,6 +1321,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_paid_order_external_refund(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1244,6 +1342,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert o.has_external_refund + @classscope(attr='o') def test_pending_order_pending_refund(self): self.order.status = Order.STATUS_CANCELED self.order.save() @@ -1264,6 +1363,7 @@ class OrderTestCase(BaseQuotaTestCase): assert o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_paid_order_overpaid(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1284,6 +1384,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_pending_order_overpaid(self): self.order.status = Order.STATUS_PENDING self.order.save() @@ -1305,6 +1406,7 @@ class OrderTestCase(BaseQuotaTestCase): assert not o.has_pending_refund assert not o.has_external_refund + @classscope(attr='o') def test_canceled_positions(self): self.op1.canceled = True self.op1.save() @@ -1313,6 +1415,7 @@ class OrderTestCase(BaseQuotaTestCase): assert self.order.positions.count() == 1 assert self.order.all_positions.count() == 2 + @classscope(attr='o') def test_propose_auto_refunds(self): p1 = self.order.payments.create( amount=Decimal('23.00'), @@ -1358,12 +1461,13 @@ class ItemCategoryTest(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(), ) + @classscope(attr='o') def test_sorting(self): c1 = ItemCategory.objects.create(event=self.event) c2 = ItemCategory.objects.create(event=self.event) @@ -1386,12 +1490,13 @@ class ItemTest(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(), ) + @classscope(attr='o') def test_is_available(self): i = Item.objects.create( event=self.event, name="Ticket", default_price=23, @@ -1412,6 +1517,7 @@ class ItemTest(TestCase): i.active = False assert not i.is_available() + @classscope(attr='o') def test_availability_filter(self): i = Item.objects.create( event=self.event, name="Ticket", default_price=23, @@ -1463,6 +1569,7 @@ class EventTest(TestCase): def setUpTestData(cls): cls.organizer = Organizer.objects.create(name='Dummy', slug='dummy') + @classscope(attr='organizer') def test_event_end_before_start(self): event = Event( organizer=self.organizer, name='Dummy', slug='dummy', @@ -1473,6 +1580,7 @@ class EventTest(TestCase): self.assertIn('date_to', str(context.exception)) + @classscope(attr='organizer') def test_presale_end_before_start(self): event = Event( organizer=self.organizer, name='Dummy', slug='dummy', @@ -1483,6 +1591,7 @@ class EventTest(TestCase): self.assertIn('presale_end', str(context.exception)) + @classscope(attr='organizer') def test_slug_validation(self): event = Event( organizer=self.organizer, name='Download', slug='download', @@ -1493,6 +1602,7 @@ class EventTest(TestCase): self.assertIn('slug', str(context.exception)) + @classscope(attr='organizer') def test_copy(self): event1 = Event.objects.create( organizer=self.organizer, name='Download', slug='ab1234', @@ -1547,6 +1657,7 @@ class EventTest(TestCase): assert event2.checkin_lists.count() == 1 assert [i.pk for i in event2.checkin_lists.first().limit_products.all()] == [i1new.pk] + @classscope(attr='organizer') def test_presale_has_ended(self): event = Event( organizer=self.organizer, name='Download', slug='download', @@ -1579,6 +1690,7 @@ class EventTest(TestCase): assert event.presale_has_ended assert not event.presale_is_running + @classscope(attr='organizer') def test_active_quotas_annotation(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1592,6 +1704,7 @@ class EventTest(TestCase): assert Event.annotated(Event.objects).first().active_quotas == [q] assert Event.annotated(Event.objects, 'foo').first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_product_inactive(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1602,6 +1715,7 @@ class EventTest(TestCase): q.items.add(item) assert Event.annotated(Event.objects).first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_product_addon(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1617,6 +1731,7 @@ class EventTest(TestCase): q.items.add(item) assert Event.annotated(Event.objects).first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_product_unavailable(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1627,6 +1742,7 @@ class EventTest(TestCase): q.items.add(item) assert Event.annotated(Event.objects).first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_variation_not_in_quota(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1638,6 +1754,7 @@ class EventTest(TestCase): q.items.add(item) assert Event.annotated(Event.objects).first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_variation(self): event = Event.objects.create( organizer=self.organizer, name='Download', slug='download', @@ -1687,6 +1804,7 @@ class SubEventTest(TestCase): name='Testsub', date_from=now(), event=cls.event ) + @classscope(attr='organizer') def test_override_prices(self): i = Item.objects.create( event=self.event, name="Ticket", default_price=23, @@ -1697,6 +1815,7 @@ class SubEventTest(TestCase): i.pk: Decimal('30.00') } + @classscope(attr='organizer') def test_override_var_prices(self): i = Item.objects.create( event=self.event, name="Ticket", default_price=23, @@ -1708,6 +1827,7 @@ class SubEventTest(TestCase): v.pk: Decimal('30.00') } + @classscope(attr='organizer') def test_active_quotas_annotation(self): q = Quota.objects.create(event=self.event, name='Quota', size=2, subevent=self.se) @@ -1716,6 +1836,7 @@ class SubEventTest(TestCase): assert SubEvent.annotated(SubEvent.objects).first().active_quotas == [q] assert SubEvent.annotated(SubEvent.objects, 'foo').first().active_quotas == [] + @classscope(attr='organizer') def test_active_quotas_annotation_no_interference(self): se2 = SubEvent.objects.create( name='Testsub', date_from=now(), event=self.event @@ -1727,6 +1848,7 @@ class SubEventTest(TestCase): assert SubEvent.annotated(SubEvent.objects).filter(pk=self.se.pk).first().active_quotas == [] assert SubEvent.annotated(SubEvent.objects).filter(pk=se2.pk).first().active_quotas == [q] + @classscope(attr='organizer') def test_best_availability(self): q = Quota.objects.create(event=self.event, name='Quota', size=0, subevent=self.se) @@ -1768,68 +1890,70 @@ class CheckinListTestCase(TestCase): @classmethod def setUpTestData(cls): cls.organizer = Organizer.objects.create(name='Dummy', slug='dummy') - cls.event = Event.objects.create( - organizer=cls.organizer, name='Dummy', slug='dummy', - date_from=now(), date_to=now() - timedelta(hours=1), - ) - cls.item1 = cls.event.items.create(name="Ticket", default_price=12) - cls.item2 = cls.event.items.create(name="Shirt", default_price=6) - cls.cl_all = cls.event.checkin_lists.create( - name='All', all_products=True - ) - cls.cl_all_pending = cls.event.checkin_lists.create( - name='Z Pending', all_products=True, include_pending=True - ) - cls.cl_both = cls.event.checkin_lists.create( - name='Both', all_products=False - ) - cls.cl_both.limit_products.add(cls.item1) - cls.cl_both.limit_products.add(cls.item2) - cls.cl_tickets = cls.event.checkin_lists.create( - name='Tickets', all_products=False - ) - cls.cl_tickets.limit_products.add(cls.item1) - o = Order.objects.create( - code='FOO', event=cls.event, email='dummy@dummy.test', - status=Order.STATUS_PAID, - datetime=now(), expires=now() + timedelta(days=10), - total=Decimal("30"), locale='en' - ) - OrderPosition.objects.create( - order=o, - item=cls.item1, - variation=None, - price=Decimal("12"), - ) - op2 = OrderPosition.objects.create( - order=o, - item=cls.item1, - variation=None, - price=Decimal("12"), - ) - op3 = OrderPosition.objects.create( - order=o, - item=cls.item2, - variation=None, - price=Decimal("6"), - ) - op2.checkins.create(list=cls.cl_tickets) - op3.checkins.create(list=cls.cl_both) + with scope(organizer=cls.organizer): + cls.event = Event.objects.create( + organizer=cls.organizer, name='Dummy', slug='dummy', + date_from=now(), date_to=now() - timedelta(hours=1), + ) + cls.item1 = cls.event.items.create(name="Ticket", default_price=12) + cls.item2 = cls.event.items.create(name="Shirt", default_price=6) + cls.cl_all = cls.event.checkin_lists.create( + name='All', all_products=True + ) + cls.cl_all_pending = cls.event.checkin_lists.create( + name='Z Pending', all_products=True, include_pending=True + ) + cls.cl_both = cls.event.checkin_lists.create( + name='Both', all_products=False + ) + cls.cl_both.limit_products.add(cls.item1) + cls.cl_both.limit_products.add(cls.item2) + cls.cl_tickets = cls.event.checkin_lists.create( + name='Tickets', all_products=False + ) + cls.cl_tickets.limit_products.add(cls.item1) + o = Order.objects.create( + code='FOO', event=cls.event, email='dummy@dummy.test', + status=Order.STATUS_PAID, + datetime=now(), expires=now() + timedelta(days=10), + total=Decimal("30"), locale='en' + ) + OrderPosition.objects.create( + order=o, + item=cls.item1, + variation=None, + price=Decimal("12"), + ) + op2 = OrderPosition.objects.create( + order=o, + item=cls.item1, + variation=None, + price=Decimal("12"), + ) + op3 = OrderPosition.objects.create( + order=o, + item=cls.item2, + variation=None, + price=Decimal("6"), + ) + op2.checkins.create(list=cls.cl_tickets) + op3.checkins.create(list=cls.cl_both) - o = Order.objects.create( - code='FOO', event=cls.event, email='dummy@dummy.test', - status=Order.STATUS_PENDING, - datetime=now(), expires=now() + timedelta(days=10), - total=Decimal("30"), locale='en' - ) - op4 = OrderPosition.objects.create( - order=o, - item=cls.item2, - variation=None, - price=Decimal("6"), - ) - op4.checkins.create(list=cls.cl_all_pending) + o = Order.objects.create( + code='FOO', event=cls.event, email='dummy@dummy.test', + status=Order.STATUS_PENDING, + datetime=now(), expires=now() + timedelta(days=10), + total=Decimal("30"), locale='en' + ) + op4 = OrderPosition.objects.create( + order=o, + item=cls.item2, + variation=None, + price=Decimal("6"), + ) + op4.checkins.create(list=cls.cl_all_pending) + @classscope(attr='organizer') def test_annotated(self): lists = list(CheckinList.annotate_with_numbers(self.event.checkin_lists.order_by('name'), self.event)) assert lists == [self.cl_all, self.cl_both, self.cl_tickets, self.cl_all_pending] @@ -1881,19 +2005,20 @@ class CheckinListTestCase(TestCase): ]) def test_question_answer_validation(qtype, answer, expected): o = Organizer.objects.create(name='Dummy', slug='dummy') - event = Event.objects.create( - organizer=o, name='Dummy', slug='dummy', - date_from=now(), - ) - event.settings.timezone = 'Europe/Berlin' - q = Question(type=qtype, event=event) - if isinstance(expected, type) and issubclass(expected, Exception): - with pytest.raises(expected): - q.clean_answer(answer) - elif callable(expected): - assert expected(q.clean_answer(answer)) - else: - assert q.clean_answer(answer) == expected + with scope(organizer=o): + event = Event.objects.create( + organizer=o, name='Dummy', slug='dummy', + date_from=now(), + ) + event.settings.timezone = 'Europe/Berlin' + q = Question(type=qtype, event=event) + if isinstance(expected, type) and issubclass(expected, Exception): + with pytest.raises(expected): + q.clean_answer(answer) + elif callable(expected): + assert expected(q.clean_answer(answer)) + else: + assert q.clean_answer(answer) == expected @pytest.mark.django_db @@ -1906,45 +2031,47 @@ def test_question_answer_validation_localized_decimal(): @pytest.mark.django_db def test_question_answer_validation_choice(): organizer = Organizer.objects.create(name='Dummy', slug='dummy') - event = Event.objects.create( - organizer=organizer, name='Dummy', slug='dummy', - date_from=now(), date_to=now() - timedelta(hours=1), - ) - q = Question.objects.create(type='C', event=event, question='Q') - o1 = q.options.create(answer='A') - o2 = q.options.create(answer='B') - q2 = Question.objects.create(type='C', event=event, question='Q2') - o3 = q2.options.create(answer='C') - assert q.clean_answer(str(o1.pk)) == o1 - assert q.clean_answer(o1.pk) == o1 - assert q.clean_answer(str(o2.pk)) == o2 - assert q.clean_answer(o2.pk) == o2 - with pytest.raises(ValidationError): - q.clean_answer(str(o2.pk + 1000)) - with pytest.raises(ValidationError): - q.clean_answer('FOO') - with pytest.raises(ValidationError): - q.clean_answer(str(o3.pk)) + with scope(organizer=organizer): + event = Event.objects.create( + organizer=organizer, name='Dummy', slug='dummy', + date_from=now(), date_to=now() - timedelta(hours=1), + ) + q = Question.objects.create(type='C', event=event, question='Q') + o1 = q.options.create(answer='A') + o2 = q.options.create(answer='B') + q2 = Question.objects.create(type='C', event=event, question='Q2') + o3 = q2.options.create(answer='C') + assert q.clean_answer(str(o1.pk)) == o1 + assert q.clean_answer(o1.pk) == o1 + assert q.clean_answer(str(o2.pk)) == o2 + assert q.clean_answer(o2.pk) == o2 + with pytest.raises(ValidationError): + q.clean_answer(str(o2.pk + 1000)) + with pytest.raises(ValidationError): + q.clean_answer('FOO') + with pytest.raises(ValidationError): + q.clean_answer(str(o3.pk)) @pytest.mark.django_db def test_question_answer_validation_multiple_choice(): organizer = Organizer.objects.create(name='Dummy', slug='dummy') - event = Event.objects.create( - organizer=organizer, name='Dummy', slug='dummy', - date_from=now(), date_to=now() - timedelta(hours=1), - ) - q = Question.objects.create(type='M', event=event, question='Q') - o1 = q.options.create(answer='A') - o2 = q.options.create(answer='B') - q.options.create(answer='D') - q2 = Question.objects.create(type='M', event=event, question='Q2') - o3 = q2.options.create(answer='C') - assert q.clean_answer("{},{}".format(str(o1.pk), str(o2.pk))) == [o1, o2] - assert q.clean_answer([str(o1.pk), str(o2.pk)]) == [o1, o2] - assert q.clean_answer([str(o1.pk)]) == [o1] - assert q.clean_answer([o1.pk]) == [o1] - assert q.clean_answer([o1.pk, o3.pk]) == [o1] - assert q.clean_answer([o1.pk, o3.pk + 1000]) == [o1] - with pytest.raises(ValidationError): - assert q.clean_answer([o1.pk, 'FOO']) == [o1] + with scope(organizer=organizer): + event = Event.objects.create( + organizer=organizer, name='Dummy', slug='dummy', + date_from=now(), date_to=now() - timedelta(hours=1), + ) + q = Question.objects.create(type='M', event=event, question='Q') + o1 = q.options.create(answer='A') + o2 = q.options.create(answer='B') + q.options.create(answer='D') + q2 = Question.objects.create(type='M', event=event, question='Q2') + o3 = q2.options.create(answer='C') + assert q.clean_answer("{},{}".format(str(o1.pk), str(o2.pk))) == [o1, o2] + assert q.clean_answer([str(o1.pk), str(o2.pk)]) == [o1, o2] + assert q.clean_answer([str(o1.pk)]) == [o1] + assert q.clean_answer([o1.pk]) == [o1] + assert q.clean_answer([o1.pk, o3.pk]) == [o1] + assert q.clean_answer([o1.pk, o3.pk + 1000]) == [o1] + with pytest.raises(ValidationError): + assert q.clean_answer([o1.pk, 'FOO']) == [o1] diff --git a/src/tests/base/test_notifications.py b/src/tests/base/test_notifications.py index 96fffd7640..68acf15e1a 100644 --- a/src/tests/base/test_notifications.py +++ b/src/tests/base/test_notifications.py @@ -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 diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 073cfbaeea..679660276d 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -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() diff --git a/src/tests/base/test_payment.py b/src/tests/base/test_payment.py index b2321020d7..fff0eeceb7 100644 --- a/src/tests/base/test_payment.py +++ b/src/tests/base/test_payment.py @@ -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 diff --git a/src/tests/base/test_permissions.py b/src/tests/base/test_permissions.py index 9ab39cace5..2a2da25403 100644 --- a/src/tests/base/test_permissions.py +++ b/src/tests/base/test_permissions.py @@ -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} diff --git a/src/tests/base/test_reldate.py b/src/tests/base/test_reldate.py index 2f99482087..ac3c2e98e8 100644 --- a/src/tests/base/test_reldate.py +++ b/src/tests/base/test_reldate.py @@ -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 diff --git a/src/tests/base/test_settings.py b/src/tests/base/test_settings.py index 2a01b429bf..5e6e75b59c 100644 --- a/src/tests/base/test_settings.py +++ b/src/tests/base/test_settings.py @@ -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') diff --git a/src/tests/base/test_shredders.py b/src/tests/base/test_shredders.py index 1066c25f4e..33968c67ef 100644 --- a/src/tests/base/test_shredders.py +++ b/src/tests/base/test_shredders.py @@ -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 diff --git a/src/tests/base/test_taxrules.py b/src/tests/base/test_taxrules.py index d597121f54..1e1d7b2d29 100644 --- a/src/tests/base/test_taxrules.py +++ b/src/tests/base/test_taxrules.py @@ -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 diff --git a/src/tests/base/test_timeline.py b/src/tests/base/test_timeline.py index ab8f409ccf..42d9fdd542 100644 --- a/src/tests/base/test_timeline.py +++ b/src/tests/base/test_timeline.py @@ -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 diff --git a/src/tests/base/test_waitinglist.py b/src/tests/base/test_waitinglist.py index 4377931a2f..1d87b40065 100644 --- a/src/tests/base/test_waitinglist.py +++ b/src/tests/base/test_waitinglist.py @@ -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 diff --git a/src/tests/base/test_webhooks.py b/src/tests/base/test_webhooks.py index d472eaa12f..a11c5e7f5e 100644 --- a/src/tests/base/test_webhooks.py +++ b/src/tests/base/test_webhooks.py @@ -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' diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 0e3fe9faa0..084bdcdd90 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -1,3 +1,5 @@ +import inspect + import pytest from django_scopes import scopes_disabled from xdist.dsession import DSession @@ -36,5 +38,12 @@ def pytest_configure(config): @pytest.hookimpl(hookwrapper=True) def pytest_fixture_setup(fixturedef, request): - with scopes_disabled(): + """ + 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 diff --git a/src/tests/control/test_auth.py b/src/tests/control/test_auth.py index e09a188c3c..340668a2f3 100644 --- a/src/tests/control/test_auth.py +++ b/src/tests/control/test_auth.py @@ -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"}' }) diff --git a/src/tests/control/test_checkins.py b/src/tests/control/test_checkins.py index ae809982da..72be86ac51 100644 --- a/src/tests/control/test_checkins.py +++ b/src/tests/control/test_checkins.py @@ -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() diff --git a/src/tests/control/test_devices.py b/src/tests/control/test_devices.py index 1c8d061b0e..5bcc257ab3 100644 --- a/src/tests/control/test_devices.py +++ b/src/tests/control/test_devices.py @@ -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() diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index 04b0e5a618..6c561237ac 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -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() diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index 97e88f2916..fea6872126 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -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() diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 01bcecd6e6..bf38623ce2 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -7,6 +7,7 @@ from bs4 import BeautifulSoup from django.core import mail from django.utils.timezone import now from django_countries.fields import Country +from django_scopes import scopes_disabled from tests.base import SoupTest from tests.plugins.stripe.test_provider import MockedCharge @@ -66,84 +67,87 @@ def env(): @pytest.mark.django_db def test_order_list(client, env): - otherticket = Item.objects.create(event=env[0], name='Early-bird ticket', - category=None, default_price=23, - admission=True) + with scopes_disabled(): + otherticket = Item.objects.create(event=env[0], name='Early-bird ticket', + category=None, default_price=23, + admission=True) client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?query=peter') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?query=hans') - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?query=dummy') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=p') - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=n') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=ne') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?item=%s' % otherticket.id) - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?item=%s' % env[3].id) - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?provider=free') - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?provider=banktransfer') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=o') - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() env[2].expires = now() - timedelta(days=10) env[2].save() response = client.get('/control/event/dummy/dummy/orders/?status=o') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=pa') - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() env[2].require_approval = True env[2].save() response = client.get('/control/event/dummy/dummy/orders/?status=pa') - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() - q = Question.objects.create(event=env[0], question="Q", type="N", required=True) - q.items.add(env[3]) - op = env[2].positions.first() - qa = QuestionAnswer.objects.create(question=q, orderposition=op, answer="12") + with scopes_disabled(): + q = Question.objects.create(event=env[0], question="Q", type="N", required=True) + q.items.add(env[3]) + op = env[2].positions.first() + qa = QuestionAnswer.objects.create(question=q, orderposition=op, answer="12") response = client.get('/control/event/dummy/dummy/orders/?question=%d&answer=12' % q.pk) - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?question=%d&answer=13' % q.pk) - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() q.type = "C" q.save() - qo1 = q.options.create(answer="Foo") - qo2 = q.options.create(answer="Bar") - qa.options.add(qo1) + with scopes_disabled(): + qo1 = q.options.create(answer="Foo") + qo2 = q.options.create(answer="Bar") + qa.options.add(qo1) response = client.get('/control/event/dummy/dummy/orders/?question=%d&answer=%d' % (q.pk, qo1.pk)) - assert 'FOO' in response.rendered_content + assert 'FOO' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?question=%d&answer=%d' % (q.pk, qo2.pk)) - assert 'FOO' not in response.rendered_content + assert 'FOO' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/?status=testmode') - assert 'FOO' not in response.rendered_content - assert 'TEST MODE' not in response.rendered_content + assert 'FOO' not in response.content.decode() + assert 'TEST MODE' not in response.content.decode() env[2].testmode = True env[2].save() response = client.get('/control/event/dummy/dummy/orders/?status=testmode') - assert 'FOO' in response.rendered_content - assert 'TEST MODE' in response.rendered_content + assert 'FOO' in response.content.decode() + assert 'TEST MODE' in response.content.decode() @pytest.mark.django_db def test_order_detail(client, env): client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert 'Early-bird' in response.rendered_content - assert 'Peter' in response.rendered_content - assert 'Lukas Gelöscht' in response.rendered_content - assert 'TEST MODE' not in response.rendered_content + assert 'Early-bird' in response.content.decode() + assert 'Peter' in response.content.decode() + assert 'Lukas Gelöscht' in response.content.decode() + assert 'TEST MODE' not in response.content.decode() @pytest.mark.django_db @@ -152,72 +156,83 @@ def test_order_detail_show_test_mode(client, env): env[2].save() client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/') - assert 'TEST MODE' in response.rendered_content + assert 'TEST MODE' in response.content.decode() @pytest.mark.django_db def test_order_set_contact(client, env): - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/contact', { 'email': 'admin@rami.io' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.email == 'admin@rami.io' @pytest.mark.django_db def test_order_set_locale(client, env): - q = Quota.objects.create(event=env[0], size=0) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/locale', { 'locale': 'de' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.locale == 'de' @pytest.mark.django_db def test_order_set_locale_with_invalid_locale_value(client, env): - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/locale', { 'locale': 'fr' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.locale == 'en' @pytest.mark.django_db def test_order_set_comment(client, env): - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/comment', { 'comment': 'Foo' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.comment == 'Foo' @pytest.mark.django_db def test_order_transition_to_expired_success(client, env): - q = Quota.objects.create(event=env[0], size=0) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/transition', { 'status': 'e' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_EXPIRED @pytest.mark.django_db def test_order_transition_to_paid_in_time_success(client, env): - q = Quota.objects.create(event=env[0], size=0) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -225,16 +240,18 @@ def test_order_transition_to_paid_in_time_success(client, env): 'payment_date': now().date().isoformat(), 'status': 'p' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_PAID @pytest.mark.django_db def test_order_transition_to_paid_expired_quota_left(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.save() - q = Quota.objects.create(event=env[0], size=10) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.save() + q = Quota.objects.create(event=env[0], size=10) q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') res = client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -242,23 +259,26 @@ def test_order_transition_to_paid_expired_quota_left(client, env): 'payment_date': now().date().isoformat(), 'amount': str(o.pending_sum), }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert res.status_code < 400 assert o.status == Order.STATUS_PAID @pytest.mark.django_db def test_order_approve(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PENDING - o.require_approval = True - o.save() - q = Quota.objects.create(event=env[0], size=10) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_PENDING + o.require_approval = True + o.save() + q = Quota.objects.create(event=env[0], size=10) q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') res = client.post('/control/event/dummy/dummy/orders/FOO/approve', { }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert res.status_code < 400 assert o.status == Order.STATUS_PENDING assert not o.require_approval @@ -266,16 +286,18 @@ def test_order_approve(client, env): @pytest.mark.django_db def test_order_deny(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PENDING - o.require_approval = True - o.save() - q = Quota.objects.create(event=env[0], size=10) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_PENDING + o.require_approval = True + o.save() + q = Quota.objects.create(event=env[0], size=10) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') res = client.post('/control/event/dummy/dummy/orders/FOO/deny', { }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert res.status_code < 400 assert o.status == Order.STATUS_CANCELED assert o.require_approval @@ -285,20 +307,23 @@ def test_order_deny(client, env): def test_order_delete_require_testmode(client, env): client.login(email='dummy@dummy.dummy', password='dummy') res = client.get('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True) - assert 'alert-danger' in res.rendered_content - assert 'Only orders created in test mode can be deleted' in res.rendered_content + assert 'alert-danger' in res.content.decode() + assert 'Only orders created in test mode can be deleted' in res.content.decode() client.post('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True) - assert Order.objects.get(id=env[2].id) + with scopes_disabled(): + assert Order.objects.get(id=env[2].id) @pytest.mark.django_db def test_order_delete(client, env): - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) o.testmode = True o.save() client.login(email='dummy@dummy.dummy', password='dummy') client.post('/control/event/dummy/dummy/orders/FOO/delete', {}, follow=True) - assert not Order.objects.filter(id=env[2].id).exists() + with scopes_disabled(): + assert not Order.objects.filter(id=env[2].id).exists() @pytest.mark.django_db @@ -317,7 +342,8 @@ def test_order_delete(client, env): (Order.STATUS_PENDING, Order.STATUS_EXPIRED, True), ]) def test_order_transition(client, env, process): - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) o.status = process[0] o.save() client.login(email='dummy@dummy.dummy', password='dummy') @@ -327,7 +353,8 @@ def test_order_transition(client, env, process): 'payment_date': now().date().isoformat(), 'status': process[1] }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) if process[2]: assert o.status == process[1] else: @@ -336,7 +363,8 @@ def test_order_transition(client, env, process): @pytest.mark.django_db def test_order_cancel_free(client, env): - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) o.status = Order.STATUS_PAID o.total = Decimal('0.00') o.save() @@ -345,28 +373,31 @@ def test_order_cancel_free(client, env): client.post('/control/event/dummy/dummy/orders/FOO/transition', { 'status': 'c' }) - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_CANCELED @pytest.mark.django_db def test_order_cancel_paid_keep_fee(client, env): - o = Order.objects.get(id=env[2].id) - o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=o.total) - o.status = Order.STATUS_PAID - o.save() - tr7 = o.event.tax_rules.create(rate=Decimal('7.00')) - o.event.settings.tax_rate_default = tr7 + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=o.total) + o.status = Order.STATUS_PAID + o.save() + tr7 = o.event.tax_rules.create(rate=Decimal('7.00')) + o.event.settings.tax_rate_default = tr7 client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/transition?status=c') client.post('/control/event/dummy/dummy/orders/FOO/transition', { 'status': 'c', 'cancellation_fee': '6.00' }) - o = Order.objects.get(id=env[2].id) - assert not o.positions.exists() - assert o.all_positions.exists() - f = o.fees.get() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert not o.positions.exists() + assert o.all_positions.exists() + f = o.fees.get() assert f.fee_type == OrderFee.FEE_TYPE_CANCELLATION assert f.value == Decimal('6.00') assert f.tax_value == Decimal('0.39') @@ -379,20 +410,22 @@ def test_order_cancel_paid_keep_fee(client, env): @pytest.mark.django_db def test_order_cancel_pending_keep_fee(client, env): - o = Order.objects.get(id=env[2].id) - o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=Decimal('8.00')) - o.status = Order.STATUS_PENDING - o.save() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=Decimal('8.00')) + o.status = Order.STATUS_PENDING + o.save() client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/transition?status=c') client.post('/control/event/dummy/dummy/orders/FOO/transition', { 'status': 'c', 'cancellation_fee': '6.00' }) - o = Order.objects.get(id=env[2].id) - assert not o.positions.exists() - assert o.all_positions.exists() - f = o.fees.get() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert not o.positions.exists() + assert o.all_positions.exists() + f = o.fees.get() assert f.fee_type == OrderFee.FEE_TYPE_CANCELLATION assert f.value == Decimal('6.00') assert o.status == Order.STATUS_PAID @@ -402,19 +435,21 @@ def test_order_cancel_pending_keep_fee(client, env): @pytest.mark.django_db def test_order_cancel_pending_fee_too_high(client, env): - o = Order.objects.get(id=env[2].id) - o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=Decimal('4.00')) - o.status = Order.STATUS_PENDING - o.save() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=Decimal('4.00')) + o.status = Order.STATUS_PENDING + o.save() client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/transition?status=c') client.post('/control/event/dummy/dummy/orders/FOO/transition', { 'status': 'c', 'cancellation_fee': '6.00' }) - o = Order.objects.get(id=env[2].id) - assert o.positions.exists() - assert not o.fees.exists() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.positions.exists() + assert not o.fees.exists() assert o.status == Order.STATUS_PENDING assert o.total == Decimal('14.00') @@ -427,9 +462,10 @@ def test_order_cancel_unpaid_no_fees_allowed(client, env): 'status': 'c', 'cancellation_fee': '6.00' }) - o = Order.objects.get(id=env[2].id) - assert o.positions.exists() - assert not o.fees.exists() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.positions.exists() + assert not o.fees.exists() assert o.status == Order.STATUS_CANCELED assert o.total == Decimal('14.00') @@ -439,16 +475,17 @@ def test_order_invoice_create_forbidden(client, env): client.login(email='dummy@dummy.dummy', password='dummy') env[0].settings.set('invoice_generate', 'no') response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_order_invoice_create_duplicate(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - generate_invoice(env[2]) + with scopes_disabled(): + generate_invoice(env[2]) env[0].settings.set('invoice_generate', 'admin') response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db @@ -456,68 +493,75 @@ def test_order_invoice_create_ok(client, env): client.login(email='dummy@dummy.dummy', password='dummy') env[0].settings.set('invoice_generate', 'admin') response = client.post('/control/event/dummy/dummy/orders/FOO/invoice', {}, follow=True) - assert 'alert-success' in response.rendered_content - assert env[2].invoices.exists() + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + assert env[2].invoices.exists() @pytest.mark.django_db def test_order_invoice_regenerate(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - i = generate_invoice(env[2]) - InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2]) - env[0].settings.set('invoice_generate', 'admin') + with scopes_disabled(): + i = generate_invoice(env[2]) + InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2]) + env[0].settings.set('invoice_generate', 'admin') response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % i.pk, {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() i.refresh_from_db() assert 'Foo' in i.invoice_to - assert env[2].invoices.exists() + with scopes_disabled(): + assert env[2].invoices.exists() @pytest.mark.django_db def test_order_invoice_regenerate_canceled(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - i = generate_invoice(env[2]) - generate_cancellation(i) + with scopes_disabled(): + i = generate_invoice(env[2]) + generate_cancellation(i) response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % i.pk, {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_order_invoice_regenerate_unknown(client, env): client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/regenerate' % 3, {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_order_invoice_reissue(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - i = generate_invoice(env[2]) - InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2]) - env[0].settings.set('invoice_generate', 'admin') + with scopes_disabled(): + i = generate_invoice(env[2]) + InvoiceAddress.objects.create(name_parts={'full_name': 'Foo', "_scheme": "full"}, order=env[2]) + env[0].settings.set('invoice_generate', 'admin') response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % i.pk, {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() i.refresh_from_db() - assert env[2].invoices.count() == 3 - assert 'Foo' not in env[2].invoices.all()[0].invoice_to - assert 'Foo' not in env[2].invoices.all()[1].invoice_to - assert 'Foo' in env[2].invoices.all()[2].invoice_to + with scopes_disabled(): + assert env[2].invoices.count() == 3 + assert 'Foo' not in env[2].invoices.all()[0].invoice_to + assert 'Foo' not in env[2].invoices.all()[1].invoice_to + assert 'Foo' in env[2].invoices.all()[2].invoice_to @pytest.mark.django_db def test_order_invoice_reissue_canceled(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - i = generate_invoice(env[2]) - generate_cancellation(i) + with scopes_disabled(): + i = generate_invoice(env[2]) + generate_cancellation(i) response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % i.pk, {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_order_invoice_reissue_unknown(client, env): client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/invoices/%d/reissue' % 3, {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db @@ -525,124 +569,138 @@ def test_order_resend_link(client, env): mail.outbox = [] client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/resend', {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() assert 'FOO' in mail.outbox[0].body @pytest.mark.django_db def test_order_extend_not_pending(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_PAID - o.save() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_PAID + o.save() client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/extend', follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() response = client.post('/control/event/dummy/dummy/orders/FOO/extend', follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_order_extend_not_expired(client, env): - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) - assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" @pytest.mark.django_db def test_order_extend_overdue_quota_empty(client, env): - o = Order.objects.get(id=env[2].id) - o.expires = now() - timedelta(days=5) - o.save() - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) - assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" @pytest.mark.django_db def test_order_extend_overdue_quota_blocked_by_waiting_list(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.expires = now() - timedelta(days=5) - o.save() - q = Quota.objects.create(event=env[0], size=1) - q.items.add(env[3]) - env[0].waitinglistentries.create(item=env[3], email='foo@bar.com') + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=1) + q.items.add(env[3]) + env[0].waitinglistentries.create(item=env[3], email='foo@bar.com') newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) - assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" - assert o.status == Order.STATUS_PENDING + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" + assert o.status == Order.STATUS_PENDING @pytest.mark.django_db def test_order_extend_expired_quota_left(client, env): - o = Order.objects.get(id=env[2].id) - o.expires = now() - timedelta(days=5) - o.status = Order.STATUS_EXPIRED - o.save() - generate_cancellation(generate_invoice(o)) - q = Quota.objects.create(event=env[0], size=3) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.expires = now() - timedelta(days=5) + o.status = Order.STATUS_EXPIRED + o.save() + generate_cancellation(generate_invoice(o)) + q = Quota.objects.create(event=env[0], size=3) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') - assert o.invoices.count() == 2 + with scopes_disabled(): + assert o.invoices.count() == 2 response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) assert b'alert-success' in response.content - o = Order.objects.get(id=env[2].id) - assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" - assert o.status == Order.STATUS_PENDING - assert o.invoices.count() == 3 + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" + assert o.status == Order.STATUS_PENDING + assert o.invoices.count() == 3 @pytest.mark.django_db def test_order_extend_expired_quota_empty(client, env): - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) o.expires = now() - timedelta(days=5) o.status = Order.STATUS_EXPIRED olddate = o.expires o.save() - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) assert b'alert-danger' in response.content - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == olddate.strftime("%Y-%m-%d %H:%M:%S") assert o.status == Order.STATUS_EXPIRED @pytest.mark.django_db def test_order_extend_expired_quota_empty_ignore(client, env): - o = Order.objects.get(id=env[2].id) - o.expires = now() - timedelta(days=5) - o.status = Order.STATUS_EXPIRED - o.save() - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.expires = now() - timedelta(days=5) + o.status = Order.STATUS_EXPIRED + o.save() + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { @@ -650,46 +708,50 @@ def test_order_extend_expired_quota_empty_ignore(client, env): 'quota_ignore': 'on' }, follow=True) assert b'alert-success' in response.content - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_PENDING @pytest.mark.django_db def test_order_extend_expired_quota_partial(client, env): - o = Order.objects.get(id=env[2].id) - OrderPosition.objects.create( - order=o, - item=env[3], - variation=None, - price=Decimal("14"), - attendee_name_parts={'full_name': "Peter", "_scheme": "full"} - ) - o.expires = now() - timedelta(days=5) - o.status = Order.STATUS_EXPIRED - olddate = o.expires - o.save() - q = Quota.objects.create(event=env[0], size=1) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + OrderPosition.objects.create( + order=o, + item=env[3], + variation=None, + price=Decimal("14"), + attendee_name_parts={'full_name': "Peter", "_scheme": "full"} + ) + o.expires = now() - timedelta(days=5) + o.status = Order.STATUS_EXPIRED + olddate = o.expires + o.save() + q = Quota.objects.create(event=env[0], size=1) + q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) assert b'alert-danger' in response.content - o = Order.objects.get(id=env[2].id) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == olddate.strftime("%Y-%m-%d %H:%M:%S") assert o.status == Order.STATUS_EXPIRED @pytest.mark.django_db def test_order_mark_paid_overdue_quota_blocked_by_waiting_list(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.expires = now() - timedelta(days=5) - o.save() - q = Quota.objects.create(event=env[0], size=1) - q.items.add(env[3]) - env[0].waitinglistentries.create(item=env[3], email='foo@bar.com') + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=1) + q.items.add(env[3]) + env[0].waitinglistentries.create(item=env[3], email='foo@bar.com') client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -697,19 +759,21 @@ def test_order_mark_paid_overdue_quota_blocked_by_waiting_list(client, env): 'payment_date': now().date().isoformat(), 'amount': str(o.pending_sum), }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_PAID @pytest.mark.django_db def test_order_mark_paid_blocked(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.expires = now() - timedelta(days=5) - o.save() - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -717,21 +781,23 @@ def test_order_mark_paid_blocked(client, env): 'payment_date': now().date().isoformat(), 'status': 'p' }, follow=True) - assert 'alert-danger' in response.rendered_content - o = Order.objects.get(id=env[2].id) + assert 'alert-danger' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_EXPIRED @pytest.mark.django_db -def test_order_mark_paid_overpaid_epxired(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.expires = now() - timedelta(days=5) - o.save() - o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=o.total * 2) - assert o.pending_sum == -1 * o.total - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) +def test_order_mark_paid_overpaid_expired(client, env): + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + o.payments.create(state=OrderPayment.PAYMENT_STATE_CONFIRMED, amount=o.total * 2) + assert o.pending_sum == -1 * o.total + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -740,21 +806,23 @@ def test_order_mark_paid_overpaid_epxired(client, env): 'amount': '0.00', 'force': 'on' }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) - assert o.status == Order.STATUS_PAID - assert o.payments.last().amount == 0 - assert o.pending_sum == -1 * o.total + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + assert o.status == Order.STATUS_PAID + assert o.payments.last().amount == 0 + assert o.pending_sum == -1 * o.total @pytest.mark.django_db def test_order_mark_paid_forced(client, env): - o = Order.objects.get(id=env[2].id) - o.status = Order.STATUS_EXPIRED - o.expires = now() - timedelta(days=5) - o.save() - q = Quota.objects.create(event=env[0], size=0) - q.items.add(env[3]) + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) + o.status = Order.STATUS_EXPIRED + o.expires = now() - timedelta(days=5) + o.save() + q = Quota.objects.create(event=env[0], size=0) + q.items.add(env[3]) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/transition', { @@ -763,8 +831,9 @@ def test_order_mark_paid_forced(client, env): 'amount': str(o.pending_sum), 'force': 'on' }, follow=True) - assert 'alert-success' in response.rendered_content - o = Order.objects.get(id=env[2].id) + assert 'alert-success' in response.content.decode() + with scopes_disabled(): + o = Order.objects.get(id=env[2].id) assert o.status == Order.STATUS_PAID @@ -831,7 +900,7 @@ def test_order_sendmail_simple_case(client, order_url, env): follow=True) assert response.status_code == 200 - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() assert len(mail.outbox) == 1 assert mail.outbox[0].to == [order.email] @@ -842,7 +911,7 @@ def test_order_sendmail_simple_case(client, order_url, env): response = client.get(mail_history_url) assert response.status_code == 200 - assert 'Test subject' in response.rendered_content + assert 'Test subject' in response.content.decode() @pytest.mark.django_db @@ -862,7 +931,7 @@ def test_order_sendmail_preview(client, order_url, env): follow=True) assert response.status_code == 200 - assert 'E-mail preview' in response.rendered_content + assert 'E-mail preview' in response.content.decode() assert len(mail.outbox) == 0 @@ -880,17 +949,18 @@ def test_order_sendmail_invalid_data(client, order_url, env): }, follow=True) - assert 'has-error' in response.rendered_content + assert 'has-error' in response.content.decode() assert len(mail.outbox) == 0 mail_history_url = order_url + '/mail_history' response = client.get(mail_history_url) assert response.status_code == 200 - assert 'Test invalid mail' not in response.rendered_content + assert 'Test invalid mail' not in response.content.decode() class OrderChangeTests(SoupTest): + @scopes_disabled() def setUp(self): super().setUp() o = Organizer.objects.create(name='Dummy', slug='dummy') @@ -934,9 +1004,9 @@ class OrderChangeTests(SoupTest): r = self.client.get('/control/event/{}/{}/orders/{}/change'.format( self.event.organizer.slug, self.event.slug, self.order.code )) - assert self.op1.secret[:5] in r.rendered_content - assert self.op2.secret[:5] in r.rendered_content - assert self.op3.secret[:5] not in r.rendered_content + assert self.op1.secret[:5] in r.content.decode() + assert self.op2.secret[:5] in r.content.decode() + assert self.op3.secret[:5] not in r.content.decode() def test_change_item_success(self): self.client.post('/control/event/{}/{}/orders/{}/change'.format( @@ -956,17 +1026,18 @@ class OrderChangeTests(SoupTest): def test_change_subevent_success(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()) - self.op1.subevent = se1 - self.op1.save() - self.op2.subevent = se1 - self.op2.save() - self.quota.subevent = se1 - self.quota.save() - q2 = self.event.quotas.create(name='Q2', size=100, subevent=se2) - q2.items.add(self.ticket) - q2.items.add(self.shirt) + with scopes_disabled(): + se1 = self.event.subevents.create(name='Foo', date_from=now()) + se2 = self.event.subevents.create(name='Bar', date_from=now()) + self.op1.subevent = se1 + self.op1.save() + self.op2.subevent = se1 + self.op2.save() + self.quota.subevent = se1 + self.quota.save() + q2 = self.event.quotas.create(name='Q2', size=100, subevent=se2) + q2.items.add(self.ticket) + q2.items.add(self.shirt) self.client.post('/control/event/{}/{}/orders/{}/change'.format( self.event.organizer.slug, self.event.slug, self.order.code ), { @@ -1005,7 +1076,8 @@ class OrderChangeTests(SoupTest): 'add-itemvar': str(self.ticket.pk), }) self.order.refresh_from_db() - assert self.order.positions.count() == 1 + with scopes_disabled(): + assert self.order.positions.count() == 1 assert self.order.total == self.op2.price def test_add_item_success(self): @@ -1016,9 +1088,10 @@ class OrderChangeTests(SoupTest): 'add-do': 'on', 'add-price': '14.00', }) - assert self.order.positions.count() == 3 - assert self.order.positions.last().item == self.shirt - assert self.order.positions.last().price == 14 + with scopes_disabled(): + assert self.order.positions.count() == 3 + assert self.order.positions.last().item == self.shirt + assert self.order.positions.last().price == 14 def test_recalculate_reverse_charge(self): self.tr7.eu_reverse_charge = True @@ -1027,10 +1100,11 @@ class OrderChangeTests(SoupTest): self.tr19.eu_reverse_charge = True self.tr19.home_country = Country('DE') self.tr19.save() - InvoiceAddress.objects.create( - order=self.order, is_business=True, vat_id='ATU1234567', vat_id_validated=True, - country=Country('AT') - ) + with scopes_disabled(): + InvoiceAddress.objects.create( + order=self.order, is_business=True, vat_id='ATU1234567', vat_id_validated=True, + country=Country('AT') + ) self.client.post('/control/event/{}/{}/orders/{}/change'.format( self.event.organizer.slug, self.event.slug, self.order.code @@ -1045,7 +1119,8 @@ class OrderChangeTests(SoupTest): 'op-{}-price'.format(self.op1.pk): str(self.op1.price), }) - ops = list(self.order.positions.all()) + with scopes_disabled(): + ops = list(self.order.positions.all()) for op in ops: assert op.price == Decimal('21.50') assert op.tax_value == Decimal('0.00') @@ -1055,11 +1130,12 @@ class OrderChangeTests(SoupTest): @pytest.mark.django_db def test_check_vatid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() ia.refresh_from_db() assert ia.vat_id_validated @@ -1067,11 +1143,12 @@ def test_check_vatid(client, env): @pytest.mark.django_db def test_check_vatid_no_entered(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, country=Country('AT')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, country=Country('AT')) with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @@ -1079,11 +1156,12 @@ def test_check_vatid_no_entered(client, env): @pytest.mark.django_db def test_check_vatid_invalid_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('FR')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('FR')) with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @@ -1091,11 +1169,12 @@ def test_check_vatid_invalid_country(client, env): @pytest.mark.django_db def test_check_vatid_noneu_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='CHU1234567', country=Country('CH')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='CHU1234567', country=Country('CH')) with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @@ -1103,11 +1182,12 @@ def test_check_vatid_noneu_country(client, env): @pytest.mark.django_db def test_check_vatid_no_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567') + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567') with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @@ -1118,13 +1198,14 @@ def test_check_vatid_no_invoiceaddress(client, env): with mock.patch('vat_moss.id.validate') as mock_validate: mock_validate.return_value = ('AT', 'AT123456', 'Foo') response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_check_vatid_invalid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) with mock.patch('vat_moss.id.validate') as mock_validate: def raiser(*args, **kwargs): import vat_moss.errors @@ -1132,7 +1213,7 @@ def test_check_vatid_invalid(client, env): mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @@ -1140,7 +1221,8 @@ def test_check_vatid_invalid(client, env): @pytest.mark.django_db def test_check_vatid_unavailable(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) + with scopes_disabled(): + ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) with mock.patch('vat_moss.id.validate') as mock_validate: def raiser(*args, **kwargs): import vat_moss.errors @@ -1148,57 +1230,60 @@ def test_check_vatid_unavailable(client, env): mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() ia.refresh_from_db() assert not ia.vat_id_validated @pytest.mark.django_db def test_cancel_payment(client, env): - p = env[2].payments.last() + with scopes_disabled(): + p = env[2].payments.last() client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/payments/{}/cancel'.format(p.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CANCELED response = client.post('/control/event/dummy/dummy/orders/FOO/payments/{}/cancel'.format(p.pk), {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() @pytest.mark.django_db def test_cancel_refund(client, env): - r = env[2].refunds.create( - provider='stripe', - state='transit', - source='admin', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='transit', + source='admin', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/cancel'.format(r.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_CANCELED r.state = OrderRefund.REFUND_STATE_DONE r.save() response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/cancel'.format(r.pk), {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_DONE @pytest.mark.django_db def test_process_refund(client, env): - r = env[2].refunds.create( - provider='stripe', - state='external', - source='external', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='external', + source='external', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/process'.format(r.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_DONE env[2].refresh_from_db() @@ -1207,24 +1292,25 @@ def test_process_refund(client, env): @pytest.mark.django_db def test_process_refund_overpaid_externally(client, env): - env[2].payments.first().confirm() - env[2].payments.create( - state='confirmed', - provider='stripe', - amount=Decimal('14.00'), - payment_date=now() - ) - assert env[2].pending_sum == -14 - r = env[2].refunds.create( - provider='stripe', - state='external', - source='external', - amount=Decimal('14.00'), - execution_date=now(), - ) + with scopes_disabled(): + env[2].payments.first().confirm() + env[2].payments.create( + state='confirmed', + provider='stripe', + amount=Decimal('14.00'), + payment_date=now() + ) + assert env[2].pending_sum == -14 + r = env[2].refunds.create( + provider='stripe', + state='external', + source='external', + amount=Decimal('14.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/process'.format(r.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_DONE env[2].refresh_from_db() @@ -1234,33 +1320,35 @@ def test_process_refund_overpaid_externally(client, env): @pytest.mark.django_db def test_process_refund_invalid_state(client, env): - r = env[2].refunds.create( - provider='stripe', - state='canceled', - source='external', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='canceled', + source='external', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/process'.format(r.pk), {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_CANCELED @pytest.mark.django_db def test_process_refund_mark_refunded(client, env): - r = env[2].refunds.create( - provider='stripe', - state='external', - source='external', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='external', + source='external', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/process'.format(r.pk), {'action': 'r'}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_DONE env[2].refresh_from_db() @@ -1269,42 +1357,45 @@ def test_process_refund_mark_refunded(client, env): @pytest.mark.django_db def test_done_refund(client, env): - r = env[2].refunds.create( - provider='stripe', - state='transit', - source='admin', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='transit', + source='admin', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/done'.format(r.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_DONE @pytest.mark.django_db def test_done_refund_invalid_state(client, env): - r = env[2].refunds.create( - provider='stripe', - state='external', - source='external', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + r = env[2].refunds.create( + provider='stripe', + state='external', + source='external', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/refunds/{}/done'.format(r.pk), {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() r.refresh_from_db() assert r.state == OrderRefund.REFUND_STATE_EXTERNAL @pytest.mark.django_db def test_confirm_payment(client, env): - p = env[2].payments.last() + with scopes_disabled(): + p = env[2].payments.last() client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/payments/{}/confirm'.format(p.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() @@ -1313,12 +1404,13 @@ def test_confirm_payment(client, env): @pytest.mark.django_db def test_confirm_payment_invalid_state(client, env): - p = env[2].payments.last() + with scopes_disabled(): + p = env[2].payments.last() p.state = OrderPayment.PAYMENT_STATE_FAILED p.save() client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/payments/{}/confirm'.format(p.pk), {}, follow=True) - assert 'alert-danger' in response.rendered_content + assert 'alert-danger' in response.content.decode() p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_FAILED env[2].refresh_from_db() @@ -1327,12 +1419,13 @@ def test_confirm_payment_invalid_state(client, env): @pytest.mark.django_db def test_confirm_payment_partal_amount(client, env): - p = env[2].payments.last() + with scopes_disabled(): + p = env[2].payments.last() p.amount -= Decimal(5.00) p.save() client.login(email='dummy@dummy.dummy', password='dummy') response = client.post('/control/event/dummy/dummy/orders/FOO/payments/{}/confirm'.format(p.pk), {}, follow=True) - assert 'alert-success' in response.rendered_content + assert 'alert-success' in response.content.decode() p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() @@ -1341,11 +1434,12 @@ def test_confirm_payment_partal_amount(client, env): @pytest.mark.django_db def test_refund_paid_order_fully_mark_as_refunded(client, env): - p = env[2].payments.last() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/refund') - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name$=partial_amount]")[0]["value"] == "14.00" client.post('/control/event/dummy/dummy/orders/FOO/refund', { 'start-partial_amount': '14.00', @@ -1361,22 +1455,24 @@ def test_refund_paid_order_fully_mark_as_refunded(client, env): 'perform': 'on' }, follow=True) p.refresh_from_db() - assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED - env[2].refresh_from_db() - r = env[2].refunds.last() - assert r.provider == "manual" - assert r.state == OrderRefund.REFUND_STATE_DONE - assert r.amount == Decimal('14.00') - assert env[2].status == Order.STATUS_CANCELED + with scopes_disabled(): + assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED + env[2].refresh_from_db() + r = env[2].refunds.last() + assert r.provider == "manual" + assert r.state == OrderRefund.REFUND_STATE_DONE + assert r.amount == Decimal('14.00') + assert env[2].status == Order.STATUS_CANCELED @pytest.mark.django_db def test_refund_paid_order_fully_mark_as_pending(client, env): - p = env[2].payments.last() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/refund') - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name$=partial_amount]")[0]["value"] == "14.00" client.post('/control/event/dummy/dummy/orders/FOO/refund', { 'start-partial_amount': '14.00', @@ -1389,7 +1485,8 @@ def test_refund_paid_order_fully_mark_as_pending(client, env): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() - r = env[2].refunds.last() + with scopes_disabled(): + r = env[2].refunds.last() assert r.provider == "manual" assert r.state == OrderRefund.REFUND_STATE_CREATED assert r.amount == Decimal('14.00') @@ -1398,11 +1495,12 @@ def test_refund_paid_order_fully_mark_as_pending(client, env): @pytest.mark.django_db def test_refund_paid_order_partially_mark_as_pending(client, env): - p = env[2].payments.last() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/FOO/refund') - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name$=partial_amount]")[0]["value"] == "14.00" client.post('/control/event/dummy/dummy/orders/FOO/refund', { 'start-partial_amount': '7.00', @@ -1420,7 +1518,8 @@ def test_refund_paid_order_partially_mark_as_pending(client, env): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() - r = env[2].refunds.last() + with scopes_disabled(): + r = env[2].refunds.last() assert r.provider == "manual" assert r.state == OrderRefund.REFUND_STATE_CREATED assert r.amount == Decimal('7.00') @@ -1429,12 +1528,13 @@ def test_refund_paid_order_partially_mark_as_pending(client, env): @pytest.mark.django_db def test_refund_propose_lower_payment(client, env): - p = env[2].payments.last() - p.amount = Decimal('8.00') - p.confirm() - p2 = env[2].payments.create( - amount=Decimal('6.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED - ) + with scopes_disabled(): + p = env[2].payments.last() + p.amount = Decimal('8.00') + p.confirm() + p2 = env[2].payments.create( + amount=Decimal('6.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED + ) client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/refund') response = client.post('/control/event/dummy/dummy/orders/FOO/refund', { @@ -1442,19 +1542,20 @@ def test_refund_propose_lower_payment(client, env): 'start-mode': 'partial', 'start-action': 'mark_pending' }, follow=True) - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name=refund-{}]".format(p2.pk))[0]['value'] == '6.00' assert doc.select("input[name=refund-manual]".format(p2.pk))[0]['value'] == '1.00' @pytest.mark.django_db def test_refund_propose_equal_payment(client, env): - p = env[2].payments.last() - p.amount = Decimal('7.00') - p.confirm() - p2 = env[2].payments.create( - amount=Decimal('7.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED - ) + with scopes_disabled(): + p = env[2].payments.last() + p.amount = Decimal('7.00') + p.confirm() + p2 = env[2].payments.create( + amount=Decimal('7.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED + ) client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/refund') response = client.post('/control/event/dummy/dummy/orders/FOO/refund', { @@ -1462,19 +1563,20 @@ def test_refund_propose_equal_payment(client, env): 'start-mode': 'partial', 'start-action': 'mark_pending' }, follow=True) - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name=refund-{}]".format(p2.pk))[0]['value'] == '7.00' assert doc.select("input[name=refund-manual]".format(p2.pk))[0]['value'] == '0.00' @pytest.mark.django_db def test_refund_propose_higher_payment(client, env): - p = env[2].payments.last() - p.amount = Decimal('6.00') - p.confirm() - p2 = env[2].payments.create( - amount=Decimal('8.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED - ) + with scopes_disabled(): + p = env[2].payments.last() + p.amount = Decimal('6.00') + p.confirm() + p2 = env[2].payments.create( + amount=Decimal('8.00'), provider='stripe', state=OrderPayment.PAYMENT_STATE_CONFIRMED + ) client.login(email='dummy@dummy.dummy', password='dummy') client.get('/control/event/dummy/dummy/orders/FOO/refund') response = client.post('/control/event/dummy/dummy/orders/FOO/refund', { @@ -1482,15 +1584,16 @@ def test_refund_propose_higher_payment(client, env): 'start-mode': 'partial', 'start-action': 'mark_pending' }, follow=True) - doc = BeautifulSoup(response.content, "lxml") + doc = BeautifulSoup(response.content.decode(), "lxml") assert doc.select("input[name=refund-{}]".format(p2.pk))[0]['value'] == '7.00' assert doc.select("input[name=refund-manual]".format(p2.pk))[0]['value'] == '0.00' @pytest.mark.django_db def test_refund_amount_does_not_match_or_invalid(client, env): - p = env[2].payments.last() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') resp = client.post('/control/event/dummy/dummy/orders/FOO/refund', { 'start-partial_amount': '7.00', @@ -1540,13 +1643,14 @@ def test_refund_amount_does_not_match_or_invalid(client, env): @pytest.mark.django_db def test_refund_paid_order_automatically_failed(client, env, monkeypatch): - p = env[2].payments.last() - p.provider = 'stripe' - p.info_data = { - 'id': 'foo' - } - p.save() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.provider = 'stripe' + p.info_data = { + 'id': 'foo' + } + p.save() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') def charge_retr(*args, **kwargs): @@ -1571,7 +1675,8 @@ def test_refund_paid_order_automatically_failed(client, env, monkeypatch): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() - r = env[2].refunds.last() + with scopes_disabled(): + r = env[2].refunds.last() assert r.provider == "stripe" assert r.state == OrderRefund.REFUND_STATE_FAILED assert r.amount == Decimal('7.00') @@ -1580,13 +1685,14 @@ def test_refund_paid_order_automatically_failed(client, env, monkeypatch): @pytest.mark.django_db def test_refund_paid_order_automatically(client, env, monkeypatch): - p = env[2].payments.last() - p.provider = 'stripe' - p.info_data = { - 'id': 'foo' - } - p.save() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.provider = 'stripe' + p.info_data = { + 'id': 'foo' + } + p.save() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') def charge_retr(*args, **kwargs): @@ -1613,7 +1719,8 @@ def test_refund_paid_order_automatically(client, env, monkeypatch): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() - r = env[2].refunds.last() + with scopes_disabled(): + r = env[2].refunds.last() assert r.provider == "stripe" assert r.state == OrderRefund.REFUND_STATE_DONE assert r.amount == Decimal('7.00') @@ -1622,8 +1729,9 @@ def test_refund_paid_order_automatically(client, env, monkeypatch): @pytest.mark.django_db def test_refund_paid_order_offsetting_to_unknown(client, env): - p = env[2].payments.last() - p.confirm() + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() client.login(email='dummy@dummy.dummy', password='dummy') r = client.post('/control/event/dummy/dummy/orders/FOO/refund', { @@ -1640,15 +1748,16 @@ def test_refund_paid_order_offsetting_to_unknown(client, env): @pytest.mark.django_db def test_refund_paid_order_offsetting(client, env): - p = env[2].payments.last() - p.confirm() - client.login(email='dummy@dummy.dummy', password='dummy') - o = Order.objects.create( - code='BAZ', event=env[0], email='dummy@dummy.test', - status=Order.STATUS_PENDING, - datetime=now(), expires=now() + timedelta(days=10), - total=5, locale='en' - ) + with scopes_disabled(): + p = env[2].payments.last() + p.confirm() + client.login(email='dummy@dummy.dummy', password='dummy') + o = Order.objects.create( + code='BAZ', event=env[0], email='dummy@dummy.test', + status=Order.STATUS_PENDING, + datetime=now(), expires=now() + timedelta(days=10), + total=5, locale='en' + ) client.post('/control/event/dummy/dummy/orders/FOO/refund', { 'start-partial_amount': '5.00', @@ -1662,51 +1771,53 @@ def test_refund_paid_order_offsetting(client, env): p.refresh_from_db() assert p.state == OrderPayment.PAYMENT_STATE_CONFIRMED env[2].refresh_from_db() - r = env[2].refunds.last() - assert r.provider == "offsetting" - assert r.state == OrderRefund.REFUND_STATE_DONE - assert r.amount == Decimal('5.00') - assert env[2].status == Order.STATUS_PENDING - o.refresh_from_db() - assert o.status == Order.STATUS_PAID - p2 = o.payments.first() - assert p2.provider == "offsetting" - assert p2.amount == Decimal('5.00') - assert p2.state == OrderPayment.PAYMENT_STATE_CONFIRMED + with scopes_disabled(): + r = env[2].refunds.last() + assert r.provider == "offsetting" + assert r.state == OrderRefund.REFUND_STATE_DONE + assert r.amount == Decimal('5.00') + assert env[2].status == Order.STATUS_PENDING + o.refresh_from_db() + assert o.status == Order.STATUS_PAID + p2 = o.payments.first() + assert p2.provider == "offsetting" + assert p2.amount == Decimal('5.00') + assert p2.state == OrderPayment.PAYMENT_STATE_CONFIRMED @pytest.mark.django_db def test_refund_list(client, env): - env[2].refunds.create( - provider='banktransfer', - state='done', - source='admin', - amount=Decimal('23.00'), - execution_date=now(), - ) - env[2].refunds.create( - provider='manual', - state='created', - source='admin', - amount=Decimal('23.00'), - execution_date=now(), - ) + with scopes_disabled(): + env[2].refunds.create( + provider='banktransfer', + state='done', + source='admin', + amount=Decimal('23.00'), + execution_date=now(), + ) + env[2].refunds.create( + provider='manual', + state='created', + source='admin', + amount=Decimal('23.00'), + execution_date=now(), + ) client.login(email='dummy@dummy.dummy', password='dummy') response = client.get('/control/event/dummy/dummy/orders/refunds/') - assert 'R-1' not in response.rendered_content - assert 'R-2' in response.rendered_content + assert 'R-1' not in response.content.decode() + assert 'R-2' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/refunds/?status=all') - assert 'R-1' in response.rendered_content - assert 'R-2' in response.rendered_content + assert 'R-1' in response.content.decode() + assert 'R-2' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/refunds/?status=created') - assert 'R-1' not in response.rendered_content - assert 'R-2' in response.rendered_content + assert 'R-1' not in response.content.decode() + assert 'R-2' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/refunds/?status=done') - assert 'R-1' in response.rendered_content - assert 'R-2' not in response.rendered_content + assert 'R-1' in response.content.decode() + assert 'R-2' not in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/refunds/?status=all&provider=manual') - assert 'R-1' not in response.rendered_content - assert 'R-2' in response.rendered_content + assert 'R-1' not in response.content.decode() + assert 'R-2' in response.content.decode() response = client.get('/control/event/dummy/dummy/orders/refunds/?status=all&provider=banktransfer') - assert 'R-1' in response.rendered_content - assert 'R-2' not in response.rendered_content + assert 'R-1' in response.content.decode() + assert 'R-2' not in response.content.decode() diff --git a/src/tests/control/test_organizer.py b/src/tests/control/test_organizer.py index 11e9425458..b2abff98b3 100644 --- a/src/tests/control/test_organizer.py +++ b/src/tests/control/test_organizer.py @@ -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') diff --git a/src/tests/control/test_search.py b/src/tests/control/test_search.py index a554e609f9..c97ed7f90b 100644 --- a/src/tests/control/test_search.py +++ b/src/tests/control/test_search.py @@ -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 diff --git a/src/tests/control/test_settings.py b/src/tests/control/test_settings.py index 026c4eb028..6080e80050 100644 --- a/src/tests/control/test_settings.py +++ b/src/tests/control/test_settings.py @@ -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' diff --git a/src/tests/control/test_shredders.py b/src/tests/control/test_shredders.py index 8939483634..9f63709086 100644 --- a/src/tests/control/test_shredders.py +++ b/src/tests/control/test_shredders.py @@ -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') diff --git a/src/tests/control/test_taxrates.py b/src/tests/control/test_taxrates.py index d999945f92..0b911d1366 100644 --- a/src/tests/control/test_taxrates.py +++ b/src/tests/control/test_taxrates.py @@ -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() diff --git a/src/tests/control/test_teams.py b/src/tests/control/test_teams.py index 398b5664ad..cbaa2676b2 100644 --- a/src/tests/control/test_teams.py +++ b/src/tests/control/test_teams.py @@ -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'