Merge pull request #185 from plone/issue-183-new-events-6

Events for Comment and Reply modification
This commit is contained in:
Maurits van Rees 2021-09-08 20:31:28 +02:00 committed by GitHub
commit c4fb82ee57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 99 additions and 0 deletions

1
news/183.feature Normal file
View File

@ -0,0 +1 @@
Implement events for Comment (ICommentModifiedEvent) and Reply(IReplyModifiedEvent) modification [ericof]

View File

@ -13,8 +13,10 @@ from OFS.Traversable import Traversable
from persistent import Persistent
from plone.app.discussion import _
from plone.app.discussion.events import CommentAddedEvent
from plone.app.discussion.events import CommentModifiedEvent
from plone.app.discussion.events import CommentRemovedEvent
from plone.app.discussion.events import ReplyAddedEvent
from plone.app.discussion.events import ReplyModifiedEvent
from plone.app.discussion.events import ReplyRemovedEvent
from plone.app.discussion.interfaces import IComment
from plone.app.discussion.interfaces import IConversation
@ -258,6 +260,16 @@ def notify_comment_added(obj, event):
return notify(CommentAddedEvent(context, obj))
def notify_comment_modified(obj, event):
""" Notify custom discussion events when a comment, or a reply, is modified
"""
conversation = aq_parent(obj)
context = aq_parent(conversation)
if getattr(obj, 'in_reply_to', None):
return notify(ReplyModifiedEvent(context, obj))
return notify(CommentModifiedEvent(context, obj))
def notify_comment_removed(obj, event):
""" Notify custom discussion events when a comment or reply is removed
"""

View File

@ -2,12 +2,14 @@
""" Custom discussion events
"""
from plone.app.discussion.interfaces import ICommentAddedEvent
from plone.app.discussion.interfaces import ICommentModifiedEvent
from plone.app.discussion.interfaces import ICommentRemovedEvent
from plone.app.discussion.interfaces import IDiscussionEvent
from plone.app.discussion.interfaces import ICommentDeletedEvent
from plone.app.discussion.interfaces import ICommentPublishedEvent
from plone.app.discussion.interfaces import ICommentTransitionEvent
from plone.app.discussion.interfaces import IReplyAddedEvent
from plone.app.discussion.interfaces import IReplyModifiedEvent
from plone.app.discussion.interfaces import IReplyRemovedEvent
from zope.interface import implementer
@ -35,6 +37,12 @@ class CommentAddedEvent(DiscussionEvent):
"""
@implementer(ICommentModifiedEvent)
class CommentModifiedEvent(DiscussionEvent):
""" Event to be triggered when a Comment is modified
"""
@implementer(ICommentRemovedEvent)
class CommentRemovedEvent(DiscussionEvent):
""" Event to be triggered when a Comment is removed
@ -47,6 +55,12 @@ class ReplyAddedEvent(DiscussionEvent):
"""
@implementer(IReplyModifiedEvent)
class ReplyModifiedEvent(DiscussionEvent):
""" Event to be triggered when a Comment reply is modified
"""
@implementer(IReplyRemovedEvent)
class ReplyRemovedEvent(DiscussionEvent):
""" Event to be triggered when a Comment reply is removed

View File

@ -399,6 +399,11 @@ class ICommentAddedEvent(IDiscussionEvent):
"""
class ICommentModifiedEvent(IDiscussionEvent):
""" Comment modified
"""
class ICommentRemovedEvent(IDiscussionEvent):
""" Comment removed
"""
@ -409,6 +414,11 @@ class IReplyAddedEvent(IDiscussionEvent):
"""
class IReplyModifiedEvent(IDiscussionEvent):
""" Comment reply modified
"""
class IReplyRemovedEvent(IDiscussionEvent):
""" Comment reply removed
"""

View File

@ -9,6 +9,12 @@
handler=".comment.notify_workflow"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.lifecycleevent.interfaces.IObjectModifiedEvent"
handler=".comment.notify_comment_modified"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.lifecycleevent.interfaces.IObjectAddedEvent"

View File

@ -6,6 +6,8 @@ from plone.app.testing import setRoles
from plone.app.testing import TEST_USER_ID
from Zope2.App import zcml
from zope.component import createObject
from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent
import Products.Five
import unittest
@ -20,8 +22,10 @@ class EventsRegistry(object):
""" Fake registry to be used while testing discussion events
"""
commentAdded = False
commentModified = False
commentRemoved = False
replyAdded = False
replyModified = False
replyRemoved = False
#
@ -33,6 +37,10 @@ def comment_added(doc, evt):
EventsRegistry.commentAdded = True
def comment_modified(doc, evt):
EventsRegistry.commentModified = True
def comment_removed(doc, evt):
EventsRegistry.commentRemoved = True
@ -41,6 +49,10 @@ def reply_added(doc, evt):
EventsRegistry.replyAdded = True
def reply_modified(doc, evt):
EventsRegistry.replyModified = True
def reply_removed(doc, evt):
EventsRegistry.replyRemoved = True
@ -78,6 +90,12 @@ class CommentEventsTest(unittest.TestCase):
handler="plone.app.discussion.tests.test_events.comment_added"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.lifecycleevent.interfaces.IObjectModifiedEvent"
handler="plone.app.discussion.tests.test_events.comment_modified"
/>
<subscriber
for="OFS.interfaces.ISimpleItem
plone.app.discussion.interfaces.ICommentRemovedEvent"
@ -96,6 +114,18 @@ class CommentEventsTest(unittest.TestCase):
conversation.addComment(comment)
self.assertTrue(self.registry.commentAdded)
def test_modifyEvent(self):
self.assertFalse(self.registry.commentModified)
comment = createObject('plone.Comment')
conversation = IConversation(self.document)
new_id = conversation.addComment(comment)
comment = self.document.restrictedTraverse(
'++conversation++default/{0}'.format(new_id),
)
comment.text = "foo"
notify(ObjectModifiedEvent(comment))
self.assertTrue(self.registry.commentModified)
def test_removedEvent(self):
self.assertFalse(self.registry.commentRemoved)
comment = createObject('plone.Comment')
@ -131,6 +161,12 @@ class RepliesEventsTest(unittest.TestCase):
handler="plone.app.discussion.tests.test_events.reply_added"
/>
<subscriber
for="plone.app.discussion.interfaces.IComment
zope.lifecycleevent.interfaces.IObjectModifiedEvent"
handler="plone.app.discussion.tests.test_events.reply_modified"
/>
<subscriber
for="OFS.interfaces.ISimpleItem
plone.app.discussion.interfaces.IReplyRemovedEvent"
@ -163,6 +199,26 @@ class RepliesEventsTest(unittest.TestCase):
self.assertTrue(self.registry.replyAdded)
def test_modifyEvent(self):
self.assertFalse(self.registry.replyModified)
conversation = IConversation(self.document)
replies = IReplies(conversation)
comment = createObject('plone.Comment')
comment.text = 'Comment text'
comment_id = replies.addComment(comment)
comment = self.document.restrictedTraverse(
'++conversation++default/{0}'.format(comment_id),
)
re_comment = createObject('plone.Comment')
re_comment.text = 'Comment text'
replies = IReplies(comment)
new_id = replies.addComment(re_comment)
reply = replies[new_id]
reply.text = "Another text"
notify(ObjectModifiedEvent(reply))
self.assertTrue(self.registry.replyModified)
def test_removedEvent(self):
self.assertFalse(self.registry.replyRemoved)