add computed totals
This commit is contained in:
parent
fa7a07349d
commit
b5bb5ada15
2 changed files with 33 additions and 2 deletions
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue