From 1bbe1e06b0e92f12e2bbbb14a0ec4be906f0c343 Mon Sep 17 00:00:00 2001
From: Jim Fulton <jim@zope.com>
Date: Tue, 30 Mar 1999 17:54:23 +0000
Subject: [PATCH] *** empty log message ***

---
 lib/python/App/ProductContext.py | 204 +++++++++++++++++++++++++++++++
 1 file changed, 204 insertions(+)
 create mode 100644 lib/python/App/ProductContext.py

diff --git a/lib/python/App/ProductContext.py b/lib/python/App/ProductContext.py
new file mode 100644
index 000000000..265d048f9
--- /dev/null
+++ b/lib/python/App/ProductContext.py
@@ -0,0 +1,204 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+"""Objects providing context for product initialization
+"""
+from AccessControl.PermissionRole import PermissionRole
+import Globals, os, OFS.ObjectManager
+
+class ProductContext:
+
+    def __init__(self, product, app, package):
+        self.__prod=product
+        self.__app=app
+        self.__pack=package
+
+    def registerClass(self, instance_class=None, meta_type='', 
+                      permission=None, constructors=(),
+                      icon=None, permissions=None, legacy=(),
+        ):
+        """Register a constructor
+
+        Keyword arguments are used to provide meta data:
+
+        instance_class -- The class of the object that will be created.
+        
+          This is not currently used, but may be used in the future to
+          increase object mobility.
+
+        meta_type -- The kind of object being created
+           This appears in add lists.  If not specified, then the class
+           meta_type will be used.
+
+        permission -- The permission name for the constructors.
+           If not specified, then a permission name based on the
+           meta type will be used.
+
+        constructors -- A list of constructor methods
+          A method can me a callable object with a __name__
+          attribute giving the name the method should have in the
+          product, or the method may be a tuple consisting of a
+          name and a callable object.  The method must be picklable.
+
+          The first method will be used as the initial method called
+          when creating an object.
+
+        icon -- The name of an image file in the package to
+                be used for instances. Note that the class icon
+                attribute will be set automagically if an icon is
+                provided.
+
+        permissions -- Additional permissions to be registered
+           If not provided, then permissions defined in the
+           class will be registered.
+        
+        legacy -- A list of legacy methods to be added to ObjectManager
+                  for backward compatibility
+
+        """
+        initial=constructors[0]
+        tt=type(())
+        productObject=self.__prod
+
+        if type(initial) is tt: name, initial = initial
+        else: name=initial.__name__
+
+        if icon and instance_class is not None:
+            setattr(instance_class, 'icon', 'Control_Panel/Products/%s/%s' %
+                    (productObject.id, os.path.split(icon)[1]))
+
+        OM=OFS.ObjectManager.ObjectManager
+
+        perms={}
+        for p in OM.__ac_permissions__: perms[p[0]]=None
+
+        if permission is None:
+            permission="Add %ss" % (meta_type or instance_class.meta_type)
+
+        if permissions is None:
+            permissions=[]
+            for p in instance_class.__ac_permissions__:
+                if len(p) > 2: permissions.append((p[0],p[2]))
+                else: permissions.append(p[0])
+
+        pr=None
+        for p in (permission,)+tuple(permissions):
+            if type(p) is tt: p, default= p
+            else: default=('Manager',)
+
+            if pr is None: pr=PermissionRole(p,default)
+            
+            if not perms.has_key(p):
+                perms[p]=None
+                OM.__ac_permissions__=OM.__ac_permissions__+((p,(),default),)
+
+        for method in legacy:
+            if type(method) is tt: name, method = method
+            else: name=method.__name__
+            if not OM.__dict__.has_key(name):
+                setattr(OM, name, method)
+                setattr(OM, name+'__roles__', pr)
+
+        if productObject.__dict__.has_key(name): return
+
+        self.__app._manage_add_product_meta_type(
+            productObject, name, meta_type or instance_class.meta_type
+            )
+        
+        setattr(productObject, name, initial)
+        setattr(productObject, 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)
+
+        if icon:
+            name=os.path.split(icon)[1]
+            icon=Globals.ImageFile(icon, self.__pack.__dict__)
+            icon.__roles__=None
+            setattr(productObject, name, icon)
+            
-- 
2.30.9