diff --git a/helios/fields.py b/helios/fields.py index 676a50608dd0ab80bc8e6ed8ff4407ebcf90e1a5..cf2ad6c3e7c2c6b506c0080b432f6207f4e37807 100644 --- a/helios/fields.py +++ b/helios/fields.py @@ -24,7 +24,7 @@ class SplitDateTimeField(fields.MultiValueField): """ if data_list: if not (data_list[0] and data_list[1]): - raise forms.ValidationError("Field is missing data.") + return None return datetime.datetime.combine(*data_list) return None diff --git a/helios/forms.py b/helios/forms.py index ab6ce423d2990beed49c53ddb5688bc53e10b140..8851d665bce7961b9e5673aa82ebad88debc6e54 100644 --- a/helios/forms.py +++ b/helios/forms.py @@ -23,13 +23,11 @@ class ElectionForm(forms.Form): if settings.ALLOW_ELECTION_INFO_URL: election_info_url = forms.CharField(required=False, initial="", label="Election Info Download URL", help_text="the URL of a PDF document that contains extra election information, e.g. candidate bios and statements") - -class ElectionTimesForm(forms.Form): # times voting_starts_at = SplitDateTimeField(help_text = 'UTC date and time when voting begins', - widget=SplitSelectDateTimeWidget) + widget=SplitSelectDateTimeWidget, required=False) voting_ends_at = SplitDateTimeField(help_text = 'UTC date and time when voting ends', - widget=SplitSelectDateTimeWidget) + widget=SplitSelectDateTimeWidget, required=False) class EmailVotersForm(forms.Form): diff --git a/helios/widgets.py b/helios/widgets.py index ac28d9dd3f5f8aeab7074f35d83ec09f1dc2bc18..7eff891c13b6601a9bd77c78185e25415463a094 100644 --- a/helios/widgets.py +++ b/helios/widgets.py @@ -157,8 +157,8 @@ class SelectTimeWidget(Widget): elif meridiem.lower().startswith('a') and int(h) == 12: h = 0 - if (int(h) == 0 or h) and m and s: - return '%s:%s:%s' % (h, m, s) + if (int(h) == 0 or h) and m: + return '%s:%s' % (h, m) return data.get(name, None) @@ -174,6 +174,12 @@ class SplitSelectDateTimeWidget(MultiWidget): widgets = (SelectDateWidget(attrs=attrs, years=years), SelectTimeWidget(attrs=attrs, hour_step=hour_step, minute_step=minute_step, twelve_hr=twelve_hr)) super(SplitSelectDateTimeWidget, self).__init__(widgets, attrs) + # See https://stackoverflow.com/questions/4324676/django-multiwidget-subclass-not-calling-decompress + def value_from_datadict(self, data, files, name): + if data.get(name, None) is None: + return [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)] + return self.decompress(data.get(name, None)) + def decompress(self, value): if value: return [value.date(), value.time().replace(microsecond=0)]