some minor refactorings as preparation for more flexible queries
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3171 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									da8c54e0ea
								
							
						
					
					
						commit
						afa64c7028
					
				
					 3 changed files with 86 additions and 88 deletions
				
			
		|  | @ -50,88 +50,6 @@ from loops.util import _ | |||
| work_macros = ViewPageTemplateFile('work_macros.pt') | ||||
| 
 | ||||
| 
 | ||||
| # work item collections | ||||
| 
 | ||||
| class BaseWorkItemsView(object): | ||||
| 
 | ||||
|     columns = set(['Task', 'User', 'Title', 'Start', 'End', 'Duration', 'Info']) | ||||
| 
 | ||||
|     lastMonth = lastDay = None | ||||
| 
 | ||||
|     def __init__(self, context, request): | ||||
|         self.context = context | ||||
|         self.request = request | ||||
| 
 | ||||
|     @Lazy | ||||
|     def work_macros(self): | ||||
|         return work_macros.macros | ||||
| 
 | ||||
|     @Lazy | ||||
|     def workItems(self): | ||||
|         rm = self.loopsRoot.getRecordManager() | ||||
|         if rm is not None: | ||||
|             ts = rm.get('work') | ||||
|             if ts is not None: | ||||
|                 return IWorkItems(ts) | ||||
| 
 | ||||
|     @Lazy | ||||
|     def workItemsCriteria(self): | ||||
|         result = {} | ||||
|         form = self.request.form | ||||
|         start = parseDate(form.get('wi_start')) | ||||
|         end = parseDate(form.get('wi_end')) | ||||
|         if end: | ||||
|             end += 3600 * 24    # include full end date | ||||
|         if start or end: | ||||
|             result['timeFromTo'] = (start, end) | ||||
|         return result | ||||
| 
 | ||||
| 
 | ||||
| class WorkItemsView(BaseWorkItemsView, NodeView): | ||||
|     """ Standard view for showing work items for a node's target. | ||||
|     """ | ||||
| 
 | ||||
|     columns = set(['User', 'Title', 'Day', 'Start', 'End', 'Duration', 'Info']) | ||||
| 
 | ||||
|     @Lazy | ||||
|     def allWorkItems(self): | ||||
|         result = [] | ||||
|         target = self.virtualTargetObject | ||||
|         workItems = self.workItems | ||||
|         if None in (workItems, target): | ||||
|             return result | ||||
|         criteria = self.workItemsCriteria | ||||
|         criteria['task'] = util.getUidForObject(target) | ||||
|         for wi in workItems.query(**criteria): | ||||
|             result.append(WorkItemDetails(self, wi)) | ||||
|         return sorted(result, key=lambda x: x.track.timeStamp) | ||||
| 
 | ||||
| 
 | ||||
| class UserWorkItems(BaseWorkItemsView, ConceptView): | ||||
|     """ A query view showing work items for a person, the query's parent. | ||||
|     """ | ||||
| 
 | ||||
|     columns = set(['Task', 'Title', 'Day', 'Start', 'End', 'Duration', 'Info']) | ||||
| 
 | ||||
|     @property | ||||
|     def macro(self): | ||||
|         return self.work_macros['userworkitems'] | ||||
| 
 | ||||
|     @Lazy | ||||
|     def allWorkItems(self): | ||||
|         workItems = self.workItems | ||||
|         if self.workItems is None: | ||||
|             return [] | ||||
|         result = [] | ||||
|         for target in self.context.getParents([self.defaultPredicate]): | ||||
|             criteria = dict(self.workItemsCriteria) | ||||
|             un = criteria.setdefault('userName', []) | ||||
|             un.append(util.getUidForObject(target)) | ||||
|             for wi in workItems.query(**criteria): | ||||
|                 result.append(WorkItemDetails(self, wi)) | ||||
|         return sorted(result, key=lambda x: x.track.timeStamp) | ||||
| 
 | ||||
| 
 | ||||
| # single work items | ||||
| 
 | ||||
| class WorkItemDetails(TrackDetails): | ||||
|  | @ -228,6 +146,87 @@ class WorkItemView(BaseTrackView): | |||
|     """ | ||||
| 
 | ||||
| 
 | ||||
| # work item collections | ||||
| 
 | ||||
| class BaseWorkItemsView(object): | ||||
| 
 | ||||
|     allColumns = set(['Task', 'User', 'Title', 'Start', 'End', 'Duration', 'Info']) | ||||
|     columns = allColumns | ||||
|     detailsFactory = WorkItemDetails | ||||
| 
 | ||||
|     lastMonth = lastDay = None | ||||
| 
 | ||||
|     def __init__(self, context, request): | ||||
|         self.context = context | ||||
|         self.request = request | ||||
| 
 | ||||
|     @Lazy | ||||
|     def work_macros(self): | ||||
|         return work_macros.macros | ||||
| 
 | ||||
|     @Lazy | ||||
|     def workItems(self): | ||||
|         rm = self.loopsRoot.getRecordManager() | ||||
|         if rm is not None: | ||||
|             ts = rm.get('work') | ||||
|             if ts is not None: | ||||
|                 return IWorkItems(ts) | ||||
| 
 | ||||
|     @Lazy | ||||
|     def baseCriteria(self): | ||||
|         result = {} | ||||
|         form = self.request.form | ||||
|         start = parseDate(form.get('wi_start')) | ||||
|         end = parseDate(form.get('wi_end')) | ||||
|         if end: | ||||
|             end += 3600 * 24    # include full end date | ||||
|         if start or end: | ||||
|             result['timeFromTo'] = (start, end) | ||||
|         state = form.get('wi_state') | ||||
|         if state is not None: | ||||
|             result['state'] = state | ||||
|         return result | ||||
| 
 | ||||
|     def query(self, **criteria): | ||||
|         if self.workItems is None: | ||||
|             return [] | ||||
|         return [self.detailsFactory(self, wi) | ||||
|                 for wi in self.workItems.query(**criteria)] | ||||
| 
 | ||||
| 
 | ||||
| class WorkItemsView(BaseWorkItemsView, NodeView): | ||||
|     """ Standard view for showing work items for a node's target. | ||||
|     """ | ||||
| 
 | ||||
|     columns = set(['User', 'Title', 'Day', 'Start', 'End', 'Duration', 'Info']) | ||||
| 
 | ||||
|     @Lazy | ||||
|     def listWorkItems(self): | ||||
|         target = self.virtualTargetObject | ||||
|         criteria = self.baseCriteria | ||||
|         criteria['task'] = util.getUidForObject(target) | ||||
|         return sorted(self.query(**criteria), key=lambda x: x.track.timeStamp) | ||||
| 
 | ||||
| 
 | ||||
| class PersonWorkItems(BaseWorkItemsView, ConceptView): | ||||
|     """ A query view showing work items for a person, the query's parent. | ||||
|     """ | ||||
| 
 | ||||
|     columns = set(['Task', 'Title', 'Day', 'Start', 'End', 'Duration', 'Info']) | ||||
| 
 | ||||
|     @property | ||||
|     def macro(self): | ||||
|         return self.work_macros['userworkitems'] | ||||
| 
 | ||||
|     @Lazy | ||||
|     def listWorkItems(self): | ||||
|         criteria = self.baseCriteria | ||||
|         for target in self.context.getParents([self.defaultPredicate]): | ||||
|             un = criteria.setdefault('userName', []) | ||||
|             un.append(util.getUidForObject(target)) | ||||
|         return sorted(self.query(**criteria), key=lambda x: x.track.timeStamp) | ||||
| 
 | ||||
| 
 | ||||
| # forms and form controllers | ||||
| 
 | ||||
| class CreateWorkItemForm(ObjectForm, BaseTrackView): | ||||
|  |  | |||
|  | @ -29,11 +29,11 @@ | |||
|       permission="zope.View" /> | ||||
| 
 | ||||
|   <zope:adapter | ||||
|         name="userworkitems.html" | ||||
|         name="personworkitems.html" | ||||
|         for="loops.interfaces.IConcept | ||||
|              zope.publisher.interfaces.browser.IBrowserRequest" | ||||
|         provides="zope.interface.Interface" | ||||
|         factory="loops.organize.work.browser.UserWorkItems" | ||||
|         factory="loops.organize.work.browser.PersonWorkItems" | ||||
|         permission="zope.View" /> | ||||
| 
 | ||||
|   <browser:page | ||||
|  |  | |||
|  | @ -6,21 +6,20 @@ | |||
| 
 | ||||
| <metal:work define-macro="workitems" | ||||
|             tal:define="work nocall:view/workItems" | ||||
|             tal:condition="work/allWorkItems"> | ||||
|             tal:condition="work/listWorkItems"> | ||||
|   <br /> | ||||
|   <h2 i18n:translate="">Work Items</h2> | ||||
|   <metal:workitems define-macro="workitems_listing" | ||||
|                    tal:define="work nocall:work|nocall:view/workItems;"> | ||||
|     <table class="listing"> | ||||
|       <tr> | ||||
|         <tal:colheader repeat="column python: | ||||
|                 ('Day', 'Start', 'End', 'Duration', 'Task', 'User', 'Title', 'Info')"> | ||||
|         <tal:colheader repeat="column work/allColumns"> | ||||
|           <th tal:condition="python: column in work.columns" | ||||
|               tal:content="column" | ||||
|               i18n:translate="">Task</th> | ||||
|         </tal:colheader> | ||||
|       </tr> | ||||
|       <tal:workitem tal:repeat="row work/allWorkItems"> | ||||
|       <tal:workitem tal:repeat="row work/listWorkItems"> | ||||
|         <tr tal:condition="row/monthChanged"> | ||||
|           <td class="headline" | ||||
|               tal:attributes="colspan python: len(work.columns)" | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm