Ensure workflow is initialised when the comment is added. Also ensure that we won't get an error on unindex if the local utility can't be found.

svn path=/plone.app.discussion/trunk/; revision=27070
This commit is contained in:
Martin Aspeli 2009-05-23 16:37:10 +00:00
parent fba5d3f752
commit 8ffca9009c
4 changed files with 48 additions and 14 deletions

View File

@ -12,6 +12,7 @@ from AccessControl.Owned import Owned
from plone.app.discussion.interfaces import IComment
from Products.CMFCore.DynamicType import DynamicType
from Products.CMFCore.utils import getToolByName
class Comment(DynamicType, Traversable, RoleManager, Owned, Explicit):
"""A comment.
@ -85,4 +86,11 @@ class Comment(DynamicType, Traversable, RoleManager, Owned, Explicit):
def opaqueValues(self):
return []
CommentFactory = Factory(Comment)
CommentFactory = Factory(Comment)
def notify_workflow(obj, event):
"""Tell the workflow tool when a comment is added
"""
tool = getToolByName(obj, 'portal_workflow', None)
if tool is not None:
tool.notifyCreated(obj)

View File

@ -26,7 +26,7 @@
component=".comment.CommentFactory"
name="plone.Comment"
/>
<!-- Conversations -->
<class class=".conversation.Conversation">
<require interface=".interfaces.IConversation" permission="zope2.View" />
@ -38,16 +38,23 @@
<adapter factory=".conversation.CommentReplies" />
<!-- Event subscribers -->
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.app.container.contained.IObjectAddedEvent"
handler=".tool.object_added_handler"
handler=".comment.notify_workflow"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.app.container.contained.IObjectAddedEvent"
handler=".tool.index_object"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.app.container.contained.IObjectRemovedEvent"
handler=".tool.object_removed_handler"
handler=".tool.unindex_object"
/>
</configure>

View File

@ -57,9 +57,22 @@ class CommentTest(PloneTestCase):
self.assertEquals('plone/doc1/%2B%2Bconversation%2B%2Bdefault/' + str(new_comment1_id), comment.absolute_url())
def test_workflow(self):
# ensure that we can assign a workflow to the comment type and perform
# workflow operations
pass
self.portal.portal_workflow.setChainForPortalTypes(('Discussion Item',), ('simple_publication_workflow,'))
conversation = IConversation(self.portal.doc1).__of__(self.portal.doc1)
comment1 = createObject('plone.Comment')
new_comment1_id = conversation.addComment(comment1)
comment = conversation[new_comment1_id]
chain = self.portal.portal_workflow.getChainFor(comment)
self.assertEquals(('simple_publication_workflow',), chain)
# ensure the initial state was entered and recorded
self.assertEquals(1, len(comment.workflow_history['simple_publication_workflow']))
self.assertEquals(None, comment.workflow_history['simple_publication_workflow'][0]['action'])
self.assertEquals('private', self.portal.portal_workflow.getInfoFor(comment, 'review_state'))
def test_fti(self):
# test that we can look up an FTI for Discussion Item

View File

@ -6,7 +6,7 @@ BBB support for the old portal_discussion is provided in the bbb package.
"""
from zope import interface
from zope.component import getUtility
from zope.component import queryUtility
from interfaces import ICommentingTool, IComment
@ -65,10 +65,16 @@ class CommentingTool(UniqueObject, SimpleItem):
kw['object_provides'] = object_provides
return catalog.searchResults(REQUEST, **kw)
def object_added_handler(obj, event):
tool = getUtility(ICommentingTool)
tool.indexObject(obj)
def index_object(obj, event):
"""Index the object when added to the conversation
"""
tool = queryUtility(ICommentingTool)
if tool is not None:
tool.indexObject(obj)
def object_removed_handler(obj, event):
tool = getUtility(ICommentingTool)
tool.unindexObject(obj)
def unindex_object(obj, event):
"""Unindex the object when removed
"""
tool = queryUtility(ICommentingTool)
if tool is not None:
tool.unindexObject(obj)