From 5695e1d9c859c798cd508acc438a2275f326e91d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 21 Sep 2018 16:40:18 +0200 Subject: [PATCH] SplitDateTimeField: Consider field empty if only a time is given --- src/pretix/base/forms/questions.py | 3 ++- src/pretix/control/forms/__init__.py | 17 +++++++++++++++++ src/pretix/control/forms/event.py | 20 ++++++++++---------- src/pretix/control/forms/item.py | 6 +++--- src/pretix/control/forms/subevents.py | 12 ++++++------ src/pretix/control/forms/vouchers.py | 6 +++--- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index c2da7cc60..de4614dd3 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -16,6 +16,7 @@ from pretix.base.forms.widgets import ( ) from pretix.base.models import InvoiceAddress, Question from pretix.base.models.tax import EU_COUNTRIES +from pretix.control.forms import SplitDateTimeField from pretix.helpers.i18n import get_format_without_seconds from pretix.presale.signals import question_form_fields @@ -143,7 +144,7 @@ class BaseQuestionsForm(forms.Form): widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')), ) elif q.type == Question.TYPE_DATETIME: - field = forms.SplitDateTimeField( + field = SplitDateTimeField( label=q.question, required=q.required, help_text=q.help_text, initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None, diff --git a/src/pretix/control/forms/__init__.py b/src/pretix/control/forms/__init__.py index 6d1bc762f..34e86e49e 100644 --- a/src/pretix/control/forms/__init__.py +++ b/src/pretix/control/forms/__init__.py @@ -1,7 +1,10 @@ +import datetime import os from django import forms from django.conf import settings +from django.core.exceptions import ValidationError +from django.forms.utils import from_current_timezone from django.utils.html import conditional_escape from django.utils.translation import ugettext_lazy as _ @@ -168,3 +171,17 @@ class SingleLanguageWidget(forms.Select): def optgroups(self, name, value, attrs=None): self.modify() return super().optgroups(name, value, attrs) + + +class SplitDateTimeField(forms.SplitDateTimeField): + + def compress(self, data_list): + # Differs from the default implementation: If only a time is given and no date, we consider the field empty + if data_list: + if data_list[0] in self.empty_values: + return None + if data_list[1] in self.empty_values: + raise ValidationError(self.error_messages['invalid_date'], code='invalid_date') + result = datetime.datetime.combine(*data_list) + return from_current_timezone(result) + return None diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index c3d21aa6e..e31dcd714 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -22,7 +22,7 @@ from pretix.base.models.event import EventMetaValue, SubEvent from pretix.base.reldate import RelativeDateField, RelativeDateTimeField from pretix.control.forms import ( ExtFileField, MultipleLanguagesWidget, SingleLanguageWidget, SlugWidget, - SplitDateTimePickerWidget, + SplitDateTimeField, SplitDateTimePickerWidget, ) from pretix.multidomain.urlreverse import build_absolute_uri from pretix.plugins.banktransfer.payment import BankTransfer @@ -95,10 +95,10 @@ class EventWizardBasicsForm(I18nModelForm): 'location', ] field_classes = { - 'date_from': forms.SplitDateTimeField, - 'date_to': forms.SplitDateTimeField, - 'presale_start': forms.SplitDateTimeField, - 'presale_end': forms.SplitDateTimeField, + 'date_from': SplitDateTimeField, + 'date_to': SplitDateTimeField, + 'presale_start': SplitDateTimeField, + 'presale_end': SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), @@ -229,11 +229,11 @@ class EventUpdateForm(I18nModelForm): 'location', ] field_classes = { - 'date_from': forms.SplitDateTimeField, - 'date_to': forms.SplitDateTimeField, - 'date_admission': forms.SplitDateTimeField, - 'presale_start': forms.SplitDateTimeField, - 'presale_end': forms.SplitDateTimeField, + 'date_from': SplitDateTimeField, + 'date_to': SplitDateTimeField, + 'date_admission': SplitDateTimeField, + 'presale_start': SplitDateTimeField, + 'presale_end': SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index e636b0e62..61049a345 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -14,7 +14,7 @@ from pretix.base.models import ( ) from pretix.base.models.items import ItemAddOn from pretix.base.signals import item_copy_data -from pretix.control.forms import SplitDateTimePickerWidget +from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget from pretix.control.forms.widgets import Select2 from pretix.helpers.models import modelcopy from pretix.helpers.money import change_decimal_field @@ -330,8 +330,8 @@ class ItemUpdateForm(I18nModelForm): 'original_price' ] field_classes = { - 'available_from': forms.SplitDateTimeField, - 'available_until': forms.SplitDateTimeField, + 'available_from': SplitDateTimeField, + 'available_until': SplitDateTimeField, } widgets = { 'available_from': SplitDateTimePickerWidget(), diff --git a/src/pretix/control/forms/subevents.py b/src/pretix/control/forms/subevents.py index f933e0c4d..178d4f02c 100644 --- a/src/pretix/control/forms/subevents.py +++ b/src/pretix/control/forms/subevents.py @@ -12,7 +12,7 @@ from pretix.base.models.event import SubEvent, SubEventMetaValue from pretix.base.models.items import SubEventItem from pretix.base.reldate import RelativeDateTimeField from pretix.base.templatetags.money import money_filter -from pretix.control.forms import SplitDateTimePickerWidget +from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget from pretix.helpers.money import change_decimal_field @@ -37,11 +37,11 @@ class SubEventForm(I18nModelForm): 'frontpage_text' ] field_classes = { - 'date_from': forms.SplitDateTimeField, - 'date_to': forms.SplitDateTimeField, - 'date_admission': forms.SplitDateTimeField, - 'presale_start': forms.SplitDateTimeField, - 'presale_end': forms.SplitDateTimeField, + 'date_from': SplitDateTimeField, + 'date_to': SplitDateTimeField, + 'date_admission': SplitDateTimeField, + 'presale_start': SplitDateTimeField, + 'presale_end': SplitDateTimeField, } widgets = { 'date_from': SplitDateTimePickerWidget(), diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 48bd1cb65..3a7c9dcf8 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -6,7 +6,7 @@ from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from pretix.base.forms import I18nModelForm from pretix.base.models import Item, Voucher -from pretix.control.forms import SplitDateTimePickerWidget +from pretix.control.forms import SplitDateTimeField, SplitDateTimePickerWidget from pretix.control.forms.widgets import Select2, Select2ItemVarQuota from pretix.control.signals import voucher_form_validation from pretix.helpers.models import modelcopy @@ -34,7 +34,7 @@ class VoucherForm(I18nModelForm): 'comment', 'max_usages', 'price_mode', 'subevent' ] field_classes = { - 'valid_until': forms.SplitDateTimeField, + 'valid_until': SplitDateTimeField, } widgets = { 'valid_until': SplitDateTimePickerWidget(), @@ -190,7 +190,7 @@ class VoucherBulkForm(VoucherForm): 'max_usages', 'price_mode', 'subevent' ] field_classes = { - 'valid_until': forms.SplitDateTimeField, + 'valid_until': SplitDateTimeField, } widgets = { 'valid_until': SplitDateTimePickerWidget(),