import string
from cStringIO import StringIO
from Products.CMFCore.utils import getToolByName
from Products.CMFCore.DirectoryView import addDirectoryViews
from Products.CMFPlone.migrations.migration_util import safeEditProperty
from Products.CMFCore.Expression import Expression, createExprContext
from Products.qPloneDropDownMenu.config import *
configlets = ({'id':PROJECT_NAME,
'name':'Drop Down Menu',
'action':'string:${portal_url}/prefs_dropdownmenu_edit_form',
'condition':'',
'category':'Products',
'visible':1,
'appId':PROJECT_NAME,
'permission':VIEW_PERMISSION,
'imageUrl':'qplonedropdownmenu.gif' },)
def registerCSS(self, out):
qi = getToolByName(self, 'portal_quickinstaller', None)
if qi is not None:
try:
if not qi.isProductInstalled('ResourceRegistries'):
qi.installProduct('ResourceRegistries', locked=0)
cssreg = getToolByName(self, 'portal_css', None)
if cssreg is not None:
stylesheet_ids = cssreg.getResourceIds()
if 'drop_down.css' not in stylesheet_ids:
cssreg.registerStylesheet('drop_down.css',
expression="python:portal.portal_dropdownmenu")
out.write('Register drop_down.css... \n')
else:
out.write('drop_down.css already exists... \n')
except:
pass
def unregisterCSS(self, out):
qi = getToolByName(self, 'portal_quickinstaller', None)
if qi is not None:
try:
if not qi.isProductInstalled('ResourceRegistries'):
qi.installProduct('ResourceRegistries', locked=0)
cssreg = getToolByName(self, 'portal_css', None)
if cssreg is not None:
stylesheet_ids = cssreg.getResourceIds()
if 'drop_down.css' in stylesheet_ids:
cssreg.unregisterResource('drop_down.css')
out.write('Unregister drop_down.css... \n')
except:
pass
def updateMenu(self):
out = ''
pu = getToolByName(self, 'plone_utils')
if hasattr(pu, 'createTopLevelTabs'):
pactions = getToolByName(self, 'portal_actions').listFilteredActionsFor(self)
tl_tabs = pu.createTopLevelTabs(pactions)
for act in tl_tabs:
out += '
' % \
(act['id'], act['url']) + act['name'] + '\n'
else:
portal = getToolByName(self, 'portal_url').getPortalObject()
portal_act = getToolByName(self, 'portal_actions')
actions=portal_act._cloneActions()
for act in actions:
if act.category == 'portal_tabs':
out += '%s\n' % \
(act.id, \
Expression(act.getActionExpression())(createExprContext(portal, portal, portal)), \
act.title)
portal_props = getToolByName(self, 'portal_properties')
if not hasattr(portal_props, PROPERTY_SHEET):
portal_props.addPropertySheet(PROPERTY_SHEET, 'DropDown Menu Properties')
ap = getattr(portal_props, PROPERTY_SHEET)
safeEditProperty(ap, 'menu', out, 'text')
def setupSkin(self, out, skinFolder):
skinstool=getToolByName(self, 'portal_skins')
addDirectoryViews(skinstool, SKINS_DIR, GLOBALS)
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 )
out.write(' %s layer sucessfully installed into skin %s.\n' % (skinFolder, skin))
else:
out.write(' %s layer was already installed into skin %s.\n' % (skinFolder, skin))
def setupTool(self):
portal_url = getToolByName(self, 'portal_url')
p = portal_url.getPortalObject()
x = p.manage_addProduct[PROJECT_NAME].manage_addTool(type='DropDownMenu Tool')
def install(self):
out = StringIO()
registerCSS(self, out)
configTool = getToolByName(self, 'portal_controlpanel', None)
if configTool:
for conf in configlets:
configTool.registerConfiglet(**conf)
out.write('Added configlet %s\n' % conf['id'])
if hasattr(self, UNIQUE_ID):
self.manage_delObjects([UNIQUE_ID])
out.write('Deleting old %s\n' % (UNIQUE_ID))
setupTool(self)
out.write('Added %s to the portal root folder\n' % (UNIQUE_ID))
portal_props = getToolByName(self, 'portal_properties')
if not hasattr(portal_props, PROPERTY_SHEET):
out.write('updateMenu... \n')
updateMenu(self)
else:
out.write('skipping updateMenu... \n')
out.write('setupSkin... \n')
setupSkin(self, out, 'qPloneDropDownMenu')
return out.getvalue()
def uninstall(self):
out = StringIO()
unregisterCSS(self, out)
configTool = getToolByName(self, 'portal_controlpanel', None)
if configTool:
for conf in configlets:
configTool.unregisterConfiglet(conf['id'])
out.write('Removed configlet %s\n' % conf['id'])
return out.getvalue()