diff --git a/plone/app/discussion/catalog.py b/plone/app/discussion/catalog.py index e87af0b..e7d321b 100644 --- a/plone/app/discussion/catalog.py +++ b/plone/app/discussion/catalog.py @@ -25,6 +25,7 @@ MAX_DESCRIPTION = 25 # Conversation Indexers + @indexer(IContentish, IZCatalog) def total_comments(object): # Total number of comments on a conversation @@ -33,11 +34,12 @@ def total_comments(object): try: conversation = IConversation(object) return conversation.total_comments - except TypeError: # pragma: no cover + except TypeError: # pragma: no cover # The item is contentish but nobody # implemented an adapter for it pass + @indexer(IContentish, IZCatalog) def last_comment_date(object): # Date of the latest comment on a conversation @@ -46,11 +48,12 @@ def last_comment_date(object): try: conversation = IConversation(object) return conversation.last_comment_date - except TypeError: # pragma: no cover + except TypeError: # pragma: no cover # The item is contentish but nobody # implemented an adapter for it pass + @indexer(IContentish, IZCatalog) def commentators(object): # List of commentators on a conversation @@ -59,39 +62,46 @@ def commentators(object): try: conversation = IConversation(object) return tuple(conversation.commentators.keys()) - except TypeError: # pragma: no cover + except TypeError: # pragma: no cover # The item is contentish but nobody # implemented an adapter for it pass # Comment Indexers + @indexer(IComment) def title(object): return object.Title() + @indexer(IComment) def creator(object): return object.creator and safe_unicode(object.creator).encode('utf-8') + @indexer(IComment) def description(object): # Return the first 25 words of the comment text and append ' [...]' - text = join(object.getText(targetMimetype='text/plain').split()[:MAX_DESCRIPTION]) + text = join(object.getText( + targetMimetype='text/plain').split()[:MAX_DESCRIPTION]) if len(object.getText().split()) > 25: text += " [...]" return text + @indexer(IComment) def searchable_text(object): return object.getText(targetMimetype='text/plain') + @indexer(IComment) def in_response_to(object): # Always returns the content object the comment is added to. # Do not confuse this with the in_reply_to attribute of a comment! return object.__parent__.__parent__.title_or_id() + @indexer(IComment) def effective(object): # the catalog index needs Zope DateTime instead of Python datetime @@ -103,6 +113,7 @@ def effective(object): object.creation_date.second, 'GMT') + @indexer(IComment) def created(object): # the catalog index needs Zope DateTime instead of Python datetime @@ -114,6 +125,7 @@ def created(object): object.creation_date.second, 'GMT') + @indexer(IComment) def modified(object): # the catalog index needs Zope DateTime instead of Python datetime @@ -125,20 +137,25 @@ def modified(object): object.modification_date.second, 'GMT') + # Override the conversation indexers for comments + @indexer(IComment) def comments_total_comments(object): return None + @indexer(IComment) def comments_last_comment_date(object): return None + @indexer(IComment) def comments_commentators(object): return None + # Make sure comments don't inherit their container's UID @indexer(IComment) def UID(object): diff --git a/plone/app/discussion/tests/test_notifications.py b/plone/app/discussion/tests/test_notifications.py index 5210170..10970f6 100644 --- a/plone/app/discussion/tests/test_notifications.py +++ b/plone/app/discussion/tests/test_notifications.py @@ -9,7 +9,6 @@ from zope.component import getSiteManager from zope.component import queryUtility from plone.app.testing import TEST_USER_ID, setRoles -from plone.app.testing import logout, login from Products.MailHost.interfaces import IMailHost from Products.CMFPlone.tests.utils import MockMailHost @@ -225,10 +224,12 @@ class TestModeratorNotificationUnit(unittest.TestCase): in msg) self.assertTrue('Comment text' in msg) self.assertTrue( - 'Approve comment:\nhttp://nohost/plone/doc1/++conversation++default/%s/@@moderat=\ne-publish-comment' + 'Approve comment:\nhttp://nohost/plone/doc1/' + + '++conversation++default/%s/@@moderat=\ne-publish-comment' % comment_id in msg) self.assertTrue( - 'Delete comment:\nhttp://nohost/plone/doc1/++conversation++default/%s/@@moderat=\ne-delete-comment' + 'Delete comment:\nhttp://nohost/plone/doc1/' + + '++conversation++default/%s/@@moderat=\ne-delete-comment' % comment_id in msg) def test_notify_moderator_specific_address(self): diff --git a/plone/app/discussion/tests/test_tool.py b/plone/app/discussion/tests/test_tool.py index 910ad29..783bdca 100644 --- a/plone/app/discussion/tests/test_tool.py +++ b/plone/app/discussion/tests/test_tool.py @@ -4,10 +4,12 @@ from zope.component import queryUtility, createObject from plone.app.testing import TEST_USER_ID, setRoles -from plone.app.discussion.testing import PLONE_APP_DISCUSSION_INTEGRATION_TESTING +from plone.app.discussion.testing import \ + PLONE_APP_DISCUSSION_INTEGRATION_TESTING from plone.app.discussion.interfaces import ICommentingTool, IConversation + class ToolTest(unittest.TestCase): layer = PLONE_APP_DISCUSSION_INTEGRATION_TESTING @@ -34,8 +36,9 @@ class ToolTest(unittest.TestCase): # Check that the comment got indexed in the tool: tool = queryUtility(ICommentingTool) comment = list(tool.searchResults()) - self.assertTrue(len(comment) == 1, "There is only one comment, but we got" - " %s results in the search" % len(comment)) + self.assertTrue(len(comment) == 1, + "There is only one comment, but we got" + " %s results in the search" % len(comment)) self.assertEqual(comment[0].Title, 'Jim on Document 1') def test_unindexing(self): @@ -45,5 +48,6 @@ class ToolTest(unittest.TestCase): # search returns only comments pass + def test_suite(): return unittest.defaultTestLoader.loadTestsFromName(__name__)