Allow to filter subevents by date

This commit is contained in:
Raphael Michel
2019-01-02 16:59:03 +01:00
parent 01a6861453
commit 82e3359b40
2 changed files with 32 additions and 3 deletions

View File

@@ -1,11 +1,14 @@
from datetime import datetime, time
from django import forms
from django.apps import apps
from django.db.models import Exists, F, OuterRef, Q
from django.db.models.functions import Coalesce, ExtractWeekDay
from django.urls import reverse, reverse_lazy
from django.utils.timezone import now
from django.utils.timezone import get_current_timezone, make_aware, now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from pretix.base.forms.widgets import DatePickerWidget
from pretix.base.models import (
Checkin, Event, Invoice, Item, Order, OrderPayment, OrderPosition,
OrderRefund, Organizer, Question, QuestionAnswer, SubEvent,
@@ -355,6 +358,11 @@ class SubEventFilterForm(FilterForm):
),
required=False
)
date = forms.DateField(
label=_('Date'),
required=False,
widget=DatePickerWidget
)
weekday = forms.ChoiceField(
label=_('Weekday'),
choices=(
@@ -378,6 +386,10 @@ class SubEventFilterForm(FilterForm):
required=False
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['date'].widget = DatePickerWidget()
def filter_qs(self, qs):
fdata = self.cleaned_data
@@ -407,6 +419,20 @@ class SubEventFilterForm(FilterForm):
Q(name__icontains=i18ncomp(query)) | Q(location__icontains=query)
)
if fdata.get('date'):
date_start = make_aware(datetime.combine(
fdata.get('date'),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
date_end = make_aware(datetime.combine(
fdata.get('date'),
time(hour=23, minute=59, second=59, microsecond=999999)
), get_current_timezone())
qs = qs.filter(
Q(date_to__isnull=True, date_from__gte=date_start, date_from__lte=date_end) |
Q(date_to__isnull=False, date_from__lte=date_end, date_to__gte=date_start)
)
if fdata.get('ordering'):
qs = qs.order_by(self.get_order_by())

View File

@@ -22,13 +22,16 @@
</div>
{% else %}
<form class="row filter-form" action="" method="get">
<div class="col-md-4 col-sm-6 col-xs-12">
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.query layout='inline' %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.status layout='inline' %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="col-md-2 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.date layout='inline' %}
</div>
<div class="col-md-2 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.weekday layout='inline' %}
</div>
<div class="col-md-2 col-sm-6 col-xs-12">