work in progress: meeting minutes: view + corresponding portlet action
This commit is contained in:
parent
058de979d8
commit
2f9fbb215e
7 changed files with 152 additions and 7 deletions
|
@ -42,6 +42,8 @@ results_template = ViewPageTemplateFile('results.pt')
|
|||
|
||||
|
||||
class ReportView(ConceptView):
|
||||
""" A view for defining (editing) a report.
|
||||
"""
|
||||
|
||||
@Lazy
|
||||
def report_macros(self):
|
||||
|
@ -106,3 +108,52 @@ class ResultsView(NodeView):
|
|||
|
||||
def getColumnRenderer(self, col):
|
||||
return self.result_macros[col.renderer]
|
||||
|
||||
|
||||
class ResultsConceptView(ConceptView):
|
||||
""" View on a concept using a report.
|
||||
"""
|
||||
|
||||
reportName = None # define in subclass if applicable
|
||||
|
||||
@Lazy
|
||||
def result_macros(self):
|
||||
return self.controller.getTemplateMacros('results', results_template)
|
||||
|
||||
@Lazy
|
||||
def resultsRenderer(self):
|
||||
return self.reportInstance.getResultsRenderer(
|
||||
'results', self.result_macros)
|
||||
|
||||
@Lazy
|
||||
def macro(self):
|
||||
return self.result_macros['content']
|
||||
|
||||
@Lazy
|
||||
def hasReportPredicate(self):
|
||||
return self.conceptManager['hasreport']
|
||||
|
||||
@Lazy
|
||||
def report(self):
|
||||
if self.reportName:
|
||||
return adapted(self.conceptManager[self.reportName])
|
||||
type = self.context.conceptType
|
||||
reports = type.getParents([self.hasReportPredicate])
|
||||
return adapted(reports[0])
|
||||
|
||||
@Lazy
|
||||
def reportInstance(self):
|
||||
ri = component.getAdapter(self.report, IReportInstance,
|
||||
name=self.report.reportType)
|
||||
ri.view = self.nodeView
|
||||
return ri
|
||||
|
||||
def results(self):
|
||||
return self.reportInstance.getResults(dict(tasks=util.getUidForObject(self.context)))
|
||||
|
||||
@Lazy
|
||||
def displayedColumns(self):
|
||||
return self.reportInstance.getActiveOutputFields()
|
||||
|
||||
def getColumnRenderer(self, col):
|
||||
return self.result_macros[col.renderer]
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
|
||||
<div metal:define-macro="main"
|
||||
tal:define="item nocall:item/virtualTarget;
|
||||
report view/reportInstance">
|
||||
report view/reportInstance;
|
||||
reportView nocall:view">
|
||||
<div tal:attributes="class string:content-$level;">
|
||||
<metal:block use-macro="view/concept_macros/concepttitle" />
|
||||
</div>
|
||||
|
@ -14,9 +15,19 @@
|
|||
</div>
|
||||
|
||||
|
||||
<div metal:define-macro="content"
|
||||
tal:define="report item/reportInstance;
|
||||
reportView nocall:item">
|
||||
<div tal:attributes="class string:content-$level;">
|
||||
<metal:block use-macro="view/concept_macros/concepttitle" />
|
||||
</div>
|
||||
<div metal:use-macro="item/resultsRenderer" />
|
||||
</div>
|
||||
|
||||
|
||||
<div metal:define-macro="results">
|
||||
<table class="report"
|
||||
tal:define="results view/results">
|
||||
tal:define="results reportView/results">
|
||||
<tr>
|
||||
<th tal:repeat="col results/displayedColumns"
|
||||
tal:content="col/title"
|
||||
|
@ -25,14 +36,16 @@
|
|||
</tr>
|
||||
<tr tal:repeat="row results">
|
||||
<td tal:repeat="col results/displayedColumns">
|
||||
<metal:column use-macro="python:view.getColumnRenderer(col)" />
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr tal:define="row nocall:results/totals"
|
||||
tal:condition="nocall:row">
|
||||
<td tal:repeat="col results/displayedColumns"
|
||||
tal:attributes="class col/cssClass">
|
||||
<metal:column use-macro="python:view.getColumnRenderer(col)" />
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@ -86,13 +99,15 @@
|
|||
</tr>
|
||||
<tr tal:repeat="row results">
|
||||
<td tal:repeat="col results/displayedColumns">
|
||||
<metal:column use-macro="python:view.getColumnRenderer(col)" />
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr tal:define="row nocall:results/totals"
|
||||
tal:condition="nocall:row">
|
||||
<td tal:repeat="col results/displayedColumns">
|
||||
<metal:column use-macro="python:view.getColumnRenderer(col)" />
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -97,7 +97,7 @@ class ReportInstance(BaseReport):
|
|||
if dynaParams is not None:
|
||||
for k, v in dynaParams.items():
|
||||
if k in crit.parts.keys():
|
||||
crit.parts[k].value = v
|
||||
crit.parts[k].comparisonValue = v
|
||||
parts = Jeep(crit.parts)
|
||||
result = list(self.selectObjects(parts)) # may modify parts
|
||||
qc = CompoundQueryCriteria(parts)
|
||||
|
|
|
@ -97,6 +97,12 @@
|
|||
set_schema="loops.expert.report.IReportInstance" />
|
||||
</zope:class>
|
||||
|
||||
<browser:page
|
||||
name="meeting_minutes.html"
|
||||
for="loops.interfaces.IConceptSchema"
|
||||
class="loops.organize.work.meeting.MeetingMinutes"
|
||||
permission="zope.View" />
|
||||
|
||||
<!-- setup -->
|
||||
|
||||
<zope:adapter factory="loops.organize.work.setup.SetupManager"
|
||||
|
|
15
organize/work/meeting.pt
Normal file
15
organize/work/meeting.pt
Normal file
|
@ -0,0 +1,15 @@
|
|||
<html i18n:domain="loops">
|
||||
|
||||
|
||||
<div metal:define-macro="content"
|
||||
tal:define="report item/reportInstance;
|
||||
reportView nocall:item">
|
||||
<div tal:attributes="class string:content-$level;">
|
||||
<metal:block use-macro="view/concept_macros/concepttitle" />
|
||||
<metal:block use-macro="view/concept_macros/conceptfields" />
|
||||
</div>
|
||||
<div metal:use-macro="item/resultsRenderer" />
|
||||
</div>
|
||||
|
||||
|
||||
</html>
|
52
organize/work/meeting.py
Normal file
52
organize/work/meeting.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
#
|
||||
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
"""
|
||||
View class(es) for accessing tasks and work items as meeting minutes.
|
||||
"""
|
||||
|
||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||
from zope.cachedescriptors.property import Lazy
|
||||
|
||||
from cybertools.browser.action import actions
|
||||
from loops.browser.action import TargetAction
|
||||
from loops.expert.browser.report import ResultsConceptView
|
||||
from loops.util import _
|
||||
|
||||
|
||||
meeting_template = ViewPageTemplateFile('meeting.pt')
|
||||
|
||||
|
||||
actions.register('meeting_minutes', 'portlet', TargetAction,
|
||||
title=_(u'Show Meeting Minutes...'),
|
||||
description=_(u'Show meeting minutes for this object.'),
|
||||
viewName='meeting_minutes.html',
|
||||
)
|
||||
|
||||
class MeetingMinutes(ResultsConceptView):
|
||||
|
||||
reportName = 'meeting_minutes'
|
||||
|
||||
@Lazy
|
||||
def meeting_macros(self):
|
||||
return meeting_template.macros
|
||||
|
||||
@Lazy
|
||||
def macro(self):
|
||||
return self.meeting_macros['content']
|
||||
|
|
@ -247,8 +247,14 @@ class MeetingMinutesWork(WorkReportInstance, SubReport):
|
|||
|
||||
rowFactory = MeetingMinutesWorkRow
|
||||
|
||||
fields = Jeep((workTitle, party, day, state)) #description,
|
||||
defaultOutputFields = fields
|
||||
states = ('planned',)
|
||||
|
||||
@property
|
||||
def queryCriteria(self):
|
||||
return CompoundQueryCriteria([])
|
||||
|
||||
def selectObjects(self, parts):
|
||||
parts.pop('tasks', None)
|
||||
t = self.parentRow.context
|
||||
|
|
Loading…
Add table
Reference in a new issue