work in progress: meeting minutes: additional fields, improved layout

This commit is contained in:
Helmut Merz 2012-07-26 16:28:13 +02:00
parent 4cb27a1e4a
commit 0700bb971b
7 changed files with 174 additions and 78 deletions

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: $Id$\n" "Project-Id-Version: $Id$\n"
"POT-Creation-Date: 2007-05-22 12:00 CET\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n"
"PO-Revision-Date: 2012-07-17 12:00 CET\n" "PO-Revision-Date: 2012-07-26 12:00 CET\n"
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n" "Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
"Language-Team: loops developers <helmutm@cy55.de>\n" "Language-Team: loops developers <helmutm@cy55.de>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -296,6 +296,9 @@ msgstr "Besprechungsprotokoll für dieses Objekt anzeigen."
msgid "Download Meeting Minutes" msgid "Download Meeting Minutes"
msgstr "Besprechungsprotokoll generieren" msgstr "Besprechungsprotokoll generieren"
msgid "Copy Agenda Items"
msgstr "Tagesordnungspunkte kopieren"
msgid "Participants" msgid "Participants"
msgstr "Teilnehmer" msgstr "Teilnehmer"
@ -303,7 +306,7 @@ msgid "The names of the persons taking part in the event."
msgstr "Die Namen der Personen, die an der Besprechung teilnehmen." msgstr "Die Namen der Personen, die an der Besprechung teilnehmen."
msgid "label_responsible" msgid "label_responsible"
msgstr "Vortragender" msgstr "Vortragende/r"
msgid "desc_responsible" msgid "desc_responsible"
msgstr "Person, die diesen Tagesordnungpunkt vertritt." msgstr "Person, die diesen Tagesordnungpunkt vertritt."
@ -315,10 +318,19 @@ msgid "desc_discussion"
msgstr "Diskussion" msgstr "Diskussion"
msgid "label_consequences" msgid "label_consequences"
msgstr "Schlussfolgerungen" msgstr "Schlussfolgerung"
msgid "desc_consequences" msgid "desc_consequences"
msgstr "Schlussfolgerungen" msgstr "Schlussfolgerung"
msgid "header_workitems"
msgstr "Aufgaben"
msgid "header_responsible"
msgstr "zuständig"
msgid "header_deadline"
msgstr "Termin"
msgid "Task/Action" msgid "Task/Action"
msgstr "Aufgabe" msgstr "Aufgabe"

View file

@ -64,7 +64,7 @@
<input type="hidden" name="form.action" <input type="hidden" name="form.action"
tal:attributes="value view/form_action" /> tal:attributes="value view/form_action" />
<metal:data use-macro="view/fieldRenderers/fields" /> <metal:data use-macro="view/fieldRenderers/fields" />
<h3 i18n:translate="">Tasks</h3> <br />
<tal:tasks define="report item/reportInstance; <tal:tasks define="report item/reportInstance;
reportView nocall:item; reportView nocall:item;
results reportView/results; results reportView/results;

View file

@ -186,7 +186,7 @@ class IAgendaItem(ILoopsAdapter):
missing_value=u'', missing_value=u'',
required=False) required=False)
concequences = schema.Text( consequences = schema.Text(
title=_(u'label_consequences'), title=_(u'label_consequences'),
description=_(u'desc_consequences.'), description=_(u'desc_consequences.'),
default=u'', default=u'',

View file

@ -248,7 +248,7 @@ Let's start with creating an a event and assigning it a task.
... typeInterface=IEvent) ... typeInterface=IEvent)
>>> tAgendaItem = addAndConfigureObject(concepts, Concept, 'agendaitem', >>> tAgendaItem = addAndConfigureObject(concepts, Concept, 'agendaitem',
... title=u'AgendaItem', conceptType=concepts.getTypeConcept(), ... title=u'AgendaItem', conceptType=concepts.getTypeConcept(),
... typeInterface=IEvent) ... typeInterface=IAgendaItem)
>>> ev01 = addAndConfigureObject(concepts, Concept, 'ev01', >>> ev01 = addAndConfigureObject(concepts, Concept, 'ev01',
... title=u'loops Meeting', conceptType=tEvent) ... title=u'loops Meeting', conceptType=tEvent)

View file

@ -25,85 +25,139 @@
reportView nocall:item; reportView nocall:item;
results reportView/results; results reportView/results;
fields results/context/fields"> fields results/context/fields">
<metal:page use-macro="item/macros/page_header" />
<table class="report" width="100%"
tal:define="showCheckboxes nothing">
<metal:header use-macro="item/macros/header" /> <metal:header use-macro="item/macros/header" />
<metal:results use-macro="reportView/resultsRenderer" /> <metal:header use-macro="item/macros/rows" />
</table>
</div> </div>
<div metal:define-macro="header" <div metal:define-macro="page_header">
<table width="100%">
<tr>
<td>&nbsp;</td>
<td><h1 i18n:translate="">Meeting Minutes</h1></td>
<td><span i18n:translate="">Page</span> </td>
</tr>
<table>
</div>
<metal:header define-macro="header"
tal:define="row results/first"> tal:define="row results/first">
<h1 i18n:translate="">Meeting Minutes</h1> <tr>
<h2 tal:define="col fields/eventTitle"> <td colspan="4">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></h2> <div tal:define="col fields/eventTitle">
<div> <metal:col use-macro="python:item.getColumnRenderer(col)" /></div>
<div tal:define="col fields/eventDescription">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></div>
</td>
</tr>
<tr>
<td colspan="2">
<span tal:define="col fields/eventDate">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span>
</td>
<td colspan="2">
<span tal:define="col fields/eventStart"> <span tal:define="col fields/eventStart">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span> - <metal:col use-macro="python:item.getColumnRenderer(col)" /></span> -
<span tal:define="col fields/eventEnd"> <span tal:define="col fields/eventEnd">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span> <metal:col use-macro="python:item.getColumnRenderer(col)" /></span>
</div> </td>
<div tal:define="col fields/eventDescription"> </tr>
<metal:col use-macro="python:item.getColumnRenderer(col)" /></div> <tr>
</div> <td width="20%"
i18n:translate="">Participants</td>
<td colspan="3">
<span tal:define="col fields/participants">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span>
</td>
</tr>
</metal:header>
<div metal:define-macro="results"> <metal:results define-macro="results">
<table class="report" <table class="report"
tal:define="showCheckboxes cb_name|nothing"> tal:define="showCheckboxes cb_name|nothing">
<tr> <metal:rows define-macro="rows">
<th tal:condition="showCheckboxes" <tr tal:condition="showCheckboxes">
style="border: 1px solid grey"> <th style="border: 1px solid grey; width: 5%">
<input type="checkbox" checked <input type="checkbox" checked
tal:attributes="onclick tal:attributes="onclick
string:toggleCheckBoxes(this, '$cb_name:list')" /></th> string:toggleCheckBoxes(this, '$cb_name:list')" /></th>
<th i18n:translate="" <th colspan="4"
style="border: 1px solid grey">Task/Action</th> i18n:translate=""
<th style="border: 1px solid grey" style="border: 1px solid grey">Copy Agenda Items</th>
i18n:translate="">Who?</th>
<th style="border: 1px solid grey"
i18n:translate="">When?</th>
<th style="border: 1px solid grey"
i18n:translate=""></th>
</tr> </tr>
<tal:task repeat="row results"> <tal:task repeat="row results">
<tr tal:repeat="colname python: ('title', 'description',)"> <tr>
<td tal:condition="showCheckboxes" <td tal:condition="showCheckboxes"
style="border: 1px solid grey"> style="border: 1px solid grey">
<input type="checkbox" checked <input type="checkbox" checked
tal:condition="python:colname == 'title'"
tal:attributes="name string:$cb_name:list; tal:attributes="name string:$cb_name:list;
value row/context/uid" /></td> value row/context/uid" /></td>
<td style="border: 1px solid grey" <td colspan="4"
tal:define="col report/fields/?colname" style="border: 1px solid grey"
tal:define="col report/fields/title"
tal:attributes="class col/cssClass"> tal:attributes="class col/cssClass">
<metal:column use-macro="python: <metal:column use-macro="python:
reportView.getColumnRenderer(col)" /> reportView.getColumnRenderer(col)" />
</td> </td>
<td style="border: 1px solid grey" /> </tr>
<td style="border: 1px solid grey" /> <tr tal:repeat="colname python:
<td style="border: 1px solid grey" /> ('responsible', 'description', 'discussion', 'consequences')">
<tal:field define="col report/fields/?colname">
<td style="border: 1px solid grey"
tal:condition="showCheckboxes"></td>
<td style="border: 1px solid grey; width: 15%"
tal:content="col/title"
i18n:translate=""></td>
<td colspan="3"
style="border: 1px solid grey"
tal:attributes="class col/cssClass">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</td>
</tal:field>
</tr>
<tr>
<th style="border: 1px solid grey"
tal:condition="showCheckboxes"></th>
<th colspan="2"
style="border: 1px solid grey"
i18n:translate="">header_workitems</th>
<th style="border: 1px solid grey; width: 20%"
i18n:translate="">header_responsible</th>
<th style="border: 1px solid grey; width: 12%"
i18n:translate="">header_deadline</th>
</tr> </tr>
<tal:workitems define="col report/fields/workItems"> <tal:workitems define="col report/fields/workItems">
<metal:column use-macro="python: <metal:column use-macro="python:
reportView.getColumnRenderer(col)" /> reportView.getColumnRenderer(col)" />
</tal:workitems> </tal:workitems>
</tal:task> </tal:task>
</metal:rows>
</table> </table>
</div> </metal:results>
<div metal:define-macro="subreport" <metal:sub define-macro="subreport"
tal:define="results python:col.getValue(row)"> tal:define="results python:col.getValue(row)">
<tr class="listing" tal:repeat="row results"> <tr class="listing" tal:repeat="row results">
<td tal:condition="showCheckboxes" <td tal:condition="showCheckboxes"
style="border: 1px solid grey" /> style="border: 1px solid grey" />
<td tal:repeat="col results/displayedColumns" <td tal:repeat="col results/displayedColumns"
tal:attributes="class col/cssClass" tal:attributes="class col/cssClass;
colspan python:
col.name == 'title' and '2' or None"
style="border: 1px solid grey"> style="border: 1px solid grey">
<metal:column use-macro="python: <metal:column use-macro="python:
reportView.getColumnRenderer(col)" /> reportView.getColumnRenderer(col)" />
</td> </td>
</tr> </tr>
</div> </metal:sub>
</html> </html>

View file

@ -285,7 +285,7 @@ class MeetingMinutesWork(WorkReportInstance, SubReport):
rowFactory = MeetingMinutesWorkRow rowFactory = MeetingMinutesWorkRow
fields = Jeep((workTitle, party, day, state)) #description, fields = Jeep((workTitle, party, day)) #, state)) #description,
defaultOutputFields = fields defaultOutputFields = fields
defaultSortCriteria = (day,) defaultSortCriteria = (day,)
states = ('planned', 'accepted', 'running', 'done', states = ('planned', 'accepted', 'running', 'done',
@ -309,13 +309,20 @@ eventTitle = CalculatedField('eventTitle', u'Event Title',
eventDescription = CalculatedField('eventDescription', u'Event Description', eventDescription = CalculatedField('eventDescription', u'Event Description',
description=u'', description=u'',
executionSteps=(['header'])) executionSteps=(['header']))
eventDate = DateField('eventDate', u'Event Date',
description=u'',
format=('date', 'short'),
executionSteps=(['header']))
eventStart = DateField('eventStart', u'Event Start', eventStart = DateField('eventStart', u'Event Start',
description=u'', description=u'',
format=('dateTime', 'short'), format=('time', 'short'),
executionSteps=(['header'])) executionSteps=(['header']))
eventEnd = DateField('eventEnd', u'Event End', eventEnd = DateField('eventEnd', u'Event End',
description=u'', description=u'',
format=('dateTime', 'short'), format=('time', 'short'),
executionSteps=(['header']))
participants = CalculatedField('participants', u'Participants',
description=u'',
executionSteps=(['header'])) executionSteps=(['header']))
taskTitle = UrlField('title', u'Task Title', taskTitle = UrlField('title', u'Task Title',
description=u'The short description of the task.', description=u'The short description of the task.',
@ -325,6 +332,18 @@ taskDescription = TextField('description', u'Description',
description=u'The long description of the task.', description=u'The long description of the task.',
cssClass='header-2', cssClass='header-2',
executionSteps=['output']) executionSteps=['output'])
responsible = TextField('responsible', u'label_responsible',
description=u'Responsible.',
cssClass='header-2',
executionSteps=['output'])
discussion = TextField('discussion', u'label_discussion',
description=u'Discussion.',
cssClass='header-2',
executionSteps=['output'])
consequences = TextField('consequences', u'label_consequences',
description=u'Consequences.',
cssClass='header-2',
executionSteps=['output'])
workItems = SubReportField('workItems', u'Work Items', workItems = SubReportField('workItems', u'Work Items',
description=u'A list of work items belonging to the task.', description=u'A list of work items belonging to the task.',
reportFactory=MeetingMinutesWork, reportFactory=MeetingMinutesWork,
@ -345,6 +364,10 @@ class TaskRow(BaseRow):
def eventDescription(self): def eventDescription(self):
return self.event.description return self.event.description
@Lazy
def eventDate(self):
return self.event.start
@Lazy @Lazy
def eventStart(self): def eventStart(self):
return self.event.start return self.event.start
@ -353,8 +376,13 @@ class TaskRow(BaseRow):
def eventEnd(self): def eventEnd(self):
return self.event.end return self.event.end
@Lazy
def participants(self):
return self.event.participants
useRowProperty = BaseRow.useRowProperty useRowProperty = BaseRow.useRowProperty
attributeHandlers = dict( attributeHandlers = dict(
eventDate=useRowProperty,
eventStart=useRowProperty, eventStart=useRowProperty,
eventEnd=useRowProperty, eventEnd=useRowProperty,
) )
@ -367,8 +395,10 @@ class MeetingMinutes(WorkReportInstance):
rowFactory = TaskRow rowFactory = TaskRow
fields = Jeep((eventTitle, eventStart, eventEnd, eventDescription, fields = Jeep((eventTitle, eventDate, eventStart, eventEnd,
tasks, taskTitle, taskDescription, workItems)) eventDescription, participants,
tasks, taskTitle, responsible, taskDescription,
discussion, consequences, workItems))
defaultOutputFields = fields defaultOutputFields = fields
states = ('planned', 'accepted', 'done', 'done_x', 'finished') states = ('planned', 'accepted', 'done', 'done_x', 'finished')
taskTypeNames = ('agendaitem',) taskTypeNames = ('agendaitem',)