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">
|
||||
<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: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 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>
|
||||
|
||||
|
||||
|
|
|
@ -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()]:
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Reference in a new issue