[Top][All Lists]
[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()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r9102 - in trunk/gnue-forms/src: GFObjects input/displayHandlers,
reinhard <=