Example #1
0
    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)
Example #2
0
    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,
        )
Example #3
0
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)
Example #4
0
    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)
Example #5
0
    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))
Example #8
0
    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)
Example #9
0
    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
Example #10
0
 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())
Example #11
0
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,
     )
Example #16
0
    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 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)
Example #18
0
    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']
Example #19
0
    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']
Example #20
0
    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)
Example #21
0
    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 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)
Example #23
0
    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'])
Example #24
0
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
Example #26
0
    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, {})
Example #27
0
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)
Example #28
0
    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')
Example #29
0
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)
Example #31
0
    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')
Example #32
0
    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')
Example #33
0
    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, {})
Example #34
0
    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, {})
Example #35
0
    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)
Example #36
0
    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]
Example #37
0
    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
Example #38
0
    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
Example #39
0
    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
Example #40
0
    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.")
Example #42
0
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,
            )
Example #44
0
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
Example #45
0
    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
Example #47
0
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'
        )