work in progress: input of report parameters, work statement as example
This commit is contained in:
parent
d0ef48e692
commit
b924051d49
6 changed files with 107 additions and 17 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue