Week calendar and more improvements to subevent calendars (#1672)

This commit is contained in:
Raphael Michel
2020-05-07 15:48:47 +02:00
committed by GitHub
parent 6a4c81ff3c
commit de9c450648
28 changed files with 796 additions and 106 deletions
-18
View File
@@ -4,15 +4,12 @@ from decimal import Decimal
from unittest import mock
import pytest
from django.dispatch import receiver
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pytz import UTC
from pretix.base.channels import SalesChannel
from pretix.base.models import Question, SeatingPlan
from pretix.base.models.orders import CartPosition
from pretix.base.signals import register_sales_channels
@pytest.fixture
@@ -52,21 +49,6 @@ def quota(event, item):
return q
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = False
unlimited_items_per_order = True
@receiver(register_sales_channels, dispatch_uid="test_cart_register_sales_channels")
def base_sales_channels(sender, **kwargs):
return (
FoobarSalesChannel(),
)
TEST_CARTPOSITION_RES = {
'id': 1,
'cart_id': 'aaa@api',
+1 -18
View File
@@ -6,7 +6,6 @@ from unittest import mock
import pytest
from django.core import mail as djmail
from django.dispatch import receiver
from django.utils.timezone import now
from django_countries.fields import Country
from django_scopes import scopes_disabled
@@ -14,7 +13,6 @@ from pytz import UTC
from stripe.error import APIConnectionError
from tests.plugins.stripe.test_provider import MockedCharge
from pretix.base.channels import SalesChannel
from pretix.base.models import (
InvoiceAddress, Order, OrderPosition, Question, SeatingPlan,
)
@@ -24,21 +22,6 @@ from pretix.base.models.orders import (
from pretix.base.services.invoices import (
generate_cancellation, generate_invoice,
)
from pretix.base.signals import register_sales_channels
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = False
@receiver(register_sales_channels, dispatch_uid="test_orders_register_sales_channels")
def base_sales_channels(sender, **kwargs):
return (
FoobarSalesChannel(),
)
@pytest.fixture
@@ -1785,7 +1768,7 @@ def test_order_create_in_test_mode_saleschannel_limited(token_client, organizer,
res['positions'][0]['item'] = item.pk
res['positions'][0]['answers'][0]['question'] = question.pk
res['testmode'] = True
res['sales_channel'] = 'bar'
res['sales_channel'] = 'baz'
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
+3 -19
View File
@@ -4,13 +4,12 @@ from decimal import Decimal
import pytest
import pytz
from django.core import mail as djmail
from django.dispatch import receiver
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 tests.testdummy.signals import FoobazSalesChannel
from pretix.base.channels import SalesChannel
from pretix.base.decimal import round_decimal
from pretix.base.models import (
CartPosition, Event, InvoiceAddress, Item, Order, OrderPosition, Organizer,
@@ -26,25 +25,10 @@ from pretix.base.services.orders import (
deny_order, expire_orders, reactivate_order, send_download_reminders,
send_expiry_warnings,
)
from pretix.base.signals import register_sales_channels
from pretix.plugins.banktransfer.payment import BankTransfer
from pretix.testutils.scope import classscope
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = False
@receiver(register_sales_channels, dispatch_uid="test_orders_register_sales_channels")
def base_sales_channels(sender, **kwargs):
return (
FoobarSalesChannel(),
)
@pytest.fixture(scope='function')
def event():
o = Organizer.objects.create(name='Dummy', slug='dummy')
@@ -2321,7 +2305,7 @@ def test_saleschannel_testmode_restriction(event):
order = _create_order(event, email='dummy@example.org', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de', sales_channel=FoobarSalesChannel.identifier)[0]
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
assert not order.testmode
event.testmode = True
@@ -2332,7 +2316,7 @@ def test_saleschannel_testmode_restriction(event):
order = _create_order(event, email='dummy@example.org', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de', sales_channel=FoobarSalesChannel.identifier)[0]
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
assert not order.testmode
+1 -18
View File
@@ -4,13 +4,12 @@ from datetime import timedelta
from decimal import Decimal
from bs4 import BeautifulSoup
from django.dispatch import receiver
from django.test import TestCase
from django.utils.timezone import now
from django_countries.fields import Country
from django_scopes import scopes_disabled
from tests.testdummy.signals import FoobarSalesChannel
from pretix.base.channels import SalesChannel
from pretix.base.decimal import round_decimal
from pretix.base.models import (
CartPosition, Event, InvoiceAddress, Item, ItemCategory, ItemVariation,
@@ -22,26 +21,10 @@ from pretix.base.models.items import (
from pretix.base.services.cart import (
CartError, CartManager, error_messages, update_tax_rates,
)
from pretix.base.signals import register_sales_channels
from pretix.testutils.scope import classscope
from pretix.testutils.sessions import get_cart_session_key
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = False
unlimited_items_per_order = True
@receiver(register_sales_channels, dispatch_uid="test_cart_register_sales_channels")
def base_sales_channels(sender, **kwargs):
return (
FoobarSalesChannel(),
)
class CartTestMixin:
@scopes_disabled()
def setUp(self):
+20 -8
View File
@@ -11,8 +11,8 @@ from django.utils.timezone import now
from django_scopes import scopes_disabled
from pytz import timezone
from tests.base import SoupTest
from tests.testdummy.signals import FoobarSalesChannel
from pretix.base.channels import SalesChannel
from pretix.base.models import (
Event, Item, ItemCategory, ItemVariation, Order, Organizer, Quota, Team,
User, WaitingListEntry,
@@ -20,13 +20,6 @@ from pretix.base.models import (
from pretix.base.models.items import SubEventItem, SubEventItemVariation
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = True
class EventTestMixin:
@scopes_disabled()
def setUp(self):
@@ -228,6 +221,25 @@ class ItemDisplayTest(EventTestMixin, SoupTest):
self.assertIn("Foo SE1", resp.rendered_content)
self.assertNotIn("Foo SE2", resp.rendered_content)
def test_subevent_week_calendar(self):
self.event.settings.event_list_type = 'week'
self.event.has_subevents = True
self.event.save()
with scopes_disabled():
se1 = self.event.subevents.create(name='Foo SE1', date_from=now() + datetime.timedelta(days=24),
active=True)
self.event.subevents.create(name='Foo SE2', date_from=now() + datetime.timedelta(days=12),
active=True)
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
print(resp.rendered_content)
self.assertIn("Foo SE2", resp.rendered_content)
self.assertNotIn("Foo SE1", resp.rendered_content)
resp = self.client.get('/%s/%s/?year=%d&week=%d' % (self.orga.slug, self.event.slug,
se1.date_from.isocalendar()[0],
se1.date_from.isocalendar()[1]))
self.assertIn("Foo SE1", resp.rendered_content)
self.assertNotIn("Foo SE2", resp.rendered_content)
def test_subevents(self):
self.event.has_subevents = True
self.event.save()
+18
View File
@@ -138,6 +138,24 @@ def test_calendar(env, client):
assert 'October 2017' in r.rendered_content
@pytest.mark.django_db
def test_week_calendar(env, client):
env[0].settings.event_list_type = 'calendar'
e = Event.objects.create(
organizer=env[0], name='MRMCD2017', slug='2017',
date_from=datetime(now().year + 1, 9, 1, tzinfo=UTC),
live=True, is_public=False
)
r = client.get('/mrmcd/?style=week')
assert 'MRMCD2017' not in r.rendered_content
e.is_public = True
e.save()
r = client.get('/mrmcd/?style=week')
assert 'MRMCD2017' in r.rendered_content
r = client.get('/mrmcd/?style=week&week=2&year=2017')
assert 'MRMCD2017' not in r.rendered_content
@pytest.mark.django_db
def test_attributes_in_calendar(env, client):
env[0].settings.event_list_type = 'calendar'
+38
View File
@@ -555,6 +555,44 @@ class WidgetCartTest(CartTestMixin, TestCase):
]
}
def test_subevent_week_calendar(self):
self.event.has_subevents = True
self.event.settings.timezone = 'Europe/Berlin'
self.event.save()
with freeze_time("2019-01-01 10:00:00"):
with scopes_disabled():
self.event.subevents.create(name="Past", active=True, date_from=now() - datetime.timedelta(days=3))
se1 = self.event.subevents.create(name="Present", active=True, date_from=now())
se2 = self.event.subevents.create(name="Future", active=True, date_from=now() + datetime.timedelta(days=3))
self.event.subevents.create(name="Disabled", active=False, date_from=now() + datetime.timedelta(days=3))
self.event.subevents.create(name="Hidden", active=True, is_public=False, date_from=now() + datetime.timedelta(days=3))
response = self.client.get('/%s/%s/widget/product_list?style=week' % (self.orga.slug, self.event.slug))
settings.SITE_URL = 'http://example.com'
data = json.loads(response.content.decode())
assert data == {
'list_type': 'week',
'week': [2019, 1],
'poweredby': '<a href="https://pretix.eu" target="_blank" rel="noopener">event ticketing powered by pretix</a>',
'days': [
{'day_formatted': 'Mon, Dec 31st', 'date': '2018-12-31', 'events': []},
{'day_formatted': 'Tue, Jan 1st', 'date': '2019-01-01', 'events': [
{'name': 'Present', 'time': '11:00', 'continued': False, 'date_range': 'Jan. 1, 2019 11:00',
'location': '',
'availability': {'color': 'green', 'text': 'Book now'},
'event_url': 'http://example.com/ccc/30c3/', 'subevent': se1.pk}]},
{'day_formatted': 'Wed, Jan 2nd', 'date': '2019-01-02', 'events': []},
{'day_formatted': 'Thu, Jan 3rd', 'date': '2019-01-03', 'events': []},
{'day_formatted': 'Fri, Jan 4th', 'date': '2019-01-04', 'events': [
{'name': 'Future', 'time': '11:00', 'continued': False, 'date_range': 'Jan. 4, 2019 11:00',
'location': '',
'availability': {'color': 'green', 'text': 'Book now'},
'event_url': 'http://example.com/ccc/30c3/', 'subevent': se2.pk}]},
{'day_formatted': 'Sat, Jan 5th', 'date': '2019-01-05', 'events': []},
{'day_formatted': 'Sun, Jan 6th', 'date': '2019-01-06', 'events': []}
],
}
def test_event_list(self):
self.event.has_subevents = True
self.event.settings.timezone = 'Europe/Berlin'
+23 -1
View File
@@ -1,7 +1,9 @@
from django.dispatch import receiver
from pretix.base.channels import SalesChannel
from pretix.base.signals import (
register_payment_providers, register_ticket_outputs,
register_payment_providers, register_sales_channels,
register_ticket_outputs,
)
@@ -15,3 +17,23 @@ def register_ticket_outputs(sender, **kwargs):
def register_payment_provider(sender, **kwargs):
from .payment import DummyPaymentProvider, DummyFullRefundablePaymentProvider, DummyPartialRefundablePaymentProvider
return [DummyPaymentProvider, DummyFullRefundablePaymentProvider, DummyPartialRefundablePaymentProvider]
class FoobazSalesChannel(SalesChannel):
identifier = "baz"
verbose_name = "Foobar"
icon = "home"
testmode_supported = False
class FoobarSalesChannel(SalesChannel):
identifier = "bar"
verbose_name = "Foobar"
icon = "home"
testmode_supported = True
unlimited_items_per_order = True
@receiver(register_sales_channels, dispatch_uid="sc_dummy")
def register_sc(sender, **kwargs):
return [FoobarSalesChannel, FoobazSalesChannel]