[Zope3-checkins] CVS: Zope3/src/zope/app/browser/services/utility - __init__.py:1.3 configure.zcml:1.12 registered.py:NONE

Jim Fulton jim@zope.com
Sun, 22 Jun 2003 10:02:35 -0400


Update of /cvs-repository/Zope3/src/zope/app/browser/services/utility
In directory cvs.zope.org:/tmp/cvs-serv22086/src/zope/app/browser/services/utility

Modified Files:
	__init__.py configure.zcml 
Removed Files:
	registered.py 
Log Message:
Moved the python view code into the __init__ module, from the
arbitrarily-named "registered" module.


=== Zope3/src/zope/app/browser/services/utility/__init__.py 1.2 => 1.3 ===
--- Zope3/src/zope/app/browser/services/utility/__init__.py:1.2	Fri Mar 21 16:02:18 2003
+++ Zope3/src/zope/app/browser/services/utility/__init__.py	Sun Jun 22 10:02:03 2003
@@ -1,2 +1,201 @@
+##############################################################################
 #
-# This file is necessary to make this directory a package.
+# Copyright (c) 2003 Zope Corporation and Contributors.
+# All Rights Reserved.
+# 
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Use-Registration view for utilities.
+
+$Id$
+"""
+
+from zope.app.browser.component.interfacewidget import InterfaceWidget
+from zope.app.browser.services.registration import AddComponentRegistration
+from zope.app.form.widget import CustomWidget
+from zope.app.interfaces.container import IZopeContainer
+from zope.app.interfaces.services.registration import ActiveStatus
+from zope.app.interfaces.services.registration import RegisteredStatus
+from zope.app.interfaces.services.registration import UnregisteredStatus
+from zope.app.traversing import getPath, getParent, getName
+from zope.component import getServiceManager, getView, getAdapter
+from zope.interface import providedBy
+from zope.proxy import removeAllProxies
+from zope.publisher.browser import BrowserView
+
+
+class UtilityInterfaceWidget(InterfaceWidget):
+    """Custom widget to select an interface from the component's interfaces.
+    """
+
+    def __call__(self):
+        field = self.context
+        component = field.context
+        result = ['\n<select name="%s">' % self.name]
+        for interface in providedBy(component).flattened():
+            result.append('  <option value="%s.%s">%s</option>' %
+                          (interface.__module__, interface.__name__,
+                           interface.__name__))
+        result.append('</select>')
+        return '\n'.join(result)
+        
+
+class AddRegistration(AddComponentRegistration):
+    """View for adding a utility registration.
+
+
+    We could just use AddComponentRegistration, except that we need a
+    custom interface widget.
+
+    This is a view on a local utility, configured by an <addform>
+    directive.
+    """
+
+    interface_widget = CustomWidget(UtilityInterfaceWidget)
+
+
+class Utilities(BrowserView):
+
+    # self.context is the local utility service
+
+    def update(self):
+        """Possibly delete one or more utilities.
+
+        In that case, issue a message.
+        """
+        selected = self.request.get("selected")
+        doActivate = self.request.get("Activate")
+        doDeactivate = self.request.get("Deactivate")
+        doDelete = self.request.get("Delete")
+        if not selected:
+            if doActivate or doDeactivate or doDelete:
+                return "Please select at least one checkbox"
+            return None
+        sm = getServiceManager(self.context)
+        todo = []
+        for key in selected:
+            name, ifacename = key.split(":", 1)
+            iface = sm.resolve(ifacename)
+            todo.append((key, name, iface))
+        if doActivate:
+            return self._activate(todo)
+        if doDeactivate:
+            return self._deactivate(todo)
+        if doDelete:
+            return self._delete(todo)
+
+    def _activate(self, todo):
+        done = []
+        for key, name, iface in todo:
+            registry = self.context.queryRegistrations(name, iface)
+            obj = registry.active()
+            if obj is None:
+                # Activate the first registered registration
+                obj = registry.info()[0]['registration']
+                obj.status = ActiveStatus
+                done.append(obj.usageSummary())
+        if done:
+            return "Activated: " + ", ".join(done)
+        else:
+            return "All of the checked utilities were already active"
+
+    def _deactivate(self, todo):
+        done = []
+        for key, name, iface in todo:
+            registry = self.context.queryRegistrations(name, iface)
+            obj = registry.active()
+            if obj is not None:
+                obj.status = RegisteredStatus
+                done.append(obj.usageSummary())
+        if done:
+            return "Deactivated: " + ", ".join(done)
+        else:
+            return "None of the checked utilities were active"
+
+    def _delete(self, todo):
+        errors = []
+        for key, name, iface in todo:
+            registry = self.context.queryRegistrations(name, iface)
+            assert registry
+            obj = registry.active()
+            if obj is not None:
+                errors.append(obj.usageSummary())
+                continue
+        if errors:
+            return ("Can't delete active utilit%s: %s; "
+                    "use the Deactivate button to deactivate" %
+                    (len(errors) != 1 and "ies" or "y", ", ".join(errors)))
+
+        # 1) Delete the registrations
+        services = {}
+        done = []
+        for key, name, iface in todo:
+            registry = self.context.queryRegistrations(name, iface)
+            assert registry
+            assert registry.active() is None # Phase error
+            first = True
+            for info in registry.info():
+                conf = info['registration']
+                obj = conf.getComponent()
+                if first:
+                    done.append(conf.usageSummary())
+                    first = False
+                path = getPath(obj)
+                services[path] = obj
+                conf.status = UnregisteredStatus
+                parent = getParent(conf)
+                name = getName(conf)
+                container = getAdapter(parent, IZopeContainer)
+                del container[name]
+
+        # 2) Delete the service objects
+        for path, obj in services.items():
+            parent = getParent(obj)
+            name = getName(obj)
+            container = getAdapter(parent, IZopeContainer)
+            del container[name]
+
+        return "Deleted: %s" % ", ".join(done)
+
+    def getConfigs(self):
+        L = []
+        for iface, name, cr in self.context.getRegisteredMatching():
+            active = obj = cr.active()
+            if obj is None:
+                obj = cr.info()[0]['registration'] # Pick a representative
+            ifname = _interface_name(iface)
+            d = {"interface": ifname,
+                 "name": name,
+                 "url": "",
+                 "summary": obj.usageSummary(),
+                 "configurl": ("@@configureutility.html?interface=%s&name=%s"
+                               % (ifname, name)),
+                 }
+            if active is not None:
+                d["url"] = str(getView(active.getComponent(),
+                                       "absolute_url",
+                                       self.request))
+            L.append((ifname, name, d))
+        L.sort()
+        return [d for ifname, name, d in L]
+
+
+class ConfigureUtility(BrowserView):
+    def update(self):
+        sm = getServiceManager(self.context)
+        iface = sm.resolve(self.request['interface'])
+        name = self.request['name']
+        cr = self.context.queryRegistrations(name, iface)
+        form = getView(cr, "ChangeRegistrations", self.request)
+        form.update()
+        return form
+
+
+def _interface_name(iface):
+    return "%s.%s" % (iface.__module__, iface.__name__)


=== Zope3/src/zope/app/browser/services/utility/configure.zcml 1.11 => 1.12 ===
--- Zope3/src/zope/app/browser/services/utility/configure.zcml:1.11	Sat Jun 21 17:22:05 2003
+++ Zope3/src/zope/app/browser/services/utility/configure.zcml	Sun Jun 22 10:02:03 2003
@@ -18,7 +18,7 @@
       menu="zmi_views" title="Utilities"
       name="utilities.html"
       template="utilities.pt"
-      class=".registered.Utilities"
+      class=".Utilities"
       permission="zope.ManageServices"
       />
 
@@ -38,7 +38,7 @@
       for="zope.app.interfaces.services.utility.ILocalUtilityService"
       name="configureutility.html"
       template="configureutility.pt"
-      class=".registered.ConfigureUtility"
+      class=".ConfigureUtility"
       permission="zope.ManageServices"
       />
 
@@ -51,7 +51,7 @@
       for="zope.app.interfaces.services.utility.ILocalUtility"
       name="addRegistration.html"
       schema="zope.app.interfaces.services.utility.IUtilityRegistration"
-      class=".registered.AddRegistration"
+      class=".AddRegistration"
       permission="zope.ManageServices"
       content_factory="zope.app.services.utility.UtilityRegistration"
       arguments="name interface componentPath"

=== Removed File Zope3/src/zope/app/browser/services/utility/registered.py ===