def setup(self): self.request.response.setHeader('X-Theme-Disabled', '1') processInputs(self.request) self.resourceDirectory = self.context self.theme = getThemeFromResourceDirectory(self.context) self.name = self.resourceDirectory.__name__ self.title = self.theme.title self.portalUrl = getToolByName(self.context, 'portal_url')() self.themeBasePath = "++%s++%s" % (THEME_RESOURCE_NAME, self.name,) self.themeBasePathEncoded = urllib.quote_plus(self.themeBasePath) self.themeBaseUrl = "%s/%s" % (self.portalUrl, self.themeBasePath,) self.editable = IWritableResourceDirectory.providedBy(self.resourceDirectory) settings = getUtility(IRegistry).forInterface(IThemeSettings, False) self.active = (settings.enabled and self.name == getCurrentTheme()) self.rulesFileName = RULE_FILENAME self.jsVariables = "var CURRENT_SELECTION='%s'; var THEME_BASE_URL='%s'; var THEME_BASE_PATH_ENCODED='%s'; var EDITABLE=%s; var RULE_FILENAME='%s';" % ( self.request.get('file-selector') or '', self.themeBaseUrl, self.themeBasePathEncoded, str(self.editable).lower(), self.rulesFileName )
def setup(self): self.request.response.setHeader('X-Theme-Disabled', '1') processInputs(self.request) self.resourceDirectory = self.context self.theme = getThemeFromResourceDirectory(self.context) self.name = self.resourceDirectory.__name__ self.title = self.theme.title self.portalUrl = getToolByName(self.context, 'portal_url')() self.themeBasePath = "++{0:s}++{1:s}".format( THEME_RESOURCE_NAME, self.name ) self.themeBasePathEncoded = urllib.quote_plus(self.themeBasePath) self.themeBaseUrl = '/'.join([self.portalUrl, self.themeBasePath]) self.editable = IWritableResourceDirectory.providedBy( self.resourceDirectory ) if self.editable: self.resourceUrl = self.resourceDirectory.context.absolute_url() else: self.resourceUrl = None settings = getUtility(IRegistry).forInterface(IThemeSettings, False) self.active = (settings.enabled and self.name == getCurrentTheme()) self.rulesFileName = RULE_FILENAME
def setup(self): self.request.response.setHeader('X-Theme-Disabled', '1') processInputs(self.request) self.resourceDirectory = self.context self.theme = getThemeFromResourceDirectory(self.context) self.name = self.resourceDirectory.__name__ self.title = self.theme.title self.portalUrl = getToolByName(self.context, 'portal_url')() self.themeBasePath = "++{0:s}++{1:s}".format( THEME_RESOURCE_NAME, self.name ) self.themeBasePathEncoded = urllib.parse.quote_plus(self.themeBasePath) self.themeBaseUrl = '/'.join([self.portalUrl, self.themeBasePath]) try: registry = getUtility(IRegistry) self.lessUrl = registry['plone.resources.lessc'] self.lessVariables = self.portalUrl + '/' + registry['plone.resources.less-variables'] except: self.lessUrl = None self.lessVariables = None self.editable = IWritableResourceDirectory.providedBy( self.resourceDirectory ) if self.editable: self.resourceUrl = self.resourceDirectory.context.absolute_url() else: self.resourceUrl = None policy = theming_policy(self.request) settings = policy.getSettings() self.active = (settings.enabled and self.name == policy.getCurrentTheme()) self.rulesFileName = RULE_FILENAME
def setup(self): self.request.response.setHeader('X-Theme-Disabled', '1') processInputs(self.request) self.resourceDirectory = self.context self.theme = getThemeFromResourceDirectory(self.context) self.name = self.resourceDirectory.__name__ self.title = self.theme.title self.portalUrl = getToolByName(self.context, 'portal_url')() self.themeBasePath = "++{0:s}++{1:s}".format( THEME_RESOURCE_NAME, self.name ) self.themeBasePathEncoded = urllib.quote_plus(self.themeBasePath) self.themeBaseUrl = '/'.join([self.portalUrl, self.themeBasePath]) try: registry = getUtility(IRegistry) self.lessUrl = registry['plone.resources.lessc'] self.lessVariables = self.portalUrl + '/' + registry['plone.resources.less-variables'] except: self.lessUrl = None self.lessVariables = None self.editable = IWritableResourceDirectory.providedBy( self.resourceDirectory ) if self.editable: self.resourceUrl = self.resourceDirectory.context.absolute_url() else: self.resourceUrl = None policy = theming_policy(self.request) settings = policy.getSettings() self.active = (settings.enabled and self.name == policy.getCurrentTheme()) self.rulesFileName = RULE_FILENAME
def pageLayouts(self): layouts = [] for name, info in getAllResources(PAGE_LAYOUT_MANIFEST_FORMAT).items(): if info is None: info = {} directory = queryResourceDirectory(PAGE_LAYOUT_RESOURCE_NAME, name) editable = IWritableResourceDirectory.providedBy(directory) layouts.append({ 'name': name, 'title': info.get('title', name.capitalize().replace('-', ' ').replace('.', ' ')), 'description': info.get('description', None), 'url': "%s/++%s++%s" % ( self.context.absolute_url(), PAGE_LAYOUT_RESOURCE_NAME, name, ), 'editable': editable, }) return layouts
def setup(self): self.request.response.setHeader('X-Theme-Disabled', '1') processInputs(self.request) self.resourceDirectory = self.context self.theme = getThemeFromResourceDirectory(self.context) self.name = self.resourceDirectory.__name__ self.title = self.theme.title self.portalUrl = getToolByName(self.context, 'portal_url')() self.themeBasePath = "++{0:s}++{1:s}".format(THEME_RESOURCE_NAME, self.name) self.themeBasePathEncoded = urllib.quote_plus(self.themeBasePath) self.themeBaseUrl = '/'.join([self.portalUrl, self.themeBasePath]) self.editable = IWritableResourceDirectory.providedBy( self.resourceDirectory) settings = getUtility(IRegistry).forInterface(IThemeSettings, False) self.active = (settings.enabled and self.name == getCurrentTheme()) self.rulesFileName = RULE_FILENAME
def onEnabled(self, theme, settings, dependenciesSettings): # noqa res = queryResourceDirectory(THEME_RESOURCE_NAME, theme) if res is None: return # We need to get settings by ourselves to avoid p.a.theming caching settings = getSettings(res) if not isEnabled(settings): return # Remove imported folders not-required on run-time autocleanup = (settings.get('self-destruct') or '').lower() in ('true', 'yes', 'on', '1') # Register permissions sm = getSiteManager() for key, value in _getPermissions(settings).items(): util = sm.queryUtility(IPermission, name=key) if util is None: name = str('collective.themesitesetup.permission.' + key) util = LocalPermission(value, u'') util.id = key util.__name__ = name util.__parent__ = aq_base(sm) sm._setObject(name, util, set_owner=False, suppress_events=True) sm.registerUtility(util, provided=IPermission, name=key) addPermission(str(value)) # Import GS profile directoryName = DEFAULT_ENABLED_PROFILE_NAME if 'install' in settings: directoryName = settings['install'] directory = None if res.isDirectory(directoryName): directory = res[directoryName] if directory: tarball = createTarball(directory) portal_setup = api.portal.get_tool('portal_setup') portal_setup.runAllImportStepsFromProfile(None, purge_old=False, archive=tarball) # Self-destruct imported profile if autocleanup and IWritableResourceDirectory.providedBy(res): del res[directoryName] # Register locales localesDirectoryName = DEFAULT_ENABLED_LOCALES_NAME if 'locales' in settings: localesDirectoryName = settings['locales'] if res.isDirectory(localesDirectoryName): catalogs = getMessageCatalogs(res[localesDirectoryName]) for domain in catalogs: util = sm.queryUtility(ITranslationDomain, name=domain) if not isinstance(util, TranslationDomain): name = str('collective.themesitesetup.domain.' + domain) util = TranslationDomain() util.__name__ = name util.__parent__ = aq_base(sm) util.domain = domain sm._setObject(name, util, set_owner=False, suppress_events=True) sm.registerUtility(util, provided=ITranslationDomain, name=domain) for language in catalogs[domain]: name = '.'.join([ 'collective.themesitesetup.catalog', res.__name__, domain, language ]) if name in util: try: del util[name] except ValueError: pass util[name] = catalogs[domain][language] # Self-destruct imported catalogs if autocleanup and IWritableResourceDirectory.providedBy(res): del res[localesDirectoryName] # Update Dexterity models modelsDirectoryName = DEFAULT_ENABLED_MODELS_NAME if 'models' in settings: modelsDirectoryName = settings['models'] overwrite = overwriteModels(settings) if res.isDirectory(modelsDirectoryName): types_tool = api.portal.get_tool('portal_types') directory = res[modelsDirectoryName] for name in directory.listDirectory(): if not name.endswith('.xml') or not directory.isFile(name): continue fti = types_tool.get(name[:-4]) if not fti: continue model = unicode(directory.readFile(name), 'utf-8', 'ignore') if fti.model_source == model: continue try: loadString(model, fti.schema_policy) # fail for errors except SupermodelParseError: logger.error( u'Error while parsing {0:s}/{1:s}/{2:s}'.format( res.__name__, modelsDirectoryName, name)) raise # Set model source when model is empty of override is enabled desc = DexterityFTIModificationDescription( 'model_source', fti.model_source) if not fti.model_source: fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) elif not loadString(fti.model_source, fti.schema_policy).schema.names(): # noqa fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) elif overwrite: fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) # Self-destruct imported models if autocleanup and IWritableResourceDirectory.providedBy(res): del res[modelsDirectoryName] # Copy resources resourcesDirectoryName = DEFAULT_ENABLED_RESOURCES_NAME if 'resources' in settings: resourcesDirectoryName = settings['resources'] purge = purgeResources(settings) overwrite = overwriteResources(settings) root = queryUtility(IResourceDirectory, name=u'persistent') if root and res.isDirectory(resourcesDirectoryName): copyResources(res[resourcesDirectoryName], root, purge, overwrite) # Invalidate site layout cache of plone.app.blocks portal_catalog = api.portal.get_tool('portal_catalog') portal_catalog._increment_counter() # Self-desctruct imported resources if autocleanup and IWritableResourceDirectory.providedBy(res): del res[resourcesDirectoryName]
def onEnabled(self, theme, settings, dependenciesSettings): # noqa res = queryResourceDirectory(THEME_RESOURCE_NAME, theme) if res is None: return # We need to get settings by ourselves to avoid p.a.theming caching settings = getSettings(res) if not isEnabled(settings): return # Remove imported folders not-required on run-time autocleanup = (settings.get('self-destruct') or '').lower() in ( 'true', 'yes', 'on', '1' ) # Register permissions sm = getSiteManager() for key, value in _getPermissions(settings).items(): util = sm.queryUtility(IPermission, name=key) if util is None: name = str('collective.themesitesetup.permission.' + key) util = LocalPermission(value, u'') util.id = key util.__name__ = name util.__parent__ = aq_base(sm) sm._setObject( name, util, set_owner=False, suppress_events=True) sm.registerUtility( util, provided=IPermission, name=key) addPermission(str(value)) # Import GS profile directoryName = DEFAULT_ENABLED_PROFILE_NAME if 'install' in settings: directoryName = settings['install'] directory = None if res.isDirectory(directoryName): directory = res[directoryName] if directory: tarball = createTarball(directory) portal_setup = api.portal.get_tool('portal_setup') portal_setup.runAllImportStepsFromProfile( None, purge_old=False, archive=tarball) # Self-destruct imported profile if autocleanup and IWritableResourceDirectory.providedBy(res): del res[directoryName] # Register locales localesDirectoryName = DEFAULT_ENABLED_LOCALES_NAME if 'locales' in settings: localesDirectoryName = settings['locales'] if res.isDirectory(localesDirectoryName): catalogs = getMessageCatalogs(res[localesDirectoryName]) for domain in catalogs: util = sm.queryUtility(ITranslationDomain, name=domain) if not isinstance(util, TranslationDomain): name = str('collective.themesitesetup.domain.' + domain) util = TranslationDomain() util.__name__ = name util.__parent__ = aq_base(sm) util.domain = domain sm._setObject( name, util, set_owner=False, suppress_events=True) sm.registerUtility( util, provided=ITranslationDomain, name=domain) for language in catalogs[domain]: name = '.'.join(['collective.themesitesetup.catalog', res.__name__, domain, language]) if name in util: try: del util[name] except ValueError: pass util[name] = catalogs[domain][language] # Self-destruct imported catalogs if autocleanup and IWritableResourceDirectory.providedBy(res): del res[localesDirectoryName] # Update Dexterity models modelsDirectoryName = DEFAULT_ENABLED_MODELS_NAME if 'models' in settings: modelsDirectoryName = settings['models'] overwrite = overwriteModels(settings) if res.isDirectory(modelsDirectoryName): types_tool = api.portal.get_tool('portal_types') directory = res[modelsDirectoryName] for name in directory.listDirectory(): if not name.endswith('.xml') or not directory.isFile(name): continue fti = types_tool.get(name[:-4]) if not fti: continue model = unicode(directory.readFile(name), 'utf-8', 'ignore') if fti.model_source == model: continue try: loadString(model, fti.schema_policy) # fail for errors except SupermodelParseError: logger.error( u'Error while parsing {0:s}/{1:s}/{2:s}'.format( res.__name__, modelsDirectoryName, name)) raise # Set model source when model is empty of override is enabled desc = DexterityFTIModificationDescription('model_source', fti.model_source) if not fti.model_source: fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) elif not loadString(fti.model_source, fti.schema_policy).schema.names(): # noqa fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) elif overwrite: fti.model_source = model notify(ObjectModifiedEvent(fti, desc)) # Self-destruct imported models if autocleanup and IWritableResourceDirectory.providedBy(res): del res[modelsDirectoryName] # Copy resources resourcesDirectoryName = DEFAULT_ENABLED_RESOURCES_NAME if 'resources' in settings: resourcesDirectoryName = settings['resources'] purge = purgeResources(settings) overwrite = overwriteResources(settings) root = queryUtility(IResourceDirectory, name=u'persistent') if root and res.isDirectory(resourcesDirectoryName): copyResources(res[resourcesDirectoryName], root, purge, overwrite) # Invalidate site layout cache of plone.app.blocks portal_catalog = api.portal.get_tool('portal_catalog') portal_catalog._increment_counter() # Self-desctruct imported resources if autocleanup and IWritableResourceDirectory.providedBy(res): del res[resourcesDirectoryName]