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): 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 reportName = None # define in subclass if applicable
@ -175,7 +175,7 @@ class ResultsConceptView(ConceptView):
return ri return ri
def results(self): def results(self):
return self.reportInstance.getResults(dict(tasks=util.getUidForObject(self.context))) return self.reportInstance.getResults()
@Lazy @Lazy
def displayedColumns(self): def displayedColumns(self):
@ -183,3 +183,8 @@ class ResultsConceptView(ConceptView):
def getColumnRenderer(self, col): def getColumnRenderer(self, col):
return self.result_macros[col.renderer] 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, ... provides=IReportInstance,
... name='work_report') ... name='work_report')
The user interface to the report is a report view, the results are presented The user interface is a ReportConceptView subclass that is directly associated with the task.
in a results view.
>>> from loops.view import Node >>> from loops.organize.work.report import WorkStatementView
>>> reportNode = addAndConfigureObject(home, Node, 'report', >>> reportView = WorkStatementView(task01, TestRequest())
... title=u'Report', target=workStatement) >>> reportView.nodeView = nodeView
>>> from loops.expert.browser.report import ReportView, ResultsView
>>> resultsView = ResultsView(reportNode, TestRequest())
>>> results = resultsView.results()#.getResult() >>> results = reportView.results()
>>> len(list(results)) >>> len(list(results))
1 1
>>> for row in results: >>> for row in results:
... for col in resultsView.displayedColumns: ... for col in reportView.displayedColumns:
... print col.getDisplayValue(row), ... print col.getDisplayValue(row),
... print ... print
08/12/28 19:00 20:15 08/12/28 19:00 20:15
{'url': '.../home/report/.36', 'title': u'loops Development'} {'url': '.../home/.36', 'title': u'loops Development'}
{'url': '.../home/report/.33', 'title': u'john'} 01:15 00:15 finished {'url': '.../home/.33', 'title': u'john'} 01:15 00:15 finished
>>> results.totals.data >>> results.totals.data
{'effort': 900} {'effort': 900}
@ -266,18 +264,17 @@ report is available.
... reportType='meeting_minutes') ... reportType='meeting_minutes')
>>> meetingMinutes.assignChild(tEvent, hasReport) >>> 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 >>> from loops.organize.work.meeting import MeetingMinutes
>>> input = dict(tasks=getUidForObject(ev01)) >>> reportView = MeetingMinutes(ev01, TestRequest())
>>> resultsView = ResultsView(home, TestRequest(form=input)) >>> reportView.nodeView = nodeView
>>> resultsView.virtualTargetObject = meetingMinutes
>>> results = resultsView.results() >>> results = reportView.results()
>>> len(list(results)) >>> len(list(results))
1 1
>>> for row in results: >>> for row in results:
... for col in resultsView.displayedColumns: ... for col in reportView.displayedColumns:
... print col.getDisplayValue(row), ... print col.getDisplayValue(row),
... print ... print
{'url': 'http://127.0.0.1/loops/views/home/.36', 'title': u'loops Development'} {'url': 'http://127.0.0.1/loops/views/home/.36', 'title': u'loops Development'}

View file

@ -75,10 +75,11 @@
<!-- reporting --> <!-- reporting -->
<zope:adapter factory="loops.organize.work.report.WorkReportInstance" <zope:adapter
name="work_report" name="work_report"
provides="loops.expert.report.IReportInstance" factory="loops.organize.work.report.WorkReportInstance"
trusted="True" /> provides="loops.expert.report.IReportInstance"
trusted="True" />
<zope:class class="loops.organize.work.report.WorkReportInstance"> <zope:class class="loops.organize.work.report.WorkReportInstance">
<require permission="zope.View" <require permission="zope.View"
interface="loops.expert.report.IReportInstance" /> interface="loops.expert.report.IReportInstance" />
@ -86,10 +87,17 @@
set_schema="loops.expert.report.IReportInstance" /> set_schema="loops.expert.report.IReportInstance" />
</zope:class> </zope:class>
<zope:adapter factory="loops.organize.work.report.MeetingMinutes" <browser:page
name="meeting_minutes" name="work.html"
provides="loops.expert.report.IReportInstance" for="loops.organize.interfaces.ITask"
trusted="True" /> 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"> <zope:class class="loops.organize.work.report.MeetingMinutes">
<require permission="zope.View" <require permission="zope.View"
interface="loops.expert.report.IReportInstance" /> interface="loops.expert.report.IReportInstance" />

View file

@ -33,13 +33,24 @@ from cybertools.util.date import timeStamp2Date
from cybertools.util.format import formatDate from cybertools.util.format import formatDate
from cybertools.util.jeep import Jeep from cybertools.util.jeep import Jeep
from loops.common import adapted, baseObject 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 TargetField, DateField, TextField, UrlField
from loops.expert.field import SubReport, SubReportField from loops.expert.field import SubReport, SubReportField
from loops.expert.report import ReportInstance from loops.expert.report import ReportInstance
from loops import util from loops import util
# reporting views
class WorkStatementView(ReportConceptView):
reportName = 'work_statement'
# fields
class StateField(Field): class StateField(Field):
def getDisplayValue(self, row): def getDisplayValue(self, row):
value = self.getValue(row) value = self.getValue(row)
return util._(value) return util._(value)
@ -178,9 +189,11 @@ class WorkReportInstance(ReportInstance):
rowFactory = WorkRow rowFactory = WorkRow
fields = Jeep((dayFrom, dayTo, tasks, fields = Jeep((dayFrom, dayTo, tasks,
day, timeStart, timeEnd, task, party, workTitle, #description, day, timeStart, timeEnd, task, party, workTitle,
#description,
duration, effort, state)) duration, effort, state))
userSettings = (dayFrom, dayTo, party)
defaultOutputFields = fields defaultOutputFields = fields
defaultSortCriteria = (day, timeStart,) defaultSortCriteria = (day, timeStart,)
states = ('done', 'done_x', 'finished') states = ('done', 'done_x', 'finished')
@ -192,12 +205,13 @@ class WorkReportInstance(ReportInstance):
crit = self.context.queryCriteria or [] crit = self.context.queryCriteria or []
if not crit and 'tasks' not in form: if not crit and 'tasks' not in form:
f = self.fields['tasks'] f = self.fields['tasks']
tasks = baseObject(self.context).getChildren([self.hasReportPredicate]) tasks = [self.view.context]
tasks = [util.getUidForObject(task) for task in tasks] tasks = [util.getUidForObject(task) for task in tasks]
crit = [LeafQueryCriteria(f.name, f.operator, tasks, f)] crit = [LeafQueryCriteria(f.name, f.operator, tasks, f)]
for f in self.getAllQueryFields(): for f in self.getAllQueryFields():
if f.name in form: 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) return CompoundQueryCriteria(crit)
def selectObjects(self, parts): def selectObjects(self, parts):