From 7fafd9dccdaef00ecdc0cf46addc54898200bf73 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Jun 2012 10:51:16 +0200 Subject: [PATCH 1/7] extend row stuff: group fields, 'useRowProperty' attribute handler --- composer/report/result.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/composer/report/result.py b/composer/report/result.py index 1bad061..2d3943f 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -20,13 +20,13 @@ Report result sets and related classes. """ +from copy import copy from zope.cachedescriptors.property import Lazy from cybertools.composer.interfaces import IInstance from cybertools.composer.report.base import BaseQueryCriteria - class BaseRow(object): def __init__(self, context, parent): @@ -35,10 +35,6 @@ class BaseRow(object): self.data = {} self.sequenceNumber = 0 - def xx__getattr__(self, attr): - f = self.parent.context.fields[attr] - return f.getValue(self) - def getRawValue(self, attr): return self.data.get(attr) @@ -54,6 +50,32 @@ class Row(BaseRow): def getContextAttr(obj, attr): return getattr(obj.context, attr) + def getGroupFields(self): + return [self.getRawValue(f.name) for f in + self.parent.context.fields if 'group' in f.executionSteps] + + @Lazy + def displayedColumns(self): + return self.parent.context.getActiveOutputFields() + + def useRowProperty(self, attr): + return getattr(self, attr) + + +class GroupHeaderRow(BaseRow): + + def getRawValue(self, attr): + return self.data.get(attr, u'') + + @Lazy + def displayedColumns(self): + fields = self.parent.context.getActiveOutputFields() + for col in self.headerColumns: + for idx, f in enumerate(fields): + if f.name == col.name: + fields[idx] = col + return fields + class ResultSet(object): From bdb58534dfcd670052f898e088997ec4277ca319 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Jun 2012 10:53:18 +0200 Subject: [PATCH 2/7] formal clean-up: add lines between methods, remove excess spaces --- composer/report/result.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/composer/report/result.py b/composer/report/result.py index a60d553..29d90be 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -51,12 +51,13 @@ class Row(BaseRow): return getattr(obj.context, attr) def getGroupFields(self): - return [self.getRawValue(f.name) for f in + return [self.getRawValue(f.name) for f in self.parent.context.fields if 'group' in f.executionSteps] + @Lazy def displayedColumns(self): return self.parent.context.getActiveOutputFields() - + def useRowProperty(self, attr): return getattr(self, attr) @@ -65,7 +66,7 @@ class GroupHeaderRow(BaseRow): def getRawValue(self, attr): return self.data.get(attr, u'') - + @Lazy def displayedColumns(self): fields = self.parent.context.getActiveOutputFields() From 0c2be1bcab1bc4bb072d658fa37c317f38883e71 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Jun 2012 17:51:04 +0200 Subject: [PATCH 3/7] tolerate missing user name --- tracking/browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking/browser.py b/tracking/browser.py index 69e8549..16b84a5 100644 --- a/tracking/browser.py +++ b/tracking/browser.py @@ -95,7 +95,7 @@ class TrackView(object): @Lazy def user(self): - return self.metadata['userName'] + return self.metadata.get('userName') or u'' userTitle = user userUrl = None From 0c85ff82df0cf0c72aeec170cb4f9a9ee6eaaf6a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Jun 2012 18:06:14 +0200 Subject: [PATCH 4/7] revert last change --- tracking/browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking/browser.py b/tracking/browser.py index 16b84a5..69e8549 100644 --- a/tracking/browser.py +++ b/tracking/browser.py @@ -95,7 +95,7 @@ class TrackView(object): @Lazy def user(self): - return self.metadata.get('userName') or u'' + return self.metadata['userName'] userTitle = user userUrl = None From a9cecb28ceace1a8132e7c1b0a2ebb68d736e20a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 5 Jun 2012 18:10:16 +0200 Subject: [PATCH 5/7] tolerate error when retrieving user title --- tracking/track.pt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracking/track.pt b/tracking/track.pt index 89831a0..c2ed389 100644 --- a/tracking/track.pt +++ b/tracking/track.pt @@ -19,7 +19,7 @@ + tal:content="view/userTitle|string:???" /> Timestamp: From 976fa5e945381e6e96b28866d2b088d92b89611e Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 18 Jun 2012 09:29:12 +0200 Subject: [PATCH 6/7] reporting: introduce 'limits' parameter as basis for batching and other kinds of reducing report output after selection and sorting --- composer/report/base.py | 1 + composer/report/result.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/composer/report/base.py b/composer/report/base.py index fddcdb0..eb171f7 100644 --- a/composer/report/base.py +++ b/composer/report/base.py @@ -82,6 +82,7 @@ class Report(Template): queryCriteria = None outputFields = () sortCriteria = () + limits = None def __init__(self, name): diff --git a/composer/report/result.py b/composer/report/result.py index 2d3943f..637f17f 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -80,12 +80,14 @@ class GroupHeaderRow(BaseRow): class ResultSet(object): def __init__(self, context, data, rowFactory=Row, - sortCriteria=None, queryCriteria=BaseQueryCriteria()): + sortCriteria=None, queryCriteria=BaseQueryCriteria(), + limits=None): self.context = context # the report or report instance self.data = data self.rowFactory = rowFactory self.sortCriteria = sortCriteria self.queryCriteria = queryCriteria + self.limits = limits self.totals = BaseRow(None, self) def getResult(self): @@ -93,6 +95,9 @@ class ResultSet(object): 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]) + if self.limits: + start, stop = self.limits + result = result[start:stop] for idx, row in enumerate(result): row.sequenceNumber = idx + 1 return result From 3c203fa4952fcf8604954ca5f616df1a31f51bf4 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 18 Jun 2012 15:10:10 +0200 Subject: [PATCH 7/7] fix form layout (width of input fields) --- composer/schema/browser/schema_macros.pt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer/schema/browser/schema_macros.pt b/composer/schema/browser/schema_macros.pt index b66dfaa..fa1b836 100755 --- a/composer/schema/browser/schema_macros.pt +++ b/composer/schema/browser/schema_macros.pt @@ -60,7 +60,7 @@ - ... * @@ -90,7 +90,7 @@ tal:define="width field/width|nothing" tal:attributes="name name; id name; style python: - ('width: %s;;' % (width and str(width)+'px' or '600px')) + + ('width: %s;;' % (width and str(width)+'px' or '555px')) + 'height: 1.5em;;'; value data/?name|string:; xxrequired field/required_js;" /> @@ -119,7 +119,7 @@ tal:define="width field/width|nothing" tal:attributes="name name; style python: - 'width: %s' % (width and str(width)+'px' or '600px'); + 'width: %s' % (width and str(width)+'px' or '555px'); value data/?name|string:" /> @@ -131,7 +131,7 @@ tal:attributes="name name; rows python: height or 3; style python: - 'width: %s' % (width and str(width)+'px' or '600px');" + 'width: %s' % (width and str(width)+'px' or '545px');" tal:content="data/?name|string:"> @@ -178,7 +178,7 @@ tal:attributes="name name; rows python: height or 3; style python: - 'width: %s' % (width and str(width)+'px' or '600px');" + 'width: %s' % (width and str(width)+'px' or '555px');" tal:content="data/?name|string:" />