Annotation of kupuMPIWG/Extensions/Install.py, revision 1.1.1.1

1.1       dwinter     1: ##############################################################################
                      2: #
                      3: # Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
                      4: #
                      5: # This software is distributed under the terms of the Kupu
                      6: # License. See LICENSE.txt for license text. For a list of Kupu
                      7: # Contributors see CREDITS.txt.
                      8: #
                      9: ##############################################################################
                     10: """Install kupu in CMF and, if available, Plone
                     11: 
                     12: This is best executed using CMFQuickInstaller
                     13: 
                     14: $Id: Install.py 14575 2005-07-12 20:18:12Z duncan $
                     15: """
                     16: import os.path
                     17: import sys
                     18: import re
                     19: from StringIO import StringIO
                     20: 
                     21: from App.Common import package_home
                     22: 
                     23: from Products.CMFCore.utils import getToolByName, minimalpath
                     24: from Products.CMFCore.DirectoryView import createDirectoryView
                     25: from Products.kupu import kupu_globals
                     26: from Products.kupu.config import TOOLNAME, PROJECTNAME, TOOLTITLE
                     27: from OFS.ObjectManager import BadRequestException
                     28: from zExceptions import BadRequest
                     29: 
                     30: try:
                     31:     from Products.MimetypesRegistry import MimeTypeItem
                     32: except ImportError:
                     33:     pass # Plone not available
                     34: 
                     35: kupu_package_dir = package_home(kupu_globals)
                     36: 
                     37: def register_layer(self, relpath, name, out):
                     38:     """Register a file system directory as skin layer
                     39:     """
                     40:     print >>out, "register skin layers"
                     41:     skinstool = getToolByName(self, 'portal_skins')
                     42:     if name not in skinstool.objectIds():
                     43:         kupu_plone_skin_dir = minimalpath(os.path.join(kupu_package_dir, relpath))
                     44:         createDirectoryView(skinstool, kupu_plone_skin_dir, name)
                     45:         print >>out, "The layer '%s' was added to the skins tool" % name
                     46: 
                     47:     # put this layer into all known skins
                     48:     for skinName in skinstool.getSkinSelections():
                     49:         path = skinstool.getSkinPath(skinName) 
                     50:         path = [i.strip() for i in path.split(',')]
                     51:         try:
                     52:             if name not in path:
                     53:                 path.insert(path.index('custom')+1, name)
                     54:         except ValueError:
                     55:             if name not in path:
                     56:                 path.append(name)
                     57: 
                     58:         path = ','.join(path)
                     59:         skinstool.addSkinSelection(skinName, path)
                     60: 
                     61: def install_plone(self, out):
                     62:     """Install with plone
                     63:     """
                     64:     # register the plone skin layer
                     65:     register_layer(self, 'plone/kupu_plone_layer', 'kupu_plone', out)
                     66: 
                     67:     # register as editor
                     68:     portal_props = getToolByName(self, 'portal_properties')
                     69:     site_props = getattr(portal_props,'site_properties', None)
                     70:     attrname = 'available_editors'
                     71:     if site_props is not None:
                     72:         editors = list(site_props.getProperty(attrname)) 
                     73:         if 'Kupu' not in editors:
                     74:             editors.append('Kupu')
                     75:             site_props._updateProperty(attrname, editors)        
                     76:             print >>out, "Added 'Kupu' to available editors in Plone."
                     77:     install_libraries(self, out)
                     78:     install_configlet(self, out)
                     79:     install_transform(self, out)
                     80:     install_resources(self, out)
                     81:     install_customisation(self, out)
                     82: 
                     83: def _read_resources():
                     84:     resourcefile = open(os.path.join(kupu_package_dir, 'plone', 'head.kupu'), 'r')
                     85:     try:
                     86:         data = resourcefile.read()
                     87:         return data
                     88:     finally:
                     89:         resourcefile.close()
                     90: 
                     91: def css_files(resources):
                     92:     CSSPAT = re.compile(r'\<link [^>]*rel="stylesheet"[^>]*\${portal_url}/([^"]*)"')
                     93:     for m in CSSPAT.finditer(resources):
                     94:         id = m.group(1)
                     95:         yield id
                     96: 
                     97: def js_files(resources):
                     98:     JSPAT = re.compile(r'\<script [^>]*\${portal_url}/([^"]*)"')
                     99:     for m in JSPAT.finditer(resources):
                    100:         id = m.group(1)
                    101:         if id=='sarissa.js':
                    102:             continue
                    103:         yield id
                    104: 
                    105: def install_resources(self, out):
                    106:     """Add the js and css files to the resource registry so that
                    107:     they can be merged for download.
                    108:     """
                    109:     try:
                    110:         from Products.ResourceRegistries.config import CSSTOOLNAME, JSTOOLNAME
                    111:     except ImportError:
                    112:         print >>out, "Resource registry not found: kupu will load its own resources"
                    113:         return
                    114: 
                    115:     data = _read_resources()
                    116:     
                    117:     CONDITION = '''python:portal.kupu_library_tool.isKupuEnabled(REQUEST=request)'''
                    118:     csstool = getToolByName(self, CSSTOOLNAME)
                    119:     jstool = getToolByName(self, JSTOOLNAME)
                    120: 
                    121:     for id in css_files(data):
                    122:         print >>out, "CSS file", id
                    123:         csstool.manage_removeStylesheet(id=id)
                    124:         csstool.manage_addStylesheet(id=id,
                    125:             expression=CONDITION,
                    126:             rel='stylesheet',
                    127:             enabled=True,
                    128:             cookable=True)
                    129: 
                    130:     for id in js_files(data):
                    131:         print >>out, "JS file", id
                    132:         jstool.manage_removeScript(id=id)
                    133:         jstool.manage_addScript(id=id,
                    134:             expression=CONDITION,
                    135:             enabled=True,
                    136:             cookable=True)
                    137: 
                    138: def uninstall_resources(self, out):
                    139:     """Remove the js and css files from the resource registries"""
                    140:     try:
                    141:         from Products.ResourceRegistries.config import CSSTOOLNAME, JSTOOLNAME
                    142:     except ImportError:
                    143:         return
                    144: 
                    145:     data = _read_resources()
                    146:     
                    147:     csstool = getToolByName(self, CSSTOOLNAME)
                    148:     jstool = getToolByName(self, JSTOOLNAME)
                    149: 
                    150:     for id in css_files(data):
                    151:         csstool.manage_removeStylesheet(id=id)
                    152: 
                    153:     for id in js_files(data):
                    154:         jstool.manage_removeScript(id=id)
                    155:     print >>out, "Resource files removed"
                    156:     
                    157: def install_libraries(self, out):
                    158:     """Install everything necessary to support Kupu Libraries
                    159:     """
                    160:     # add the library tool
                    161:     addTool = self.manage_addProduct['kupu'].manage_addTool
                    162:     try:
                    163:         addTool('Kupu Library Tool')
                    164:         print >>out, "Added the Kupu Library Tool to the plone Site"
                    165:     except BadRequest:
                    166:         print >>out, "Kupu library Tool already added"    
                    167:     except: # Older Zopes
                    168:         #heuristics for testing if an instance with the same name already exists
                    169:         #only this error will be swallowed.
                    170:         #Zope raises in an unelegant manner a 'Bad Request' error
                    171:         e=sys.exc_info()
                    172:         if e[0] != 'Bad Request':
                    173:             raise
                    174:         print >>out, "Kupu library Tool already added"    
                    175: 
                    176: def install_configlet(self, out):
                    177:     try:
                    178:         portal_conf=getToolByName(self,'portal_controlpanel')
                    179:     except AttributeError:
                    180:         print >>out, "Configlet could not be installed"
                    181:         return
                    182:     try:
                    183:         portal_conf.registerConfiglet( 'kupu'
                    184:                , TOOLTITLE
                    185:                , 'string:${portal_url}/%s/kupu_config' % TOOLNAME
                    186:                , ''                 # a condition   
                    187:                , 'Manage portal'    # access permission
                    188:                , 'Products'         # section to which the configlet should be added: 
                    189:                                     #(Plone,Products,Members) 
                    190:                , 1                  # visibility
                    191:                , PROJECTNAME
                    192:                , 'kupuimages/kupu_icon.gif' # icon in control_panel
                    193:                , 'Kupu Library Tool'
                    194:                , None
                    195:                )
                    196:     except KeyError:
                    197:         pass # Get KeyError when registering duplicate configlet.
                    198: 
                    199: def install_transform(self, out):
                    200:     try:
                    201:         print >>out, "Adding new mimetype"
                    202:         mimetypes_tool = getToolByName(self, 'mimetypes_registry')
                    203:         newtype = MimeTypeItem.MimeTypeItem('HTML with captioned images',
                    204:             ('text/x-html-captioned',), ('html-captioned',), 0)
                    205:         mimetypes_tool.register(newtype)
                    206: 
                    207:         print >>out,"Add transform"
                    208:         transform_tool = getToolByName(self, 'portal_transforms')
                    209:         try:
                    210:             transform_tool.manage_delObjects(['html-to-captioned'])
                    211:         except: # XXX: get rid of bare except
                    212:             pass
                    213:         transform_tool.manage_addTransform('html-to-captioned', 'Products.kupu.plone.html2captioned')
                    214:     except (NameError,AttributeError):
                    215:         print >>out, "No MimetypesRegistry, captioning not supported."
                    216: 
                    217: def install_customisation(self, out):
                    218:     """Default settings may be stored in a customisation policy script so
                    219:     that the entire setup may be 'productised'"""
                    220: 
                    221:     # Skins are cached during the request so we (in case new skin
                    222:     # folders have just been added) we need to force a refresh of the
                    223:     # skin.
                    224:     self.changeSkin(None)
                    225: 
                    226:     scriptname = '%s-customisation-policy' % PROJECTNAME.lower()
                    227:     cpscript = getattr(self, scriptname, None)
                    228:     if cpscript:
                    229:         cpscript = cpscript.__of__(self)
                    230: 
                    231:     if cpscript:
                    232:         print >>out,"Customising %s" % PROJECTNAME
                    233:         print >>out,cpscript()
                    234:     else:
                    235:         print >>out,"No customisation policy"
                    236: 
                    237: def install(self):
                    238:     out = StringIO()
                    239: 
                    240:     # register the core layer
                    241:     register_layer(self, 'common', 'kupu', out)
                    242: 
                    243:     # try for plone
                    244:     try:
                    245:         import Products.CMFPlone
                    246:     except ImportError:
                    247:         pass
                    248:     else:
                    249:         install_plone(self, out)
                    250: 
                    251:     print >>out, "kupu successfully installed"
                    252:     return out.getvalue()
                    253: 
                    254: def uninstall_transform(self, out):
                    255:     transform_tool = getToolByName(self, 'portal_transforms')
                    256:     try:
                    257:         transform_tool.manage_delObjects(['html-to-captioned'])
                    258:     except:
                    259:         pass
                    260:     else:
                    261:         print >>out, "Transform removed"
                    262: 
                    263: def uninstall_tool(self, out):
                    264:     try:
                    265:         self.manage_delObjects([TOOLNAME])
                    266:     except:
                    267:         pass
                    268:     else:
                    269:         print >>out, "Kupu tool removed"
                    270: 
                    271: def uninstall(self):
                    272:     out = StringIO()
                    273: 
                    274:     # remove the configlet from the portal control panel
                    275:     configTool = getToolByName(self, 'portal_controlpanel', None)
                    276:     if configTool:
                    277:         configTool.unregisterConfiglet('kupu')
                    278:         out.write('Removed kupu configlet\n')
                    279: 
                    280:     uninstall_transform(self, out)
                    281:     uninstall_tool(self, out)
                    282:     uninstall_resources(self, out)
                    283:     
                    284:     print >> out, "Successfully uninstalled %s." % PROJECTNAME
                    285:     return out.getvalue()

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>