Reviewers: ,
Please review this at http://codereview.tryton.org/245001/
Affected files:
M tryton/gui/window/view_form/model/field.py
M tryton/gui/window/view_form/view/form_gtk/float.py
M tryton/gui/window/view_form/view/form_gtk/integer.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
@@ -10,7 +10,7 @@
import tryton.common as common
import time
import datetime
-from decimal import Decimal
+import decimal
from tryton.exceptions import TrytonServerError
from tryton.translate import date_format
@@ -77,6 +77,14 @@
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 +92,7 @@
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)]:
@@ -269,7 +273,15 @@
class FloatField(CharField):
- _default = 0.0
+ _default = None
+
+ 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 set_client(self, record, value, force_change=False):
if isinstance(value, basestring):
@@ -281,33 +293,63 @@
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 = [d if d is not None else 0
+ for d in record.expr_eval(self.attrs.get('digits', (16,
2)))]
+ return locale.format('%.' + str(digits[1]) + 'f', value, True)
+ else:
+ return ''
+
+ def get(self, record, check_load=True, readonly=True, modified=False):
+ return record.value.get(self.name)
class NumericField(CharField):
- _default = Decimal(0)
+ _default = None
+
+ 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 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.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 = [d if d is not None else 0
+ for d in record.expr_eval(self.attrs.get('digits', (16,
2)))]
+ return locale.format('%.' + str(digits[1]) + 'f', value, True)
+ else:
+ return ''
+
+ def get(self, record, check_load=True, readonly=True, modified=False):
+ return record.value.get(self.name)
class IntegerField(CharField):
- _default = 0
+ _default = None
+
+ 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 set_client(self, record, value):
if isinstance(value, basestring):
@@ -318,8 +360,14 @@
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 ''
+
+ def get(self, record, check_load=True, readonly=True, modified=False):
+ return record.value.get(self.name)
class BooleanField(CharField):
Index: tryton/gui/window/view_form/view/form_gtk/float.py
===================================================================
--- 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 @@
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 = None
self.entry.set_width_chars(sum(self.digits))
self.entry.connect('key-press-event', self.key_press_event)
@@ -25,7 +25,7 @@
return False
self.digits = field.attrs.get('digits', (16, 2))
digits = record.expr_eval(self.digits)
- self.entry.set_width_chars(sum(digits))
+ self.entry.set_width_chars(sum(d if d else 0 for d in digits))
self.entry.set_text(field.get_client(record))
def key_press_event(self, widget, event):
@@ -47,7 +47,7 @@
if new_value in ('-', decimal_point):
return
- digits = self.record.expr_eval(self.digits)
+ digits = [d if d else 0 for d in
self.record.expr_eval(self.digits)]
try:
locale.atof(new_value)
Index: tryton/gui/window/view_form/view/form_gtk/integer.py
===================================================================
--- 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 @@
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 = None
self.entry.set_width_chars(8)
_, _, padding, pack_type = self.widget.query_child_packing(
self.entry)
--
[email protected] mailing list