1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
"""\
This file is an installation script for CMFForum (ZPT skins). It's meant
to be used as an External Method. To use, add an external method to the
root of the CMF Site that you want ZPT skins registered in with the
configuration:
id: install_forum
title: Install Forum Product *optional*
module name: CMFForum.Install
function name: install
Then go to the management screen for the newly added external method
and click the 'Test' tab. The install function will execute and give
information about the steps it took to register and install the
ZPT skins into the CMF Site instance.
"""
from Products.CMFCore.TypesTool import ContentFactoryMetadata
from Products.CMFCore.DirectoryView import addDirectoryViews
from Products.CMFCore.utils import getToolByName
from Products.ExternalMethod import ExternalMethod
from Acquisition import aq_base
from cStringIO import StringIO
import string
import string
from Acquisition import Implicit
import Persistence
from Products.CMFForum import cmfforum_globals, Forum, Post
__version__='0.1'
def install_SubSkin(self, outStream, skinFolder):
""" Installs a subskin, should be just 1 folder.
"""
skinstool=getToolByName(self, 'portal_skins')
for skin in skinstool.getSkinSelections():
path = skinstool.getSkinPath(skin)
path = map( string.strip, string.split( path,',' ) )
if not skinFolder in path:
try:
path.insert( path.index( 'custom')+1, skinFolder )
except ValueError:
path.append(skinFolder)
path = string.join( path, ', ' )
skinstool.addSkinSelection( skin, path )
outStream.write('CMFForum subskin successfully installed into %s.\n' % skin)
else:
outStream.write('CMFForum subskin was already installed into %s.\n' % skin)
def install_ForumSkins(self, out):
"""
Add a new skin, 'Plone', copying 'ZPT', if it exists, and then
add our directories only to it.
"""
skinstool = getToolByName(self, 'portal_skins')
try:
install_SubSkin(self, out, 'zpt_forum')
out.write('CMFForum subskin successfully installed.\n')
except:
out.write('CMFForum subskin failed to install.\n')
try:
addDirectoryViews( skinstool, 'skins', cmfforum_globals )
out.write( "Added CMFForum directory views to portal_skins.\n" )
except:
out.write( 'Unable to add CMFForum directory view to portal_skins.\n')
def install(self):
""" Register the Forum Skins with portal_skins and friends """
skinstool = getToolByName(self, 'portal_skins')
wf_tool = getToolByName(self, 'portal_workflow')
out = StringIO()
out.write( 'CMFForum installation tool v' + str(__version__) + '.\n')
install_ForumSkins(self, out)
# Register with the typestool manually instead of with manage_addTypeInformation
# as the classes were not registered with utils.ContentInit in __init__.py
types_tool = getToolByName(self, 'portal_types')
for t in (Forum.factory_type_information,Post.factory_type_information):
if t['id'] not in types_tool.objectIds():
cfm = apply(ContentFactoryMetadata, (), t)
types_tool._setObject(t['id'], cfm)
out.write('Registered %s with the types tool\n' % t['id'])
else:
out.write('Skipping "%s" - already in types tool\n' % t['id'])
# Remove workflows for Forum and Post
wf_tool.setChainForPortalTypes( ('Forum','Post'), [])
out.write('Removed workflow for Forum and Post')
return out.getvalue()
def install_discussions(self):
""" Replace default DiscussionTool from CMF by a CMFForum-based one """
out = StringIO()
out.write( 'CMFForum installation tool v' + str(__version__) + '.\n')
install_SubSkin(self, out, 'zpt_forum/discussion')
out.write( '* Replacing Default CMF DiscussionTool by CMFForums one.')
self.manage_delObjects( 'portal_discussion' )
addPloneTool=self.manage_addProduct['CMFForum'].manage_addTool
addPloneTool('CMFForum Discussion Tool', None)
out.write( 'Done.')
return out.getvalue()
|