Integer, Numeric and Float allow None as value
issue2022 review245001
This commit is contained in:
1 parent
6dcb51a3da
commit
0d0d32c1e8
3 files changed
+48
-25
No files matched your search
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user