[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnue] r9088 - in trunk/gnue-forms/src: . GFObjects
From: |
reinhard |
Subject: |
[gnue] r9088 - in trunk/gnue-forms/src: . GFObjects |
Date: |
Wed, 29 Nov 2006 14:23:06 -0600 (CST) |
Author: reinhard
Date: 2006-11-29 14:23:05 -0600 (Wed, 29 Nov 2006)
New Revision: 9088
Modified:
trunk/gnue-forms/src/GFForm.py
trunk/gnue-forms/src/GFInstance.py
trunk/gnue-forms/src/GFObjects/GFParameter.py
trunk/gnue-forms/src/GFParser.py
Log:
Make parameters more self-contained, allow access to parameter value in
triggers through the parameter object, raise an exception on access to
undefined parameter.
issue55 testing
Modified: trunk/gnue-forms/src/GFForm.py
===================================================================
--- trunk/gnue-forms/src/GFForm.py 2006-11-29 16:27:47 UTC (rev 9087)
+++ trunk/gnue-forms/src/GFForm.py 2006-11-29 20:23:05 UTC (rev 9088)
@@ -83,6 +83,9 @@
# Dictionary to locate actions
self._actions = {}
+ # Dictionary to locate parameters
+ self.__parameter_dict = {}
+
# Insert/Overwrite mode
self.__insert_mode = True
@@ -228,6 +231,26 @@
# -------------------------------------------------------------------------
+ # Object initialization
+ # -------------------------------------------------------------------------
+
+ def _buildObject(self):
+
+ # Find the logic and layout controllers
+ for child in self._children:
+ if child._type == 'GFLogic':
+ self._logic = child
+ elif child._type == 'GFLayout':
+ self._layout = child
+
+ # Build parameter dictionary
+ for child in self._children:
+ if child._type == 'GFParameter':
+ self.__parameter_dict[child.name] = child
+
+ return GFObj._buildObject(self)
+
+ # -------------------------------------------------------------------------
# Phase 1 initialization
# -------------------------------------------------------------------------
@@ -238,13 +261,6 @@
events.EventAware.__init__(self, self._instance.eventController)
- # Find the logic and layout controllers
- for child in self._children:
- if child._type == 'GFLogic':
- self._logic = child
- elif child._type == 'GFLayout':
- self._layout = child
-
# Add all connections as children, so they are accessible in the
# action/trigger namespace.
ConnectionTriggerObj.add_connections_to_tree(
@@ -312,13 +328,44 @@
# -------------------------------------------------------------------------
+ # Set and get parameters for the form
+ # -------------------------------------------------------------------------
+
+ def set_parameters(self, parameters):
+ """
+ Set the parameters for this form.
+
+ @param parameters: Dictionary with name/value pairs.
+ """
+
+ for (name, value) in parameters.iteritems():
+ if name in self.__parameter_dict:
+ self.__parameter_dict[name].value = value
+ else:
+ raise UndefinedParameterError(name)
+
+ # -------------------------------------------------------------------------
+
+ def get_parameters(self):
+ """
+ Return the current parameter values of the form.
+
+ @return: Current parameter values.
+ @rtype: dict
+ """
+
+ result = {}
+ for parameter in self.__parameter_dict.itervalues():
+ result[parameter.name] = parameter.value
+ return result
+
+
+ # -------------------------------------------------------------------------
# Open (activate) the form
# -------------------------------------------------------------------------
- def execute_open(self, parameters, modal):
+ def execute_open(self, modal):
- self._parameters = parameters
-
assert gDebug(4, "Processing activation trigger")
self.processTrigger('On-Activation')
@@ -430,33 +477,23 @@
# -------------------------------------------------------------------------
def __trigger_get_parameter(self, parameter):
- """
- Return the value of the given parameter.
- @param parameter: Name of the parameter
- @return: Parameter value.
- """
- # FIXME: Should allow access via parameter object.
- return self.getParameter(parameter)
+ assert gDebug(1, "DEPRECATED: getParameter trigger function")
+ if parameter in self.__parameter_dict:
+ return self.__parameter_dict[parameter].value
+ else:
+ raise UndefinedParameterError(parameter)
# -------------------------------------------------------------------------
def __trigger_set_parameter(self, parameter, value):
- """
- Set a parameter.
- @param parameter: the (case-insensitive) name of the parameter to be
set
- @value: new value for parameter
- """
- # FIXME: Should allow access via parameter object
- # If _parameters are not yet set, fall back to the parameter dictionary
- # of the GFInstance. This can only happen in ON-STARTUP triggers.
- if not hasattr (self, '_parameters'):
- self._parameters = self._instance._parameters
+ assert gDebug(1, "DEPRECATED: setParameter trigger function")
+ if parameter in self.__parameter_dict:
+ self.__parameter_dict[parameter].value = value
+ else:
+ raise UndefinedParameterError(parameter)
- # _parameters is a CaselessDict, so case of parameter doesn't matter
- self._parameters [parameter] = value
-
# -------------------------------------------------------------------------
def __trigger_set_title(self, title):
@@ -529,7 +566,8 @@
# -------------------------------------------------------------------------
- def __trigger_activate_dialog (self, dialogName, parameters={}, modal=0):
+ def __trigger_activate_dialog (self, dialogName, parameters=None,
+ modal=False):
"""
Launches a standard or a custom dialog.
@param dialogName: name of the dialog to be displayed
@@ -538,8 +576,12 @@
@param modal: whether the dialog should be modal or not
@return: None
"""
- self._instance._formsDictionary[dialogName].execute_open(parameters,
- modal)
+ form = self._instance._formsDictionary[dialogName]
+ if parameters is not None:
+ form.set_parameters(parameters)
+ form.execute_open(modal)
+ if modal and parameters is not None:
+ parameters.update(form.get_parameters())
# -------------------------------------------------------------------------
@@ -568,7 +610,6 @@
1,
parameters=parameters)
instance.addFormFromFile(fileName)
- #instance.addDialogs ()
instance.activate()
# -------------------------------------------------------------------------
@@ -597,42 +638,6 @@
rep_engine.processReport(reportFile, parameters=parameters, **parms)
- # -------------------------------------------------------------------------
- # Get the value of a parameter
- # -------------------------------------------------------------------------
-
- def getParameter(self, parameter):
- """
- Gets a user parameter. If parameter is not specified, pulls default
- value.
-
- @param parameter: case-insensitive name of parameter
- @return: parameter value or None
- """
-
- # If _parameters are not yet set, fall back to the parameter dictionary
- # of the GFInstance. This can only happen in ON-STARTUP triggers.
- if not hasattr(self, '_parameters'):
- self._parameters = self._instance._parameters
-
- try:
- # _parameters is a CaselessDict, so the case of parameter doesn't
- # matter.
- return self._parameters[parameter]
-
- except KeyError:
- rv = None
- pn = parameter.lower()
-
- for child in self._children:
- if isinstance(child, GFParameter) and child._name == pn:
- rv = getattr(child, 'default', None)
- self._parameters [pn] = rv
- break
-
- return rv
-
-
# =========================================================================
# Events
#
Modified: trunk/gnue-forms/src/GFInstance.py
===================================================================
--- trunk/gnue-forms/src/GFInstance.py 2006-11-29 16:27:47 UTC (rev 9087)
+++ trunk/gnue-forms/src/GFInstance.py 2006-11-29 20:23:05 UTC (rev 9088)
@@ -140,13 +140,11 @@
self._disableSplash = disableSplash # Disable splashscreen
# The parameters passed to the GBaseApp instance
- if parameters is None:
- self._parameters = CaselessDict.CaselessDict()
- else:
- self._parameters = parameters
- self._formsDictionary = {} # A dictionary containing all the
- # forms loaded from a file
+ self.__parameters = parameters
+ # A dictionary containing all the forms loaded from a file
+ self._formsDictionary = {}
+
self._parentContainer = parentContainer
# Load user customized key mappings
@@ -292,6 +290,11 @@
# Initialize all the forms loaded into memory
assert gDebug(4, "Initializing form objects")
+ # Set the parameters for the main form now so they are available in the
+ # ON-STARTUP trigger, which is called in phaseInit.
+ if self.__parameters is not None:
+ main_form.set_parameters(self.__parameters)
+
for formObject in self._formsDictionary.values():
if getattr(self._uiinstance, '__rearrange_boxes__', False):
for page in formObject.findChildrenOfType('GFPage', False,
@@ -306,10 +309,10 @@
# execution stops here until the dialog get's closed. So do *not*
# enter another main loop
assert gDebug(4, "Activating main form as dialog")
- main_form.execute_open(self._parameters, True)
+ main_form.execute_open(True)
else:
assert gDebug(4, "Activating main form")
- main_form.execute_open(self._parameters, False)
+ main_form.execute_open(False)
assert gDebug(4, "Startup complete")
assert gDebug(4, "Entering main loop")
self._uiinstance.mainLoop()
Modified: trunk/gnue-forms/src/GFObjects/GFParameter.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFParameter.py 2006-11-29 16:27:47 UTC
(rev 9087)
+++ trunk/gnue-forms/src/GFObjects/GFParameter.py 2006-11-29 20:23:05 UTC
(rev 9088)
@@ -21,51 +21,110 @@
#
# $Id$
"""
-Parameter support
+Parameter support.
"""
+__all__ = [
+ # Object tree classes
+ 'GFParameter', 'GFCParam',
+
+ # Exceptions
+ 'ParameterValueError', 'UndefinedParameterError']
+
+from gnue.common.utils import datatypes
+from gnue.common.apps import errors
from gnue.common.datasources import GConditions
+from gnue.common.definitions import GParser
from gnue.forms.GFObjects.GFObj import GFObj
-from gnue.common.definitions import GParser
-# =============================================================================
-# Exceptions
-# =============================================================================
-class ParameterNotFoundError(GParser.MarkupError):
- def __init__(self, name, cp):
- msg = u_("Parameter '%(name)s' not defined in the form") \
- % {'name': name}
- GParser.MarkupError.__init__(self, msg, cp._url, cp._lineNumber)
-
# =============================================================================
# Wrapper for a single forms parameter
# =============================================================================
class GFParameter(GFObj):
"""
- This object defines the available parameters of a form.
+ A parameter defined in a form.
+
+ Parameters can be used to pass data into forms. Parameters can be used in
+ conditions of datasources. Besides that, trigger code can read and write
+ parameter values arbitarily.
"""
# -------------------------------------------------------------------------
# Constructor
# -------------------------------------------------------------------------
- def __init__(self, parent=None):
+ def __init__(self, parent):
GFObj.__init__(self, parent, 'GFParameter')
+ # Initialize attributes
+ self.datatype = 'text'
+ self.length = None
+ self.scale = None
+ self.default = None
+ # Current value of the parameter
+ self.__value = None
+
+ # Trigger support
+ self._triggerGlobal = True
+
+ self._triggerProperties = {
+ 'value': {
+ 'get': self.__get_value,
+ 'set': self.__set_value}}
+
+
# -------------------------------------------------------------------------
# Object initialization
# -------------------------------------------------------------------------
def _buildObject(self):
- self._name = self.name.lower()
- return GFObj._buildObject(self)
+ # Convert deprecated attribute "type" into "datatype".
+ if hasattr(self, 'type'):
+ if self.type == 'char':
+ self.datatype = 'text'
+ else:
+ self.datatype = self.type
+ # Set the default value.
+ self.value = self.default
+ return GFObj._buildObject(self)
+
+
+ # -------------------------------------------------------------------------
+ # Read and write parameter value
+ # -------------------------------------------------------------------------
+
+ def __get_value(self):
+
+ return self.__value
+
+ # -------------------------------------------------------------------------
+
+ def __set_value(self, value):
+
+ try:
+ self.__value = datatypes.convert(value, self.datatype, self.length,
+ self.scale)
+ except ValueError, datatypes.ConversionError:
+ raise ParameterValueError(self.name, value)
+
+ # -------------------------------------------------------------------------
+
+ value = property(__get_value, __set_value, None,
+ """
+ Value of the parameter.
+
+ @type: depending on the datatype attribute. If possible, the
+ value is converted on being set.
+ """)
+
+
# =============================================================================
# A parameter for datasource conditions
# =============================================================================
@@ -80,7 +139,7 @@
# Constructor
# -------------------------------------------------------------------------
- def __init__(self, parent=None):
+ def __init__(self, parent):
GConditions.GCParam.__init__(self, parent)
self._type = "GFCParam"
@@ -93,17 +152,16 @@
def __phase_1_init(self):
- self._name = self.name.lower()
self._form = self.findParentOfType('GFForm')
self._parameter = None
for param in self._form._children:
- if isinstance(param, GFParameter) and param._name == self._name:
+ if isinstance(param, GFParameter) and param.name == self.name:
self._parameter = param
break
if not self._parameter:
- raise ParameterNotFoundError (self.name,self)
+ raise UndefinedParameterError(self.name, self)
# -------------------------------------------------------------------------
@@ -112,14 +170,34 @@
def getValue(self):
"""
- Return the value of the parameter. If the parameters' type is 'number'
- the value will be a float, otherwise a string
+ Return the value of the parameter.
"""
- val = self._form.getParameter(self._name)
- if val is None:
- return ""
- elif self._parameter.type == 'number':
- return float(val)
- else:
- return "%s" % val
+ return self._parameter.get()
+
+
+# =============================================================================
+# Exceptions
+# =============================================================================
+
+class ParameterValueError(errors.ApplicationError):
+ """
+ A parameter has been assigned a value that can not be converted into the
+ parameter's datatype.
+ """
+ def __init__(self, name, value):
+ errors.ApplicationError.__init__(self, u_(
+ "Value %(value)r is not valid for parameter '%(name)s'") % {
+ 'name': name,
+ 'value': value})
+
+# =============================================================================
+
+class UndefinedParameterError(GParser.MarkupError):
+ """
+ A parameter referenced in a condition is not defined.
+ """
+ def __init__(self, name, parameter):
+ GParser.MarkupError.__init__(self, u_(
+ "Parameter '%(name)s' not defined in the form") % {'name': name},
+ parameter._url, parameter._lineNumber)
Modified: trunk/gnue-forms/src/GFParser.py
===================================================================
--- trunk/gnue-forms/src/GFParser.py 2006-11-29 16:27:47 UTC (rev 9087)
+++ trunk/gnue-forms/src/GFParser.py 2006-11-29 20:23:05 UTC (rev 9088)
@@ -1182,45 +1182,67 @@
'ParentTags': ('options',),
'Label': u_('Tip'),
'Description': 'TODO' },
- 'parameter': {
+ 'parameter': {
'BaseClass': GFObjects.GFParameter,
'Attributes': {
- 'name': {
- 'Required': True,
- 'Unique': True,
- 'Typecast': GTypecast.name,
- 'Description': 'Unique name of the parameter.' },
- 'required': {
- 'Typecast': GTypecast.boolean,
- 'Default': False,
- 'Description': 'Is it obligatory to provide this parameter '
- 'to run the form?' },
-## 'limited': {
-## 'Typecast': GTypecast.boolean,
-## 'Default': False,
-## 'Description': 'TODO' },
- 'default': {
- 'Typecast': GTypecast.text,
- 'Description': 'Default value of the parameter, if the user '
- 'does not provide a value for it.' },
+ 'name': {
+ 'Label': u_("Name"),
+ 'Description': u_("Unique name of the parameter."),
+ 'Typecast': GTypecast.name,
+ 'Required': True,
+ 'Unique': True},
+ 'datatype': {
+ 'Label': u_("Datatype"),
+ 'Description': u_("The type of data for this parameter."),
+ 'Typecast': GTypecast.name,
+ 'ValueSet': {
+ 'text': {'Label': u_("Text")},
+ 'number': {'Label': u_('Number')},
+ 'date': {'Label': u_("Date")},
+ 'time': {'Label': u_("Time")},
+ 'datetime': {'Label': u_("Date and time")},
+ 'boolean': {'Label': u_('Boolean')}},
+ 'Default': 'text'},
+ 'length': {
+ 'Label': u_("Length"),
+ 'Description': u_(
+ "Maximum length of data stored in this parameter. Applies "
+ "only to parameters with a datatype of 'string' or "
+ "'number'. For numbers, this is the total number of "
+ "digits, including the fractional digits."),
+ 'Typecast': GTypecast.whole},
+ 'scale': {
+ 'Label': u_("Scale"),
+ 'Description': u_(
+ "Number of fractional digits. Applies only to parameters "
+ "with a datatype of 'number'."),
+ 'Typecast': GTypecast.whole},
+ 'required': {
+ 'Label': u_("Required"),
+ 'Description': u_(
+ "If set, it is obligatory to provide this parameter "
+ "to run the form."),
+ 'Typecast': GTypecast.boolean,
+ 'Default': False},
+ 'default': {
+ 'Label': u_("Default value"),
+ 'Description': u_(
+ "Default value for the parameter, if the user does "
+ "not provide a value for it."),
+ 'Typecast': GTypecast.text},
'description': {
-## 'Required': True,
- 'Typecast': GTypecast.text,
- 'Description': 'Provide some textual information '
- 'to describe the parameter better.' },
-## 'source': {
-## 'Typecast': GTypecast.name,
-## 'Description': 'TODO' },
- 'type': {
- 'Typecast': GTypecast.name,
- 'Default': "char",
- 'Description': 'TODO' } },
+ 'Label': u_("Description"),
+ 'Description': u_(
+ "Description of the parameter for the help text."),
+ 'Typecast': GTypecast.text},
+ 'type': {
+ 'Typecast': GTypecast.name,
+ 'Deprecated': 'Use "datatype" instead.'}},
'ParentTags': ('form','dialog'),
'Label': u_('Parameter'),
'Description': 'A form can get parameters from the outer world '
'or a calling form, and can pass values back too '
- 'in these parameters.' },
- }
+ 'in these parameters.' }}
#
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r9088 - in trunk/gnue-forms/src: . GFObjects,
reinhard <=