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,
|
'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
|
||||||
=============
|
=============
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue