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:header use-macro="item/macros/header" /> <metal:page use-macro="item/macros/page_header" />
<metal:results use-macro="reportView/resultsRenderer" /> <table class="report" width="100%"
</div> tal:define="showCheckboxes nothing">
<metal:header use-macro="item/macros/header" />
<metal:header use-macro="item/macros/rows" />
<div metal:define-macro="header"
tal:define="row results/first">
<h1 i18n:translate="">Meeting Minutes</h1>
<h2 tal:define="col fields/eventTitle">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></h2>
<div>
<span tal:define="col fields/eventStart">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span> -
<span tal:define="col fields/eventEnd">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span>
</div>
<div tal:define="col fields/eventDescription">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></div>
</div>
<div metal:define-macro="results">
<table class="report"
tal:define="showCheckboxes cb_name|nothing">
<tr>
<th tal:condition="showCheckboxes"
style="border: 1px solid grey">
<input type="checkbox" checked
tal:attributes="onclick
string:toggleCheckBoxes(this, '$cb_name:list')" /></th>
<th i18n:translate=""
style="border: 1px solid grey">Task/Action</th>
<th style="border: 1px solid grey"
i18n:translate="">Who?</th>
<th style="border: 1px solid grey"
i18n:translate="">When?</th>
<th style="border: 1px solid grey"
i18n:translate=""></th>
</tr>
<tal:task repeat="row results">
<tr tal:repeat="colname python: ('title', 'description',)">
<td tal:condition="showCheckboxes"
style="border: 1px solid grey">
<input type="checkbox" checked
tal:condition="python:colname == 'title'"
tal:attributes="name string:$cb_name:list;
value row/context/uid" /></td>
<td style="border: 1px solid grey"
tal:define="col report/fields/?colname"
tal:attributes="class col/cssClass">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</td>
<td style="border: 1px solid grey" />
<td style="border: 1px solid grey" />
<td style="border: 1px solid grey" />
</tr>
<tal:workitems define="col report/fields/workItems">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</tal:workitems>
</tal:task>
</table> </table>
</div> </div>
<div metal:define-macro="subreport" <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">
<tr>
<td colspan="4">
<div tal:define="col fields/eventTitle">
<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">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span> -
<span tal:define="col fields/eventEnd">
<metal:col use-macro="python:item.getColumnRenderer(col)" /></span>
</td>
</tr>
<tr>
<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>
<metal:results define-macro="results">
<table class="report"
tal:define="showCheckboxes cb_name|nothing">
<metal:rows define-macro="rows">
<tr tal:condition="showCheckboxes">
<th style="border: 1px solid grey; width: 5%">
<input type="checkbox" checked
tal:attributes="onclick
string:toggleCheckBoxes(this, '$cb_name:list')" /></th>
<th colspan="4"
i18n:translate=""
style="border: 1px solid grey">Copy Agenda Items</th>
</tr>
<tal:task repeat="row results">
<tr>
<td tal:condition="showCheckboxes"
style="border: 1px solid grey">
<input type="checkbox" checked
tal:attributes="name string:$cb_name:list;
value row/context/uid" /></td>
<td colspan="4"
style="border: 1px solid grey"
tal:define="col report/fields/title"
tal:attributes="class col/cssClass">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</td>
</tr>
<tr tal:repeat="colname python:
('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>
<tal:workitems define="col report/fields/workItems">
<metal:column use-macro="python:
reportView.getColumnRenderer(col)" />
</tal:workitems>
</tal:task>
</metal:rows>
</table>
</metal:results>
<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',)