Export / Import
===============
XML Adapters to be used within GenericSetup profiles.

    >>> from zope.component import queryMultiAdapter
    >>> from Products.GenericSetup.interfaces import IBody
    >>> from Products.GenericSetup.testing import DummySetupEnviron
    >>> from Products.CMFCore.utils import getToolByName

Exporter

    >>> self.loginAsPortalOwner()
    >>> rtool = getToolByName(portal, 'portal_relations')
    >>> exporter = importer = queryMultiAdapter((rtool, DummySetupEnviron()), IBody)
    >>> exporter
    <eea.relations.exportimport.tool.RelationsToolXMLAdapter object at ...>

As ContentType is a faceted navigable container, you can import/export faceted
criteria using GenericSetup profile.





         WARNING - WARNING -WARNING -WARNING -WARNING

    This will replace all your manual faceted configuration, so

          USE IT ONLY IF YOU KNOW WHAT YOU'RE DOING.
       DO NOT ADD <criteria> TAG IF YOU DON'T WANT TO
            OVERWRITE FACETED CONFIGURATION.

        BACKUP YOUR portal_relations CONFIGURATION
               BEFORE IMPORTING ANY PROFILE.

         WARNING - WARNING -WARNING -WARNING -WARNING





So let's remove all default faceted criteria for generic content-type:

    >>> importer.body = '''<?xml version="1.0"?>
    ... <object name="portal_relations">
    ...   <object name="all">
    ...     <criteria/>
    ...   </object>
    ... </object>
    ... '''

See default faceted portal types

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="all" meta_type="EEARelationsContentType">
      <property name="title">All</property>
      <property name="ct_type"></property>
      <property
         name="ct_interface">eea.relations.content.interfaces.IBaseObject</property>
     <property
         name="ct_default_location">python:None</property>
     </object>
     <object name="all-all" meta_type="EEAPossibleRelation">
      <property name="from">all</property>
      <property name="to">all</property>
      <property name="title">All -&gt; All</property>
      <property name="forward_label"></property>
      <property name="backward_label"></property>
      <property name="description"></property>
      <property name="required">False</property>
      <property name="required_for"/>
     </object>
    </object>

Purge all children

    >>> importer.body = '''<?xml version="1.0"?>
    ... <object name="portal_relations" purge="True" />
    ... '''
    >>> print exporter.body
     <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool"/>

Import some data

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="folder" meta_type="EEARelationsContentType">
    ...   <property name="title">Folder</property>
    ...   <property name="ct_type">Folder</property>
    ...   <property name="ct_interface"></property>
    ...   <criteria/>
    ...  </object>
    ...  <object name="folder-to-folder" meta_type="EEAPossibleRelation">
    ...   <property name="title">Folder to Folder</property>
    ...   <property name="description">A folder to folder relation</property>
    ...   <property name="forward_label">Label for forward relations</property>
    ...   <property name="backward_label">Label for backward relations</property>
    ...   <property name="from">folder</property>
    ...   <property name="to">folder</property>
    ...   <property name="required">True</property>
    ...   <property name="required_for">
    ...    <element value="published"/>
    ...   </property>
    ...  </object>
    ... </object>
    ... '''

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="folder" meta_type="EEARelationsContentType">
      <property name="title">Folder</property>
      <property name="ct_type">Folder</property>
      <property name="ct_interface"></property>
      <property
         name="ct_default_location">python:None</property>
     </object>
     <object name="folder-to-folder" meta_type="EEAPossibleRelation">
      <property name="from">folder</property>
      <property name="to">folder</property>
      <property name="title">Folder to Folder</property>
      <property name="forward_label">Label for forward relations</property>
      <property name="backward_label">Label for backward relations</property>
      <property name="description">A folder to folder relation</property>
      <property name="required">True</property>
      <property name="required_for">
       <element value="published"/>
      </property>
     </object>
    </object>

Purge content-types properties

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="folder" meta_type="EEARelationsContentType">
    ...   <property name="ct_type" purge="True">Don't set this</property>
    ...  </object>
    ... </object>
    ... '''

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="folder" meta_type="EEARelationsContentType">
      <property name="title">Folder</property>
      <property name="ct_type"></property>
      <property name="ct_interface"></property>
      <property
         name="ct_default_location">python:None</property>
     </object>
     <object name="folder-to-folder" meta_type="EEAPossibleRelation">
      <property name="from">folder</property>
      <property name="to">folder</property>
      <property name="title">Folder to Folder</property>
      <property name="forward_label">Label for forward relations</property>
      <property name="backward_label">Label for backward relations</property>
      <property name="description">A folder to folder relation</property>
      <property name="required">True</property>
      <property name="required_for">
       <element value="published"/>
      </property>
     </object>
    </object>

Purge relations properties

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="folder-to-folder" meta_type="EEAPossibleRelation">
    ...   <property name="from" purge="True" />
    ...   <property name="to" purge="True" />
    ...  </object>
    ... </object>
    ... '''

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="folder" meta_type="EEARelationsContentType">
      <property name="title">Folder</property>
      <property name="ct_type"></property>
      <property name="ct_interface"></property>
      <property
         name="ct_default_location">python:None</property>
     </object>
     <object name="folder-to-folder" meta_type="EEAPossibleRelation">
      <property name="from"></property>
      <property name="to"></property>
      <property name="title">Folder to Folder</property>
      <property name="forward_label">Label for forward relations</property>
      <property name="backward_label">Label for backward relations</property>
      <property name="description">A folder to folder relation</property>
      <property name="required">True</property>
      <property name="required_for">
       <element value="published"/>
      </property>
     </object>
    </object>

Purge content-type

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="folder" meta_type="EEARelationsContentType" purge="True" />
    ... </object>
    ... '''

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="folder-to-folder" meta_type="EEAPossibleRelation">
      <property name="from"></property>
      <property name="to"></property>
      <property name="title">Folder to Folder</property>
      <property name="forward_label">Label for forward relations</property>
      <property name="backward_label">Label for backward relations</property>
      <property name="description">A folder to folder relation</property>
      <property name="required">True</property>
      <property name="required_for">
       <element value="published"/>
      </property>
     </object>
    </object>

Purge relation

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="folder-to-folder" purge="True" />
    ... </object>
    ... '''

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool"/>


Faceted navigation
==================
As we said before you can configure content-type faceted criteria using
GenericSetup profile.

Import

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="zu" meta_type="EEARelationsContentType">
    ...    <criteria>
    ...     <criterion name="c4">
    ...      <property name="widget">checkbox</property>
    ...      <property name="title">Type d'element</property>
    ...      <property name="position">left</property>
    ...      <property name="section">default</property>
    ...      <property name="hidden">1</property>
    ...      <property name="index">portal_type</property>
    ...      <property name="vocabulary"></property>
    ...      <property name="count">1</property>
    ...      <property name="default">
    ...       <element value="Folder"/>
    ...       <element value="Document"/>
    ...      </property>
    ...     </criterion>
    ...     <criterion name="c3">
    ...      <property name="widget">tagscloud</property>
    ...      <property name="title">Meta-type d'element</property>
    ...      <property name="position">top</property>
    ...      <property name="section">default</property>
    ...      <property name="hidden">0</property>
    ...      <property name="index">meta_type</property>
    ...      <property name="vocabulary"></property>
    ...      <property name="cloud">sphere</property>
    ...      <property name="count"></property>
    ...      <property name="default">ATFolder</property>
    ...     </criterion>
    ...    </criteria>
    ...  </object>
    ... </object>
    ... '''

Export

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="zu" meta_type="EEARelationsContentType">
      <property name="title"></property>
      <property name="ct_type"></property>
      <property name="ct_interface"></property>
      <property name="ct_default_location">python:None</property>
      <criteria>
       <criterion name="c4">
        <property name="widget">checkbox</property>
        <property name="title">Type d'element</property>
        <property name="position">left</property>
        <property name="section">default</property>
        <property name="hidden">1</property>
        <property name="count">1</property>
        <property name="index">portal_type</property>
        <property name="vocabulary"></property>
        <property name="default">
         <element value="Folder"/>
         <element value="Document"/>
        </property>
       </criterion>
       <criterion name="c3">
        <property name="widget">tagscloud</property>
        <property name="title">Meta-type d'element</property>
        <property name="position">top</property>
        <property name="section">default</property>
        <property name="hidden">0</property>
        <property name="count"></property>
        <property name="index">meta_type</property>
        <property name="vocabulary"></property>
        <property name="cloud">sphere</property>
        <property name="default">ATFolder</property>
       </criterion>
      </criteria>
     </object>
    </object>


       IT DOESN'T MERGE FACETED CONFIGURATION, IT OVERRIDES IT ;)

Try to add another faceted criterion from profile

    >>> importer.body = '''<?xml version="1.0" encoding="utf-8"?>
    ... <object name="portal_relations" meta_type="EEARelationsTool">
    ...  <object name="zu" meta_type="EEARelationsContentType">
    ...    <criteria>
    ...     <criterion name="c2">
    ...      <property name="widget">checkbox</property>
    ...     </criterion>
    ...    </criteria>
    ...  </object>
    ... </object>
    ... '''

Let's see our beautiful faceted navigable container

    >>> print exporter.body
    <?xml version="1.0" encoding="utf-8"?>
    <object name="portal_relations" meta_type="EEARelationsTool">
     <object name="zu" meta_type="EEARelationsContentType">
      <property name="title"></property>
      <property name="ct_type"></property>
      <property name="ct_interface"></property>
      <property
         name="ct_default_location">python:None</property>
      <criteria>
       <criterion name="c2">
        <property name="widget">checkbox</property>
        <property name="title"></property>
        <property name="position">top</property>
        <property name="section">default</property>
        <property name="hidden">0</property>
        <property name="index"></property>
        <property name="vocabulary"></property>
       </criterion>
      </criteria>
     </object>
    </object>


Ops, it deleted all the other widgets. I warned you :)
