From a47b6a02a0abcafcae8b7da76627e37150c8d77f Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 9 Apr 2014 13:07:39 +0200 Subject: [PATCH] provide state icon with link to state transition form for comments --- organize/comment/base.py | 11 ++++++++++- organize/comment/browser.py | 10 +++++++++- organize/stateful/browser.py | 23 ++++++++++++++++++----- organize/stateful/view_macros.pt | 27 ++++++++++++++++++++++----- 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/organize/comment/base.py b/organize/comment/base.py index 5b4ff95..d68c81a 100644 --- a/organize/comment/base.py +++ b/organize/comment/base.py @@ -22,6 +22,7 @@ Base classes for comments/discussions. from zope.component import adapts from zope.interface import implementer, implements +from zope.traversing.api import getParent from cybertools.stateful.definition import StatesDefinition from cybertools.stateful.definition import State, Transition @@ -38,7 +39,7 @@ def commentStates(): return StatesDefinition('commentStates', State('new', 'new', ('accept', 'reject'), color='red'), State('public', 'public', ('retract', 'reject'), color='green'), - State('rejected', 'rejected', ('accept'), color='grey'), + State('rejected', 'rejected', ('accept',), color='grey'), Transition('accept', 'accept', 'public'), Transition('reject', 'reject', 'rejected'), Transition('retract', 'retract', 'new'), @@ -61,3 +62,11 @@ class Comment(Stateful, Track): super(Comment, self).__init__(taskId, runId, userName, data) self.state = self.getState() # make initial state persistent + @property + def title(self): + return self.data['subject'] + + def doTransition(self, action): + super(Comment, self).doTransition(action) + getParent(self).indexTrack(None, self, 'state') + diff --git a/organize/comment/browser.py b/organize/comment/browser.py index 1d41cc1..6981089 100644 --- a/organize/comment/browser.py +++ b/organize/comment/browser.py @@ -88,9 +88,17 @@ class CommentsView(NodeView): def getActionsFor(self, comment): if not checkPermission('loops.ViewRestricted', self.context): return [] + trackUid = util.getUidForObject(comment.track) + url = '%s/.%s/change_state.html' % ( + self.page.virtualTargetUrl, trackUid) + onClick = ("objectDialog('change_state', " + "'%s?dialog=change_state" + "&target_uid=%s'); return false;" % (url, trackUid)) stateAct = StateAction(self, definition='organize.commentStates', - stateful=comment.track) + stateful=comment.track, + url=url, + onClick=onClick) return [stateAct] diff --git a/organize/stateful/browser.py b/organize/stateful/browser.py index fea8bf3..7ad658c 100644 --- a/organize/stateful/browser.py +++ b/organize/stateful/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2013 Helmut Merz helmutm@cy55.de +# Copyright (c) 2014 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -36,6 +36,7 @@ from loops.browser.form import ObjectForm, EditObject from loops.expert.query import And, Or, State, Type, getObjects from loops.expert.browser.search import search_template from loops.security.common import checkPermission +from loops import util from loops.util import _ @@ -97,8 +98,10 @@ class ChangeStateBase(object): @Lazy def stateful(self): - return component.getAdapter(self.view.virtualTargetObject, IStateful, - name=self.definition) + target = self.view.virtualTargetObject + if IStateful.providedBy(target): + return target + return component.getAdapter(target, IStateful, name=self.definition) @Lazy def definition(self): @@ -110,7 +113,8 @@ class ChangeStateBase(object): @Lazy def transition(self): - return self.stateful.getStatesDefinition().transitions[self.action] + if self.action: + return self.stateful.getStatesDefinition().transitions[self.action] @Lazy def stateObject(self): @@ -143,8 +147,17 @@ class ChangeStateForm(ChangeStateBase, ObjectForm): class ChangeState(ChangeStateBase, EditObject): + @Lazy + def stateful(self): + target = self.target + if IStateful.providedBy(target): + return target + return component.getAdapter(target, IStateful, name=self.definition) + def update(self): formData = self.request.form + if 'target_uid' in formData: + self.target = util.getObjectForUid(formData['target_uid']) # store data in target object (unless field.nostore) self.object = self.target formState = self.instance.applyTemplate(data=formData) @@ -159,7 +172,7 @@ class ChangeState(ChangeStateBase, EditObject): rawValue = fi.getRawValue(formData, name, u'') trackData[name] = fi.unmarshall(rawValue) self.stateful.doTransition(self.action) - notify(ObjectModifiedEvent(self.view.virtualTargetObject, trackData)) + notify(ObjectModifiedEvent(self.target, trackData)) return True diff --git a/organize/stateful/view_macros.pt b/organize/stateful/view_macros.pt index b99d5dc..9299fc5 100644 --- a/organize/stateful/view_macros.pt +++ b/organize/stateful/view_macros.pt @@ -114,16 +114,33 @@ tal:define="stateObject view/stateful/getStateObject" tal:content="stateObject/title" /> - Transition: - + + + + + + + + - + -
+