[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r8686 - trunk/gnue-forms/src/GFObjects
From: |
reinhard |
Subject: |
[gnue] r8686 - trunk/gnue-forms/src/GFObjects |
Date: |
Thu, 14 Sep 2006 08:09:24 -0500 (CDT) |
Author: reinhard
Date: 2006-09-14 08:09:23 -0500 (Thu, 14 Sep 2006)
New Revision: 8686
Modified:
trunk/gnue-forms/src/GFObjects/GFField.py
Log:
New functions to set and get the user value.
Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py 2006-09-14 10:06:08 UTC (rev
8685)
+++ trunk/gnue-forms/src/GFObjects/GFField.py 2006-09-14 13:09:23 UTC (rev
8686)
@@ -24,6 +24,7 @@
Implementation of block fields
"""
+from gnue.common.apps import errors
from gnue.common.definitions import GParser
from gnue.forms.GFObjects import GFObj
@@ -45,13 +46,29 @@
msg = u_("Datasource '%(name)s' not found") % {'name': name}
GParser.MarkupError.__init__ (self, msg, 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)
+
+
# =============================================================================
# A field of a block
# =============================================================================
class GFField(GFObj.GFObj):
+ """
+ A field manages a database column, possibly with foreign key lookup.
+ A field has two different values. The DB value, which is the value read
+ from/written into the database backend, and the user value, which is the
+ value displayed in a form. Those values are different when the field uses
+ foreign key lookup.
+ """
+
# -------------------------------------------------------------------------
# Constructor
# -------------------------------------------------------------------------
@@ -73,6 +90,7 @@
self._numeric = False
self._queryable = True
+ self.__is_lookup = False
self._allowedValues = None
self._allowedValuesDescr = [""]
self._allowedValuesReverse = {"":""}
@@ -119,6 +137,73 @@
# -------------------------------------------------------------------------
+ # Initialization
+ # -------------------------------------------------------------------------
+
+ def _phase_1_init_(self):
+
+ GFObj.GFObj._phase_1_init_(self)
+
+ self._block = self.findParentOfType ('GFBlock')
+ self._block._fieldMap [self.name] = self
+ self._block._fieldList.append (self)
+
+ if self.typecast == 'number':
+ self._numeric = True
+ self._allowFormulas = gConfigForms("AllowNumericFormulas")
+
+ if self.case == 'upper':
+ self._uppercase = True
+ elif self.case == 'lower':
+ self._lowercase = True
+
+ default = self.__get_default ()
+
+ if not hasattr(self, 'field') or not len(self.field):
+ self.field = "__GNUe__%s" % self.name
+ self._block._dataSourceLink.referenceUnboundField(self.field,
+ default)
+ self._bound = False
+ else:
+ self._block._dataSourceLink.referenceField(self.field, default)
+ self._bound = True
+
+ # Initialize the foreign key lookup (if necessary)
+ if hasattr(self, 'fk_source'):
+ if not getattr (self, 'fk_key', None):
+ raise FKeyMissingError (self)
+
+ if not hasattr (self, 'fk_description'):
+ self.fk_description = self.fk_key
+
+ self._fk_descr = self.fk_description.split (',')
+
+ source = self.fk_source.lower()
+ if not source in self._block._form._datasourceDictionary:
+ raise DataSourceNotFoundError, (self.fk_source, self)
+
+ self._fk_datasource = self._block._form._datasourceDictionary[source]
+
+ # Reference the foreign keys to their datasources (so they are
+ # selected).
+ for field in [self.fk_key] + self._fk_descr:
+ self._fk_datasource.referenceField(field, None)
+
+ # Register event handling functions
+ self._fk_datasource.registerEventListeners ({
+ 'dsResultSetActivated': self.__dsResultSetActivated,
+ 'dsResultSetChanged' : self.__dsResultSetActivated, # sic!
+ 'dsCursorMoved' : self.__dsCursorMoved})
+
+ self.__is_lookup = True
+
+
+ if hasattr(self, 'queryDefault') and self.queryDefault != None and \
+ self._bound and len(self.queryDefault):
+ block._queryDefaults[self] = self.queryDefault
+
+
+ # -------------------------------------------------------------------------
# Determine wether a field is queryable or not
# -------------------------------------------------------------------------
@@ -149,9 +234,43 @@
# -------------------------------------------------------------------------
- # Retrieve the current field value
+ # Reading and writing the user value of the field
# -------------------------------------------------------------------------
+ def get_user_value(self):
+ """
+ Return the current user value of the field. For lookup fields, this is
+ the foreign key description.
+ """
+
+ if not self.__is_lookup:
+ return self.getValue()
+
+ db_value = '%s' % self.getValue() # convert to string or unicode
+
+ if self._allowedValues.has_key(db_value):
+ return self._allowedValues[db_value]
+ else:
+ # db returned value that is actually not allowed
+ return u"(invalid)"
+
+ # -------------------------------------------------------------------------
+
+ def set_user_value(self, value):
+ """
+ Set the current user value of the field. For lookup fields, this is the
+ foreign key description.
+ """
+
+ if self._allowedValuesReverse.has_key(value):
+ self.setValue(self._allowedValuesReverse[value])
+ else:
+ raise InvalidFieldValueError, (self.name, value)
+
+ # -------------------------------------------------------------------------
+ # Reading and writing the DB value of a field
+ # -------------------------------------------------------------------------
+
def getValue(self):
"""
Return the current value of the field, depending on the state of the
@@ -171,10 +290,7 @@
return value
-
# -------------------------------------------------------------------------
- # Set the field value
- # -------------------------------------------------------------------------
def setValue(self, value):
"""
@@ -211,71 +327,6 @@
# -------------------------------------------------------------------------
- # Implementation of virtual methods
- # -------------------------------------------------------------------------
-
- def _phase_1_init_(self):
-
- GFObj.GFObj._phase_1_init_(self)
-
- self._block = self.findParentOfType ('GFBlock')
- self._block._fieldMap [self.name] = self
- self._block._fieldList.append (self)
-
- if self.typecast == 'number':
- self._numeric = True
- self._allowFormulas = gConfigForms("AllowNumericFormulas")
-
- if self.case == 'upper':
- self._uppercase = True
- elif self.case == 'lower':
- self._lowercase = True
-
- default = self.__get_default ()
-
- if not hasattr(self, 'field') or not len(self.field):
- self.field = "__GNUe__%s" % self.name
- self._block._dataSourceLink.referenceUnboundField(self.field,
- default)
- self._bound = False
- else:
- self._block._dataSourceLink.referenceField(self.field, default)
- self._bound = True
-
- # Initialize the foreign key lookup (if necessary)
- if hasattr(self, 'fk_source'):
- if not getattr (self, 'fk_key', None):
- raise FKeyMissingError (self)
-
- if not hasattr (self, 'fk_description'):
- self.fk_description = self.fk_key
-
- self._fk_descr = self.fk_description.split (',')
-
- source = self.fk_source.lower()
- if not source in self._block._form._datasourceDictionary:
- raise DataSourceNotFoundError, (self.fk_source, self)
-
- self._fk_datasource = self._block._form._datasourceDictionary[source]
-
- # Reference the foreign keys to their datasources (so they are
- # selected).
- for field in [self.fk_key] + self._fk_descr:
- self._fk_datasource.referenceField(field, None)
-
- # Register event handling functions
- self._fk_datasource.registerEventListeners ({
- 'dsResultSetActivated': self.__dsResultSetActivated,
- 'dsResultSetChanged' : self.__dsResultSetActivated, # sic!
- 'dsCursorMoved' : self.__dsCursorMoved})
-
-
- if hasattr(self, 'queryDefault') and self.queryDefault != None and \
- self._bound and len(self.queryDefault):
- block._queryDefaults[self] = self.queryDefault
-
-
- # -------------------------------------------------------------------------
# Get a default value
# -------------------------------------------------------------------------
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r8686 - trunk/gnue-forms/src/GFObjects,
reinhard <=