==================================
Installing Themes Through Products
==================================

:Revision: $Id: installing-xml-themes.txt 31271 2006-01-03 16:32:11Z dkuhlman $

.. sectnum::    :depth: 4
.. contents::   :depth: 4


Requires CPSIO 0.3.0


Importing Themes
================

Concept code showing how to install themes saved in XML format
from the filesystem (requires CPSIO >= 0.3.0)

- 'filepath' is the path to the file on the local filesystem.
- 'filename' is the file's name (e.g. 'theme.zip').

Sample code::

    from Products.CMFCore.utils import getToolByName
    from ZPublisher.HTTPRequest import FileUpload

    class DummyFileUpload:
        def __init__(self, **kw):
            for k, v in kw.items():
                setattr(self, k, v)

    class Installer:
        """ a product installer """

        def installTheme(self, filepath='', filename=''):
            """Install a theme (XML)
            """
            tmtool = getToolByName(self, 'portal_themes')

            fs = DummyFileUpload(
                file=open(filepath, 'r'),
                headers={'Content-Type': 'application/zip'},
                filename=filename)

            tmtool.manage_xmlImport(
                FileUpload(fs),
                options=['import_overwrite'],
                plugin='CPSSkinsImporter')


Configuring Theme Settings
==========================

Theme settings can be imported with CPSIO (> 0.3.?).

To import theme settings, use the same code as above with the
following parameters::

    ....
    tmtool.manage_xmlImport(
        FileUpload(fs),
        options=['import_theme_settings'],
        plugin='CPS3Importer')
    ....


Example Code
============

Some functional code ready to be inserted in your install.py script.
(requires CPSIO and CPSInstaller)::

    from Products.CPSInstaller.CPSInstaller import CPSInstaller

    class DummyFileUpload:
        def __init__(self, **kw):
            for k, v in kw.items():
                setattr(self, k, v)

    class ProductInstaller(CPSInstaller):
        """ Installer class
        """

        def package_home(self, name):
            """Returns path to Products.name"""
            m = sys.modules['Products.%s' % name]
            return (m.__path__[0])

        def install(self):
            """
            - 'default.zip' is a theme
            - 'settings.zip' are theme settings

            they are located in the 'themes/' folder of your product.
            """"

            # install the theme
            self.installTheme('default.zip')

            # install the theme settings
            self.installThemeSettings('settings.zip')


        def installTheme(self, theme=''):
            """Install a theme (XML)"""

            themesdir = os.path.join(self.product_home, 'themes')
            filepath = os.path.join(themesdir, theme)

            tmtool = self.getTool('portal_themes')
            fs = DummyFileUpload(
                file=open(filepath, 'r'),
                headers={'Content-Type': 'application/zip'},
                filename=theme)
            tmtool.manage_xmlImport(
                FileUpload(fs),
                options=['import_overwrite'],
                plugin='CPSSkinsImporter')
            self.log('Importing theme %s' % theme)


        def installThemeSettings(self, filename):
            """Install theme settings (XML)"""

            themesdir = os.path.join(self.product_home, 'themes')
            filepath = os.path.join(themesdir, filename)

            tmtool = self.getTool('portal_themes')
            fs = DummyFileUpload(
                file=open(filepath, 'r'),
                headers={'Content-Type': 'application/zip'},
                filename=filename)
            tmtool.manage_xmlImport(
                FileUpload(fs),
                options=['import_theme_settings'],
                plugin='CPS3Importer')
            self.log('Importing themes settings %s' % filename)


.. Emacs
.. Local Variables:
.. mode: rst
.. End:
.. Vim
.. vim: set filetype=rst:

