plone.app.discussion/plone/app/discussion/browser/comment.py

112 lines
3.9 KiB
Python
Raw Normal View History

2018-06-15 10:22:11 +02:00
from .comments import CommentForm
2013-09-17 14:03:46 +02:00
from AccessControl import getSecurityManager
from Acquisition import aq_inner
from Acquisition import aq_parent
from plone.app.discussion import _
from plone.registry.interfaces import IRegistry
2013-09-17 14:03:46 +02:00
from plone.z3cform.layout import wrap_form
from Products.CMFCore.utils import getToolByName
from Products.Five.browser import BrowserView
from Products.statusmessages.interfaces import IStatusMessage
from z3c.form import button
from zope.component import getMultiAdapter
from zope.component import getUtility
from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent
2013-09-17 14:03:46 +02:00
2012-01-14 07:47:07 +01:00
class View(BrowserView):
"""Comment View.
When the view of a comment object is called directly, redirect to the
the page (content object) and the location (HTML-anchor) where the comment
has been posted.
Redirect from the comment object URL
'/path/to/object/++conversation++default/123456789' to the content object
where the comment has been posted appended by an HTML anchor that points to
the comment '/path/to/object#comment-123456789'.
Context is the comment object. The parent of the comment object is the
conversation. The parent of the conversation is the content object where
the comment has been posted.
"""
def __call__(self):
context = aq_inner(self.context)
registry = getUtility(IRegistry)
2022-05-01 23:14:09 +02:00
view_action_types = registry.get("plone.types_use_view_action_in_listings", [])
obj = aq_parent(aq_parent(context))
url = obj.absolute_url()
"""
Image and File types, as well as many other customized archetypes
require /view be appended to the url to see the comments, otherwise it
will redirect right to the binary object, bypassing comments.
"""
if obj.portal_type in view_action_types:
url = f"{url}/view"
self.request.response.redirect(f"{url}#{context.id}")
2013-09-17 14:03:46 +02:00
class EditCommentForm(CommentForm):
"""Form to edit an existing comment."""
2022-05-01 23:14:09 +02:00
2013-09-17 14:03:46 +02:00
ignoreContext = True
2022-05-01 23:14:09 +02:00
id = "edit-comment-form"
label = _("edit_comment_form_title", default="Edit comment")
2013-09-17 14:03:46 +02:00
def updateWidgets(self):
super().updateWidgets()
2022-05-01 23:14:09 +02:00
self.widgets["text"].value = self.context.text
2013-09-17 14:03:46 +02:00
# We have to rename the id, otherwise TinyMCE can't initialize
# because there are two textareas with the same id.
2022-05-01 23:14:09 +02:00
self.widgets["text"].id = "overlay-comment-text"
2013-09-17 14:03:46 +02:00
2022-05-01 23:14:09 +02:00
def _redirect(self, target=""):
2013-09-17 14:03:46 +02:00
if not target:
2022-05-01 23:14:09 +02:00
portal_state = getMultiAdapter(
(self.context, self.request), name="plone_portal_state"
2022-05-01 23:14:09 +02:00
)
2013-09-17 14:03:46 +02:00
target = portal_state.portal_url()
self.request.response.redirect(target)
@button.buttonAndHandler(_("label_save", default="Save"), name="comment")
2013-09-17 14:03:46 +02:00
def handleComment(self, action):
# Validate form
data, errors = self.extractData()
if errors:
return
# Check permissions
2022-05-01 23:14:09 +02:00
can_edit = getSecurityManager().checkPermission("Edit comments", self.context)
mtool = getToolByName(self.context, "portal_membership")
2013-09-17 14:03:46 +02:00
if mtool.isAnonymousUser() or not can_edit:
return
# Update text
2022-05-01 23:14:09 +02:00
self.context.text = data["text"]
# Notify that the object has been modified
notify(ObjectModifiedEvent(self.context))
2013-09-17 14:03:46 +02:00
# Redirect to comment
2022-05-01 23:14:09 +02:00
IStatusMessage(self.request).add(
_("comment_edit_notification", default="Comment was edited"), type="info"
2022-05-01 23:14:09 +02:00
)
return self._redirect(target=self.action.replace("@@edit-comment", "@@view"))
@button.buttonAndHandler(_("cancel_form_button", default="Cancel"), name="cancel")
2013-09-17 14:03:46 +02:00
def handle_cancel(self, action):
IStatusMessage(self.request).add(
_("comment_edit_cancel_notification", default="Edit comment cancelled"),
2022-05-01 23:14:09 +02:00
type="info",
)
return self._redirect(target=self.context.absolute_url())
2013-09-17 14:03:46 +02:00
2017-07-28 17:58:35 +02:00
EditComment = wrap_form(EditCommentForm)