Fix #785 -- Show availability in (sub)event list (#1112)

This commit is contained in:
Raphael Michel
2018-12-11 13:59:49 +01:00
committed by GitHub
parent eed220f14a
commit d267dfc682
17 changed files with 421 additions and 45 deletions

View File

@@ -1085,6 +1085,51 @@ class ItemTest(TestCase):
i.active = False
assert not i.is_available()
def test_availability_filter(self):
i = Item.objects.create(
event=self.event, name="Ticket", default_price=23,
active=True, available_until=now() + timedelta(days=1),
)
assert Item.objects.filter_available().exists()
assert not Item.objects.filter_available(channel='foo').exists()
i.available_from = now() - timedelta(days=1)
i.save()
assert Item.objects.filter_available().exists()
i.available_from = now() + timedelta(days=1)
i.available_until = None
i.save()
assert not Item.objects.filter_available().exists()
i.available_from = None
i.available_until = now() - timedelta(days=1)
i.save()
assert not Item.objects.filter_available().exists()
i.available_from = None
i.available_until = None
i.save()
assert Item.objects.filter_available().exists()
i.active = False
i.save()
assert not Item.objects.filter_available().exists()
cat = ItemCategory.objects.create(
event=self.event, name='Foo', is_addon=True
)
i.active = True
i.category = cat
i.save()
assert not Item.objects.filter_available().exists()
assert Item.objects.filter_available(allow_addons=True).exists()
i.category = None
i.hide_without_voucher = True
i.save()
v = Voucher.objects.create(
event=self.event, item=i,
)
assert not Item.objects.filter_available().exists()
assert Item.objects.filter_available(voucher=v).exists()
class EventTest(TestCase):
@classmethod
@@ -1207,6 +1252,100 @@ class EventTest(TestCase):
assert event.presale_has_ended
assert not event.presale_is_running
def test_active_quotas_annotation(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
item2 = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=False)
q.items.add(item)
q.items.add(item2)
assert Event.annotated(Event.objects).first().active_quotas == [q]
assert Event.annotated(Event.objects, 'foo').first().active_quotas == []
def test_active_quotas_annotation_product_inactive(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=False)
q.items.add(item)
assert Event.annotated(Event.objects).first().active_quotas == []
def test_active_quotas_annotation_product_addon(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
cat = ItemCategory.objects.create(
event=event, name='Foo', is_addon=True
)
item.category = cat
item.save()
q.items.add(item)
assert Event.annotated(Event.objects).first().active_quotas == []
def test_active_quotas_annotation_product_unavailable(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True, available_until=now() - timedelta(days=1))
q.items.add(item)
assert Event.annotated(Event.objects).first().active_quotas == []
def test_active_quotas_annotation_variation_not_in_quota(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
item.variations.create(value="foo")
q.items.add(item)
assert Event.annotated(Event.objects).first().active_quotas == []
def test_active_quotas_annotation_variation(self):
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
q = Quota.objects.create(event=event, name='Quota', size=2)
item = Item.objects.create(event=event, name='Early-bird ticket', default_price=0, active=True)
v = item.variations.create(value="foo")
item.variations.create(value="bar")
q.items.add(item)
q.variations.add(v)
assert Event.annotated(Event.objects).first().active_quotas == [q]
item.available_until = now() - timedelta(days=1)
item.save()
assert Event.annotated(Event.objects).first().active_quotas == []
item.available_until = None
item.available_from = now() + timedelta(days=1)
item.save()
assert Event.annotated(Event.objects).first().active_quotas == []
item.available_until = None
item.available_from = None
item.active = False
item.save()
assert Event.annotated(Event.objects).first().active_quotas == []
item.active = True
item.save()
assert Event.annotated(Event.objects).first().active_quotas == [q]
assert Event.annotated(Event.objects, 'foo').first().active_quotas == []
v.active = False
v.save()
assert Event.annotated(Event.objects).first().active_quotas == []
item.hide_without_voucher = True
item.save()
assert Event.annotated(Event.objects).first().active_quotas == []
class SubEventTest(TestCase):
@classmethod
@@ -1242,6 +1381,45 @@ class SubEventTest(TestCase):
v.pk: Decimal('30.00')
}
def test_active_quotas_annotation(self):
q = Quota.objects.create(event=self.event, name='Quota', size=2,
subevent=self.se)
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True)
q.items.add(item)
assert SubEvent.annotated(SubEvent.objects).first().active_quotas == [q]
assert SubEvent.annotated(SubEvent.objects, 'foo').first().active_quotas == []
def test_active_quotas_annotation_no_interference(self):
se2 = SubEvent.objects.create(
name='Testsub', date_from=now(), event=self.event
)
q = Quota.objects.create(event=self.event, name='Quota', size=2,
subevent=se2)
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True)
q.items.add(item)
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]
def test_best_availability(self):
q = Quota.objects.create(event=self.event, name='Quota', size=0,
subevent=self.se)
item = Item.objects.create(event=self.event, name='Early-bird ticket', default_price=0, active=True)
q.items.add(item)
obj = SubEvent.annotated(SubEvent.objects).first()
assert len(obj.active_quotas) == 1
assert obj.best_availability_state == Quota.AVAILABILITY_GONE
q2 = Quota.objects.create(event=self.event, name='Quota 2', size=1,
subevent=self.se)
q2.items.add(item)
obj = SubEvent.annotated(SubEvent.objects).first()
assert len(obj.active_quotas) == 2
assert obj.best_availability_state == Quota.AVAILABILITY_GONE
item2 = Item.objects.create(event=self.event, name='Regular ticket', default_price=10, active=True)
q2.items.add(item2)
obj = SubEvent.annotated(SubEvent.objects).first()
assert len(obj.active_quotas) == 2
assert obj.best_availability_state == Quota.AVAILABILITY_OK
class CachedFileTestCase(TestCase):
def test_file_handling(self):