Integer, Numeric and Float allow None as value

issue2022
review245001
This commit is contained in:
Nicolas Évrard committed 2012-03-23 17:58:00 +01:00
1 parent 6dcb51a3da
commit 0d0d32c1e8
3 files changed
+48 -25

No files matched your search

+46 -23
View File
@@ -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):
@@ -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)
@@ -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)