add optional workflow actions to the get_replies method of the comments viewlet.
switch from Acquisition.explicit to Acquisition.implicit for the comment class. adjust test_comment to work with Acquisition.implicit. svn path=/plone.app.discussion/trunk/; revision=27406
This commit is contained in:
parent
24997f4eb9
commit
8fb254f73d
@ -1,8 +1,9 @@
|
||||
<tal:block define="userHasReplyPermission view/can_reply;
|
||||
isDiscussionAllowed view/is_discussion_allowed;
|
||||
isAnonymousDiscussionAllowed view/anonymous_discussion_allowed;
|
||||
replies view/get_replies;
|
||||
isAnon view/is_anonymous;
|
||||
canManage view/can_manage;
|
||||
replies python:view.get_replies(canManage);
|
||||
showCommenterImage view/show_commenter_image;
|
||||
errors options/state/getErrors|nothing;"
|
||||
tal:condition="isDiscussionAllowed"
|
||||
@ -102,7 +103,7 @@
|
||||
action=""
|
||||
method="get"
|
||||
style="display: inline;"
|
||||
tal:repeat="action reply_dict/actions"
|
||||
tal:repeat="action python:view.get_workflow_actions(reply)"
|
||||
tal:attributes="action string:${reply/absolute_url}/content_status_modify;
|
||||
name action/id">
|
||||
<input type="hidden" name="workflow_action" tal:attributes="value action/id" />
|
||||
|
@ -8,7 +8,7 @@ from zope.component import createObject, getMultiAdapter, queryUtility
|
||||
|
||||
from zope.viewlet.interfaces import IViewlet
|
||||
|
||||
from Acquisition import aq_inner, aq_parent
|
||||
from Acquisition import aq_inner, aq_parent, aq_base
|
||||
|
||||
from AccessControl import getSecurityManager
|
||||
|
||||
@ -21,7 +21,7 @@ from plone.registry.interfaces import IRegistry
|
||||
|
||||
from plone.app.layout.viewlets.common import ViewletBase
|
||||
|
||||
from plone.app.discussion.interfaces import IComment, IReplies, IDiscussionSettings
|
||||
from plone.app.discussion.interfaces import IConversation, IComment, IReplies, IDiscussionSettings
|
||||
from plone.app.discussion.conversation import conversationAdapterFactory
|
||||
|
||||
from plone.app.discussion.comment import CommentFactory
|
||||
@ -60,14 +60,28 @@ class CommentsViewlet(ViewletBase):
|
||||
conversation = conversationAdapterFactory(self.context)
|
||||
return conversation.enabled
|
||||
|
||||
def get_replies(self):
|
||||
# Return all direct replies
|
||||
conversation = conversationAdapterFactory(self.context)
|
||||
def get_replies(self, workflow_actions=False):
|
||||
|
||||
# Acquisition wrap the conversation
|
||||
context = aq_inner(self.context)
|
||||
conversation = IConversation(context)
|
||||
conversation = IConversation(context).__of__(context)
|
||||
|
||||
# Return all direct replies
|
||||
if conversation.total_comments > 0:
|
||||
return conversation.getThreads()
|
||||
if workflow_actions:
|
||||
# Return dict with workflow actions
|
||||
#context = aq_inner(self.context)
|
||||
wf = getToolByName(context, 'portal_workflow')
|
||||
|
||||
for r in conversation.getThreads():
|
||||
comment_obj = r['comment']
|
||||
actions = wf.listActionInfos(object=comment_obj)
|
||||
return conversation.getThreads()
|
||||
else:
|
||||
return conversation.getThreads()
|
||||
else:
|
||||
return False
|
||||
return []
|
||||
|
||||
def get_commenter_home_url(self, username):
|
||||
if username is None:
|
||||
|
@ -4,7 +4,7 @@ from datetime import datetime
|
||||
from zope.interface import implements
|
||||
from zope.component.factory import Factory
|
||||
|
||||
from Acquisition import Explicit
|
||||
from Acquisition import Implicit
|
||||
from OFS.Traversable import Traversable
|
||||
from AccessControl.Role import RoleManager
|
||||
from AccessControl.Owned import Owned
|
||||
@ -14,75 +14,75 @@ from plone.app.discussion.interfaces import IComment
|
||||
from Products.CMFCore.DynamicType import DynamicType
|
||||
from Products.CMFCore.utils import getToolByName
|
||||
|
||||
class Comment(DynamicType, Traversable, RoleManager, Owned, Explicit):
|
||||
class Comment(DynamicType, Traversable, RoleManager, Owned, Implicit):
|
||||
"""A comment.
|
||||
|
||||
|
||||
This object attempts to be as lightweight as possible. We implement a
|
||||
number of standard methods instead of subclassing, to have total control
|
||||
over what goes into the object.
|
||||
"""
|
||||
|
||||
|
||||
implements(IComment)
|
||||
|
||||
|
||||
meta_type = portal_type = 'Discussion Item'
|
||||
|
||||
|
||||
__parent__ = None
|
||||
|
||||
|
||||
comment_id = None # long
|
||||
in_reply_to = None # long
|
||||
|
||||
title = u""
|
||||
|
||||
|
||||
mime_type = "text/plain"
|
||||
text = u""
|
||||
|
||||
|
||||
creator = None
|
||||
creation_date = None
|
||||
modification_date = None
|
||||
|
||||
|
||||
author_username = None
|
||||
|
||||
|
||||
author_name = None
|
||||
author_email = None
|
||||
|
||||
# Note: we want to use zope.component.createObject() to instantiate
|
||||
|
||||
# Note: we want to use zope.component.createObject() to instantiate
|
||||
# comments as far as possible. comment_id and __parent__ are set via
|
||||
# IConversation.addComment().
|
||||
|
||||
|
||||
def __init__(self):
|
||||
self.creation_date = self.modification_date = datetime.now()
|
||||
|
||||
|
||||
@property
|
||||
def __name__(self):
|
||||
return self.comment_id and unicode(self.comment_id) or None
|
||||
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self.comment_id and str(self.comment_id) or None
|
||||
|
||||
|
||||
def getId(self):
|
||||
"""The id of the comment, as a string
|
||||
"""
|
||||
return self.id
|
||||
|
||||
|
||||
def Title(self):
|
||||
"""The title of the comment
|
||||
"""
|
||||
return self.title
|
||||
|
||||
|
||||
def Creator(self):
|
||||
"""The name of the person who wrote the comment
|
||||
"""
|
||||
return self.creator
|
||||
|
||||
|
||||
# CMF's event handlers assume any IDynamicType has these :(
|
||||
|
||||
|
||||
def opaqueItems(self):
|
||||
return []
|
||||
|
||||
|
||||
def opaqueIds(self):
|
||||
return []
|
||||
|
||||
|
||||
def opaqueValues(self):
|
||||
return []
|
||||
|
||||
|
@ -143,7 +143,7 @@ class Conversation(Traversable, Persistent, Explicit):
|
||||
|
||||
def recurse(comment_id, d=0):
|
||||
# Yield the current comment before we look for its children
|
||||
yield {'id': comment_id, 'comment': self._comments[comment_id], 'depth': d}
|
||||
yield {'id': comment_id, 'comment': self[comment_id], 'depth': d}
|
||||
|
||||
# Recurse if there are children and we are not out of our depth
|
||||
if depth is None or d + 1 < depth:
|
||||
|
@ -56,7 +56,7 @@ class CommentTest(PloneTestCase):
|
||||
self.assertEquals('Comment 1', comment.title)
|
||||
|
||||
self.assertEquals(('', 'plone', 'doc1', '++conversation++default', str(new_comment1_id)), comment.getPhysicalPath())
|
||||
self.assertEquals('plone/doc1/%2B%2Bconversation%2B%2Bdefault/' + str(new_comment1_id), comment.absolute_url())
|
||||
self.assertEquals('http://nohost/plone/doc1/++conversation++default/' + str(new_comment1_id), comment.absolute_url())
|
||||
|
||||
def test_workflow(self):
|
||||
self.portal.portal_workflow.setChainForPortalTypes(('Discussion Item',), ('simple_publication_workflow,'))
|
||||
|
@ -541,8 +541,14 @@ class ConversationTest(PloneTestCase):
|
||||
# Create a conversation.
|
||||
conversation = IConversation(self.portal.doc1)
|
||||
|
||||
# Pretend that we have traversed to the comment by aq wrapping it.
|
||||
conversation = conversation.__of__(self.portal.doc1)
|
||||
|
||||
# Check the parent
|
||||
self.failUnless(conversation.__parent__)
|
||||
self.failUnless(aq_parent(conversation))
|
||||
# Todo: This one is failing!
|
||||
#self.failUnless(conversation.REQUEST)
|
||||
self.assertEquals(conversation.__parent__.getId(), 'doc1')
|
||||
|
||||
def test_discussion_item_not_in_bad_types(self):
|
||||
|
Loading…
Reference in New Issue
Block a user