forked from CGM_Public/pretix_original
Calendar: Show fully booked instead of sold out for free events
This commit is contained in:
@@ -189,7 +189,9 @@ class EventMixin:
|
|||||||
).order_by().values_list('quotas__pk').annotate(
|
).order_by().values_list('quotas__pk').annotate(
|
||||||
items=GroupConcat('pk', delimiter=',')
|
items=GroupConcat('pk', delimiter=',')
|
||||||
).values('items')
|
).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(
|
Prefetch(
|
||||||
'quotas',
|
'quotas',
|
||||||
to_attr='active_quotas',
|
to_attr='active_quotas',
|
||||||
@@ -280,6 +282,7 @@ class Event(EventMixin, LoggedModel):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
settings_namespace = 'event'
|
settings_namespace = 'event'
|
||||||
|
_event_id = 'pk'
|
||||||
CURRENCY_CHOICES = [(c.alpha_3, c.alpha_3 + " - " + c.name) for c in settings.CURRENCIES]
|
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)
|
organizer = models.ForeignKey(Organizer, related_name="events", on_delete=models.PROTECT)
|
||||||
testmode = models.BooleanField(default=False)
|
testmode = models.BooleanField(default=False)
|
||||||
@@ -786,7 +789,9 @@ class Event(EventMixin, LoggedModel):
|
|||||||
'name_ascending': ('name', 'date_from'),
|
'name_ascending': ('name', 'date_from'),
|
||||||
'name_descending': ('-name', 'date_from'),
|
'name_descending': ('-name', 'date_from'),
|
||||||
}[ordering]
|
}[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(active=True) & Q(is_public=True) & (
|
||||||
Q(Q(date_to__isnull=True) & Q(date_from__gte=now() - timedelta(hours=24)))
|
Q(Q(date_to__isnull=True) & Q(date_from__gte=now() - timedelta(hours=24)))
|
||||||
| Q(date_to__gte=now() - timedelta(hours=24))
|
| Q(date_to__gte=now() - timedelta(hours=24))
|
||||||
@@ -980,6 +985,7 @@ class SubEvent(EventMixin, LoggedModel):
|
|||||||
:type location: str
|
:type location: str
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_event_id = 'event_id'
|
||||||
event = models.ForeignKey(Event, related_name="subevents", on_delete=models.PROTECT)
|
event = models.ForeignKey(Event, related_name="subevents", on_delete=models.PROTECT)
|
||||||
active = models.BooleanField(default=False, verbose_name=_("Active"),
|
active = models.BooleanField(default=False, verbose_name=_("Active"),
|
||||||
help_text=_("Only with this checkbox enabled, this date is visible in the "
|
help_text=_("Only with this checkbox enabled, this date is visible in the "
|
||||||
|
|||||||
@@ -24,7 +24,11 @@
|
|||||||
{% elif subev.best_availability_state == 20 %}
|
{% elif subev.best_availability_state == 20 %}
|
||||||
<span class="label label-warning">{% trans "Reserved" %}</span>
|
<span class="label label-warning">{% trans "Reserved" %}</span>
|
||||||
{% elif subev.best_availability_state < 20 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% elif subev.presale_is_running %}
|
{% elif subev.presale_is_running %}
|
||||||
<span class="label label-success">{% trans "Book now" %}</span>
|
<span class="label label-success">{% trans "Book now" %}</span>
|
||||||
|
|||||||
@@ -57,6 +57,11 @@
|
|||||||
<strong>
|
<strong>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ event.time|date:"TIME_FORMAT" }}
|
{{ 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 %}
|
{% if not show_names|default_if_none:True %}
|
||||||
</strong>
|
</strong>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -74,7 +79,11 @@
|
|||||||
{% elif event.event.best_availability_state == 20 %}
|
{% elif event.event.best_availability_state == 20 %}
|
||||||
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
|
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
|
||||||
{% elif event.event.best_availability_state < 20 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% elif event.event.presale_is_running %}
|
{% elif event.event.presale_is_running %}
|
||||||
<span class="fa fa-ticket"></span> {% trans "Book now" %}
|
<span class="fa fa-ticket"></span> {% trans "Book now" %}
|
||||||
|
|||||||
@@ -58,7 +58,11 @@
|
|||||||
{% elif event.event.best_availability_state == 20 %}
|
{% elif event.event.best_availability_state == 20 %}
|
||||||
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
|
<span class="fa fa-ticket"></span> {% trans "Reserved" %}
|
||||||
{% elif event.event.best_availability_state < 20 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% elif event.event.presale_is_running %}
|
{% elif event.event.presale_is_running %}
|
||||||
<span class="fa fa-ticket"></span> {% trans "Book now" %}
|
<span class="fa fa-ticket"></span> {% trans "Book now" %}
|
||||||
|
|||||||
@@ -108,7 +108,11 @@
|
|||||||
{% elif e.best_availability_state == 20 %}
|
{% elif e.best_availability_state == 20 %}
|
||||||
<span class="label label-warning">{% trans "Reserved" %}</span>
|
<span class="label label-warning">{% trans "Reserved" %}</span>
|
||||||
{% elif e.best_availability_state < 20 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% elif e.presale_is_running %}
|
{% elif e.presale_is_running %}
|
||||||
<span class="label label-success">{% trans "Book now" %}</span>
|
<span class="label label-success">{% trans "Book now" %}</span>
|
||||||
|
|||||||
@@ -17,9 +17,7 @@ from django.views.generic import ListView, TemplateView
|
|||||||
from pytz import UTC
|
from pytz import UTC
|
||||||
|
|
||||||
from pretix.base.i18n import language
|
from pretix.base.i18n import language
|
||||||
from pretix.base.models import (
|
from pretix.base.models import Event, EventMetaValue, SubEvent, SubEventMetaValue
|
||||||
Event, EventMetaValue, SubEvent, SubEventMetaValue,
|
|
||||||
)
|
|
||||||
from pretix.base.services.quotas import QuotaAvailability
|
from pretix.base.services.quotas import QuotaAvailability
|
||||||
from pretix.helpers.daterange import daterange
|
from pretix.helpers.daterange import daterange
|
||||||
from pretix.helpers.formats.de.formats import WEEK_FORMAT
|
from pretix.helpers.formats.de.formats import WEEK_FORMAT
|
||||||
|
|||||||
@@ -317,7 +317,10 @@ class WidgetAPIProductList(EventListMixin, View):
|
|||||||
availability['text'] = gettext('Reserved')
|
availability['text'] = gettext('Reserved')
|
||||||
elif ev.best_availability_state < Quota.AVAILABILITY_RESERVED:
|
elif ev.best_availability_state < Quota.AVAILABILITY_RESERVED:
|
||||||
availability['color'] = 'red'
|
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:
|
elif ev.presale_is_running:
|
||||||
availability['color'] = 'green'
|
availability['color'] = 'green'
|
||||||
availability['text'] = gettext('Book now')
|
availability['text'] = gettext('Book now')
|
||||||
|
|||||||
Reference in New Issue
Block a user