
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3685 fd906abe-77d9-0310-91a1-e0d9ade77398
133 lines
4.2 KiB
Python
133 lines
4.2 KiB
Python
from Acquisition import aq_base, aq_chain
|
|
from Products.Five import BrowserView
|
|
from zope.app.intid.interfaces import IIntIds
|
|
from zope.app.component.hooks import setSite, setHooks
|
|
from zope.app.component.interfaces import ISite
|
|
from zope.component.interfaces import ComponentLookupError
|
|
from zope.component import getUtility, getSiteManager
|
|
from OFS.interfaces import IApplication
|
|
from intid import IntIds, OFSIntIds
|
|
from lsm import make_site, USE_LSM
|
|
from utils import aq_iter
|
|
|
|
class FiveIntIdsInstall(BrowserView):
|
|
@property
|
|
def context(self):
|
|
return self._context[0]
|
|
|
|
def __init__(self, context, request):
|
|
self._context = context,
|
|
self.request = request
|
|
doinstall = self.request.get('install', None)
|
|
if doinstall:
|
|
self.install()
|
|
|
|
def install(self):
|
|
add_intids(self.context, findroot=False)
|
|
|
|
@property
|
|
def installed(self):
|
|
installed = False
|
|
try:
|
|
intids = getUtility(IIntIds)
|
|
if intids is not None:
|
|
if USE_LSM:
|
|
sm = self.context.getSiteManager()
|
|
if 'intids' in sm.objectIds():
|
|
installed = True
|
|
else:
|
|
installed = True
|
|
except ComponentLookupError, e:
|
|
pass
|
|
return installed
|
|
|
|
def initializeSite(site, sethook=False, **kw):
|
|
make_site(site)
|
|
if sethook:
|
|
setHooks()
|
|
setSite(site)
|
|
|
|
def xx_get_root(app):
|
|
for parent in aq_iter(app, error=AttributeError):
|
|
if IApplication.providedBy(parent):
|
|
return parent
|
|
raise AttributeError, 'No application found'
|
|
|
|
def get_root(obj):
|
|
for p in aq_chain(obj):
|
|
if IApplication.providedBy(p):
|
|
return p
|
|
raise AttributeError, 'No application found'
|
|
|
|
def addUtility(site, interface, klass, name='', ofs_name='', findroot=True):
|
|
"""
|
|
add local utility in zope2
|
|
"""
|
|
app = site
|
|
if findroot:
|
|
app = get_root(site)
|
|
|
|
# If we have the zope Application and the utility is not yet
|
|
# registered, then register it.
|
|
assert app is not None, TypeError("app is None")
|
|
|
|
if not ISite.providedBy(app):
|
|
initializeSite(app, sethook=False)
|
|
|
|
sm = app.getSiteManager()
|
|
obj = None
|
|
if USE_LSM:
|
|
# Try to get the utility from OFS directly in case it is
|
|
# stored, but not registered
|
|
ofs_name = ofs_name or name
|
|
obj = getattr(aq_base(sm), ofs_name, None)
|
|
if sm.queryUtility(interface,
|
|
name=name,
|
|
default=None) is None:
|
|
# Register the utility if it is not yet registered
|
|
if obj is None:
|
|
if name:
|
|
obj = klass(name)
|
|
else:
|
|
obj = klass()
|
|
if USE_LSM:
|
|
sm.registerUtility(provided=interface, component=obj,
|
|
name=name)
|
|
else:
|
|
#sm.registerUtility(interface, obj, name=name) ###hm
|
|
sm.registerUtility(provided=interface, component=obj,
|
|
name=name)
|
|
elif USE_LSM and obj is None:
|
|
# Get the utility if registered, but not yet stored in the LSM
|
|
obj = sm.queryUtility(interface, name=name)
|
|
|
|
# Make sure we store the utility permanently in the OFS so we don't loose
|
|
# intids on uninstall
|
|
if USE_LSM:
|
|
if ofs_name and ofs_name not in sm.objectIds():
|
|
sm._setObject(ofs_name, aq_base(obj), set_owner=False,
|
|
suppress_events=True)
|
|
|
|
from intid import IIntIds, OFSIntIds
|
|
from zope.component import getUtility
|
|
|
|
def add_intids(site, findroot=False):
|
|
if USE_LSM:
|
|
klass = IntIds
|
|
else:
|
|
klass = OFSIntIds
|
|
addUtility(site, IIntIds, klass, ofs_name='intids', findroot=findroot)
|
|
|
|
def get_intids(context=None):
|
|
return getUtility(IIntIds, context=context)
|
|
|
|
def del_intids(context=None, findroot=False):
|
|
if findroot:
|
|
context = get_root(context)
|
|
utility = get_intids(context)
|
|
if USE_LSM:
|
|
getSiteManager(context).unregisterUtility(component=utility,
|
|
provided=IIntIds)
|
|
else:
|
|
parent = utility.aq_parent
|
|
parent.manage_delObjects([utility.__name__])
|