PicklingError при установке дополнения - PullRequest
1 голос
/ 24 марта 2011

Мне было поручено обновить сайт Plone с 3.1.7 до 4.0.3. Я успешно обновил сайт, но теперь пытаюсь установить colle.lineage и получаю следующую ошибку:

Трассировка (самая последняя):
Модуль ZPublisher.Publish, строка 135, в публикации
Модуль Zope2.App.startup, строка 291, в коммите
Модуль транзакция. Менеджер, строка 93, в коммите
Модуль транзакция._транзакция, строка 322, в коммите
Модуль транзакция. Транзакция, строка 416, в _commitResources
Модуль ZODB.Connection, строка 558, в коммите
Модуль ZODB.Connection, линия 606, в _commit
Модуль ZODB.Connection, строка 640, в _store_objects
Модуль ZODB.serialize, строка 422, в сериализации
Модуль ZODB.serialize, строка 431, в _dump
PicklingError: Can't pickle <class 'quills.app.portlets.quillslinks.IQuillsLinksPortlet'>: импорт модуля quills.app.portlets.quillslinks завершился неудачей

Quills был установлен до обновления, но не использовался на сайте, поэтому я удалил его, пока сайт был 3.1.7 через quickinstaller (я не думаю, что quills имеет профиль удаления).

Кроме того, эта ошибка не влияет на все надстройки, вчера я установил коллективный переадресацию без инцидентов.

Очевидно, что Quills удалили не совсем, но, честно говоря, не знают, с чего начать, когда это исправим.

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 25 марта 2011

Мне кажется, что Quills назначил некоторые портлеты, которые не были отменены при удалении Quills.

Лучшим решением было бы удалить эти портлеты перед удалением Quills.К сожалению, я не знаю инструмента, позволяющего получить общее представление о том, где назначены портлеты, и сразу определить, где находится портлет, который нарушает работу, чтобы вы могли его удалить.Может быть, кто-то еще знает о таком инструменте?

Вы можете попробовать экспортировать конфигурацию портлета с помощью инструмента portal_setup;результирующий файл portlets.xml может содержать информацию о том, где назначен этот портлет или портлеты.

Или вместо того, чтобы находить и удалять портлеты, вы можете попытаться зарегистрировать фиктивную замену нарушающего интерфейса (это следует сделать вкод инициализации какого-либо продукта в вашем экземпляре):

import imp, sys
from zope.interface import Interface
m = imp.new_module('quills.app.portlets.quillslinks')
sys.modules['quills.app.portlets.quillslinks'] = m
m.IQuillsLinksPortlet = Interface

Это последнее решение следует считать уродливым хаком.

...