2 from datetime import timedelta
3 from django import forms
4 from django.core.exceptions import ValidationError
7 class PredefinedChoiceField(forms.ChoiceField):
8 def valid_value(self, value):
13 class MultiplePredefinedChoiceField(forms.MultipleChoiceField, PredefinedChoiceField):
17 class TimeRangeWidget(forms.MultiWidget):
18 def decompress(self, value):
20 return [0, TimeRangeField.SECONDS]
22 seconds = value.seconds + 86400 * value.days
25 return [seconds, TimeRangeField.SECONDS]
26 elif seconds % 3600 != 0:
27 return [seconds / 60, TimeRangeField.MINUTES]
28 elif seconds % 86400 != 0:
29 return [seconds / 3600, TimeRangeField.HOURS]
31 return [seconds / 86400, TimeRangeField.DAYS]
34 class TimeRangeField(forms.MultiValueField):
35 SECONDS, MINUTES, HOURS, DAYS = range(4)
43 value = forms.IntegerField(min_value=0)
44 unit = forms.ChoiceField(choices=UNIT_CHOICES)
46 widget = TimeRangeWidget(widgets=(value.widget, unit.widget))
48 def __init__(self, *args, **kwargs):
49 super(TimeRangeField, self).__init__((self.value, self.unit), *args, **kwargs)
51 def compress(self, data_list):
53 unit = int(data_list[1])
54 if unit == self.SECONDS:
55 return timedelta(seconds=data_list[0])
56 elif unit == self.MINUTES:
57 return timedelta(minutes=data_list[0])
58 elif unit == self.HOURS:
59 return timedelta(hours=data_list[0])
60 elif unit == self.DAYS:
61 return timedelta(days=data_list[0])
63 raise ValidationError(u"Nieprawidłowa jednostka")
65 raise ValidationError(u"Nieprawidłowa jednostka")