work in progress: input of report parameters, work statement as example

This commit is contained in:
Helmut Merz 2012-07-09 16:31:23 +02:00
parent d0ef48e692
commit b924051d49
6 changed files with 107 additions and 17 deletions

View file

@ -481,6 +481,7 @@ class NodeView(BaseView):
def virtualTarget(self):
tv = self.viewAnnotations.get('targetView')
if tv is not None:
tv.setupController()
return tv
return self.getViewForTarget(self.virtualTargetObject)

View file

@ -2,21 +2,73 @@
<div metal:define-macro="main">
<div tal:attributes="class string:content-$level;">
<div tal:define="report item/reportInstance;
reportView nocall:item"
tal:attributes="class string:content-$level;">
<metal:block use-macro="view/concept_macros/concepttitle" />
<form method="post" name="report_data" action="results.html">
<tal:hidden define="params item/dynamicParams">
<form method="post" name="report_data">
<tal:hidden define="params item/dynamicParams"
tal:condition="nothing">
<input type="hidden"
tal:repeat="name params"
tal:attributes="name name;
value params/?name" /></tal:hidden>
<div metal:use-macro="item/report_macros/params" />
<div metal:define-macro="buttons">
<input type="submit" name="report_execute" value="Execute Report"
i18n:attributes="value" />
</div>
</form>
<div metal:use-macro="item/resultsRenderer" />
</div>
</div>
<metal:block define-macro="params">
<metal:block use-macro="item/report_macros/query" />
</metal:block>
<metal:block define-macro="query"
tal:define="criteria
item/reportInstance/queryCriteria/parts|nothing">
<table>
<tr tal:repeat="field item/queryFields">
<tal:field define="fieldType field/fieldType;
crit python:criteria and criteria.get(field.name)">
<td><b><span tal:content="field/title" />: </b></td>
<td><metal:field use-macro="item/report_macros/?fieldType" /></td>
</tal:field>
</tr>
</table>
<br />
</metal:block>
<metal:field define-macro="textline">
<input tal:attributes="name string:${field/name};
value crit/comparisonValue|nothing" />
</metal:field>
<metal:field define-macro="number">
<input tal:attributes="name string:query.field.${field/name};
value crit/comparisonValue|nothing" />
</metal:field>
<metal:field define-macro="date">
<input dojoType="dijit.form.DateTextBox"
constraints="{datePattern: 'd. MMM y',
min: '1980-01-01', max: '2020-12-31'}"
tal:attributes="name string:${field/name};
value crit/comparisonValue|nothing" />
</metal:field>
<metal:field define-macro="selection">
<metal:use use-macro="item/report_macros/textline" />
</metal:field>
</html>

View file

@ -170,7 +170,6 @@ class ResultsConceptView(ConceptView):
reportType = self.reportType or self.report.reportType
ri = component.getAdapter(self.report, IReportInstance,
name=reportType)
#ri.view = self.nodeView
ri.view = self
return ri
@ -185,6 +184,22 @@ class ResultsConceptView(ConceptView):
return self.result_macros[col.renderer]
class ReportConceptView(ResultsConceptView):
class ReportConceptView(ResultsConceptView, ReportView):
""" View on a concept using a report.
"""
def setupController(self):
super(ReportConceptView, self).setupController()
self.registerDojoDateWidget()
@Lazy
def macro(self):
return self.report_macros['main']
@Lazy
def queryFields(self):
ri = self.reportInstance
qf = ri.getAllQueryFields()
if ri.userSettings:
return [f for f in qf if f in ri.userSettings]
return qf

View file

@ -35,7 +35,8 @@
i18n:translate="" />
</tr>
<tr tal:repeat="row results">
<td tal:repeat="col results/displayedColumns">
<td tal:repeat="col results/displayedColumns"
tal:attributes="class col/cssClass">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</td>

View file

@ -25,7 +25,7 @@ from zope import component
from zope.i18n.locales import locales
from zope.schema.interfaces import IVocabularyFactory, IContextSourceBinder
from cybertools.composer.report.field import Field
from cybertools.composer.report.field import Field as BaseField
from cybertools.composer.report.result import ResultSet
from cybertools.util.date import timeStamp2Date
from loops.common import baseObject
@ -33,6 +33,12 @@ from loops.expert.report import ReportInstance
from loops import util
class Field(BaseField):
def getSelectValue(self, row):
return self.getRawValue(row)
class TextField(Field):
format = 'text/restructured'

View file

@ -26,15 +26,16 @@ from zope.component import adapter
from cybertools.composer.report.base import Report
from cybertools.composer.report.base import LeafQueryCriteria, CompoundQueryCriteria
from cybertools.composer.report.field import Field, CalculatedField
from cybertools.composer.report.field import CalculatedField
from cybertools.composer.report.result import ResultSet, Row as BaseRow
from cybertools.organize.interfaces import IWorkItems
from cybertools.util.date import timeStamp2Date
from cybertools.util.date import timeStamp2Date, timeStamp2ISO
from cybertools.util.format import formatDate
from cybertools.util.jeep import Jeep
from loops.common import adapted, baseObject
from loops.expert.browser.report import ReportConceptView
from loops.expert.field import TargetField, DateField, TextField, UrlField
from loops.expert.field import Field, TargetField, DateField, \
TextField, UrlField
from loops.expert.field import SubReport, SubReportField
from loops.expert.report import ReportInstance
from loops import util
@ -58,9 +59,10 @@ class StateField(Field):
class TrackDateField(Field):
fieldType = 'date'
part = 'date'
format = 'short'
renderer = 'right'
cssClass = 'right'
def getValue(self, row):
value = self.getRawValue(row)
@ -76,6 +78,12 @@ class TrackDateField(Field):
view.languageInfo.language)
return u''
def getSelectValue(self, row):
value = self.getRawValue(row)
if not value:
return ''
return timeStamp2ISO(value)[:10]
class TrackTimeField(TrackDateField):
@ -84,7 +92,7 @@ class TrackTimeField(TrackDateField):
class DurationField(Field):
renderer = 'right'
cssClass = 'right'
def getValue(self, row):
value = self.getRawValue(row)
@ -111,11 +119,15 @@ tasks = Field('tasks', u'Tasks',
# work report fields
dayFrom = Field('dayFrom', u'Start Day',
dayFrom = TrackDateField('dayFrom', u'Start Day',
description=u'The first day from which to select work.',
fieldType='date',
operator=u'gt',
executionSteps=['query'])
dayTo = Field('dayTo', u'End Day',
dayTo = TrackDateField('dayTo', u'End Day',
description=u'The last day until which to select work.',
fieldType='date',
operator=u'le',
executionSteps=['query'])
day = TrackDateField('day', u'Day',
description=u'The day the work was done.',
@ -132,6 +144,7 @@ task = TargetField('taskId', u'Task',
executionSteps=['output'])
party = TargetField('userName', u'Party',
description=u'The party (usually a person) who did the work.',
fieldType='selection',
executionSteps=['query', 'sort', 'output'])
workTitle = Field('title', u'Title',
description=u'The short description of the work.',
@ -178,7 +191,8 @@ class WorkRow(BaseRow):
value = self.getDuration(attr)
return value
attributeHandlers = dict(day=getDay, duration=getDuration, effort=getEffort)
attributeHandlers = dict(day=getDay, dayFrom=getDay, dayTo=getDay,
duration=getDuration, effort=getEffort)
class WorkReportInstance(ReportInstance):
@ -243,8 +257,9 @@ class WorkReportInstance(ReportInstance):
# TODO: take states from parts
kw = dict(task=util.getUidForObject(baseObject(task)),
state=self.states)
if 'userName' in parts:
kw['userName'] = parts['userName'].comparisonValue
userNameCrit = parts.get('userName')
if userNameCrit and userNameCrit.comparisonValue:
kw['userName'] = userNameCrit.comparisonValue
wi = self.workItems
return wi.query(**kw)