commit-gnue
[Top][All Lists]
Advanced

[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
     # -------------------------------------------------------------------------
 





reply via email to

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