diff --git a/composer/report/base.py b/composer/report/base.py index fddcdb0..3ca43e1 100644 --- a/composer/report/base.py +++ b/composer/report/base.py @@ -133,6 +133,9 @@ class Report(Template): def getPresentationFormats(self): return [dict(renderer='default', title='Default')] + + def getCategoryFields(self): + return [f for f in self.fields if 'category' in f.executionSteps] class BaseQueryCriteria(Component): diff --git a/composer/report/result.py b/composer/report/result.py index f947ce4..6b010cc 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -53,21 +53,41 @@ class Row(BaseRow): @staticmethod def getContextAttr(obj, attr): return getattr(obj.context, attr) + + def getCategories(self): + return [self.getRawValue(f.__name__) for f in + self.parent.context.fields if 'category' in f.executionSteps] class ResultSet(object): def __init__(self, context, data, rowFactory=Row, - sortCriteria=None, queryCriteria=BaseQueryCriteria()): + sortCriteria=None, queryCriteria=BaseQueryCriteria(), + filterDublicate=False): self.context = context # the report or report instance self.data = data self.rowFactory = rowFactory self.sortCriteria = sortCriteria self.queryCriteria = queryCriteria + self.filterDublicate = filterDublicate self.totals = BaseRow(None, self) + + def filterDublicateRows(self, result): + res = [] + for row in result: + add = True + for r in res: + for f in self.categoryColumns: + if row.getRawValue(f.__name__) == r.getRawValue(f.__name__): + add = False + if add: + res.append(row) + return res def getResult(self): result = [self.rowFactory(item, self) for item in self.data] + if self.filterDublicate: + result = [row for row in self.filterDublicateRows(result)] result = [row for row in result if self.queryCriteria.check(row)] if self.sortCriteria: result.sort(key=lambda x: [f.getSortValue(x) for f in self.sortCriteria]) @@ -82,3 +102,7 @@ class ResultSet(object): def displayedColumns(self): return self.context.getActiveOutputFields() + @Lazy + def categoryColumns(self): + return self.context.getCategoryFields() +