From b924051d49bc15a09e5df1bbca16c2032cdedfd3 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 9 Jul 2012 16:31:23 +0200 Subject: [PATCH] work in progress: input of report parameters, work statement as example --- browser/node.py | 1 + expert/browser/report.pt | 58 +++++++++++++++++++++++++++++++++++++-- expert/browser/report.py | 19 +++++++++++-- expert/browser/results.pt | 3 +- expert/field.py | 8 +++++- organize/work/report.py | 35 ++++++++++++++++------- 6 files changed, 107 insertions(+), 17 deletions(-) diff --git a/browser/node.py b/browser/node.py index e247dda..5a9a238 100644 --- a/browser/node.py +++ b/browser/node.py @@ -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) diff --git a/expert/browser/report.pt b/expert/browser/report.pt index e1237dd..4dd38db 100644 --- a/expert/browser/report.pt +++ b/expert/browser/report.pt @@ -2,21 +2,73 @@
-
+
-
- + + +
+
+ + + + + + + + + + + + + +
:
+
+
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/expert/browser/report.py b/expert/browser/report.py index 2890dc8..3883238 100644 --- a/expert/browser/report.py +++ b/expert/browser/report.py @@ -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 diff --git a/expert/browser/results.pt b/expert/browser/results.pt index b40267c..7d30c4f 100644 --- a/expert/browser/results.pt +++ b/expert/browser/results.pt @@ -35,7 +35,8 @@ i18n:translate="" /> - + diff --git a/expert/field.py b/expert/field.py index 9bdd7d1..502f34a 100644 --- a/expert/field.py +++ b/expert/field.py @@ -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' diff --git a/organize/work/report.py b/organize/work/report.py index eb41a7a..86dc356 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -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)