provide work report view 'work.html' using its context object for the 'tasks' query criteria, use this instead of 'results.html'

This commit is contained in:
Helmut Merz 2012-07-09 11:23:12 +02:00
parent b2a755b3fc
commit d0ef48e692
4 changed files with 55 additions and 31 deletions

View file

@ -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.
"""

View file

@ -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'}

View file

@ -75,8 +75,9 @@
<!-- reporting -->
<zope:adapter factory="loops.organize.work.report.WorkReportInstance"
<zope:adapter
name="work_report"
factory="loops.organize.work.report.WorkReportInstance"
provides="loops.expert.report.IReportInstance"
trusted="True" />
<zope:class class="loops.organize.work.report.WorkReportInstance">
@ -86,8 +87,15 @@
set_schema="loops.expert.report.IReportInstance" />
</zope:class>
<zope:adapter factory="loops.organize.work.report.MeetingMinutes"
<browser:page
name="work.html"
for="loops.organize.interfaces.ITask"
class="loops.organize.work.report.WorkStatementView"
permission="zope.View" />
<zope:adapter
name="meeting_minutes"
factory="loops.organize.work.report.MeetingMinutes"
provides="loops.expert.report.IReportInstance"
trusted="True" />
<zope:class class="loops.organize.work.report.MeetingMinutes">

View file

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