X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=qcg%2Ffields.py;h=ef5170a0a15692024a897c4680e66cff97b8cc33;hb=324c78cbef3cdc4415ab339ff3f81c9923a884e3;hp=3702aadd3306d19cdb8e2f1f6429e8c87433bdfb;hpb=c7aa0d764b0b5a6bcd7df967f317bf9fbcde8f73;p=qcg-portal.git diff --git a/qcg/fields.py b/qcg/fields.py index 3702aad..ef5170a 100644 --- a/qcg/fields.py +++ b/qcg/fields.py @@ -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")