populate dayFrom field with a sensible default value; use form action for providing CSV export in order respect query input

This commit is contained in:
Helmut Merz 2016-02-13 22:19:57 +01:00
parent f4a5b78700
commit 711488a412
5 changed files with 49 additions and 20 deletions

View file

@ -38,22 +38,30 @@
<metal:block use-macro="view/concept_macros/concepttitle" /> <metal:block use-macro="view/concept_macros/concepttitle" />
<form method="get" 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">
<input type="hidden" <input type="hidden"
tal:repeat="name params" tal:repeat="name params"
tal:condition="nothing"
tal:attributes="name name; tal:attributes="name name;
value params/?name" /></tal:hidden> value params/?name" />
<input type="hidden"
tal:define="sortinfo request/sortinfo_results|nothing"
tal:condition="sortinfo"
tal:attributes="name string:sortinfo_results;
value sortinfo" />
</tal:hidden>
<div metal:use-macro="item/report_macros/params" /> <div metal:use-macro="item/report_macros/params" />
<div metal:define-macro="buttons"> <div metal:define-macro="buttons">
<input type="submit" name="report_execute" value="Execute Report" <input type="submit" name="report_execute" value="Execute Report"
onclick="this.form.action = ''"
tal:attributes="value item/reportExecuteTitle|string:Execute Report" tal:attributes="value item/reportExecuteTitle|string:Execute Report"
tal:condition="item/queryFields" tal:condition="item/queryFields"
i18n:attributes="value" /> i18n:attributes="value" />
<input type="submit" <input type="submit" name="report_download"
tal:condition="item/reportDownload" tal:condition="item/reportDownload"
tal:attributes="name string:${item/reportDownload}:method; tal:attributes="value item/reportDownloadTitle;
value item/reportDownloadTitle" onclick string:
this.form.action = '${item/reportDownload}'"
i18n:attributes="value" /> i18n:attributes="value" />
</div> </div>
<br /> <br />

View file

@ -234,11 +234,11 @@ class ResultsConceptView(ConceptView):
if not opt: if not opt:
opt = self.typeOptions('download_' + format) opt = self.typeOptions('download_' + format)
if opt: if opt:
return opt[0] return '/'.join((self.nodeView.virtualTargetUrl, opt[0]))
#@Lazy @Lazy
#def reportDownload(self): def reportDownload(self):
# return self.downloadLink return self.downloadLink
def isSortableColumn(self, tableName, colName): def isSortableColumn(self, tableName, colName):
if tableName == 'results': if tableName == 'results':

View file

@ -38,7 +38,7 @@
<div metal:define-macro="results" <div metal:define-macro="results"
tal:define="tableName string:results"> tal:define="tableName string:results">
<br /> <br />
<tal:download condition="item/downloadLink"> <tal:download condition="nothing">
<div class="button"> <div class="button">
<a i18n:translate="" <a i18n:translate=""
tal:define="dl string:${item/downloadLink}${item/urlParamString}; tal:define="dl string:${item/downloadLink}${item/urlParamString};

View file

@ -218,7 +218,8 @@ The executable report is a report instance that is an adapter to the
The user interface is a ReportConceptView subclass that is directly associated with the task. The user interface is a ReportConceptView subclass that is directly associated with the task.
>>> from loops.organize.work.report import WorkStatementView >>> from loops.organize.work.report import WorkStatementView
>>> reportView = WorkStatementView(task01, TestRequest()) >>> input = dict(dayFrom='2008-01-01')
>>> reportView = WorkStatementView(task01, TestRequest(form=input))
>>> reportView.nodeView = nodeView >>> reportView.nodeView = nodeView
>>> results = reportView.results() >>> results = reportView.results()
@ -241,7 +242,7 @@ Export of work data
------------------- -------------------
>>> from loops.organize.work.report import WorkStatementCSVExport >>> from loops.organize.work.report import WorkStatementCSVExport
>>> reportView = WorkStatementCSVExport(task01, TestRequest()) >>> reportView = WorkStatementCSVExport(task01, TestRequest(form=input))
>>> reportView.nodeView = nodeView >>> reportView.nodeView = nodeView
>>> output = reportView() >>> output = reportView()

View file

@ -20,6 +20,7 @@
Work report definitions. Work report definitions.
""" """
from datetime import date, timedelta
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.component import adapter, getAdapter from zope.component import adapter, getAdapter
@ -113,6 +114,10 @@ class PartyStateField(StateField):
return None return None
def yesterday(context):
return (date.today() - timedelta(1)).isoformat()
# common fields # common fields
tasks = Field('tasks', u'Tasks', tasks = Field('tasks', u'Tasks',
@ -129,6 +134,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',
default=yesterday,
operator=u'ge', operator=u'ge',
executionSteps=['query']) executionSteps=['query'])
dayTo = TrackDateField('dayTo', u'End Day', dayTo = TrackDateField('dayTo', u'End Day',
@ -183,6 +189,8 @@ partyState = PartyStateField('partyState', u'Party State',
cssClass='center', cssClass='center',
statesDefinition='contact_states', statesDefinition='contact_states',
executionSteps=['query', 'output']) executionSteps=['query', 'output'])
# activity
# process
# basic definitions and work report instance # basic definitions and work report instance
@ -249,6 +257,19 @@ class WorkReportInstance(ReportInstance):
def states(self): def states(self):
return self.getOptions('report_select_state') or self.defaultStates return self.getOptions('report_select_state') or self.defaultStates
def getFieldQueryCriteria(self, field, data):
if field.name in data:
return LeafQueryCriteria(
field.name, field.operator, data[field.name], field)
else:
default = field.default
if default is not None:
if callable(default):
default = default(self)
if default:
return LeafQueryCriteria(
field.name, field.operator, default, field)
@property @property
def queryCriteria(self): def queryCriteria(self):
form = self.view.request.form form = self.view.request.form
@ -259,9 +280,9 @@ class WorkReportInstance(ReportInstance):
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: fc = self.getFieldQueryCriteria(f, form)
crit.append( if fc is not None:
LeafQueryCriteria(f.name, f.operator, form[f.name], f)) crit.append(fc)
return CompoundQueryCriteria(crit) return CompoundQueryCriteria(crit)
def selectObjects(self, parts): def selectObjects(self, parts):
@ -320,12 +341,11 @@ class PersonWorkReportInstance(WorkReportInstance):
@property @property
def queryCriteria(self): def queryCriteria(self):
form = self.view.request.form
crit = self.context.queryCriteria or [] crit = self.context.queryCriteria or []
for f in self.getAllQueryFields(): for f in self.getAllQueryFields():
if f.name in form: fc = self.getFieldQueryCriteria(f, self.view.request.form)
crit.append( if fc is not None:
LeafQueryCriteria(f.name, f.operator, form[f.name], f)) crit.append(fc)
return CompoundQueryCriteria(crit) return CompoundQueryCriteria(crit)
def selectObjects(self, parts): def selectObjects(self, parts):