Skip to content

Commit

Permalink
Merge pull request #1048 from Integreat/feature/events
Browse files Browse the repository at this point in the history
Add filter options to event filter, fixes #992
  • Loading branch information
JoeyStk committed Dec 4, 2021
2 parents 073a660 + 133f6c0 commit 066f188
Show file tree
Hide file tree
Showing 13 changed files with 408 additions and 271 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ UNRELEASED
----------

* Improve performance of region list
* Fix duplicating pages of deleted authors
* Fix page permissions
* Show recurrence in event list
* Only show upcoming events per default


2021.11.0-beta
Expand Down
24 changes: 24 additions & 0 deletions integreat_cms/cms/constants/events_time_range.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""
This module contains all string representations of event time range filter options, used by
:class:`~integreat_cms.cms.forms.events.event_filter_form.EventFilterForm` and
:class:`~integreat_cms.cms.views.events.event_list_view.EventListView`.
"""
from django.utils.translation import ugettext_lazy as _


#: Events in the future
UPCOMING = "UPCOMING"
#: Events in the past
PAST = "PAST"
#: Events in a custom time range
CUSTOM = "CUSTOM"

#: Choices which indicate that no filtering is required
ALL_EVENTS = [UPCOMING, PAST]

#: Choices to use these constants in a form field
CHOICES = (
(CUSTOM, _("Custom time range")),
(UPCOMING, _("Upcoming events")),
(PAST, _("Past events")),
)
26 changes: 11 additions & 15 deletions integreat_cms/cms/forms/events/event_filter_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from django import forms

from ...constants import all_day, recurrence
from ...constants import all_day, recurrence, events_time_range

logger = logging.getLogger(__name__)

Expand All @@ -31,36 +31,32 @@ class EventFilterForm(forms.Form):
required=False,
)

after_date = forms.DateField(
date_from = forms.DateField(
widget=forms.DateInput(
format="%Y-%m-%d",
attrs={"type": "date", "class": "default-value", "data-default-value": ""},
),
required=False,
)
before_date = forms.DateField(
date_to = forms.DateField(
widget=forms.DateInput(
format="%Y-%m-%d",
attrs={"type": "date", "class": "default-value", "data-default-value": ""},
),
required=False,
)

after_time = forms.TimeField(
widget=forms.TimeInput(
format="%H:%M",
attrs={"type": "time", "class": "default-value", "data-default-value": ""},
events_time_range = forms.MultipleChoiceField(
widget=forms.widgets.CheckboxSelectMultiple(
attrs={
"data-default-checked-value": events_time_range.UPCOMING,
"data-custom-time-range-value": events_time_range.CUSTOM,
}
),
choices=events_time_range.CHOICES,
initial=[events_time_range.UPCOMING],
required=False,
)
before_time = forms.TimeField(
widget=forms.TimeInput(
format="%H:%M",
attrs={"type": "time", "class": "default-value", "data-default-value": ""},
),
required=False,
)

poi_id = forms.IntegerField(widget=forms.HiddenInput, initial=-1, required=False)

query = forms.CharField(required=False)
Expand Down
59 changes: 59 additions & 0 deletions integreat_cms/cms/models/events/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from dateutil.rrule import weekday, rrule

from django.db import models
from django.db.models import Q
from django.utils.translation import get_language, ugettext_lazy as _

from ...constants import frequency, status
Expand All @@ -12,6 +13,61 @@
from .recurrence_rule import RecurrenceRule


class EventQuerySet(models.QuerySet):
"""
Custom QuerySet to facilitate the filtering by date while taking recurring events into account.
"""

def filter_upcoming(self, from_date=date.today()):
"""
Filter all events that take place after the given date. This is, per definition, if at least one of the
following conditions is true:
* The end date of the event is the given date or later
* The event is indefinitely recurring
* The event is recurring and the recurrence end date is the given date or later
:param from_date: The date which should be used for filtering, defaults to the current date
:type from_date: datetime.date
:return: The Queryset of events after the given date
:rtype: ~integreat_cms.cms.models.events.event.EventQuerySet
"""
return self.filter(
Q(end_date__gte=from_date)
| Q(
recurrence_rule__isnull=False,
recurrence_rule__recurrence_end_date__isnull=True,
)
| Q(
recurrence_rule__isnull=False,
recurrence_rule__recurrence_end_date__gte=from_date,
)
)

def filter_completed(self, to_date=date.today()):
"""
Filter all events that are not ongoing and don't have any occurrences in the future. This is, per definition, if
at least one of the following conditions is true:
* The event is non-recurring and the end date of the event is before the given date
* The event is recurring and the recurrence end date is before the given date
:param to_date: The date which should be used for filtering, defaults to the current date
:type to_date: datetime.date
:return: The Queryset of events before the given date
:rtype: ~integreat_cms.cms.models.events.event.EventQuerySet
"""
return self.filter(
Q(recurrence_rule__isnull=True, end_date__lt=to_date)
| Q(
recurrence_rule__isnull=False,
recurrence_rule__recurrence_end_date__lt=to_date,
)
)


class Event(models.Model):
"""
Data model representing an event.
Expand Down Expand Up @@ -54,6 +110,9 @@ class Event(models.Model):
)
archived = models.BooleanField(default=False, verbose_name=_("archived"))

#: The default manager
objects = EventQuerySet.as_manager()

@property
def languages(self):
"""
Expand Down
29 changes: 13 additions & 16 deletions integreat_cms/cms/templates/events/_event_filter_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,20 @@
{% get_language LANGUAGE_CODE as current_language %}
<div class="flex flex-wrap p-4 items-start">
<div class="w-1/3 pr-6">
<label>{% trans 'Date and time' %}</label>
<div class="flex flex-wrap mb-2 items-end">
<div class="w-1/2 pr-1">
<label for="after_date" class="secondary">{% trans 'Not before' %}</label>
{% render_field filter_form.after_date|add_error_class:"border-red-500" %}
</div>
<div class="w-1/2 pl-1">
{% render_field filter_form.after_time|add_error_class:"border-red-500" %}
</div>
<label>{% trans 'Time range' %}</label>
<div class="flex flex-wrap">
{% render_field filter_form.events_time_range|add_error_class:"border-red-500" %}
</div>
<div class="flex flex-wrap items-end">
<div class="w-1/2 pr-1">
<label for="before_date" class="secondary">{% trans 'Not after' %}</label>
{% render_field filter_form.before_date|add_error_class:"border-red-500" %}
</div>
<div class="w-1/2 pl-1">
{% render_field filter_form.before_time|add_error_class:"border-red-500" %}
<div id="events-custom-time-range-filter" class="hidden">
<div class="flex flex-wrap items-end">
<div class="w-1/2 pr-1">
<label for="date_from" class="secondary">{% trans 'From' %}</label>
{% render_field filter_form.date_from|add_error_class:"border-red-500" %}
</div>
<div class="w-1/2">
<label for="date_to" class="secondary">{% trans 'To' %}</label>
{% render_field filter_form.date_to|add_error_class:"border-red-500" %}
</div>
</div>
</div>
</div>
Expand Down
23 changes: 11 additions & 12 deletions integreat_cms/cms/templates/events/event_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,13 @@ <h1 class="heading">{% trans 'Events' %}</h1>
<table id="event-list" class="w-full mt-4 rounded border border-solid border-gray-200 shadow bg-white">
<thead>
<tr class="border-b border-solid border-gray-200">
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Status' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Title in' %} {{ language.translated_name }}</th>
<th class="text-sm text-left uppercase py-3 pl-4 pr-2">{% trans 'Title in' %} {{ language.translated_name }}</th>
{% get_current_language as LANGUAGE_CODE %}
{% get_language LANGUAGE_CODE as backend_language %}
{% if backend_language and backend_language != language %}
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Title in' %} {{ backend_language.translated_name }}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Title in' %} {{ backend_language.translated_name }}</th>
{% endif %}
<th class="text-sm text-left uppercase py-3 px-2">
<th class="text-sm text-left uppercase py-3">
<div class="lang-grid flags whitespace-nowrap">
{% for lang in languages %}
<a href="{% url 'events' region_slug=region.slug language_slug=lang.slug %}">
Expand All @@ -59,11 +58,12 @@ <h1 class="heading">{% trans 'Events' %}</h1>
{% endfor %}
</div>
</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Event location' %}</th>
<th class="text-sm text-left uppercase py-3">{% trans 'Recurrence' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Start' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'End' %}</th>
<th class="text-sm text-right uppercase py-3 pl-2 pr-4 min">{% trans 'Options' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Status' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Event location' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Start' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'End' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Recurrence' %}</th>
<th class="text-sm text-right uppercase py-3 pr-4 min">{% trans 'Options' %}</th>
</tr>
</thead>
<tbody>
Expand All @@ -74,12 +74,11 @@ <h1 class="heading">{% trans 'Events' %}</h1>
{% endfor %}
{% else %}
<tr>
<td></td>
<td colspan="5" class="px-2 py-3">
<td colspan="8" class="pl-4 pr-2 py-3">
{% if filter_form.has_changed %}
{% trans 'No events found with these filters.' %}
{% else %}
{% trans 'No events available yet.' %}
{% trans 'No upcoming events available.' %}
{% endif %}
</td>
</tr>
Expand Down
22 changes: 10 additions & 12 deletions integreat_cms/cms/templates/events/event_list_archived.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,11 @@ <h1 class="heading">{% trans 'Archived events' %}</h1>
<table id="event-list" class="w-full mt-4 rounded border border-solid border-gray-200 shadow bg-white">
<thead>
<tr class="border-b border-solid border-gray-200">
<th class="text-sm text-left uppercase py-3 px-2 min">{% trans 'ID' %}</th>
<th class="text-sm text-left uppercase py-3 px-2 min">{% trans 'Version' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Status' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Title in' %} {{ language.translated_name }}</th>
<th class="text-sm text-left uppercase py-3 pl-4 pr-2">{% trans 'Title in' %} {{ language.translated_name }}</th>
{% get_current_language as LANGUAGE_CODE %}
{% get_language LANGUAGE_CODE as backend_language %}
{% if backend_language and backend_language != language %}
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Title in' %} {{ backend_language.translated_name }}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Title in' %} {{ backend_language.translated_name }}</th>
{% endif %}
<th class="text-sm text-left uppercase py-3 px-2">
<div class="lang-grid flags whitespace-nowrap">
Expand All @@ -44,9 +41,11 @@ <h1 class="heading">{% trans 'Archived events' %}</h1>
{% endfor %}
</div>
</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Event location' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'Start' %}</th>
<th class="text-sm text-left uppercase py-3 px-2">{% trans 'End' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Status' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Event location' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Start' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'End' %}</th>
<th class="text-sm text-left uppercase py-3 pr-2">{% trans 'Recurrence' %}</th>
<th class="text-sm text-left uppercase py-3 pl-2 pr-4 min">{% trans 'Options' %}</th>
</tr>
</thead>
Expand All @@ -58,12 +57,11 @@ <h1 class="heading">{% trans 'Archived events' %}</h1>
{% endfor %}
{% else %}
<tr>
<td></td>
<td colspan="5" class="px-2 py-3">
<td colspan="8" class="pl-4 pr-2 py-3">
{% if filter_form.has_changed %}
{% trans 'No events found with these filters.' %}
{% trans 'No archived events found with these filters.' %}
{% else %}
{% trans 'No events archived yet.' %}
{% trans 'No upcoming events archived.' %}
{% endif %}
</td>
</tr>
Expand Down

0 comments on commit 066f188

Please sign in to comment.