commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r9102 - in trunk/gnue-forms/src: GFObjects input/displayHandlers


From: reinhard
Subject: [gnue] r9102 - in trunk/gnue-forms/src: GFObjects input/displayHandlers
Date: Mon, 4 Dec 2006 09:45:43 -0600 (CST)

Author: reinhard
Date: 2006-12-04 09:45:43 -0600 (Mon, 04 Dec 2006)
New Revision: 9102

Modified:
   trunk/gnue-forms/src/GFObjects/GFField.py
   trunk/gnue-forms/src/input/displayHandlers/Cursor.py
Log:
Convert field values to datatype according to field definition.


Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py   2006-12-04 14:09:35 UTC (rev 
9101)
+++ trunk/gnue-forms/src/GFObjects/GFField.py   2006-12-04 15:45:43 UTC (rev 
9102)
@@ -27,11 +27,13 @@
 
 from gnue.common.apps import errors
 from gnue.common.definitions import GParser
+from gnue.common.utils import datatypes
 
 from gnue.forms.GFObjects import GFObj
 
 __all__ = ['GFField', 'FKeyMissingError', 'LengthNotAllowedError',
-        'DataSourceNotFoundError', 'InvalidFieldValueError']
+        'DataSourceNotFoundError', 'InvalidDBValueError',
+        'InvalidFieldValueError']
 
 
 # =============================================================================
@@ -56,6 +58,11 @@
 
         GFObj.GFObj.__init__(self, parent, 'GFField')
 
+        # Defaults for object attributes.
+        self.datatype = 'text'
+        self.length = None
+        self.scale = None
+
         # These 3 attributes are used by displayHandler to decide which kinds
         # of keypresses to accept.
         self._uppercase = False
@@ -101,7 +108,7 @@
             'autofillBySequence': {'function': self.triggerAutofillBySequence},
             'isEmpty'           : {'function': self.isEmpty},
             'resetForeignKey'   : {'function': self.resetForeignKey},
-            'set'               : {'function': self.triggerSetValue},
+            'set'               : {'function': self.setValue},
             'get'               : {'function': self.getValue},
             'clear'             : {'function': self.resetToDefault},
             'getFKDescription'  : {'function': self.getFKDescription},
@@ -109,10 +116,10 @@
         }
 
         self._triggerProperties = {
-            'value': {'set': self.triggerSetValue,
+            'value': {'set': self.setValue,
                       'get': self.getValue}}
 
-        self._triggerSet = self.triggerSetValue
+        self._triggerSet = self.setValue
         self._triggerGet = self.getValue
 
 
@@ -194,7 +201,7 @@
 
 
         # Check if "length" attribute is allowed
-        if hasattr(self, 'length') \
+        if self.length is not None \
                 and (self.datatype != 'text' or self.__is_lookup):
             raise LengthNotAllowedError(self)
 
@@ -273,6 +280,13 @@
 
         value = self._block.get_value(self, offset)
 
+        # FIXME: This conversion should be in gnue-common.
+        try:
+            value = datatypes.convert(value, self.datatype, self.length,
+                    self.scale)
+        except ValueError, datatypes.ConversionError:
+            raise DBValueError(self.name, value)
+
         if isinstance(value, basestring):
             if self.rtrim:
                 value = value.rstrip()
@@ -287,16 +301,27 @@
         """
         Set the current value of the field, depending on the state of the form
         and the block.
-        """        
-        if isinstance(value, basestring):
-            if self.rtrim:
-                value = value.rstrip()
-            if self.ltrim:
-                value = value.lstrip()
+        """
+
+        # Don't convert when in query mode, so :operator: magic works.
+        if self._block.mode != 'query':
+            # FIXME: This conversion should be in gnue-common.
+            try:
+                value = datatypes.convert(value, self.datatype, self.length,
+                        self.scale)
+            except ValueError, datatypes.ConversionError:
+                raise InvalidValueError(self.name, value)
+
+            if isinstance(value, basestring):
+                if self.rtrim:
+                    value = value.rstrip()
+                if self.ltrim:
+                    value = value.lstrip()
         
         # Auto-query support     
-        if (self.autoquery == 'Y') or \
-                (self.autoquery == 'new' and self._block.is_empty()):
+        if self._block.mode != 'query' \
+                and ((self.autoquery == 'Y') \
+                    or (self.autoquery == 'new' and self._block.is_empty())):
             self._block.query({self.field: value})
             if self._block.is_empty():
                 # Query returned no result, so set the field value
@@ -571,45 +596,64 @@
             con = self._block._dataSourceLink._connection
             self.setValue(con.getSequence(sequenceName))
 
-    # -------------------------------------------------------------------------
 
-    def triggerSetValue(self, value):
-
-        if self.datatype == 'number' and value is not None:
-            value = float (value or 0)
-
-        self.setValue (value)
-
-
 # =============================================================================
 # Exceptions
 # =============================================================================
 
-class FKeyMissingError (GParser.MarkupError):
-    def __init__ (self, field):
-        msg = u_("Field '%(name)s' has a fk_source specified, but no fk_key") \
-              % {'name': field.name}
-        GParser.MarkupError.__init__ (self, msg, field._url, field._lineNumber)
+class FKeyMissingError(GParser.MarkupError):
+    def __init__(self, field):
+        GParser.MarkupError.__init__(self, u_(
+                    "Field '%(name)s' has a fk_source specified, but no fk_key"
+                ) % {
+                    'name': field.name},
+                field._url, field._lineNumber)
 
 # =============================================================================
 
 class LengthNotAllowedError(GParser.MarkupError):
     def __init__(self, field):
-        msg = u_("Field '%(name)s' may not have a 'length' attribute") \
-              % {'name': field.name}
-        GParser.MarkupError.__init__ (self, msg, field._url, field._lineNumber)
+        GParser.MarkupError.__init__(self, u_(
+                    "Field '%(name)s' may not have a 'length' attribute"
+                ) % {
+                    'name': field.name},
+                field._url, field._lineNumber)
 
 # =============================================================================
 
-class DataSourceNotFoundError (GParser.MarkupError):
-    def __init__ (self, name, field):
-        msg = u_("Datasource '%(name)s' not found") % {'name': name}
-        GParser.MarkupError.__init__ (self, msg, field._url, field._lineNumber)
+class DataSourceNotFoundError(GParser.MarkupError):
+    def __init__(self, name, field):
+        GParser.MarkupError.__init__(self, u_(
+                    "Datasource '%(name)s' not found"
+                ) % {
+                    'name': name},
+                field._url, field._lineNumber)
 
 # =============================================================================
 
-class InvalidFieldValueError (errors.UserError):
-  def __init__ (self, field, value):
-    msg = u_("Invalid value '%(value)s' for field '%(field)s") \
-          % {'value': value, 'field': field}
-    errors.UserError.__init__ (self, msg)
+class InvalidDBValueError(errors.ApplicationError):
+    """
+    The database has returned an invalid value for a field.
+
+    The most probable reason for this is that the database column in the
+    backend does not match the datatype from the field definition.
+    """
+    def __init__(self, field, value):
+        errors.ApplicationError.__init__(self, u_(
+                    "Invalid database value %(value)r for field '%(field)s"
+                ) % {
+                    'value': value,
+                    'field': field})
+
+# =============================================================================
+
+class InvalidFieldValueError(errors.UserError):
+    """
+    The user has provided an invalid value for a field.
+    """
+    def __init__(self, field, value):
+        errors.UserError.__init__(self, u_(
+                    "Invalid value '%(value)s' for field '%(field)s"
+                ) % {
+                    'value': value,
+                    'field': field})

Modified: trunk/gnue-forms/src/input/displayHandlers/Cursor.py
===================================================================
--- trunk/gnue-forms/src/input/displayHandlers/Cursor.py        2006-12-04 
14:09:35 UTC (rev 9101)
+++ trunk/gnue-forms/src/input/displayHandlers/Cursor.py        2006-12-04 
15:45:43 UTC (rev 9102)
@@ -266,7 +266,7 @@
     # Validate the input
     # TODO: This will be moved to the mask system!!
     # -------------------------------------------------------------------------
-    if hasattr(self.field,'length') and \
+    if self.field.length is not None and \
        len(self.work)  + len(value) > self.field.length:
       # TODO: Should we beep?
       self.__beep()





reply via email to

[Prev in Thread] Current Thread [Next in Thread]