[Zope3-checkins] CVS: Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser - AddModule.py:1.1.2.1 AddServiceConfiguration.py:1.1.2.1 Adding.py:1.1.2.1 ComponentAdding.py:1.1.2.1 EditConfiguration.py:1.1.2.1 EditModule.py:1.1.2.1 PackagesContents.py:1.1.2.1 ServiceConfigEdit.pt:1.1.2.1 ServiceConfigEditPart.pt:1.1.2.1 ServiceConfigSummary.pt:1.1.2.1 ServiceConfigURL.py:1.1.2.1 Services.pt:1.1.2.1 Services.py:1.1.2.1 __init__.py:1.1.2.1 add_module.pt:1.1.2.1 add_service_1.pt:1.1.2.1 add_service_2.pt:1.1.2.1 configure.zcml:1.1.2.1 editConfiguration.pt:1.1.2.1 edit_module.pt:1.1.2.1 packages_contents.pt:1.1.2.1

Jim Fulton jim@zope.com
Sat, 30 Nov 2002 07:44:31 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser
In directory cvs.zope.org:/tmp/cvs-serv30047/lib/python/Zope/App/OFS/Services/ServiceManager/Browser

Added Files:
      Tag: Zope3-Bangalore-TTW-Branch
	AddModule.py AddServiceConfiguration.py Adding.py 
	ComponentAdding.py EditConfiguration.py EditModule.py 
	PackagesContents.py ServiceConfigEdit.pt 
	ServiceConfigEditPart.pt ServiceConfigSummary.pt 
	ServiceConfigURL.py Services.pt Services.py __init__.py 
	add_module.pt add_service_1.pt add_service_2.pt configure.zcml 
	editConfiguration.pt edit_module.pt packages_contents.pt 
Log Message:
Refactored the way TTW component registration is done.  There are now
separate registry objects that abstract the machinery for registering
multiple conflicting configurations and deciding which, if any are
active.  Also provided a new field and widget for the status
information.

Along the way, cleaned up and streamlined placeful testing
infrastructure a bit.

Now checking into branch. Will give file-by-file (or at least more
specific logs) when the changes are merged into the head.


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/AddModule.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""Handle form to create module

$Id: AddModule.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.App.OFS.Services.ServiceManager.Module import Manager

class AddModule(BrowserView):

    def action(self, name, source):
        mgr = Manager()
        mgr = self.context.add(mgr)
        mgr.new(name, source)
        self.request.response.redirect(self.context.nextURL())


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/AddServiceConfiguration.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""XXX short summary goes here.

XXX longer description goes here.

$Id: AddServiceConfiguration.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""
__metaclass__ = type

from Zope.ComponentArchitecture import getServiceManager
from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.App.OFS.Services.ServiceManager.ServiceConfiguration \
     import ServiceConfiguration
from Zope.App.OFS.Services.ConfigurationInterfaces import IConfiguration
from Zope.App.Forms.Utility import setUpWidgets, getWidgetsDataForContent

class AddServiceConfiguration(BrowserView):

    def __init__(self, *args):
        super(AddServiceConfiguration, self).__init__(*args)
        setUpWidgets(self, IConfiguration)

    def services(self):
        service = getServiceManager(self.context.context)
        definitions = service.getServiceDefinitions()
        names = [name for (name, interface) in definitions]
        names.sort()
        return names

    def components(self):
        service_type = self.request['service_type']
        service = getServiceManager(self.context.context)
        type = service.getInterfaceFor(service_type)
        paths = [info['path']
                 for info in service.queryComponent(type=type)
                 ]
        paths.sort()
        return paths

    def action(self, service_type, component_path):
        sd = ServiceConfiguration(service_type, component_path)
        sd = self.context.add(sd)
        getWidgetsDataForContent(self, IConfiguration, sd)
        self.request.response.redirect(self.context.nextURL())



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/Adding.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""Adding components for components and configuration

$Id: Adding.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.App.OFS.Container.Views.Browser.Adding import Adding as ContentAdding


class ComponentAdding(ContentAdding):
    """Adding component for components
    """
    
    menu_id = "add_component"

    def action(self, type_name, id):
        if not id:
            # Generate an id from the type name
            id = type_name
            if id in self.context:
                i=2
                while ("%s-%s" % (id, i)) in self.context:
                    i=i+1
                id = "%s-%s" % (id, i)
        return super(ComponentAdding, self).action(type_name, id)

class ConfigurationAdding(ContentAdding):
    """Adding component for configuration
    """
    
    menu_id = "add_configuration"


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/ComponentAdding.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""

$Id: ComponentAdding.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.App.OFS.Container.Views.Browser.Adding import Adding
from Zope.App.OFS.Services.ServiceManager.IServiceAdding import IServiceAdding

class ServiceAdding(Adding):
    
    __implements__ = IServiceAdding



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/EditConfiguration.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""
$Id: EditConfiguration.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.ComponentArchitecture import getView, getAdapter
from Zope.Proxy.ContextWrapper import ContextWrapper
from Zope.App.OFS.Container.IZopeContainer import IZopeContainer

class EditConfiguration(BrowserView):
    """Adding component for service containers
    """

    menu_id = "add_component"

    def __init__(self, context, request):
        self.request = request
        self.context = context

    def action(self):
        """Perform actions depending on user input.

        
        """
        if 'keys' in self.request:
            k = self.request['keys']

        if 'add_submit' in self.request:
            self.request.response.redirect('+')
        elif 'remove_submit' in self.request:
            self.remove_objects(k)
        elif 'top_submit' in self.request:
            self.context.arrange_object(k[0], 'top')
        elif 'bottom_submit' in self.request:
            self.context.arrange_object(k[0],'bottom')
        elif 'up_submit' in self.request:
            self.context.arrange_object(k[0],'up')
        elif 'down_submit' in self.request:
            self.context.arrange_object(k[0],'down')

        return ''

    def remove_objects(self, key_list):
        """Remove the directives from the container.
        """
        container = getAdapter(self.context, IZopeContainer)
        for item in key_list:
            del container[item]
            
    def configInfo(self):
        """Render View for each direcitves.
        """
        r = []
        for name, directive in self.context.items():
            d = ContextWrapper(directive, self.context, name = name)
            view = getView(d, 'ItemEdit', self.request)
            view.setPrefix('config'+str(name))
            r.append({'key': name, 'view': view})
        return r

__doc__ = EditConfiguration.__doc__ + __doc__



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/EditModule.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""Handle form to edit module

$Id: EditModule.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.App.OFS.Services.ServiceManager.Module import Manager

class EditModule(BrowserView):

    def update(self):
        if "source" in self.request:
            self.context.update(self.request["source"])
            return u"The source was updated."
        else:
            return u""


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/PackagesContents.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 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.
# 
##############################################################################
"""

Revision information: $Id: PackagesContents.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""
from Zope.App.OFS.Container.Views.Browser.Contents import Contents
from Zope.App.OFS.Services.ServiceManager.IServiceManager \
     import IServiceManager
from Zope.App.OFS.Services.ServiceManager.Package import Package



from Zope.Publisher.Browser.BrowserView import BrowserView

from Zope.App.PageTemplate import ViewPageTemplateFile
from Zope.App.OFS.Container.IContainer import IContainer
from Zope.ComponentArchitecture import queryView, getView

class PackagesContents(Contents):

    __used_for__ = IServiceManager

    index = ViewPageTemplateFile('packages_contents.pt')

    def addPackage(self, name):
        self.context.setObject(name, Package())
        self.request.response.redirect('.')


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/ServiceConfigEdit.pt ===
<html metal:use-macro="views/standard_macros/page">
  <body>
  <div metal:fill-slot="body">

    <div metal:use-macro="view/generated_form/macros/body">

      <table metal:fill-slot="extra_info">
        <tr>
          <td>Service type</td>
          <td tal:content="context/serviceType">Foo</td>    
        </tr>
        <tr>
          <td>Component Path</td>
          <td tal:content="context/componentPath">
            <a href='.'
               tal:attributes="href view/componentURL"
               tal:content="context/componentPath">foo/bar</a>
          </td>    
        </tr>
      </table>

    </div>
  </div>
  </body>
</html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/ServiceConfigEditPart.pt ===
<div metal:use-macro="view/generated_form/macros/formbody">

  <table metal:fill-slot="extra_info">
    <tr>
      <td>Service type</td>
      <td tal:content="context/serviceType">Foo</td>    
    </tr>
    <tr>
      <td>Component Path</td>
      <td>
       <a href="."
          tal:content="context/componentPath"
          tal:define="service context/getService"
          tal:attributes="href service/@@absolute_url"
          >Foo</a>
      </td>    
    </tr>
  </table>

</div>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/ServiceConfigSummary.pt ===
<span tal:replace="context/title" />
<a href='.'
   tal:attributes="href view/componentURL"
   tal:content="context/componentPath">foo/bar</a>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/ServiceConfigURL.py ===
##############################################################################
#
# Copyright (c) 2002 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.
# 
##############################################################################
"""
$Id: ServiceConfigURL.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.ComponentArchitecture import getView
from Zope.App.Traversing import traverse

__metaclass__ = type

class ServiceConfigURL:
    """Describe C objects
    """

    def componentURL(self):
        ob = traverse(self.context, self.context.componentPath)
        return str(getView(ob, 'absolute_url', self.request))

__doc__ = ServiceConfigURL.__doc__ + __doc__



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/Services.pt ===
<html metal:use-macro="views/standard_macros/page">
<body metal:fill-slot="body" tal:define="services view/update">

  <h2>Services configured in this service manager.</h2>

  <p tal:condition="not:services">
       No services have been configured
  </p>

  <div tal:condition="services">

      <p>For each service, the service name is given and all of the
         components registered to provide the service are shown.  You
         map select the component to provide the service or disable the
         service.
      </p>

      <p>Select a service name or a component name to visit the service
         or component. </p>

      <form action="." method="post"
            tal:attributes="action request/URL">

      <table width="100%">

         <tr tal:repeat="service services">
           <td valign="top" align="right">
              <a href="Roles"
                 tal:content="service/name"
                 tal:attributes="href service/name"
                 tal:condition="service/active"
                 >Roles</a>
              <span tal:replace="service/name" 
                    tal:condition="service/inactive" />
           </td>
           <td tal:content="structure service/view">
           </td>
         </tr>

      </table>

      <input type=submit name="submit_update" value="Update"><br>

      </form>

  </div>

  <p>To configure a service, add a service component to a
     <em>package</em> in <a href="Packages">Packages</a> or to
     the <a href="Packages/default">default package</a>. After the
     component is added, add a service configuration that configures the
     component to provide a service.
  </p>

</body>
</html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/Services.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 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.
# 
##############################################################################
"""

$Id: Services.py,v 1.1.2.1 2002/11/30 12:44:28 jim Exp $
"""

from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.ComponentArchitecture import getView

class Services(BrowserView):

    def update(self):

        service_types = list(self.context.getBoundServiceTypes())
        service_types.sort()

        services = []
        for service_type in service_types:
            registry = self.context.queryConfigurations(service_type)
            view = getView(registry, "ChangeConfigurations", self.request)
            view.setPrefix(service_type)
            view.update()
            active = registry.active() is not None
            services.append(
                {"name": service_type,
                 "active": active,
                 "inactive": not active,
                 "view": view,
                 })

        return services
    


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/__init__.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 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.
# 
##############################################################################



=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/add_module.pt ===
<html metal:use-macro="views/standard_macros/page">
<head><title>Add a module</title></head>
<body>
<div metal:fill-slot="body">

<p>Enter the absolute module name and source code.</p>

<form action="action.html">
<input name="name">
<textarea name="source:text" cols="65" rows="25"></textarea>
<input type="submit" value="Add module"/>
</form>

</div></body></html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/add_service_1.pt ===
<html metal:use-macro="views/standard_macros/page">
<head><title>Add a service component</title></head>
<body>
<div metal:fill-slot="body">

<form action="step2.html">
<table>
<tr>
  <td>Service Type</td>
  <td>
    <select name="service_type">
      <option tal:repeat="service view/services"
              tal:attributes="value service"
              tal:content="service">service</option>
    </select>
  </td>
</tr>
<tr>
  <td>Title</td>
  <td tal:content="structure view/title"><input type="text"></td>
</tr>
<tr>
  <td>Description</td>
  <td tal:content="structure view/description"><textarea></textarea></td>
</tr>
</table>
<input type=submit value="Next"/>
</form>

</div></body></html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/add_service_2.pt ===
<html metal:use-macro="views/standard_macros/page">
<head><title>Contact Information</title></head>
<body>
<div metal:fill-slot="body">

<form action="finish.html" method="post">
  <input type="hidden" name="service_type" value="" 
         tal:attributes="value request/service_type" />
  <table>
     <tr>
       <td>Service Type</td>
       <td tal:content="request/service_type">Roles</td>
     </tr>
     <tr>
       <td>Component</td>
       <td><select name="component_path">
             <option tal:repeat="path view/components"
                     tal:attributes="value path"
                     tal:content="path">path</option>
           </select>
       </td>
     </tr>
     <tr>
       <td>Status</td>
       <td tal:content="structure view/status"><input type="text"></td>
     </tr>
     <tr>
       <td>Title</td>
       <td tal:content="structure view/title"><input type="text"></td>
     </tr>
     <tr>
       <td>Description</td>
       <td tal:content="structure view/description"><textarea></textarea></td>
     </tr>

  </table>
  <input type="submit" />
</form>

</div></body></html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/configure.zcml ===
<zope:zopeConfigure
   xmlns:zope='http://namespaces.zope.org/zope'
   xmlns='http://namespaces.zope.org/browser'
   xmlns:form="http://namespaces.zope.org/form"
   package="Zope.App.OFS.Services.ServiceManager"
>

<!-- ServiceManager -->

  <defaultView 
     for=".IServiceManager."
     name="index.html"
     />
 
  <view 
     for=".IServiceManager."
     name="index.html"
     template="Browser/Services.pt"
     class=".Browser.Services."
     permission="Zope.ManageServices" 
     />

  <menuItems menu="zmi_views" for=".IServiceManager.">
    <menuItem title="Services"
              action="@@index.html"/>
    <menuItem title="Packages"
              action="Packages/@@SelectedManagementView.html"/>
    <menuItem title="Default Package"
              action="Packages/default/@@SelectedManagementView.html"/>
    </menuItems>

<!-- Packages -->

  <defaultView for=".IPackages." name="contents.html" />

  <view
      for=".IPackages."
      permission="Zope.ManageServices" 
      factory=".Browser.PackagesContents.">

    <page name="contents.html"
                  attribute="index"
                  />
    <page name="addPackage.html"
                  attribute="addPackage"
                  />
    <page name="removeObjects.html"
                  attribute="removeObjects"
                  />
  </view>

  <menuItems menu="zmi_views" for=".IPackages.">
    <menuItem title="Services"
              action="@@contents.html"/>
  </menuItems>

  <defaultView for=".IPackage." name="contents.html" />


<!-- Package -->

  <view 
     for=".IPackage."
     permission="Zope.ManageServices"
     factory="Zope.App.OFS.Container.Views.Browser.Contents."
     >

    <page name="contents.html" attribute="contents" />
    <page name="removeObjects.html" attribute="removeObjects" />
   </view>

  <menuItems menu="zmi_views" for=".IPackage.">
    <menuItem title="Services"
              action="@@contents.html"/>
  </menuItems>

  <menu id="add_component" 
        title="Menu of objects to be added to service managers"
        />

  <view 
     name="+"
     permission="Zope.ManageServices" 
     for=".IPackage."
     factory=".Browser.Adding.ComponentAdding">

    <page name="index.html"  attribute="index"  />
    <page name="action.html" attribute="action" />

  </view> 

<!-- ConfigurationManager -->

  <defaultView 
     for=".IConfigurationManager."
     name="contents.html"
     />

  <view 
     for=".IConfigurationManager."
     permission="Zope.ManageServices" 
     factory=".Browser.EditConfiguration.">
    <page name="contents.html" template="Browser/editConfiguration.pt" />
  </view> 

 <menuItems menu="zmi_views" for=".IConfigurationManager.">
    <menuItem title="Configuration" action="contents.html" />
 </menuItems>

  <view 
     for=".IConfigurationManager."
     name="+"
     permission="Zope.ManageServices" 
     factory=".Browser.Adding.ConfigurationAdding">
    <page name="index.html"  attribute="index"  />
    <page name="action.html" attribute="action" />
  </view> 

  <menuItem menu="add_component"
  	for="Zope.App.OFS.Container.IAdding."
	action="Zope.App.OFS.Services.ServiceManager.ConfigurationManager"
        title="Configuration"
        />

  <menu id="add_configuration" 
        title="Menu of addable configuration objects"
        />

<!-- ServiceConfiguration -->

  <defaultView 
     for=".IServiceConfiguration."
     name="index.html"
     />

  <menuItems menu="zmi_views" for=".IServiceConfiguration.">
    <menuItem title="Edit"
              action="index.html"/>
    </menuItems>

  <form:edit
     for = ".IServiceConfiguration."
     name = "index.html"
     schema = "Zope.App.OFS.Services.ConfigurationInterfaces.IConfiguration."
     label = "Service Configuration"
     permission = "Zope.ManageServices"
     template = "Browser/ServiceConfigEdit.pt"
     />

  <form:edit
     for = ".IServiceConfiguration."
     name = "ItemEdit"
     schema = 
     "Zope.App.OFS.Services.ConfigurationInterfaces.IConfigurationSummary."
     label = "Service Configuration"
     template = "Browser/ServiceConfigEditPart.pt"
     class = ".Browser.ServiceConfigURL."
     permission = "Zope.ManageServices"
     />

  <view
     for = ".IServiceConfiguration."
     name = "ConfigurationSummary"
     template = "Browser/ServiceConfigSummary.pt"
     class = ".Browser.ServiceConfigURL."
     permission="Zope.ManageServices" 
     />  

  <view 
        for="Zope.App.OFS.Container.IAdding."
        name="ServiceConfiguration"
        factory=".Browser.AddServiceConfiguration."
        permission="Zope.ManageServices" 
        >

      <page name="step1.html" template="Browser/add_service_1.pt" />
      <page name="step2.html" template="Browser/add_service_2.pt" />
      <page name="finish.html" attribute="action" />

      </view>

  <menuItem
      for="Zope.App.OFS.Container.IAdding."
      menu="add_configuration"
      action="ServiceConfiguration"
      title="Service"
      />

<!-- Persistent Modules -->

  <view for="Persistence.IPersistentModuleManager."
	factory=".Browser.EditModule."
        >
      <page name="edit.html" template="Views/Browser/edit_module.pt" />
  </view>

  <menuItems menu="zmi_views" for="Persistence.IPersistentModuleManager.">
    <menuItem title="Edit" action="edit.html" />
  </menuItems>

  <view for="Zope.App.OFS.Container.IAdding."
        name="Module"
        factory=".Browser.AddModule."
        >
      <page name="index.html" template="Views/Browser/add_module.pt" />
      <page name="action.html" attribute="action" />
  </view>

  <menuItem menu="add_component" for="Zope.App.OFS.Container.IAdding."
     action="Module"  title="Module" />

</zope:zopeConfigure>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/editConfiguration.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
  <title>View Service Configuration</title>
</head>
<body>
<div metal:fill-slot="body">
<form action="."
      tal:define="info view/action"
      tal:attributes="action request/URL">

<table align=center width=100% cellspacing=0 cellpadding=0>
  <tr tal:repeat="config view/configInfo">
     <td valign=top>
        <input type=checkbox name='keys:list' 
               value='2' 
               tal:attributes="value config/key"/>
        </td>
     <td>
         <table border=1 width=100%>
           <tr><td tal:content="structure config/view">
               Edit Adapter Directives
               </td>
           </tr>
         </table>
     </td>	
  </tr>
  <tr>
    <td></td>
    <td>
      <input type=submit name='refresh_submit' value="Refresh">
      <input type=submit name='update_submit' value="Update">
      <input type=submit name='add_submit' value="Add">
      <input type=submit name='remove_submit' value="Remove">&nbsp;&nbsp;
      <input type=submit name='top_submit' value="Top">
      <input type=submit name='up_submit' value="Up">
      <input type=submit name='down_submit' value="Down">
      <input type=submit name='bottom_submit' value="Bottom">
    </td>	
  </tr>
</table>

</form>
</div>
</body>
</html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/edit_module.pt ===
<html metal:use-macro="views/standard_macros/page">
<head><title>Add a module</title></head>
<body>
<div metal:fill-slot="body">

<p>Enter the absolute module name and source code.</p>

<form action="edit.html">
<span tal:replace="view/update"></span>
<p>Module: <span tal:content="context/name">Module Name</span></p>
<textarea name="source:text" cols="65" rows="25"
          tal:content="context/source"
></textarea>
<input type="submit" value="Edit"/>
</form>

</div></body></html>


=== Added File Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/Browser/packages_contents.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="headers" type="text/css">
</style>
</head>
<body>
<div metal:fill-slot="body">

<form action="." method="get" 
      tal:define="container_contents view/listContentInfo"
>

  <p>Package Contents</p>

  <div metal:use-macro="view/contentsMacros/macros/contents_table" />

  <br />
    <input type="text" name="name" />
    <input type="submit" name="@@addPackage.html:method" value="Add"
           i18nXXX:attributes="value string:menu_add_button" />
    <input type="submit" name="@@removeObjects.html:method" value="Delete"
           i18nXXX:attributes="value string:menu_delete_button" /> 
</form>

</div>
</body>
</html>