以编程方式导入ZEXP文件时出错

时间:2011-03-29 18:10:15

标签: import menu plone

我正在开发一个Plone产品,需要以编程方式导入以前导出到ZEXP文件的对象。除导航栏外,它工作正常。导入一个对象时,它会正确执行,但导航栏不会更新。可以通过它的URL及其父容器内容选项卡访问该对象。

Bellow是我用来导入对象的代码。它基于zope的ObjectManager._importObjectFromFile实现。

def importDocument( app, fileName, container ):
    app._p_jar.sync()   

    owner = 1

    connection = container._p_jar
    ob = connection.importFile( config.REMOTE_DIR + fileName, customImporters={ magic: importXML, } )

    id = ob.id
    if hasattr(id, 'im_func'): id = id()

    try:
        container._setObject( id, ob, set_owner = owner, suppress_events=False )
    except AttributeError:
        print "AttributeError"

    # Try to make ownership implicit if possible in the context
    # that the object was imported into
    ob = container._getOb( id )
    ob.manage_changeOwnershipType( explicit = 0 )

    transaction.commit()

    return True

我注意到_setObject实现在它的代码中触发了ObjectAddedEvent事件,并且在该事件之后,当我使用ZMI接口导入对象时菜单得到更新,所以我认为有些东西正在监听这个事件,处理菜单,但奇怪的是,使用我的代码时不会发生这种情况。

3 个答案:

答案 0 :(得分:0)

也许在导入完成后尝试手动重建整个目录?它可能会给你更多提示:...

ZMI - > portal_catalog - > tab'advance' - > '清楚&重建”。

答案 1 :(得分:0)

一般来说,不支持导入zexp对象(部分原因是由于此类情况可能会发生意外或意外结果)。如果它有效,那很好。如果没有,您可以“独立”,最好将Data.fs文件复制到新的软件堆栈。

那就是说,我不确定我理解为什么清楚并重建目录(ZMI - > portal_catalog - > tab'advance' - >'clear& rebuild')不是这里的答案。根据其描述,它的工作是“遍历整个门户网站,寻找应在目录中编入索引并将其编入索引的内容对象”。

除非我误解,否则您刚刚描述了一种情况,即新导入的内容“应该编入索引”,因为它尚未编入索引。

如果您担心清除和重建所需的时间长度,请尝试从命令行运行它,如下所示:

如果您担心抓取整个网站,请在每个对象上调用indexObject()(http://dev.plone.org/plone/browser/plone.org/Products.PloneOrg/trunk/scripts/catalog_rebuild。 PY#L109)

答案 2 :(得分:0)

  1. 您可能需要在导入后“发布”该对象以使其可见。

  2. 请改用manage_importObject方法。