2017-07-28 17:58:35 +02:00
|
|
|
# coding: utf-8
|
2018-06-15 10:22:11 +02:00
|
|
|
from .comments import CommentForm
|
2013-09-17 14:03:46 +02:00
|
|
|
from AccessControl import getSecurityManager
|
2015-05-03 08:16:39 +02:00
|
|
|
from Acquisition import aq_inner
|
|
|
|
from Acquisition import aq_parent
|
2015-11-05 00:26:49 +01:00
|
|
|
from plone.app.discussion import _
|
2015-09-20 17:31:55 +02:00
|
|
|
from plone.registry.interfaces import IRegistry
|
2013-09-17 14:03:46 +02:00
|
|
|
from plone.z3cform.layout import wrap_form
|
2016-02-05 01:39:53 +01:00
|
|
|
from Products.CMFCore.utils import getToolByName
|
|
|
|
from Products.Five.browser import BrowserView
|
|
|
|
from Products.statusmessages.interfaces import IStatusMessage
|
2015-05-03 08:16:39 +02:00
|
|
|
from z3c.form import button
|
|
|
|
from zope.component import getMultiAdapter
|
2016-02-05 01:39:53 +01:00
|
|
|
from zope.component import getUtility
|
2016-04-07 18:30:30 +02:00
|
|
|
from zope.event import notify
|
|
|
|
from zope.lifecycleevent import ObjectModifiedEvent
|
2018-06-18 17:04:41 +02:00
|
|
|
from .comments import CommentForm
|
2013-09-17 14:03:46 +02:00
|
|
|
|
2012-01-14 07:47:07 +01:00
|
|
|
|
2010-01-18 10:54:27 +01:00
|
|
|
class View(BrowserView):
|
|
|
|
"""Comment View.
|
|
|
|
|
2010-12-16 00:52:56 +01:00
|
|
|
When the view of a comment object is called directly, redirect to the
|
2010-09-06 12:38:54 +02:00
|
|
|
the page (content object) and the location (HTML-anchor) where the comment
|
|
|
|
has been posted.
|
2010-12-16 00:52:56 +01:00
|
|
|
|
2010-09-06 12:38:54 +02:00
|
|
|
Redirect from the comment object URL
|
2016-02-05 01:39:53 +01:00
|
|
|
'/path/to/object/++conversation++default/123456789' to the content object
|
2010-12-16 00:52:56 +01:00
|
|
|
where the comment has been posted appended by an HTML anchor that points to
|
2016-02-05 01:39:53 +01:00
|
|
|
the comment '/path/to/object#comment-123456789'.
|
2010-12-16 00:52:56 +01:00
|
|
|
|
2010-09-06 12:38:54 +02:00
|
|
|
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.
|
2010-01-18 10:54:27 +01:00
|
|
|
"""
|
|
|
|
|
|
|
|
def __call__(self):
|
2010-09-06 12:38:54 +02:00
|
|
|
context = aq_inner(self.context)
|
2015-09-20 17:31:55 +02:00
|
|
|
|
|
|
|
registry = getUtility(IRegistry)
|
|
|
|
view_action_types = registry.get(
|
|
|
|
'plone.types_use_view_action_in_listings', [])
|
|
|
|
|
2012-03-14 23:01:17 +01:00
|
|
|
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:
|
2016-02-05 01:39:53 +01:00
|
|
|
url = '{0}/view'.format(url)
|
2012-03-14 23:01:17 +01:00
|
|
|
|
2016-02-05 01:39:53 +01:00
|
|
|
self.request.response.redirect('{0}#{1}'.format(url, context.id))
|
2013-09-17 14:03:46 +02:00
|
|
|
|
|
|
|
|
|
|
|
class EditCommentForm(CommentForm):
|
|
|
|
"""Form to edit an existing comment."""
|
|
|
|
ignoreContext = True
|
2016-02-05 01:39:53 +01:00
|
|
|
id = 'edit-comment-form'
|
2013-09-17 14:03:46 +02:00
|
|
|
label = _(u'edit_comment_form_title', default=u'Edit comment')
|
|
|
|
|
|
|
|
def updateWidgets(self):
|
|
|
|
super(EditCommentForm, self).updateWidgets()
|
|
|
|
self.widgets['text'].value = self.context.text
|
|
|
|
# We have to rename the id, otherwise TinyMCE can't initialize
|
|
|
|
# because there are two textareas with the same id.
|
|
|
|
self.widgets['text'].id = 'overlay-comment-text'
|
|
|
|
|
|
|
|
def _redirect(self, target=''):
|
|
|
|
if not target:
|
|
|
|
portal_state = getMultiAdapter((self.context, self.request),
|
|
|
|
name=u'plone_portal_state')
|
|
|
|
target = portal_state.portal_url()
|
|
|
|
self.request.response.redirect(target)
|
|
|
|
|
2016-02-05 01:39:53 +01:00
|
|
|
@button.buttonAndHandler(_(u'edit_comment_form_button',
|
|
|
|
default=u'Edit comment'), 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
|
|
|
|
can_edit = getSecurityManager().checkPermission(
|
|
|
|
'Edit comments',
|
|
|
|
self.context)
|
|
|
|
mtool = getToolByName(self.context, 'portal_membership')
|
|
|
|
if mtool.isAnonymousUser() or not can_edit:
|
|
|
|
return
|
|
|
|
|
|
|
|
# Update text
|
|
|
|
self.context.text = data['text']
|
2016-04-07 18:30:30 +02:00
|
|
|
# Notify that the object has been modified
|
|
|
|
notify(ObjectModifiedEvent(self.context))
|
2013-09-17 14:03:46 +02:00
|
|
|
|
|
|
|
# Redirect to comment
|
|
|
|
IStatusMessage(self.request).add(_(u'comment_edit_notification',
|
2016-02-05 01:39:53 +01:00
|
|
|
default='Comment was edited'),
|
2013-09-17 14:03:46 +02:00
|
|
|
type='info')
|
|
|
|
return self._redirect(
|
2016-02-05 01:39:53 +01:00
|
|
|
target=self.action.replace('@@edit-comment', '@@view'))
|
2013-09-17 14:03:46 +02:00
|
|
|
|
|
|
|
@button.buttonAndHandler(_(u'cancel_form_button',
|
|
|
|
default=u'Cancel'), name='cancel')
|
|
|
|
def handle_cancel(self, action):
|
2016-02-05 01:39:53 +01:00
|
|
|
IStatusMessage(self.request).add(
|
|
|
|
_(u'comment_edit_cancel_notification',
|
|
|
|
default=u'Edit comment cancelled'),
|
|
|
|
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)
|