Проблема с локальной утилитой, используемой в качестве зависимости в продукте - PullRequest
1 голос
/ 01 августа 2011

Вот проблема.У меня есть mynamespace.mypackage, которая имеет в качестве зависимости mynamespace.mydependencypackage, то есть локальная утилита .Он зарегистрирован с использованием реестра компонентов .

В config.py из mynamespace.mypackage, у меня есть

DEPENDENCIES = ['mynamespace.mydependencypackage']

И в моих mynamespace.mypackage setuphandlers.pyЗависимость установлена, если она еще не установлена.

Проблема заключается в том, что если я переустановлю mynamespace.mypackage - ZMI, то все будет выглядеть идеально (так как ошибки не отображаются), но при использовании я получаю ComponentLookupErrorметоды в mynamespace.mypackage, которые получают утилиту:

Module zope.component._api, line 207, in getUtility
ComponentLookupError: (<InterfaceClass MY_UTILITY_INTERFACE, '')

Я могу «исправить» эту проблему, переустановив mynamespace.mydependencypackage в моем setuphandlers.py или через ZMI, а также при переустановке mynamespace.mypackage,но это не кажется лучшим решением для меня.

Чего мне не хватает в Общей настройке здесь?Я не заставлял эту утилиту сохранять какое-либо значение в ZODB.Я могу просто забыть обо всех этих проблемах и создать BrowserView с помощью служебных методов, но сначала я хочу понять, почему у меня возникают эти проблемы.

EDIT : Теперь у меня естьбольшая проблема.TypeError: ('object.__new__(MyClass) is not safe, use Persistence.Persistent.__new__()', <function _reconstructor at 0xb7783e9c>, (<class 'mynamespace.mydependencypackage.package.MyClass'>, <type 'object'>, None)) показывается.Полный возврат:

Traceback (innermost last):
  Module ZPublisher.Publish, line 110, in publish
  Module ZPublisher.BaseRequest, line 429, in traverse
  Module ZPublisher.BeforeTraverse, line 99, in __call__
  Module Products.CMFCore.PortalObject, line 94, in __before_publishing_traverse__
  Module zope.event, line 23, in notify
  Module zope.component.event, line 26, in dispatch
  Module zope.component._api, line 130, in subscribers
  Module zope.component.registry, line 290, in subscribers
  Module zope.interface.adapter, line 535, in subscribers
  Module zope.component.event, line 33, in objectEventNotify
  Module zope.component._api, line 130, in subscribers
  Module zope.component.registry, line 290, in subscribers
  Module zope.interface.adapter, line 535, in subscribers
  Module zope.app.component.site, line 375, in threadSiteSubscriber
  Module zope.app.component.hooks, line 61, in setSite
  Module Products.CMFCore.PortalObject, line 75, in getSiteManager
  Module ZODB.Connection, line 761, in setstate
  Module ZODB.Connection, line 819, in _setstate
  Module ZODB.serialize, line 604, in setGhostState
  Module ZODB.serialize, line 597, in getState
  Module copy_reg, line 48, in _reconstructor
TypeError: ('object.__new__(MyClass) is not safe, use Persistence.Persistent.__new__()', <function _reconstructor at 0xb7783e9c>, (<class 'mynamespace.mydependencypackage.package.MyClass'>, <type 'object'>, None))

1 Ответ

5 голосов
/ 01 августа 2011

Похоже, у вас есть собственный код Python в вашем файле setuphandlers.py для установки зависимости.Есть ли причина, по которой вы не замечаете зависимость в файле metadata.xml?Или вы можете показать нам этот код?

При активации дополнения в Plone выполняется сравнение различных объектов до / после для поддержки деактивации.Среди них есть локальные постоянные утилиты, как определено в файле componentregistry.xml.Примечание: все, что определено в XML-файлах GenericSetup, приводит к постоянным изменениям - если вы хотите использовать непостоянные утилиты, используйте их для регистрации в файлах ZCML.

Поэтому, когда у вас есть собственный код для добавления локальной утилиты в файл setuphandlers.pyкод, Plone считает, что эта утилита принадлежит к вашему основному дополнению.Если вы переустанавливаете эту надстройку, утилита удаляется вместе со всем остальным, а затем все устанавливается снова.

Я предполагаю, что ваша проверка «уже установлено» завершается неудачно после переустановки, и утилита не добавляетсяснова.

Вы можете избежать всего этого, просто указав для зависимостей и основной надстройки свои собственные профили GenericSetup, а затем отметив зависимость в метаданных.xml основного файла, например:

<?xml version="1.0"?>
<metadata>
  <version>1</version>
  <dependencies>
    <dependency>profile-my.dependency:default</dependency>
  </dependencies>
</metadata>

Как только вы это сделаете, профиль зависимостей будет активирован независимо, и Plone будет отслеживать его самостоятельно.Если затем вы решите переустановить основную надстройку, зависимость не будет затронута вообще и останется нетронутой.

...