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
This commit is contained in:
Timo Stollenwerk 2009-06-18 21:02:32 +00:00
parent 34ee743bf3
commit c8a24e5d74
1 changed files with 34 additions and 6 deletions

View File

@ -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