# -*- coding: utf-8 -*- """ forms for apps/indicator """ from django import forms from django.utils.translation import ugettext as _ from indicator import models as im import sympy from sympy.core.sympify import SympifyError class IndicatorCategoryForm(forms.ModelForm): # {{{ """ form for 'models.IndicatorCategory' """ class Meta: model = im.IndicatorCategory exclude = ('addByUser',) # }}} class IndicatorForm(forms.ModelForm): # {{{ """ form for 'models.Indicator' """ class Meta: model = im.Indicator exclude = ('addByUser',) # }}} class UnitForm(forms.ModelForm): # {{{ """ form for 'models.Unit' """ class Meta: model = im.Unit exclude = ('addByUser',) def __init__(self, *args, **kwargs): super(UnitForm, self).__init__(*args, **kwargs) # store 'instance_id', for edting instance self.instance_id = self.instance.id # 'clean_standard()' cannot raise Vali dationError correctly?? # TODO: clean each field and generate errors accordingly. def clean(self): cleaned_data = super(UnitForm, self).clean() instance_id = self.instance_id standard = cleaned_data['standard'] indicator = cleaned_data['indicator'] std_unit_list = indicator.get_unit(type="standard") relation = cleaned_data.get('relation', u'') if standard: if std_unit_list and (instance_id != std_unit_list[0].id): raise forms.ValidationError(_(u'标准单位已存在'), code='standard') cleaned_data['relation'] = u'v' else: try: fsym = sympy.sympify(relation) except SympifyError: raise forms.ValidationError(_(u'"%(relation)s" 不是合法的表达式'), code='relation_invalid', params={'relation': relation}) # always return the full collection of cleaned data return cleaned_data # }}} class InnateConfineForm(forms.ModelForm): # {{{ """ form for 'models.InnateConfine' """ unit = forms.ModelChoiceField(label=u"标准单位", queryset=im.Unit.objects.filter(standard=True)) class Meta: model = im.InnateConfine exclude = ('addByUser',) def clean(self): # {{{ """ check the validity of data """ cleaned_data = super(InnateConfineForm, self).clean() indicator = cleaned_data['indicator'] unit = cleaned_data.get('unit') val_norm = cleaned_data.get('val_norm') human_max = cleaned_data.get('human_max') human_min = cleaned_data.get('human_min') math_max = cleaned_data.get('math_max') math_min = cleaned_data.get('math_min') # check data if indicator.dataType in [indicator.FLOAT_TYPE, indicator.RANGE_TYPE, indicator.FLOAT_RANGE_TYPE]: # check unit if not (unit and unit.standard): raise forms.ValidationError(_(u'unit 未填写/不是标准单位'), code='unit') if (human_max is None) or (human_min is None): raise forms.ValidationError(_(u'human_max/human_min 未填写'), code='human_empty') if (human_max <= human_min): raise forms.ValidationError(_(u'human_max <= human_min'), code='human_relation') # check 'math_max' and 'math_min' if (math_max is None) or (math_min is None): raise forms.ValidationError(_(u'math_max/math_min 未填写'), code='math_empty') if (math_max <= math_min): raise forms.ValidationError(_(u'math_max <= math_min'), code='math_relation') # compare 'human*' and 'math*' if (human_max > math_max) or (human_min < math_min): raise forms.ValidationError(_(u'Error: human_max>math_max / human_min math_max): raise forms.ValidationError(_(u'value(std) < math_min or value(std) > math_max'), code='value_std_relation') # val_max if val_max is not None: # unit conversion try: val_max_std = float(rel_sym.evalf( subs={v: val_max})) except ValueError: raise forms.ValidationError(_(u'"%s" 求值错误,请检查只有变量"v"' % unit_rel), code='val_max_evalf') if (val_max_std <= math_min) or ( val_max_std > math_max): raise forms.ValidationError(_(u'val_max(std) <= math_min or val_max(std) > math_max'), code='val_max_std_relation') # val_min if val_min is not None: try: val_min_std = float(rel_sym.evalf( subs={v: val_min})) except ValueError: raise forms.ValidationError(_(u'"%s" 求值错误,请检查只有变量"v"' % unit_rel), code='val_min_evalf') if (val_min_std < math_min) or ( val_min_std >= math_max): raise forms.ValidationError(_(u'val_min(std) < math_min or val_min(std) >= math_max'), code='val_min_std_relation') # }}} # return cleaned data return cleaned_data # }}} # }}} class RecordHistoryForm(forms.ModelForm): # {{{ """ form for 'models.RecordHistory' """ class Meta: model = im.RecordHistory exclude = ('indicatorRecord',) # }}} # vim: set ts=4 sw=4 tw=0 fenc=utf-8 ft=python.django: #