[Zope-CMF] Error trying to add FTI

Thomas Olsen tol@tanghus.dk
Mon, 22 Apr 2002 23:25:28 +0200

I've had a lot of problems with this too:

in the module define you fti as a tuple of dictionaries:

factory_type_information =3D ({
      'id': 'Contact',
      'meta_type': 'Contact Object',
      'description': 'Contains contacts',
      'product': 'MyProduct',
      'icon': 'folder_icon.gif',
      'factory': 'addContact',
      'filter_content_types': 0,
      'immediate_view': 'contact_view',
                 'id': 'view'
                ,'name': 'View'
                ,'action': 'contact_view'
                ,'permissions': (CMFCorePermissions.View,)
                ,'category': 'object'

This way you an have fti's for several classes in the same module.
Then in __init__.py:

  'Medzope Content',
  content_types =3D ( MedzopeFolder.MedzopeFolder
  extra_constructors =3D (MedzopeFolder.addMedzopeFolder
     + MedzopeOrg.factory_type_information
     + Contact.factory_type_information)

Notice that you have to add the fti's with a '+' sign.

Having the fti's in a tuple also makes it quite easy to create install=20

from Products.CMFCore.TypesTool import ContentFactoryMetadata
from Products.CMFCore.utils import getToolByName
import MedzopeFolder, MedzopeOrg, Contact

def registerType(self, fti):
        Register type defined in fti in the types tool
    typestool =3D getToolByName(self, 'portal_types')

    if fti['id'] not in typestool.objectIds():
        cfm =3D apply(ContentFactoryMetadata, (), fti)
        typestool._setObject(fti['id'], cfm)
        out.write('Registered %s with the types tool\n' % fti['id'])
        out.write('Object "%s" already existed in the types tool\n' %=20

def install(self):
    """Register all components with the necessary tools"""
    # register the portal types
    type_classes =3D (MedzopeFolder, MedzopeOrg, Contact)
    for c in type_classes:
        t =3D c.factory_type_information
        if type(t) =3D=3D type(()): # double check
            for fti in t:
                registerType(self, fti)
            registerType(self, t)

On Monday 22 April 2002 18:18, Jon Edwards wrote:
> I created a product "Medzope" which had a couple of subproducts - all
> worked OK. But now I've added another sub-product (Contact), it doesn't
> seem to be registering itself properly, can someone pleeeeease point ou=
t my
> dumb mistake?
> I think the mistake might be in my init.py, where I do the ContentInit =
>     utils.ContentInit(
>         'Medzope Content',
>         content_types =3D (MedzopeFolder.MedzopeFolder,
> MedzopeOrg.MedzopeOrg, Contact.Contact),
>         permission =3D ADD_FOLDERS_PERMISSION,
>         extra_constructors =3D (MedzopeFolder.addMedzopeFolder,
> MedzopeOrg.addMedzopeOrg, Contact.addContact),
>         fti=3D(MedzopeFolder.factory_type_information,
> MedzopeOrg.factory_type_information, Contact.factory_type_information)
>         ).initialize(context)
> Everything seems to initialise without errors, and I can add my new
> "Contact" objects through the ZMI. But "Contact" is not listed in the
> TypesTool, so I tried to add a new Factory-based Type Information, and
> immediately got the following error -
> AttributeError
> Sorry, a site error occurred.
> Traceback (innermost last):
>   File C:\Program Files\testzope250\lib\python\ZPublisher\Publish.py, l=
> 150, in publish_module
>   File C:\Program Files\testzope250\lib\python\ZPublisher\Publish.py, l=
> 114, in publish
>   File C:\Program Files\testzope250\lib\python\Zope\__init__.py, line 1=
> in zpublisher_exception_hook
>     (Object: portal_types)
>   File C:\Program Files\testzope250\lib\python\ZPublisher\Publish.py, l=
> 98, in publish
>   File C:\Program Files\testzope250\lib\python\ZPublisher\mapply.py, li=
> 88, in mapply
>     (Object: manage_addFactoryTIForm)
>   File C:\Program Files\testzope250\lib\python\ZPublisher\Publish.py, l=
> 39, in call_object
>     (Object: manage_addFactoryTIForm)
>   File C:\Program
> Files\testzope250\lib\python\Products\CMFCore\TypesTool.py, line 578, i=
> manage_addFactoryTIForm
>     (Object: portal_types)
>   File C:\Program
> Files\testzope250\lib\python\Products\CMFCore\TypesTool.py, line 567, i=
> listDefaultTypeInformation
>     (Object: portal_types)
> AttributeError: 'tuple' object has no attribute 'get'
> Looking at TypesTool, I think it's trying to get the meta_type of the F=
> But it seems that something in the way I initialised it has caused that=
> to be stored, or to be stored wrongly? (I've declared both meta_type an=
> portal_type as Contact in Contact.py)
> Any clues gratefully accepted!
> Cheers, Jon
> _______________________________________________
> Zope-CMF maillist  -  Zope-CMF@zope.org
> http://lists.zope.org/mailman/listinfo/zope-cmf
> See http://www.zope.org/Products/PTK/Tracker for bug reports and featur=
> requests

=09Thomas Olsen