make comments viewlet show the plone.app.discussion comments and allow to add new comments. (redirection after add-comment is not working yet)

svn path=/plone.app.discussion/trunk/; revision=27112
This commit is contained in:
Timo Stollenwerk 2009-05-25 18:59:25 +00:00
parent 15ba11faa7
commit ad06e9a7e6
3 changed files with 143 additions and 120 deletions

View File

@ -1,46 +1,90 @@
<tal:block define="userHasReplyPermission view/can_reply; <tal:block define="errors options/state/getErrors|nothing;
isDiscussionAllowed view/is_discussion_allowed; replies view/replies | nothing;"
replies view/get_replies;
isAnon view/is_anonymous"
i18n:domain="plone"> i18n:domain="plone">
<div class="discussion"
tal:condition="python:replies or (userHasReplyPermission and isDiscussionAllowed) or (isAnon and not userHasReplyPermission and isDiscussionAllowed)">
<p>plone.app.discussion viewlet:</p>
<form name="reply"
action=""
method="post"
tal:condition="python:userHasReplyPermission and isDiscussionAllowed"
tal:attributes="action string:${context/absolute_url}/discussion_reply_form">
<input class="standalone" <div class="reply">
style="margin-bottom: 1.25em;" <fieldset>
type="submit"
value="Add Comment"
i18n:attributes="value label_add_comment;"
/>
</form>
<form tal:condition="python:isAnon and not userHasReplyPermission and isDiscussionAllowed"
tal:attributes="action view/login_action">
<input class="standalone"
style="margin-bottom: 1.25em;"
type="submit"
value="Log in to add comments"
i18n:attributes="value label_login_to_add_comments;"
/>
</form>
<legend i18n:translate="legend_add_comment">Add comment</legend>
<p i18n:translate="description_add_comment">
You can add a comment by filling out the form below. Plain text
formatting.
</p>
<form name="reply"
action=""
method="get"
tal:attributes="action string:${context/absolute_url}/++conversation++default/@@add-comment">
<div class="field"
tal:define="error errors/subject|nothing;"
tal:attributes="class python: error and 'field error' or 'field'">
<label for="subject" i18n:translate="label_subject">Subject</label>
<span class="fieldRequired" title="Required"
i18n:attributes="title title_required;"
i18n:translate="label_required">(Required)</span>
<div tal:content="error">Validation error output</div>
<input name="subject"
id="subject"
value=""
size="40"
tal:attributes="value request/subject|request/title_override|nothing;" />
</div>
<div class="field"
tal:define="error errors/body_text|nothing;"
tal:attributes="class python: error and 'field error' or 'field'">
<label for="body_text" i18n:translate="label_comment">Comment</label>
<span class="fieldRequired" title="Required"
i18n:attributes="title title_required;"
i18n:translate="label_required">(Required)</span>
<div tal:content="error">Validation error output</div>
<textarea name="body_text"
id="body_text"
cols="40"
rows="8"
tal:content="request/body_text|request/text_override | nothing"></textarea>
</div>
<div class="formControls">
<input class="context"
type="submit"
value="Add Comment"
name="form.button.AddComment"
i18n:attributes="value label_add_comment;" />
</div>
<input type="hidden" name="form.submitted" value="1" />
</form>
</fieldset>
</div>
<div class="discussion">
<tal:getreplies repeat="reply_dict replies"> <tal:getreplies repeat="reply_dict replies">
<div class="comment" style=""
tal:define="indent python:reply_dict['depth']*2; <div class="comment"
reply python:reply_dict['object']" tal:define="reply python:reply_dict[1]">
tal:attributes="style string:margin-left:${indent}em;">
<h3> <h3>
<a name="comments" tal:attributes="name reply/id"> <a name="comments" tal:attributes="name reply/title">
<span tal:replace="reply/pretty_title_or_id">Comment title</span> <span tal:replace="reply/title">Comment title</span>
</a> </a>
</h3> </h3>
<div class="documentByLine"
<!--<div class="documentByLine"
tal:define="creator reply/Creator; tal:define="creator reply/Creator;
anonymous_creator python:creator in ('Anonymous User', ''); anonymous_creator python:creator in ('Anonymous User', '');
mi python:not anonymous_creator and view.member_info(creator); mi python:not anonymous_creator and view.member_info(creator);
@ -52,39 +96,16 @@
condition="anonymous_creator">Anonymous User</tal:name> condition="anonymous_creator">Anonymous User</tal:name>
<tal:at i18n:translate="label_commented_at">at</tal:at> <tal:at i18n:translate="label_commented_at">at</tal:at>
<span tal:replace="python:view.format_time(reply.ModificationDate())">8/23/2001 12:40:44 PM</span> <span tal:replace="python:view.format_time(reply.ModificationDate())">8/23/2001 12:40:44 PM</span>
</div> </div>-->
<div class="commentBody" <div class="commentBody"
tal:content="structure reply/CookedBody"> tal:content="structure reply/text">
This is the body text of the comment. This is the body text of the comment.
</div> </div>
<form name="reply"
action="discussion_reply_form"
method="post"
style="display: inline;"
tal:attributes="action string:${reply/absolute_url}/discussion_reply_form"
tal:condition="python:userHasReplyPermission and isDiscussionAllowed">
<input type="hidden"
name="subject"
tal:attributes="value reply/pretty_title_or_id" />
<input class="standalone"
type="submit"
value="Reply"
i18n:attributes="value label_reply;"
/>
</form>
<form name="delete"
action=""
method="post"
style="display: inline;"
tal:condition="view/can_manage"
tal:attributes="action string:${reply/absolute_url}/deleteDiscussion">
<input class="destructive"
type="submit"
value="Remove"
i18n:attributes="value label_remove;"
/>
</form>
</div> </div>
</tal:getreplies> </tal:getreplies>
</div> </div>
</tal:block>
</tal:block>

View File

@ -1,70 +1,63 @@
from urllib import quote as url_quote from zope.interface import implements
from zope.component import getMultiAdapter
from zope.viewlet.interfaces import IViewlet
from Acquisition import aq_inner, aq_parent from Acquisition import aq_inner
from AccessControl import getSecurityManager from Products.Five.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from Products.CMFCore.utils import getToolByName
from Products.CMFDefault.DiscussionTool import DiscussionNotAllowed
from plone.app.layout.viewlets.common import ViewletBase from plone.app.discussion.interfaces import IComment
from plone.app.discussion.conversation import conversationAdapterFactory
class CommentsViewlet(ViewletBase): from plone.app.discussion.comment import CommentFactory
index = ViewPageTemplateFile('comments.pt')
from zope.component import createObject
class CommentsViewlet(BrowserView):
"""Discussion Viewlet
"""
implements(IViewlet)
template = ViewPageTemplateFile('comments.pt')
def __init__(self, context, request, view, manager):
super(CommentsViewlet, self).__init__(context, request)
self.__parent__ = view
self.view = view
self.manager = manager
self.portal_state = getMultiAdapter((context, self.request), name=u"plone_portal_state")
def update(self): def update(self):
super(CommentsViewlet, self).update() pass
self.portal_discussion = getToolByName(self.context, 'portal_discussion', None)
self.portal_membership = getToolByName(self.context, 'portal_membership', None)
def can_reply(self): def replies(self):
return getSecurityManager().checkPermission('Reply to item', aq_inner(self.context)) conversation = conversationAdapterFactory(self.context)
return conversation.items()
def is_discussion_allowed(self): class AddComment(BrowserView):
if self.portal_discussion is None: """Add a comment to a conversation
return False """
else:
return self.portal_discussion.isDiscussionAllowedFor(aq_inner(self.context))
def get_replies(self): def __call__(self):
replies = []
context = aq_inner(self.context) if self.request.has_key('form.button.AddComment'):
container = aq_parent(context)
pd = self.portal_discussion
def getRs(obj, replies, counter): subject = self.request.get('subject')
rs = pd.getDiscussionFor(obj).getReplies() text = self.request.get('body_text')
if len(rs) > 0:
rs.sort(lambda x, y: cmp(x.modified(), y.modified()))
for r in rs:
replies.append({'depth':counter, 'object':r})
getRs(r, replies, counter=counter + 1)
try: # The add-comment view is called on the conversation object
getRs(context, replies, 0) conversation = self.context
except DiscussionNotAllowed:
# We tried to get discussions for an object that has not only
# discussions turned off but also no discussion container.
return []
return replies
def is_anonymous(self): # Create the comment
return self.portal_state.anonymous() comment = CommentFactory()
comment.title = subject
comment.text = text
def login_action(self): # Add comment to the conversation
return '%s/login_form?came_from=%s' % (self.navigation_root_url, url_quote(self.request.get('URL', '')),) conversation.addComment(comment)
def can_manage(self): # TODO: Redirect to the document object page
return getSecurityManager().checkPermission('Manage portal', aq_inner(self.context)) # conversation.__parent__ is not working?!
#self.request.response.redirect(aq_inner(self.context).absolute_url())
def member_info(self, creator):
if self.portal_membership is None:
return None
else:
return self.portal_membership.getMemberInfo(creator)
def format_time(self, time):
context = aq_inner(self.context)
util = getToolByName(context, 'translation_service')
return util.ulocalized_time(time, 1, context, domain='plonelocales')

View File

@ -2,7 +2,7 @@
xmlns="http://namespaces.zope.org/zope" xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser" xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="plone.app.discussion"> i18n_domain="plone.app.discussion">
<!-- Traversal adapter --> <!-- Traversal adapter -->
<adapter factory=".traversal.ConversationNamespace" name="conversation" /> <adapter factory=".traversal.ConversationNamespace" name="conversation" />
@ -18,4 +18,13 @@
permission="zope2.View" permission="zope2.View"
/> />
<!-- add-comment view -->
<browser:view
name="add-comment"
for="plone.app.discussion.interfaces.IConversation"
layer="..interfaces.IDiscussionLayer"
class=".comments.AddComment"
permission="zope2.View"
/>
</configure> </configure>