From 48fbacf2bc0d8b6aa520417a5041c606d9a96317 Mon Sep 17 00:00:00 2001 From: hplattner Date: Fri, 6 Jul 2012 11:37:37 +0200 Subject: [PATCH] fix: subTotalsRow calculation --- composer/report/base.py | 6 ++++++ composer/report/field.py | 1 + composer/report/result.py | 38 ++++++++++++++++++++++---------------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/composer/report/base.py b/composer/report/base.py index 53fb4f4..25c8242 100644 --- a/composer/report/base.py +++ b/composer/report/base.py @@ -150,6 +150,12 @@ class Report(Template): result.append([f for f in self.fields if gf.name in f.totals]) 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): return [f for f in self.fields if f.name == field.output] diff --git a/composer/report/field.py b/composer/report/field.py index c06fc9a..ac9d3e3 100644 --- a/composer/report/field.py +++ b/composer/report/field.py @@ -76,6 +76,7 @@ class Field(Component): operator = 'in' output = None outputWith = () + totalsDescription = None style = TableCellStyle() cssClass = '' totals = [] diff --git a/composer/report/result.py b/composer/report/result.py index 0bf3901..34db04e 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -34,6 +34,7 @@ class BaseRow(object): self.parent = parent self.data = {} self.sequenceNumber = 0 + self.cssClass = '' def getRawValue(self, attr): return self.data.get(attr) @@ -118,13 +119,17 @@ class ResultSet(object): headerRow.headerColumns.append(headerColumn) return headerRow - def getSubTotalsRow(self, idx, row, columns, values, dcolumns): + def getSubTotalsRow(self, gf, row, columns, values): subTotalsRow = SubTotalsRow(None, self) + subTotalsRow.cssClass = 'subTotalsRow' for idx, c in enumerate(columns): subTotalsRow.data[c.name] = values[idx] - if idx > 1: - for c in dcolumns: - subTotalsRow.data[c.output] = u'SUMME: ' + c.getRawValue(row) + if gf in self.subTotalsGroupColumns: + if gf.totalsDescription is None: + subTotalsRow.data[gf.output] = u'SUMME: ' + gf.getRawValue(row) + else: + subTotalsRow.data[gf.totalsDescription.output] = u'SUMME: ' + \ + gf.totalsDescription.getRawValue(row) return subTotalsRow def getResult(self): @@ -139,8 +144,6 @@ class ResultSet(object): subTotals = [[0.0 for f in stc] for stc in self.subTotalsColumns] lastRow = None for row in result: - if lastRow is None: - lastRow = row subTotalsRows = [] headerRows = [] for idx, f in enumerate(self.groupColumns): @@ -148,16 +151,14 @@ class ResultSet(object): if value != groupValues[idx]: groupValues[idx] = value headerRows.append(self.getHeaderRow(row, (f,) + f.outputWith)) - outputColumns = f.outputWith - if not outputColumns: - outputColumns = self.getOutputColumnsForField(f) - subTotalsRows.append( - self.getSubTotalsRow(idx, - lastRow, - self.subTotalsColumns[idx], - subTotals[idx], - outputColumns)) - subTotals[idx] = [0.0 for f in self.subTotalsColumns[idx]] + if lastRow is not None: + subTotalsRows.append( + self.getSubTotalsRow(f, + lastRow, + 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: @@ -199,6 +200,11 @@ class ResultSet(object): def subTotalsColumns(self): return self.context.getSubTotalsFields() + @Lazy + def subTotalsGroupColumns(self): + return self.context.getSubTotalsGroupFields() + + def getOutputColumnsForField(self, f): return self.context.getOutputFieldsForField(f)