From 424d1c79ed8f61da55d07df3e73c381f6ead2d46 Mon Sep 17 00:00:00 2001 From: Timo Stollenwerk Date: Sat, 1 Aug 2009 21:47:50 +0000 Subject: [PATCH] z3c.form form added to commentsviewlet (not fully functional yet). svn path=/plone.app.discussion/trunk/; revision=28300 --- plone/app/discussion/browser/comments.old.pt | 338 +++++++++++++++++++ plone/app/discussion/browser/comments.old.py | 285 ++++++++++++++++ plone/app/discussion/browser/comments.pt | 2 + plone/app/discussion/browser/comments.py | 126 ++++++- plone/app/discussion/browser/configure.zcml | 3 +- plone/app/discussion/interfaces.py | 4 +- 6 files changed, 748 insertions(+), 10 deletions(-) create mode 100644 plone/app/discussion/browser/comments.old.pt create mode 100644 plone/app/discussion/browser/comments.old.py diff --git a/plone/app/discussion/browser/comments.old.pt b/plone/app/discussion/browser/comments.old.pt new file mode 100644 index 0000000..eee4e60 --- /dev/null +++ b/plone/app/discussion/browser/comments.old.pt @@ -0,0 +1,338 @@ + + +
+
+ +
+
+ +
+ + +
+ +
+ + + + + +
+ +

+ + Comment title + +

+ +
+ Posted by + + + Poster Name + + + + Anonymous User + at + 8/23/2001 12:40:44 PM +
+ +
+ This is the body text of the comment. +
+ + + +
+ +
+ + +
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + Add comment +

+ You can add a comment by filling out the form below. Plain text + formatting. +

+ +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + +
+ + + +
+
+
+ +
+ +
+ + Add comment +

+ You can add a comment by filling out the form below. Plain text + formatting. +

+ +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + (Required) + +
Validation error output
+ + + +
+ +
+ + + + +
+ + + +
+
+
+
\ No newline at end of file diff --git a/plone/app/discussion/browser/comments.old.py b/plone/app/discussion/browser/comments.old.py new file mode 100644 index 0000000..6f38495 --- /dev/null +++ b/plone/app/discussion/browser/comments.old.py @@ -0,0 +1,285 @@ +from datetime import datetime +from DateTime import DateTime + +from urllib import quote as url_quote + +from zope.interface import implements + +from zope.component import createObject, getMultiAdapter, queryUtility + +from zope.viewlet.interfaces import IViewlet + +from Acquisition import aq_inner, aq_parent, aq_base + +from AccessControl import getSecurityManager + +from Products.Five.browser import BrowserView +from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile + +from Products.CMFCore.utils import getToolByName + +from Products.CMFPlone import PloneMessageFactory as _ +from Products.statusmessages.interfaces import IStatusMessage + +from plone.registry.interfaces import IRegistry + +from plone.app.layout.viewlets.common import ViewletBase + +from plone.app.discussion.comment import CommentFactory +from plone.app.discussion.interfaces import IConversation, IComment, IReplies, IDiscussionSettings + + + +class View(BrowserView): + """Comment View + """ + + def __call__(self): + # Redirect from /path/to/object/++conversation++default/123456789 + # to /path/to/object#comment-123456789 + comment_id = aq_parent(self).id + #self.request.response.redirect(aq_parent(aq_parent(aq_parent(self))).absolute_url() + '#comment-' + comment_id) + self.request.response.redirect(aq_parent(aq_parent(aq_parent(self))).absolute_url() + '#' + comment_id) + +class CommentsViewlet(ViewletBase): + """Discussion Viewlet + """ + + implements(IViewlet) + + template = ViewPageTemplateFile('comments.pt') + + def update(self): + super(CommentsViewlet, self).update() + self.portal_discussion = getToolByName(self.context, 'portal_discussion', None) + self.portal_membership = getToolByName(self.context, 'portal_membership', None) + + def can_reply(self): + return getSecurityManager().checkPermission('Reply to item', aq_inner(self.context)) + + def can_manage(self): + return getSecurityManager().checkPermission('Manage portal', aq_inner(self.context)) + + def is_discussion_allowed(self): + context = aq_inner(self.context) + conversation = IConversation(context) + return conversation.enabled + + def get_replies(self, workflow_actions=False): + context = aq_inner(self.context) + conversation = IConversation(context) + + def replies_with_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'] + # list all possible workflow actions + actions = [a for a in wf.listActionInfos(object=comment_obj) + if a['category'] == 'workflow' and a['allowed']] + r = r.copy() + r['actions'] = actions + yield r + + # Return all direct replies + if conversation.total_comments > 0: + if workflow_actions: + return replies_with_workflow_actions() + else: + return conversation.getThreads() + else: + return None + + + def get_commenter_home_url(self, username): + if username is None: + return None + else: + return "%s/author/%s" % (self.context.portal_url(), username) + + def get_commenter_portrait(self, username): + + if username is None: + # return the default user image if no username is given + return 'defaultUser.gif' + else: + portal_membership = getToolByName(self.context, 'portal_membership', None) + return portal_membership.getPersonalPortrait(username).absolute_url(); + + def anonymous_discussion_allowed(self): + # Check if anonymous comments are allowed in the registry + registry = queryUtility(IRegistry) + settings = registry.forInterface(IDiscussionSettings) + return settings.anonymous_comments + + def show_commenter_image(self): + # Check if showing commenter image is enabled in the registry + registry = queryUtility(IRegistry) + settings = registry.forInterface(IDiscussionSettings) + return settings.show_commenter_image + + def is_anonymous(self): + return self.portal_state.anonymous() + + def login_action(self): + return '%s/login_form?came_from=%s' % (self.navigation_root_url, url_quote(self.request.get('URL', '')),) + + def format_time(self, time): + # We have to transform Python datetime into Zope DateTime + # before we can call toLocalizedTime. + util = getToolByName(self.context, 'translation_service') + zope_time = DateTime(time.year, time.month, time.day, time.hour, time.minute, time.second) + return util.toLocalizedTime(zope_time, long_format=True) + +class AddComment(BrowserView): + """Add a comment to a conversation + """ + + def __call__(self): + + if self.request.has_key('form.button.AddComment'): + + context = aq_inner(self.context) + + subject = self.request.get('subject') + text = self.request.get('body_text') + author_username = self.request.get('author_username') + author_email = self.request.get('author_email') + + # Check the form input + if author_username == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Username field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if author_email == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Email field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if subject == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Subject field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if text == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Comment field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + + # The add-comment view is called on the conversation object + conversation = context + + # Create the comment + comment = CommentFactory() + comment.title = subject + comment.text = text + + portal_membership = getToolByName(context, 'portal_membership') + + if portal_membership.isAnonymousUser(): + comment.creator = author_username + comment.author_name = author_username + comment.author_email = author_email + comment.creation_date = comment.modification_date = datetime.now() + else: + member = portal_membership.getAuthenticatedMember() + fullname = member.getProperty('fullname') + if fullname == '' or None: + comment.creator = member.id + else: + comment.creator = fullname + comment.author_username = member.getUserName() + comment.author_name = member.getProperty('fullname') + comment.author_email = member.getProperty('email') + comment.creation_date = comment.modification_date = datetime.now() + + # Add comment to the conversation + comment_id = conversation.addComment(comment) + + # Redirect to comment (inside a content object page) + #self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url() + '#comment-' + str(comment_id)) + self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url() + '#' + str(comment_id)) + +class ReplyToComment(BrowserView): + """Reply to a comment + """ + + def __call__(self): + + context = aq_inner(self.context) + + if self.request.has_key('form.button.AddComment'): + + reply_to_comment_id = self.request.get('form.reply_to_comment_id') + + subject = self.request.get('subject') + text = self.request.get('body_text') + author_username = self.request.get('author_username') + author_email = self.request.get('author_email') + + # Check the form input + if author_username == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Username field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if author_email == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Email field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if subject == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Subject field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + if text == '': + IStatusMessage(self.request).addStatusMessage(\ + _("Comment field is empty."), + type="info") + return self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url()) + + # The add-comment view is called on the conversation object + conversation = context + + # Fetch the comment we want to reply to + comment_to_reply_to = conversation.get(reply_to_comment_id) + + replies = IReplies(comment_to_reply_to) + + # Create the comment + comment = CommentFactory() + comment.title = subject + comment.text = text + + portal_membership = getToolByName(context, 'portal_membership') + + if portal_membership.isAnonymousUser(): + comment.creator = author_username + comment.author_name = author_username + comment.author_email = author_email + comment.creation_date = comment.modification_date = datetime.now() + else: + member = portal_membership.getAuthenticatedMember() + fullname = member.getProperty('fullname') + if fullname == '' or None: + comment.creator = member.id + else: + comment.creator = fullname + comment.author_username = member.getUserName() + comment.author_name = member.getProperty('fullname') + comment.author_email = member.getProperty('email') + comment.creation_date = comment.modification_date = datetime.now() + + # Add the reply to the comment + new_re_id = replies.addComment(comment) + + # Redirect to comment (inside a content object page) + #self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url() + '#comment-' + str(reply_to_comment_id)) + # Todo: Temporarily remove the "#comment-" to fix a bug + # in CMFPlone/skins/plone_ecmascript/form_tabbing.js + self.request.response.redirect(aq_parent(aq_inner(context)).absolute_url() + '#' + str(reply_to_comment_id)) \ No newline at end of file diff --git a/plone/app/discussion/browser/comments.pt b/plone/app/discussion/browser/comments.pt index eee4e60..ebb6fb4 100644 --- a/plone/app/discussion/browser/comments.pt +++ b/plone/app/discussion/browser/comments.pt @@ -153,6 +153,8 @@ formatting.

+
+
diff --git a/plone/app/discussion/interfaces.py b/plone/app/discussion/interfaces.py index d59aa9a..77971ff 100644 --- a/plone/app/discussion/interfaces.py +++ b/plone/app/discussion/interfaces.py @@ -133,8 +133,8 @@ class IComment(Interface): portal_type = schema.ASCIILine(title=_(u"Portal type"), default="Discussion Item") - __parent__ = schema.Object(title=_(u"Conversation"), schema=Interface) - __name__ = schema.TextLine(title=_(u"Name")) + #__parent__ = schema.Object(title=_(u"Conversation"), schema=Interface) + #__name__ = schema.TextLine(title=_(u"Name")) comment_id = schema.Int(title=_(u"A comment id unique to this conversation")) in_reply_to = schema.Int(title=_(u"Id of comment this comment is in reply to"), required=False)