add: subTotals support

This commit is contained in:
hplattner 2012-06-26 15:20:26 +02:00
parent 1a58bb60c6
commit 0efbc5db1b
3 changed files with 42 additions and 1 deletions

View file

@ -141,6 +141,12 @@ class Report(Template):
def getTotalsFields(self):
return [f for f in self.fields if 'totals' in f.executionSteps]
def getSubTotalsFields(self):
result = []
for gf in self.getGroupFields():
result.append([f for f in self.fields if gf.name in f.totals])
return result
class BaseQueryCriteria(Component):

View file

@ -78,6 +78,7 @@ class Field(Component):
outputWith = ()
style = TableCellStyle()
cssClass = ''
totals = []
executionSteps = ['query', 'sort', 'output'] # , 'totals']

View file

@ -77,6 +77,16 @@ class GroupHeaderRow(BaseRow):
return fields
class SubTotalsRow(BaseRow):
def getRawValue(self, attr):
return self.data.get(attr, u'')
@Lazy
def displayedColumns(self):
return self.parent.context.getActiveOutputFields()
class ResultSet(object):
def __init__(self, context, data,
@ -104,6 +114,12 @@ class ResultSet(object):
headerRow.headerColumns.append(headerColumn)
return headerRow
def getSubTotalsRow(self, row, columns, values):
subTotalsRow = SubTotalsRow(None, self)
for idx, c in enumerate(columns):
subTotalsRow.data[c.name] = values[idx]
return subTotalsRow
def getResult(self):
result = [self.rowFactory(item, self) for item in self.data]
result = [row for row in result if self.queryCriteria.check(row)]
@ -113,13 +129,26 @@ class ResultSet(object):
if self.groupColumns:
res = []
groupValues = [None for f in self.groupColumns]
subTotals = [[0.0 for f in stc] for stc in self.subTotalsColumns]
for row in result:
subTotalsRows = []
headerRows = []
for idx, f in enumerate(self.groupColumns):
value = f.getRawValue(row)
if value != groupValues[idx]:
groupValues[idx] = value
res.append(self.getHeaderRow(row, (f,) + f.outputWith))
headerRows.append(self.getHeaderRow(row, (f,) + f.outputWith))
subTotalsRows.append(self.getSubTotalsRow(
row, self.subTotalsColumns[idx], subTotals[idx]))
subTotals[idx] = [0.0 for f in self.subTotalsColumns[idx]]
for subTotalsRow in reversed(subTotalsRows):
res.append(subTotalsRow)
for headerRow in headerRows:
res.append(headerRow)
res.append(row)
for idx, sc in enumerate(self.subTotalsColumns):
for idx2, f in enumerate(sc):
subTotals[idx][idx2] += f.getValue(row)
result = res
if self.limits:
start, stop = self.limits
@ -147,3 +176,8 @@ class ResultSet(object):
@Lazy
def groupColumns(self):
return self.context.getGroupFields()
@Lazy
def subTotalsColumns(self):
return self.context.getSubTotalsFields()