Как удалить элемент из записи реестра ресурсов типа списка с помощью общей настройки
В текущей сборке 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.