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

Reply via email to