filter on future events when fetching for home page / event index

This commit is contained in:
2024-05-20 22:00:02 +02:00
parent 10227ff8e3
commit 856f39bb58
6 changed files with 83 additions and 43 deletions

View File

@ -1,7 +1,9 @@
from django import forms
from django.db import models
from django.db.models import Min, Q
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from grapple.helpers import register_query_field
from grapple.helpers import register_query_field, register_singular_query_field
from grapple.models import (
GraphQLBoolean,
GraphQLCollection,
@ -25,17 +27,31 @@ from wagtail.admin.panels import (
)
from wagtail.fields import StreamField
from wagtail.images.blocks import ImageChooserBlock
from wagtail.models import Orderable, Page
from wagtail.models import Orderable, Page, PageManager, PageQuerySet
from wagtail.snippets.models import register_snippet
from venues.models import VenuePage
@register_singular_query_field("eventIndex")
class EventIndex(Page):
# there can only be one event index page
max_count = 1
subpage_types = ["events.EventPage"]
def future_events(self, info, **kwargs):
return EventPage.objects.future().order_by("next_occurrence")
graphql_fields = [
GraphQLCollection(
GraphQLForeignKey,
"future_events",
"events.EventPage",
required=True,
item_required=True,
is_queryset=True,
),
]
@register_snippet
@register_query_field("eventCategory", "eventCategories")
@ -108,23 +124,22 @@ class EventOrganizer(ClusterableModel):
return self.name
class EventPageQuerySet(PageQuerySet):
def future(self):
today = timezone.localtime(timezone.now()).date()
next_occurrence = Min("occurrences__start", filter=Q(occurrences__start__gte=today))
return self.filter(occurrences__start__gte=today).annotate(next_occurrence=next_occurrence)
EventPageManager = PageManager.from_queryset(EventPageQuerySet)
class EventPage(Page):
# no children
subpage_types = []
parent_page_types = ["events.EventIndex"]
# should not be able to be shown in menus
show_in_menus = False
# inherited from Page:
# title = text
# slug = text (in promote panel)
# content_type = points to this model
# live = bool
# owner = page creator
# first_published_at = datetime
# last_published_at = datetime
# seo_title: text (in promote panel)
# search_description: text (in promote panel)
objects = EventPageManager()
featured_image = models.ForeignKey(
"images.CustomImage",
@ -167,8 +182,6 @@ class EventPage(Page):
help_text="Lenke direkte til arrangementet på Facebook",
)
# "event_organizers": [390, 322],
price_regular = models.IntegerField(null=True, blank=True)
price_student = models.IntegerField(null=True, blank=True)
price_member = models.IntegerField(null=True, blank=True)