Reviewers: ,
Please review this at http://codereview.tryton.org/235001/ Affected files: M tryton/gui/window/view_form/model/field.py Index: tryton/gui/window/view_form/model/field.py =================================================================== --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -30,6 +30,8 @@ class CharField(object): + _default = '' + def __init__(self, attrs): self.attrs = attrs self.name = attrs['name'] @@ -129,7 +131,7 @@ return True def get(self, record, check_load=True, readonly=True, modified=False): - return record.value.get(self.name) + return record.value.get(self.name) or self._default def get_eval(self, record, check_load=True): return self.get(record, check_load=check_load, readonly=True, @@ -153,7 +155,7 @@ record.signal('record-changed') def get_client(self, record): - return record.value.get(self.name) or '' + return record.value.get(self.name) or self._default def set_default(self, record, value, modified=False): res = self.set(record, value, modified=modified) @@ -197,12 +199,16 @@ class SelectionField(CharField): + _default = None + def get_client(self, record): return record.value.get(self.name) class DateTimeField(CharField): + _default = None + def set_client(self, record, value, force_change=False): if not isinstance(value, datetime.datetime): try: @@ -210,7 +216,7 @@ date_format() + ' ' + HM_FORMAT)[:6]) value = common.timezoned_date(value) except ValueError: - value = None + value = self._default super(DateTimeField, self).set_client(record, value, force_change=force_change) @@ -224,13 +230,15 @@ class DateField(CharField): + _default = None + def set_client(self, record, value, force_change=False): if not isinstance(value, datetime.date): try: value = datetime.date(*time.strptime(value, date_format())[:3]) except ValueError: - value = None + value = self._default super(DateField, self).set_client(record, value, force_change=force_change) @@ -243,54 +251,63 @@ class FloatField(CharField): + _default = 0.0 + def set_client(self, record, value, force_change=False): if isinstance(value, basestring): try: value = locale.atof(value) except ValueError: - value = 0.0 + value = self._default super(FloatField, self).set_client(record, value, force_change=force_change) def get_client(self, record): - value = super(FloatField, self).get_client(record) or 0.0 + value = super(FloatField, self).get_client(record) digits = record.expr_eval(self.attrs.get('digits', (16, 2))) return locale.format('%.' + str(digits[1]) + 'f', value, True) class NumericField(CharField): + _default = Decimal(0) + def set_client(self, record, value, force_change=False): - value = Decimal(str(value)) + if isinstance(value, basestring): + try: + value = Decimal(str(value)) + except ValueError: + value = self._default super(NumericField, self).set_client(record, value, force_change=force_change) def get_client(self, record): - value = super(NumericField, self).get_client(record) or 0.0 + value = super(NumericField, self).get_client(record) digits = record.expr_eval(self.attrs.get('digits', (16, 2))) return locale.format('%.' + str(digits[1]) + 'f', value, True) class IntegerField(CharField): - def get(self, record, check_load=True, readonly=True, modified=False): - return record.value.get(self.name) or 0 + _default = 0 def set_client(self, record, value): if isinstance(value, basestring): try: value = locale.atoi(value) except ValueError: - value = 0 + value = self._default super(IntegerField, self).set_client(record, value) def get_client(self, record): - value = super(IntegerField, self).get_client(record) or 0 + value = super(IntegerField, self).get_client(record) return locale.format('%d', value, True) class BooleanField(CharField): + _default = False + def set_client(self, record, value, force_change=False): value = bool(value) super(BooleanField, self).set_client(record, value, @@ -308,6 +325,8 @@ internal = (id, name) ''' + _default = None + def get(self, record, check_load=True, readonly=True, modified=False): value = record.value.get(self.name) if (record.parent_name == self.name @@ -399,6 +418,8 @@ internal = Group of the related objects ''' + _default = None + def __init__(self, attrs): super(O2MField, self).__init__(attrs) self.in_on_change = False @@ -725,6 +746,8 @@ class ReferenceField(CharField): + _default = None + def get_client(self, record): if record.value.get(self.name): model, _ = record.value[self.name] @@ -748,7 +771,7 @@ def set(self, record, value, modified=False): if not value: - record.value[self.name] = None + record.value[self.name] = self._default return if isinstance(value, basestring): ref_model, ref_id = value.split(',') @@ -781,8 +804,10 @@ class BinaryField(CharField): + _default = None + def get(self, record, check_load=True, readonly=True, modified=False): - result = record.value.get(self.name) + result = record.value.get(self.name) or self._default if isinstance(result, basestring): try: with open(result, 'rb') as fp: -- [email protected] mailing list
