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_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 | # single work items | ||||||
| 
 | 
 | ||||||
| class WorkItemDetails(TrackDetails): | 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 | # forms and form controllers | ||||||
| 
 | 
 | ||||||
| class CreateWorkItemForm(ObjectForm, BaseTrackView): | class CreateWorkItemForm(ObjectForm, BaseTrackView): | ||||||
|  |  | ||||||
|  | @ -29,11 +29,11 @@ | ||||||
|       permission="zope.View" /> |       permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|   <zope:adapter |   <zope:adapter | ||||||
|         name="userworkitems.html" |         name="personworkitems.html" | ||||||
|         for="loops.interfaces.IConcept |         for="loops.interfaces.IConcept | ||||||
|              zope.publisher.interfaces.browser.IBrowserRequest" |              zope.publisher.interfaces.browser.IBrowserRequest" | ||||||
|         provides="zope.interface.Interface" |         provides="zope.interface.Interface" | ||||||
|         factory="loops.organize.work.browser.UserWorkItems" |         factory="loops.organize.work.browser.PersonWorkItems" | ||||||
|         permission="zope.View" /> |         permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|   <browser:page |   <browser:page | ||||||
|  |  | ||||||
|  | @ -6,21 +6,20 @@ | ||||||
| 
 | 
 | ||||||
| <metal:work define-macro="workitems" | <metal:work define-macro="workitems" | ||||||
|             tal:define="work nocall:view/workItems" |             tal:define="work nocall:view/workItems" | ||||||
|             tal:condition="work/allWorkItems"> |             tal:condition="work/listWorkItems"> | ||||||
|   <br /> |   <br /> | ||||||
|   <h2 i18n:translate="">Work Items</h2> |   <h2 i18n:translate="">Work Items</h2> | ||||||
|   <metal:workitems define-macro="workitems_listing" |   <metal:workitems define-macro="workitems_listing" | ||||||
|                    tal:define="work nocall:work|nocall:view/workItems;"> |                    tal:define="work nocall:work|nocall:view/workItems;"> | ||||||
|     <table class="listing"> |     <table class="listing"> | ||||||
|       <tr> |       <tr> | ||||||
|         <tal:colheader repeat="column python: |         <tal:colheader repeat="column work/allColumns"> | ||||||
|                 ('Day', 'Start', 'End', 'Duration', 'Task', 'User', 'Title', 'Info')"> |  | ||||||
|           <th tal:condition="python: column in work.columns" |           <th tal:condition="python: column in work.columns" | ||||||
|               tal:content="column" |               tal:content="column" | ||||||
|               i18n:translate="">Task</th> |               i18n:translate="">Task</th> | ||||||
|         </tal:colheader> |         </tal:colheader> | ||||||
|       </tr> |       </tr> | ||||||
|       <tal:workitem tal:repeat="row work/allWorkItems"> |       <tal:workitem tal:repeat="row work/listWorkItems"> | ||||||
|         <tr tal:condition="row/monthChanged"> |         <tr tal:condition="row/monthChanged"> | ||||||
|           <td class="headline" |           <td class="headline" | ||||||
|               tal:attributes="colspan python: len(work.columns)" |               tal:attributes="colspan python: len(work.columns)" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm