
configure.zcml::

    <configure
      xmlns="http://namespaces.zope.org/zope"
      xmlns:browser="http://namespaces.zope.org/browser"
      xmlns:plone="http://namespaces.plone.org/plone"
      xmlns:grok="http://namespaces.zope.org/grok"
      i18n_domain="freitag.behavior.allowdiscussion">
      
      <!-- Override plone.app.discussion's conversation view -->
      <browser:page
        name="conversation_view"
        for="plone.dexterity.interfaces.IDexterityContent"
        class=".conversation.ConversationView"
        permission="zope2.View"
        />
    
    </configure>
    
conversation.py

    from zope.component import queryUtility
    
    from plone.registry.interfaces import IRegistry
    
    from Acquisition import aq_base
    from Acquisition import aq_chain
    from Acquisition import aq_inner
    
    from Products.CMFCore.utils import getToolByName
    from Products.CMFCore.interfaces import IFolderish
    
    from Products.CMFPlone.interfaces import IPloneSiteRoot
    from Products.CMFPlone.interfaces import INonStructuralFolder
    
    from plone.app.discussion.interfaces import IDiscussionSettings
    
    
    class ConversationView(object):
    
        def enabled(self):
            context = aq_inner(self.context)
    
            # Fetch discussion registry
            registry = queryUtility(IRegistry)
            settings = registry.forInterface(IDiscussionSettings, check=False)
            
            # Check if discussion is allowed globally
            if not settings.globally_enabled:
                return False
            
            # Check if discussion is allowed on the content object
            if context.allow_discussion is not None:
                return context.allow_discussion
            
            # Check if discussion is allowed on the content type
            portal_types = getToolByName(self, 'portal_types')
            document_fti = getattr(portal_types, context.portal_type)
            return document_fti.getProperty('allow_discussion')
