meeting minutes improvements
create follow-up event: automatic creation of work items on new agenda item if selected; finished work items are not selected append new child to end of existing children if option 'children_append' is set and children is already ordered manually
This commit is contained in:
parent
1b8146b683
commit
9b4098c9da
6 changed files with 66 additions and 26 deletions
|
@ -45,6 +45,7 @@ from cybertools.composer.schema.grid.field import grid_macros
|
|||
from cybertools.composer.schema.interfaces import ISchemaFactory
|
||||
from cybertools.composer.schema.browser.common import schema_macros, schema_edit_macros
|
||||
from cybertools.composer.schema.schema import FormState
|
||||
from cybertools.meta.interfaces import IOptions
|
||||
from cybertools.stateful.interfaces import IStateful
|
||||
from cybertools.typology.interfaces import IType, ITypeManager
|
||||
from cybertools.util.format import toUnicode
|
||||
|
@ -727,6 +728,13 @@ class EditConcept(EditObject):
|
|||
return obj.getParentRelations(predicates=predicates, parent=concept)
|
||||
|
||||
def assignConcept(self, obj, concept, predicate):
|
||||
if IOptions(adapted(concept.conceptType)).children_append:
|
||||
sibRelations = concept.getChildRelations()
|
||||
if sibRelations:
|
||||
maxOrder = max([r.order for r in sibRelations])
|
||||
if maxOrder > 0:
|
||||
return obj.assignParent(concept, predicate,
|
||||
order=maxOrder+1)
|
||||
obj.assignParent(concept, predicate)
|
||||
|
||||
def deassignConcept(self, obj, concept, predicates):
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgstr ""
|
|||
|
||||
"Project-Id-Version: $Id$\n"
|
||||
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
||||
"PO-Revision-Date: 2012-07-26 12:00 CET\n"
|
||||
"PO-Revision-Date: 2012-08-09 12:00 CET\n"
|
||||
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
|
||||
"Language-Team: loops developers <helmutm@cy55.de>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
@ -275,6 +275,12 @@ msgstr "Eine neues Projekt anlegen."
|
|||
msgid "Create Work Item..."
|
||||
msgstr "Aktivität anlegen..."
|
||||
|
||||
msgid "Create a work item for this object."
|
||||
msgstr "Eine Aktivität zu diesem Objekt anlegen."
|
||||
|
||||
msgid "Add Work Item"
|
||||
msgstr "Aktivität anlegen/bearbeiten"
|
||||
|
||||
msgid "Edit Video..."
|
||||
msgstr "Video bearbeiten..."
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ from loops.browser.node import NodeView
|
|||
from loops.common import adapted, baseObject
|
||||
from loops.concept import Concept
|
||||
from loops.organize.work.meeting import MeetingMinutes
|
||||
from loops.organize.tracking.report import TrackDetails
|
||||
from loops.setup import addAndConfigureObject
|
||||
from loops.util import _
|
||||
from loops import util
|
||||
|
@ -317,9 +318,21 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController):
|
|||
result = super(CreateFollowUpEvent, self).update()
|
||||
form = self.request.form
|
||||
toBeAssigned = form.get('cb_select_tasks') or []
|
||||
for uid in toBeAssigned:
|
||||
task = util.getObjectForUid(uid)
|
||||
self.createFollowUpTask(adapted(task))
|
||||
taskId = newTask = None
|
||||
workItems = self.view.loopsRoot.getRecordManager()['work']
|
||||
for id in sorted(toBeAssigned):
|
||||
if not '.' in id:
|
||||
taskId = id
|
||||
task = util.getObjectForUid(id)
|
||||
newTask = self.createFollowUpTask(adapted(task))
|
||||
else:
|
||||
tId, trackId = id.split('.')
|
||||
if tId == taskId:
|
||||
track = workItems.get(trackId)
|
||||
if track is not None:
|
||||
td = TrackDetails(self.view, track)
|
||||
newTId = self.view.getUidForObject(newTask)
|
||||
track.doAction('move', td.personId, task=newTId)
|
||||
return result
|
||||
|
||||
def createFollowUpTask(self, source):
|
||||
|
|
|
@ -86,19 +86,21 @@
|
|||
style="border: 1px solid grey">Copy Agenda Items</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td tal:condition="showCheckboxes" style="width: 2%"> </td>
|
||||
<td style="width: 15%"> </td>
|
||||
<td style="width: 53%"> </td>
|
||||
<td style="width: 20%"> </td>
|
||||
<td style="width: 12%"> </td>
|
||||
</tr>
|
||||
<tal:task repeat="row results">
|
||||
<tal:tasks repeat="row results">
|
||||
<tal:task define="taskUid row/context/uid">
|
||||
<tr class="agenda-item-headline"
|
||||
style="background-color: #777777">
|
||||
<td tal:condition="showCheckboxes"
|
||||
style="border: 1px solid grey">
|
||||
style="border: 1px solid grey" class="center">
|
||||
<input type="checkbox" checked
|
||||
tal:attributes="name string:$cb_name:list;
|
||||
value row/context/uid" /></td>
|
||||
value taskUid" /></td>
|
||||
<td colspan="4"
|
||||
style="border: 1px solid grey"
|
||||
tal:define="col report/fields/title"
|
||||
|
@ -126,33 +128,41 @@
|
|||
</tal:field>
|
||||
</tr>
|
||||
</tal:item>
|
||||
<tr style="background-color: #eeeeee">
|
||||
<td style="border: 1px solid grey"
|
||||
tal:condition="showCheckboxes"></td>
|
||||
<td colspan="2"
|
||||
style="border: 1px solid grey; width: 68%"
|
||||
i18n:translate="">header_workitems</td>
|
||||
<td style="border: 1px solid grey; width: 20%"
|
||||
i18n:translate="">header_responsible</td>
|
||||
<td style="border: 1px solid grey; width: 12%; text-align: center"
|
||||
i18n:translate="">header_deadline</td>
|
||||
</tr>
|
||||
<tal:workitems define="col report/fields/workItems">
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
<tal:workitems define="col report/fields/workItems;
|
||||
results python:col.getValue(row)"
|
||||
condition="results/result">
|
||||
<tr style="background-color: #eeeeee">
|
||||
<td style="border: 1px solid grey"
|
||||
tal:condition="showCheckboxes"></td>
|
||||
<td colspan="2"
|
||||
style="border: 1px solid grey; width: 68%"
|
||||
i18n:translate="">header_workitems</td>
|
||||
<td style="border: 1px solid grey; width: 20%"
|
||||
i18n:translate="">header_responsible</td>
|
||||
<td style="border: 1px solid grey; width: 12%" class="center"
|
||||
i18n:translate="">header_deadline</td>
|
||||
</tr>
|
||||
<metal:column use-macro="python:
|
||||
reportView.getColumnRenderer(col)" />
|
||||
</tal:workitems>
|
||||
</tal:task>
|
||||
</tal:task>
|
||||
</tal:tasks>
|
||||
</metal:rows>
|
||||
</table>
|
||||
</metal:results>
|
||||
|
||||
|
||||
<metal:sub define-macro="subreport"
|
||||
tal:define="results python:col.getValue(row);
|
||||
fields results/displayedColumns">
|
||||
tal:define="fields results/displayedColumns">
|
||||
<tr class="listing" tal:repeat="row results">
|
||||
<td tal:condition="showCheckboxes"
|
||||
style="border: 1px solid grey" />
|
||||
style="border: 1px solid grey" class="center">
|
||||
<input type="checkbox"
|
||||
tal:define="trackId row/context/name"
|
||||
tal:attributes="name string:$cb_name:list;
|
||||
value string:$taskUid.$trackId;
|
||||
checked row/isActive" />
|
||||
</td>
|
||||
<td colspan="2"
|
||||
tal:define="col fields/title"
|
||||
tal:attributes="class col/cssClass"
|
||||
|
|
|
@ -282,7 +282,10 @@ class WorkReportInstance(ReportInstance):
|
|||
|
||||
class MeetingMinutesWorkRow(WorkRow):
|
||||
|
||||
pass
|
||||
@Lazy
|
||||
def isActive(self):
|
||||
return self.context.state not in (
|
||||
'finished', 'closed', 'cancelled')
|
||||
|
||||
|
||||
class MeetingMinutesWork(WorkReportInstance, SubReport):
|
||||
|
|
Loading…
Add table
Reference in a new issue