diff --git a/browser/common.py b/browser/common.py index 69cfc5a..7da8da5 100644 --- a/browser/common.py +++ b/browser/common.py @@ -77,6 +77,7 @@ from loops.versioning.interfaces import IVersionable concept_macros = ViewPageTemplateFile('concept_macros.pt') conceptMacrosTemplate = concept_macros resource_macros = ViewPageTemplateFile('resource_macros.pt') +form_macros = ViewPageTemplateFile('form_macros.pt') class NameField(schema.ASCIILine): @@ -161,7 +162,10 @@ class BaseView(GenericView, I18NView): @Lazy def resource_macros(self): return self.controller.getTemplateMacros('resource', resource_macros) - #return resource_macros.macros + + @Lazy + def form_macros(self): + return self.controller.getTemplateMacros('form', form_macros) def breadcrumbs(self): return [] diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index d0adbad..3734d46 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -45,7 +45,8 @@ values python: [v for v in data.values() if v]; fields item/fields" tal:condition="values"> - +
-
+ + + + + + diff --git a/organize/work/meeting.py b/organize/work/meeting.py new file mode 100644 index 0000000..cf4abf9 --- /dev/null +++ b/organize/work/meeting.py @@ -0,0 +1,61 @@ +# +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +View class(es) for accessing tasks and work items as meeting minutes. +""" + +from zope.app.pagetemplate import ViewPageTemplateFile +from zope.cachedescriptors.property import Lazy + +from cybertools.browser.action import actions +from loops.browser.action import TargetAction +from loops.expert.browser.report import ResultsConceptView +from loops.util import _ + + +meeting_template = ViewPageTemplateFile('meeting.pt') + + +actions.register('meeting_minutes', 'portlet', TargetAction, + title=_(u'Show Meeting Minutes...'), + description=_(u'Show meeting minutes for this object.'), + viewName='meeting_minutes.html', +) + +class MeetingMinutes(ResultsConceptView): + + reportName = 'meeting_minutes' + + @Lazy + def meeting_macros(self): + return meeting_template.macros + + @Lazy + def macro(self): + return self.meeting_macros['content'] + + @Lazy + def resultsRenderer(self): + return self.meeting_macros['results'] + + def getColumnRenderer(self, col): + renderer = col.renderer + if renderer == 'subreport': + return self.meeting_macros[renderer] + return self.result_macros[renderer] diff --git a/organize/work/report.py b/organize/work/report.py index 1851464..4bbd9e0 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -33,11 +33,17 @@ from cybertools.util.date import timeStamp2Date from cybertools.util.format import formatDate from cybertools.util.jeep import Jeep from loops.common import adapted, baseObject -from loops.expert.field import TargetField, TextField, UrlField, SubReportField +from loops.expert.field import TargetField, TextField, UrlField +from loops.expert.field import SubReport, SubReportField from loops.expert.report import ReportInstance from loops import util +class StateField(Field): + def getDisplayValue(self, row): + value = self.getValue(row) + return util._(value) + class DateField(Field): part = 'date' @@ -101,6 +107,7 @@ dayTo = Field('dayTo', u'End Day', executionSteps=['query']) day = DateField('day', u'Day', description=u'The day the work was done.', + cssClass='center', executionSteps=['sort', 'output']) timeStart = TimeField('start', u'Start', description=u'The time the unit of work was started.', @@ -126,8 +133,9 @@ duration = DurationField('duration', u'Duration', effort = DurationField('effort', u'Effort', description=u'The effort of the work.', executionSteps=['output', 'totals']) -state = Field('state', u'State', +state = StateField('state', u'State', description=u'The state of the work.', + cssClass='center', executionSteps=['query', 'output']) @@ -237,15 +245,44 @@ class WorkReportInstance(ReportInstance): # meeting minutes +class MeetingMinutesWorkRow(WorkRow): + + pass + + +class MeetingMinutesWork(WorkReportInstance, SubReport): + + rowFactory = MeetingMinutesWorkRow + + fields = Jeep((workTitle, party, day, state)) #description, + defaultOutputFields = fields + defaultSortCriteria = (day,) + states = ('planned', 'accepted', 'running', 'done', + 'finished', 'closed', 'moved') + + @property + def queryCriteria(self): + return CompoundQueryCriteria([]) + + def selectObjects(self, parts): + parts.pop('tasks', None) + t = self.parentRow.context + if t is not None: + return self.selectWorkItems(t, parts) + return [] + + taskTitle = UrlField('title', u'Title', description=u'The short description of the task.', + cssClass='header-1', executionSteps=['output']) taskDescription = TextField('description', u'Description', description=u'The long description of the task.', + cssClass='header-2', executionSteps=['output']) workItems = SubReportField('workItems', u'Work Items', description=u'A list of work items belonging to the task.', - reportFactory=WorkReportInstance, + reportFactory=MeetingMinutesWork, executionSteps=['output']) @@ -274,3 +311,4 @@ class MeetingMinutes(WorkReportInstance): def selectObjects(self, parts): return self.getTasks(parts)[1:] + diff --git a/organize/work/work_macros.pt b/organize/work/work_macros.pt index 95a010d..0dde42f 100644 --- a/organize/work/work_macros.pt +++ b/organize/work/work_macros.pt @@ -213,20 +213,20 @@ () - + - +