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):