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:
parent
12061a6aa3
commit
c3a412a902
3 changed files with 101 additions and 17 deletions
|
@ -99,6 +99,9 @@ by calling the form controller's update method
|
|||
'created': ..., 'creator': '33', 'start': 1230487200,
|
||||
'duration': 4500, 'effort': 900}>]
|
||||
|
||||
Work items views
|
||||
----------------
|
||||
|
||||
>>> from loops.organize.work.browser import WorkItemView, WorkItemsView
|
||||
>>> wi01 = workItems['0000001']
|
||||
>>> view = WorkItemView(wi01, TestRequest())
|
||||
|
@ -112,6 +115,34 @@ by calling the form controller's update method
|
|||
>>> view.day, view.start, view.end
|
||||
(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
|
||||
=============
|
||||
|
|
|
@ -33,6 +33,7 @@ from zope.traversing.api import getName
|
|||
from cybertools.ajax import innerHtml
|
||||
from cybertools.browser.action import actions
|
||||
from cybertools.organize.interfaces import IWorkItems
|
||||
from cybertools.tracking.btree import getTimeStamp
|
||||
from loops.browser.action import DialogAction
|
||||
from loops.browser.concept import ConceptView
|
||||
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.tracking.browser import BaseTrackView
|
||||
from loops.organize.tracking.report import TrackDetails
|
||||
from loops.organize.work.base import WorkItem
|
||||
from loops import util
|
||||
from loops.util import _
|
||||
|
||||
|
@ -163,10 +165,7 @@ class WorkItemDetails(TrackDetails):
|
|||
return self.formatTimeStamp(self.track.created, 'dateTime')
|
||||
|
||||
def formatTimeDelta(self, value):
|
||||
if not value:
|
||||
return ''
|
||||
h, m = divmod(int(value) / 60, 60)
|
||||
return '%02i:%02i' % (h, m)
|
||||
return formatTimeDelta(value)
|
||||
|
||||
@Lazy
|
||||
def isLastInRun(self):
|
||||
|
@ -243,22 +242,58 @@ class CreateWorkItemForm(ObjectForm, BaseTrackView):
|
|||
if id is not None:
|
||||
workItems = self.loopsRoot.getRecordManager()['work']
|
||||
return workItems.get(id)
|
||||
return WorkItem(None, 0, None, {})
|
||||
|
||||
@Lazy
|
||||
def title(self):
|
||||
return self.track is not None and self.track.title or u''
|
||||
return self.track.title or u''
|
||||
|
||||
@Lazy
|
||||
def description(self):
|
||||
return self.track is not None and self.track.description or u''
|
||||
return self.track.description or u''
|
||||
|
||||
@Lazy
|
||||
def defaultDate(self):
|
||||
return time.strftime('%Y-%m-%d')
|
||||
def date(self):
|
||||
ts = self.track.start or getTimeStamp()
|
||||
return time.strftime('%Y-%m-%d', time.localtime(ts))
|
||||
|
||||
@Lazy
|
||||
def defaultTime(self):
|
||||
return time.strftime('%Y-%m-%dT%H:%M')
|
||||
def startTime(self):
|
||||
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):
|
||||
|
@ -368,3 +403,10 @@ def parseDate(s):
|
|||
if not s:
|
||||
return None
|
||||
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)
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
<form method="post" id="addWorkitem_form" class="dialog"
|
||||
dojoType="dijit.form.Form">
|
||||
<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"
|
||||
tal:attributes="value request/form/id|nothing" />
|
||||
<div class="heading" i18n:translate="">Add Work Item</div>
|
||||
|
@ -82,34 +82,45 @@
|
|||
dojoType="dijit.form.SimpleTextarea" style="width: 60em"
|
||||
tal:content="view/description"></textarea></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>
|
||||
<label i18n:translate="" for="start-end">Start - End</label>
|
||||
<div id="start-end">
|
||||
<input type="text" name="start_date" style="width: 8em"
|
||||
dojoType="dijit.form.DateTextBox"
|
||||
tal:attributes="value view/defaultDate" />
|
||||
tal:attributes="value view/date" />
|
||||
<input type="text" name="start_time" style="width: 6em"
|
||||
dojoType="dijit.form.TimeTextBox"
|
||||
tal:attributes="value view/defaultTime" /> -
|
||||
tal:attributes="value view/startTime" /> -
|
||||
<input type="text" name="end_time" style="width: 6em"
|
||||
dojoType="dijit.form.TimeTextBox"
|
||||
tal:attributes="value view/defaultTime" /></div>
|
||||
tal:attributes="value view/endTime" /></div>
|
||||
<label i18n:translate=""
|
||||
for="duration-effort">Duration / Effort (hh:mm)</label>
|
||||
<div id="duration-effort">
|
||||
<input type="text" name="duration" style="width: 5em"
|
||||
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"
|
||||
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>
|
||||
<label i18n:translate="" for="comment">Comment</label>
|
||||
<div>
|
||||
<textarea name="comment" cols="80" rows="4" id="comment"
|
||||
dojoType="dijit.form.SimpleTextarea"
|
||||
style="width: 60em"></textarea></div>
|
||||
style="width: 60em"
|
||||
tal:content="view/comment"></textarea></div>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<input value="Save" type="submit"
|
||||
|
|
Loading…
Add table
Reference in a new issue