[Top][All Lists]
[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7719 - in trunk: gnue-common/src/logic gnue-reports/samples/foobulations gnue-reports/src/base gnue-reports/src/base/layout,
btami <=