new report 'person work statement', + minor improvements for generic concept-based reports

This commit is contained in:
Helmut Merz 2016-01-09 17:34:47 +01:00
parent 4051c2f9a5
commit e272675498
5 changed files with 65 additions and 14 deletions

View file

@ -26,7 +26,7 @@
<div metal:define-macro="header">
<metal:block use-macro="view/concept_macros/concepttitle" />
<form method="post" name="report_data" class="report-meta">
<form method="get" name="report_data" class="report-meta">
<input type="hidden" name="show_results" value="True" />
<tal:hidden define="params item/dynamicParams"
tal:condition="nothing">
@ -48,12 +48,14 @@
</div>
<br />
</form>
<tal:ignore condition="nothing">
<tal:list condition="renderer">
<div metal:use-macro="renderer" />
</tal:list>
<tal:list condition="not:renderer">
<div metal:use-macro="view/concept_macros/conceptchildren" />
</tal:list>
</tal:ignore>
</div>

View file

@ -236,6 +236,10 @@ class ResultsConceptView(ConceptView):
if opt:
return opt[0]
#@Lazy
#def reportDownload(self):
# return self.downloadLink
def isSortableColumn(self, tableName, colName):
if tableName == 'results':
if colName in [f.name for f in self.reportInstance.getSortFields()]:

View file

@ -41,8 +41,9 @@
<tal:download condition="item/downloadLink">
<div class="button">
<a i18n:translate=""
tal:define="params python:item.getSortParams(tableName)"
tal:attributes="href string:${item/downloadLink}$params">Download Data</a>
tal:define="dl string:${item/downloadLink}${item/urlParamString};
params python:item.getSortParams(tableName)"
tal:attributes="href dl">Download Data</a>
</div>
<br />
</tal:download>

View file

@ -107,6 +107,18 @@
class="loops.organize.work.report.WorkStatementCSVExport"
permission="zope.View" />
<zope:adapter
name="person_work_statement"
factory="loops.organize.work.report.PersonWorkReportInstance"
provides="loops.expert.report.IReportInstance"
trusted="True" />
<zope:class class="loops.organize.work.report.PersonWorkReportInstance">
<require permission="zope.View"
interface="loops.expert.report.IReportInstance" />
<require permission="zope.ManageContent"
set_schema="loops.expert.report.IReportInstance" />
</zope:class>
<zope:adapter
name="meeting_minutes"
factory="loops.organize.work.report.MeetingMinutes"

View file

@ -120,7 +120,7 @@ deadline = TrackDateField('deadline', u'Deadline',
dayFrom = TrackDateField('dayFrom', u'Start Day',
description=u'The first day from which to select work.',
fieldType='date',
operator=u'gt',
operator=u'ge',
executionSteps=['query'])
dayTo = TrackDateField('dayTo', u'End Day',
description=u'The last day until which to select work.',
@ -230,9 +230,16 @@ class WorkReportInstance(ReportInstance):
userSettings = (dayFrom, dayTo, party)
defaultOutputFields = fields
defaultSortCriteria = (day, timeStart,)
states = ('done', 'done_x', 'finished')
defaultStates = ('done', 'done_x', 'finished')
taskTypeNames = ('task', 'event', 'project')
def getOptions(self, option):
return self.view.options(option)
@Lazy
def states(self):
return self.getOptions('report_select_state') or self.defaultStates
@property
def queryCriteria(self):
form = self.view.request.form
@ -265,16 +272,19 @@ class WorkReportInstance(ReportInstance):
tasks.extend(self.getAllSubtasks(t))
return tasks
def getAllSubtasks(self, concept):
def getAllSubtasks(self, concept, checked=None):
result = []
if checked is None:
checked = set()
for c in concept.getChildren([self.view.defaultPredicate]):
if c.conceptType in self.taskTypes:
result.append(c)
result.extend(self.getAllSubtasks(c))
if c not in checked:
checked.add(c)
result.extend(self.getAllSubtasks(c, checked))
return result
def selectWorkItems(self, task, parts):
# TODO: take states from parts
kw = dict(task=util.getUidForObject(baseObject(task)),
state=self.states)
userNameCrit = parts.get('userName')
@ -294,6 +304,28 @@ class WorkReportInstance(ReportInstance):
return IWorkItems(self.recordManager['work'])
class PersonWorkReportInstance(WorkReportInstance):
type = "person_work_statement"
label = u'Person Work Statement'
@property
def queryCriteria(self):
form = self.view.request.form
crit = self.context.queryCriteria or []
for f in self.getAllQueryFields():
if f.name in form:
crit.append(
LeafQueryCriteria(f.name, f.operator, form[f.name], f))
return CompoundQueryCriteria(crit)
def selectObjects(self, parts):
workItems = self.recordManager['work']
person = self.view.context
uid = util.getUidForObject(person)
return workItems.query(userName=uid, state=self.states)
# meeting minutes
class MeetingMinutesWorkRow(WorkRow):