time range form field
[qcg-portal.git] / qcg / fields.py
index 3702aad..3e5ec44 100644 (file)
@@ -1,11 +1,65 @@
-from django.forms import ChoiceField, MultipleChoiceField
+# coding=utf-8
+from datetime import timedelta
+from django import forms
+from django.core.exceptions import ValidationError
 
 
-class PredefinedChoiceField(ChoiceField):
+class PredefinedChoiceField(forms.ChoiceField):
     def valid_value(self, value):
         # any value is valid
         return True
 
 
-class MultiplePredefinedChoiceField(MultipleChoiceField, PredefinedChoiceField):
+class MultiplePredefinedChoiceField(forms.MultipleChoiceField, PredefinedChoiceField):
     pass
+
+
+class TimeRangeWidget(forms.MultiWidget):
+    def decompress(self, value):
+        if not value:
+            return [0, TimeRangeField.SECONDS]
+
+        seconds = value.seconds + 86400 * value.days
+
+        if seconds % 60 != 0:
+            return [seconds, TimeRangeField.SECONDS]
+        elif seconds % 3600 != 0:
+            return [seconds / 60, TimeRangeField.MINUTES]
+        elif seconds % 86400 != 0:
+            return [seconds / 3600, TimeRangeField.HOURS]
+        else:
+            return [seconds / 86400, TimeRangeField.DAYS]
+
+
+class TimeRangeField(forms.MultiValueField):
+    SECONDS, MINUTES, HOURS, DAYS = range(4)
+    UNIT_CHOICES = (
+        (SECONDS, u"Sekund"),
+        (MINUTES, u"Minut"),
+        (HOURS, u"Godzin"),
+        (DAYS, u"Dni"),
+    )
+
+    value = forms.IntegerField(min_value=0)
+    unit = forms.ChoiceField(choices=UNIT_CHOICES)
+
+    widget = TimeRangeWidget(widgets=(value.widget, unit.widget))
+
+    def __init__(self, *args, **kwargs):
+        super(TimeRangeField, self).__init__((self.value, self.unit), *args, **kwargs)
+
+    def compress(self, data_list):
+        try:
+            unit = int(data_list[1])
+            if unit == self.SECONDS:
+                return timedelta(seconds=data_list[0])
+            elif unit == self.MINUTES:
+                return timedelta(minutes=data_list[0])
+            elif unit == self.HOURS:
+                return timedelta(hours=data_list[0])
+            elif unit == self.DAYS:
+                return timedelta(days=data_list[0])
+            else:
+                raise ValidationError(u"NieprawidÅ‚owa jednostka")
+        except ValueError:
+            raise ValidationError(u"NieprawidÅ‚owa jednostka")