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 + """