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 @@
# Implement the manage_addProduct method of object managers
import Acquisition
import Acquisition, sys
from string import rfind
class ProductDispatcher(Acquisition.Implicit):
......@@ -128,7 +128,25 @@ class FactoryDispatcher(Acquisition.Implicit):
d=p.__dict__
if hasattr(p,name) and d.has_key(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
# Provide acquired indicators for critical OM methods:
_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 @@
"""Objects providing context for product initialization
"""
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:
......@@ -138,13 +140,15 @@ class ProductContext:
"""
app=self.__app
pack=self.__pack
initial=constructors[0]
tt=type(())
productObject=self.__prod
pid=productObject.id
if icon and instance_class is not None:
setattr(instance_class, 'icon', 'Control_Panel/Products/%s/%s' %
(productObject.id, os.path.split(icon)[1]))
setattr(instance_class, 'icon', 'misc_/%s/%s' %
(pid, os.path.split(icon)[1]))
OM=OFS.ObjectManager.ObjectManager
......@@ -182,25 +186,32 @@ class ProductContext:
if type(initial) is tt: name, initial = initial
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(
productObject, name, meta_type or instance_class.meta_type
)
setattr(productObject, name, initial)
setattr(productObject, name+'__roles__', pr)
Products.meta_types=Products.meta_types+(
{ 'name': meta_type or instance_class.meta_type,
'action': ('manage_addProduct/%s/%s' % (pid, name)),
'product': pid
},)
m[name]=initial
m[name+'__roles__']=pr
for method in constructors[1:]:
if type(method) is tt: name, method = method
else: name=method.__name__
if not productObject.__dict__.has_key(name):
setattr(productObject, name, method)
setattr(productObject, name+'__roles__', pr)
m[name]=method
m[name+'__roles__']=pr
if icon:
name=os.path.split(icon)[1]
icon=Globals.ImageFile(icon, self.__pack.__dict__)
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 @@
__doc__='''Application support
$Id: Application.py,v 1.97 1999/03/30 18:09:33 jim Exp $'''
__version__='$Revision: 1.97 $'[11:-2]
$Id: Application.py,v 1.98 1999/04/01 16:04:32 jim Exp $'''
__version__='$Revision: 1.98 $'[11:-2]
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 DateTime import DateTime
from AccessControl.User import UserFolder
from HelpSys.HelpSys import HelpSys
from App.ApplicationManager import ApplicationManager
from webdav.NullResource import NullResource
from Globals import Persistent
from FindSupport import FindSupport
from urllib import quote
from cStringIO import StringIO
......@@ -268,7 +267,7 @@ class Application(Globals.ApplicationDefaultPermissions, Folder.Folder,
class Expired(Persistent):
class Expired(Globals.Persistent):
icon='p_/broken'
def __setstate__(self, s={}):
......@@ -402,7 +401,7 @@ def install_products(app):
permission, names = p[:2]
folder_permissions[permission]=names
meta_types=list(Folder.dynamic_meta_types)
meta_types=[]
product_names=os.listdir(product_dir)
product_names.sort()
......@@ -419,6 +418,11 @@ def install_products(app):
product=__import__("Products.%s" % product_name,
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.
productObject=App.Product.initializeProduct(
......@@ -462,15 +466,11 @@ def install_products(app):
new_permissions.sort()
Folder.__dict__['__ac_permissions__']=tuple(
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().commit()
Folder.dynamic_meta_types=tuple(meta_types)
Products.meta_types=Products.meta_types+tuple(meta_types)
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