filter on future events when fetching for home page / event index
This commit is contained in:
@ -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)
|
||||
|
Reference in New Issue
Block a user