diff --git a/organize/work/browser.py b/organize/work/browser.py
index 496fdb9..35f8802 100644
--- a/organize/work/browser.py
+++ b/organize/work/browser.py
@@ -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):
diff --git a/organize/work/configure.zcml b/organize/work/configure.zcml
index 78b95a3..4ec62ae 100644
--- a/organize/work/configure.zcml
+++ b/organize/work/configure.zcml
@@ -29,11 +29,11 @@
permission="zope.View" />
+ tal:condition="work/listWorkItems">
Work Items