From d0ef48e692e4499fc46563f24dcbd86bcb76ff9a Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 9 Jul 2012 11:23:12 +0200 Subject: [PATCH] provide work report view 'work.html' using its context object for the 'tasks' query criteria, use this instead of 'results.html' --- expert/browser/report.py | 9 +++++++-- organize/work/README.txt | 33 +++++++++++++++------------------ organize/work/configure.zcml | 24 ++++++++++++++++-------- organize/work/report.py | 20 +++++++++++++++++--- 4 files changed, 55 insertions(+), 31 deletions(-) diff --git a/expert/browser/report.py b/expert/browser/report.py index ccfc26a..2890dc8 100644 --- a/expert/browser/report.py +++ b/expert/browser/report.py @@ -134,7 +134,7 @@ class ResultsView(NodeView): class ResultsConceptView(ConceptView): - """ View on a concept using a report. + """ View on a concept using the results of a report. """ reportName = None # define in subclass if applicable @@ -175,7 +175,7 @@ class ResultsConceptView(ConceptView): return ri def results(self): - return self.reportInstance.getResults(dict(tasks=util.getUidForObject(self.context))) + return self.reportInstance.getResults() @Lazy def displayedColumns(self): @@ -183,3 +183,8 @@ class ResultsConceptView(ConceptView): def getColumnRenderer(self, col): return self.result_macros[col.renderer] + + +class ReportConceptView(ResultsConceptView): + """ View on a concept using a report. + """ diff --git a/organize/work/README.txt b/organize/work/README.txt index 5965094..1e3f88f 100644 --- a/organize/work/README.txt +++ b/organize/work/README.txt @@ -212,25 +212,23 @@ The executable report is a report instance that is an adapter to the ... provides=IReportInstance, ... name='work_report') -The user interface to the report is a report view, the results are presented -in a results view. +The user interface is a ReportConceptView subclass that is directly associated with the task. - >>> from loops.view import Node - >>> reportNode = addAndConfigureObject(home, Node, 'report', - ... title=u'Report', target=workStatement) - >>> from loops.expert.browser.report import ReportView, ResultsView - >>> resultsView = ResultsView(reportNode, TestRequest()) + >>> from loops.organize.work.report import WorkStatementView + >>> reportView = WorkStatementView(task01, TestRequest()) + >>> reportView.nodeView = nodeView - >>> results = resultsView.results()#.getResult() + >>> results = reportView.results() >>> len(list(results)) 1 + >>> for row in results: - ... for col in resultsView.displayedColumns: + ... for col in reportView.displayedColumns: ... print col.getDisplayValue(row), ... print 08/12/28 19:00 20:15 - {'url': '.../home/report/.36', 'title': u'loops Development'} - {'url': '.../home/report/.33', 'title': u'john'} 01:15 00:15 finished + {'url': '.../home/.36', 'title': u'loops Development'} + {'url': '.../home/.33', 'title': u'john'} 01:15 00:15 finished >>> results.totals.data {'effort': 900} @@ -266,18 +264,17 @@ report is available. ... reportType='meeting_minutes') >>> meetingMinutes.assignChild(tEvent, hasReport) -We can now access the report using a results view. +We can now access the report using a corresponding report-based view. - >>> from loops.util import getUidForObject - >>> input = dict(tasks=getUidForObject(ev01)) - >>> resultsView = ResultsView(home, TestRequest(form=input)) - >>> resultsView.virtualTargetObject = meetingMinutes + >>> from loops.organize.work.meeting import MeetingMinutes + >>> reportView = MeetingMinutes(ev01, TestRequest()) + >>> reportView.nodeView = nodeView - >>> results = resultsView.results() + >>> results = reportView.results() >>> len(list(results)) 1 >>> for row in results: - ... for col in resultsView.displayedColumns: + ... for col in reportView.displayedColumns: ... print col.getDisplayValue(row), ... print {'url': 'http://127.0.0.1/loops/views/home/.36', 'title': u'loops Development'} diff --git a/organize/work/configure.zcml b/organize/work/configure.zcml index 4c88e42..562df3f 100644 --- a/organize/work/configure.zcml +++ b/organize/work/configure.zcml @@ -75,10 +75,11 @@ - + @@ -86,10 +87,17 @@ set_schema="loops.expert.report.IReportInstance" /> - + + + diff --git a/organize/work/report.py b/organize/work/report.py index 937bf65..eb41a7a 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -33,13 +33,24 @@ from cybertools.util.date import timeStamp2Date from cybertools.util.format import formatDate from cybertools.util.jeep import Jeep from loops.common import adapted, baseObject +from loops.expert.browser.report import ReportConceptView from loops.expert.field import TargetField, DateField, TextField, UrlField from loops.expert.field import SubReport, SubReportField from loops.expert.report import ReportInstance from loops import util +# reporting views + +class WorkStatementView(ReportConceptView): + + reportName = 'work_statement' + + +# fields + class StateField(Field): + def getDisplayValue(self, row): value = self.getValue(row) return util._(value) @@ -178,9 +189,11 @@ class WorkReportInstance(ReportInstance): rowFactory = WorkRow fields = Jeep((dayFrom, dayTo, tasks, - day, timeStart, timeEnd, task, party, workTitle, #description, + day, timeStart, timeEnd, task, party, workTitle, + #description, duration, effort, state)) + userSettings = (dayFrom, dayTo, party) defaultOutputFields = fields defaultSortCriteria = (day, timeStart,) states = ('done', 'done_x', 'finished') @@ -192,12 +205,13 @@ class WorkReportInstance(ReportInstance): crit = self.context.queryCriteria or [] if not crit and 'tasks' not in form: f = self.fields['tasks'] - tasks = baseObject(self.context).getChildren([self.hasReportPredicate]) + tasks = [self.view.context] tasks = [util.getUidForObject(task) for task in tasks] crit = [LeafQueryCriteria(f.name, f.operator, tasks, f)] for f in self.getAllQueryFields(): if f.name in form: - crit.append(LeafQueryCriteria(f.name, f.operator, form[f.name], f)) + crit.append( + LeafQueryCriteria(f.name, f.operator, form[f.name], f)) return CompoundQueryCriteria(crit) def selectObjects(self, parts):