commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r8377 - trunk/gnue-forms/src/GFObjects


From: johannes
Subject: [gnue] r8377 - trunk/gnue-forms/src/GFObjects
Date: Wed, 5 Apr 2006 09:47:34 -0500 (CDT)

Author: johannes
Date: 2006-04-05 09:47:32 -0500 (Wed, 05 Apr 2006)
New Revision: 8377

Removed:
   trunk/gnue-forms/src/GFObjects/GFMask.py
Modified:
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFField.py
Log:
Pep8-ified and restructured GFField


Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2006-04-05 14:43:56 UTC (rev 
8376)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2006-04-05 14:47:32 UTC (rev 
8377)
@@ -705,7 +705,7 @@
     self._recordCount   = newRecordCount
 
     for field in self._fieldList:
-      field.gotNewCurrentRecord ()
+      field._event_new_current_record ()
 
       for entry in field._entryList:
         # This loop is probably better somewhere else

Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py   2006-04-05 14:43:56 UTC (rev 
8376)
+++ trunk/gnue-forms/src/GFObjects/GFField.py   2006-04-05 14:47:32 UTC (rev 
8377)
@@ -1,6 +1,9 @@
+# GNU Enterprise Forms - GF Object Hierarchy - Field of a block
 #
-# This file is part of GNU Enterprise.
+# Copyright 2001-2006 Free Software Foundation
 #
+# This file is part of GNU Enterprise
+#
 # GNU Enterprise is free software; you can redistribute it
 # and/or modify it under the terms of the GNU General Public
 # License as published by the Free Software Foundation; either
@@ -16,573 +19,664 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# Copyright 2000-2006 Free Software Foundation
-#
-# FILE:
-# GFField.py
-#
-# DESCRIPTION:
+# $Id$
 """
-The primary data entry widget in forms
+Implementation of block fields
 """
-# NOTES:
-#
 
 from gnue.common.apps import errors
-from GFValue import GFValue
-import string
+from gnue.forms.GFObjects.GFValue import GFValue
+from gnue.common.definitions import GParser
 
-############################################################
-# GFField
-#
-# Matches the Entry form tag in the gfd
-#
-# It send events to its parent GFBlock
-#
+# =============================================================================
+# 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 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)
+
+
+# =============================================================================
+# A field of a block
+# =============================================================================
+
 class GFField(GFValue):
-  def __init__(self, parent=None, value=None):
-    GFValue.__init__(self, parent, value, 'GFField')
 
-    # Default attributes (these may be replaced by parser)
-    self.typecast="text"
-    self.case="mixed"
-    self.style="default"
-    self.defaultToLast = False
-    self.rtrim = False
-    self.ltrim = False
+    # -------------------------------------------------------------------------
+    # Constructor
+    # -------------------------------------------------------------------------
 
-    # Runtime variables
-    self._uppercase = False
-    self._lowercase = False
-    self._numeric = False
-    self._queryable = True
+    def __init__(self, parent=None, value=None):
 
-    self._allowedValues = None
-    self._allowedValuesDescr = [""]
+        GFValue.__init__(self, parent, value, 'GFField')
 
-    self._rows = 1
-    self._gap = 0
+        # Default attributes (these may be replaced by parser)
+        self.typecast = "text"
+        self.case = "mixed"
+        self.defaultToLast = False
+        self.rtrim = False
+        self.ltrim = False
 
-    # This will be populated by GFEntry's initialize
-    self._entryList = []
+        # Runtime variables
+        self._uppercase = False
+        self._lowercase = False
+        self._numeric = False
+        self._queryable = True
 
-    #
-    # Trigger exposure
-    #
-    self._validTriggers ={ 'PRE-FOCUSOUT':   'Pre-FocusOut',
-                           'POST-FOCUSOUT':  'Post-FocusOut',
-                           'PRE-FOCUSIN':    'Pre-FocusIn',
-                           'POST-FOCUSIN':   'Post-FocusIn',
-                           'PRE-COMMIT':     'Pre-Commit',
-                           'POST-COMMIT':    'Post-Commit',
-                           'PRE-QUERY':      'Pre-Query',
-                           'POST-QUERY':     'Post-Query',
-##                           'PRE-MODIFY':     'Pre-Modify', #This must be a 
typo
-                           'PRE-INSERT':     'Pre-Insert',
-                           'PRE-DELETE':     'Pre-Delete',
-                           'PRE-UPDATE':     'Pre-Update',
-                           'PRE-CHANGE':     'Pre-Change',
-                           'POST-CHANGE':    'Post-Change',
-                         }
+        self._allowedValues = None
+        self._allowedValuesDescr = [""]
 
-    self._triggerFunctions={'allowedValues':{'function':self.allowedValues,},
-                            
'autofillBySequence':{'function':self.triggerAutofillBySequence},
-                            'isEmpty':{'function':self.isEmpty},
-                            
'resetForeignKey':{'function':self.resetForeignKey},
-                            'set':{'function':self.triggerSetValue},
-                            'get':{'function':self.getValue},
-                            'clear': {'function': self.resetToDefault},
-                            'getFKDescription': {
-                               'function': self.getFKDescription},
-                            'setFKDescription': {
-                               'function': self.setFKDescription},
-                           }
-    self._triggerProperties={
-          'parent':       { 'get':self.getParent},
-          'value':        { 'set':self.triggerSetValue,
-                            'get':self.getValue },
-          'rtrim':        { 'set':self.triggerSetRtrim,
-                            'get':self.triggerGetRtrim },
-          'readonly':     { 'set':self.triggerSetReadonly,
-                            'get':self.triggerGetReadonly },
-          'maxLength':    { 'set':self.triggerSetMaxLength,
-                            'get':self.triggerGetMaxLength },
-          'queryDefault': { 'set':self.triggerSetQueryDefault,
-                            'get':self.triggerGetQueryDefault },
-          'ltrim':        { 'set':self.triggerSetLtrim,
-                            'get':self.triggerGetLtrim },
-          'minLength':    { 'set':self.triggerSetMinLength,
-                            'get':self.triggerGetMinLength },
-          'editable':     { 'set':self.triggerSetEditable,
-                            'get':self.triggerGetEditable },
-          'ignoreCaseOnQuery':{
-                            'set':self.triggerSetIgnoreCaseOnQuery,
-                            'get':self.triggerGetIgnoreCaseOnQuery },
-          'case':         { 'set':self.triggerSetCase,
-                            'get':self.triggerGetCase },
-          'default':      { 'set':self.triggerSetDefault,
-                            'get':self.triggerGetDefault },
-          'defaultToLast':{ 'set':self.triggerSetDefaultToLast,
-                            'get':self.triggerGetDefaultToLast },
-          'required':     { 'set':self.triggerSetRequired,
-                            'get':self.triggerGetRequired },
-          'queryable':    { 'set':self.triggerSetQueryable,
-                            'get':self.triggerGetQueryable },
-      }
-    self._triggerSet = self.triggerSetValue
-    self._triggerGet = self.getValue
+        self._rows = 1
+        self._gap = 0
 
+        # This will be populated by GFEntry's initialize
+        self._entryList = []
 
-  def isEmpty(self):
-    return self.getValue() in ("",None)
+        #
+        # Trigger exposure
+        #
+        self._validTriggers = {
+            'PRE-FOCUSOUT':  'Pre-FocusOut',
+            'POST-FOCUSOUT': 'Post-FocusOut',
+            'PRE-FOCUSIN':   'Pre-FocusIn',
+            'POST-FOCUSIN':  'Post-FocusIn',
+            'PRE-COMMIT':    'Pre-Commit',
+            'POST-COMMIT':   'Post-Commit',
+            'PRE-QUERY':     'Pre-Query',
+            'POST-QUERY':    'Post-Query',
+##          'PRE-MODIFY':    'Pre-Modify', #This must be a typo
+            'PRE-INSERT':    'Pre-Insert',
+            'PRE-DELETE':    'Pre-Delete',
+            'PRE-UPDATE':    'Pre-Update',
+            'PRE-CHANGE':    'Pre-Change',
+            'POST-CHANGE':   'Post-Change',
+        }
 
-  def _buildObject(self):
-    # Convert deprecated attributes
+        self._triggerFunctions = {
+            'allowedValues'     : {'function': self.allowedValues},
+            'autofillBySequence': {'function': self.triggerAutofillBySequence},
+            'isEmpty'           : {'function': self.isEmpty},
+            'resetForeignKey'   : {'function': self.resetForeignKey},
+            'set'               : {'function': self.triggerSetValue},
+            'get'               : {'function': self.getValue},
+            'clear'             : {'function': self.resetToDefault},
+            'getFKDescription'  : {'function': self.getFKDescription},
+            'setFKDescription'  : {'function': self.setFKDescription},
+        }
 
-    # Foreign keys
-    # DEPRECATED with 0.4.x .. Delete before 1.0
-    if hasattr(self,'foreign_key') and self.foreign_key:
-      (self.fk_source, self.fk_key) = string.split(self.foreign_key,'.')
-      del self.foreign_key
-    if hasattr(self,'foreign_key_description') and 
self.foreign_key_description:
-      self.fk_description = self.foreign_key_description
-      del self.foreign_key_description
+        self._triggerProperties = {
+            'parent':            {'get': self.getParent},
+            'value':             {'set': self.triggerSetValue,
+                                  'get': self.getValue },
+            'rtrim':             {'set': self.triggerSetRtrim,
+                                  'get': self.triggerGetRtrim },
+            'readonly':          {'set': self.triggerSetReadonly,
+                                  'get': self.triggerGetReadonly },
+            'maxLength':         {'set': self.triggerSetMaxLength,
+                                  'get': self.triggerGetMaxLength },
+            'queryDefault':      {'set': self.triggerSetQueryDefault,
+                                  'get': self.triggerGetQueryDefault },
+            'ltrim':             {'set': self.triggerSetLtrim,
+                                  'get': self.triggerGetLtrim },
+            'minLength':         {'set': self.triggerSetMinLength,
+                                  'get': self.triggerGetMinLength },
+            'editable':          {'set': self.triggerSetEditable,
+                                  'get': self.triggerGetEditable },
+            'ignoreCaseOnQuery': {'set': self.triggerSetIgnoreCaseOnQuery,
+                                  'get': self.triggerGetIgnoreCaseOnQuery },
+            'case':              {'set': self.triggerSetCase,
+                                  'get': self.triggerGetCase },
+            'default':           {'set': self.triggerSetDefault,
+                                  'get': self.triggerGetDefault },
+            'defaultToLast':     {'set': self.triggerSetDefaultToLast,
+                                  'get': self.triggerGetDefaultToLast },
+            'required':          {'set': self.triggerSetRequired,
+                                  'get': self.triggerGetRequired },
+            'queryable':         {'set': self.triggerSetQueryable,
+                                  'get': self.triggerGetQueryable },
+        }
 
-    # Deprecated with 0.5.4 .. Delete before 1.0
-    if hasattr(self,'min_length'):
-      self.minLength = self.min_length
-      del self.min_length
-    if hasattr(self,'max_length'):
-      self.maxLength = self.max_length
-      del self.max_length
+        self._triggerSet = self.triggerSetValue
+        self._triggerGet = self.getValue
 
-    return GFValue._buildObject(self)
 
-  def _phase_1_init_ (self):
+    # -------------------------------------------------------------------------
+    # Determine wether a field is queryable or not
+    # -------------------------------------------------------------------------
 
-    GFValue._phase_1_init_ (self)
+    def isQueryable(self):
 
-    self._block = block = self.findParentOfType('GFBlock')
-    block._fieldMap[self.name] = self
-    block._fieldList.append(self)
+        return self._queryable
 
-    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
 
+    # -------------------------------------------------------------------------
+    # Determine wether a field is editable or not
+    # -------------------------------------------------------------------------
 
-    if hasattr(self, 'default') and self.default != None and len(self.default):
-      default = self.default
-    else:
-      default = None
+    def isEditable(self, mode):
 
-    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
+        if mode == 'query':
+            return self.isQueryable () and self._block.queryable
 
-    # Initialize the foreign key lookup (if necessary)
-    if hasattr(self,'fk_source'):
-      try:
-        self.fk_key
-      except NameError:
-        raise "fk_source specified, but no fk_key"
+        elif self._block._form.readonly:
+            return False
+        else:
+            return (mode == 'new' and self.editable in ('Y', 'new', 'null') \
+                    and self._block.editable in ('Y', 'new')) or \
+                   (mode == 'edit' and self._block.editable in ('Y', 'update')\
+                    and (self.editable in ('Y','update') or \
+                        (self.editable == 'null' and self.isEmpty())))
 
-      try:
-        self._fk_descr = string.split(self.fk_description,',')
-      except NameError:
-        self.fk_description = self.fk_key
-        self._fk_descr = string.split(self.fk_key,',')
 
-      self._fk_datasource = \
-         block._form._datasourceDictionary. get (string.lower (self.fk_source))
+    # -------------------------------------------------------------------------
+    # Retrieve the current field value
+    # -------------------------------------------------------------------------
 
-      if self._fk_datasource is None:
-        raise errors.ApplicationError, \
-            u_("Datasource '%s' not found") % self.fk_source
+    def getValue(self):
+        """
+        Return the current value of the field. If the block is in query mode
+        the value returned is the value which has been set the last time using
+        setValue () while in query mode. If the block is in initialization mode
+        the return value is the corresponding value from the block's
+        initializingRecord. Otherwise the result will be the current record's
+        value. None will be converted to an empty string. And string values
+        (either plain or unicode) will be trimmed depending on the ltrim- and
+        rtrim-attributes.
+        """
 
-      # 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)
+        mode = self._block.mode
 
-      # Register event handling functions
-      self._fk_datasource.registerEventListeners ({
-          'dsResultSetActivated': self.__dsResultSetActivated,
-          'dsResultSetChanged'  : self.__dsResultSetActivated, # sic!
-          'dsCursorMoved'       : self.__dsCursorMoved})
+        if mode == 'query':
+            value = self._block._queryValues.get(self)
 
+        elif mode == 'init':
+            value = self._block._initializingRecord [self.field]
 
-    if hasattr(self, 'queryDefault') and \
-         self.queryDefault != None and \
-         self._bound and \
-         len(self.queryDefault):
-      block._queryDefaults[self] = self.queryDefault
+        else:
+            if self._block._resultSet and self._block._resultSet.current:
+                value = self._block._resultSet.current.getField(self.field)
+            else:
+                value = None
 
+        if value is None:
+            value = ''
 
-  # ---------------------------------------------------------------------------
-  # Event handling functions for datasource events
-  # ---------------------------------------------------------------------------
+        if isinstance(value, basestring):
+            if self.rtrim:
+                value = value.rstrip()
+            if self.ltrim:
+                value = value.lstrip()
 
-  def __dsResultSetActivated (self, event):
-    self.__loadAllowedValues (event.resultSet)
+        return value
 
-  # ---------------------------------------------------------------------------
 
-  def __dsCursorMoved (self, event):
-    # The entry causing the fk record change has already posted a setValue for
-    # this field; our current record already contians the correct data. All we
-    # have to do is tell our UI to update.
-    self._block._form.updateUIEntry (self)
+    # -------------------------------------------------------------------------
+    # Set the field value
+    # -------------------------------------------------------------------------
 
+    def setValue(self, value):
+        """
+        Set the current value of the field. If the block is in query mode, the
+        value will be stored in the query-values used for later retrieval in
+        query mode. If the block is in initialization mode, the value will be
+        stored in the blocks' initializingRecord dictionary. Otherwise the
+        value will be stored in the current record. The Pre- and
+        PostChange-triggers will be fired on field- and block-level.
+        """
 
-  # ---------------------------------------------------------------------------
-  #
-  # ---------------------------------------------------------------------------
+        mode = self._block.mode
 
-  def isQueryable(self):
-    return self._queryable
+        if isinstance(value, basestring):
+            if self.rtrim:
+                value = value.rstrip()
+            if self.ltrim:
+                value = value.lstrip()
 
+        if mode == 'query':
+            self._block._queryValues[self] = value
 
-  #
-  # Pulls the proper value from the resultSet
-  #
-  def getValue(self):
-    # TODO: No longer true...
-    # We have to check to see if the _block has been
-    # setup yet.  The Trigger system calls getValue
-    # before it's ready so we fake it
-    try:
-      mode = self._block.mode
-    except AttributeError:
-      # Not initialized yet.
-      return
+        elif mode == 'init':
+            self._block._initializingRecord[self.field] = value
 
-    if mode == 'query':
-          try:
-            value = self._block._queryValues[self]
-          except KeyError:
-            value = None
+        else:
+            self._block.processTrigger('Pre-Change')
+            self.processTrigger('Pre-Change')
+            self._block._resultSet.current[self.field] = value
 
-    elif mode == 'init':
-      value = self._block._initializingRecord [self.field]
+            if self.defaultToLast:
+                self._block._lastValues[self.field] = value
 
-    else:
-      if self._block._resultSet and self._block._resultSet.current:
-        value = self._block._resultSet.current.getField(self.field)
-      else:
-        value = None
-    # TODO: part of the removed block check from above
-    #else:
-    #  value = None
+            self._block.processTrigger('Post-Change')
+            self.processTrigger('Post-Change')
 
-    if value == None:       value = ''
+        # If the field value of the current record has changed, update the UI
+        if mode != 'init':
+            self._block._form.updateUIEntry(self)
 
-    if self.rtrim:
-      try:
-        value = string.rstrip(value)
-      except:
-        pass
-    if self.ltrim:
-      try:
-        value = string.lstrip(value)
-      except:
-        pass
+            # If the field is a foreign key, move the result set to the
+            # selected value.
+            if hasattr(self,'_GFField__fk_resultSet'):
+                self.__fk_resultSet.findRecord({self.fk_key: value})
 
-    # TODO: check to see if this is still needed
-    #CheckBox does not work if comment following "if" block (ra3vat)
-    if self.style == 'checkbox' and value == '':      value = 0
 
-    return value
+    # -------------------------------------------------------------------------
+    # Implementation of virtual methods
+    # -------------------------------------------------------------------------
 
-  # Clear out the current value (setting to null, or default value)
-  def resetToDefault(self):
-    try:
-      default = self._block._lastValues[self.field]
-    except KeyError:
-      if hasattr(self, 'default') and self.default != None and 
len(self.default):
-        default = self.default
-      else:
-        default = None
-    self.setValue(default)
+    def _phase_1_init_(self):
 
+        GFValue._phase_1_init_(self)
 
-  def setValue(self, value):
-    # TODO: This is now being done in the display handler
-    #if self.style=='checkbox' and value =='':
-    #  value = 0
-    #
-    # Number fields
-    #if self.typecast == "number" and value != None:
-    #  value = float(value)
+        self._block = self.findParentOfType ('GFBlock')
+        self._block._fieldMap [self.name] = self
+        self._block._fieldList.append (self)
 
-    try:
-      mode = self._block.mode
-    except AttributeError:
-      # Not initialized yet.
-      return
+        if self.typecast == 'number':
+            self._numeric = True
+            self._allowFormulas = gConfigForms("AllowNumericFormulas")
 
-    if self.rtrim:
-      try:
-        value = string.rstrip(value)
-      except:
-        pass
-    if self.ltrim:
-      try:
-        value = string.lstrip(value)
-      except:
-        pass
+        if self.case == 'upper':
+            self._uppercase = True
+        elif self.case == 'lower':
+            self._lowercase = True
 
-    if mode == 'query':
-      self._block._queryValues[self] = value
+        default = self.__get_default ()
 
-    elif mode == 'init':
-      self._block._initializingRecord [self.field] = value
+        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
 
-    else:
-      self._block.processTrigger('Pre-Change')
-      self.processTrigger('Pre-Change')
-      self._block._resultSet.current[self.field] = value
+        # Initialize the foreign key lookup (if necessary)
+        if hasattr(self, 'fk_source'):
+          if not getattr (self, 'fk_key', None):
+              raise FKeyMissingError (self)
 
-      if self.defaultToLast:
-        self._block._lastValues[self.field] = value
+          if not hasattr (self, 'fk_description'):
+              self.fk_description = self.fk_key
 
-      self._block.processTrigger('Post-Change')
-      self.processTrigger('Post-Change')
+          self._fk_descr = self.fk_description.split (',')
 
-###      if self._block._resultSet.current.isPending():
-###        self.dispatchEvent('canCOMMIT')
-###        self.dispatchEvent('canROLLBACK')
+          source = self.fk_source.lower()
+          if not source in self._block._form._datasourceDictionary:
+              raise DataSourceNotFoundError, (self.fk_source, self)
 
-    # If the field value of the current record has changed, update the UI
-    if mode != 'init':                  # init doesn't affect current record!
-      self._block._form.updateUIEntry(self)
+          self._fk_datasource = self._block._form._datasourceDictionary[source]
 
-      # If the field is a foreign key, move the result set to the selected 
value
-      if hasattr(self,'_GFField__fk_resultSet'):
-        self.__fk_resultSet.findRecord({self.fk_key: value})
+          # 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 a field has a foreign key, return it's description
-  # ---------------------------------------------------------------------------
 
-  def getFKDescription (self):
-    """
-    This function returns the description of the foreign key or None if there's
-    no fk_source available.
+        if hasattr(self, 'queryDefault') and self.queryDefault != None and \
+             self._bound and len(self.queryDefault):
+          block._queryDefaults[self] = self.queryDefault
 
-    @return: value of fk_description
-    """
 
-    if self._allowedValues is None:
-      return None
+    # -------------------------------------------------------------------------
+    # Get a default value
+    # -------------------------------------------------------------------------
 
-    value = self.getValue ()
-    return self._allowedValues.get (value)
+    def __get_default (self):
 
+        if hasattr(self, 'default') and self.default is not None \
+                and self.default:
+            default = self.default
+        else:
+            default = None
 
-  # ---------------------------------------------------------------------------
-  # Set the field value by it's foreign key description
-  # ---------------------------------------------------------------------------
+        return default
 
-  def setFKDescription (self, fkValue):
-    """
-    This function set's the field's value by it's foreign key description.
 
-    @param fkValue: value of fk_description
-    """
+    # -------------------------------------------------------------------------
+    # Event handling functions for datasource events
+    # -------------------------------------------------------------------------
 
-    if self._allowedValues is None or self.getFKDescription () == fkValue:
-      return None
+    def __dsResultSetActivated(self, event):
 
-    # TODO: Shall we raise an exception if an invalid value is given ? Same
-    # applies to setValue () which does *not* raise one atm too
-    self.setValue (self._allowedValuesReverse.get (fkValue))
+        self.__loadAllowedValues(event.resultSet)
 
+    # -------------------------------------------------------------------------
 
+    def __dsCursorMoved(self, event):
 
+        # The entry causing the fk record change has already posted a setValue
+        # for this field; our current record already contians the correct data.
+        # All we have to do is tell our UI to update.
+        self._block._form.updateUIEntry(self)
 
-  #
-  # allowedValues
-  #
-  def __loadAllowedValues (self, resultSet):
-    self._allowedValues = {"":""}
-    self._allowedValuesDescr = [""]
-    self._allowedValuesReverse = {"":""}
-    dropdownSeparator = gConfigForms('DropdownSeparator')
-    if dropdownSeparator[:1] == '"' and \
-           dropdownSeparator[-1:] == '"' and \
-           len(dropdownSeparator) > 2:
-      dropdownSeparator = dropdownSeparator[1:-1]
 
-    array = resultSet.getArray ([self.fk_key] + self._fk_descr)
+    # -------------------------------------------------------------------------
+    # Prepare the allowed values for the field
+    # -------------------------------------------------------------------------
 
-    for line in array:
-      key = "%s" % line [0]
-      descr = string.join (["%s" % i for i in line [1:]], dropdownSeparator)
+    def __loadAllowedValues(self, resultSet):
 
-      self._allowedValues[key] = descr
-      self._allowedValuesDescr.append(descr)
-      self._allowedValuesReverse[descr] = key
+        self._allowedValues = {"":""}
+        self._allowedValuesDescr = [""]
+        self._allowedValuesReverse = {"":""}
 
-    # And now, position the resultSet to the correct record according to the
-    # current field content
-    resultSet.findRecord({self.fk_key: self.getValue()})
+        dpSep = gConfigForms('DropdownSeparator')
+        if dpSep.startswith('"') and dpSep.endswith('"') and len(dpSep) > 2:
+            dpSep = dpSep[1:-1]
 
-    # Remember the resultSet for later
-    self.__fk_resultSet = resultSet
+        array = resultSet.getArray ([self.fk_key] + self._fk_descr)
+
+        for line in array:
+          key = "%s" % line[0]
+          descr = dpSep.join (["%s" % i for i in line[1:]])
+
+          self._allowedValues[key] = descr
+          self._allowedValuesDescr.append(descr)
+          self._allowedValuesReverse[descr] = key
+
+        # And now, position the resultSet to the correct record according to
+        # the current field content.
+        resultSet.findRecord({self.fk_key: self.getValue()})
+
+        # Remember the resultSet for later
+        self.__fk_resultSet = resultSet
  
-    assert gDebug (5,'Created for DropDown: %s' % self._allowedValues)
+        assert gDebug(5,'Created for DropDown: %s' % self._allowedValues)
 
-  def allowedValues(self):
-    return (self._allowedValues, self._allowedValuesDescr)
 
-  def resetForeignKey(self, resultSet = None):
-    # Added so forms triggers could set after init/execute queries
-    # which allows filtering of dropdown's in trigger code
-    if resultSet == None:
-      resultSet = self._fk_datasource.createResultSet()
+    # -------------------------------------------------------------------------
+    # Keep the fk resultset in sync
+    # -------------------------------------------------------------------------
 
-    if hasattr (self._fk_datasource, 'master') and self._fk_datasource.master:
-      # we should have been notified in this case, did we ?
-      pass
-    else:
-      self.__loadAllowedValues(resultSet)
-    pass
+    def _event_new_current_record (self):
+        """
+        The current record of our own ResultSet has changed. So make sure the
+        fk ResultSet follows.
+        """
 
+        if hasattr(self, '_GFField__fk_resultSet'):
+            self.__fk_resultSet.findRecord({self.fk_key: self.getValue()})
 
-  # This gets called by the block whenever the current record of our own
-  # resultset changes. We want the fk resultset to follow.
-  def gotNewCurrentRecord (self):
-    # If the field is a foreign key, move the result set to the selected value
-    if hasattr(self,'_GFField__fk_resultSet'):
-      self.__fk_resultSet.findRecord({self.fk_key: self.getValue()})
 
 
-  def isEditable(self, mode):
-    if mode == 'query':
-      return self.queryable and self._block.queryable
-    elif self._block._form.readonly:
-      return False
-    else:
-      return ( mode == 'new' and self.editable in ('Y','new','null') and \
-               self._block.editable in ('Y','new')) or \
-             ( mode == 'edit' and \
-               self._block.editable in ('Y','update') and ( \
-                       self.editable in ('Y','update') or ( \
-                       self.editable == 'null' and self.isEmpty())))
+    # =========================================================================
+    # Trigger functions
+    # =========================================================================
 
-  ####################################################################
-  #
-  # Trigger functions
-  #
-  def triggerAutofillBySequence(self,sequenceName):
-    if (not self.getValue()) or self.getValue()=="":
-      sequenceNumber = 
self._block._dataSourceLink._connection.getSequence(sequenceName)
-      self.setValue(sequenceNumber)
+    def isEmpty(self):
 
-  #
-  # triggerSetValue
-  #
-  # does proper typecasting when value is set via a trigger
-  #
-  def triggerSetValue(self, value):
-    if self.style=='checkbox' and value =='':
-      value = 0
-    if self.typecast == "number" and value is not None:
-      if value == '':
-        value = 0
-      else:
-        value = float (value)
+        return self.getValue() in ("", None)
 
-    self.setValue (value)
+    # -------------------------------------------------------------------------
 
-  def triggerGetReadonly(self):
-    return self.is_navigable(self._block._form.getCurrentMode())
+    def resetToDefault(self):
+        """
+        Reset the current field to the default value.
+        """
 
-  def triggerSetReadonly(self,value):
-    self.editable = value and 'Y' or 'N'
+        if self.field in self._block._lastValues:
+            default = self._block._lastValues[self.field]
+        else:
+            default = self.__get_default()
 
-  def triggerGetEditable(self):
-    return self.editable
+        self.setValue (default)
 
-  def triggerSetEditable(self, value):
-    if not editable in ('Y','N','null','update','new'):
-      editable = editable and 'Y' or 'N'  # In case they pass a boolean
-    self.editable = editable
+    # -------------------------------------------------------------------------
 
-  def triggerSetRtrim(self, value):
-    self.rtrim = not not value # Force boolean
+    def allowedValues(self):
+        """
+        Return a tuple with allowed values dictionary (mapping keys to values)
+        and a sequence of the fk-descriptions.
+        """
 
-  def triggerGetRtrim(self):
-    return self.rtrim
+        return (self._allowedValues, self._allowedValuesDescr)
 
-  def triggerSetQueryDefault(self, value):
-    self.queryDefault = value
+    # -------------------------------------------------------------------------
 
-  def triggerGetQueryDefault(self):
-    return self.queryDefault
+    def resetForeignKey(self, resultSet=None):
+        """
+        Reload the allowed values of the field. If a ResultSet is provided the
+        values will be retrieved from it, otherwise a new ResultSet will be
+        creteated (using the fk_source).
 
-  def triggerSetLtrim(self, value):
-    self.ltrim = not not value # Force boolean
+        @param resultSet: if not None, the values will be loaded from this
+          ResultSet
+        """
 
-  def triggerGetLtrim(self):
-    return self.ltrim
+        # Added so forms triggers could set after init/execute queries
+        # which allows filtering of dropdown's in trigger code
+        if resultSet == None:
+          resultSet = self._fk_datasource.createResultSet()
 
-  def triggerSetMinLength(self, value):
-    self.minLength = value
+        if getattr (self._fk_datasource, 'master', None):
+          # we should have been notified in this case, did we ?
+          pass
+        else:
+          self.__loadAllowedValues(resultSet)
 
-  def triggerGetMinLength(self):
-    return self.minLength
+    # -------------------------------------------------------------------------
 
-  def triggerSetMaxLength(self, value):
-    self.maxLength = value
+    def getFKDescription(self):
+        """
+        This function returns the description of the foreign key or None if
+        there's no fk_source available.
 
-  def triggerGetMaxLength(self):
-    return self.maxLength
+        @return: value of fk_description
+        """
 
-  def triggerSetIgnoreCaseOnQuery(self, value):
-    self.ignoreCaseOnQuery = not not value # Force boolean
+        if self._allowedValues is None:
+            return None
 
-  def triggerGetIgnoreCaseOnQuery(self):
-    return self.ignoreCaseOnQuery
+        value = self.getValue()
+        return self._allowedValues.get(value)
 
-  def triggerSetCase(self, value):
-    assert (value in ('mixed','upper','lower'))
-    self.case = value
+    # -------------------------------------------------------------------------
 
-  def triggerGetCase(self):
-    return self.case
+    def setFKDescription(self, fkValue):
+        """
+        This function set's the field's value by it's foreign key description.
 
-  def triggerSetDefault(self, value):
-    self.default = value
+        @param fkValue: value of fk_description
+        """
 
-  def triggerGetDefault(self):
-    return self.default
+        if self._allowedValues is None or self.getFKDescription() == fkValue:
+            return None
 
-  def triggerSetDefaultToLast(self, value):
-    self.defaultToLast = not not value # Force boolean
+        # TODO: Shall we raise an exception if an invalid value is given?  Same
+        # applies to setValue() which does *not* raise one atm too
+        self.setValue(self._allowedValuesReverse.get(fkValue))
 
-  def triggerGetDefaultToLast(self):
-    return self.defaultToLast
 
-  def triggerSetRequired(self, value):
-    self.required = not not value # Force boolean
+    # -------------------------------------------------------------------------
 
-  def triggerGetRequired(self):
-    return self.required
+    def triggerAutofillBySequence(self, sequenceName):
 
-  def triggerSetQueryable(self, value):
-    self.queryable = not not value # Force boolean
+        if (not self.getValue()) or self.getValue() == "":
+            con = self._block._dataSourceLink._connection
+            self.setValue(con.getSequence(sequenceName))
 
-  def triggerGetQueryable(self):
-    return self.queryable
+    # -------------------------------------------------------------------------
 
+    def triggerSetValue(self, value):
+
+        if self.typecast == "number" and value is not None:
+            value = float (value or 0)
+
+        self.setValue (value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetReadonly(self):
+
+        return self.is_navigable(self._block._form.getCurrentMode())
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetReadonly(self, value):
+
+        self.editable = value and 'Y' or 'N'
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetEditable(self):
+
+        return self.editable
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetEditable(self, value):
+
+        if not editable in ('Y', 'N', 'null', 'update', 'new'):
+            editable = editable and 'Y' or 'N'  # In case they pass a boolean
+
+        self.editable = editable
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetRtrim(self, value):
+
+        self.rtrim = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetRtrim(self):
+
+        return self.rtrim
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetQueryDefault(self, value):
+
+        self.queryDefault = value
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetQueryDefault(self):
+
+        return self.queryDefault
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetLtrim(self, value):
+
+        self.ltrim = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetLtrim(self):
+
+        return self.ltrim
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetMinLength(self, value):
+
+        self.minLength = value
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetMinLength(self):
+
+        return self.minLength
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetMaxLength(self, value):
+
+        self.maxLength = value
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetMaxLength(self):
+
+        return self.maxLength
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetIgnoreCaseOnQuery(self, value):
+         
+        self.ignoreCaseOnQuery = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetIgnoreCaseOnQuery(self):
+         
+        return self.ignoreCaseOnQuery
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetCase(self, value):
+
+        if value in ('mixed','upper','lower'):
+            self.case = value
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetCase(self):
+
+        return self.case
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetDefault(self, value):
+
+        self.default = value
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetDefault(self):
+
+        return self.default
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetDefaultToLast(self, value):
+
+        self.defaultToLast = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetDefaultToLast(self):
+
+        return self.defaultToLast
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetRequired(self, value):
+
+        self.required = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetRequired(self):
+
+        return self.required
+
+    # -------------------------------------------------------------------------
+
+    def triggerSetQueryable(self, value):
+
+        self.queryable = bool(value)
+
+    # -------------------------------------------------------------------------
+
+    def triggerGetQueryable(self):
+
+        return self.queryable

Deleted: trunk/gnue-forms/src/GFObjects/GFMask.py
===================================================================





reply via email to

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