[Zope-Checkins] CVS: Zope/lib/python/App - ZopeComponents.py:1.1.2.3

Shane Hathaway shane@digicool.com
Fri, 28 Sep 2001 13:59:44 -0400


Update of /cvs-repository/Zope/lib/python/App
In directory cvs.zope.org:/tmp/cvs-serv7065

Modified Files:
      Tag: ComponentArchitecture-branch
	ZopeComponents.py 
Log Message:
Added feature-based adders and refined the Adder and AdderEntry interfaces.


=== Zope/lib/python/App/ZopeComponents.py 1.1.2.2 => 1.1.2.3 ===
+from urllib import quote
 import Interface
+import ComponentArchitecture
 
 
 class Adder (Interface.Base):
 
+    def getContainerURL():
+        """
+        """
+
+    def getName():
+        """
+        """
+
     def addToContainer(ob):
         """
         """
@@ -15,11 +25,19 @@
 
 class AdderEntry (Interface.Base):
 
+    def getId():
+        """
+        """
+
     def getName():
         """
         """
 
-    def getAction():
+    def getProduct():
+        """
+        """
+
+    def getDescription():
         """
         """
 
@@ -35,6 +53,10 @@
         """
         """
 
+    def _invoke(adder, id, request):
+        """
+        """
+
 
 class PresentationAdderEntry:
 
@@ -42,18 +64,28 @@
 
     __implements__ = AdderEntry
 
-    def __init__(self, name, description, pres_name, interfaces=None,
+    def __init__(self, name, product, description, pres_name, interfaces=None,
                  global_visibility=1, permission=None):
         self.name = name
+        self.product = product
         self.description = description
         self.pres_name = pres_name
         self.interfaces = interfaces
         self.global_visibility = global_visibility
         self.permission = permission
 
+    def getId(self):
+        return '(p)%s' % self.pres_name
+
     def getName(self):
         return self.name
 
+    def getProduct(self):
+        return self.product
+
+    def getDescription(self):
+        return self.description
+
     def isGloballyVisible(self):
         return self.global_visibility
 
@@ -63,12 +95,70 @@
     def getPermission(self):
         return self.permission
 
-    def getAction(self):
-        return '(p)add/(p)%s' % self.pres_name
+    def _invoke(self, adder, id, request):
+        if not id:
+            raise 'An id is required.'
+        c_url = adder.getContainerURL()
+        add_name = adder.getName()
+        request.response.redirect(
+            '%s/%s/(id)%s/(p)%s' % (c_url, add_name,
+                                    quote(id), quote(self.pres_name)))
+        return ''
+
+
+class FeatureAdderEntry:
+
+    __allow_access_to_unprotected_subobjects__ = 1
+
+    __implements__ = AdderEntry
+
+    def __init__(self, name, product, description, feature_name, method,
+                 interfaces=None, global_visibility=1, permission=None):
+        self.name = name
+        self.product = product
+        self.description = description
+        self.feature_name = feature_name
+        self.method = method
+        self.interfaces = interfaces
+        self.global_visibility = global_visibility
+        self.permission = permission
+
+    def getId(self):
+        return '(f)%s/%s' % (self.feature_name, self.method)
+
+    def getName(self):
+        return self.name
+
+    def getProduct(self):
+        return self.product
+
+    def getDescription(self):
+        return self.description
+
+    def isGloballyVisible(self):
+        return self.global_visibility
+
+    def getInterfaces(self):
+        return self.interfaces
+
+    def getPermission(self):
+        return self.permission
+
+    def _invoke(self, adder, id, request):
+        if not id:
+            raise 'An id is required.'
+        f = ComponentArchitecture.getFeature(adder, self.feature_name)
+        m = getattr(f, self.method)
+        ob = m()
+        adder.addToContainer(ob)
+        return adder.resultAfterAdd()
+
 
 
 class ClassicAdderEntry:
 
+    __allow_access_to_unprotected_subobjects__ = 1
+
     __implements__ = AdderEntry
 
     visibility = None
@@ -76,13 +166,23 @@
     permission = None
     action = None
     product = None
+    description = ''
 
     def __init__(self, mt):
         self.__dict__.update(mt)
 
+    def getId(self):
+        return self.action
+
     def getName(self):
         return self.name
 
+    def getProduct(self):
+        return self.product
+
+    def getDescription(self):
+        return self.description
+
     def isGloballyVisible(self):
         return (self.visibility == 'Global')
 
@@ -92,8 +192,11 @@
     def getPermission(self):
         return self.permission
 
-    def getAction(self):
-        return self.action
+    def _invoke(self, adder, id, request):
+        c_url = adder.getContainerURL()
+        request.response.redirect(
+            '%s/%s?id=%s' % (c_url, quote(self.action), quote(id)))
+        return ''
 
 
 def convertMetaTypeList(mts):