2

我的任务是从 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()在调试模式之后,脚本跳转到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

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

编辑 213-03-26 15:27(格林威治标准时间):

关于 .zcml 文件 我收到的站点是 3 个文件夹:产品(提取到\Plone 3\Data)、lib 和 package-includes。

在 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 文件目前没有被复制。我在哪里可以复制这些以导入这些?

4

2 回答 2

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
于 2013-03-26T17:49:54.937 回答
0

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

您应该添加一个“浏览器视图”并调用它来导出您的内容。

您可以通过以下方式做到这一点:

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

您可以在http://developer.plone.org找到有关 browserview 和 plone 的文档

抱歉,如果你需要为 Plone 开发,你需要阅读一些关于这一切的内容。

于 2013-03-26T17:55:38.563 回答