Plone 3.1.2 - TypeError в методе ATDocument.getText()

Моя задача — выгрузить контент с веб-сайта Plone 3.1.2 и загрузить информацию о контенте в базу данных SQL + файловую систему.

Я воссоздал веб-сайт, получил доступ к ZODB и воссоздал структуру объектов и папок. Я также могу читать свойства папок, файлов и документов. Я не могу заставить работать метод .getText() ATDocument. Трассировка выглядит так:

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() в классе Generator, я предполагаю, что скрипт не выполняет .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 (GMT):

О файлах .zcml На сайте, который я получил, было 3 папки: Products (извлеченные в \Plone 3\Data), lib и package-includes.

Внутри библиотеки есть папка python, содержащая 3 подпапки: «common», «abc» и «def» (имена изменены, чтобы не раскрывать информацию о клиенте). Каждая из этих подпапок содержит файл configure.zcml, одна из них также содержит файл override.zcml.

В папке package-include есть 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 в данный момент не копируются. Где я могу скопировать их, чтобы импортировать?


person Jan Siekierski    schedule 26.03.2013    source источник
comment
Судя по вашей трассировке, вы монтировали вещи в своей собственной установке, не используя леса Zope? Я бы сказал, что вы не загрузили регистрации ZCML, которых много, но трудно сказать, не видя вашего start.py кода.   -  person Martijn Pieters    schedule 26.03.2013
comment
спасибо за ваш вклад @Martijn. Я все еще не могу заставить его работать, и я ничего не знаю о формате ZCML или о том, как его редактировать.   -  person Jan Siekierski    schedule 26.03.2013
comment
Формат ZCML — это просто XML, который определяет конфигурацию сервера, включая регистрацию компонентов и адаптеров. Вам не нужно его редактировать, просто загрузите его. Это может быть сложно, и мне интересно, что вы делаете, не используя уже существующую инфраструктуру Zope. Поэтому моя просьба предоставить вам start.py источник, чтобы мы могли помочь вам сделать это правильно.   -  person Martijn Pieters    schedule 26.03.2013
comment
@Martijn Я пытался ввести немного более длинный комментарий, но оказалось, что я не могу, поэтому я отредактировал свой исходный пост.   -  person Jan Siekierski    schedule 26.03.2013
comment
Это то, что я хотел, чтобы вы сделали в первую очередь! Всегда можно отредактировать свой вопрос, добавив детали, запрошенные в комментариях.   -  person Martijn Pieters    schedule 26.03.2013
comment
Как вы установили программное обеспечение Plone для импорта сюда? Возможно есть раскачка, можно ли вообще запустить сам сайт?   -  person Martijn Pieters    schedule 26.03.2013
comment
Я получил 3 папки (Products, lib и package-includes, где есть 4 файла zcml) и файл data.fs. Затем я скачал Plone 3.1.2, извлек папки lib и Products и извлек файлы zcml, чтобы перезаписать другие файлы. Теперь, когда я просматриваю его, я, возможно, допустил ошибку, но сам сайт plone работал, поэтому я все же протолкнулся. Я напишу больше об этих файлах zcml в своем вопросе через минуту.   -  person Jan Siekierski    schedule 26.03.2013
comment
Мне не нужно видеть эти файлы ZCML. Мне нужно знать, как вы управляли самим сайтом Plone. Используемые команды.   -  person Martijn Pieters    schedule 26.03.2013
comment
Чтобы сделать это более явным: если вы можете запустить bin/instance fg или что-то подобное, чтобы запустить сайт, есть гораздо более простой путь к тому, что вы хотите.   -  person Martijn Pieters    schedule 26.03.2013
comment
Я запускаю сайт через Plone Controller на локальном хосте, однако в сценарии start.py я не запускаю сайт, а просто напрямую обращаюсь к объекту приложения в zodb.   -  person Jan Siekierski    schedule 26.03.2013
comment
Это на какой платформе?   -  person Martijn Pieters    schedule 26.03.2013
comment
Windows 7, я запускаю его как локальный сервер, а затем я могу получить доступ к сайту через браузер   -  person Jan Siekierski    schedule 26.03.2013
comment
Существует экспериментальный установщик на основе сборки для Plone 3.1; можешь попробовать это для меня? Я не уверен на 100%, где найти сценарии, которые вы хотите иметь в «обычном» установщике Windows.   -  person Martijn Pieters    schedule 26.03.2013
comment
Я загружаю, однако файл zodb весит 4 ГБ, поэтому мне потребуется от 10 до 15 минут, чтобы настроить сайт.   -  person Jan Siekierski    schedule 26.03.2013
comment
Сделанный. Я извлек продукты в разделы\экземпляр\продукты, папку с библиотекой — в разделы \экземпляр\lib, но не знаю, куда извлечь data.fs (файл zodb) и 4 файла .zcml, которые я получил.   -  person Jan Siekierski    schedule 26.03.2013
comment
Мы преувеличиваем комментарии здесь. Поскольку у вас еще недостаточно репутации для использования чата Stack Overflow, почему бы не зайти на IRC-канал Plone и мы можем продолжить там. Мой ник там MJ.   -  person Martijn Pieters    schedule 26.03.2013


Ответы (2)


Вам не хватает регистрации компонентов, обычно регистрируемой при загрузке файлов 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
person Martijn Pieters    schedule 26.03.2013
comment
@toutpt: Мы помогали OP на канале Plone #IRC, чтобы запустить часть bin/instance. - person Martijn Pieters; 26.03.2013
comment
Наконец-то мне удалось сделать то, что вы мне сказали, и ATDocument.getText() работает как шарм. Спасибо вам большое за вашу помощь и терпение. - person Jan Siekierski; 27.03.2013

То, как вы начинаете свою задачу, не является хорошим. Вы пытаетесь использовать API без настройки фреймворка. Это возможно, но вы должны очень хорошо знать структуру (загрузить постоянный менеджер сайтов, ...)

Вы должны добавить «представление в браузере» и вызвать его для экспорта своего контента.

Вы можете сделать это:

  • создайте свой собственный аддон и установите его
  • изменить установленный аддон (в конце концов, это временная работа)

Вы найдете документацию по браузеру и plone по адресу http://developer.plone.org.

Извините, но если вам нужно разрабатывать для Plone, вам нужно немного прочитать обо всем этом.

person toutpt    schedule 26.03.2013