Plone 3.1.2 - ATDocument.getText()方法中的TypeError

时间:2013-03-26 09:11:07

标签: python plone typeerror zope

我的任务是从Plone 3.1.2网站卸载内容并将有关内容的信息加载到SQL数据库+文件系统

我重新创建了网站,访问了ZODB并重新创建了对象和文件夹结构。我还能够读取文件夹,文件和文档的属性。我无法使ATDocument的.getText()方法起作用。 Traceback看起来像这样:

追踪(最近一次呼叫最后一次):

  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 133, in ? 
    main() 
  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 118, in main 
    print dokument.getText() 
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\ClassGen.py", line 54, in generatedAccessor
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\BaseObject.py", line 828, in Schema 
TypeError: ('Could not adapt', <ATDocument at /*object_path*>, <InterfaceClass Products.Archetypes.interfaces._schema.ISchema>) 

我怀疑将对象连接到接口ISchema时出现问题,但我之前从未使用过Plone,也不知道它的对象模型。

任何可能错误或遗漏的建议,我该如何解决它/和/或下一步做什么?我怀疑我必须以某种方式将ISchema接口类与此对象连接,但不知道从哪里开始。有什么建议?

我会很高兴得到任何帮助,因为我现在已经停留了2天而没有继续前进。

我对ZCML格式或如何编辑它一无所知。 因为在调试模式下>>> print dokument.getText()之后,脚本会跳转到Generator类中的makeMethod()方法,我认为脚本不会执行.getText(),而是尝试创建此方法。

由于inspect.getmembers(dokument)返回getText()方法,我真的很困惑。 你知道哪个ZCML文件可能与ATDocument类有关吗?或者我在哪里可以查找有关此主题的任何信息?

我的start.py文件除了以下导入之外没有其他作用:

from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
from OFS.Application import Application
from BTrees import OOBTree
from Products.CMFPlone.Portal import PloneSite

然后它可以访问dokument对象并尝试执行.getText()

编辑213-03-26 15:27(GMT):

关于.zcml文件 我收到的网站是3个文件夹:产品(提取到\Plone 3\Data),lib和包含。

在lib里面有一个包含3个子文件夹的python文件夹:'common','abc'和'def'(名称改为不释放客户端的信息)。每个子文件夹都包含一个configure.zcml文件,其中一个文件还包含override.zcml文件。

在文件夹package-includes中有4个文件,每个文件长1行。它们包含以下几行:

<include package="abc" file="configure.zcml" />
<include package="def" file="overrides.zcml" />
<include package="common" file="configure.zcml" />
<include package="def" file="configure.zcml" />

此刻不会复制这些zcml文件。我可以在哪里复制这些以进行这些导入?

2 个答案:

答案 0 :(得分:1)

您缺少组件注册,通常在站点中加载ZCML文件时注册。

您希望最终能够运行bin/instance run yourscript.py,这会将所有繁琐的网站和ZCML加载到Zope。

一旦您可靠地运行,您就可以在设置本地组件管理器和安全管理器的脚本中访问该站点:

from zope.app.component.hooks import setSite
from Testing.makerequest import makerequest
from AccessControl.SecurityManagement import newSecurityManager

site_id = 'Plone'     # adjust to match your Plone site object id.
admin_user = 'admin'  # usually 'admin', probably won't need adjusting
app = makerequest(app)
site = app[site_id]
setSite(site)
user = app.acl_users.getUser(admin_user).__of__(site.acl_users)
newSecurityManager(None, user)

# `site` is your Plone site, now correctly set up

将此脚本保存在某处,然后使用以下命令运行:

bin/instance run path/to/yourscript.py

答案 1 :(得分:0)

你开始任务的方式并不好。 您正在尝试在没有框架设置的情况下使用API​​。这是可能的,但你必须非常了解框架(加载持久的站点管理器,...)

您应添加“浏览器视图”并将其调用以导出您的内容。

你可以通过以下方式做到:

  • 创建自己的插件并安装
  • 修改已安装的插件(毕竟它是临时工作)

您可以在http://developer.plone.org

找到有关browserview和plone的文档

很抱歉,如果您需要为Plone开发,您需要阅读所有这些内容。