diff --git a/CHANGES.rst b/CHANGES.rst
index 92c6b58..7220d75 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -10,7 +10,8 @@ Breaking changes:
New features:
-- *add item here*
+- Added notification about the publishing or elimination of a comment.
+ [eikichi18]
Bug fixes:
diff --git a/plone/app/discussion/browser/controlpanel.py b/plone/app/discussion/browser/controlpanel.py
index 5e904d8..a8ffe95 100644
--- a/plone/app/discussion/browser/controlpanel.py
+++ b/plone/app/discussion/browser/controlpanel.py
@@ -6,7 +6,6 @@ from plone.app.registry.browser import controlpanel
from plone.registry.interfaces import IRecordModifiedEvent
from plone.registry.interfaces import IRegistry
from Products.CMFCore.utils import getToolByName
-from Products.CMFPlone.interfaces.controlpanel import IConfigurationChangedEvent # noqa: E501
from Products.CMFPlone.interfaces.controlpanel import IMailSchema
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.statusmessages.interfaces import IStatusMessage
@@ -17,6 +16,13 @@ from zope.component import getUtility
from zope.component import queryUtility
from zope.component.hooks import getSite
+# try/except was added because Configuration Changed Event was moved inside the
+# controlpanel file in the PR #2495 on Products.CMFPlone
+try:
+ from Products.CMFPlone.interfaces.controlpanel import IConfigurationChangedEvent # noqa: E501
+except ImportError:
+ from Products.CMFPlone.interfaces import IConfigurationChangedEvent
+
class DiscussionSettingsEditForm(controlpanel.RegistryEditForm):
"""Discussion settings form.
diff --git a/plone/app/discussion/browser/moderation.py b/plone/app/discussion/browser/moderation.py
index f1623ea..c18be49 100644
--- a/plone/app/discussion/browser/moderation.py
+++ b/plone/app/discussion/browser/moderation.py
@@ -3,6 +3,8 @@ from AccessControl import getSecurityManager
from AccessControl import Unauthorized
from Acquisition import aq_inner
from Acquisition import aq_parent
+from plone.app.discussion.events import CommentPublishedEvent
+from plone.app.discussion.events import CommentDeletedEvent
from plone.app.discussion.interfaces import _
from plone.app.discussion.interfaces import IComment
from plone.app.discussion.interfaces import IReplies
@@ -10,6 +12,7 @@ from Products.CMFCore.utils import getToolByName
from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.statusmessages.interfaces import IStatusMessage
+from zope.event import notify
class View(BrowserView):
@@ -100,6 +103,7 @@ class DeleteComment(BrowserView):
if self.can_delete(comment):
del conversation[comment.id]
content_object.reindexObject()
+ notify(CommentDeletedEvent(self.context, comment))
IStatusMessage(self.context.REQUEST).addStatusMessage(
_('Comment deleted.'),
type='info')
@@ -183,6 +187,7 @@ class PublishComment(BrowserView):
workflowTool.doActionFor(comment, workflow_action)
comment.reindexObject()
content_object.reindexObject(idxs=['total_comments'])
+ notify(CommentPublishedEvent(self.context, comment))
IStatusMessage(self.context.REQUEST).addStatusMessage(
_('Comment approved.'),
type='info')
@@ -258,6 +263,7 @@ class BulkActionsView(BrowserView):
workflowTool.doActionFor(comment, 'publish')
comment.reindexObject()
content_object.reindexObject(idxs=['total_comments'])
+ notify(CommentPublishedEvent(content_object, comment))
def mark_as_spam(self):
raise NotImplementedError
@@ -277,3 +283,4 @@ class BulkActionsView(BrowserView):
content_object = aq_parent(conversation)
del conversation[comment.id]
content_object.reindexObject(idxs=['total_comments'])
+ notify(CommentDeletedEvent(content_object, comment))
diff --git a/plone/app/discussion/contentrules.zcml b/plone/app/discussion/contentrules.zcml
index 5dd222a..8216946 100644
--- a/plone/app/discussion/contentrules.zcml
+++ b/plone/app/discussion/contentrules.zcml
@@ -28,6 +28,18 @@
type="plone.contentrules.rule.interfaces.IRuleEventType"
name="Comment reply removed"
/>
+
+
+
+
@@ -54,6 +66,16 @@
for="plone.app.discussion.interfaces.IReplyRemovedEvent"
handler=".contentrules.execute_comment"
/>
+
+
+
+
diff --git a/plone/app/discussion/events.py b/plone/app/discussion/events.py
index c2cb52d..61d50c4 100644
--- a/plone/app/discussion/events.py
+++ b/plone/app/discussion/events.py
@@ -4,6 +4,8 @@
from plone.app.discussion.interfaces import ICommentAddedEvent
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 IReplyAddedEvent
from plone.app.discussion.interfaces import IReplyRemovedEvent
from zope.interface import implementer
@@ -48,3 +50,15 @@ class ReplyAddedEvent(DiscussionEvent):
class ReplyRemovedEvent(DiscussionEvent):
""" Event to be triggered when a Comment reply is removed
"""
+
+
+@implementer(ICommentDeletedEvent)
+class CommentDeletedEvent(DiscussionEvent):
+ """ Event to be triggered when a Comment is deleted
+ """
+
+
+@implementer(ICommentPublishedEvent)
+class CommentPublishedEvent(DiscussionEvent):
+ """ Event to be triggered when a Comment is publicated
+ """
diff --git a/plone/app/discussion/interfaces.py b/plone/app/discussion/interfaces.py
index 98ce435..c7f343e 100644
--- a/plone/app/discussion/interfaces.py
+++ b/plone/app/discussion/interfaces.py
@@ -412,3 +412,13 @@ class IReplyAddedEvent(IDiscussionEvent):
class IReplyRemovedEvent(IDiscussionEvent):
""" Comment reply removed
"""
+
+
+class ICommentPublishedEvent(IDiscussionEvent):
+ """ Notify user on comment publication
+ """
+
+
+class ICommentDeletedEvent(IDiscussionEvent):
+ """ Notify user on comment delete
+ """