def installUi(self): '''Installs the user interface.''' # Some useful imports from OFS.Folder import manage_addFolder from OFS.Image import manage_addImage, manage_addFile from Products.PythonScripts.PythonScript import PythonScript from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate # Delete the existing folder if it existed. zopeContent = self.app.objectIds() if 'ui' in zopeContent: self.app.manage_delObjects(['ui']) manage_addFolder(self.app, 'ui') # Browse the physical ui folders (the Appy one and an app-specific, if # the app defines one) and create the corresponding objects in the Zope # folder. In the case of files having the same name in both folders, # the one from the app-specific folder is chosen. j = os.path.join uiFolders = [j(j(appy.getPath(), 'gen'), 'ui')] appUi = j(self.config.diskFolder, 'ui') if os.path.exists(appUi): uiFolders.insert(0, appUi) for ui in uiFolders: for root, dirs, files in os.walk(ui): folderName = root[len(ui):] # Get the Zope folder that corresponds to this name zopeFolder = self.app.ui if folderName: for name in folderName.strip(os.sep).split(os.sep): zopeFolder = zopeFolder._getOb(name) # Create sub-folders at this level for name in dirs: if not hasattr(zopeFolder.aq_base, name): manage_addFolder(zopeFolder, name) # Create files at this level for name in files: zopeName, ext = os.path.splitext(name) if ext not in ('.pt', '.py'): # In the ZODB, pages and scripts have their name without # their extension. zopeName = name if hasattr(zopeFolder.aq_base, zopeName): continue f = file(j(root, name)) if ext in gen.File.imageExts: manage_addImage(zopeFolder, zopeName, f) elif ext == '.pt': manage_addPageTemplate(zopeFolder,zopeName,'',f.read()) elif ext == '.py': obj = PythonScript(zopeName) zopeFolder._setObject(zopeName, obj) zopeFolder._getOb(zopeName).write(f.read()) else: manage_addFile(zopeFolder, zopeName, f) f.close() # Update the home page if 'index_html' in zopeContent: self.app.manage_delObjects(['index_html']) manage_addPageTemplate(self.app, 'index_html', '', homePage) # Update the error page if 'standard_error_message' in zopeContent: self.app.manage_delObjects(['standard_error_message']) manage_addPageTemplate(self.app, 'standard_error_message', '',errorPage)
def installUi(self): '''Installs the user interface''' # Some useful imports from OFS.Folder import manage_addFolder from OFS.Image import manage_addImage, manage_addFile # Delete the existing folder if it existed zopeContent = self.app.objectIds() for name in ('ui', self.favIcon): if name in zopeContent: self.app.manage_delObjects([name]) manage_addFolder(self.app, 'ui') # Browse the physical ui folders (the Appy one and an app-specific, if # the app defines one) and create the corresponding objects in the Zope # folder. In the case of files having the same name in both folders, # the one from the app-specific folder is chosen. j = os.path.join uiFolders = [j(j(appy.getPath(), 'gen'), 'ui')] for uiFolder in self.config.appConfig.uiFolders: if uiFolder.startswith('..'): folder = j(os.path.dirname(self.config.diskFolder),uiFolder[3:]) else: folder = j(self.config.diskFolder, uiFolder) if os.path.exists(folder): uiFolders.insert(0, folder) for ui in uiFolders: for root, dirs, files in os.walk(ui): folderName = root[len(ui):] # Get the Zope folder that corresponds to this name zopeFolder = self.app.ui if folderName: for name in folderName.strip(os.sep).split(os.sep): zopeFolder = zopeFolder._getOb(name) # Create sub-folders at this level for name in dirs: if not hasattr(zopeFolder.aq_base, name): manage_addFolder(zopeFolder, name) # Create files at this level for name in files: ext = os.path.splitext(name)[1] if hasattr(zopeFolder.aq_base, name): continue f = file(j(root, name)) if name == self.favIcon: if not hasattr(self.app, name): # Copy it at the root. Else, IE won't notice it. manage_addImage(self.app, name, f) elif ext in gen.File.imageExts: manage_addImage(zopeFolder, name, f) else: manage_addFile(zopeFolder, name, f) f.close() # Update home and error pages from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate if 'index_html' in zopeContent: self.app.manage_delObjects(['index_html']) manage_addPageTemplate(self.app, 'index_html', '', homePage) if 'standard_error_message' in zopeContent: self.app.manage_delObjects(['standard_error_message']) manage_addPageTemplate(self.app, 'standard_error_message', '', errorPage)
def installUi(self): '''Installs the user interface.''' # Some useful imports. from OFS.Folder import manage_addFolder from OFS.Image import manage_addImage, manage_addFile # Delete the existing folder if it existed. zopeContent = self.app.objectIds() if 'ui' in zopeContent: self.app.manage_delObjects(['ui']) manage_addFolder(self.app, 'ui') # Browse the physical ui folders (the Appy one and an app-specific, if # the app defines one) and create the corresponding objects in the Zope # folder. In the case of files having the same name in both folders, # the one from the app-specific folder is chosen. j = os.path.join uiFolders = [j(j(appy.getPath(), 'gen'), 'ui')] for uiFolder in self.config.appConfig.uiFolders: if uiFolder.startswith('..'): folder = j(os.path.dirname(self.config.diskFolder), uiFolder[3:]) else: folder = j(self.config.diskFolder, uiFolder) if os.path.exists(folder): uiFolders.insert(0, folder) for ui in uiFolders: for root, dirs, files in os.walk(ui): folderName = root[len(ui):] # Get the Zope folder that corresponds to this name zopeFolder = self.app.ui if folderName: for name in folderName.strip(os.sep).split(os.sep): zopeFolder = zopeFolder._getOb(name) # Create sub-folders at this level for name in dirs: if not hasattr(zopeFolder.aq_base, name): manage_addFolder(zopeFolder, name) # Create files at this level for name in files: ext = os.path.splitext(name)[1] if hasattr(zopeFolder.aq_base, name): continue f = file(j(root, name)) if name == 'favicon.ico': if not hasattr(self.app, name): # Copy it at the root. Else, IE won't notice it. manage_addImage(self.app, name, f) elif ext in gen.File.imageExts: manage_addImage(zopeFolder, name, f) else: manage_addFile(zopeFolder, name, f) f.close() # Update the home page if 'index_html' in zopeContent: self.app.manage_delObjects(['index_html']) from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate manage_addPageTemplate(self.app, 'index_html', '', homePage) # Remove the error page. if 'standard_error_message' in zopeContent: self.app.manage_delObjects(['standard_error_message'])
def installRootFolder(self): '''Creates and/or configures, at the root of the Plone site and if needed, the folder where the application will store instances of root classes. Creates also the 'appy' folder (more precisely, a Filesystem Directory View) at the root of the site, for storing appy-wide ZPTs an images.''' # Register first our own Appy folder type if needed. site = self.ploneSite if not hasattr(site.portal_types, self.appyFolderType): self.registerAppyFolderType() # Create the folder if not hasattr(site.aq_base, self.productName): # Temporarily allow me to create Appy large plone folders getattr(site.portal_types, self.appyFolderType).global_allow = 1 # Allow to create Appy large folders in the plone site getattr(site.portal_types, 'Plone Site').allowed_content_types += (self.appyFolderType,) site.invokeFactory(self.appyFolderType, self.productName, title=self.productName) getattr(site.portal_types, self.appyFolderType).global_allow = 0 # Manager has been granted Add permissions for all root classes. # This may not be desired, so remove this. appFolder = getattr(site, self.productName) for className in self.config.rootClasses: permission = self.getAddPermission(className) appFolder.manage_permission(permission, (), acquire=0) else: appFolder = getattr(site, self.productName) # All roles defined as creators should be able to create the # corresponding root content types in this folder. i = -1 allCreators = set() for klass in self.appClasses: i += 1 if not klass.__dict__.has_key('root') or not klass.__dict__['root']: continue # It is not a root class creators = getattr(klass, 'creators', None) if not creators: creators = self.defaultAddRoles allCreators = allCreators.union(creators) className = self.appClassNames[i] permission = self.getAddPermission(className) updateRolesForPermission(permission, tuple(creators), appFolder) # Beyond content-type-specific "add" permissions, creators must also # have the main permission "Add portal content". permission = 'Add portal content' updateRolesForPermission(permission, tuple(allCreators), appFolder) # Creates the "appy" Directory view if hasattr(site.aq_base, 'skyn'): site.manage_delObjects(['skyn']) # This way, if Appy has moved from one place to the other, the # directory view will always refer to the correct place. addDirView = self.config.manage_addDirectoryView addDirView(site, appy.getPath() + '/gen/plone25/skin', id='skyn')
def installUi(self): '''Installs the user interface.''' # Delete the existing folder if it existed. zopeContent = self.app.objectIds() if 'ui' in zopeContent: self.app.manage_delObjects(['ui']) self.app.manage_addFolder('ui') # Some useful imports from Products.PythonScripts.PythonScript import PythonScript from Products.PageTemplates.ZopePageTemplate import \ manage_addPageTemplate # Browse the physical folder and re-create it in the Zope folder j = os.path.join ui = j(j(appy.getPath(), 'gen'), 'ui') for root, dirs, files in os.walk(ui): folderName = root[len(ui):] # Get the Zope folder that corresponds to this name zopeFolder = self.app.ui if folderName: for name in folderName.strip(os.sep).split(os.sep): zopeFolder = zopeFolder._getOb(name) # Create sub-folders at this level for name in dirs: zopeFolder.manage_addFolder(name) # Create files at this level for name in files: baseName, ext = os.path.splitext(name) f = file(j(root, name)) if ext in gen.File.imageExts: zopeFolder.manage_addImage(name, f) elif ext == '.pt': manage_addPageTemplate(zopeFolder, baseName, '', f.read()) elif ext == '.py': obj = PythonScript(baseName) zopeFolder._setObject(baseName, obj) zopeFolder._getOb(baseName).write(f.read()) else: zopeFolder.manage_addFile(name, f) f.close() # Update the home page if 'index_html' in zopeContent: self.app.manage_delObjects(['index_html']) manage_addPageTemplate(self.app, 'index_html', '', homePage) # Update the error page if 'standard_error_message' in zopeContent: self.app.manage_delObjects(['standard_error_message']) manage_addPageTemplate(self.app, 'standard_error_message', '',errorPage)
def finalize(self): # Add a label for the application name self.i18n(self.applicationName, self.applicationName) # Add a i18n message for every role. for role in self.getUsedRoles(appy=False): self.i18n('role_%s' % role.name, role.name) # Create basic files (config.py, etc) self.generateTool() self.generateInit() self.generateTests() # Create version.txt f = open(os.path.join(self.outputFolder, 'version.txt'), 'w') f.write(self.version) f.close() # Make folder "tests" a Python package initFile = '%s/tests/__init__.py' % self.outputFolder if not os.path.isfile(initFile): f = open(initFile, 'w') f.write('') f.close() # Generate i18n pot file potFileName = '%s.pot' % self.applicationName if self.i18nFiles.has_key(potFileName): potFile = self.i18nFiles[potFileName] else: fullName = os.path.join(self.application, 'tr', potFileName) potFile = po.PoFile(fullName) self.i18nFiles[potFileName] = potFile # Update the pot file with (a) standard Appy labels and (b) the list of # generated application labels. appyPotFileName = os.path.join(appy.getPath(), 'gen', 'tr', 'Appy.pot') appyLabels = po.PoParser(appyPotFileName).parse().messages removedLabels = potFile.update(appyLabels + self.labels.get(), self.options.i18nClean, keepExistingOrder=False) potFile.generate() if removedLabels: print('Warning: %d messages were removed from translation ' \ 'files: %s' % (len(removedLabels), str(removedLabels))) # Generate i18n po files for language in self.config.languages: # I must generate (or update) a po file for the language(s) # specified in the configuration. poFileName = potFile.getPoFileName(language) if self.i18nFiles.has_key(poFileName): poFile = self.i18nFiles[poFileName] else: fullName = os.path.join(self.application, 'tr', poFileName) poFile = po.PoFile(fullName) self.i18nFiles[poFileName] = poFile # If we have default Appy messages translated for this language, # get it. Else, use appyLabels from the pot file as default empty # labels. appyPoFileName = os.path.join(appy.getPath(), 'gen', 'tr', '%s.po' % language) if os.path.exists(appyPoFileName): baseLabels = po.PoParser(appyPoFileName).parse().messages else: baseLabels = appyLabels poFile.update(baseLabels + self.labels.get() + \ potFile.getCustomMessages(), self.options.i18nClean, keepExistingOrder=False) poFile.generate() # Generate corresponding fields on the Translation class page = '1' i = 0 for message in potFile.messages: i += 1 # A computed field is used for displaying the text to translate. self.translation.addLabelField(message.id, page) # A String field will hold the translation in itself. self.translation.addMessageField(message.id, page, self.i18nFiles) if (i % self.config.translationsPerPage) == 0: # A new page must be defined. page = str(int(page) + 1) self.generateWrappers() self.generateConfig()
def installApplication(self): '''Performs some application-wide installation steps.''' register = self.config.DirectoryView.registerDirectory register('skins', self.config.__dict__) # Register the appy skin folder among DirectoryView'able folders register('skin', appy.getPath() + '/gen/plone25')
def finalize(self): # Add a label for the application name self.i18n(self.applicationName, self.applicationName) # Add a i18n message for every role. for role in self.getUsedRoles(appy=False): self.i18n('role_%s' % role.name, role.name) # Create basic files (config.py, etc) self.generateTool() self.generateInit() self.generateTests() # Create version.txt f = open(os.path.join(self.outputFolder, 'version.txt'), 'w') f.write(self.version) f.close() # Make folder "tests" a Python package initFile = '%s/tests/__init__.py' % self.outputFolder if not os.path.isfile(initFile): f = open(initFile, 'w') f.write('') f.close() # Generate i18n pot file potFileName = '%s.pot' % self.applicationName if self.i18nFiles.has_key(potFileName): potFile = self.i18nFiles[potFileName] else: fullName = os.path.join(self.application, 'tr', potFileName) potFile = po.PoFile(fullName) self.i18nFiles[potFileName] = potFile # Update the pot file with (a) standard Appy labels and (b) the list of # generated application labels. appyPotFileName = os.path.join(appy.getPath(), 'gen', 'tr', 'Appy.pot') appyLabels = po.PoParser(appyPotFileName).parse().messages removedLabels = potFile.update(appyLabels + self.labels.get(), self.options.i18nClean, keepExistingOrder=False) potFile.generate() if removedLabels: print('Warning: %d messages were removed from translation ' \ 'files: %s' % (len(removedLabels), str(removedLabels))) # Generate i18n po files for language in self.config.languages: # I must generate (or update) a po file for the language(s) # specified in the configuration. poFileName = potFile.getPoFileName(language) if self.i18nFiles.has_key(poFileName): poFile = self.i18nFiles[poFileName] else: fullName = os.path.join(self.application, 'tr', poFileName) poFile = po.PoFile(fullName) self.i18nFiles[poFileName] = poFile # If we have default Appy messages translated for this language, # get it. Else, use appyLabels from the pot file as default empty # labels. appyPoFileName = os.path.join(appy.getPath(), 'gen', 'tr', '%s.po' % language) if os.path.exists(appyPoFileName): baseLabels = po.PoParser(appyPoFileName).parse().messages else: baseLabels = appyLabels poFile.update(baseLabels + self.labels.get() + \ potFile.getCustomMessages(), self.options.i18nClean, keepExistingOrder=False) poFile.generate() # Generate corresponding fields on the Translation class page = '1' i = 0 for message in potFile.messages: i += 1 # A computed field is used for displaying the text to translate. self.translation.addLabelField(message.id, page) # A String field will hold the translation in itself. self.translation.addMessageField(message.id, page, self.i18nFiles) if (i % self.config.translationsPerPage) == 0: # A new page must be defined. page = str(int(page)+1) self.generateWrappers() self.generateConfig()