def test_applyTheme(self): from zope.component import getUtility from plone.registry.interfaces import IRegistry from plone.app.theming.interfaces import IThemeSettings from plone.app.theming.utils import getAvailableThemes from plone.app.theming.utils import applyTheme theme = None for t in getAvailableThemes(): theme = t break settings = getUtility(IRegistry).forInterface(IThemeSettings, False) settings.rules = None applyTheme(theme) self.assertEqual(settings.rules, theme.rules) self.assertEqual(settings.absolutePrefix, theme.absolutePrefix) self.assertEqual( settings.parameterExpressions, theme.parameterExpressions ) self.assertEqual(settings.doctype, theme.doctype)
def base_test(self, cor): """Teste base dos temas.""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True transaction.commit() self.browser.open(self.portal.absolute_url()) # Testa se a âncora para o conteúdo aparece. self.assertIn( '<a name="acontent" id="acontent" class="anchor">', self.browser.contents, ) # Testa se a âncora para o menu aparece. self.assertIn( '<a name="anavigation" id="anavigation" class="anchor">', self.browser.contents, ) # Testa se o input para a busca aparece. self.assertIn( 'name="SearchableText"', self.browser.contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( '<a name="afooter" id="afooter" class="anchor">', self.browser.contents, )
def importTheme(context): """Apply the theme with the id contained in the profile file theme.xml and enable the theme. """ data = context.readDataFile('theme.xml') if not data: return logger = context.getLogger('plone.app.theming.exportimport') tree = etree.fromstring(data) themeName = tree.find("name") themeEnabled = tree.find("enabled") if themeName is not None: themeName = themeName.text.strip() themeInfo = None allThemes = getAvailableThemes() for info in allThemes: if info.__name__.lower() == themeName.lower(): themeInfo = info break if themeInfo is None: raise ValueError("Theme %s is not available" % themeName) applyTheme(themeInfo) logger.info('Theme %s applied' % themeName) settings = getUtility(IRegistry).forInterface(IThemeSettings, False) if themeEnabled is not None: themeEnabled = themeEnabled.text.strip().lower() if themeEnabled in ( "y", "yes", "true", "t", "1", "on", ): settings.enabled = True logger.info('Theme enabled') elif themeEnabled in ( "n", "no", "false", "f", "0", "off", ): settings.enabled = False logger.info('Theme disabled') else: raise ValueError("%s is not a valid value for <enabled />" % themeEnabled)
def test_theme_enabled_resource_directory(self): app = self.layer['app'] portal = self.layer['portal'] self.settings.enabled = True theme = getTheme('plone.app.theming.tests') applyTheme(theme) self.assertEqual(self.settings.rules, u'/++theme++plone.app.theming.tests/rules.xml') self.assertEqual(self.settings.currentTheme, u"plone.app.theming.tests") self.assertEqual(self.settings.doctype, u"<!DOCTYPE html>") import transaction transaction.commit() browser = Browser(app) browser.open(portal.absolute_url()) # Title - pulled in with rules.xml self.assertTrue(portal.title in browser.contents) # Elsewhere - not pulled in self.assertFalse("Accessibility" in browser.contents) # The theme self.assertTrue("This is the theme" in browser.contents) # Doctype self.assertTrue(re.match("<!DOCTYPE html>\s+<html", browser.contents))
def base_test(self, cor): """Teste base dos temas""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() # Testa se elementos do dashboard aparecem. self.browser.open('{0}/dashboard'.format(self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self.browser.contents) self.assertIn('dashboard</h1>', self.browser.contents) # Testa se elementos da 'Informação Pessoal' aparecem. self.browser.open('{0}/@@user-information?userid=admin'.format( self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self. browser.contents) self.assertIn('Change your personal information', self.browser.contents) # Testa se elementos da 'Preferências Pessoais' aparecem. self.browser.open('{0}/@@user-preferences?userid=admin'.format( self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self.browser.contents) self.assertIn('Your personal settings', self.browser.contents)
def test_theme_enabled_resource_directory(self): app = self.layer['app'] portal = self.layer['portal'] self.settings.enabled = True theme = getTheme('plone.app.theming.tests') applyTheme(theme) self.assertEqual(self.settings.rules, u'/++theme++plone.app.theming.tests/rules.xml') self.assertEqual(self.settings.currentTheme, u"plone.app.theming.tests") self.assertEqual(self.settings.doctype, u"<!DOCTYPE html>") import transaction; transaction.commit() browser = Browser(app) browser.open(portal.absolute_url()) # Title - pulled in with rules.xml self.assertTrue(portal.title in browser.contents) # Elsewhere - not pulled in self.assertFalse("Accessibility" in browser.contents) # The theme self.assertTrue("This is the theme" in browser.contents) # Doctype self.assertTrue(re.match("<!DOCTYPE html>\s+<html", browser.contents))
def base_test(self, cor): """Teste base dos temas""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() # Testa se elementos do dashboard aparecem. self.browser.open('{0}/dashboard'.format(self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self.browser.contents) self.assertIn('dashboard</h1>', self.browser.contents) # Testa se elementos da 'Informação Pessoal' aparecem. self.browser.open('{0}/@@user-information?userid=admin'.format( self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self.browser.contents) self.assertIn('Change your personal information', self.browser.contents) # Testa se elementos da 'Preferências Pessoais' aparecem. self.browser.open('{0}/@@user-preferences?userid=admin'.format( self.portal.absolute_url())) self.assertIn('id="kssPortalMessage"', self.browser.contents) self.assertIn('Your personal settings', self.browser.contents)
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True createThemeFromTemplate(title="linked", description="Generated from test") test_theme_name = createThemeFromTemplate( title="rapidotest", description="Generated from test") theme = getTheme(test_theme_name) applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] package_dir_path = os.path.join(test_dir_path, 'other') dir = FilesystemResourceDirectory(package_dir_path) provideUtility(dir, provides=IResourceDirectory, name=u'++theme++other') self.browser = Browser(self.layer['app']) self.browser.handleErrors = False
def test_tema_capa(self): theme = getTheme('capa') applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() browser = Browser(self.layer['app']) browser.open(self.portal.absolute_url())
def upgrade_1001_to_1002(context): # 1002 untangles the dependency hell that was default <- sunburst <- izug. # Now, sunburst and izug.basetheme both have their own profiles. # Since the default profile therefore has only the bare essential styles # it needs to be decided on upgrade which theme was used, the old css # files need to be removed and the theme profile needs to be applied. # acquire the current theme skins = getToolByName(context, 'portal_skins') theme = skins.getDefaultSkin() # find the right profile to use profilemap = { 'iZug Base Theme': 'izug_basetheme', 'Sunburst Theme': 'sunburst' } if theme not in profilemap: log.info("Theme %s is not supported by seantis.dir.events" % theme) profile = 'default' else: profile = profilemap[theme] # remove all existing event stylesheets css_registry = getToolByName(context, 'portal_css') stylesheets = css_registry.getResourcesDict() ids = [i for i in stylesheets if 'resource++seantis.dir.events.css' in i] map(css_registry.unregisterResource, ids) # remove the old diazo theme and disable theming for now themes = getOrCreatePersistentResourceDirectory() to_delete = [ 'izug.seantis.dir.events.theme', 'vbeo.seantis.dir.events.theme' ] for theme in to_delete: try: del themes[theme] except KeyError: continue applyTheme(None) setup = getToolByName(context, 'portal_setup') # reapply the chosen profile setup.runAllImportStepsFromProfile('profile-seantis.dir.events:%s' % profile) # there are currently two installations, bern and zug if getSite().id == 'vbeo': setup.runAllImportStepsFromProfile( 'profile-vbeo.seantis.dir.events:default') else: setup.runAllImportStepsFromProfile( 'profile-izug.seantis.dir.events:default')
def update(self): form = self.request.form self.settings = getUtility(IRegistry).forInterface( IThemeSettings, False) gallerysettings = getUtility(IRegistry).forInterface( IThemeGallerySettingsSchema, False) url = gallerysettings.tgserver_url if not url.endswith('/'): url +='/' self.base_url = '%s__rest__/cms/content:themes' % url self.api = '%s__rest__/cms/applications' % url if 'form.button.install' in form: theme = form.get('theme_uuid', None) if theme is not None: tfile = self.loadTheme(theme) try: themeZip = zipfile.ZipFile(tfile) except (zipfile.BadZipfile, zipfile.LargeZipFile,): logger.exception("Could not read zip file") self.error = u"The uploaded file is not a valid Zip archive" return if themeZip: try: themeData = extractThemeInfo(themeZip) except (ValueError, KeyError,), e: logger.warn(str(e)) self.error = u"The uploaded file does not contain a valid theme archive." else: themeContainer=getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: del themeContainer[themeData.__name__] themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, themeData.__name__) if themeDirectory is not None: plugins = getPlugins() pluginSettings = getPluginSettings( themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated( themeData.__name__, pluginSettings[name], pluginSettings) applyTheme(themeData) self.settings.enabled = True IStatusMessage(self.request).add( "Theme has been installed.")
def base_test(self, cor): """Teste base dos temas""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() self.browser.open(self.portal.absolute_url()) self.assertIn( '<div id="footer-brasil" class="footer-logos"></div>', self.browser.contents )
def portal_logo_tema_test(self, cor): """Testa se o portal logo está presente em todos os temas.""" adapter = self.adapter adapter.site_title_1 = u'Portal' adapter.site_title_2 = u'Brasil' theme = getTheme(cor) applyTheme(theme) self.browser.open(self.portal.absolute_url()) self.assertIn('<div id="portal-title"', self.browser.contents)
def base_test(self, cor): """Teste base dos temas""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() self.browser.open(self.portal.absolute_url()) self.assertIn( '<div id="footer-brasil" class="footer-logos"></div>', self.browser.contents, )
def test_reload_in_dev_mode_filesystem(self): app = self.layer['app'] portal = self.layer['portal'] Globals.DevelopmentMode = True self.settings.enabled = True theme = getTheme('plone.app.theming.tests') applyTheme(theme) self.assertEqual(self.settings.rules, u'/++theme++plone.app.theming.tests/rules.xml') self.assertEqual(self.settings.currentTheme, u"plone.app.theming.tests") self.assertEqual(self.settings.doctype, u"<!DOCTYPE html>") import transaction; transaction.commit() browser = Browser(app) browser.open(portal.absolute_url()) # Doctype self.assertTrue(re.match("<!DOCTYPE html>\s+<html", browser.contents)) # Now switch some setting: the doctype self.settings.doctype = "<!DOCTYPE xhtml>" transaction.commit() browser.open(portal.absolute_url()) # Doctype self.assertTrue(re.match("<!DOCTYPE xhtml>\s+<html", browser.contents)) # Now change a file on the filesystem: fname = portal.restrictedTraverse(str(self.settings.rules)).path from shutil import copyfile try: # Copy the 'otherrules.xml' file to the 'rules.xml' src = fname.replace('resources/', '/other') copyfile(fname, fname + '.bkp') copyfile(src, fname) browser.open(portal.absolute_url()) # The theme self.assertTrue("This is the other theme" in browser.contents) finally: copyfile(fname + '.bkp', fname) os.remove(fname + '.bkp') browser.open(portal.absolute_url()) # Test for the test: has the rules file been restored ? self.assertTrue("This is the theme" in browser.contents)
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.plone.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal']
def test_tema_azul(self): theme = getTheme('azul') applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() browser = Browser(self.layer['app']) browser.open(self.portal.absolute_url()) # Acesso a Informacao deve estar disponivel self.assertIn("acesso-a-infornacao.png", browser.contents) # Removido logo do governo federal self.assertIn("brasil.png", browser.contents)
def base_test(self, cor): """Teste base dos temas""" theme = getTheme(cor) applyTheme(theme) self.settings.enabled = True import transaction transaction.commit() self.browser.open(self.portal.absolute_url()) # Acesso a Informacao deve estar disponivel self.assertIn("acesso-a-infornacao.png", self.browser.contents) # Removido logo do governo federal self.assertIn("brasil.png", self.browser.contents)
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.extensions.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] self.request = self.layer['request'] setRoles(self.portal, TEST_USER_ID, ['Manager'])
def importTheme(context): """Apply the theme with the id contained in the profile file theme.xml and enable the theme. """ data = context.readDataFile('theme.xml') if not data: return logger = context.getLogger('plone.app.theming.exportimport') tree = etree.fromstring(data) # apply theme if given and valid themeName = tree.find("name") if themeName is not None: themeName = themeName.text.strip() themeInfo = None allThemes = getAvailableThemes() for info in allThemes: if info.__name__.lower() == themeName.lower(): themeInfo = info break if themeInfo is None: raise ValueError("Theme {0:s} is not available".format(themeName)) applyTheme(themeInfo) logger.info('Theme {0:s} applied'.format(themeName)) # enable/disable theme themeEnabled = tree.find("enabled") if themeEnabled is None: return settings = getUtility(IRegistry).forInterface(IThemeSettings, False) themeEnabled = themeEnabled.text.strip().lower() if themeEnabled in ("y", "yes", "true", "t", "1", "on",): settings.enabled = True logger.info('Theme enabled') elif themeEnabled in ("n", "no", "false", "f", "0", "off",): settings.enabled = False logger.info('Theme disabled') else: raise ValueError( "{0:s} is not a valid value for <enabled />".format(themeEnabled) )
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.plone.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) self.browser = Browser(self.layer['app']) self.browser.handleErrors = False
def test_applyTheme_None(self): from zope.globalrequest import getRequest from plone.app.theming.interfaces import IThemeSettings from plone.app.theming.utils import applyTheme toadapt = (self.layer['portal'], getRequest()) settings = getMultiAdapter(toadapt, IThemeSettings) settings.rules = u"/++theme++foo/rules.xml" settings.absolutePrefix = u"/++theme++foo" settings.parameterExpressions = {} applyTheme(None) self.assertEqual(settings.rules, None) self.assertEqual(settings.absolutePrefix, None) self.assertEqual(settings.parameterExpressions, {})
def importTheme(context): """Apply the theme with the id contained in the profile file theme.xml and enable the theme. """ data = context.readDataFile('theme.xml') if not data: return logger = context.getLogger('plone.app.theming.exportimport') tree = etree.fromstring(data) themeName = tree.find("name") themeEnabled = tree.find("enabled") if themeName is not None: themeName = themeName.text.strip() themeInfo = None allThemes = getAvailableThemes() for info in allThemes: if info.__name__.lower() == themeName.lower(): themeInfo = info break if themeInfo is None: raise ValueError("Theme %s is not available" % themeName) applyTheme(themeInfo) logger.info('Theme %s applied' % themeName) toadapt = (getSite(), getRequest()) settings = getMultiAdapter(toadapt, IThemeSettings) if themeEnabled is not None: themeEnabled = themeEnabled.text.strip().lower() if themeEnabled in ("y", "yes", "true", "t", "1", "on",): settings.enabled = True logger.info('Theme enabled') elif themeEnabled in ("n", "no", "false", "f", "0", "off",): settings.enabled = False logger.info('Theme disabled') else: raise ValueError("%s is not a valid value for <enabled />" % themeEnabled)
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.plone.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] package_dir_path = os.path.join(test_dir_path, 'other') dir = FilesystemResourceDirectory(package_dir_path) provideUtility( dir, provides=IResourceDirectory, name=u'++theme++other')
def activateTheme(): theme = getTheme('custom') if theme is None: createThemeFromTemplate('custom', '') theme = getTheme('custom') directory = queryResourceDirectory(THEME_RESOURCE_NAME, 'custom') try: directory['jbot'] except: directory.makeDirectory('jbot') fi = open(os.path.join(TEST_FILES_DIR, 'footer2.pt')) directory.writeFile('jbot/' + CUSTOMIZED_RESOURCE, fi) fi.close() if getCurrentTheme() != 'custom': applyTheme(theme)
def disable_theme(context=None): """Disable a custom diazo theme and enable sunburst. Useful for cleaning up a site in Plone 4 """ THEME_NAME = 'custom.theme' from plone.app.theming.utils import applyTheme portal_skins = api.portal.get_tool('portal_skins') qi = api.portal.get_tool('portal_quickinstaller') if qi.isProductInstalled(THEME_NAME): log.info('Uninstalling {}'.format(THEME_NAME)) qi.uninstallProducts([THEME_NAME]) log.info('Disabling all diazo themes') applyTheme(None) log.info('Enabled Sunburst Theme') portal_skins.default_skin = 'Sunburst Theme' if THEME_NAME in portal_skins.getSkinSelections(): portal_skins.manage_skinLayers([THEME_NAME], del_skin=True)
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.plone.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] package_dir_path = os.path.join(test_dir_path, 'other') dir = FilesystemResourceDirectory(package_dir_path) provideUtility(dir, provides=IResourceDirectory, name=u'++theme++other')
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True theme = getTheme('rapido.extensions.tests') applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] setRoles(self.portal, TEST_USER_ID, ['Manager']) self.browser = Browser(self.layer['app']) self.browser.handleErrors = False self.browser.raiseHttpErrors = False self.browser.addHeader('Accept', 'application/json')
def test_applyTheme_None(self): from zope.component import getUtility from plone.registry.interfaces import IRegistry from plone.app.theming.interfaces import IThemeSettings from plone.app.theming.utils import applyTheme settings = getUtility(IRegistry).forInterface(IThemeSettings, False) settings.rules = u"/++theme++foo/rules.xml" settings.absolutePrefix = u"/++theme++foo" settings.parameterExpressions = {} applyTheme(None) self.assertEqual(settings.rules, None) self.assertEqual(settings.absolutePrefix, None) self.assertEqual(settings.parameterExpressions, {})
def test_applyTheme(self): from zope.globalrequest import getRequest from plone.app.theming.interfaces import IThemeSettings from plone.app.theming.utils import getAvailableThemes from plone.app.theming.utils import applyTheme toadapt = (self.layer['portal'], getRequest()) settings = getMultiAdapter(toadapt, IThemeSettings) theme = None for t in getAvailableThemes(): theme = t break self.assertEqual(settings.rules, None) applyTheme(theme) self.assertEqual(settings.rules, theme.rules) self.assertEqual(settings.absolutePrefix, theme.absolutePrefix) self.assertEqual(settings.parameterExpressions, theme.parameterExpressions) self.assertEqual(settings.doctype, theme.doctype)
def setUp(self): self.portal = self.layer['portal'] self.request = self.layer['request'] login(self.portal, TEST_USER_NAME) setRoles(self.portal, TEST_USER_ID, ('Member', 'Manager')) # part of setup is to always copy the theme to new one createThemeFromTemplate('foobar', '', 'castle.theme') themeData = getTheme('foobar') applyTheme(themeData) registry = getUtility(IRegistry) theme_settings = registry.forInterface(IThemeSettings, False) theme_settings.enabled = True directory = queryResourceDirectory('theme', 'foobar') directory.makeDirectory('tiles') self.tiles_directory = directory['tiles'] # clear cache for key in list(self.request.environ.keys())[:]: if key.startswith(CACHE_KEY): del self.request.environ[key]
def setUp(self): # Enable debug mode always to ensure cache is disabled by default Globals.DevelopmentMode = True self.settings = getUtility(IRegistry).forInterface(IThemeSettings) self.settings.enabled = True createThemeFromTemplate(title="linked", description="Generated from test") test_theme_name = createThemeFromTemplate(title="rapidotest", description="Generated from test") theme = getTheme(test_theme_name) applyTheme(theme) import transaction transaction.commit() self.portal = self.layer['portal'] package_dir_path = os.path.join(test_dir_path, 'other') dir = FilesystemResourceDirectory(package_dir_path) provideUtility( dir, provides=IResourceDirectory, name=u'++theme++other') self.browser = Browser(self.layer['app']) self.browser.handleErrors = False
def update(self): processInputs(self.request) self._setup() self.errors = {} form = self.request.form if 'form.button.Cancel' in form: IStatusMessage(self.request).add(_(u"Changes cancelled")) portalUrl = getToolByName(self.context, 'portal_url')() self.redirect("%s/plone_control_panel" % portalUrl) return False if 'form.button.Enable' in form: self.authorize() themeSelection = form.get('themeName', None) if themeSelection: themeData = self.getThemeData(self.availableThemes, themeSelection) applyTheme(themeData) self.settings.enabled = True IStatusMessage(self.request).add(_(u"Theme enabled. Note that this control panel page is never themed.")) self._setup() return True if 'form.button.Disable' in form: self.authorize() applyTheme(None) self.settings.enabled = False IStatusMessage(self.request).add(_(u"Theme disabled.")) self._setup() return True if 'form.button.AdvancedSave' in form: self.authorize() self.settings.readNetwork = form.get('readNetwork', False) themeEnabled = form.get('themeEnabled', False) rules = form.get('rules', None) prefix = form.get('absolutePrefix', None) doctype = str(form.get('doctype', "")) hostnameBlacklist = form.get('hostnameBlacklist', []) parameterExpressions = {} parameterExpressionsList = form.get('parameterExpressions', []) for line in parameterExpressionsList: try: name, expression = line.split('=', 1) parameterExpressions[str(name.strip())] = \ str(expression.strip()) except ValueError: self.errors['parameterExpressions'] = \ _('error_invalid_parameter_expressions', default=u"Please ensure you enter one " u"expression per line, in the " u"format <name> = <expression>." ) themeBase = form.get('themeBase', None) markSpecialLinks = form.get('markSpecialLinks', None) extLinksOpenInNewWindow = form.get('extLinksOpenInNewWindow', None) usePopups = form.get('usePopups', None) iconVisibility = form.get('iconVisibility', None) if not self.errors: # Trigger onDisabled() on plugins if theme was active # previously and rules were changed if self.settings.rules != rules: applyTheme(None) self.settings.enabled = themeEnabled self.settings.rules = rules self.settings.absolutePrefix = prefix self.settings.parameterExpressions = parameterExpressions self.settings.hostnameBlacklist = hostnameBlacklist self.settings.doctype = doctype # Theme base settings if themeBase is not None: self.skinsSettings.theme = themeBase.encode('utf-8') if markSpecialLinks is not None: self.skinsSettings.mark_special_links = markSpecialLinks if extLinksOpenInNewWindow is not None: self.skinsSettings.ext_links_open_new_window = extLinksOpenInNewWindow if usePopups is not None: self.skinsSettings.use_popups = usePopups if iconVisibility is not None: self.skinsSettings.icon_visibility = iconVisibility.encode('utf-8') IStatusMessage(self.request).add(_(u"Changes saved")) self._setup() return True else: IStatusMessage(self.request).add(_(u"There were errors"), 'error') self.redirectToFieldset('advanced') return False if 'form.button.Import' in form: self.authorize() enableNewTheme = form.get('enableNewTheme', False) replaceExisting = form.get('replaceExisting', False) themeArchive = form.get('themeArchive', None) themeZip = None performImport = False try: themeZip = zipfile.ZipFile(themeArchive) except (zipfile.BadZipfile, zipfile.LargeZipFile,): logger.exception("Could not read zip file") self.errors['themeArchive'] = _('error_invalid_zip', default=u"The uploaded file is not a valid Zip archive" ) if themeZip: try: themeData = extractThemeInfo(themeZip, checkRules=False) except (ValueError, KeyError,), e: logger.warn(str(e)) self.errors['themeArchive'] = _('error_no_rules_file', u"The uploaded file does not contain " u"a valid theme archive." ) else: themeContainer = getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: if not replaceExisting: self.errors['themeArchive'] = \ _('error_already_installed', u"This theme is already installed. " u"Select 'Replace existing theme' " u"and re-upload to replace it." ) else: del themeContainer[themeData.__name__] performImport = True else: performImport = True if performImport: themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory(THEME_RESOURCE_NAME, themeData.__name__) if themeDirectory is not None: # If we don't have a rules file, use the template if themeData.rules == u"/++%s++%s/%s" % (THEME_RESOURCE_NAME, themeData.__name__, RULE_FILENAME,): if not themeDirectory.isFile(RULE_FILENAME): templateThemeDirectory = queryResourceDirectory(THEME_RESOURCE_NAME, TEMPLATE_THEME) themeDirectory.writeFile(RULE_FILENAME, templateThemeDirectory.readFile(RULE_FILENAME)) if not themeDirectory.isFile(DEFAULT_THEME_FILENAME): IStatusMessage(self.request).add( _(u"A boilerplate rules.xml was added to your theme, but no index.html file found. Update rules.xml to reference the current theme file."), 'warning', ) plugins = getPlugins() pluginSettings = getPluginSettings(themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated(themeData.__name__, pluginSettings[name], pluginSettings) if enableNewTheme: applyTheme(themeData) self.settings.enabled = True if not self.errors: portalUrl = getToolByName(self.context, 'portal_url')() self.redirect( "%s/++theme++%s/@@theming-controlpanel-mapper" % ( portalUrl, themeData.__name__,) ) return False else: IStatusMessage(self.request).add( _(u"There were errors"), "error" ) self.renderOverlay('upload') return True
def update(self): # XXX: complexity too high: refactoring needed processInputs(self.request) self._setup() self.errors = {} form = self.request.form if 'form.button.Cancel' in form: IStatusMessage(self.request).add(_(u"Changes cancelled")) self.redirect("{0}/@@overview-controlpanel".format(self.site_url)) return False if 'form.button.Enable' in form: self.authorize() themeSelection = form.get('themeName', None) if themeSelection: themeData = self.getThemeData( self.availableThemes, themeSelection ) applyTheme(themeData) self.theme_settings.enabled = True IStatusMessage( self.request ).add( _( u"Theme enabled. Note that this control panel page is " u"never themed." ) ) self._setup() return True if 'form.button.InvalidateCache' in form: self.authorize() policy = theming_policy() policy.invalidateCache() return True if 'form.button.Disable' in form: self.authorize() applyTheme(None) self.theme_settings.enabled = False IStatusMessage(self.request).add(_(u"Theme disabled.")) self._setup() return True if 'form.button.AdvancedSave' in form: self.authorize() self.theme_settings.readNetwork = form.get('readNetwork', False) themeEnabled = form.get('themeEnabled', False) rules = form.get('rules', None) prefix = form.get('absolutePrefix', None) doctype = str(form.get('doctype', "")) hostnameBlacklist = form.get('hostnameBlacklist', []) parameterExpressions = {} parameterExpressionsList = form.get('parameterExpressions', []) for line in parameterExpressionsList: try: name, expression = line.split('=', 1) name = str(name.strip()) expression = str(expression.strip()) parameterExpressions[name] = expression except ValueError: message = _( 'error_invalid_parameter_expressions', default=u"Please ensure you enter one expression per " u"line, in the format <name> = <expression>." ) self.errors['parameterExpressions'] = message themeBase = form.get('themeBase', None) markSpecialLinks = form.get('markSpecialLinks', None) extLinksOpenInNewWindow = form.get('extLinksOpenInNewWindow', None) if not self.errors: # Trigger onDisabled() on plugins if theme was active # previously and rules were changed if self.theme_settings.rules != rules: applyTheme(None) self.theme_settings.enabled = themeEnabled self.theme_settings.rules = rules self.theme_settings.absolutePrefix = prefix self.theme_settings.parameterExpressions = parameterExpressions self.theme_settings.hostnameBlacklist = hostnameBlacklist self.theme_settings.doctype = doctype # Theme base settings if themeBase is not None: if six.PY2: themeBase = themeBase.encode('utf-8') self.pskin.default_skin = themeBase if markSpecialLinks is not None: self.mark_special_links = markSpecialLinks if extLinksOpenInNewWindow is not None: self.ext_links_open_new_window = extLinksOpenInNewWindow IStatusMessage(self.request).add(_(u"Changes saved")) self._setup() return True else: IStatusMessage(self.request).add( _(u"There were errors"), 'error' ) self.redirectToFieldset('advanced') return False if 'form.button.Import' in form: self.authorize() enableNewTheme = form.get('enableNewTheme', False) replaceExisting = form.get('replaceExisting', False) themeArchive = form.get('themeArchive', None) themeZip = None performImport = False try: themeZip = zipfile.ZipFile(themeArchive) except (zipfile.BadZipfile, zipfile.LargeZipFile): logger.exception("Could not read zip file") self.errors['themeArchive'] = _( 'error_invalid_zip', default=u"The uploaded file is not a valid Zip archive" ) if themeZip: try: themeData = extractThemeInfo(themeZip, checkRules=False) except (ValueError, KeyError) as e: logger.warn(str(e)) self.errors['themeArchive'] = _( 'error_no_rules_file', u"The uploaded file does not contain a valid theme " u"archive." ) else: themeContainer = getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: if not replaceExisting: self.errors['themeArchive'] = _( 'error_already_installed', u"This theme is already installed. Select " u"'Replace existing theme' and re-upload to " u"replace it." ) else: del themeContainer[themeData.__name__] performImport = True else: performImport = True if performImport: themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, themeData.__name__ ) if themeDirectory is not None: # If we don't have a rules file, use the template if themeData.rules == u"/++{0:s}++{1:s}/{2:s}".format( THEME_RESOURCE_NAME, themeData.__name__, RULE_FILENAME, ) and not themeDirectory.isFile(RULE_FILENAME): templateThemeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, TEMPLATE_THEME ) themeDirectory.writeFile( RULE_FILENAME, templateThemeDirectory.readFile(RULE_FILENAME) ) if not themeDirectory.isFile(DEFAULT_THEME_FILENAME): IStatusMessage(self.request).add( _( u"A boilerplate rules.xml was added to " u"your theme, but no index.html file " u"found. Update rules.xml to reference " u"the current theme file." ), 'warning', ) plugins = getPlugins() pluginSettings = getPluginSettings(themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated( themeData.__name__, pluginSettings[name], pluginSettings ) if enableNewTheme: applyTheme(themeData) self.theme_settings.enabled = True if not self.errors: self.redirect( "{0}/++theme++{1}/@@theming-controlpanel-mapper".format( self.site_url, themeData.__name__ ) ) return False else: IStatusMessage(self.request).add( _(u"There were errors"), "error" ) self.renderOverlay('upload') return True if 'form.button.CreateTheme' in form: self.authorize() title = form.get('title') description = form.get('description') or '' baseOn = form.get('baseOn', TEMPLATE_THEME) enableImmediately = form.get('enableImmediately', True) if not title: self.errors['title'] = _(u"Title is required") IStatusMessage(self.request).add( _(u"There were errors"), 'error' ) self.renderOverlay('new-theme') return True else: if any(x.__name__ == title for x in getZODBThemes()): self.errors['title'] = _(u"Duplicate title") IStatusMessage(self.request).add( _(u"This title is already in use"), 'error' ) return True name = createThemeFromTemplate(title, description, baseOn) self._setup() if enableImmediately: themeData = self.getThemeData(self.availableThemes, name) applyTheme(themeData) self.theme_settings.enabled = True self.redirect( "{0}/++theme++{1}/@@theming-controlpanel-mapper".format( self.site_url, name ) ) return False if 'form.button.DeleteSelected' in form: self.authorize() toDelete = form.get('themes', []) themeDirectory = getOrCreatePersistentResourceDirectory() for theme in toDelete: del themeDirectory[theme] IStatusMessage(self.request).add(_(u"Theme deleted"), 'info') self._setup() return True return True
def update(self): processInputs(self.request) self._setup() self.errors = {} submitted = False form = self.request.form if 'form.button.Cancel' in form: self.redirect(_(u"Changes canceled.")) return False if 'form.button.BasicSave' in form: self.authorize() submitted = True self.settings.enabled = form.get('enabled', False) themeSelection = form.get('selectedTheme', None) if themeSelection != "_other_": themeData = self.getThemeData(self.availableThemes, themeSelection) applyTheme(themeData) if 'form.button.AdvancedSave' in form: self.authorize() submitted = True self.settings.readNetwork = form.get('readNetwork', False) rules = form.get('rules', None) prefix = form.get('absolutePrefix', None) doctype = str(form.get('doctype', "")) hostnameBlacklist = form.get('hostnameBlacklist', []) parameterExpressions = {} parameterExpressionsList = form.get('parameterExpressions', []) for line in parameterExpressionsList: try: name, expression = line.split('=', 1) parameterExpressions[str(name.strip())] = str(expression.strip()) except ValueError: self.errors['parameterExpressions'] = _('error_invalid_parameter_expressions', default=u"Please ensure you enter one expression per line, in the format <name> = <expression>." ) if not self.errors: # Trigger onDisabled() on plugins if theme was active # previously and rules were changed if self.settings.rules != rules: applyTheme(None) self.settings.rules = rules self.settings.absolutePrefix = prefix self.settings.parameterExpressions = parameterExpressions self.settings.hostnameBlacklist = hostnameBlacklist self.settings.doctype = doctype if 'form.button.Import' in form: self.authorize() submitted = True enableNewTheme = form.get('enableNewTheme', False) replaceExisting = form.get('replaceExisting', False) themeArchive = form.get('themeArchive', None) themeZip = None performImport = False try: themeZip = zipfile.ZipFile(themeArchive) except (zipfile.BadZipfile, zipfile.LargeZipFile,): logger.exception("Could not read zip file") self.errors['themeArchive'] = _('error_invalid_zip', default=u"The uploaded file is not a valid Zip archive" ) if themeZip: try: themeData = extractThemeInfo(themeZip) except (ValueError, KeyError,), e: logger.warn(str(e)) self.errors['themeArchive'] = _('error_no_rules_file', u"The uploaded file does not contain a valid theme archive." ) else: themeContainer = getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: if not replaceExisting: self.errors['themeArchive'] = _('error_already_installed', u"This theme is already installed. Select 'Replace existing theme' and re-upload to replace it." ) else: del themeContainer[themeData.__name__] performImport = True else: performImport = True if performImport: themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory(THEME_RESOURCE_NAME, themeData.__name__) if themeDirectory is not None: plugins = getPlugins() pluginSettings = getPluginSettings(themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated(themeData.__name__, pluginSettings[name], pluginSettings) if enableNewTheme: applyTheme(themeData) self.settings.enabled = True
def update(self): form = self.request.form self.settings = getUtility(IRegistry).forInterface( IThemeSettings, False) gallerysettings = getUtility(IRegistry).forInterface( IThemeGallerySettingsSchema, False) url = gallerysettings.tgserver_url if not url.endswith('/'): url += '/' self.base_url = '%s__rest__/cms/content:themes' % url self.api = '%s__rest__/cms/applications' % url if 'form.button.install' in form: theme = form.get('theme_uuid', None) if theme is not None: tfile = self.loadTheme(theme) try: themeZip = zipfile.ZipFile(tfile) except ( zipfile.BadZipfile, zipfile.LargeZipFile, ): logger.exception("Could not read zip file") self.error = u"The uploaded file is not a valid Zip archive" return if themeZip: try: themeData = extractThemeInfo(themeZip) except ( ValueError, KeyError, ), e: logger.warn(str(e)) self.error = u"The uploaded file does not contain a valid theme archive." else: themeContainer = getOrCreatePersistentResourceDirectory( ) themeExists = themeData.__name__ in themeContainer if themeExists: del themeContainer[themeData.__name__] themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, themeData.__name__) if themeDirectory is not None: plugins = getPlugins() pluginSettings = getPluginSettings( themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated(themeData.__name__, pluginSettings[name], pluginSettings) applyTheme(themeData) self.settings.enabled = True IStatusMessage( self.request).add("Theme has been installed.")
def deactivateTheme(): applyTheme(None)
def find_translated_anchor_test(self, cor, defaultLanguage): """ Verifica se os links acontent, anavigation e afooter estão presentes e traduzidos. """ transaction.begin() supportedLanguages = ['en', 'es', 'pt-br'] self.ltool.manage_setLanguageSettings( defaultLanguage, supportedLanguages, setUseCombinedLanguageCodes=True) transaction.commit() theme = getTheme(cor) applyTheme(theme) self.browser.open(self.portal.absolute_url()) contents = self.browser.contents.decode('utf-8') if defaultLanguage == 'en': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">content</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">navigation</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">footer</a>', contents, ) elif defaultLanguage == 'es': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">contenido</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">navegación</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">pie de página</a>', contents, ) elif defaultLanguage == 'pt-br': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">conteúdo</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">menu</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">rodapé</a>', contents, )
class ThemingControlpanel(BrowserView): def __call__(self): ptool = getToolByName(self.context, 'portal_properties') self.props = ptool.site_properties self.pskin = getToolByName(self.context, 'portal_skins') if self.update(): return self.index() return '' def _setup(self): self.settings = getUtility(IRegistry).forInterface( IThemeSettings, False ) self.zodbThemes = getZODBThemes() self.availableThemes = getAvailableThemes() self.selectedTheme = self.getSelectedTheme( self.availableThemes, self.settings.rules ) self.overlay = '' self.skinsVocabulary = getUtility( IVocabularyFactory, name='plone.app.vocabularies.Skins' )( self.context ) # Set response header to make sure control panel is never themed self.request.response.setHeader('X-Theme-Disabled', '1') def redirect(self, url): self.request.response.redirect(url) def get_mark_special_links(self): msl = getattr(self.props, 'mark_special_links', False) if msl == 'true': return True return False def set_mark_special_links(self, value): if value: mark_special_links = 'true' else: mark_special_links = 'false' if self.props.hasProperty('mark_special_links'): self.props.manage_changeProperties(mark_special_links=mark_special_links) else: self.props.manage_addProperty( 'mark_special_links', mark_special_links, 'string') mark_special_links = property(get_mark_special_links, set_mark_special_links) def get_ext_links_open_new_window(self): elonw = self.props.external_links_open_new_window if elonw == 'true': return True return False def set_ext_links_open_new_window(self, value): if value: self.props.manage_changeProperties(external_links_open_new_window='true') else: self.props.manage_changeProperties(external_links_open_new_window='false') ext_links_open_new_window = property(get_ext_links_open_new_window, set_ext_links_open_new_window) def update(self): # XXX: complexity too high: refactoring needed processInputs(self.request) self._setup() self.errors = {} form = self.request.form if 'form.button.Cancel' in form: IStatusMessage(self.request).add(_(u"Changes cancelled")) portalUrl = getToolByName(self.context, 'portal_url')() self.redirect("{0:s}/plone_control_panel".format(portalUrl)) return False if 'form.button.Enable' in form: self.authorize() themeSelection = form.get('themeName', None) if themeSelection: themeData = self.getThemeData( self.availableThemes, themeSelection ) applyTheme(themeData) self.settings.enabled = True IStatusMessage( self.request ).add( _( u"Theme enabled. Note that this control panel page is " u"never themed." ) ) self._setup() return True if 'form.button.Disable' in form: self.authorize() applyTheme(None) self.settings.enabled = False IStatusMessage(self.request).add(_(u"Theme disabled.")) self._setup() return True if 'form.button.AdvancedSave' in form: self.authorize() self.settings.readNetwork = form.get('readNetwork', False) themeEnabled = form.get('themeEnabled', False) rules = form.get('rules', None) prefix = form.get('absolutePrefix', None) doctype = str(form.get('doctype', "")) hostnameBlacklist = form.get('hostnameBlacklist', []) parameterExpressions = {} parameterExpressionsList = form.get('parameterExpressions', []) for line in parameterExpressionsList: try: name, expression = line.split('=', 1) name = str(name.strip()) expression = str(expression.strip()) parameterExpressions[name] = expression except ValueError: message = _( 'error_invalid_parameter_expressions', default=u"Please ensure you enter one expression per " u"line, in the format <name> = <expression>." ) self.errors['parameterExpressions'] = message themeBase = form.get('themeBase', None) markSpecialLinks = form.get('markSpecialLinks', None) extLinksOpenInNewWindow = form.get('extLinksOpenInNewWindow', None) if not self.errors: # Trigger onDisabled() on plugins if theme was active # previously and rules were changed if self.settings.rules != rules: applyTheme(None) self.settings.enabled = themeEnabled self.settings.rules = rules self.settings.absolutePrefix = prefix self.settings.parameterExpressions = parameterExpressions self.settings.hostnameBlacklist = hostnameBlacklist self.settings.doctype = doctype # Theme base settings if themeBase is not None: self.pskin.default_skin = themeBase.encode('utf-8') if markSpecialLinks is not None: self.mark_special_links = markSpecialLinks if extLinksOpenInNewWindow is not None: self.ext_links_open_new_window = extLinksOpenInNewWindow IStatusMessage(self.request).add(_(u"Changes saved")) self._setup() return True else: IStatusMessage(self.request).add( _(u"There were errors"), 'error' ) self.redirectToFieldset('advanced') return False if 'form.button.Import' in form: self.authorize() enableNewTheme = form.get('enableNewTheme', False) replaceExisting = form.get('replaceExisting', False) themeArchive = form.get('themeArchive', None) themeZip = None performImport = False try: themeZip = zipfile.ZipFile(themeArchive) except (zipfile.BadZipfile, zipfile.LargeZipFile,): logger.exception("Could not read zip file") self.errors['themeArchive'] = _( 'error_invalid_zip', default=u"The uploaded file is not a valid Zip archive" ) if themeZip: try: themeData = extractThemeInfo(themeZip, checkRules=False) except (ValueError, KeyError,), e: logger.warn(str(e)) self.errors['themeArchive'] = _( 'error_no_rules_file', u"The uploaded file does not contain a valid theme " u"archive." ) else: themeContainer = getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: if not replaceExisting: self.errors['themeArchive'] = _( 'error_already_installed', u"This theme is already installed. Select " u"'Replace existing theme' and re-upload to " u"replace it." ) else: del themeContainer[themeData.__name__] performImport = True else: performImport = True if performImport: themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, themeData.__name__ ) if themeDirectory is not None: # If we don't have a rules file, use the template if themeData.rules == u"/++{0:s}++{1:s}/{2:s}".format( THEME_RESOURCE_NAME, themeData.__name__, RULE_FILENAME, ) and not themeDirectory.isFile(RULE_FILENAME): templateThemeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, TEMPLATE_THEME ) themeDirectory.writeFile( RULE_FILENAME, templateThemeDirectory.readFile(RULE_FILENAME) ) if not themeDirectory.isFile(DEFAULT_THEME_FILENAME): IStatusMessage(self.request).add( _( u"A boilerplate rules.xml was added to " u"your theme, but no index.html file " u"found. Update rules.xml to reference " u"the current theme file." ), 'warning', ) plugins = getPlugins() pluginSettings = getPluginSettings(themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated( themeData.__name__, pluginSettings[name], pluginSettings ) if enableNewTheme: applyTheme(themeData) self.settings.enabled = True if not self.errors: portalUrl = getToolByName(self.context, 'portal_url')() self.redirect( "{0}/++theme++{1}/@@theming-controlpanel-mapper".format( portalUrl, themeData.__name__ ) ) return False else: IStatusMessage(self.request).add( _(u"There were errors"), "error" ) self.renderOverlay('upload') return True if 'form.button.CreateTheme' in form: self.authorize() title = form.get('title') description = form.get('description') or '' baseOn = form.get('baseOn', TEMPLATE_THEME) enableImmediately = form.get('enableImmediately', True) if not title: self.errors['title'] = _(u"Title is required") IStatusMessage(self.request).add( _(u"There were errors"), 'error' ) self.renderOverlay('new-theme') return True else: if any(x.__name__ == title for x in getZODBThemes()): self.errors['title'] = _(u"Duplicate title") IStatusMessage(self.request).add( _(u"This title is already in use"), 'error' ) return True name = createThemeFromTemplate(title, description, baseOn) self._setup() if enableImmediately: themeData = self.getThemeData(self.availableThemes, name) applyTheme(themeData) self.settings.enabled = True portalUrl = getToolByName(self.context, 'portal_url')() self.redirect( "{0}/++theme++{1}/@@theming-controlpanel-mapper".format( portalUrl, name ) ) return False if 'form.button.DeleteSelected' in form: self.authorize() toDelete = form.get('themes', []) themeDirectory = getOrCreatePersistentResourceDirectory() for theme in toDelete: del themeDirectory[theme] IStatusMessage(self.request).add(_(u"Theme deleted"), 'info') self._setup() return True return True
def find_translated_anchor_test(self, cor, defaultLanguage): """ Verifica se os links acontent, anavigation e afooter estão presentes e traduzidos. """ transaction.begin() supportedLanguages = ['en', 'es', 'pt-br'] self.ltool.manage_setLanguageSettings(defaultLanguage, supportedLanguages, setUseCombinedLanguageCodes=True) transaction.commit() theme = getTheme(cor) applyTheme(theme) self.browser.open(self.portal.absolute_url()) contents = self.browser.contents.decode('utf-8') if defaultLanguage == 'en': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">content</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">navigation</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">footer</a>', contents, ) elif defaultLanguage == 'es': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">contenido</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">navegación</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">pie de página</a>', contents, ) elif defaultLanguage == 'pt-br': # Testa se a âncora para o conteúdo aparece. self.assertIn( u'<a name="acontent" id="acontent" class="anchor">conteúdo</a>', contents, ) # Testa se a âncora para o menu aparece. self.assertIn( u'<a name="anavigation" id="anavigation" class="anchor">menu</a>', contents, ) # Testa se a âncora para o rodapé aparece. self.assertIn( u'<a name="afooter" id="afooter" class="anchor">rodapé</a>', contents, )
def update(self): # XXX: complexity too high: refactoring needed processInputs(self.request) self._setup() self.errors = {} form = self.request.form if 'form.button.Cancel' in form: IStatusMessage(self.request).add(_(u"Changes cancelled")) portalUrl = getToolByName(self.context, 'portal_url')() self.redirect("{0:s}/@@overview-controlpanel".format(portalUrl)) return False if 'form.button.Enable' in form: self.authorize() themeSelection = form.get('themeName', None) if themeSelection: themeData = self.getThemeData(self.availableThemes, themeSelection) applyTheme(themeData) self.theme_settings.enabled = True IStatusMessage(self.request).add( _(u"Theme enabled. Note that this control panel page is " u"never themed.")) self._setup() return True if 'form.button.InvalidateCache' in form: self.authorize() policy = theming_policy() policy.invalidateCache() return True if 'form.button.Disable' in form: self.authorize() applyTheme(None) self.theme_settings.enabled = False IStatusMessage(self.request).add(_(u"Theme disabled.")) self._setup() return True if 'form.button.AdvancedSave' in form: self.authorize() self.theme_settings.readNetwork = form.get('readNetwork', False) themeEnabled = form.get('themeEnabled', False) rules = form.get('rules', None) prefix = form.get('absolutePrefix', None) doctype = str(form.get('doctype', "")) hostnameBlacklist = form.get('hostnameBlacklist', []) parameterExpressions = {} parameterExpressionsList = form.get('parameterExpressions', []) for line in parameterExpressionsList: try: name, expression = line.split('=', 1) name = str(name.strip()) expression = str(expression.strip()) parameterExpressions[name] = expression except ValueError: message = _( 'error_invalid_parameter_expressions', default=u"Please ensure you enter one expression per " u"line, in the format <name> = <expression>.") self.errors['parameterExpressions'] = message themeBase = form.get('themeBase', None) markSpecialLinks = form.get('markSpecialLinks', None) extLinksOpenInNewWindow = form.get('extLinksOpenInNewWindow', None) if not self.errors: # Trigger onDisabled() on plugins if theme was active # previously and rules were changed if self.theme_settings.rules != rules: applyTheme(None) self.theme_settings.enabled = themeEnabled self.theme_settings.rules = rules self.theme_settings.absolutePrefix = prefix self.theme_settings.parameterExpressions = parameterExpressions self.theme_settings.hostnameBlacklist = hostnameBlacklist self.theme_settings.doctype = doctype # Theme base settings if themeBase is not None: self.pskin.default_skin = themeBase.encode('utf-8') if markSpecialLinks is not None: self.mark_special_links = markSpecialLinks if extLinksOpenInNewWindow is not None: self.ext_links_open_new_window = extLinksOpenInNewWindow IStatusMessage(self.request).add(_(u"Changes saved")) self._setup() return True else: IStatusMessage(self.request).add(_(u"There were errors"), 'error') self.redirectToFieldset('advanced') return False if 'form.button.Import' in form: self.authorize() enableNewTheme = form.get('enableNewTheme', False) replaceExisting = form.get('replaceExisting', False) themeArchive = form.get('themeArchive', None) themeZip = None performImport = False try: themeZip = zipfile.ZipFile(themeArchive) except ( zipfile.BadZipfile, zipfile.LargeZipFile, ): logger.exception("Could not read zip file") self.errors['themeArchive'] = _( 'error_invalid_zip', default=u"The uploaded file is not a valid Zip archive") if themeZip: try: themeData = extractThemeInfo(themeZip, checkRules=False) except ( ValueError, KeyError, ), e: logger.warn(str(e)) self.errors['themeArchive'] = _( 'error_no_rules_file', u"The uploaded file does not contain a valid theme " u"archive.") else: themeContainer = getOrCreatePersistentResourceDirectory() themeExists = themeData.__name__ in themeContainer if themeExists: if not replaceExisting: self.errors['themeArchive'] = _( 'error_already_installed', u"This theme is already installed. Select " u"'Replace existing theme' and re-upload to " u"replace it.") else: del themeContainer[themeData.__name__] performImport = True else: performImport = True if performImport: themeContainer.importZip(themeZip) themeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, themeData.__name__) if themeDirectory is not None: # If we don't have a rules file, use the template if themeData.rules == u"/++{0:s}++{1:s}/{2:s}".format( THEME_RESOURCE_NAME, themeData.__name__, RULE_FILENAME, ) and not themeDirectory.isFile(RULE_FILENAME): templateThemeDirectory = queryResourceDirectory( THEME_RESOURCE_NAME, TEMPLATE_THEME) themeDirectory.writeFile( RULE_FILENAME, templateThemeDirectory.readFile(RULE_FILENAME)) if not themeDirectory.isFile(DEFAULT_THEME_FILENAME): IStatusMessage(self.request).add( _(u"A boilerplate rules.xml was added to " u"your theme, but no index.html file " u"found. Update rules.xml to reference " u"the current theme file."), 'warning', ) plugins = getPlugins() pluginSettings = getPluginSettings(themeDirectory, plugins) if pluginSettings is not None: for name, plugin in plugins: plugin.onCreated(themeData.__name__, pluginSettings[name], pluginSettings) if enableNewTheme: applyTheme(themeData) self.theme_settings.enabled = True if not self.errors: portalUrl = getToolByName(self.context, 'portal_url')() self.redirect( "{0}/++theme++{1}/@@theming-controlpanel-mapper".format( portalUrl, themeData.__name__)) return False else: IStatusMessage(self.request).add(_(u"There were errors"), "error") self.renderOverlay('upload') return True
def upgrade_1001_to_1002(context): # 1002 untangles the dependency hell that was default <- sunburst <- izug. # Now, sunburst and izug.basetheme both have their own profiles. # Since the default profile therefore has only the bare essential styles # it needs to be decided on upgrade which theme was used, the old css # files need to be removed and the theme profile needs to be applied. # acquire the current theme skins = getToolByName(context, 'portal_skins') theme = skins.getDefaultSkin() # find the right profile to use profilemap = { 'iZug Base Theme': 'izug_basetheme', 'Sunburst Theme': 'sunburst' } if theme not in profilemap: log.info("Theme %s is not supported by seantis.dir.events" % theme) profile = 'default' else: profile = profilemap[theme] # remove all existing event stylesheets css_registry = getToolByName(context, 'portal_css') stylesheets = css_registry.getResourcesDict() ids = [i for i in stylesheets if 'resource++seantis.dir.events.css' in i] map(css_registry.unregisterResource, ids) # remove the old diazo theme and disable theming for now themes = getOrCreatePersistentResourceDirectory() to_delete = [ 'izug.seantis.dir.events.theme', 'vbeo.seantis.dir.events.theme' ] for theme in to_delete: try: del themes[theme] except KeyError: continue applyTheme(None) setup = getToolByName(context, 'portal_setup') # reapply the chosen profile setup.runAllImportStepsFromProfile( 'profile-seantis.dir.events:%s' % profile ) # there are currently two installations, bern and zug if getSite().id == 'vbeo': setup.runAllImportStepsFromProfile( 'profile-vbeo.seantis.dir.events:default' ) else: setup.runAllImportStepsFromProfile( 'profile-izug.seantis.dir.events:default' )