commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7719 - in trunk: gnue-common/src/logic gnue-reports/samples/foob


From: btami
Subject: [gnue] r7719 - in trunk: gnue-common/src/logic gnue-reports/samples/foobulations gnue-reports/src/base gnue-reports/src/base/layout
Date: Tue, 12 Jul 2005 09:05:41 -0500 (CDT)

Author: btami
Date: 2005-07-12 09:05:39 -0500 (Tue, 12 Jul 2005)
New Revision: 7719

Modified:
   trunk/gnue-common/src/logic/GTrigger.py
   trunk/gnue-common/src/logic/NamespaceCore.py
   trunk/gnue-reports/samples/foobulations/monthly.grd
   trunk/gnue-reports/src/base/GRDataMapper.py
   trunk/gnue-reports/src/base/GRParser.py
   trunk/gnue-reports/src/base/GRReport.py
   trunk/gnue-reports/src/base/layout/GRDefault.py
   trunk/gnue-reports/src/base/layout/GRField.py
   trunk/gnue-reports/src/base/layout/GRFormula.py
   trunk/gnue-reports/src/base/layout/GRLayout.py
   trunk/gnue-reports/src/base/layout/GRLayoutElement.py
   trunk/gnue-reports/src/base/layout/GRSection.py
Log:
added basic formula support

Modified: trunk/gnue-common/src/logic/GTrigger.py
===================================================================
--- trunk/gnue-common/src/logic/GTrigger.py     2005-07-09 20:48:31 UTC (rev 
7718)
+++ trunk/gnue-common/src/logic/GTrigger.py     2005-07-12 14:05:39 UTC (rev 
7719)
@@ -311,7 +311,7 @@
           # TODO: do we need to call "updateNamespace" here?
           #   function.updateNamespace()
           try:
-            function(self)
+            return function(self)
           except AbortRequest:
             if not ignoreAbort:
               raise

Modified: trunk/gnue-common/src/logic/NamespaceCore.py
===================================================================
--- trunk/gnue-common/src/logic/NamespaceCore.py        2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-common/src/logic/NamespaceCore.py        2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -74,7 +74,6 @@
   #
   def constructTriggerObject(self, gobjObject, triggerParent=None):
     triggerObject = None
-
     # Some items in a GObj tree may not be GObj based (GContent for instance)
 
     if isinstance(gobjObject,GObj) and hasattr(gobjObject,'name'):
@@ -117,15 +116,8 @@
 
       # Process the children of this Gobj
       if len(gobjObject._children):
-        for child in gobjObject._children:
-          object = self.constructTriggerObject(child, triggerObject)
+        self.addChildNames(gobjObject._children, triggerObject)
 
-          # Add this objects children to it's namespace by their name
-          if object:
-            if child.name is not None:
-              if child.name [:2] != '__':
-                triggerObject.__dict__[child.name] = object
-
       #
       # populate the GObj's _localTriggerNamespace
       localNamespace = {'self':triggerObject}
@@ -134,6 +126,21 @@
 
     return triggerObject
 
+  def addChildNames(self, children, triggerObject):
+        for child in children:
+          object = self.constructTriggerObject(child, triggerObject)
+
+          # Add this objects children to it's namespace by their name
+          if object:
+            if child.name is not None:
+              # skip on GRPassThru objects
+              if child.name [:2] != '__':
+                triggerObject.__dict__[child.name] = object
+              else:
+                if len(child._children):
+                  self.addChildNames(child._children, triggerObject)
+    
+
 #
 # NamespaceElement
 #

Modified: trunk/gnue-reports/samples/foobulations/monthly.grd
===================================================================
--- trunk/gnue-reports/samples/foobulations/monthly.grd 2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/samples/foobulations/monthly.grd 2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -25,6 +25,10 @@
 
     <out:reportTitle>Monthly Accounting Foobulation Report</out:reportTitle>
 
+    <trigger name="myFoobs" type="NAMED"><![CDATA[
+return int(details.foobs.get())+2
+]]></trigger>
+
     <out:section break="page">
       <out:sectionTitle><param name="subtitle"/></out:sectionTitle>
       <out:table width="100%">
@@ -32,6 +36,7 @@
           <out:colhead width="30">Name</out:colhead>
           <out:colhead width="22" align="center">Date</out:colhead>
           <out:colhead width="10" align="right">Foobs</out:colhead>
+          <out:colhead width="10" align="right">Formula</out:colhead>
         </out:tablehead>
 
         <section source="dtsFoo" name="nameBreak">
@@ -44,15 +49,20 @@
            <section name="details">
              <trigger name="foo1" type="pre-section">
                print "entering details"
+               print "name=",nameBreak.name
              </trigger>
              <trigger name="foo1" type="post-section">
                print "exiting details"
              </trigger>
+             <trigger name="bar" type="on-process">
+               print "foobs in on-process", details.foobs
+             </trigger>
              <out:row>
                 <firstrow><out:col><field name="name" 
section="nameBreak"/></out:col></firstrow>
                 <notfirstrow><out:col/></notfirstrow>
                 <out:col align="center"><field name="foodate" 
format="%m/%d/%Y"/></out:col>
                 <out:col align="right"><field name="foobs"/></out:col>
+                <out:col align="right"><formula name="adate"><trigger 
type="On-Process" src="myFoobs"/></formula></out:col>
             </out:row>
           </section>
           <out:row type="subtotal" level="2">

Modified: trunk/gnue-reports/src/base/GRDataMapper.py
===================================================================
--- trunk/gnue-reports/src/base/GRDataMapper.py 2005-07-09 20:48:31 UTC (rev 
7718)
+++ trunk/gnue-reports/src/base/GRDataMapper.py 2005-07-12 14:05:39 UTC (rev 
7719)
@@ -54,6 +54,8 @@
     self.sections = []
     self.fields = {}
     self.summaries = {}
+    self.formulas = {}
+    self.formulaObjects = {}
     self._fieldsOld = {}
     self.toplevel = 0   # Is this the first section to use a datasource
     self.initial = 1    # Are we in an initial run in which we have no history?
@@ -95,7 +97,6 @@
   def addField(self, name):
     self.fields[name] = ""
 
-
   #
   #  Add a summary
   #
@@ -114,7 +115,15 @@
     except KeyError:
       pass
 
+  #
+  #  Add a formula
+  #
+  def addFormula(self, name, object):
+    self.formulas[name] = ""
+    self.formulaObjects[name] = object
 
+
+
   #
   #  Get a field's current value
   #
@@ -132,6 +141,12 @@
       return "%s" % val
 
   #
+  #  Get a formula's current value
+  #
+  def getFormula(self, name, format):
+    return GDataFormatter.applyFormatting(self.formulas[name], format)
+
+  #
   #  Add a section
   #
   def addChildSection(self, mapper):
@@ -288,14 +303,18 @@
     self.sources.getDataSource(self.sectionMap[section].source) \
           .referenceField(field)
 
-
   def addSummaryToSection(self, function, section, field):
 
     self.sectionMap[section].addSummary(function, field)
     self.sources.getDataSource(self.sectionMap[section].source) \
           .referenceField(field)
 
+  def addFormulaToSection(self, section, name, object):
+    self.sectionMap[section].addFormula(name, object)
+#    self.sources.getDataSource(self.sectionMap[section].source) \
+#          .referenceField(field)
 
+
   #
   #
   #
@@ -375,6 +394,10 @@
         for field in s.fields.keys():
           s.fields[field] = recordset.getField(field)
 
+        #   and run formula triggers
+        for formula in s.formulas.keys():
+          s.formulas[formula] = 
s.formulaObjects[formula].processTrigger('On-Process')
+
         # ... and save any new summary data
         if s._clearOnNextSet:
           s.clearSummaries()

Modified: trunk/gnue-reports/src/base/GRParser.py
===================================================================
--- trunk/gnue-reports/src/base/GRParser.py     2005-07-09 20:48:31 UTC (rev 
7718)
+++ trunk/gnue-reports/src/base/GRParser.py     2005-07-12 14:05:39 UTC (rev 
7719)
@@ -237,6 +237,17 @@
                'Typecast': GTypecast.name } },
          'ParentTags':  ('layout',) },
 
+      'formula':         {
+         'BaseClass': GRLayout.GRFormula,
+         'Attributes': {
+            'name':        {
+               'Typecast': GTypecast.name },
+            'section':     {
+               'Typecast': GTypecast.name },
+            'format':      {
+               'Typecast': GTypecast.name } },
+         'ParentTags':  ('layout',) },
+
       'param':         {
          'BaseClass': GRLayout.GRParam,
          'Attributes': {

Modified: trunk/gnue-reports/src/base/GRReport.py
===================================================================
--- trunk/gnue-reports/src/base/GRReport.py     2005-07-09 20:48:31 UTC (rev 
7718)
+++ trunk/gnue-reports/src/base/GRReport.py     2005-07-12 14:05:39 UTC (rev 
7719)
@@ -33,6 +33,7 @@
 from gnue.common.definitions.GRootObj import GRootObj
 from gnue.common.apps import GDebug
 from gnue.common.logic.GTrigger import GTriggerExtension
+from gnue.common.datasources import ConnectionTriggerObj
 
 import sys
 import GRParser
@@ -48,7 +49,10 @@
     GTriggerExtension.__init__(self)
     GRootObj.__init__(self, 'report', GRParser.getXMLelements, GRParser)
     GObj.__init__(self, parent, type='GRReport')
+    
     self._connections = None  # This will be set by GRParser.loadFile
+    self.name="__main__"
+    
     self._inits = (self.initialize,self.postInit)
     self._datasourceDictionary = {}
     self._parameters = None
@@ -62,13 +66,14 @@
     self._validTriggers = { 'ON-STARTUP':     'On-Startup',
                             'ON-EXIT':        'On-Exit' }
 
-    #self._triggerGlobal = 1
+    self._triggerGlobal = True # Put this object into the global namespace by 
it's name
     self._triggerFunctions = {}
     self._app = None
 
 
   def initialize(self):
     self.initTriggerSystem()
+    ConnectionTriggerObj.addAllConnections(self._connections, 
self._triggerNamespaceTree)
     self._triggerns.update(self._triggerNamespaceTree._globalNamespace)
 
   def postInit(self):

Modified: trunk/gnue-reports/src/base/layout/GRDefault.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRDefault.py     2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRDefault.py     2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -62,6 +62,3 @@
   def process(self, dest, mapper, isfirst, islast, firstSection, nextSection):
     return nextSection
 
-  def process(self, dest, mapper, isfirst, islast, firstSection, nextSection):
-    return nextSection
-

Modified: trunk/gnue-reports/src/base/layout/GRField.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRField.py       2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRField.py       2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -47,9 +47,22 @@
     self._section = None
     self.format = None
 
+    self._triggerFunctions={'get':{'function':self.getValue}}
+    self._triggerGet = self.getValue
+    self._triggerProperties = {'value':{'get':self.getValue }}
+      
+
   def process(self, dest, mapper, isfirst, islast, firstSection, nextSection):
     ## structuralComment(dest,"<!-- [field:%s] -->" % self.name)
     dest.write (string.replace(saxutils.escape("%s" % 
self._mymapper.getField(self.name,
                                               self.format)), 
'\r','').encode(gConfig('textEncoding'),'replace'))
     ## structuralComment(dest,"<!-- [/field:%s] -->" % self.name)
     return nextSection
+
+
+  ####################################################################
+  #
+  # Trigger functions
+  #
+  def getValue(self):
+    return self._mymapper.getField(self.name, self.format)

Modified: trunk/gnue-reports/src/base/layout/GRFormula.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRFormula.py     2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRFormula.py     2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -31,7 +31,6 @@
 from gnue.common.definitions.GObjects import GObj
 from gnue.common.apps import GDebug
 from gnue.common.datasources import GConditions
-from gnue.common.logic.GTrigger import GTrigger,GTriggerExtension
 
 import string
 from xml.sax import saxutils
@@ -47,9 +46,14 @@
     GRLayoutElement.__init__(self, parent, 'GRFormula')
     self.section = None
     self.format = None
-    self._inits = [self.init]
     self._value = ""
 
+    self._validTriggers = {'ON-PROCESS': 'On-Process'}
+
+    self._triggerFunctions={'get':{'function':self.getValue}}
+    self._triggerGet = self.getValue
+    self._triggerProperties = {'value':{'get':self.getValue }}
+
   def _buildObject(self):
     if self.section:
       self._section = string.lower(self.section)
@@ -58,25 +62,16 @@
 
     return GRLayoutElement._buildObject(self)
 
-  def init(self):
-  
-#    self._validTriggers = {'__FORMULA__': '__FORMULA__'}
-#    self._mymapper.addField(self.name)
 
-    code = ""
-    for f in self.getChildrenAsContent().code.split('\n'):
-      if f.strip()[:1] != '#':
-        code += f + ' '
-    self._code = code
-
   def process(self, dest, mapper, isfirst, islast, firstSection, nextSection):
     ## structuralComment(dest,"<!-- [formula:%s] -->" % (self.section))
-    ##self._mymapper.setField(self._field, self.function
-#    dest.write (self._mymapper.getSummary(self._field, self.function, 
self.format))
+    dest.write (self._mymapper.getFormula(self.name, self.format))
     ## structuralComment(dest,"<!-- [/formula] -->")
     return nextSection
-    
 
-
-
-      
+  ####################################################################
+  #
+  # Trigger functions
+  #
+  def getValue(self):
+    return self._mymapper.getFormula(self.name, self.format)

Modified: trunk/gnue-reports/src/base/layout/GRLayout.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRLayout.py      2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRLayout.py      2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -37,6 +37,7 @@
 from GRLayoutElement import GRLayoutElement
 from GRField import GRField
 from GRSumm import GRSumm
+from GRFormula import GRFormula
 
 import string
 from xml.sax import saxutils
@@ -49,9 +50,11 @@
 class GRLayout (GObj):
   def __init__(self, parent):
     GObj.__init__(self, parent, type='GRLayout')
+    self.name = "__%s__" % self
     self._inits = (self.initialize,)
     self.suppressGNUeTags = 0
 
+
   def initialize(self):
     # Find the xml namespace in use by any child passthru objects
     # If there is more than one object attached to a layout
@@ -67,6 +70,7 @@
       section = GRSection(self)
       section._children = temp
       section._buildObject()
+      
     elif len(self._children) == 0:
       raise GRExceptions.NoLayoutDefined, \
         "The layout section does not contain any instructions. What do I do?"
@@ -178,7 +182,25 @@
         self._mapper.addSummaryToSection(object.function,
                                  object._section, object._field)
 
+      elif isinstance(object, GRFormula):
+        if object.section == None:
+          s = object.getParent ().findParentOfType('GRSection')
+        else:
+          sec = string.lower(object.section)
+          s = self._mapper.sectionMap[sec]._object
+        if s == None:
+          raise GRExceptions.SourceOutOfScope, \
+            'Formula "%s" in section "%s" uses out-of-scope source "%s"' \
+                 % (object.name, object.getParent ().name, object._source)
 
+        object._section = s._name
+        object._mymapper = self._mapper.sectionMap[s._name]
+
+        GDebug.printMesg(6,'Mapping formula "%s" to section "%s"' \
+                   % (object.name, object._section))
+        self._mapper.addFormulaToSection(object._section, object.name, object)
+
+
   #
   # Process layout and dump output.
   # self.prepare *must* be called prior to processing

Modified: trunk/gnue-reports/src/base/layout/GRLayoutElement.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRLayoutElement.py       2005-07-09 
20:48:31 UTC (rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRLayoutElement.py       2005-07-12 
14:05:39 UTC (rev 7719)
@@ -42,11 +42,11 @@
 # Any elements contained within a <layout> element
 # inherit GRLayoutElement
 #
-class GRLayoutElement (GObj,GTriggerExtension):
+class GRLayoutElement (GObj, GTriggerExtension):
   def __init__(self, parent=None, type='GRLayoutElement'):
     GTriggerExtension.__init__(self)
     GObj.__init__(self, parent, type=type)
-    self.name = None
+    self.name = "__%s__" % self
     self._source = None
     self._mymapper = None
     self._enabled = 1

Modified: trunk/gnue-reports/src/base/layout/GRSection.py
===================================================================
--- trunk/gnue-reports/src/base/layout/GRSection.py     2005-07-09 20:48:31 UTC 
(rev 7718)
+++ trunk/gnue-reports/src/base/layout/GRSection.py     2005-07-12 14:05:39 UTC 
(rev 7719)
@@ -44,11 +44,15 @@
 
   def __init__(self, parent):
     ContainerElement.__init__(self, parent, 'GRSection')
+
     self._childSections = []
+
     self._validTriggers = {'PRE-SECTION':'Pre-Section',
                            'POST-SECTION':'Post-Section',
                            'ON-PROCESS':'On-Process'}
 
+    self._triggerGlobal = True
+
   def _buildObject(self):
     if not hasattr(self,'name') or self.name == None:
       self._name = id(self)





reply via email to

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