Commit af746749 authored by 's avatar

Merged fix for products with old-style initialization not being properly

filtered by permission in the filtered add list.
parent 499caee1
...@@ -85,8 +85,8 @@ ...@@ -85,8 +85,8 @@
__doc__='''Application support __doc__='''Application support
$Id: Application.py,v 1.130 2000/07/28 15:50:05 jim Exp $''' $Id: Application.py,v 1.131 2000/08/02 17:31:54 brian Exp $'''
__version__='$Revision: 1.130 $'[11:-2] __version__='$Revision: 1.131 $'[11:-2]
import Globals,Folder,os,sys,App.Product, App.ProductRegistry, misc_ import Globals,Folder,os,sys,App.Product, App.ProductRegistry, misc_
import time, traceback, os, string, Products import time, traceback, os, string, Products
...@@ -408,6 +408,7 @@ def import_products(_st=type('')): ...@@ -408,6 +408,7 @@ def import_products(_st=type('')):
try: modules[pname].__import_error__=f try: modules[pname].__import_error__=f
except: pass except: pass
def install_products(app): def install_products(app):
# Install a list of products into the basic folder class, so # Install a list of products into the basic folder class, so
# that all folders know about top-level objects, aka products # that all folders know about top-level objects, aka products
...@@ -439,70 +440,94 @@ def install_products(app): ...@@ -439,70 +440,94 @@ def install_products(app):
product_names.sort() product_names.sort()
for product_name in product_names: for product_name in product_names:
# For each product, we will import it and try to call the
if done.has_key(product_name): continue # intialize() method in the product __init__ module. If
# the method doesnt exist, we put the old-style information
# together and do a default initialization.
if done.has_key(product_name):
continue
done[product_name]=1 done[product_name]=1
package_dir=path_join(product_dir, product_name) package_dir=path_join(product_dir, product_name)
__traceback_info__=product_name __traceback_info__=product_name
if not isdir(package_dir): continue if not isdir(package_dir): continue
if not exists(path_join(package_dir, '__init__.py')): if not exists(path_join(package_dir, '__init__.py')):
if not exists(path_join(package_dir, '__init__.pyc')): if not exists(path_join(package_dir, '__init__.pyc')):
continue continue
try: try:
product=__import__("Products.%s" % product_name, product=__import__("Products.%s" % product_name,
global_dict, global_dict, silly) global_dict, global_dict, silly)
# Install items into the misc_ namespace, used by products
# and the framework itself to store common static resources
# like icon images.
misc_=pgetattr(product, 'misc_', {}) misc_=pgetattr(product, 'misc_', {})
if misc_: if misc_:
if type(misc_) is DictType: if type(misc_) is DictType:
misc_=Misc_(product_name, misc_) misc_=Misc_(product_name, misc_)
Application.misc_.__dict__[product_name]=misc_ Application.misc_.__dict__[product_name]=misc_
# Set up dynamic project information. # Here we create a ProductContext object which contains
# information about the product and provides an interface
# for registering things like classes and help topics that
# should be associated with that product. Products are
# expected to implement a method named 'initialize' in
# their __init__.py that takes the ProductContext as an
# argument.
productObject=App.Product.initializeProduct( productObject=App.Product.initializeProduct(
product, product_name, package_dir, app) product, product_name, package_dir, app)
context=ProductContext(productObject, app, product)
pgetattr(product, 'initialize', lambda context: None)(
ProductContext(productObject, app, product)) # Look for an 'initialize' method in the product. If it does
# not exist, then this is an old product that has never been
permissions={} # updated. In that case, we will analyze the product and
new_permissions={} # build up enough information to do initialization manually.
for p in pgetattr(product, '__ac_permissions__', ()): initmethod=pgetattr(product, 'initialize', None)
permission, names, default = (tuple(p)+('Manager',))[:3] if initmethod is not None:
if names: initmethod(context)
for name in names: else:
permissions[name]=permission permissions={}
new_permissions={}
elif not folder_permissions.has_key(permission): for p in pgetattr(product, '__ac_permissions__', ()):
new_permissions[permission]=() permission, names, default = (
tuple(p)+('Manager',))[:3]
for meta_type in pgetattr(product, 'meta_types', ()): if names:
if product_name=='OFSP': meta_types.insert(0,meta_type) for name in names:
else: meta_types.append(meta_type) permissions[name]=permission
elif not folder_permissions.has_key(permission):
new_permissions[permission]=()
for name,method in pgetattr(product, 'methods', {}).items():
if not hasattr(Folder, name): for meta_type in pgetattr(product, 'meta_types', ()):
setattr(Folder, name, method) # Modern product initialization via a ProductContext
if name[-9:]!='__roles__': # not Just setting roles # adds 'product' and 'permission' keys to the meta_type
if (permissions.has_key(name) and # mapping. We have to add these here for old products.
not folder_permissions.has_key( pname=permissions.get(meta_type['action'], None)
permissions[name])): if pname is not None:
permission=permissions[name] meta_type['permission']=pname
if new_permissions.has_key(permission): meta_type['product']=productObject.id
new_permissions[permission].append(name) meta_types.append(meta_type)
else:
new_permissions[permission]=[name] for name,method in pgetattr(
product, 'methods', {}).items():
if new_permissions: if not hasattr(Folder, name):
new_permissions=new_permissions.items() setattr(Folder, name, method)
for permission, names in new_permissions: if name[-9:]!='__roles__': # not Just setting roles
folder_permissions[permission]=names if (permissions.has_key(name) and
new_permissions.sort() not folder_permissions.has_key(
Folder.__dict__['__ac_permissions__']=tuple( permissions[name])):
list(Folder.__ac_permissions__)+new_permissions) permission=permissions[name]
if new_permissions.has_key(permission):
new_permissions[permission].append(name)
else:
new_permissions[permission]=[name]
if new_permissions:
new_permissions=new_permissions.items()
for permission, names in new_permissions:
folder_permissions[permission]=names
new_permissions.sort()
Folder.__dict__['__ac_permissions__']=tuple(
list(Folder.__ac_permissions__)+new_permissions)
if os.environ.get('ZEO_CLIENT',''): if os.environ.get('ZEO_CLIENT',''):
# we don't want to install products from clients! # we don't want to install products from clients!
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment