from Products.CMFCore.utils import getToolByName
from Products.Archetypes.public import listTypes
from Products.Archetypes.Extensions.utils import installTypes, install_subskin
from Products.CMFContentPanels.config import PROJECTNAME, GLOBALS, NEW_VIEW_METHODS
from Products.CMFContentPanels.config import PLONE_VERSION
from Products.CMFContentPanels.ContentPanelsTool import ContentPanelsTool
 
from Products.StandardCacheManagers import RAMCacheManager
 
from Acquisition import aq_base
from cStringIO import StringIO
import string
 
from Acquisition import Implicit
import Persistence
 
def install_RSSCache(portal, out):
    if 'RSSCache' not in portal.objectIds():
        RAMCacheManager.manage_addRAMCacheManager(portal, 'RSSCache')
 
    portal.RSSCache.manage_editProps('RSSCache for getRSSResult', \
             settings={ 'threshold':1000,
                        'request_vars':['itemCount', 'rssUrl'],
                        'cleanup_interval':300,
                        'max_age':3600})
    out.write( "added and initalized RAMCache" )
 
def install_default_page(portal, out):
    site_props = getToolByName(portal, 'portal_properties').site_properties
    dpt = site_props.getProperty('default_page_types', None)
    if dpt is None:
        return
    if 'ContentPanels' not in dpt:
        site_props._setPropValue('default_page_types', list(dpt) + ['ContentPanels'])
 
def addViewMethods(portal, out):
    portal_types = getToolByName(portal, 'portal_types')
 
    for portal_type, view_methods in NEW_VIEW_METHODS.items():
        ti = portal_types.getTypeInfo(portal_type)
        real_new_methods = [method for method in view_methods if method not in ti.view_methods]
        if real_new_methods:
            ti.view_methods += tuple(real_new_methods)
 
def resetContentPanelsPermissions(portal, out):
    permissions = ['Access contents information', 'Modify portal content', 'View']
    portal_catalog = portal.portal_catalog
    brains = portal_catalog(portal_type="ContentPanels")
    for brain in brains:
        obj = brain.getObject()
        for perm in permissions:
            obj.manage_permission(perm, acquire=1)
        portal_catalog.catalog_object(obj, None)
 
def install(self, reinstall=False):
 
    out = StringIO()
    out.write( 'CMFContentPanels installation tool\n')
 
    portal = getToolByName(self, 'portal_url').getPortalObject()
    setup_tool = getToolByName(portal, 'portal_setup')
    if PLONE_VERSION >= 3:
        setup_tool.runAllImportStepsFromProfile(
                "profile-Products.CMFContentPanels:default",
                purge_old=False)
    else:
        factory_tool = getToolByName(self,'portal_factory')
        factory_types=[
            "ContentPanels",
            ] + factory_tool.getFactoryTypes().keys()
        factory_tool.manage_setPortalFactoryTypes(listOfTypeIds=factory_types)
 
        installTypes(self, out, listTypes(PROJECTNAME), PROJECTNAME)
        install_subskin(self, out, GLOBALS)
 
        if not hasattr(portal, 'portal_contentpanels'):
            portal._setObject( 'portal_contentpanels', ContentPanelsTool() )
            out.write('Added ConentPanels Tool\n')
 
    p_cp=getToolByName(self, 'portal_contentpanels')
    p_cp.manage_installAllViewlets()
 
    install_RSSCache(portal, out)
    install_default_page(portal, out)
 
    addViewMethods(portal, out)
 
    return out.getvalue()