tweaks to TimeRangeField
authorMaciej Tronowski <mtro@man.poznan.pl>
Wed, 4 Mar 2015 10:35:33 +0000 (11:35 +0100)
committerMaciej Tronowski <mtro@man.poznan.pl>
Wed, 4 Mar 2015 10:35:33 +0000 (11:35 +0100)
qcg/fields.py
qcg/forms.py
qcg/static/qcg/main.css
qcg/templates/qcg/job_new.html

index e067f46..73b46f4 100644 (file)
@@ -7,9 +7,9 @@ from django.core.exceptions import ValidationError
 class TimeRangeWidget(forms.MultiWidget):
     def decompress(self, value):
         if not value:
-            return [0, TimeRangeField.SECONDS]
+            return [None, None]
 
-        seconds = value.seconds + 86400 * value.days
+        seconds = value.total_seconds()
 
         if seconds % 60 != 0:
             return [seconds, TimeRangeField.SECONDS]
@@ -31,7 +31,7 @@ class TimeRangeField(forms.MultiValueField):
     )
 
     value = forms.IntegerField(min_value=0)
-    unit = forms.ChoiceField(choices=UNIT_CHOICES)
+    unit = forms.TypedChoiceField(choices=UNIT_CHOICES, coerce=int)
 
     widget = TimeRangeWidget(widgets=(value.widget, unit.widget))
 
@@ -39,17 +39,18 @@ class TimeRangeField(forms.MultiValueField):
         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")
+        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")
index b2ad790..7d53c7c 100644 (file)
@@ -121,7 +121,7 @@ class JobDescriptionForm(forms.Form):
     queue = forms.ChoiceField(choices=QUEUE_CHOICES, label=u"Kolejka", required=False)
     procs = forms.IntegerField(label=u"Liczba procesów", min_value=0, required=False)
     nodes = forms.CharField(label=u"Topologia węzłów", max_length=10, validators=[nodes_validator], required=False)
-    wall_time = forms.IntegerField(label=u"Wall time (s)", min_value=0, required=False)  # TODO duration field
+    wall_time = TimeRangeField(label=u"Wall time", required=False)
     memory = forms.IntegerField(label=u"Pamięć (MB)", min_value=0, required=False)
     memory_per_slot = forms.IntegerField(label=u"Pamięci per proces (MB)", min_value=0, required=False)
     modules = forms.MultipleChoiceField(label=u"Moduły", choices=MODULES_CHOICES, required=False)  # TODO choices
index b3bdc3b..f3ee656 100644 (file)
@@ -53,3 +53,16 @@ textarea {
 #add-env-form {
     padding-top: 7px;
 }
+
+
+.timerange input {
+    display: inline-block;
+    width: 67%;
+    margin-right: 5px;
+}
+
+.timerange select {
+    display: inline-block;
+    width: 30%;
+    float: right;
+}
index d5b7344..f2f55c2 100644 (file)
                 {% bootstrap_field form.modules layout="horizontal" form_group_class="form-group collapse" %}
                 {% bootstrap_field form.procs layout="horizontal" %}
                 {% bootstrap_field form.nodes layout="horizontal" form_group_class="form-group collapse" %}
-                {% include 'qcg/time_range_field.html' with field_name='wall_time' field=form.wall_time %}
+                {% bootstrap_field form.wall_time layout="horizontal" form_group_class="form-group timerange" %}
                 {% bootstrap_field form.memory layout="horizontal" form_group_class="form-group collapse" %}
                 {% bootstrap_field form.memory_per_slot layout="horizontal" form_group_class="form-group collapse" %}
                 {% bootstrap_field form.reservation layout="horizontal" form_group_class="form-group collapse" %}