Add setting to hide sold-out timeslots

This commit is contained in:
Raphael Michel
2021-03-29 10:18:25 +02:00
parent d3748a6194
commit d43e85da6d
7 changed files with 33 additions and 2 deletions

View File

@@ -628,6 +628,7 @@ class EventSettingsSerializer(SettingsSerializer):
'redirect_to_checkout_directly',
'frontpage_subevent_ordering',
'event_list_type',
'event_list_available_only',
'frontpage_text',
'event_info_text',
'attendee_names_asked',

View File

@@ -1138,6 +1138,15 @@ DEFAULTS = {
help_text=_('If your event series has more than 50 dates in the future, only the month or week calendar can be used.')
),
},
'event_list_available_only': {
'default': 'False',
'type': bool,
'form_class': forms.BooleanField,
'serializer_class': serializers.BooleanField,
'form_kwargs': dict(
label=_("Hide all unavailable dates from calendar or list views"),
)
},
'allow_modifications_after_checkin': {
'default': 'False',
'type': bool,

View File

@@ -463,6 +463,7 @@ class EventSettingsForm(SettingsForm):
'redirect_to_checkout_directly',
'frontpage_subevent_ordering',
'event_list_type',
'event_list_available_only',
'frontpage_text',
'event_info_text',
'attendee_names_asked',
@@ -547,6 +548,7 @@ class EventSettingsForm(SettingsForm):
if not self.event.has_subevents:
del self.fields['frontpage_subevent_ordering']
del self.fields['event_list_type']
del self.fields['event_list_available_only']
# create "virtual" fields for better UX when editing <name>_asked and <name>_required fields
self.virtual_keys = []

View File

@@ -30,6 +30,7 @@
{% bootstrap_field sform.contact_mail layout="control" %}
{% bootstrap_field sform.imprint_url layout="control" %}
{% bootstrap_field form.is_public layout="control" %}
{% bootstrap_field form.sales_channels layout="control" %}
{% if meta_forms %}
<div class="form-group metadata-group">
@@ -236,7 +237,9 @@
{% if sform.event_list_type %}
{% bootstrap_field sform.event_list_type layout="control" %}
{% endif %}
{% bootstrap_field form.sales_channels layout="control" %}
{% if sform.event_list_available_only %}
{% bootstrap_field sform.event_list_available_only layout="control" %}
{% endif %}
</fieldset>
<fieldset>
<legend>{% trans "Cart" %}</legend>

View File

@@ -503,6 +503,11 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['subevent_list'] = self.request.event.subevents_sorted(
filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel.identifier).using(settings.DATABASE_REPLICA), self.request)
)
if self.request.event.settings.event_list_available_only:
context['subevent_list'] = [
se for se in context['subevent_list']
if not se.presale_has_ended and se.best_availability_state >= Quota.AVAILABILITY_RESERVED
]
return context

View File

@@ -18,7 +18,7 @@ from pytz import UTC
from pretix.base.i18n import language
from pretix.base.models import (
Event, EventMetaValue, SubEvent, SubEventMetaValue,
Event, EventMetaValue, SubEvent, SubEventMetaValue, Quota,
)
from pretix.base.services.quotas import QuotaAvailability
from pretix.helpers.compat import date_fromisocalendar
@@ -386,6 +386,11 @@ def add_subevents_for_days(qs, before, after, ebd, timezones, event=None, cart_n
kwargs['cart_namespace'] = cart_namespace
s = event.settings if event else se.event.settings
if s.event_list_available_only:
if se.presale_has_ended or se.best_availability_state < Quota.AVAILABILITY_RESERVED:
continue
timezones.add(s.timezones)
tz = pytz.timezone(s.timezone)
datetime_from = se.date_from.astimezone(tz)

View File

@@ -513,6 +513,12 @@ class WidgetAPIProductList(EventListMixin, View):
filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel.identifier), self.request)
)
tz = pytz.timezone(request.event.settings.timezone)
if self.request.event.settings.event_list_available_only:
evs = [
se for se in evs
if not se.presale_has_ended and se.best_availability_state >= Quota.AVAILABILITY_RESERVED
]
data['events'] = [
{
'name': str(ev.name),