Calendar: Show fully booked instead of sold out for free events

This commit is contained in:
Raphael Michel
2020-09-24 10:51:41 +02:00
parent 787e7ec993
commit 035c707427
7 changed files with 38 additions and 10 deletions

View File

@@ -189,7 +189,9 @@ class EventMixin:
).order_by().values_list('quotas__pk').annotate(
items=GroupConcat('pk', delimiter=',')
).values('items')
return qs.prefetch_related(
return qs.annotate(
has_paid_item=Exists(Item.objects.filter(event_id=OuterRef(cls._event_id), default_price__gt=0))
).prefetch_related(
Prefetch(
'quotas',
to_attr='active_quotas',
@@ -280,6 +282,7 @@ class Event(EventMixin, LoggedModel):
"""
settings_namespace = 'event'
_event_id = 'pk'
CURRENCY_CHOICES = [(c.alpha_3, c.alpha_3 + " - " + c.name) for c in settings.CURRENCIES]
organizer = models.ForeignKey(Organizer, related_name="events", on_delete=models.PROTECT)
testmode = models.BooleanField(default=False)
@@ -786,7 +789,9 @@ class Event(EventMixin, LoggedModel):
'name_ascending': ('name', 'date_from'),
'name_descending': ('-name', 'date_from'),
}[ordering]
subevs = queryset.filter(
subevs = queryset.annotate(
has_paid_item=self.cache.get_or_set('has_paid_item', lambda: self.items.filter(default_price__gt=0).exists(), 3600)
).filter(
Q(active=True) & Q(is_public=True) & (
Q(Q(date_to__isnull=True) & Q(date_from__gte=now() - timedelta(hours=24)))
| Q(date_to__gte=now() - timedelta(hours=24))
@@ -980,6 +985,7 @@ class SubEvent(EventMixin, LoggedModel):
:type location: str
"""
_event_id = 'event_id'
event = models.ForeignKey(Event, related_name="subevents", on_delete=models.PROTECT)
active = models.BooleanField(default=False, verbose_name=_("Active"),
help_text=_("Only with this checkbox enabled, this date is visible in the "

View File

@@ -24,7 +24,11 @@
{% elif subev.best_availability_state == 20 %}
<span class="label label-warning">{% trans "Reserved" %}</span>
{% elif subev.best_availability_state < 20 %}
<span class="label label-danger">{% trans "Sold out" %}</span>
{% if subev.has_paid_item %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% else %}
<span class="fa fa-ticket"></span> {% trans "Fully booked" %}
{% endif %}
{% endif %}
{% elif subev.presale_is_running %}
<span class="label label-success">{% trans "Book now" %}</span>

View File

@@ -57,6 +57,11 @@
<strong>
{% endif %}
{{ event.time|date:"TIME_FORMAT" }}
{% if event.time_end %}
{{ event.time_end|date:"TIME_FORMAT" }}
{% endif %}
{% if event.event.settings.show_date_to and event. %}
{% endif %}
{% if not show_names|default_if_none:True %}
</strong>
{% endif %}
@@ -74,7 +79,11 @@
{% elif event.event.best_availability_state == 20 %}
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
{% elif event.event.best_availability_state < 20 %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% if event.event.has_paid_item %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% else %}
<span class="fa fa-ticket"></span> {% trans "Fully booked" %}
{% endif %}
{% endif %}
{% elif event.event.presale_is_running %}
<span class="fa fa-ticket"></span> {% trans "Book now" %}

View File

@@ -58,7 +58,11 @@
{% elif event.event.best_availability_state == 20 %}
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
{% elif event.event.best_availability_state < 20 %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% if event.event.has_paid_item %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% else %}
<span class="fa fa-ticket"></span> {% trans "Fully booked" %}
{% endif %}
{% endif %}
{% elif event.event.presale_is_running %}
<span class="fa fa-ticket"></span> {% trans "Book now" %}

View File

@@ -108,7 +108,11 @@
{% elif e.best_availability_state == 20 %}
<span class="label label-warning">{% trans "Reserved" %}</span>
{% elif e.best_availability_state < 20 %}
<span class="label label-danger">{% trans "Sold out" %}</span>
{% if e.has_paid_item %}
<span class="fa fa-ticket"></span> {% trans "Sold out" %}
{% else %}
<span class="fa fa-ticket"></span> {% trans "Fully booked" %}
{% endif %}
{% endif %}
{% elif e.presale_is_running %}
<span class="label label-success">{% trans "Book now" %}</span>

View File

@@ -17,9 +17,7 @@ from django.views.generic import ListView, TemplateView
from pytz import UTC
from pretix.base.i18n import language
from pretix.base.models import (
Event, EventMetaValue, SubEvent, SubEventMetaValue,
)
from pretix.base.models import Event, EventMetaValue, SubEvent, SubEventMetaValue
from pretix.base.services.quotas import QuotaAvailability
from pretix.helpers.daterange import daterange
from pretix.helpers.formats.de.formats import WEEK_FORMAT

View File

@@ -317,7 +317,10 @@ class WidgetAPIProductList(EventListMixin, View):
availability['text'] = gettext('Reserved')
elif ev.best_availability_state < Quota.AVAILABILITY_RESERVED:
availability['color'] = 'red'
availability['text'] = gettext('Sold out')
if ev.has_paid_item:
availability['text'] = gettext('Sold out')
else:
availability['text'] = gettext('Fully booked')
elif ev.presale_is_running:
availability['color'] = 'green'
availability['text'] = gettext('Book now')