new report 'person work statement', + minor improvements for generic concept-based reports
This commit is contained in:
		
							parent
							
								
									4051c2f9a5
								
							
						
					
					
						commit
						e272675498
					
				
					 5 changed files with 65 additions and 14 deletions
				
			
		|  | @ -26,7 +26,7 @@ | ||||||
| 
 | 
 | ||||||
| <div metal:define-macro="header"> | <div metal:define-macro="header"> | ||||||
|     <metal:block use-macro="view/concept_macros/concepttitle" /> |     <metal:block use-macro="view/concept_macros/concepttitle" /> | ||||||
|     <form method="post" name="report_data" class="report-meta"> |     <form method="get" name="report_data" class="report-meta"> | ||||||
|       <input type="hidden" name="show_results" value="True" /> |       <input type="hidden" name="show_results" value="True" /> | ||||||
|       <tal:hidden define="params item/dynamicParams" |       <tal:hidden define="params item/dynamicParams" | ||||||
|                   tal:condition="nothing"> |                   tal:condition="nothing"> | ||||||
|  | @ -48,12 +48,14 @@ | ||||||
|       </div> |       </div> | ||||||
|       <br /> |       <br /> | ||||||
|     </form> |     </form> | ||||||
|  |     <tal:ignore condition="nothing"> | ||||||
|       <tal:list condition="renderer"> |       <tal:list condition="renderer"> | ||||||
|         <div metal:use-macro="renderer" /> |         <div metal:use-macro="renderer" /> | ||||||
|       </tal:list> |       </tal:list> | ||||||
|       <tal:list condition="not:renderer"> |       <tal:list condition="not:renderer"> | ||||||
|         <div metal:use-macro="view/concept_macros/conceptchildren" /> |         <div metal:use-macro="view/concept_macros/conceptchildren" /> | ||||||
|       </tal:list> |       </tal:list> | ||||||
|  |     </tal:ignore> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -236,6 +236,10 @@ class ResultsConceptView(ConceptView): | ||||||
|         if opt: |         if opt: | ||||||
|             return opt[0] |             return opt[0] | ||||||
| 
 | 
 | ||||||
|  |     #@Lazy | ||||||
|  |     #def reportDownload(self): | ||||||
|  |     #    return self.downloadLink | ||||||
|  | 
 | ||||||
|     def isSortableColumn(self, tableName, colName): |     def isSortableColumn(self, tableName, colName): | ||||||
|         if tableName == 'results': |         if tableName == 'results': | ||||||
|             if colName in [f.name for f in self.reportInstance.getSortFields()]: |             if colName in [f.name for f in self.reportInstance.getSortFields()]: | ||||||
|  |  | ||||||
|  | @ -41,8 +41,9 @@ | ||||||
|   <tal:download condition="item/downloadLink"> |   <tal:download condition="item/downloadLink"> | ||||||
|     <div class="button"> |     <div class="button"> | ||||||
|       <a i18n:translate="" |       <a i18n:translate="" | ||||||
|          tal:define="params python:item.getSortParams(tableName)" |          tal:define="dl string:${item/downloadLink}${item/urlParamString}; | ||||||
|          tal:attributes="href string:${item/downloadLink}$params">Download Data</a> |                      params python:item.getSortParams(tableName)" | ||||||
|  |          tal:attributes="href dl">Download Data</a> | ||||||
|     </div> |     </div> | ||||||
|     <br /> |     <br /> | ||||||
|   </tal:download> |   </tal:download> | ||||||
|  |  | ||||||
|  | @ -107,6 +107,18 @@ | ||||||
|       class="loops.organize.work.report.WorkStatementCSVExport" |       class="loops.organize.work.report.WorkStatementCSVExport" | ||||||
|       permission="zope.View" /> |       permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|  |   <zope:adapter  | ||||||
|  |       name="person_work_statement" | ||||||
|  |       factory="loops.organize.work.report.PersonWorkReportInstance" | ||||||
|  |       provides="loops.expert.report.IReportInstance" | ||||||
|  |       trusted="True" /> | ||||||
|  |   <zope:class class="loops.organize.work.report.PersonWorkReportInstance"> | ||||||
|  |     <require permission="zope.View" | ||||||
|  |              interface="loops.expert.report.IReportInstance" /> | ||||||
|  |     <require permission="zope.ManageContent" | ||||||
|  |              set_schema="loops.expert.report.IReportInstance" /> | ||||||
|  |   </zope:class> | ||||||
|  | 
 | ||||||
|   <zope:adapter  |   <zope:adapter  | ||||||
|       name="meeting_minutes" |       name="meeting_minutes" | ||||||
|       factory="loops.organize.work.report.MeetingMinutes" |       factory="loops.organize.work.report.MeetingMinutes" | ||||||
|  |  | ||||||
|  | @ -120,7 +120,7 @@ deadline = TrackDateField('deadline', u'Deadline', | ||||||
| dayFrom = TrackDateField('dayFrom', u'Start Day', | dayFrom = TrackDateField('dayFrom', u'Start Day', | ||||||
|                 description=u'The first day from which to select work.', |                 description=u'The first day from which to select work.', | ||||||
|                 fieldType='date', |                 fieldType='date', | ||||||
|                 operator=u'gt', |                 operator=u'ge', | ||||||
|                 executionSteps=['query']) |                 executionSteps=['query']) | ||||||
| dayTo = TrackDateField('dayTo', u'End Day', | dayTo = TrackDateField('dayTo', u'End Day', | ||||||
|                 description=u'The last day until which to select work.', |                 description=u'The last day until which to select work.', | ||||||
|  | @ -230,9 +230,16 @@ class WorkReportInstance(ReportInstance): | ||||||
|     userSettings = (dayFrom, dayTo, party) |     userSettings = (dayFrom, dayTo, party) | ||||||
|     defaultOutputFields = fields |     defaultOutputFields = fields | ||||||
|     defaultSortCriteria = (day, timeStart,) |     defaultSortCriteria = (day, timeStart,) | ||||||
|     states = ('done', 'done_x', 'finished') |     defaultStates = ('done', 'done_x', 'finished') | ||||||
|     taskTypeNames = ('task', 'event', 'project') |     taskTypeNames = ('task', 'event', 'project') | ||||||
| 
 | 
 | ||||||
|  |     def getOptions(self, option): | ||||||
|  |         return self.view.options(option) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def states(self): | ||||||
|  |         return self.getOptions('report_select_state') or self.defaultStates | ||||||
|  | 
 | ||||||
|     @property |     @property | ||||||
|     def queryCriteria(self): |     def queryCriteria(self): | ||||||
|         form = self.view.request.form |         form = self.view.request.form | ||||||
|  | @ -265,16 +272,19 @@ class WorkReportInstance(ReportInstance): | ||||||
|             tasks.extend(self.getAllSubtasks(t)) |             tasks.extend(self.getAllSubtasks(t)) | ||||||
|         return tasks |         return tasks | ||||||
| 
 | 
 | ||||||
|     def getAllSubtasks(self, concept): |     def getAllSubtasks(self, concept, checked=None): | ||||||
|         result = [] |         result = [] | ||||||
|  |         if checked is None: | ||||||
|  |             checked = set() | ||||||
|         for c in concept.getChildren([self.view.defaultPredicate]): |         for c in concept.getChildren([self.view.defaultPredicate]): | ||||||
|             if c.conceptType in self.taskTypes: |             if c.conceptType in self.taskTypes: | ||||||
|                 result.append(c) |                 result.append(c) | ||||||
|             result.extend(self.getAllSubtasks(c)) |             if c not in checked: | ||||||
|  |                 checked.add(c) | ||||||
|  |                 result.extend(self.getAllSubtasks(c, checked)) | ||||||
|         return result |         return result | ||||||
| 
 | 
 | ||||||
|     def selectWorkItems(self, task, parts): |     def selectWorkItems(self, task, parts): | ||||||
|         # TODO: take states from parts |  | ||||||
|         kw = dict(task=util.getUidForObject(baseObject(task)),  |         kw = dict(task=util.getUidForObject(baseObject(task)),  | ||||||
|                   state=self.states) |                   state=self.states) | ||||||
|         userNameCrit = parts.get('userName') |         userNameCrit = parts.get('userName') | ||||||
|  | @ -294,6 +304,28 @@ class WorkReportInstance(ReportInstance): | ||||||
|         return IWorkItems(self.recordManager['work']) |         return IWorkItems(self.recordManager['work']) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class PersonWorkReportInstance(WorkReportInstance): | ||||||
|  | 
 | ||||||
|  |     type = "person_work_statement" | ||||||
|  |     label = u'Person Work Statement' | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def queryCriteria(self): | ||||||
|  |         form = self.view.request.form | ||||||
|  |         crit = self.context.queryCriteria or [] | ||||||
|  |         for f in self.getAllQueryFields(): | ||||||
|  |             if f.name in form: | ||||||
|  |                 crit.append( | ||||||
|  |                     LeafQueryCriteria(f.name, f.operator, form[f.name], f)) | ||||||
|  |         return CompoundQueryCriteria(crit) | ||||||
|  | 
 | ||||||
|  |     def selectObjects(self, parts): | ||||||
|  |         workItems = self.recordManager['work'] | ||||||
|  |         person = self.view.context | ||||||
|  |         uid = util.getUidForObject(person) | ||||||
|  |         return workItems.query(userName=uid, state=self.states) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| # meeting minutes | # meeting minutes | ||||||
| 
 | 
 | ||||||
| class MeetingMinutesWorkRow(WorkRow): | class MeetingMinutesWorkRow(WorkRow): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue