add computed totals

This commit is contained in:
hplattner 2012-04-13 09:52:18 +02:00
parent fa7a07349d
commit b5bb5ada15
2 changed files with 33 additions and 2 deletions

View file

@ -136,6 +136,9 @@ class Report(Template):
def getGroupFields(self): def getGroupFields(self):
return [f for f in self.fields if 'group' in f.executionSteps] return [f for f in self.fields if 'group' in f.executionSteps]
def getTotalsFields(self):
return [f for f in self.fields if 'totals' in f.executionSteps]
class BaseQueryCriteria(Component): class BaseQueryCriteria(Component):

View file

@ -76,16 +76,29 @@ class GroupHeaderRow(BaseRow):
if f.name == col.name: if f.name == col.name:
fields[idx] = col fields[idx] = col
return fields return fields
class TotalsRow(BaseRow):
def getRawValue(self, attr):
return self.data.get(attr, u'')
@Lazy
def displayedColumns(self):
return self.parent.context.getActiveOutputFields()
class ResultSet(object): class ResultSet(object):
def __init__(self, context, data, rowFactory=Row, headerRowFactory=GroupHeaderRow, def __init__(self, context, data, rowFactory=Row, headerRowFactory=GroupHeaderRow,
sortCriteria=None, queryCriteria=BaseQueryCriteria()): totalsRowFactory=TotalsRow, sortCriteria=None,
queryCriteria=BaseQueryCriteria()):
self.context = context # the report or report instance self.context = context # the report or report instance
self.data = data self.data = data
self.rowFactory = rowFactory self.rowFactory = rowFactory
self.headerRowFactory = headerRowFactory self.headerRowFactory = headerRowFactory
self.totalsRowFactory = totalsRowFactory
self.sortCriteria = sortCriteria self.sortCriteria = sortCriteria
self.queryCriteria = queryCriteria self.queryCriteria = queryCriteria
self.totals = BaseRow(None, self) self.totals = BaseRow(None, self)
@ -100,12 +113,23 @@ class ResultSet(object):
headerColumn.__name__ = c.output headerColumn.__name__ = c.output
headerRow.headerColumns.append(headerColumn) headerRow.headerColumns.append(headerColumn)
return headerRow return headerRow
def getTotalsRow(self, result, columns):
totalsRow = self.totalsRowFactory(None, self)
for c in columns:
totalsRow.data[c.name] = 0.00
for row in result:
for c in columns:
totalsRow.data[c.name] = totalsRow.data[c.name] + c.getRawValue(row)
return totalsRow
def getResult(self): def getResult(self):
result = [self.rowFactory(item, self) for item in self.data] result = [self.rowFactory(item, self) for item in self.data]
result = [row for row in result if self.queryCriteria.check(row)] result = [row for row in result if self.queryCriteria.check(row)]
if self.sortCriteria: if self.sortCriteria:
result.sort(key=lambda x: [f.getSortValue(x) for f in self.sortCriteria]) result.sort(key=lambda x: [f.getSortValue(x) for f in self.sortCriteria])
if self.totalsColumns:
self.totals = self.getTotalsRow(result, self.totalsColumns)
if self.groupColumns: if self.groupColumns:
res = [] res = []
groupValues = [None for f in self.groupColumns] groupValues = [None for f in self.groupColumns]
@ -132,3 +156,7 @@ class ResultSet(object):
def groupColumns(self): def groupColumns(self):
return self.context.getGroupFields() return self.context.getGroupFields()
@Lazy
def totalsColumns(self):
return self.context.getTotalsFields()