Plone: persistente Utilities manuell entfernen
Wenn man eine solche fehlerhafte Erweiterung deinstalliert und diese auch aus dem Buildout entfernt, kommt es zu Fehlermeldungen der folgenden Art.
AttributeError: type object 'IWarehouseContainer' has no attribute '__iro__'
Um den Fehler zu beheben, müssen wir die Erweiterung noch einmal im Buildout installieren.
Registrierung finden
Am besten schauen wir uns als erstes den Code der Erweiterung an, der das local utility registriert. Hier zu suchen wir in dem package nach dem Interface 'IWarehouseContainer'.
~/.buildout/eggs/getpaid.warehouse-0.3-py2.7.egg/getpaid/warehouse $ grep -r "IWarehouseContainer" .
Wir finden hier die Registrierung.
sm.registerUtility(component=warehouses, provided=interfaces.IWarehouseContainer )
Dies wird uns helfen das Utility zu entfernen.
Utility entfernen
Um das local utility zu entfernen starten wir die Instanz mit debug.
./bin/instance debug
Nun holen wir uns den site manager.
sm = app.Plone.getSiteManager()
Anschließend importieren wir das Interface IWarehouseContainer und holen uns das Utility.
from getpaid.warehouse.interfaces import IWarehouseContainer warehouse = sm.queryUtility( IWarehouseContainer )
Das Utility können wir jetzt mit sm.unregisterUtility(IWarehouseContainer) aus der Registrierung entfernen. Da das Utility selbst IWarehouseContainer nicht implementiert, muss das Interface in diesem Fall mit angegeben werden.
sm.unregisterUtility(warehouse, provided=IWarehouseContainer)