X-Git-Url: https://scm.cri.ensmp.fr/git/GroupUserFolder.git/blobdiff_plain/e9d14b6b5cc9cd4775c60cb340b5c4c787536fc3..3e1ba4932c34812cf2f6f3569b0f0dbea97b7a0b:/Products/GroupUserFolder/Installation.py?ds=sidebyside diff --git a/Products/GroupUserFolder/Installation.py b/Products/GroupUserFolder/Installation.py new file mode 100644 index 0000000..1be3578 --- /dev/null +++ b/Products/GroupUserFolder/Installation.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +## GroupUserFolder +## Copyright (C)2006 Ingeniweb + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; see the file COPYING. If not, write to the +## Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +""" + +""" +__version__ = "$Revision: $" +# $Source: $ +# $Id: Installation.py 30098 2006-09-08 12:35:01Z encolpe $ +__docformat__ = 'restructuredtext' + + +from cStringIO import StringIO +import string +from Products.CMFCore.utils import getToolByName +from Products.CMFCore.TypesTool import ContentFactoryMetadata +from Products.CMFCore.DirectoryView import addDirectoryViews +from Products.CMFPlone.migrations.migration_util import safeEditProperty + +class Installation: + def __init__(self, root): + self.root=root + self.out=StringIO() + self.typesTool = getToolByName(self.root, 'portal_types') + self.skinsTool = getToolByName(self.root, 'portal_skins') + self.portal_properties = getToolByName(self.root, 'portal_properties') + self.navigation_properties = self.portal_properties.navigation_properties + self.form_properties = self.portal_properties.form_properties + + def report(self): + self.out.write('Installation completed.\n') + return self.out.getvalue() + + def setupTools(self, product_name, tools): + addTool = self.root.manage_addProduct[product_name].manage_addTool + for tool, title in tools: + found = 0 + for obj in self.root.objectValues(): + if obj.meta_type == tool: + found = 1 + if not found: + addTool(tool, None) + + found = 0 + root=self.root + for obj in root.objectValues(): + if obj.meta_type == tool: + obj.title=title + self.out.write("Added '%s' tool.\n" % (tool,)) + found = 1 + if not found: + self.out.write("Couldn't add '%s' tool.\n" % (tool,)) + + def installSubSkin(self, skinFolder): + """ Install a subskin, i.e. a folder/directoryview. + """ + for skin in self.skinsTool.getSkinSelections(): + path = self.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, ', ' ) + self.skinsTool.addSkinSelection( skin, path ) + self.out.write('Subskin successfully installed into %s.\n' % skin) + else: + self.out.write('*** Subskin was already installed into %s.\n' % skin) + + def setupCustomModelsSkin(self, skin_name): + """ Install custom skin folder + """ + try: + self.skinsTool.manage_addProduct['OFSP'].manage_addFolder(skin_name + 'CustomModels') + except: + self.out.write('*** Skin %sCustomModels already existed in portal_skins.\n' % skin_name) + self.installSubSkin('%sCustomModels' % skin_name) + + def setupTypesandSkins(self, fti_list, skin_name, install_globals): + """ + setup of types and skins + """ + + # Former types deletion (added by PJG) + for f in fti_list: + if f['id'] in self.typesTool.objectIds(): + self.out.write('*** Object "%s" already existed in the types tool => deleting\n' % (f['id'])) + self.typesTool._delObject(f['id']) + + # Type re-creation + for f in fti_list: + # Plone1 : if cmfformcontroller is not available and plone1_action key is defined, + # use this key instead of the regular 'action' key. + if (not self.hasFormController()) and f.has_key('plone1_action'): + f['action'] = f['plone1_action'] + + # Regular FTI processing + cfm = apply(ContentFactoryMetadata, (), f) + self.typesTool._setObject(f['id'], cfm) + self.out.write('Type "%s" registered with the types tool\n' % (f['id'])) + + # Install de chaque nouvelle subskin/layer + try: + addDirectoryViews(self.skinsTool, 'skins', install_globals) + self.out.write( "Added directory views to portal_skins.\n" ) + except: + self.out.write( '*** Unable to add directory views to portal_skins.\n') + + # Param de chaque nouvelle subskin/layer + self.installSubSkin(skin_name) + + def isPlone2(self,): + """ + isPlone2(self,) => return true if we're using Plone2 ! :-) + """ + return self.hasFormController() + + def hasFormController(self,): + """ + hasFormController(self,) => Return 1 if CMFFC is available + """ + if 'portal_form_controller' in self.root.objectIds(): + return 1 + else: + return None + + def addFormValidators(self, mapping): + """ + Adds the form validators. + DON'T ADD ANYTHING IF CMFFORMCONTROLLER IS INSTALLED + """ + # Plone2 management + if self.hasFormController(): + return + for (key, value) in mapping: + safeEditProperty(self.form_properties, key, value) + + def addNavigationTransitions(self, transitions): + """ + Adds Navigation Transitions in portal properties + """ + # Plone2 management + if self.hasFormController(): + return + for (key, value) in transitions: + safeEditProperty(self.navigation_properties, key, value) + + def setPermissions(self, perms_list): + """ + setPermissions(self) => Set standard permissions / roles + """ + # As a default behavior, newly-created permissions are granted to owner and manager. + # To change this, just comment this code and grab back the code commented below to + # make it suit your needs. + for perm in perms_list: + self.root.manage_permission( + perm, + ('Manager', 'Owner'), + acquire = 1 + ) + self.out.write("Reseted default permissions\n") + + def installMessageCatalog(self, plone, prodglobals, domain, poPrefix): + """Sets up the a message catalog for this product + according to the available languages in both: + - .pot files in the "i18n" folder of this product + - MessageCatalog available for this domain + Typical use, create below this function: + def installCatalog(self): + installMessageCatalog(self, Products.MyProduct, 'mydomain', 'potfile_') + return + This assumes that you set the domain 'mydomain' in 'translation_service' + and the .../Products/YourProduct/i18n/potfile_en.po (...) contain your messages. + + @param plone: the plone site + @type plone: a 'Plone site' object + @param prodglobals: see PloneSkinRegistrar.__init__ + @param domain: the domain nick in Plone 'translation_service' + @type domain: string or None for the default domain + (you shouldn't use the default domain) + @param poPrefix: .po files to use start with that prefix. + i.e. use 'foo_' to install words from 'foo_fr.po', 'foo_en.po' (...) + @type poPrefix: string + """ + + installInfo = ( + "!! I18N INSTALLATION CANCELED !!\n" + "It seems that your Plone instance does not have the i18n features installed correctly.\n" + "You should have a 'translation_service' object in your Plone root.\n" + "This object should have the '%(domain)s' domain registered and associated\n" + "with an **existing** MessageCatalog object.\n" + "Fix all this first and come back here." % locals()) + # + # Find Plone i18n resources + # + try: + ts = getattr(plone, 'translation_service') + except AttributeError, e: + return installInfo + found = 0 + for nick, path in ts.getDomainInfo(): + if nick == domain: + found = 1 + break + if not found: + return installInfo + try: + mc = ts.restrictedTraverse(path) + except (AttributeError, KeyError), e: + return installInfo + self.out.write("Installing I18N messages into '%s'\n" % '/'.join(mc.getPhysicalPath())) + enabledLangs = [nick for nick, lang in mc.get_languages_tuple()] + self.out.write("This MessageCatalog has %s languages enabled.\n" % ", ".join(enabledLangs)) + # + # Find .po files + # + i18nPath = os.path.join(prodglobals['__path__'][0], 'i18n') + poPtn = os.path.join(i18nPath, poPrefix + '*.po') + poFiles = glob.glob(poPtn) + rxFindLanguage = re.compile(poPrefix +r'(.*)\.po') + poRsrc = {} + for file in poFiles: + k = rxFindLanguage.findall(file)[0] + poRsrc[k] = file + self.out.write("This Product provides messages for %s languages.\n" % ", ".join(poRsrc.keys())) + for lang in enabledLangs: + if poRsrc.has_key(lang): + self.out.write("Adding support for language %s.\n" % lang) + fh = open(poRsrc[lang]) + mc.manage_import(lang, fh.read()) + fh.close() + self.out.write("Done !")