diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 63a4d16346..7276c6408f 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -10,6 +10,7 @@ from tryton.common import datetime_strftime, HM_FORMAT, \ import tryton.common as common import time import datetime +import decimal from decimal import Decimal from tryton.exceptions import TrytonServerError from tryton.translate import date_format @@ -77,6 +78,14 @@ class CharField(object): check_load=check_load)) return context + def check_required(self, record): + state_attrs = self.get_state_attrs(record) + if bool(int(state_attrs.get('required') or 0)): + if (not self.get(record) + and not bool(int(state_attrs.get('readonly') or 0))): + return False + return True + def validate(self, record, softvalidation=False): if self.attrs.get('readonly'): return True @@ -84,11 +93,7 @@ class CharField(object): self.get_state_attrs(record)['domain_readonly'] = False inverted_domain, domain = self.validation_domains(record) if not softvalidation: - if bool(int(self.get_state_attrs(record).get('required') or 0)): - if not self.get(record) \ - and not bool(int(self.get_state_attrs(record - ).get('readonly') or 0)): - res = False + res = res and self.check_required(record) if isinstance(domain, bool): res = res and domain elif domain == [('id', '=', False)]: @@ -267,9 +272,22 @@ class TimeField(CharField): return '' -class FloatField(CharField): +class NumberField(CharField): + _default = None - _default = 0.0 + def check_required(self, record): + state_attrs = self.get_state_attrs(record) + if bool(int(state_attrs.get('required') or 0)): + if (self.get(record) is None + and not bool(int(state_attrs.get('readonly') or 0))): + return False + return True + + def get(self, record, check_load=True, readonly=True, modified=False): + return record.value.get(self.name, self._default) + + +class FloatField(NumberField): def set_client(self, record, value, force_change=False): if isinstance(value, basestring): @@ -281,33 +299,35 @@ class FloatField(CharField): force_change=force_change) def get_client(self, record): - 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) + value = record.value.get(self.name) + if value is not None: + digits = record.expr_eval(self.attrs.get('digits', (16, 2))) + return locale.format('%.' + str(digits[1]) + 'f', value, True) + else: + return '' -class NumericField(CharField): - - _default = Decimal(0) +class NumericField(NumberField): def set_client(self, record, value, force_change=False): if isinstance(value, basestring): try: - value = Decimal(str(locale.atof(value, Decimal))) - except ValueError: + value = locale.atof(value, Decimal) + except decimal.InvalidOperation: 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) - digits = record.expr_eval(self.attrs.get('digits', (16, 2))) - return locale.format('%.' + str(digits[1]) + 'f', value, True) + value = record.value.get(self.name) + if value is not None: + digits = record.expr_eval(self.attrs.get('digits', (16, 2))) + return locale.format('%.' + str(digits[1]) + 'f', value, True) + else: + return '' -class IntegerField(CharField): - - _default = 0 +class IntegerField(NumberField): def set_client(self, record, value): if isinstance(value, basestring): @@ -318,8 +338,11 @@ class IntegerField(CharField): super(IntegerField, self).set_client(record, value) def get_client(self, record): - value = super(IntegerField, self).get_client(record) - return locale.format('%d', value, True) + value = record.value.get(self.name) + if value is not None: + return locale.format('%d', value, True) + else: + return '' class BooleanField(CharField): diff --git a/tryton/gui/window/view_form/view/form_gtk/float.py b/tryton/gui/window/view_form/view/form_gtk/float.py index 24cab67de2..82b25efa1e 100644 --- a/tryton/gui/window/view_form/view/form_gtk/float.py +++ b/tryton/gui/window/view_form/view/form_gtk/float.py @@ -11,7 +11,7 @@ class Float(Integer): def __init__(self, field_name, model_name, attrs=None): super(Float, self).__init__(field_name, model_name, attrs=attrs) self.digits = (16, 2) - self._default_value = 0.0 + self._default_value = '' self.entry.set_width_chars(sum(self.digits)) self.entry.connect('key-press-event', self.key_press_event) diff --git a/tryton/gui/window/view_form/view/form_gtk/integer.py b/tryton/gui/window/view_form/view/form_gtk/integer.py index 6ea1df7b4a..522a642bad 100644 --- a/tryton/gui/window/view_form/view/form_gtk/integer.py +++ b/tryton/gui/window/view_form/view/form_gtk/integer.py @@ -9,7 +9,7 @@ class Integer(Char): def __init__(self, field_name, model_name, attrs=None): super(Integer, self).__init__(field_name, model_name, attrs=attrs) - self._default_value = 0 + self._default_value = '' self.entry.set_width_chars(8) _, _, padding, pack_type = self.widget.query_child_packing( self.entry)