added basic MREMD form fields
[qcg-portal.git] / qcg / fields.py
index 3702aad..ef5170a 100644 (file)
@@ -1,11 +1,56 @@
-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):
-    def valid_value(self, value):
-        # any value is valid
-        return True
+class TimeRangeWidget(forms.MultiWidget):
+    def decompress(self, value):
+        if not value:
+            return [None, None]
 
+        seconds = int(value.total_seconds())
 
-class MultiplePredefinedChoiceField(MultipleChoiceField, PredefinedChoiceField):
-    pass
+        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.TypedChoiceField(choices=UNIT_CHOICES, coerce=int)
+
+    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):
+        value, unit = data_list
+
+        if value is None:
+            return None
+
+        if unit == self.SECONDS:
+            return timedelta(seconds=value)
+        elif unit == self.MINUTES:
+            return timedelta(minutes=value)
+        elif unit == self.HOURS:
+            return timedelta(hours=value)
+        elif unit == self.DAYS:
+            return timedelta(days=value)
+
+        raise ValidationError(u"NieprawidÅ‚owa jednostka")