From c8a24e5d746ce92816fc1b148101b171b8d77e65 Mon Sep 17 00:00:00 2001 From: Timo Stollenwerk Date: Thu, 18 Jun 2009 21:02:32 +0000 Subject: [PATCH] make conversation.enabled return a boolean (remove the property decorator). Always return false if the content object is a folder. svn path=/plone.app.discussion/trunk/; revision=27502 --- plone/app/discussion/conversation.py | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/plone/app/discussion/conversation.py b/plone/app/discussion/conversation.py index 7a6fc3f..11eebaf 100644 --- a/plone/app/discussion/conversation.py +++ b/plone/app/discussion/conversation.py @@ -25,7 +25,7 @@ from zope.annotation.interfaces import IAnnotations, IAnnotatable from zope.event import notify -from Acquisition import aq_base, aq_inner +from Acquisition import aq_base, aq_inner, aq_parent from Acquisition import Explicit from OFS.Traversable import Traversable @@ -34,6 +34,9 @@ from OFS.event import ObjectWillBeAddedEvent from OFS.event import ObjectWillBeRemovedEvent from Products.CMFCore.utils import getToolByName +from Products.CMFCore.interfaces import IFolderish + +from Products.CMFPlone.interfaces import IPloneSiteRoot, INonStructuralFolder from zope.app.container.contained import ContainerModifiedEvent @@ -84,9 +87,12 @@ class Conversation(Traversable, Persistent, Explicit): """ return self.id - @property def enabled(self): - # Returns True if discussion is allowed + # Returns True if discussion is enabled on the conversation + + site = getSite() + portal_discussion = getToolByName(site, 'portal_discussion') + portal_types = getToolByName(site, 'portal_types') # Fetch discussion registry registry = queryUtility(IRegistry) @@ -96,16 +102,38 @@ class Conversation(Traversable, Persistent, Explicit): if not settings.globally_enabled: return False + # Always return False if object is a folder + if IFolderish.providedBy(aq_inner(self.__parent__)) and not INonStructuralFolder.providedBy(aq_inner(self.__parent__)): + return False + + # Check folders by traversing through the object tree + allowed = False + def traverse(obj): + # Run from context to the Plone Site Root + if not IPloneSiteRoot.providedBy(obj): + # Look for Plone folders + if IFolderish.providedBy(obj) and not INonStructuralFolder.providedBy(obj): + if portal_discussion.isDiscussionAllowedFor(obj): + #print "FOLDER %s: discussion allowed => override" % obj.id + allowed = True + traverse(aq_parent(obj)) + + obj = aq_parent(self) + #print "" + #print "### START TRAVERSE ###" + # Start traversing + #traverse(obj) + #print allowed + #print "### END TRAVERSE ###" + + # Check if discussion is allowed on the content type - site = getSite() - portal_types = getToolByName(site, 'portal_types') portal_type = self.__parent__.portal_type document_fti = getattr(portal_types, 'Document') if not document_fti.getProperty('allow_discussion'): # If discussion is not allowed on the content type, # check if 'allow discussion' is overridden on the content object. #if hasattr( aq_base(self.__parent__), 'allow_discussion' ): - portal_discussion = getToolByName(site, 'portal_discussion') if not portal_discussion.isDiscussionAllowedFor(aq_inner(self.__parent__)): return False