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
	
	 helmutm
						helmutm