Esempio n. 1
0
File: util.py Progetto: dtgit/dtedu
def register_layer(self, relpath, name, out, add=True):
    """Register a file system directory as skin layer
    """
    print >>out, "register skin layers"
    skinstool = getToolByName(self, 'portal_skins')
    if name not in skinstool.objectIds():
        kupu_plone_skin_dir = minimalpath(os.path.join(kupu_package_dir, relpath))
        createDirectoryView(skinstool, kupu_plone_skin_dir, name)
        print >>out, "The layer '%s' was added to the skins tool" % name

    if not add:
        return

    # put this layer into all known skins
    for skinName in skinstool.getSkinSelections():
        path = skinstool.getSkinPath(skinName) 
        path = [i.strip() for i in path.split(',')]
        try:
            if name not in path:
                path.insert(path.index('custom')+1, name)
        except ValueError:
            if name not in path:
                path.append(name)

        path = ','.join(path)
        skinstool.addSkinSelection(skinName, path)
Esempio n. 2
0
def install(self):
    """ Install this product """
    out = []
    typesTool = getToolByName(self, 'portal_types')
    skinsTool = getToolByName(self, 'portal_skins')
        
    # add in the directory view pointing to our skin
    if layer_name not in skinsTool.objectIds():
        createDirectoryView(skinsTool, layer_location, layer_name)
        out.append('Added "%s" directory view to portal_skins' % layer_name)

    # add in the layer to all our skins    
    skins = skinsTool.getSkinSelections()
    for skin in skins:
        path = skinsTool.getSkinPath(skin)
        path = [ p.strip() for p in path.split(',') ]
        if layer_name not in path:
            path.insert(path.index('custom')+1, layer_name)

            path = ", ".join(path)
            skinsTool.addSkinSelection(skin, path)
            out.append('Added "%s" to "%s" skins' % (layer_name, skin))
        else:
            out.append('Skipping "%s" skin' % skin)

    return "\n".join(out)
Esempio n. 3
0
def register_layer(self, relpath, name, out, add=True):
    """Register a file system directory as skin layer
    """
    print >> out, "register skin layers"
    skinstool = getToolByName(self, 'portal_skins')
    if name not in skinstool.objectIds():
        kupu_plone_skin_dir = minimalpath(
            os.path.join(kupu_package_dir, relpath))
        createDirectoryView(skinstool, kupu_plone_skin_dir, name)
        print >> out, "The layer '%s' was added to the skins tool" % name

    if not add:
        return

    # put this layer into all known skins
    for skinName in skinstool.getSkinSelections():
        path = skinstool.getSkinPath(skinName)
        path = [i.strip() for i in path.split(',')]
        try:
            if name not in path:
                path.insert(path.index('custom') + 1, name)
        except ValueError:
            if name not in path:
                path.append(name)

        path = ','.join(path)
        skinstool.addSkinSelection(skinName, path)
Esempio n. 4
0
    def _initBBBObjects(self, node):
        for child in node.childNodes:
            if child.nodeName != 'skin-directory':
                continue
            parent = self.context

            obj_id = str(child.getAttribute('id'))
            obj_dir = str(child.getAttribute('directory'))
            if obj_id not in parent.objectIds():
                createDirectoryView(self.context, obj_dir, obj_id)
Esempio n. 5
0
    def _initBBBObjects(self, node):
        for child in node.childNodes:
            if child.nodeName != 'skin-directory':
                continue
            parent = self.context

            obj_id = str(child.getAttribute('id'))
            obj_dir = str(child.getAttribute('directory'))
            if obj_id not in parent.objectIds():
                createDirectoryView(self.context, obj_dir, obj_id)
Esempio n. 6
0
 def add(portal, name, location):
     portal_skins = getToolByName(portal, "portal_skins")
     if name not in portal_skins.objectIds():
         createDirectoryView(portal_skins, location, name)
 
     skins = portal_skins.getSkinSelections()
     for skin in skins:
         path = portal_skins.getSkinPath(skin)
         path = [ p.strip() for p in path.split(',') ]
         if name not in path:
             if 'custom' in path:
                 pos = path.index('custom') + 1
             else:
                 pos = 0
             path.insert(pos, name)
             path = ", ".join(path)
             portal_skins.addSkinSelection(skin, path)
Esempio n. 7
0
    def add(portal, name, location):
        portal_skins = getToolByName(portal, "portal_skins")
        if name not in portal_skins.objectIds():
            createDirectoryView(portal_skins, location, name)

        skins = portal_skins.getSkinSelections()
        for skin in skins:
            path = portal_skins.getSkinPath(skin)
            path = [p.strip() for p in path.split(',')]
            if name not in path:
                if 'custom' in path:
                    pos = path.index('custom') + 1
                else:
                    pos = 0
                path.insert(pos, name)
                path = ", ".join(path)
                portal_skins.addSkinSelection(skin, path)
Esempio n. 8
0
 def _registerDirectory(self, obj=None, ignore=None):
     from Products.CMFCore.DirectoryView import _dirreg
     from Products.CMFCore.DirectoryView import createDirectoryView
     if ignore is None:
         from Products.CMFCore.DirectoryView import ignore
     filepath = join(self.tempname, self._skinname)
     subpath = basename(self.tempname)
     if subpath != 'tests':
         # we have a temp dir in tests
         subpath = 'tests/%s' % subpath
     reg_key = 'Products.CMFCore:%s/%s' % (subpath, self._skinname)
     _dirreg.registerDirectoryByKey(filepath, reg_key, ignore=ignore)
     if obj is not None:
         ob = obj.ob = DummyFolder()
         info = _dirreg.getDirectoryInfo(reg_key)
         for entry in info.getSubdirs():
             entry_reg_key = '/'.join((reg_key, entry))
             createDirectoryView(ob, entry_reg_key, entry)
Esempio n. 9
0
 def _registerDirectory(self, obj=None, ignore=None):
     from Products.CMFCore.DirectoryView import _dirreg
     from Products.CMFCore.DirectoryView import createDirectoryView
     if ignore is None:
         from Products.CMFCore.DirectoryView import ignore
     filepath = join(self.tempname, self._skinname)
     subpath = basename(self.tempname)
     if subpath != 'tests':
         # we have a temp dir in tests
         subpath = 'tests/%s' % subpath
     reg_key = 'Products.CMFCore:%s/%s' % (subpath, self._skinname)
     _dirreg.registerDirectoryByKey(filepath, reg_key, ignore=ignore)
     if obj is not None:
         ob = obj.ob = DummyFolder()
         info = _dirreg.getDirectoryInfo(reg_key)
         for entry in info.getSubdirs():
             entry_reg_key = '/'.join((reg_key, entry))
             createDirectoryView(ob, entry_reg_key, entry)
Esempio n. 10
0
def install(self):
    """ Install this product """
    out = []

    installTypes(self, out,
                 listTypes(PROJECTNAME),
                 PROJECTNAME)

    out.append("Successfully installed types for %s." % PROJECTNAME)

    skinsTool = getToolByName(self, 'portal_skins')

    out = []
    SKIN_ROOT = 'Products/CcOrg/skins'
    SKINS = [os.path.join(SKIN_ROOT, n) for n in os.listdir(SKIN_ROOT) if 
             os.path.isdir(os.path.join(SKIN_ROOT, n))]
    portal_skins = skinsTool.getSkinSelections()

    for skinlocation in SKINS:
        skinname = skinlocation.split('/')[-1]

        # make sure we're not traversing into version control
        if skinname.lower() in ('cvs', '.svn'):
            continue

        if skinname not in skinsTool.objectIds():
            createDirectoryView(skinsTool, skinlocation, skinname)
            out.append('Added "%s" directory view to portal_skins' % skinname)

        for skin in portal_skins:
            path = skinsTool.getSkinPath(skin)
            path = [ p.strip() for p in path.split(',') ]
            if skinname not in path:
                path.insert(path.index('custom')+1, skinname)

                path = ", ".join(path)
                skinsTool.addSkinSelection(skin, path)
                out.append('Added "%s" to "%s" skins' % (skinname, skin))
            else:
                out.append('Skipping "%s" skin' % skin)

    return "\n".join(out)
Esempio n. 11
0
 def install_skins(self):
     st = getToolByName(self.context, 'portal_skins')
     skins = ['Plone Default', 'Plone Tableless']
     if not hasattr(aq_base(st), 'plone_kss'):
         createDirectoryView(st, 'Products.CMFPlone:skins/plone_kss')
     if not hasattr(aq_base(st), 'archetypes_kss'):
         createDirectoryView(st, 'Products.Archetypes:skins/archetypes_kss')
     selections = st._getSelections()
     for s in skins:
         if not selections.has_key(s):
            continue
         path = st.getSkinPath(s)
         path = [p.strip() for p in  path.split(',')]
         path_changed = False
         if not 'plone_kss' in path:
             path.append('plone_kss')
             path_changed = True
         if not 'archetypes_kss' in path:
             path.append('archetypes_kss')
             path_changed = True
         if path_changed:
             st.addSkinSelection(s, ','.join(path))
             logger.info('Added missing skins to %s' % s)
Esempio n. 12
0
def installDeprecated(portal, out):
    # register login skin
    st = getToolByName(portal, 'portal_skins', None)
    if st is None:
        return
    if not hasattr(aq_base(st), 'plone_deprecated'):
        createDirectoryView(st, 'Products.CMFPlone:skins/plone_deprecated')
        out.append('Added directory view for plone_deprecated')

    # add deprecated skin to default skins
    skins = ['Plone Default', 'Plone Tableless']
    selections = st._getSelections()
    for s in skins:
        if not selections.has_key(s):
           continue
        path = st.getSkinPath(s)
        path = [p.strip() for p in  path.split(',')]
        if not 'plone_deprecated' in path:
            if 'plone_3rdParty' in path:
                path.insert(path.index('plone_3rdParty'), 'plone_deprecated')
            else:
                path.append('plone_deprecated')
            st.addSkinSelection(s, ','.join(path))
            out.append('Added plone_deprecated to %s' % s)
Esempio n. 13
0
def install(self):
    """ Install this product """
    out = []
    typesTool = getToolByName(self, 'portal_types')
    skinsTool = getToolByName(self, 'portal_skins')
        
    if id not in typesTool.objectIds():
       typesTool.manage_addTypeInformation(
           fti_klass.meta_type,
           id = plone_product_name,
           typeinfo_name = "%s: %s" % (product_name, product_name)
           )
       out.append('Registered with the types tool')
    else:
       out.append('Object "%s" already existed in the types tool' % (id))

    # add in the directory view pointing to our skin
    if layer_name not in skinsTool.objectIds():
        createDirectoryView(skinsTool, layer_location, layer_name)
        out.append('Added "%s" directory view to portal_skins' % layer_name)

    # add in the layer to all our skins    
    skins = skinsTool.getSkinSelections()
    for skin in skins:
        path = skinsTool.getSkinPath(skin)
        path = [ p.strip() for p in path.split(',') ]
        if layer_name not in path:
            path.insert(path.index('custom')+1, layer_name)

            path = ", ".join(path)
            skinsTool.addSkinSelection(skin, path)
            out.append('Added "%s" to "%s" skins' % (layer_name, skin))
        else:
            out.append('Skipping "%s" skin' % skin)

    return "\n".join(out)
Esempio n. 14
0
def importSkinsTool( context ):

    """ Import skins tool FSDirViews and skin paths from an XML file

    o 'context' must implement IImportContext.

    o Register via Python:

      registry = site.portal_setup.getImportStepRegistry()
      registry.registerStep( 'importSkinsTool'
                           , '20040518-01'
                           , Products.CMFSetup.skins.importSkinsTool
                           , ()
                           , 'Skins Tool import'
                           , 'Import skins tool FSDVs and skin paths.'
                           )

    o Register via XML:

      <setup-step id="importSkinsTool"
                  version="20040524-01"
                  handler="Products.CMFSetup.skins.importSkinsTool"
                  title="Skins Tool import"
      >Import skins tool FSDVs and skin paths.</setup-step>

    """
    site = context.getSite()
    encoding = context.getEncoding()

    skins_tool = getToolByName( site, 'portal_skins' )

    if context.shouldPurge():

        skins_tool._getSelections().clear()

        for id in skins_tool.objectIds( DirectoryView.meta_type ):
            skins_tool._delObject(id)

    text = context.readDataFile( _FILENAME )

    if text is not None:

        stc = SkinsToolConfigurator( site ).__of__( site )

        ( default_skin
        , request_var
        , allow_arbitrary
        , persist_cookie
        , skin_dirs
        , skin_paths
        ) = stc.parseXML( text, encoding )

        tool = getToolByName( site, 'portal_skins' )

        tool.default_skin = str( default_skin )
        tool.request_varname = str( request_var )
        tool.allow_any =  allow_arbitrary and 1 or 0
        tool.cookie_persistence =  persist_cookie and 1 or 0

        for id, directory in skin_dirs:

            createDirectoryView( tool, directory, id )

        for path_name, layers in skin_paths:
            tool.addSkinSelection( path_name, ', '.join( layers ) )

    #
    #   Purge and rebuild the skin path, now that we have added our stuff.
    #
    site._v_skindata = None
    skins_tool.setupCurrentSkin( site.REQUEST )

    return 'Skins tool imported'
Esempio n. 15
0
def importSkinsTool( context ):

    """ Import skins tool FSDirViews and skin paths from an XML file

    o 'context' must implement IImportContext.

    o Register via Python:

      registry = site.portal_setup.getImportStepRegistry()
      registry.registerStep( 'importSkinsTool'
                           , '20040518-01'
                           , Products.CMFSetup.skins.importSkinsTool
                           , ()
                           , 'Skins Tool import'
                           , 'Import skins tool FSDVs and skin paths.'
                           )

    o Register via XML:

      <setup-step id="importSkinsTool"
                  version="20040524-01"
                  handler="Products.CMFSetup.skins.importSkinsTool"
                  title="Skins Tool import"
      >Import skins tool FSDVs and skin paths.</setup-step>

    """
    site = context.getSite()
    encoding = context.getEncoding()

    stool = getToolByName(site, 'portal_skins')

    if context.shouldPurge():

        stool.request_varname = 'portal_skin'
        stool.allow_any = 0
        stool.cookie_persistence = 0

        stool._getSelections().clear()

        for id in stool.objectIds(DirectoryView.meta_type):
            stool._delObject(id)

    text = context.readDataFile( _FILENAME )

    if text is not None:

        stc = SkinsToolConfigurator( site, encoding )
        tool_info = stc.parseXML( text )

        if 'default_skin' in tool_info:
            stool.default_skin = str(tool_info['default_skin'])
        if 'request_varname' in tool_info:
            stool.request_varname = str(tool_info['request_varname'])
        if 'allow_any' in tool_info:
            stool.allow_any = tool_info['allow_any'] and 1 or 0
        if 'cookie_persistence' in tool_info:
            stool.cookie_persistence = \
                                    tool_info['cookie_persistence'] and 1 or 0

        for dir_info in tool_info['skin_dirs']:
            dir_id = dir_info['id']
            if dir_id in stool.objectIds(DirectoryView.meta_type):
                stool._delObject(dir_id)
            createDirectoryView(stool, dir_info['directory'], dir_id)

        for path_info in tool_info['skin_paths']:
            path_id = path_info['id']
            if path_id == '*':
                for path_id, path in stool._getSelections().items():
                    path = _updatePath(path, path_info['layers'])
                    stool.addSkinSelection(path_id, path)
            else:
                if stool._getSelections().has_key(path_id):
                    path = stool._getSelections()[path_id]
                else:
                    path = ''
                path = _updatePath(path, path_info['layers'])
                stool.addSkinSelection(path_id, path)

    #
    #   Purge and rebuild the skin path, now that we have added our stuff.
    #   Don't bother if no REQUEST is present, e.g. when running unit tests
    #
    request = getattr(site, 'REQUEST', None)
    if request is not None:
        site._v_skindata = None
        stool.setupCurrentSkin(request)

    return 'Skins tool imported'
Esempio n. 16
0
def importSkinsTool(context):
    """ Import skins tool FSDirViews and skin paths from an XML file

    o 'context' must implement IImportContext.

    o Register via Python:

      registry = site.portal_setup.getImportStepRegistry()
      registry.registerStep( 'importSkinsTool'
                           , '20040518-01'
                           , Products.CMFSetup.skins.importSkinsTool
                           , ()
                           , 'Skins Tool import'
                           , 'Import skins tool FSDVs and skin paths.'
                           )

    o Register via XML:

      <setup-step id="importSkinsTool"
                  version="20040524-01"
                  handler="Products.CMFSetup.skins.importSkinsTool"
                  title="Skins Tool import"
      >Import skins tool FSDVs and skin paths.</setup-step>

    """
    site = context.getSite()
    encoding = context.getEncoding()

    stool = getToolByName(site, 'portal_skins')

    if context.shouldPurge():

        stool.request_varname = 'portal_skin'
        stool.allow_any = 0
        stool.cookie_persistence = 0

        stool._getSelections().clear()

        for id in stool.objectIds(DirectoryView.meta_type):
            stool._delObject(id)

    text = context.readDataFile(_FILENAME)

    if text is not None:

        stc = SkinsToolConfigurator(site, encoding)
        tool_info = stc.parseXML(text)

        if 'default_skin' in tool_info:
            stool.default_skin = str(tool_info['default_skin'])
        if 'request_varname' in tool_info:
            stool.request_varname = str(tool_info['request_varname'])
        if 'allow_any' in tool_info:
            stool.allow_any = tool_info['allow_any'] and 1 or 0
        if 'cookie_persistence' in tool_info:
            stool.cookie_persistence = \
                                    tool_info['cookie_persistence'] and 1 or 0

        for dir_info in tool_info['skin_dirs']:
            dir_id = dir_info['id']
            if dir_id in stool.objectIds(DirectoryView.meta_type):
                stool._delObject(dir_id)
            createDirectoryView(stool, dir_info['directory'], dir_id)

        for path_info in tool_info['skin_paths']:
            path_id = path_info['id']
            if path_id == '*':
                for path_id, path in stool._getSelections().items():
                    path = _updatePath(path, path_info['layers'])
                    stool.addSkinSelection(path_id, path)
            else:
                if stool._getSelections().has_key(path_id):
                    path = stool._getSelections()[path_id]
                else:
                    path = ''
                path = _updatePath(path, path_info['layers'])
                stool.addSkinSelection(path_id, path)

    #
    #   Purge and rebuild the skin path, now that we have added our stuff.
    #   Don't bother if no REQUEST is present, e.g. when running unit tests
    #
    request = getattr(site, 'REQUEST', None)
    if request is not None:
        site._v_skindata = None
        stool.setupCurrentSkin(request)

    return 'Skins tool imported'
Esempio n. 17
0
def install(self):
    """
    install the IMU Product
    """    
    out = StringIO()
    portal = self.portal_url.getPortalObject()
    
    out.write('Install IMU portal types to portal_types tool\n')
    
    # setup the new types
    typestool = portal.portal_types
    newTypes = [ IMUResearch
               , IMUSeminar
               , IMUPublication
               , IMUConsulting
               ]
    for i in newTypes:
        t = i.factory_type_information
        if t['id'] in typestool.objectIds():
            typestool._delObject(t['id'])
        cfm = apply(ContentFactoryMetadata, (), t)
        typestool._setObject(t['id'], cfm)
    
    skinFolder = 'imu'

    skinstool = portal.portal_skins
    if skinFolder in skinstool.objectIds():
        skinstool.manage_delObjects([skinFolder,])
    sp = os.path.join( Globals.package_home( module_globals ), 'skins', skinFolder )
    createDirectoryView(skinstool, sp, skinFolder)
    out.write('Skinfolder '+skinFolder+' added to portal_skins\n')
    
    # setup imu skin path
    skinname = 'imu'
    path=[elem.strip() for elem in skinstool.getSkinPath('elevateIT Default').split(',')]
    path.insert(path.index('custom')+1, skinname)
    skinstool.addSkinSelection(skinname, ','.join(path))
    
    out.write("skin imu created\n")
    
    skinstool.default_skin=skinname
        
    
#     left_slots = ( 'here/portlet_nav_imu/macros/portlet', 
#                    'here/portlet_nav_standorte/macros/portlet' )
#                  
#     right_slots = ( 'here/portlet_calendar/macros/portlet' 
#                  , 'here/portlet_news/macros/portlet' )
#                  
#     portal._updateProperty('left_slots', left_slots )
#     portal._updateProperty('right_slots', right_slots )
#     out.write('Portlet slots changed. We only need menu portlet in left slot.\n')
    
    # update portal properties
    sp = portal.portal_properties.site_properties
        
    sp._updateProperty('localTimeFormat', '%d.%m.%Y')
    sp._updateProperty('localLongTimeFormat', '%d.%m.%Y %H:%M')
    
    if sp.hasProperty('listMandants'):
        sp._delProperty('listMandants')
            
    if not sp.hasProperty('listProjecttypes'):
        sp._setProperty('listProjecttypes', ('Auftragsforschung', 'Sachverstand', 'Seminare', 'Grundlagenforschung', 'zweckbetr. Forschung'), 'lines')
            
    out.write("site properties updated\n")
    
    cityfolders = ['muenchen', 'berlin_dresden', 'karlsruhe', 'nuernberg', 'stuttgart']
    if not portal.hasProperty('cityfolders'):
        portal._setProperty('cityfolders', cityfolders, 'lines')
        out.write("properties cityfolders added\n")
    
    # set seminar as calendar type
    ct = portal.portal_calendar.calendar_types
    ct.append('Seminar')    
    portal.portal_calendar.calendar_types = ct 
    out.write("Seminar added to portal calendars calendar types\n")
    
    # setup default language
    languageTool = portal.portal_languages.setDefaultLanguage('de')
    
    memberdata = portal.portal_memberdata
    if memberdata.hasProperty('language'):
        memberdata._updateProperty('language', 'de')
    else:
        memberdata._setProperty('language', 'de', 'string')
    out.write("default language set to de\n")
    
    # add second navigation
    portlettool = portal.portal_utilities
    to_utf8 = portlettool.to_utf8
    ll=['de',]
    if not hasattr(portal, 'navigation'):
        portal.manage_addProduct['elevateIT'].addNavigation(id='navigation', 
                                                           localizer_languages=ll)
        n = portal.navigation
        n._setPortalTypeName( 'Navigation' )
        n.setTitle(to_utf8('Navigation'))
        portal.portal_workflow.doActionFor(n, 'publish', comment='navigation object should be public now.')
        out.write("add navigation\n")
        
    if not hasattr(portal, 'navigation_standorte'):
        portal.manage_addProduct['elevateIT'].addNavigation(id='navigation_standorte', 
                                                           localizer_languages=ll)
        n = portal.navigation_standorte
        n._setPortalTypeName( 'Navigation' )
        n.setTitle(to_utf8('Navigation'))
        out.write("add navigation_standorte\n")
        
    # add action upload projects
         
    at = portal.portal_actions   
    na = {"id":"upload_research", "name":"Upload research", "action":"string:${folder_url}/upload_research_form", "condition":"python:'research' in folder.absolute_url(1).split('/')", "permission":"Modify portal content", "category":"objectAdmin", "visible":1}
    
    if not na['id'] in [x.id for x in at.listActions()]:
        at.addAction(na['id'], na['name'], na['action'], na['condition'], na['permission'], na['category'], na['visible'])
        out.write("Action upload projects added\n")
    else:
        out.write("Action upload projects already exists\n")
        
    # add catalog indexes 
    ind = ['mandant']
    ctool = portal.portal_catalog
    for i in ind:
        if i not in ctool.indexes():
            ctool.manage_addIndex(i, 'FieldIndex')
            out.write("Index %s added\n" % i)
            
    class Extra:
        """ Just a dummy to build records for the Lexicon.
        """
        pass
        
    zcind = ['projectnumber']
    extra = Extra()
    extra.index_type = 'Okapi BM25 Rank'
    extra.lexicon_id = 'plone_lexicon'
        
    for i in zcind:
        if i not in ctool.indexes():
            extra.doc_attr = ''
            ctool.addIndex(i, 'ZCTextIndex', extra)
   
    
    return out.getvalue()
Esempio n. 18
0
def install(self):
    """ Install this product """
    out = []
    skinsTool = getToolByName(self, 'portal_skins')

    # add in the directory view pointing to our skin
    if layer_name not in skinsTool.objectIds():
        createDirectoryView(skinsTool, layer_location, layer_name)
        out.append('Added "%s" directory view to portal_skins' % layer_name)

    # add in the layer to all our skins    
    skins = skinsTool.getSkinSelections()
    for skin in skins:
        path = skinsTool.getSkinPath(skin)
        path = [ p.strip() for p in path.split(',') ]
        if layer_name not in path:
            if 'custom' in path:
                pos = path.index('custom') + 1
            else:
                pos = 0
            path.insert(pos, layer_name)
            path = ", ".join(path)
            skinsTool.addSkinSelection(skin, path)
            out.append('Added "%s" to "%s" skins' % (layer_name, skin))
        else:
            out.append('Skipping "%s" skin' % skin)

        try:
                ctool = getToolByName(self, unique_id)
        except AttributeError:
                self.manage_addProduct['Clouseau'].manage_addTool('Clouseau', None)
    cp = getToolByName(self, "portal_controlpanel")

    if "Clouseau" not in [ c.id for c in cp._actions ]:
        cp.registerConfiglet(
                "Clouseau",
            "Clouseau",
            "string:${portal_url}/clouseau_list",
            category="Products",
            permission="Manage portal",
            appId="Clouseau",
            imageUrl="clouseau.png",)

    cssreg = getToolByName(self, 'portal_css', None)
    skins = ["SyntaxHighlighter.css", "clouseau.css"]
    if cssreg is not None:
        for skin in skins:
            stylesheet_ids = cssreg.getResourceIds()
            if skin not in stylesheet_ids:
                cssreg.registerStylesheet(skin)
                out.append("Registered %s" % skin)
    
    # add in the clearspell js
    jsreg = getToolByName(self, 'portal_javascripts', None)
    scripts = ["clouseau_trigger.js",]
    if jsreg is not None:
        for script in scripts:
            if script not in jsreg.getResourceIds():
                jsreg.registerScript(script)
                out.append('Registered %s' % script)
                            
    actionsTool = getToolByName(self, 'portal_actions', None)
    if actionsTool is not None:
        for action in actionsTool.listActions():
            if action.getId() == 'clouseau_view':
                break # We already have the action
        else:
            actionsTool.addAction('clouseau_view',
                name='Python prompt',
                action='''python:"javascript:showClouseau('%s');" % '/'.join(object.getPhysicalPath())''',
                condition='python:portal.clouseau_tool.enabled',
                permission=ManagePortal,
                category='document_actions',
                visible=1,
                )
        out.append("Added 'clouseau_view' action to actions tool.")

    iconsTool = getToolByName(self, 'portal_actionicons', None)
    if iconsTool is not None:
        for icon in iconsTool.listActionIcons():
            if icon.getActionId() == 'clouseau_view':
                break # We already have the icon
        else:
            iconsTool.addActionIcon(
                category='plone',
                action_id='clouseau_view',
                icon_expr='clouseau.png',
                title='Python prompt',
                )
        out.append("Added 'clouseau_view' icon to actionicons tool.")
    
    return "\n".join(out)