Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

Download
ActivePython
INSTALL>
pypm install ftw.inflator

How to install ftw.inflator

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install ftw.inflator
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
Windows (64-bit)
Mac OS X (10.5+)
1.1.2 Available View build log
Linux (32-bit)
1.1.2 Available View build log
Linux (64-bit)
1.1.2 Available View build log
 
License
GPL2
Lastest release
version 1.1.2 on Jun 2nd, 2013

ftw.inflator

This packages helps predefining a Plone site setup including content creation (using generic setup), defining multiple bundles and a wizard for installing a new site with a bundle.

Features
  • A simplified site setup wizard. The wizard can be customized and branded.
  • A bundle system for defining variants in the setup configuration.
  • A generic setup site creation import step which can be used in the bundles for creating initial content. It can be used without using the setup wizard and bundle system.
Installation
  • Add ftw.inflator to your buildout configuration:

System Message: ERROR/3 (<string>, line 28)

Unknown directive type "code".

.. code:: ini

    [instance]
    eggs +=
        ftw.inflator


Compatibility

Runs with Plone 4.1, 4.2 or 4.3.

Setup wizard

On the manage_main view of the Zope app there is an additional button for installing your product. It leads to the site setup wizard where an ID and a bundle can be selected.

The setup wizard allows to select one of a set of predefined bundles. See the bundle section for details on how to define bundles.

https://raw.github.com/4teamwork/ftw.inflator/master/docs/inflate.png
Wizard customizations

The product name and logo can easily be customized through ZCML:

System Message: ERROR/3 (<string>, line 59)

Unknown directive type "code".

.. code:: xml

    <configure
        xmlns="http://namespaces.zope.org/zope"
        xmlns:inflator="http://namespaces.zope.org/inflator"
        i18n_domain="my.package">

        <include package="ftw.inflator" file="meta.zcml" />

        <inflator:customize
            product="Product Name"
            image="resources/product-logo.png"
            />

    </configure>


Bundle system

A bundle defines a list of profiles which are automatically applied when creating a new Plone site with this bundle.

It has a base-profile (defaults to the Plone default base profile without default content).

Defining bundles

The bundles are defined in ZCML:

System Message: ERROR/3 (<string>, line 90)

Unknown directive type "code".

.. code:: xml

    <configure
        xmlns="http://namespaces.zope.org/zope"
        xmlns:inflator="http://namespaces.zope.org/inflator"
        i18n_domain="my.package">

        <include package="ftw.inflator" file="meta.zcml" />

        <inflator:bundle
            title="ftw.inflator example bundle one"
            profiles="plonetheme.sunburst:default
                      my.policy:default
                      my.policy:init-content"
            />

    </configure>

ZCML-Attributes
title
The (translatable) title of the bundle, shown in the setup wizard.
profiles
One or multiple Generic Setup profiles (without profile--prefix).
description (optional)
The description of the bundle, shown in the setup wizard.
base (optional)
The Generic Setup base profile for creating the plone site. This defaults to Products.CMFPlone:plone, the default plone base profile without content creation. Using Products.CMFPlone:plone-content will generate the default example content.
standard (optional)
By using the standard flag (standard="True") you can define product bundles. When registering custom bundles later without flagging them as standard, they will appear above the standard bundles in the setup wizard and top is selected.

Full ZCML example:

System Message: ERROR/3 (<string>, line 135)

Unknown directive type "code".

.. code:: xml

    <configure
        xmlns="http://namespaces.zope.org/zope"
        xmlns:inflator="http://namespaces.zope.org/inflator"
        i18n_domain="ftw.inflator">

        <include package="ftw.inflator" file="meta.zcml" />

        <inflator:bundle
            title="MyProduct with sunburst"
            description="Installs MyProduct with the sunburst theme and plone default content"
            profiles="plonetheme.sunburst:default
                      my.product:default"
            base="Products.CMFPlone:plone-content"
            standard="True"
            />

    </configure>


Setting the language

When installing a Plone site with the default add-site view, the language is set in the Products.CMFPlone:plone-content, which also creates example content. This makes it hard to setup the language without creating the example content.

To solve this issue ftw.inflator provides a ftw.inflator:setup-language generic setup profile, meant to be used while setting up a bundle. You can add it to the list of bundle profiles. This sets the language of the Plone site to the one selected in the setup wizard. Using it as a dependency (in metadata.xml) is not recommended, since it is not meant to be used on a existing plone site.

Example usage in bundle definition:

System Message: ERROR/3 (<string>, line 172)

Unknown directive type "code".

.. code:: xml

    <configure
        xmlns="http://namespaces.zope.org/zope"
        xmlns:inflator="http://namespaces.zope.org/inflator"
        i18n_domain="my.package">

        <include package="ftw.inflator" file="meta.zcml" />

        <inflator:bundle
            title="ftw.inflator example bundle one"
            profiles="ftw.inflator:setup-language
                      my.policy:default"
            />

    </configure>


Content creation

The content creation allows to define a content_creation folder in any generic setup profile folder, containing JSON-files with definitions of the content to create. The content is created when the generic setup profile is applied.

Content creation features
  • JSON based definition
  • support for tree structure
  • internationalization of strings
  • construct instances of any archetypes FTIs
  • add file- and image-fields
  • create topic criterions
  • execute workflow transition on creation
  • create placeful workflow policies
  • set properties
  • set constraint types
  • set per-object provided interfaces
  • reindexing the catalog
Structure

Add a content_creation folder to your generic setup profile. All content creation configurations are within this folder. You can add as many *.json-files as you want - they will be read and executed in order of the sorted filename (use integer prefixes for sorting them easily).

Folder creation example

For creating content create a JSON file ( e.g. profiles/default/content_creation/01-foo-folder.json) and insert a JSON syntax list of hashes (dicts). Each hash creates a new object. Example creating a folder with title "Foo" at /Plone/foo:

System Message: ERROR/3 (<string>, line 232)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo"
        }
    ]


Tree structure example

For nested structures it sometimes useful to define the JSON as tree. Using the tree structure it is not necessary to repeat the path of the parent:

System Message: ERROR/3 (<string>, line 249)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo",
            "_children": [

                {
                    "_id": "bar",
                    "_type": "Folder",
                    "title": "Bar"
                }

            ]
        }
    ]

Be sure that the root node has a _path and all nodes in a _children list have _id instead of _path. The path will then be automatically concatenated.

Internationalization

Using the key:translate(domain) syntax in keys, the respective string value is translated to the current default language of the Plone site. When creating content while installing a bundle with inflator, be sure to install the generic setup profile ftw.inflator:setup-language before creating the content. This will make sure the language is properly configured.

Example:

System Message: ERROR/3 (<string>, line 285)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title:translate(my.domain)": "Foo",
            "_children": [

                {
                    "_id:translate(my.domain)": "bar",
                    "_type": "Folder",
                    "title": "Bar"
                }

            ]
        }
    ]



Creating / setting properties

Properties can easily be created. If there already is a property (because the object exists already), it is updated.

Example:

System Message: ERROR/3 (<string>, line 315)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo",
            "_properties": {
                "layout": ["string", "folder_listing_view"]
            }
        }
    ]


Configuring constrain types

For configuring the addable types on a folder, use the _constrain_types keyword:

System Message: ERROR/3 (<string>, line 335)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo",
            "_constrain_types": {
                "locally": ["Folder", "Document"],
                "immediately": ["Folder"]
            }
        }
    ]



Provide additional interfaces

By passing a list of dottednames as _interfaces those interfaces will automatically be provided (alsoProvides) by the created object:

System Message: ERROR/3 (<string>, line 357)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo",
            "_interfaces": [
                "ftw.inflator.tests.interfaces.IFoo",
                "remove:foo.bar.interfaces.IBar"
            ]
        }
    ]

By prefixing the dotted name with remove:, directly provided interfaces can be removed (noLongerProvides).

Files and images

File- and image-fields can easily be filled by using the :file postfix, providing a relative path to the file to "upload":

System Message: ERROR/3 (<string>, line 381)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "files/example-file",
            "_type": "File",
            "title": "example file",
            "file:file": "files/examplefile.txt"
        }
    ]


Workflow transitions

With the _transitions keyword it is possible to execute a workflow transition upon content creation:

System Message: ERROR/3 (<string>, line 399)

Unknown directive type "code".

.. code:: javascript

    [
        {
            "_path": "foo",
            "_type": "Folder",
            "title": "Foo",
            "_transitions": "publish"
        }
    ]

Placeful workflow policies

When placeful workflow policies are installed it is possible to activate them on a folder using the _placefulworkflow keyword:

System Message: ERROR/3 (<string>, line 416)

Unknown directive type "code".

.. code:: javascript

      [
          {
              "_path": "intranet",
              "_type": "Folder",
              "title": "Intranet",
              "_placefulworkflow": ["intranet", "intranet"]
          }
      ]

You need to install the Generic Setup profile Products.CMFPlacefulWorkflow:CMFPlacefulWorkflow for using placeful workflow policies.

Annotations

With the _annotations it is possible to set simple annotations on the object. Values of type dict are converted to PersistentMapping, those of type list are converted to PersistentList recursively. Example:

System Message: ERROR/3 (<string>, line 440)

Unknown directive type "code".

.. code:: javascript

      [
          {
              "_path": "intranet",
              "_type": "Folder",
              "title": "Intranet",
              "_annotations": {"foo": {"bar": [1, 2, 3]}}
          }
      ]


UUID Lookup

Sometimes you need to have the UUID of another object. Since the UUID is generated randomly when creating the object you cannot predict it in a .json-file. The UUID lookup helps you here:

System Message: ERROR/3 (<string>, line 460)

Unknown directive type "code".

.. code:: javascript


      [
          {
              "_path": "foo",
              "_type": "MyType",
              "title": "Foo",
              "relations": "resolveUUID::/bar"
          }
      ]

Using the resolveUUID::path syntax the value is replaced with UUID of the object which has the path. You can prefix the value with a / for making it relative to the site root, otherwise it is relative to the item it is defined in ("Foo" in the above example).

Changelog

1.1.2 (2013-05-30)
  • Make sure that the Products.CMFPlone ZMI patches are applied prior to our patches. [jone]
1.1.1 (2013-05-24)
  • Support UTF-8 encoded strings as value for :translate(). [treinhard]
1.1 (2013-02-27)
  • Implement UUID lookup. [jone]
  • Add Dexterity support to content creation. Use the ftw.inflator[dexterity] extras. [jone]
  • Run content creation after type creation. [jone]
  • Move site creation into bundle class, so that a site with a bundle can be created without using the view. This is useful for tests or automated setups. [jone]
  • Support internationalization with key:translate(domain) key syntax. [jone]
  • Add support for nested tree structures. [jone]
1.0.1 (2013-02-13)
  • Fix bad page template expression. [jone]
1.0 (2013-02-13)
  • Initial implementation. [jone]

Subscribe to package updates

Last updated Jun 2nd, 2013

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.