fix: subTotalsRow calculation

This commit is contained in:
hplattner 2012-07-06 11:37:37 +02:00
parent b0354c4435
commit 48fbacf2bc
3 changed files with 29 additions and 16 deletions

View file

@ -150,6 +150,12 @@ class Report(Template):
result.append([f for f in self.fields if gf.name in f.totals]) result.append([f for f in self.fields if gf.name in f.totals])
return result return result
def getSubTotalsGroupFields(self):
result = []
for f in self.fields:
result.extend(gf for gf in self.getGroupFields() if gf.name in f.totals)
return result
def getOutputFieldsForField(self, field): def getOutputFieldsForField(self, field):
return [f for f in self.fields if f.name == field.output] return [f for f in self.fields if f.name == field.output]

View file

@ -76,6 +76,7 @@ class Field(Component):
operator = 'in' operator = 'in'
output = None output = None
outputWith = () outputWith = ()
totalsDescription = None
style = TableCellStyle() style = TableCellStyle()
cssClass = '' cssClass = ''
totals = [] totals = []

View file

@ -34,6 +34,7 @@ class BaseRow(object):
self.parent = parent self.parent = parent
self.data = {} self.data = {}
self.sequenceNumber = 0 self.sequenceNumber = 0
self.cssClass = ''
def getRawValue(self, attr): def getRawValue(self, attr):
return self.data.get(attr) return self.data.get(attr)
@ -118,13 +119,17 @@ class ResultSet(object):
headerRow.headerColumns.append(headerColumn) headerRow.headerColumns.append(headerColumn)
return headerRow return headerRow
def getSubTotalsRow(self, idx, row, columns, values, dcolumns): def getSubTotalsRow(self, gf, row, columns, values):
subTotalsRow = SubTotalsRow(None, self) subTotalsRow = SubTotalsRow(None, self)
subTotalsRow.cssClass = 'subTotalsRow'
for idx, c in enumerate(columns): for idx, c in enumerate(columns):
subTotalsRow.data[c.name] = values[idx] subTotalsRow.data[c.name] = values[idx]
if idx > 1: if gf in self.subTotalsGroupColumns:
for c in dcolumns: if gf.totalsDescription is None:
subTotalsRow.data[c.output] = u'SUMME: ' + c.getRawValue(row) subTotalsRow.data[gf.output] = u'SUMME: ' + gf.getRawValue(row)
else:
subTotalsRow.data[gf.totalsDescription.output] = u'SUMME: ' + \
gf.totalsDescription.getRawValue(row)
return subTotalsRow return subTotalsRow
def getResult(self): def getResult(self):
@ -139,8 +144,6 @@ class ResultSet(object):
subTotals = [[0.0 for f in stc] for stc in self.subTotalsColumns] subTotals = [[0.0 for f in stc] for stc in self.subTotalsColumns]
lastRow = None lastRow = None
for row in result: for row in result:
if lastRow is None:
lastRow = row
subTotalsRows = [] subTotalsRows = []
headerRows = [] headerRows = []
for idx, f in enumerate(self.groupColumns): for idx, f in enumerate(self.groupColumns):
@ -148,15 +151,13 @@ class ResultSet(object):
if value != groupValues[idx]: if value != groupValues[idx]:
groupValues[idx] = value groupValues[idx] = value
headerRows.append(self.getHeaderRow(row, (f,) + f.outputWith)) headerRows.append(self.getHeaderRow(row, (f,) + f.outputWith))
outputColumns = f.outputWith if lastRow is not None:
if not outputColumns:
outputColumns = self.getOutputColumnsForField(f)
subTotalsRows.append( subTotalsRows.append(
self.getSubTotalsRow(idx, self.getSubTotalsRow(f,
lastRow, lastRow,
self.subTotalsColumns[idx], self.subTotalsColumns[idx],
subTotals[idx], subTotals[idx]
outputColumns)) ))
subTotals[idx] = [0.0 for f in self.subTotalsColumns[idx]] subTotals[idx] = [0.0 for f in self.subTotalsColumns[idx]]
for subTotalsRow in reversed(subTotalsRows): for subTotalsRow in reversed(subTotalsRows):
res.append(subTotalsRow) res.append(subTotalsRow)
@ -199,6 +200,11 @@ class ResultSet(object):
def subTotalsColumns(self): def subTotalsColumns(self):
return self.context.getSubTotalsFields() return self.context.getSubTotalsFields()
@Lazy
def subTotalsGroupColumns(self):
return self.context.getSubTotalsGroupFields()
def getOutputColumnsForField(self, f): def getOutputColumnsForField(self, f):
return self.context.getOutputFieldsForField(f) return self.context.getOutputFieldsForField(f)