=====================================================================
Entfernen von Local Utilities, Subscribers, Adapters und Portal Tools
=====================================================================
Häufig werden Local Persistent Utilities beim Deinstallieren eines Produkts nicht ebenfalls entfernt.
.. note::
Mit `wildcard.fixpersistentutilities `_
steht nun ein Modul zur Verfügung, mit dem sich Local Utilities, Subscribers,
Adapters und Portal Tools auf der Web-Oberfläche entfernen lassen.
Symptome
========
Nach dem Deinstallieren solcher Produkte kann es z.B. folgende Fehlermeldungen
geben::
AttributeError: type object 'IQueue' has no attribute '__iro__'
oder::
AttributeError: type object 'ISalt' has no attribute '__iro__'
Entfernen von Local Persistent Utilities
========================================
#. Starten der Instanz im Debug-Modus::
$ ./bin/instance debug
#. Anschließend holen wir uns den *site manager* der Site ``Plone``. `àpp``
referenziert dabei auf das Zope-Root-Objekt::
sm = app.Plone.getSiteManager()
#. Nun importieren wir das Interface des Utility.
Anschließend melden wir es ab und löschen es
schließlich. Dies sieht z.B. für `Singing & Dancing `_ so aus::
from collective.singing.interfaces import ISalt
from collective.singing.async import IQueue
util_obj = sm.getUtility(ISalt)
sm.unregisterUtility(provided=ISalt)
del util_obj
sm.utilities.unsubscribe((), ISalt)
del sm.utilities.__dict__['_provided'][ISalt]
del sm.utilities._subscribers[0][ISalt]
util = sm.queryUtility(IQueue, name='collective.dancing.jobs')
sm.unregisterUtility(util, IQueue, name='collective.dancing.jobs')
del util
del sm.utilities._subscribers[0][IQueue]
Dabei unterscheidet sich das Vorgehen, da für ``ISalt`` ein *unnamed utility* und für ``IQueue`` ein *named utility* registriert sind.
#. Anschließend müssen die Änderungen noch an der ZODB *commited* werden::
import transaction
transaction.commit()
app._p_jar.sync()
Entfernen von Subscribers, Adapters und Providers
=================================================
::
sm = app.Plone.getSiteManager()
adapters = sm.utilities._adapters
for x in adapters[0].keys():
if x.__module__.find("my.package") != -1:
print "deleting %s" % x
del adapters[0][x]
sm.utilities._adapters = adapters
subscribers = sm.utilities._subscribers
for x in subscribers[0].keys():
if x.__module__.find("my.package") != -1:
print "deleting %s" % x
del subscribers[0][x]
sm.utilities._subscribers = subscribers
provided = sm.utilities._provided
for x in provided.keys():
if x.__module__.find("my.package") != -1:
print "deleting %s" % x
del provided[x]
sm.utilities._provided = provided
from transaction import commit
commit()
app._p_jar.sync()
``Plone``
Die ID der Site
``my.package``
Das Paket, aus dem Subscriber, Adapter und Provider kommen
Entfernen von Portal Tools
==========================
Nach dem Entfernen von lokalen persistenten Komponenten muss ggf. auch noch das Portal Setup Tool bereinigt werden::
setup_tool = app.Plone.portal_setup
toolset = setup_tool.getToolsetRegistry()
if 'my.package' in toolset._required.keys():
del toolset._required['my.package']
setup_tool._toolset_registry = toolset
from transaction import commit
commit()
app._p_jar.sync()
Zum Weiterlesen
===============
- `Removing a persistent local utility `_
- `Removing a persistent local utility part II `_
- `How to remove local utility `_
- `gist.github.com/thet/thet/upgrades.py `_