Commit 749a99d0 authored by Jim Fulton's avatar Jim Fulton

Rearranged so that products can get methods from special

areas not in the database.  This was necessary since storing
HTMLFile and ImageFile objects causes problems when databases are
moved.

If you have problems adding objects or seeing icons after moving
a database created with recent (between March 30 and April 1, 1999)
registration changes, you will need to create or update your product
version.txt files to get your products to be reloaded.
parent ea575773
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
# Implement the manage_addProduct method of object managers # Implement the manage_addProduct method of object managers
import Acquisition import Acquisition, sys
from string import rfind from string import rfind
class ProductDispatcher(Acquisition.Implicit): class ProductDispatcher(Acquisition.Implicit):
...@@ -128,7 +128,25 @@ class FactoryDispatcher(Acquisition.Implicit): ...@@ -128,7 +128,25 @@ class FactoryDispatcher(Acquisition.Implicit):
d=p.__dict__ d=p.__dict__
if hasattr(p,name) and d.has_key(name): if hasattr(p,name) and d.has_key(name):
return d[name] return d[name]
# Waaa
m='Products.%s' % p.id
if sys.modules.has_key(m):
return sys.modules[m]._m[name]
raise AttributeError, name raise AttributeError, name
# Provide acquired indicators for critical OM methods: # Provide acquired indicators for critical OM methods:
_setObject=Acquisition.Acquired _setObject=Acquisition.Acquired
# Provide a replacement for manage_main that does a redirection:
def manage_main(trueself, self, REQUEST, update_menu=0):
"""IMplement a contents view by redirecting to the true view
"""
d = update_menu and '/manage_main?update_menu=1' or '/manage_main'
REQUEST['RESPONSE'].redirect(self.DestinationURL()+d)
...@@ -85,7 +85,9 @@ ...@@ -85,7 +85,9 @@
"""Objects providing context for product initialization """Objects providing context for product initialization
""" """
from AccessControl.PermissionRole import PermissionRole from AccessControl.PermissionRole import PermissionRole
import Globals, os, OFS.ObjectManager import Globals, os, OFS.ObjectManager, OFS.misc_, Products
if not hasattr(Products, 'meta_types'): Products.meta_types=()
class ProductContext: class ProductContext:
...@@ -138,13 +140,15 @@ class ProductContext: ...@@ -138,13 +140,15 @@ class ProductContext:
""" """
app=self.__app app=self.__app
pack=self.__pack
initial=constructors[0] initial=constructors[0]
tt=type(()) tt=type(())
productObject=self.__prod productObject=self.__prod
pid=productObject.id
if icon and instance_class is not None: if icon and instance_class is not None:
setattr(instance_class, 'icon', 'Control_Panel/Products/%s/%s' % setattr(instance_class, 'icon', 'misc_/%s/%s' %
(productObject.id, os.path.split(icon)[1])) (pid, os.path.split(icon)[1]))
OM=OFS.ObjectManager.ObjectManager OM=OFS.ObjectManager.ObjectManager
...@@ -182,25 +186,32 @@ class ProductContext: ...@@ -182,25 +186,32 @@ class ProductContext:
if type(initial) is tt: name, initial = initial if type(initial) is tt: name, initial = initial
else: name=initial.__name__ else: name=initial.__name__
if productObject.__dict__.has_key(name): return if not hasattr(pack, '_m'): pack._m={}
m=pack._m
app._manage_add_product_meta_type( Products.meta_types=Products.meta_types+(
productObject, name, meta_type or instance_class.meta_type { 'name': meta_type or instance_class.meta_type,
) 'action': ('manage_addProduct/%s/%s' % (pid, name)),
'product': pid
},)
setattr(productObject, name, initial) m[name]=initial
setattr(productObject, name+'__roles__', pr) m[name+'__roles__']=pr
for method in constructors[1:]: for method in constructors[1:]:
if type(method) is tt: name, method = method if type(method) is tt: name, method = method
else: name=method.__name__ else: name=method.__name__
if not productObject.__dict__.has_key(name): if not productObject.__dict__.has_key(name):
setattr(productObject, name, method) m[name]=method
setattr(productObject, name+'__roles__', pr) m[name+'__roles__']=pr
if icon: if icon:
name=os.path.split(icon)[1] name=os.path.split(icon)[1]
icon=Globals.ImageFile(icon, self.__pack.__dict__) icon=Globals.ImageFile(icon, self.__pack.__dict__)
icon.__roles__=None icon.__roles__=None
setattr(productObject, name, icon) if not hasattr(OFS.misc_.misc_, pid):
setattr(OFS.misc_.misc_, pid, OFS.misc_.Misc_(pid, {}))
getattr(OFS.misc_.misc_, pid)[name]=icon
...@@ -85,19 +85,18 @@ ...@@ -85,19 +85,18 @@
__doc__='''Application support __doc__='''Application support
$Id: Application.py,v 1.97 1999/03/30 18:09:33 jim Exp $''' $Id: Application.py,v 1.98 1999/04/01 16:04:32 jim Exp $'''
__version__='$Revision: 1.97 $'[11:-2] __version__='$Revision: 1.98 $'[11:-2]
import Globals,Folder,os,regex,sys,App.Product, App.ProductRegistry, misc_ import Globals,Folder,os,regex,sys,App.Product, App.ProductRegistry, misc_
import time, traceback, os, string import time, traceback, os, string, Products
from string import strip, lower, find, rfind, join from string import strip, lower, find, rfind, join
from DateTime import DateTime from DateTime import DateTime
from AccessControl.User import UserFolder from AccessControl.User import UserFolder
from HelpSys.HelpSys import HelpSys from HelpSys.HelpSys import HelpSys
from App.ApplicationManager import ApplicationManager from App.ApplicationManager import ApplicationManager
from webdav.NullResource import NullResource from webdav.NullResource import NullResource
from Globals import Persistent
from FindSupport import FindSupport from FindSupport import FindSupport
from urllib import quote from urllib import quote
from cStringIO import StringIO from cStringIO import StringIO
...@@ -268,7 +267,7 @@ class Application(Globals.ApplicationDefaultPermissions, Folder.Folder, ...@@ -268,7 +267,7 @@ class Application(Globals.ApplicationDefaultPermissions, Folder.Folder,
class Expired(Persistent): class Expired(Globals.Persistent):
icon='p_/broken' icon='p_/broken'
def __setstate__(self, s={}): def __setstate__(self, s={}):
...@@ -402,7 +401,7 @@ def install_products(app): ...@@ -402,7 +401,7 @@ def install_products(app):
permission, names = p[:2] permission, names = p[:2]
folder_permissions[permission]=names folder_permissions[permission]=names
meta_types=list(Folder.dynamic_meta_types) meta_types=[]
product_names=os.listdir(product_dir) product_names=os.listdir(product_dir)
product_names.sort() product_names.sort()
...@@ -420,6 +419,11 @@ def install_products(app): ...@@ -420,6 +419,11 @@ def install_products(app):
product=__import__("Products.%s" % product_name, product=__import__("Products.%s" % product_name,
global_dict, global_dict, silly) global_dict, global_dict, silly)
misc_=pgetattr(product, 'misc_', {})
if misc_:
if type(misc_) is DictType: misc_=Misc_(product_name, misc_)
Application.misc_.__dict__[product_name]=misc_
# Set up dynamic project information. # Set up dynamic project information.
productObject=App.Product.initializeProduct( productObject=App.Product.initializeProduct(
product, product_name, package_dir, app) product, product_name, package_dir, app)
...@@ -463,14 +467,10 @@ def install_products(app): ...@@ -463,14 +467,10 @@ def install_products(app):
Folder.__dict__['__ac_permissions__']=tuple( Folder.__dict__['__ac_permissions__']=tuple(
list(Folder.__ac_permissions__)+new_permissions) list(Folder.__ac_permissions__)+new_permissions)
misc_=pgetattr(product, 'misc_', {})
if type(misc_) is DictType: misc_=Misc_(product_name, misc_)
Application.misc_.__dict__[product_name]=misc_
get_transaction().note('Installed product '+product_name) get_transaction().note('Installed product '+product_name)
get_transaction().commit() get_transaction().commit()
Folder.dynamic_meta_types=tuple(meta_types) Products.meta_types=Products.meta_types+tuple(meta_types)
Globals.default__class_init__(Folder) Globals.default__class_init__(Folder)
......
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