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