ContentType LookUp
==================
LookUp for container in portal_relations ContenTypes:
  - eea.relations.component.queryContentType

Set up
------

    >>> self.loginAsPortalOwner()
    >>> from Products.CMFCore.utils import getToolByName
    >>> rtool = getToolByName(portal, 'portal_relations')

  Cleanup default relations to avoid surprises

    >>> rtool.manage_delObjects(rtool.objectIds())

  Setup sandbox

    >>> fid = folder.invokeFactory('Folder', 'sandbox')
    >>> sandbox = folder._getOb(fid)

Let's do some queries
---------------------

  Add a document

    >>> did = sandbox.invokeFactory('Document', 'my-document')
    >>> doc = sandbox._getOb(did)

  Lookup

    >>> from zope.component import queryAdapter
    >>> from eea.relations.component import queryContentType

    >>> ctype = queryContentType(doc)
    >>> print ctype
    None

  There is no content-type define for Document in portal_relations, let's add one

    >>> rtool = portal.portal_relations
    >>> rid = rtool.invokeFactory('EEARelationsContentType', 'simple-document')
    >>> rtype = rtool._getOb(rid)
    >>> rtype.processForm(values={
    ...   'title': 'Simple Document',
    ...   'ct_type': 'Document',
    ...   'ct_interface': '',
    ... })

  Let's try now

    >>> queryContentType(doc)
    <EEARelationsContentType at /plone/portal_relations/simple-document>

  But you can also define complex ContentTypes in portal_relations. Let's see
  if it choose the correct one

    >>> from eea.relations.tests import IDoTheZu
    >>> IDoTheZu.__identifier__
    'eea.relations.tests.IDoTheZu'

    >>> from zope.interface import alsoProvides
    >>> alsoProvides(doc, IDoTheZu)

    >>> rid = rtool.invokeFactory('EEARelationsContentType', 'zu-document')
    >>> rtype = rtool._getOb(rid)
    >>> rtype.processForm(values={
    ...   'title': 'ZU Document',
    ...   'ct_type': 'Document',
    ...   'ct_interface': 'eea.relations.tests.IDoTheZu',
    ... })

    >>> queryContentType(doc)
    <EEARelationsContentType at /plone/portal_relations/zu-document>

  Let's define a content-type only for ZU interface

    >>> rid = rtool.invokeFactory('EEARelationsContentType', 'zu')
    >>> rtype = rtool._getOb(rid)
    >>> rtype.processForm(values={
    ...   'title': 'ZU',
    ...   'ct_type': '',
    ...   'ct_interface': 'eea.relations.tests.IDoTheZu',
    ... })

  For our doc it should return the same

    >>> queryContentType(doc)
    <EEARelationsContentType at /plone/portal_relations/zu-document>

  But if we add a Folder for example that provides ZU interface it should
  return new content-type

    >>> fid = sandbox.invokeFactory('Folder', 'my-new-folder')
    >>> myfolder = sandbox._getOb(fid)
    >>> alsoProvides(myfolder, IDoTheZu)
    >>> queryContentType(myfolder)
    <EEARelationsContentType at /plone/portal_relations/zu>

  Now let's add a generic Content-Type.

  BTW Products.Archetypes.interfaces.IBaseObject is the low level interface
  you can use to define ContentType mappings in portal_relations, so if you add
  a Content-Type for zope.interface.Interface you may have a surprise :)

    >>> from eea.relations.interfaces import IBaseObject
    >>> rid = rtool.invokeFactory('EEARelationsContentType', 'generic')
    >>> rtype = rtool._getOb(rid)
    >>> rtype.processForm(values={
    ...   'title': 'Generic',
    ...   'ct_type': '',
    ...   'ct_interface': IBaseObject.__identifier__,
    ... })

    >>> queryContentType(doc)
    <EEARelationsContentType at /plone/portal_relations/zu-document>

    >>> queryContentType(myfolder)
    <EEARelationsContentType at /plone/portal_relations/zu>

    >>> nid = sandbox.invokeFactory('News Item', 'my-news')
    >>> newz = sandbox._getOb(nid)
    >>> queryContentType(newz)
    <EEARelationsContentType at /plone/portal_relations/generic>


Relations LookUp
================
Lookup for context possible relations:
  - eea.relations.component.queryForwardRelations
  - eea.relations.component.queryBackwardRelations

    >>> from eea.relations.component import queryForwardRelations
    >>> from eea.relations.component import queryBackwardRelations

    >>> queryForwardRelations(doc)
    <generator object queryForwardRelations at ...>

    >>> [r for r in queryForwardRelations(doc)]
    []

    >>> [r for r in queryBackwardRelations(myfolder)]
    []

Let's add some possible relations

  Self relation

    >>> rid = rtool.invokeFactory('EEAPossibleRelation', 'zu-document-zu-document')
    >>> rel = rtool._getOb(rid)
    >>> rel.processForm(values={
    ...   'from': 'zu-document',
    ...   'to': 'zu-document',
    ... })

    >>> [r for r in queryForwardRelations(doc)]
    [<EEAPossibleRelation at /plone/portal_relations/zu-document-zu-document>]

    >>> [r for r in queryBackwardRelations(doc)]
    [<EEAPossibleRelation at /plone/portal_relations/zu-document-zu-document>]

  Directed relation

    >>> rid = rtool.invokeFactory('EEAPossibleRelation', 'generic-zu')
    >>> rel = rtool._getOb(rid)
    >>> rel.processForm(values={
    ...   'from': 'generic',
    ...   'to': 'zu',
    ... })

    >>> [r for r in queryForwardRelations(newz)]
    [<EEAPossibleRelation at /plone/portal_relations/generic-zu>]

    >>> [r for r in queryForwardRelations(myfolder)]
    []

    >>> [r for r in queryBackwardRelations(myfolder)]
    [<EEAPossibleRelation at /plone/portal_relations/generic-zu>]
