    >>> from Products.CMFCore.utils import getToolByName
    >>> types = getToolByName(self.portal, 'portal_types')

Check CategoryContainer Content Type
    >>> container = types.getTypeInfo('CategoryContainer')
    >>> container.title
    'CategoryContainer'
    >>> container.description
    'A Container which holds Categories.'
    >>> container.content_icon
    'navigation_icon.gif'
    >>> container.content_meta_type
    'CategoryContainer'
    >>> container.factory
    'addCategoryContainer'
    >>> container.immediate_view
    'atct_edit'
    >>> container.global_allow
    True
    >>> container.filter_content_types
    True
    >>> container.allowed_content_types
    ('Category',)
    >>> container.default_view
    'view'
    >>> container.view_methods
    ('view', 'folder_listing')
    >>> container.getMethodAliases()
    {'edit': 'atct_edit', 'sharing': '@@sharing', '(Default)': '(dynamic view)', 'view': '(selected layout)'}
    >>> actions = container.listActions()
    >>> for action in actions:
    ...     (action.title, action.id, action.getActionExpression(), action.visible, action.permissions)
    ('View', 'view', 'string:${folder_url}/', True, (u'View',))
    ('Edit', 'edit', 'string:${object_url}/edit', True, (u'Modify portal content',))

Create CategoryCantainer
    >>> self.portal.invokeFactory('CategoryContainer', 'container')
    'container'
    >>> container = self.portal.container
    >>> container
     <CategoryContainer at /plone/container>
    >>> fields = ['title', 'description', 'type_categorized', 'level']
    >>> for field in fields:
    ...     field in container.Schema()
    True
    True
    True
    True
    >>> container.Schema()
    <Products.Archetypes.Schema.Schema object at ...>

    >>> container.title = 'CategoryContainer'
    >>> container.Title()
    'CategoryContainer'
    >>> container.description = 'Description of CategoryContainer'
    >>> container.Description()
    'Description of CategoryContainer'
    >>> container.type_categorized = 'Document'
    >>> container.getType_categorized()
    'Document'
    >>> container.level = 3
    >>> container.getLevel()
    3

Check Fields
title
    >>> type(container.title)
    <type 'str'>
    >>> container.getField('title')
    <Field title(string:rw)>
    >>> container.getField('title').required
    1
    >>> container.getField('title').searchable
    1
    >>> container.getField('title').languageIndependent
    False
    >>> container.getField('title').storage
    <Storage AnnotationStorage>
    >>> container.getField('title').widget
    <Products.Archetypes.Widget.StringWidget object at ...>

description
    >>> type(container.description)
    <type 'str'>
    >>> container.getField('description')
    <Field description(text:rw)>
    >>> container.getField('description').required
    False
    >>> container.getField('description').searchable
    1
    >>> container.getField('description').languageIndependent
    False
    >>> container.getField('description').storage
    <Storage AnnotationStorage>
    >>> container.getField('description').widget
    <Products.Archetypes.Widget.TextAreaWidget object at ...>

type_categorized
    >>> type(container.type_categorized)
    <type 'str'>
    >>> container.getField('type_categorized')
    <Field type_categorized(string:rw)>
    >>> container.getField('type_categorized').required
    1
    >>> container.getField('type_categorized').searchable
    False
    >>> container.getField('type_categorized').languageIndependent
    False
    >>> container.getField('type_categorized').storage
    <Storage AnnotationStorage>
    >>> container.getField('type_categorized').widget
    <Products.Archetypes.Widget.MultiSelectionWidget object at ...>
    >>> container.getField('type_categorized').vocabulary
    ()
    >>> container.getField('type_categorized').enforceVocabulary
    True

level
    >>> type(container.level)
    <type 'int'>
    >>> container.getField('level')
    <Field level(integer:rw)>
    >>> container.getField('level').required
    False
    >>> container.getField('level').searchable
    False
    >>> container.getField('level').languageIndependent
    False
    >>> container.getField('level').storage
    <Storage AnnotationStorage>
    >>> container.getField('level').widget
    <Products.Archetypes.Widget.IntegerWidget object at ...>
    >>> container.getField('level').widget.size
    1
    >>> container.getField('level').widget.maxlength
    2
    >>> container.getField('level').default
    2

Check Category Content Type
    >>> category = types.getTypeInfo('Category')
    >>> category.title
    'Category'
    >>> category.description
    ''
    >>> category.content_icon
    'folder_icon.gif'
    >>> category.content_meta_type
    'Category'
    >>> category.factory
    'addCategory'
    >>> category.immediate_view
    'atct_edit'
    >>> category.global_allow
    False
    >>> category.filter_content_types
    True
    >>> category.allowed_content_types
    ('Category',)
    >>> category.default_view
    'view'
    >>> category.view_methods
    ('view', 'folder_listing')
    >>> category.getMethodAliases()
    {'edit': 'atct_edit', 'sharing': '@@sharing', '(Default)': '(dynamic view)', 'view': '(selected layout)'}
    >>> actions = category.listActions()
    >>> for action in actions:
    ...     (action.title, action.id, action.getActionExpression(), action.visible, action.permissions)
    ('View', 'view', 'string:${folder_url}/', True, (u'View',))
    ('Edit', 'edit', 'string:${object_url}/edit', True, (u'Modify portal content',))

Create Category
    >>> self.portal.container.invokeFactory('Category', 'category')
    'category'
    >>> category = self.portal.container.category
    >>> category
     <Category at /plone/container/category>
    >>> fields = ['title', 'description', 'content', 'subcategory']
    >>> for field in fields:
    ...     field in category.Schema()
    True
    True
    True
    True

    >>> category.Schema()
    <Products.Archetypes.Schema.Schema object at ...>

    >>> category.title = 'Category'
    >>> category.Title()
    'Category'
    >>> category.description = 'Description of Category'
    >>> category.Description()
    'Description of Category'

Add Document
    >>> self.portal.invokeFactory('Document', 'doc')
    'doc'
    >>> doc = self.portal.doc
    >>> doc_uid = doc.UID()

    >>> category.content = doc_uid
    >>> category.getContent()
    []

Add more category
    >>> container.invokeFactory('Category', 'cate01')
    'cate01'
    >>> cate01 = container.cate01
    >>> cate01_uid = cate01.UID()
    >>> category.subcategory = [cate01_uid,]
    >>> category.getSubcategory()
    []


Check Fields
title
    >>> type(category.title)
    <type 'str'>
    >>> category.getField('title')
    <Field title(string:rw)>
    >>> category.getField('title').required
    1
    >>> category.getField('title').searchable
    1
    >>> category.getField('title').languageIndependent
    False
    >>> category.getField('title').storage
    <Storage AnnotationStorage>
    >>> category.getField('title').widget
    <Products.Archetypes.Widget.StringWidget object at ...>

description
    >>> type(category.description)
    <type 'str'>
    >>> category.getField('description')
    <Field description(text:rw)>
    >>> category.getField('description').required
    False
    >>> category.getField('description').searchable
    1
    >>> category.getField('description').languageIndependent
    False
    >>> category.getField('description').storage
    <Storage AnnotationStorage>
    >>> category.getField('description').widget
    <Products.Archetypes.Widget.TextAreaWidget object at ...>

content
    >>> type(category.type_categorized)
    <type 'str'>
    >>> category.getField('content')
    <Field content(reference:rw)>
    >>> category.getField('content').required
    False
    >>> category.getField('content').searchable
    False
    >>> category.getField('content').languageIndependent
    False
    >>> category.getField('content').storage
    <Storage AnnotationStorage>
    >>> category.getField('content').relationship
    'isContent'
    >>> category.getField('content').multiValued
    True
    >>> category.getField('content').allowed_types_method
    'allowed_types'
    >>> category.getField('content').widget
    <Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget.ReferenceBrowserWidget object at ...>

subcategory
    >>> type(category.subcategory)
    <type 'list'>
    >>> category.getField('subcategory')
    <Field subcategory(reference:rw)>
    >>> category.getField('subcategory').required
    False
    >>> category.getField('subcategory').searchable
    False
    >>> category.getField('subcategory').languageIndependent
    False
    >>> category.getField('subcategory').storage
    <Storage AnnotationStorage>
    >>> category.getField('subcategory').relationship
    'isSubcategory'
    >>> category.getField('subcategory').multiValued
    True
    >>> category.getField('subcategory').allowed_types
    ('Category',)
    >>> category.getField('subcategory').widget
    <Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget.ReferenceBrowserWidget object at ...>

