Merge remote-tracking branch 'origin/master'
[qcg-portal.git] / qcg / fields.py
1 # coding=utf-8
2 from datetime import timedelta
3 from django import forms
4 from django.core.exceptions import ValidationError
5
6
7 class TimeRangeWidget(forms.MultiWidget):
8     def decompress(self, value):
9         if not value:
10             return [0, TimeRangeField.SECONDS]
11
12         seconds = value.seconds + 86400 * value.days
13
14         if seconds % 60 != 0:
15             return [seconds, TimeRangeField.SECONDS]
16         elif seconds % 3600 != 0:
17             return [seconds / 60, TimeRangeField.MINUTES]
18         elif seconds % 86400 != 0:
19             return [seconds / 3600, TimeRangeField.HOURS]
20         else:
21             return [seconds / 86400, TimeRangeField.DAYS]
22
23
24 class TimeRangeField(forms.MultiValueField):
25     SECONDS, MINUTES, HOURS, DAYS = range(4)
26     UNIT_CHOICES = (
27         (SECONDS, u"Sekund"),
28         (MINUTES, u"Minut"),
29         (HOURS, u"Godzin"),
30         (DAYS, u"Dni"),
31     )
32
33     value = forms.IntegerField(min_value=0)
34     unit = forms.ChoiceField(choices=UNIT_CHOICES)
35
36     widget = TimeRangeWidget(widgets=(value.widget, unit.widget))
37
38     def __init__(self, *args, **kwargs):
39         super(TimeRangeField, self).__init__((self.value, self.unit), *args, **kwargs)
40
41     def compress(self, data_list):
42         try:
43             unit = int(data_list[1])
44             if unit == self.SECONDS:
45                 return timedelta(seconds=data_list[0])
46             elif unit == self.MINUTES:
47                 return timedelta(minutes=data_list[0])
48             elif unit == self.HOURS:
49                 return timedelta(hours=data_list[0])
50             elif unit == self.DAYS:
51                 return timedelta(days=data_list[0])
52             else:
53                 raise ValidationError(u"NieprawidÅ‚owa jednostka")
54         except ValueError:
55             raise ValidationError(u"NieprawidÅ‚owa jednostka")