[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/OFS/Container/Views/Browser - Adder.py:1.1.2.1 Contents.py:1.1.2.1 __init__.py:1.1.2.1 add.pt:1.1.2.1 add_confirmed.pt:1.1.2.1 main.pt:1.1.2.1 remove_confirmed.pt:1.1.2.1

Jim Fulton jim@zope.com
Mon, 4 Mar 2002 11:46:26 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/OFS/Container/Views/Browser
In directory cvs.zope.org:/tmp/cvs-serv12102/Container/Views/Browser

Added Files:
      Tag: Zope-3x-branch
	Adder.py Contents.py __init__.py add.pt add_confirmed.pt 
	main.pt remove_confirmed.pt 
Log Message:
Added base-class framework for container content types, views, and
tests.

Among other things, this provides a framework for building interface
tests that can be subclasses by tests for implementation of the
interfaces.



=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/Adder.py ===
# This software is subject to the provisions of the Zope Public License,
# Version 1.1 (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.

"""
    Define adder component for folders.
"""
from Zope.Publisher.Browser.AttributePublisher import AttributePublisher
from Zope.Publisher.Browser.IBrowserPublisher import IBrowserPublisher
from Zope.PageTemplate.PageTemplateFile import PageTemplateFile
from Zope.App.ZMI.Addable import ContentAddables
from Zope.ComponentArchitecture import createObject
from Zope.ComponentArchitecture.ContextDependent import ContextDependent

class DuplicateIDError(KeyError):
    pass

class ContainerAdder(AttributePublisher, ContextDependent):

    def _listAddables( self ):
        """
            Derived classes override this to change the registry
            in which factories are looked up.
        """
        return ContentAddables.getAddables(self.getContext())

    def listAddableInfo( self ):
        """
            Return a sequence of mappings for the addables for our
            folder.
        """
        return self._listAddables()

    def action( self, id, type_name, REQUEST=None):
        """
            Instantiate an object and put it in our folder.
        """
        context = self.getContext()
        
        if id in context.objectIds():
            raise DuplicateIDError, "ID '%s' already in use." % id

        context.setObject(id, createObject(context, type_name))

        if REQUEST is not None:
            # for unit tests
            REQUEST['RESPONSE'].redirect(REQUEST['URL2'])

        return self.confirmed( type_name=type_name, id=id )

    index = PageTemplateFile('add.pt')
    confirmed = PageTemplateFile('add_confirmed.pt')


=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/Contents.py ===
##############################################################################
#
# Copyright (c) 2001 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: Contents.py,v 1.1.2.1 2002/03/04 16:46:25 jim Exp $
"""


import os

from Zope.Publisher.Browser.AttributePublisher import AttributePublisher
from Zope.ComponentArchitecture.ContextDependent import ContextDependent
from Zope.Publisher.Browser.IBrowserPublisher import IBrowserPublisher
from Zope.PageTemplate.PageTemplateFile import PageTemplateFile
from Zope.App.OFS.IContainer import IContainer

class Contents(ContextDependent, AttributePublisher):

    __implements__ = AttributePublisher.__implements__
    __used_for__ = IContainer

    def _extractContentInfo( self, item ):
        info = {}
        info['id'] = item[0]
        info['object'] = item[1]

        # XXX:  We will fake this stuff out for now
        info[ 'title' ] = info[ 'url' ] = item[0]
        info['icon'] = None

        return info


    def removeObjects(self, ids, REQUEST=None):
        """ """
        for id in ids:
            self.remove(id)

        # XXX:  This is horribly broken, but I can't do better until
        #       we have a way to compute absolute URLs.
        if REQUEST is not None:
            # for unit tests
            REQUEST['RESPONSE'].redirect(REQUEST['URL1'])
        return self.confirmRemoved()
    

    def remove( self, name, silent=0 ):
        """
            Remove the object stored under 'name', or raise a KeyError
            if no such object (pass non-zero 'silent' to suppress the
            exception).
        """
        try:
            self.getContext().delObject( name )
        except KeyError:
            if not silent:
                raise
        return self.confirmRemoved( name=name )

    def listContentInfo(self):
        return map(self._extractContentInfo, self.getContext().objectItems())

    index = PageTemplateFile('main.pt')
    confirmRemoved = PageTemplateFile('remove_confirmed.pt')



=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/__init__.py ===



=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/add.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="headers" type="text/css">
.TypeListing {
    width: 100%;
}

.Selector {
    width: 10px;
}

.TypeIcon {
    width: 20px;
}

.TypeName {
    text-align: left;
}

.TypeDescription {
    text-align: left;
    font-style: italic;
}
</style>
</head>
<body>

<div metal:fill-slot="body">

<form action="action.html" method="POST">
<table class="TypeListing">

  <caption>Add Content To Folder</caption>

    <tr>
      <td class="Selector"><br /></td>
      <th class="TypeName">Title</th>
    </tr>

    <!--
      ** listAddableInfo returns a sequence of mappings, containing:
      **   'id'    : the ID of the addable type
      **   'title' : the title of the addable type
      **   'description'  : the description of the addable type
      **   'icon'  : the absolute URL of the icon, for the addable type
                     (may be None)
      -->
    <tbody tal:repeat="info container/listAddableInfo">

    <tr>

      <td class="Selector">
        <input type="radio" name="type_name"
               tal:attributes="value info/id; id info/id" />
      </td>

      <td class="TypeName">
        <label tal:attributes="for info/id">
          <img alt="Folder" src="../../ZMI/www/folder_icon.gif"
               tal:condition="info/icon"
               tal:attributes="src info/icon" />
          <span tal:replace="info/title">Folder</span>
        </label>
      </td>

    </tr>

    <tr>
      <td class="Selector"><br /></td>
      <td class="TypeDescription" tal:content="info/description">
          Folders are generic containers for content, including other
          folders.
      </td>
    </tr>

  </tbody>

  <tbody tal:condition="nothing">

    <tr>

      <td class="Selector">
        <input type="radio" name="type_name" value="" />
               
      </td>

      <td class="TypeName">
        <img alt="Folder" src="../../ZMI/www/document_icon.gif" />
        Document
      </td>

    </tr>

    <tr>
      <td class="Selector"><br /></td>
      <td class="TypeDescription">
          Documents are simple textual content.
      </td>
    </tr>

  </tbody>

  <tr>
    <td><br/></td>
    <td><input type="text" name="id" />
        <input type="submit" value=" Add " />
    </td>
  </tr>

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


=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/add_confirmed.pt ===
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
      metal:use-macro="presentation/standard_macros/html">
  -->
<body>

<p> Object added successfully. </p>

</body>
</html>


=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/main.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
<style metal:fill-slot="headers" type="text/css">
<!--
.ContentListing {
    width: 100%;
}

.ContentIcon {
    width: 20px;
}

.ContentTitle {
    text-align: left;
}
-->
</style>
</head>
<body>
<div metal:fill-slot="body">

<form action="contents;view" method="get">
  <table class="ContentListing">
  
    <caption>Folder Contents <a href="../adder;view"> Add... </a> </caption>
  
    <tbody>
  
      <tr>
	<td class="ContentIcon"><br /> </td>
	<th class="ContentTitle">Title</th>
      </tr>
  
      <!--
	** listContentInfo returns a sequence of mappings, containing:
	**   'id'    : the ID of the contained within the container
	**   'url'   : the absolute URL of the contained object
	**   'title' : the title of the contained object
	**   'icon'  : the absolute URL of the icon, for the contained object
		       (may be None)
	-->
      <tr tal:repeat="info container/listContentInfo">
  
	<td class="ContentSelect">
	  <input type="checkbox" name="ids:list" value="id"
		 tal:attributes="value info/id" />
	</td>
  
	<td class="ContentIcon">
	  <img alt="Folder" src="../../ZMI/www/folder_icon.gif"
	       tal:condition="info/url"
	       tal:attributes="src info/url" />
	</td>
  
	<td class="ContentTitle">
	  <a href="subfolder_id"
	     tal:attributes="href string:../${info/url}"
	     tal:content="info/title"
	  >Folder Title or ID here</a>
	</td>
  
      </tr>
  
      <tr tal:condition="nothing">
  
	<td class="ContentIcon">
	  <img alt="Document" src="../../ZMI/www/document_icon.gif" />
	</td>
  
	<td class="ContentTitle">
	   <a href="document_id">Document Title or ID here</a>
	</td>
  
      </tr>
    </tbody>
  
  </table>
  <br />

  <input type="submit" name="removeObjects:method" value="Delete"
         i18n:attributes="value string:menu_delete_button"> 
</form>

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






=== Added File Zope3/lib/python/Zope/App/OFS/Container/Views/Browser/remove_confirmed.pt ===
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
      metal:use-macro="presentation/standard_macros/html">
  -->
<body>

<p> Object(s) removed successfully. </p>

</body>
</html>