commit-gnue
[Top][All Lists]
Advanced

[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.' }}
 
 
     #





reply via email to

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