diff --git a/CHANGES.txt b/CHANGES.txt index c2bf60c..0cd5ca9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,8 @@ $Id$ 1.1 --- +- allow editing/creation of work items by others (creator, admin), + take party/userName from previous work item instead of current user - field order: make sure title and description are always on top - yellow pages: view task_candidates for selecting persons with required knowledge for task diff --git a/organize/tracking/browser.py b/organize/tracking/browser.py index cdcb1e1..f5743ea 100644 --- a/organize/tracking/browser.py +++ b/organize/tracking/browser.py @@ -33,6 +33,7 @@ from cybertools.browser.action import actions from cybertools.tracking.browser import TrackView from loops.browser.action import DialogAction from loops.browser.form import ObjectForm, EditObject +from loops.organize.party import getPersonForUser from loops import util @@ -95,6 +96,13 @@ class BaseTrackView(TrackView): return dict(title=obj.title, url=url, obj=obj) return dict(title=value, url=None, obj=None) + @Lazy + def personId(self): + p = getPersonForUser(self.context, self.request) + if p is not None: + return util.getUidForObject(p) + return self.request.principal.id + class ChangeView(BaseTrackView): diff --git a/organize/tracking/report.py b/organize/tracking/report.py index c7f0df8..5ebff0f 100644 --- a/organize/tracking/report.py +++ b/organize/tracking/report.py @@ -36,6 +36,7 @@ from cybertools.meta.interfaces import IOptions from cybertools.util import format from loops.browser.common import BaseView from loops.interfaces import IConcept, IResource +from loops.organize.party import getPersonForUser from loops.security.common import canAccessObject from loops import util from loops.util import _ @@ -289,6 +290,14 @@ class TrackDetails(BaseView): url = node is not None and node.getUrlForTarget(obj) or '' return dict(object=obj, title=obj.title, url=url) + @Lazy + def personId(self): + request = self.view.request + p = getPersonForUser(self.object, request) + if p is not None: + return util.getUidForObject(p) + return request.principal.id + @Lazy def action(self): return self.track.data.get('action', '') diff --git a/organize/work/browser.py b/organize/work/browser.py index d6d6ef9..a014bd6 100644 --- a/organize/work/browser.py +++ b/organize/work/browser.py @@ -139,8 +139,7 @@ class WorkItemDetails(TrackDetails): target=self.object, addParams=dict(id=self.track.__name__)) actions = [info, WorkItemStateAction(self)] - if (self.isLastInRun and - self.user['object'] == getPersonForUser(self.object, self.view.request)): + if self.isLastInRun and self.allowedToEditWorkItem: self.view.registerDojoDateWidget() self.view.registerDojoNumberWidget() self.view.registerDojoTextarea() @@ -155,6 +154,14 @@ class WorkItemDetails(TrackDetails): addParams=dict(id=self.track.__name__))) return actions + @Lazy + def allowedToEditWorkItem(self): + if checkPermission('loops.ManageSite', self.object): + return True + if self.track.data.get('creator') == self.personId: + return True + return self.user['object'] == getPersonForUser(self.object, self.view.request) + class WorkItemInfo(NodeView): """ Provides info box. @@ -418,13 +425,6 @@ class CreateWorkItem(EditObject, BaseTrackView): workItems = self.loopsRoot.getRecordManager()['work'] return workItems.get(id) - @Lazy - def personId(self): - p = getPersonForUser(self.context, self.request) - if p is not None: - return util.getUidForObject(p) - return self.request.principal.id - @Lazy def object(self): return self.target