Как удалить элемент из записи реестра ресурсов типа списка с помощью общей настройки

В текущей сборке coredev для Plone 5 я пытаюсь написать профиль удаления GenericSetup для надстройки, которая регистрирует некоторые CSS в cssregistry.xml. В Plone 5 portal_css и portal_javascripts пусты, и все эти ресурсы теперь автоматически загружаются в реестр ресурсов. Но нет соответствующей деинсталляции. Если у меня есть один ресурс CSS, я получаю следующие записи в реестре ресурсов:

  <record name="plone.resources/resource-myaddon-stylesheets.conf">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.css">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.deps">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.export">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.init">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.js">...</record>
  <record name="plone.resources/resource-myaddon-stylesheets.url">...</record>

(Я получаю все это, даже если у меня нет ресурсов js, и все они имеют пустое значение, кроме записи css.)

Кроме того, есть новый <element> в следующей записи:

<record name="plone.bundles/plone-legacy.resources" interface="Products.CMFPlone.interfaces.resources.IBundleRegistry" field="resources">

    ...

    <value>
      ...
      <element>resource-myaddon-stylesheets</element>
    </value>
</record>

Когда я создаю свой профиль удаления GS, достаточно просто удалить прежние 7 записей в registry.xml. Но как мне удалить один <element> из последней записи? Я просмотрел тест в plone.app.registry, но удаление элемента, похоже, не покрыто.

В конечном счете, было бы замечательно, если бы удаление могло быть выполнено автоматически, как и установка.

2 ответа

Решение

Похоже, что обходной путь - добавить что-то вроде этого в Extensions/Install.py:

def _removeBundleFromRegistry():
    logger.info('Removing bundle reference from registry')

    record = 'plone.bundles/plone-legacy.resources'
    resources = api.portal.get_registry_record(record)
    if u'resource-myaddon-stylesheets' in resources:
        resources.remove(u'resource-myaddon-stylesheets')

def uninstall(portal, reinstall=False):
    if not reinstall:
        ...
        _removeBundleFromRegistry()
        ...

Очень плохо.

Вы должны использовать что-то вроде этого:

<record name="plone.bundles/plone-legacy.resources" interface="Products.CMFPlone.interfaces.resources.IBundleRegistry" field="resources">
  <value purge="false">
    <element remove="true">resource-myaddon-stylesheets</element>
  </value>
</record>

Вы можете увидеть рабочий пример в профиле удаления пакета brasil.gov.paginadestaque.

Другие вопросы по тегам