cybertools/z2/intid/site.py
helmutm d1110c410e include slightly modified copy of five.intid
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3685 fd906abe-77d9-0310-91a1-e0d9ade77398
2010-01-14 12:12:30 +00:00

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__])