fix: subTotalsRow calculation
This commit is contained in:
parent
b0354c4435
commit
48fbacf2bc
3 changed files with 29 additions and 16 deletions
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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 = []
|
||||||
|
|
|
@ -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,16 +151,14 @@ 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:
|
subTotalsRows.append(
|
||||||
outputColumns = self.getOutputColumnsForField(f)
|
self.getSubTotalsRow(f,
|
||||||
subTotalsRows.append(
|
lastRow,
|
||||||
self.getSubTotalsRow(idx,
|
self.subTotalsColumns[idx],
|
||||||
lastRow,
|
subTotals[idx]
|
||||||
self.subTotalsColumns[idx],
|
))
|
||||||
subTotals[idx],
|
subTotals[idx] = [0.0 for f in self.subTotalsColumns[idx]]
|
||||||
outputColumns))
|
|
||||||
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)
|
||||||
for headerRow in headerRows:
|
for headerRow in headerRows:
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue