Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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'])
Пример #4
0
 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')
Пример #5
0
 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)
Пример #6
0
 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()
Пример #7
0
 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')
Пример #8
0
 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()