[Top][All Lists]
[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
===================================================================
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r8377 - trunk/gnue-forms/src/GFObjects,
johannes <=