work in progress: edit work items with different actions

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3157 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-01-18 11:19:39 +00:00
parent 12061a6aa3
commit c3a412a902
3 changed files with 101 additions and 17 deletions

View file

@ -99,6 +99,9 @@ by calling the form controller's update method
'created': ..., 'creator': '33', 'start': 1230487200, 'created': ..., 'creator': '33', 'start': 1230487200,
'duration': 4500, 'effort': 900}>] 'duration': 4500, 'effort': 900}>]
Work items views
----------------
>>> from loops.organize.work.browser import WorkItemView, WorkItemsView >>> from loops.organize.work.browser import WorkItemView, WorkItemsView
>>> wi01 = workItems['0000001'] >>> wi01 = workItems['0000001']
>>> view = WorkItemView(wi01, TestRequest()) >>> view = WorkItemView(wi01, TestRequest())
@ -112,6 +115,34 @@ by calling the form controller's update method
>>> view.day, view.start, view.end >>> view.day, view.start, view.end
(u'08/12/28', u'19:00', u'20:15') (u'08/12/28', u'19:00', u'20:15')
Work items life cycle
---------------------
Let's create another work item, now in state planned.
>>> input = {u'form.action': u'create_workitem', u'workitem.action': u'plan',
... u'title': u'Install Zope',
... u'start_date': u'2009-01-19', u'start_time': u'T09:00:00'}
>>> request = TestRequest(form=input)
>>> request.setPrincipal(pJohn)
>>> nodeView = NodeView(home, request)
>>> cwiController = CreateWorkItem(nodeView, request)
>>> cwiController.update()
False
If we now open another form, providing the identifier of the newly created
work item, the form will be pre-filled with some of the item's data.
>>> form = CreateWorkItemForm(home, TestRequest(form=dict(id='0000002')))
>>> form.title
u'Install Zope'
>>> form.actions
[{'name': 'plan', 'title': 'plan'}, {'name': 'accept', 'title': 'accept'},
{'name': 'start', 'title': 'start working'}, {'name': 'work', 'title': 'work'},
{'name': 'finish', 'title': 'finish'}, {'name': 'cancel', 'title': 'cancel'},
{'name': 'modify', 'title': 'modify'}]
Fin de partie Fin de partie
============= =============

View file

@ -33,6 +33,7 @@ from zope.traversing.api import getName
from cybertools.ajax import innerHtml from cybertools.ajax import innerHtml
from cybertools.browser.action import actions from cybertools.browser.action import actions
from cybertools.organize.interfaces import IWorkItems from cybertools.organize.interfaces import IWorkItems
from cybertools.tracking.btree import getTimeStamp
from loops.browser.action import DialogAction from loops.browser.action import DialogAction
from loops.browser.concept import ConceptView from loops.browser.concept import ConceptView
from loops.browser.form import ObjectForm, EditObject from loops.browser.form import ObjectForm, EditObject
@ -41,6 +42,7 @@ from loops.organize.party import getPersonForUser
from loops.organize.stateful.browser import StateAction from loops.organize.stateful.browser import StateAction
from loops.organize.tracking.browser import BaseTrackView from loops.organize.tracking.browser import BaseTrackView
from loops.organize.tracking.report import TrackDetails from loops.organize.tracking.report import TrackDetails
from loops.organize.work.base import WorkItem
from loops import util from loops import util
from loops.util import _ from loops.util import _
@ -163,10 +165,7 @@ class WorkItemDetails(TrackDetails):
return self.formatTimeStamp(self.track.created, 'dateTime') return self.formatTimeStamp(self.track.created, 'dateTime')
def formatTimeDelta(self, value): def formatTimeDelta(self, value):
if not value: return formatTimeDelta(value)
return ''
h, m = divmod(int(value) / 60, 60)
return '%02i:%02i' % (h, m)
@Lazy @Lazy
def isLastInRun(self): def isLastInRun(self):
@ -243,22 +242,58 @@ class CreateWorkItemForm(ObjectForm, BaseTrackView):
if id is not None: if id is not None:
workItems = self.loopsRoot.getRecordManager()['work'] workItems = self.loopsRoot.getRecordManager()['work']
return workItems.get(id) return workItems.get(id)
return WorkItem(None, 0, None, {})
@Lazy @Lazy
def title(self): def title(self):
return self.track is not None and self.track.title or u'' return self.track.title or u''
@Lazy @Lazy
def description(self): def description(self):
return self.track is not None and self.track.description or u'' return self.track.description or u''
@Lazy @Lazy
def defaultDate(self): def date(self):
return time.strftime('%Y-%m-%d') ts = self.track.start or getTimeStamp()
return time.strftime('%Y-%m-%d', time.localtime(ts))
@Lazy @Lazy
def defaultTime(self): def startTime(self):
return time.strftime('%Y-%m-%dT%H:%M') ts = self.track.start or getTimeStamp()
return time.strftime('%Y-%m-%dT%H:%M', time.localtime(ts))
@Lazy
def endTime(self):
if self.state == 'running':
ts = getTimeStamp()
else:
ts = self.track.end or getTimeStamp()
return time.strftime('%Y-%m-%dT%H:%M', time.localtime(ts))
@Lazy
def state(self):
return self.track.state
@Lazy
def actions(self):
return [dict(name=t.name, title=t.title)
for t in self.track.getAvailableTransitions()]
@Lazy
def duration(self):
if self.state == 'running':
return u''
return formatTimeDelta(self.track.duration)
@Lazy
def effort(self):
if self.state == 'running':
return u''
return formatTimeDelta(self.track.effort)
@Lazy
def comment(self):
return self.track.comment or u''
class CreateWorkItem(EditObject, BaseTrackView): class CreateWorkItem(EditObject, BaseTrackView):
@ -368,3 +403,10 @@ def parseDate(s):
if not s: if not s:
return None return None
return int(time.mktime(time.strptime(s, '%Y-%m-%d'))) return int(time.mktime(time.strptime(s, '%Y-%m-%d')))
def formatTimeDelta(value):
if not value:
return u''
h, m = divmod(int(value) / 60, 60)
return u'%02i:%02i' % (h, m)

View file

@ -64,7 +64,7 @@
<form method="post" id="addWorkitem_form" class="dialog" <form method="post" id="addWorkitem_form" class="dialog"
dojoType="dijit.form.Form"> dojoType="dijit.form.Form">
<input type="hidden" name="form.action" value="create_workitem" /> <input type="hidden" name="form.action" value="create_workitem" />
<input type="hidden" name="workitem.action" value="finish" /> <!--<input type="hidden" name="workitem.action" value="finish" />-->
<input type="hidden" name="id" <input type="hidden" name="id"
tal:attributes="value request/form/id|nothing" /> tal:attributes="value request/form/id|nothing" />
<div class="heading" i18n:translate="">Add Work Item</div> <div class="heading" i18n:translate="">Add Work Item</div>
@ -82,34 +82,45 @@
dojoType="dijit.form.SimpleTextarea" style="width: 60em" dojoType="dijit.form.SimpleTextarea" style="width: 60em"
tal:content="view/description"></textarea></div> tal:content="view/description"></textarea></div>
</div> </div>
<div>
<label i18n:translate="" for="action">Action</label>
<select name="workitem.action" id="action">
<option tal:repeat="action view/actions"
tal:attributes="value action/name"
tal:content="action/title" />
</select>
</div>
<div> <div>
<label i18n:translate="" for="start-end">Start - End</label> <label i18n:translate="" for="start-end">Start - End</label>
<div id="start-end"> <div id="start-end">
<input type="text" name="start_date" style="width: 8em" <input type="text" name="start_date" style="width: 8em"
dojoType="dijit.form.DateTextBox" dojoType="dijit.form.DateTextBox"
tal:attributes="value view/defaultDate" /> tal:attributes="value view/date" />
<input type="text" name="start_time" style="width: 6em" <input type="text" name="start_time" style="width: 6em"
dojoType="dijit.form.TimeTextBox" dojoType="dijit.form.TimeTextBox"
tal:attributes="value view/defaultTime" /> - tal:attributes="value view/startTime" /> -
<input type="text" name="end_time" style="width: 6em" <input type="text" name="end_time" style="width: 6em"
dojoType="dijit.form.TimeTextBox" dojoType="dijit.form.TimeTextBox"
tal:attributes="value view/defaultTime" /></div> tal:attributes="value view/endTime" /></div>
<label i18n:translate="" <label i18n:translate=""
for="duration-effort">Duration / Effort (hh:mm)</label> for="duration-effort">Duration / Effort (hh:mm)</label>
<div id="duration-effort"> <div id="duration-effort">
<input type="text" name="duration" style="width: 5em" <input type="text" name="duration" style="width: 5em"
dojoType="dijit.form.ValidationTextBox" dojoType="dijit.form.ValidationTextBox"
regexp="[0-9]{1,2}(:[0-5][0-9]){0,1}" /> / regexp="[0-9]{1,2}(:[0-5][0-9]){0,1}"
tal:attributes="value view/duration" /> /
<input type="text" name="effort" style="width: 5em" <input type="text" name="effort" style="width: 5em"
dojoType="dijit.form.ValidationTextBox" dojoType="dijit.form.ValidationTextBox"
regexp="[0-9]{1,2}(:[0-5][0-9]){0,1}" /></div> regexp="[0-9]{1,2}(:[0-5][0-9]){0,1}"
tal:attributes="value view/effort" /></div>
</div> </div>
<div> <div>
<label i18n:translate="" for="comment">Comment</label> <label i18n:translate="" for="comment">Comment</label>
<div> <div>
<textarea name="comment" cols="80" rows="4" id="comment" <textarea name="comment" cols="80" rows="4" id="comment"
dojoType="dijit.form.SimpleTextarea" dojoType="dijit.form.SimpleTextarea"
style="width: 60em"></textarea></div> style="width: 60em"
tal:content="view/comment"></textarea></div>
</div> </div>
<div class="buttons"> <div class="buttons">
<input value="Save" type="submit" <input value="Save" type="submit"