new report 'person work statement', + minor improvements for generic concept-based reports
This commit is contained in:
parent
4051c2f9a5
commit
e272675498
5 changed files with 65 additions and 14 deletions
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
<div metal:define-macro="header">
|
<div metal:define-macro="header">
|
||||||
<metal:block use-macro="view/concept_macros/concepttitle" />
|
<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" />
|
<input type="hidden" name="show_results" value="True" />
|
||||||
<tal:hidden define="params item/dynamicParams"
|
<tal:hidden define="params item/dynamicParams"
|
||||||
tal:condition="nothing">
|
tal:condition="nothing">
|
||||||
|
@ -48,12 +48,14 @@
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
</form>
|
</form>
|
||||||
|
<tal:ignore condition="nothing">
|
||||||
<tal:list condition="renderer">
|
<tal:list condition="renderer">
|
||||||
<div metal:use-macro="renderer" />
|
<div metal:use-macro="renderer" />
|
||||||
</tal:list>
|
</tal:list>
|
||||||
<tal:list condition="not:renderer">
|
<tal:list condition="not:renderer">
|
||||||
<div metal:use-macro="view/concept_macros/conceptchildren" />
|
<div metal:use-macro="view/concept_macros/conceptchildren" />
|
||||||
</tal:list>
|
</tal:list>
|
||||||
|
</tal:ignore>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,10 @@ class ResultsConceptView(ConceptView):
|
||||||
if opt:
|
if opt:
|
||||||
return opt[0]
|
return opt[0]
|
||||||
|
|
||||||
|
#@Lazy
|
||||||
|
#def reportDownload(self):
|
||||||
|
# return self.downloadLink
|
||||||
|
|
||||||
def isSortableColumn(self, tableName, colName):
|
def isSortableColumn(self, tableName, colName):
|
||||||
if tableName == 'results':
|
if tableName == 'results':
|
||||||
if colName in [f.name for f in self.reportInstance.getSortFields()]:
|
if colName in [f.name for f in self.reportInstance.getSortFields()]:
|
||||||
|
|
|
@ -41,8 +41,9 @@
|
||||||
<tal:download condition="item/downloadLink">
|
<tal:download condition="item/downloadLink">
|
||||||
<div class="button">
|
<div class="button">
|
||||||
<a i18n:translate=""
|
<a i18n:translate=""
|
||||||
tal:define="params python:item.getSortParams(tableName)"
|
tal:define="dl string:${item/downloadLink}${item/urlParamString};
|
||||||
tal:attributes="href string:${item/downloadLink}$params">Download Data</a>
|
params python:item.getSortParams(tableName)"
|
||||||
|
tal:attributes="href dl">Download Data</a>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
</tal:download>
|
</tal:download>
|
||||||
|
|
|
@ -107,6 +107,18 @@
|
||||||
class="loops.organize.work.report.WorkStatementCSVExport"
|
class="loops.organize.work.report.WorkStatementCSVExport"
|
||||||
permission="zope.View" />
|
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
|
<zope:adapter
|
||||||
name="meeting_minutes"
|
name="meeting_minutes"
|
||||||
factory="loops.organize.work.report.MeetingMinutes"
|
factory="loops.organize.work.report.MeetingMinutes"
|
||||||
|
|
|
@ -120,7 +120,7 @@ deadline = TrackDateField('deadline', u'Deadline',
|
||||||
dayFrom = TrackDateField('dayFrom', u'Start Day',
|
dayFrom = TrackDateField('dayFrom', u'Start Day',
|
||||||
description=u'The first day from which to select work.',
|
description=u'The first day from which to select work.',
|
||||||
fieldType='date',
|
fieldType='date',
|
||||||
operator=u'gt',
|
operator=u'ge',
|
||||||
executionSteps=['query'])
|
executionSteps=['query'])
|
||||||
dayTo = TrackDateField('dayTo', u'End Day',
|
dayTo = TrackDateField('dayTo', u'End Day',
|
||||||
description=u'The last day until which to select work.',
|
description=u'The last day until which to select work.',
|
||||||
|
@ -230,9 +230,16 @@ class WorkReportInstance(ReportInstance):
|
||||||
userSettings = (dayFrom, dayTo, party)
|
userSettings = (dayFrom, dayTo, party)
|
||||||
defaultOutputFields = fields
|
defaultOutputFields = fields
|
||||||
defaultSortCriteria = (day, timeStart,)
|
defaultSortCriteria = (day, timeStart,)
|
||||||
states = ('done', 'done_x', 'finished')
|
defaultStates = ('done', 'done_x', 'finished')
|
||||||
taskTypeNames = ('task', 'event', 'project')
|
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
|
@property
|
||||||
def queryCriteria(self):
|
def queryCriteria(self):
|
||||||
form = self.view.request.form
|
form = self.view.request.form
|
||||||
|
@ -265,16 +272,19 @@ class WorkReportInstance(ReportInstance):
|
||||||
tasks.extend(self.getAllSubtasks(t))
|
tasks.extend(self.getAllSubtasks(t))
|
||||||
return tasks
|
return tasks
|
||||||
|
|
||||||
def getAllSubtasks(self, concept):
|
def getAllSubtasks(self, concept, checked=None):
|
||||||
result = []
|
result = []
|
||||||
|
if checked is None:
|
||||||
|
checked = set()
|
||||||
for c in concept.getChildren([self.view.defaultPredicate]):
|
for c in concept.getChildren([self.view.defaultPredicate]):
|
||||||
if c.conceptType in self.taskTypes:
|
if c.conceptType in self.taskTypes:
|
||||||
result.append(c)
|
result.append(c)
|
||||||
result.extend(self.getAllSubtasks(c))
|
if c not in checked:
|
||||||
|
checked.add(c)
|
||||||
|
result.extend(self.getAllSubtasks(c, checked))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def selectWorkItems(self, task, parts):
|
def selectWorkItems(self, task, parts):
|
||||||
# TODO: take states from parts
|
|
||||||
kw = dict(task=util.getUidForObject(baseObject(task)),
|
kw = dict(task=util.getUidForObject(baseObject(task)),
|
||||||
state=self.states)
|
state=self.states)
|
||||||
userNameCrit = parts.get('userName')
|
userNameCrit = parts.get('userName')
|
||||||
|
@ -294,6 +304,28 @@ class WorkReportInstance(ReportInstance):
|
||||||
return IWorkItems(self.recordManager['work'])
|
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
|
# meeting minutes
|
||||||
|
|
||||||
class MeetingMinutesWorkRow(WorkRow):
|
class MeetingMinutesWorkRow(WorkRow):
|
||||||
|
|
Loading…
Add table
Reference in a new issue