X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=qcg%2Ffields.py;fp=qcg%2Ffields.py;h=3e5ec44e96b82bcbecc3df0d6bc71cffc126a657;hb=9a6f1362b7cee897421fff89c53862558e6c73ca;hp=3702aadd3306d19cdb8e2f1f6429e8c87433bdfb;hpb=70dc158be4ad77257d3389f35ef14ffa26fbb88a;p=qcg-portal.git diff --git a/qcg/fields.py b/qcg/fields.py index 3702aad..3e5ec44 100644 --- a/qcg/fields.py +++ b/qcg/fields.py @@ -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")