SplitDateTimeField: Consider field empty if only a time is given

This commit is contained in:
Raphael Michel
2018-09-21 16:40:18 +02:00
parent fd317afd01
commit 5695e1d9c8
6 changed files with 41 additions and 23 deletions

View File

@@ -16,6 +16,7 @@ from pretix.base.forms.widgets import (
) )
from pretix.base.models import InvoiceAddress, Question from pretix.base.models import InvoiceAddress, Question
from pretix.base.models.tax import EU_COUNTRIES 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.helpers.i18n import get_format_without_seconds
from pretix.presale.signals import question_form_fields 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')), widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
) )
elif q.type == Question.TYPE_DATETIME: elif q.type == Question.TYPE_DATETIME:
field = forms.SplitDateTimeField( field = SplitDateTimeField(
label=q.question, required=q.required, label=q.question, required=q.required,
help_text=q.help_text, help_text=q.help_text,
initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None, initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None,

View File

@@ -1,7 +1,10 @@
import datetime
import os import os
from django import forms from django import forms
from django.conf import settings 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.html import conditional_escape
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@@ -168,3 +171,17 @@ class SingleLanguageWidget(forms.Select):
def optgroups(self, name, value, attrs=None): def optgroups(self, name, value, attrs=None):
self.modify() self.modify()
return super().optgroups(name, value, attrs) 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

View File

@@ -22,7 +22,7 @@ from pretix.base.models.event import EventMetaValue, SubEvent
from pretix.base.reldate import RelativeDateField, RelativeDateTimeField from pretix.base.reldate import RelativeDateField, RelativeDateTimeField
from pretix.control.forms import ( from pretix.control.forms import (
ExtFileField, MultipleLanguagesWidget, SingleLanguageWidget, SlugWidget, ExtFileField, MultipleLanguagesWidget, SingleLanguageWidget, SlugWidget,
SplitDateTimePickerWidget, SplitDateTimeField, SplitDateTimePickerWidget,
) )
from pretix.multidomain.urlreverse import build_absolute_uri from pretix.multidomain.urlreverse import build_absolute_uri
from pretix.plugins.banktransfer.payment import BankTransfer from pretix.plugins.banktransfer.payment import BankTransfer
@@ -95,10 +95,10 @@ class EventWizardBasicsForm(I18nModelForm):
'location', 'location',
] ]
field_classes = { field_classes = {
'date_from': forms.SplitDateTimeField, 'date_from': SplitDateTimeField,
'date_to': forms.SplitDateTimeField, 'date_to': SplitDateTimeField,
'presale_start': forms.SplitDateTimeField, 'presale_start': SplitDateTimeField,
'presale_end': forms.SplitDateTimeField, 'presale_end': SplitDateTimeField,
} }
widgets = { widgets = {
'date_from': SplitDateTimePickerWidget(), 'date_from': SplitDateTimePickerWidget(),
@@ -229,11 +229,11 @@ class EventUpdateForm(I18nModelForm):
'location', 'location',
] ]
field_classes = { field_classes = {
'date_from': forms.SplitDateTimeField, 'date_from': SplitDateTimeField,
'date_to': forms.SplitDateTimeField, 'date_to': SplitDateTimeField,
'date_admission': forms.SplitDateTimeField, 'date_admission': SplitDateTimeField,
'presale_start': forms.SplitDateTimeField, 'presale_start': SplitDateTimeField,
'presale_end': forms.SplitDateTimeField, 'presale_end': SplitDateTimeField,
} }
widgets = { widgets = {
'date_from': SplitDateTimePickerWidget(), 'date_from': SplitDateTimePickerWidget(),

View File

@@ -14,7 +14,7 @@ from pretix.base.models import (
) )
from pretix.base.models.items import ItemAddOn from pretix.base.models.items import ItemAddOn
from pretix.base.signals import item_copy_data 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.control.forms.widgets import Select2
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
from pretix.helpers.money import change_decimal_field from pretix.helpers.money import change_decimal_field
@@ -330,8 +330,8 @@ class ItemUpdateForm(I18nModelForm):
'original_price' 'original_price'
] ]
field_classes = { field_classes = {
'available_from': forms.SplitDateTimeField, 'available_from': SplitDateTimeField,
'available_until': forms.SplitDateTimeField, 'available_until': SplitDateTimeField,
} }
widgets = { widgets = {
'available_from': SplitDateTimePickerWidget(), 'available_from': SplitDateTimePickerWidget(),

View File

@@ -12,7 +12,7 @@ from pretix.base.models.event import SubEvent, SubEventMetaValue
from pretix.base.models.items import SubEventItem from pretix.base.models.items import SubEventItem
from pretix.base.reldate import RelativeDateTimeField from pretix.base.reldate import RelativeDateTimeField
from pretix.base.templatetags.money import money_filter 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 from pretix.helpers.money import change_decimal_field
@@ -37,11 +37,11 @@ class SubEventForm(I18nModelForm):
'frontpage_text' 'frontpage_text'
] ]
field_classes = { field_classes = {
'date_from': forms.SplitDateTimeField, 'date_from': SplitDateTimeField,
'date_to': forms.SplitDateTimeField, 'date_to': SplitDateTimeField,
'date_admission': forms.SplitDateTimeField, 'date_admission': SplitDateTimeField,
'presale_start': forms.SplitDateTimeField, 'presale_start': SplitDateTimeField,
'presale_end': forms.SplitDateTimeField, 'presale_end': SplitDateTimeField,
} }
widgets = { widgets = {
'date_from': SplitDateTimePickerWidget(), 'date_from': SplitDateTimePickerWidget(),

View File

@@ -6,7 +6,7 @@ from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from pretix.base.forms import I18nModelForm from pretix.base.forms import I18nModelForm
from pretix.base.models import Item, Voucher 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.forms.widgets import Select2, Select2ItemVarQuota
from pretix.control.signals import voucher_form_validation from pretix.control.signals import voucher_form_validation
from pretix.helpers.models import modelcopy from pretix.helpers.models import modelcopy
@@ -34,7 +34,7 @@ class VoucherForm(I18nModelForm):
'comment', 'max_usages', 'price_mode', 'subevent' 'comment', 'max_usages', 'price_mode', 'subevent'
] ]
field_classes = { field_classes = {
'valid_until': forms.SplitDateTimeField, 'valid_until': SplitDateTimeField,
} }
widgets = { widgets = {
'valid_until': SplitDateTimePickerWidget(), 'valid_until': SplitDateTimePickerWidget(),
@@ -190,7 +190,7 @@ class VoucherBulkForm(VoucherForm):
'max_usages', 'price_mode', 'subevent' 'max_usages', 'price_mode', 'subevent'
] ]
field_classes = { field_classes = {
'valid_until': forms.SplitDateTimeField, 'valid_until': SplitDateTimeField,
} }
widgets = { widgets = {
'valid_until': SplitDateTimePickerWidget(), 'valid_until': SplitDateTimePickerWidget(),