[Checkins] SVN: zope2book/trunk/ Give up on the api documentation and make it into a todo to autogenerate it...

Hanno Schlichting plone at hannosch.info
Mon Feb 16 16:30:29 EST 2009


Log message for revision 96608:
  Give up on the api documentation and make it into a todo to autogenerate it...
  

Changed:
  D   zope2book/trunk/AppendixB.stx
  U   zope2book/trunk/TODO.txt
  A   zope2book/trunk/source/AppendixB.rst
  U   zope2book/trunk/source/index.rst

-=-
Deleted: zope2book/trunk/AppendixB.stx
===================================================================
--- zope2book/trunk/AppendixB.stx	2009-02-16 21:13:59 UTC (rev 96607)
+++ zope2book/trunk/AppendixB.stx	2009-02-16 21:30:29 UTC (rev 96608)
@@ -1,4530 +0,0 @@
-Appendix B: API Reference
-
-
-  Introduction
-
-    This reference describes the interfaces to the most common set of
-    basic Zope objects.  This reference is useful while writing Page
-    Templates, DTML, Python scripts, and Product code.
-    
-    The intended audience is able to read simple Python code and has
-    at least passing experience with object-oriented programming.
-
-    The reference is not a tutorial. Nor is it a substitute for
-    reading the rest of the Zope Book. Examples, where they are
-    provided, are intended to be illustrative, but not comprehensive.
-
-
-  XXX STATUS 
-
-      Updated by Paul Winkler, Thu Jan 27 01:22:54 EST 2005
-
-      More items moved from TODO to DONE.
-
-      All new comments merged from the zope.org 2.6 version, up until
-      2005/01/27 00:24:00.954 US/Eastern 
-
-      Some more cleanup of DateTime (added return types for everything
-      except where very obviously a string).
-
-
-  XXX TO DO
-
-    * For all modules, classes, methods, and functions in the reference:
-
-      * verify that all names are correct
-
-      * see if any non-private methods are missing, and add them
-
-      * document types of arguments and return values and expected
-        exceptions
-
-      * compare API reference to source docstrings and to the HelpSys
-        .stx files, combine and edit all for completeness and clarity.
-
-      * check base classes for things that need documenting - either
-        add the base class to this API ref, or document any
-        non-overridden methods as part of the derived class docs - not
-        sure how best to do this so i'm handling it on a case-by-case
-        basis. We don't want to document every base class in zope's
-        tangled hierarchy, but we do want everything that's reasonably
-        part of "the API" which is nebulous.
-
-
-      It's a big job, best done one module at a time.  So far it takes
-      me about an hour to do one module properly :-( 
-      Many modules are done, see DONE below.
-
-      The below modules are still to do::
-   
-        Products/OFSP   XXX maybe ignore this since it just provides Versions??
-        Products/MIMETools  XXX does anybody use this??  just provides dtml-mime
-        Products/PageTemplates
-        Products/PluginIndexes
-        Products/SiteAccess
-        Products/SiteErrorLog
-        Products/StandardCacheManagers
-        Products/TemporaryFolder
-        Products/ZCTextIndex
-        Products/ZGadflyDA
-        Products/ZODBMountPoint
-        Products/ZopeTutorial
-        Produts/ZReST
-        PropertySheet
-        PropertySheets
-        SessionInterfaces
-        TransienceInterfaces
-        Vocabulary
-        ZCatalog
-        ZSQLMethod
-        ZTUtils
-
-    * Maybe omit module names for one-class modules, as
-      suggested on zope-web by Don Hopkins?
-
-    * Maybe add descriptive categories such as "Core", "Content", and 
-      "Utility" next to class names, as suggested on zope-web by Don Hopkins?
-
-    * List the meta_type for all classes that have one??
-
-    * lots of people want embedded examples a la http://www.php.net
-       ... add more.
-
-    * add manage_clone docs
-
-    * add manage_delObjects docs
-
-    * all manage_addFoo examples must show the package name!
-
-    * all manage_addFoo examples must document the permissions needed.
-
-    * add missing modules and classes from 
-      http://dev.zope.org/Wikis/DevSite/Proposals/IdentifyMissingStuff
-
-    * add permission information to methods that don't have it.
-
-    * consistently document availability. Right now it's very spotty
-      and ad-hoc.  By availability, I mean e.g. can you import it in a
-      Python Script? Is it available to DTML and if so how? etc.  This
-      could be done just under the Permission documentation.
-
-    * fix up any formatting issues.
-
-    * Methods used for FTP?  I skipped these on everything prior
-      to ObjectManager, might have to go back and do em.
-
-    * ZServer.FTPRequest
-
-    * Address all remaining XXX items
-
-    * Credits for this edition - extract from the DONE section
-
-  XXX DONE
-
-    * verify that module, class, and method names are correct,
-      and verify against the source code docstrings, and
-      see if those classes grew more methods. (Big job but these
-      tasks are easier done one module at a time.)
-      Some of these are done, see DONE below.
-
-      DONE for these modules::
-      
-        AccessControl
-        Acquisition (just a link to dev guide chapter)
-	DateTime
-	DTMLDocument (removed a lot of stuff inherited from DTMLMethod)
-	DTMLMethod
-	ExternalMethod
-	Folder
-	HTTPRequest
-	HTTPResponse
-	Image
-        MailHost
-        ObjectManager
-        PropertyManager
-        PythonScripts (Thanks to Jim Alexander! ... no changes)
-        Script (actually Shared.DC.Scripts.Script)
-        SimpleItem 
-        Traversable
-        User
-        UserFolder (Thanks to David Evans!!) 
-        math
-        random
-        sequence
-        standard
-        string
-
-      ... with miscellaneous stuff still left to do on those, marked
-      by "XXX".
-
-    * changed "ObjectManager Constructor" to "ObjectManager factory"
-
-    * changed "constructor method" to "factory function" in
-      ObjectManager docs... because it is :-P
-
-    * changed "Python only" to the more descriptive
-      "restricted Python only."
-
-    * check all links
-
-    * wrote an intro.
-
-    * removed 'self' argument from methods, for consistency.
-
-    * added Traversable
-
-    * replaced ObjectManagerItem with Item and SimpleItem, yay!
-
-    * removed File module, moved File to Image module
-
-    * trivial typo comments addressed & removed
-
-    * some module names fixed: HTTPRequest, HTTPResponse, PythonScripts
-
-    * sorted method names (alphanumeric)
-
-    * sorted function names (alphanumeric), after class names
-
-    * sorted class names (alphanumeric)
- 
-    * sorted module names (alphanumeric)
-
-    * we now have hierarchical TOC, yay
-
-
-module 'AccessControl'
-
-  AccessControl: Security functions and classes
-
-    The functions and classes in this module are available to
-    Python-based Scripts and Page Templates, but not to DTML.
-    In DTML you can use the related functions described in
-    the DTML chapters of the Zope Book.
-
-    XXX missing ClassSecurityInfo?  ModuleSecurityInfo? 
-    allow_module?  allow_class ?
-
-
-  class 'SecurityManager'
-
-    A security manager provides methods for checking access and
-    managing executable context and policies.
-
-    Typically in Zope code, you do not instantiate one of these;
-    instead, you access the current existing one by calling the
-    getSecurityManager() function.
-
-    'calledByExecutable()'
-
-      Return a boolean value indicating if this context was called
-      by an executable.
-
-      XXX what the heck does that mean?
-
-      permission -- Always available
-
-    'checkPermission(permission, object)'
-
-      Check whether the security context (including the current user)
-      allows the given permission on the given object.
-
-      Arguments:
-
-      *permission* -- A permission name (string).
-
-      *object* -- The object being accessed.
-
-      permission -- Always available
-
-    'getUser()'
-
-      Get the current authenticated user. See the
-      'BasicUser' class.
-
-      Example usage in ZPT::
- 
-       Hello, user 
-       <em
-        tal:define="sm python:modules['AccessControl'].getSecurityManager();
-                    user python:sm.getUser()"
-        tal:content="user"> 
- q         Bob 
-       </em>!
-
-      permission -- Always available
-
-    'validate(accessed=None, container=None, name=None, value=None, roles=None)'
-
-      Validate access.
-
-      Arguments:
-
-      *accessed* -- The object that was being accessed.
-
-      *container* -- The container of the accessed object.
-
-      *name* -- The name used to access the value.
-
-      *value* -- The object retrieved though the access.
-
-      *roles* -- The roles of the object if already known.
-
-      The arguments may be provided as keyword arguments. Some of
-      these arguments may be omitted; however, the policy may reject
-      access in some cases when arguments are omitted. It is best to
-      provide all the values possible.
-
-      XXX verify arg descriptions and give examples.
-
-      permission -- Always available
-
-
-    'validateValue(value, roles=None)'
-
-      Convenience for common case of simple value validation.
-
-      permission -- Always available
-
-  function 'getSecurityManager()'
-
-    Returns the current security manager. 
-    See the 'SecurityManager' class.
-
-    Example usage in a Script (Python)::
-
-       import AccessControl
-       sm = AccessControl.getSecurityManager()
-       return sm.getUser()
-
-
-module 'Acquisition'
-
-  See the 
-  "Acquisition documentation in the Developers' Guide":http://zope.org/Documentation/Books/ZDG/current/Acquisition.stx
-
-
-module 'DateTime'
-
-  class 'DateTime'
-
-    The DateTime object provides an interface for working with dates
-    and times in various formats.  DateTime also provides methods for
-    calendar operations, date and time arithmetic and formatting.
-
-    DateTime objects represent instants in time and provide
-    interfaces for controlling its representation without
-    affecting the internal value of the object. 
-
-    DateTime objects may be created from a wide variety of string 
-    or numeric data, or may be computed from other DateTime objects.
-    DateTimes support the ability to convert their representations
-    to many major timezones, as well as the ability to create a
-    DateTime object in the context of a given timezone.
-
-    DateTime objects provide partial numerical behavior:
-
-      - Two date-time objects can be subtracted to obtain a time,
-        in days between the two.
-
-      - A date-time object and a positive or negative number may
-        be added to obtain a new date-time object that is the given
-        number of days later than the input date-time object.
-
-      - A positive or negative number and a date-time object may
-        be added to obtain a new date-time object that is the given
-        number of days later than the input date-time object.
-
-      - A positive or negative number may be subtracted from a
-        date-time object to obtain a new date-time object that is
-        the given number of days earlier than the input date-time
-        object.
-
-    DateTime objects may be converted to integer, long, or float
-    numbers of days since the host system's epoch, using the standard int, 
-    long, and float functions. (Compatibility Note: int, long and
-    float return the number of days since the epoch in UTC rather than
-    local machine timezone.) DateTime objects also provide access
-    to their value in a float format usable with the python time
-    module, provided that the value of the object falls in the
-    range of the epoch-based time module.  
-
-    (Note: the epoch is a reference date that depends on the underlying
-    operating system. On most Unix systems, it is 
-    00:00:00 UTC, January 1, 1970.)
-
-    A DateTime object should be considered immutable; all conversion
-    and numeric operations return a new DateTime object rather than
-    modify the current object.
-
-    A DateTime object always maintains its internal value as an absolute 
-    UTC time, and is represented in the context of some timezone
-    based on the arguments used to create the object. A DateTime
-    object's methods return values based on the timezone context.
-
-    Note that in all cases the local machine timezone is used for
-    representation if no timezone is specified.
-
-    DateTimes may be created with from zero to
-    seven arguments.
-
-      - If initialized with no arguments, then the 
-        current date/time is returned, represented in the 
-        timezone of the local machine.
-
-      - If initialized with a single string argument
-        which is a recognized timezone name, an object representing
-        the current time is returned, represented in the specified
-        timezone.
-
-      - If initialized with a single string argument
-        representing a valid date/time, an object representing
-        that date/time will be returned.
-
-        As a general rule, any date-time representation that is 
-        recognized and unambiguous to a resident of North America is
-        acceptable. (The reason for this qualification is that
-        in North America, a date like "2/1/1994" is interpreted
-        as February 1, 1994, while in some parts of the world,
-        it is interpreted as January 2, 1994.)
-
-	Note that this behavior can be reversed by setting
-	the "datefmt" variable as described below (in which
-	case, "2/1/1994" is interpreted as January 2 instead of
-	February 1).
-
-	A date/time string consists of two components, a date component and
-        an optional time component, separated by one or more
-        spaces. If the time component is omitted, 12:00am is
-        assumed. Any recognized timezone name specified as the
-        final element of the date/time string will be used for
-        computing the date/time value. (If you create a DateTime
-        with the string 'Mar 9, 1997 1:45pm US/Pacific', the
-        value will essentially be the same as if you had captured
-        time.time() at the specified date and time on a machine in
-        that timezone).  Finally, the DateTime constructor
-        automatically detects and handles ISO8601-compliant dates 
-	(YYYY-MM-DDThh:mm:ssTZD).
-        See http://www.w3.org/TR/NOTE-datetime for full specs.
-
-        If a string argument passed to the DateTime constructor
-        cannot be parsed, it will raise DateTime.SyntaxError. Invalid
-        date, time, or timezone components will raise a
-        DateTime.DateTimeError.
-
-	Examples of initializing with a single string::
-
-          e=DateTime("US/Eastern")
-          # returns current date/time, represented in US/Eastern.
-
-          x=DateTime("1997/3/9 1:45pm")
-          # returns specified time, represented in local machine zone.
-
-          y=DateTime("Mar 9, 1997 13:45:00")
-          # y is equal to x
-
-	  z=DateTime("1997-03-09T13:45:00-0500").
-          # z is equal to y
-
-        For non-ISO-8601 strings, the string is assumed to
-	consist of a date component followed by an optional time 
-	component.
-
-	The date component consists of year, month, and day
-        values. The year value must be a one-, two-, or
-        four-digit integer. If a one- or two-digit year is
-        used, the year is assumed to be in the twentieth
-        century. The month may be an integer, from 1 to 12, a
-        month name, or a month abbreviation, where a period may
-        optionally follow the abbreviation. The day must be an
-        integer from 1 to the number of days in the month. The
-        year, month, and day values may be separated by
-        periods, hyphens, forward slashes, or spaces. Extra
-        spaces are permitted around the delimiters. Year,
-        month, and day values may be given in any order as long
-        as it is possible to distinguish the components. If all
-        three components are numbers that are less than 13,
-        then a month-day-year ordering is assumed.
-
-        The time component consists of hour, minute, and second
-        values separated by colons.  The hour value must be an
-        integer between 0 and 23 inclusively. The minute value
-        must be an integer between 0 and 59 inclusively. The
-        second value may be an integer or float value between 0 and
-        59.999 inclusively. The second value or both the minute
-        and second values may be omitted. The time may be
-        followed by AM or PM in upper or lower case, in which
-        case a 12-hour clock is assumed.
-
-      - If the DateTime is initialized with a single numeric argument,
-        the number is assumed to be a floating point value
-        representing seconds since the epoch, such as that returned by
-        time.time().  Example::
-
-	  x = DateTime(0)
-	  x == DateTime('1970/01/01 00:00:00 UTC')
-
-        A DateTime object is returned that represents 
-        the UTC value of the time.time() float represented in
-        the local machine's timezone.
-
-      - If the DateTime is initialized with two numeric arguments,
-        then the first is taken to be an integer year and the
-        second argument is taken to be an offset in days from
-        the beginning of the year, in the context of the local
-        machine timezone.
-
-	Example::
-
-	  x = DateTime(2010, 55.5)
-	  x == DateTime('2010/02/24 16:00:00 UTC')
-
-        The date-time value returned is the given offset number of 
-        days from the beginning of the given year, represented in
-        the timezone of the local machine. The offset may be positive
-        or negative.
-        Two-digit years are assumed to be in the twentieth
-        century.
-
-      - If the DateTime is invoked with two arguments, the first
-        a float representing a number of seconds past the epoch
-        in gmt (such as those returned by time.time()) and the 
-        second a string naming a recognized timezone, a DateTime
-        with a value of that gmt time will be returned, represented
-        in the given timezone.
-
-	Example::
-
-          import time
-          t=time.time()
-
-          now_east=DateTime(t,'US/Eastern')
-          # Time t represented as US/Eastern
-
-          now_west=DateTime(t,'US/Pacific')
-          # Time t represented as US/Pacific
-
-          now_east == now_west
-          # only their representations are different
-
-      - If the DateTime is initialized with three or more numeric
-        arguments, then the first is taken to be an integer
-        year, the second is taken to be an integer month, and
-        the third is taken to be an integer day. If the
-        combination of values is not valid, then a
-        DateError is raised. Two-digit years are assumed
-        to be in the twentieth century. The fourth, fifth, and
-        sixth arguments specify a time in hours, minutes, and
-        seconds. Hours and minutes should be positive integers
-        and seconds is a positive floating point value; all of
-        these default to zero if not given. If the hours, minutes,
-	or seconds are not valid, a TimeError is raised.
-	An optional string may
-        be given as the final argument to indicate timezone (the
-        effect of this is as if you had taken the value of time.time()
-        at that time on a machine in the specified timezone).
-
-	Example::
-	
-	  x = DateTime(2000, 6, 1, 11, 45, 00, 'GMT') 
-	  y = DateTime('2000/06/01 11:45:00 UTC')
-	  x == y
-
-	
-        New in Zope 2.7: A new keyword parameter "datefmt" can be
-        passed to the constructor. If set to "international", the
-        constructor is forced to treat ambigious dates as "days before
-        month before year". This useful if you need to parse non-US
-        dates in a reliable way. The default value is "us" but can
-	be overridden in your zope.config file.
-
-    The module function Timezones() will return a list of the 
-    timezones recognized by the DateTime module. Recognition of 
-    timezone names is case-insensitive. XXX wrong place for this??
-
-    'AMPM()'
-
-      Return the time string for an object to the nearest second,
-      using a 12-hour clock and the 'am' or 'pm' modifier,
-      e.g. '01:28:08 am'.
-
-      Permission -- Always available
-
-    'AMPMMinutes()'
-
-      Like AMPM but omits the seconds, e.g. '01:29 am'.
-
-      Permission -- Always available
-
-    'Date()'
-
-      Return the date string for the object, in the format 'YYYY/MM/DD'.
-
-      Permission -- Always available
-
-    'Day()'
-
-      Return the full name of the day of the week.
-
-      Permission -- Always available
-
-    'Day_()'
-
-      For backwards compatibility; see pDay.
-      May be deprecated someday.
-
-      Permission -- Always available
-
-    'DayOfWeek()'
-
-      For backwards compatibility: see Day.
-      May be deprecated someday.
-
-      Permission -- Always available
-
-    'HTML4()'
-
-      Return a string in the format used in the HTML4.0 specification,
-      one of the standard forms in ISO8601.
-
-      See "HTML 4.0 Specification":http://www.w3.org/TR/NOTE-datetime
-
-      Dates are output as: YYYY-MM-DDTHH:MM:SSZ
-      where T and Z are literal characters.
-      The time is in UTC.
-
-      Permission -- Always available
-
-    'ISO()'
-
-      Return a string in ISO standard format.
-      Dates are output as: YYYY-MM-DD HH:MM:SS
-
-      Permission -- Always available
-    
-    'JulianDay()'
-
-      Return the Julian day as an integer, according to
-      http://www.tondering.dk/claus/cal/node3.html#sec-calcjd
-
-
-    'Mon()'
-
-      For backwards compatibility;  see aMonth.
-      May be deprecated someday.
-
-      Permission -- Always available
-
-    'Mon_()'
-
-      For backwards compatibility; see pMonth.
-      May be deprecated someday.
-
-      Permission -- Always available
-
-
-    'Month()'
-
-      Return the full month name.
-
-      Permission -- Always available
-
-    'PreciseAMPM()'
-
-      Return the time string for the object, including milliseconds
-      and the modifier, e.g. '01:31:07.525 am'.
-
-      Permission -- Always available
-
-    'PreciseTime()'
-
-      Return the time string for the object, including milliseconds,
-      in 24-hour format, e.g. '23:59:37.963'.
-
-      Permission -- Always available
-
-    'Time()'
-
-      Return the time string for an object to the nearest second,
-      in 24-hour format, e.g. '23:30:15'.
-
-      Permission -- Always available
-
-    'TimeMinutes()'
-
-      Return the time string for an object not showing seconds,
-      in 24-hour format, e.g. '23:31'.
-
-      Permission -- Always available
-
-    'aCommon()'
-
-      Return a string representing the object's value
-      in the format: Mar 1, 1997 1:45 pm
-
-      Permission -- Always available
-
-    'aCommonZ()'
-
-      Return a string representing the object's value
-      in the format: Mar 1, 1997 1:45 pm US/Eastern
-
-      Permission -- Always available
-
-    'aDay()'
-
-      Return the abbreviated name of the day of the week.
-
-      Permission -- Always available
-
-    'aMonth()'
-
-      Return the abbreviated month name.
-
-      Permission -- Always available
-
-    'ampm()'
-
-      Return the appropriate time modifier (am or pm),
-      as a lowercase string.
-
-      Permission -- Always available
-
-    'day()'
-
-      Return the day of the month as an integer.
-
-      Permission -- Always available
-
-    'dayOfYear()'
-
-      Return the day of the year as an integer, in context of the timezone
-      representation of the object.
-
-      Permission -- Always available
-
-    'dd()'
-
-      Return the day of the month as a 2-digit string.
-
-      Permission -- Always available
-
-    'dow()'
-
-      Return the integer day of the week, where Sunday is 0.
-
-      Permission -- Always available
-
-    'dow_1()'
-
-      Return the integer day of the week, where Sunday is 1.
-
-      Permission -- Always available
-
-    'earliestTime()'
-
-      Return a new DateTime object that represents the earliest
-      possible time (in whole seconds) that still falls within the
-      current object's day, in the object's timezone context.
-
-      Permission -- Always available
-
-    'equalTo(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time equal to *t*. Revised to give more correct results
-      through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'fCommon()'
-
-      Return a string representing the object's value
-      in the format: March 1, 1997 1:45 pm
-
-      Permission -- Always available
-
-    'fCommonZ()'
-
-      Return a string representing the object's value
-      in the format: March 1, 1997 1:45 pm US/Eastern
-
-      Permission -- Always available
-
-    'greaterThan(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time greater than *t*.  Revised to give more correct
-      results through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'greaterThanEqualTo(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time greater than or equal to *t*. Revised to give more
-      correct results through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'h_12()'
-
-      Return the 12-hour clock representation of the hour
-      as an integer.
-
-      Permission -- Always available
-
-    'h_24()'
-
-      Return the 24-hour clock representation of the hour
-      as an integer.
-
-      Permission -- Always available
-
-    'hour()'
-
-      Return the 24-hour clock representation of the hour
-      as an integer.
-
-      Permission -- Always available
-
-    'isCurrentDay()'
-
-      Return true if this object represents a date/time that falls
-      within the current day, in the context of this object's
-      timezone representation.
-
-      Permission -- Always available
-
-    'isCurrentHour()'
-
-      Return true if this object represents a date/time that falls
-      within the current hour, in the context of this object's
-      timezone representation.
-
-      Permission -- Always available
-
-    'isCurrentMinute()'
-
-      Return true if this object represents a date/time that falls
-      within the current minute, in the context of this object's
-      timezone representation.
-
-      Permission -- Always available
-
-    'isCurrentMonth()'
-
-      Return true if this object represents a date/time that falls
-      within the current month, in the context of this object's
-      timezone representation.
-
-      Permission -- Always available
-
-    'isCurrentYear()'
-
-      Return true if this object represents a date/time that falls
-      within the current year, in the context of this object's
-      timezone representation.
-
-      Permission -- Always available
-
-    'isFuture()'
-
-      Return true if this object represents a date/time later than
-      the time of the call.
-
-      Permission -- Always available
-
-    'isLeapYear()'
-
-      Return true if the current year (in the context of the
-      object's timezone) is a leap year.
-
-      Permission -- Always available
-
-    'isPast()'
-
-      Return true if this object represents a date/time earlier than
-      the time of the call.
-
-      Permission -- Always available
-
-    'latestTime()'
-
-      Return a new DateTime object that represents the latest
-      possible time (in whole seconds) that still falls within the
-      current object's day, in the object's timezone context.
-
-      Permission -- Always available
-
-    'lessThan(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time less than *t*.  Revised to give more correct results
-      through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'lessThanEqualTo(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time less than or equal to *t*. Revised to give more
-      correct results through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'localZone(ltm=None)'
-
-      Return the local time zone on the given date, in the format
-      'US/Eastern'. The time zone can change according to daylight savings.  
-      The optional *ltm* argument is a tuple in the format returned
-      by time.localtime() from the Python standard library.
-      If no argument is passed, use the current time.
-   
-      Permission -- Always available
-
-    'millis()'
-
-      Return the milliseconds since the epoch in UTC,
-      as a long integer.
-
-      Permission -- Always available
-
-    'minute()'
-
-      Return the minute portion of the time as an integer.
-
-      Permission -- Always available
-
-    'mm()'
-
-      Return the month of the object as a 2-digit string.
-
-      Permission -- Always available
-
-    'month()'
-
-      Return the month of the object as an integer.
-
-      Permission -- Always available
-
-    'notEqualTo(t)'
-
-      Compare this DateTime object to another DateTime object OR a
-      floating point number such as that which is returned by the
-      python time module. Returns true if the object represents a
-      date/time not equal to *t*.  Revised to give more correct
-      results through comparison of long integer milliseconds.
-
-      Permission -- Always available
-
-    'parts()'
-
-      Return a tuple containing the calendar year, month, day, hour,
-      minute, second and timezone of the object.
-
-      Permission -- Always available
-
-    'pCommon()'
-
-      Return a string representing the object's value
-      in the format: Mar. 1, 1997 1:45 pm
-
-      Permission -- Always available
-
-    'pCommonZ()'
-
-      Return a string representing the object's value
-      in the format: Mar. 1, 1997 1:45 pm US/Eastern
-
-      Permission -- Always available
-
-    'pDay()'
-
-      Return the abbreviated (with period) name of the day of the
-      week, e.g. 'Wed.'
-
-      Permission -- Always available
-
-    'pMonth()'
-
-      Return the abbreviated (with period) month name, e.g. 'Mar.'
-
-      Permission -- Always available
-
-    'rfc822()'
-
-      Return the date of the object as a string in RFC 822 format,
-      e.g. 'Wed, 01 Sep 2004 01:34:12 -0400'.
-
-      Permission -- Always available
-
-    'second()'
-
-      Return the second portion of the time, as a float.
-
-      Permission -- Always available
-
-    'strftime(format)'
-
-      Return date/time string formatted according to 'format',
-      using the current timezone representation.
-
-      See Python's
-      "time.strftime":http://www.python.org/doc/current/lib/module-time.html
-      function.
-
-      Example::
-      
-        DateTime('2004/01/01').strftime('%m.%Y') == '01.2004'
-
-    'timeTime()'
-
-      Return the date/time as a floating-point number in UTC, in the
-      format used by the python time module (seconds since the epoch).  
-      Note that it is possible to create date/time values with 
-      DateTime that have no meaningful value to the time module.
-
-      Permission -- Always available
-
-    'timezone()'
-
-      Return the timezone in which the object is represented,
-      as a string, e.g. 'US/Eastern' or 'GMT', or 'GMT+2'.
-
-      Permission -- Always available
-
-    'toZone(z)'
-
-      Return a DateTime with the same value as the current object,
-      represented in the indicated timezone. *z* is a string
-      e.g. 'US/Pacific', or 'GMT', or 'GMT-1'.
-
-      Permission -- Always available
-
-    'tzoffset()'
-
-      Return the timezone offset for the object's timezone as an
-      integer, measured in seconds relative to UTC.
-      Examples::
-
-          DateTime().toZone('GMT').tzoffset() == 0
-          DateTime().toZone('GMT-1').tzoffset() == -3600
-
-    'week()'
-
-      Return the week number of the object as an integer, according to ISO.
-      See http://www.tondering.dk/claus/cal/node6.html#SECTION00670000000000000000
-      Example::
-
-        DateTime('2005/12/31').week() == 52
-
-      Permission -- Always available
-      
-    'year()'
-
-      Return the calendar year of the object as an integer.
-
-      Permission -- Always available
-
-    'yy()'
-
-      Return calendar year of the object as a 2-digit string,
-      e.g. DateTime('2004/01/01') == '04'.
-
-      Permission -- Always available
-
-
-module 'DTMLDocument'
-
-  class 'DTMLDocument(PropertyManager, DTMLMethod)'
-
-    A DTML Document is a Zope object that contains and executes DTML
-    code. It is useful to represent web pages.
-
-    DTML Documents are identical to DTML Methods with two differences:
-
-    First, it supports the PropertyManager API, so you can
-    store properties in the object.
-
-    Secondly, when the Document is called, its own namespace is merged
-    with that of the client argument.  So properties and methods of
-    the Document will be used before those of the container or
-    context.  For example, calling absolute_url() on a DTMLDocument
-    will return the URL of the DTMLDocument itself.
-
-
-    ObjectManager Factory
-
-      'manage_addDTMLDocument(id, title='', file='')'
-
-        Add a DTML Document to the current ObjectManager. The file
-        argument may be a string or a file-like object.
-
-
-module 'DTMLMethod'
-
-  class 'DTMLMethod(RestrictedDTML, HTML, Acquisition.Implicit, RoleManager, ElementWithTitle, Item_w__name__, History.Historical, Cacheable)'
-
-		    
-    XXX many of those base classes are not listed in this ref.
-    add some or all of them?
-
-    A DTML Method is a Zope object that contains and executes DTML
-    code. It can act as a template to display other objects. It can
-    also hold small pieces of content which are inserted into other
-    DTML Documents or DTML Methods.
-
-    The DTML Method's id is available via the 'document_id'
-    variable and the title is available via the 'document_title'
-    variable.
-
-    '__call__(client=None, REQUEST={}, RESPONSE=None, **kw)'
-
-      Calling a DTMLMethod causes the Method to interpret the DTML
-      code that it contains.  The method returns the result of the
-      interpretation, which can be any kind of object.
-
-      To accomplish its task, DTML Method often needs to resolve various
-      names into objects.  For example, when the code '&lt;dtml-var
-      spam&gt;' is executed, the DTML engine tries to resolve the name
-      'spam'.
-
-      In order to resolve names, the Method must be passed a
-      namespace to look them up in.  This can be done several ways:
-
-        * By passing a 'client' object -- If the argument 'client' is
-          passed, then names are looked up as attributes on the
-          argument.
-
-        * By passing a 'REQUEST' mapping -- If the argument 'REQUEST'
-          is passed, then names are looked up as items on the
-          argument.  If the object is not a mapping, a TypeError
-          will be raised when a name lookup is attempted.
-	  Typically, the REQUEST is an HTTPRequest instance.
-
-        * By passing keyword arguments -- names and their values can
-          be passed as keyword arguments to the Method.
-
-      The namespace given to a DTML Method is the composite of
-      these three methods.  You can pass any number of them or none
-      at all. Names will be looked up first in the keyword argument,
-      next in the client and finally in the mapping.
-
-      Passing in a namespace to a DTML Method is often referred to
-      as providing the Method with a *context*.
-
-      Unlike DTMLDocuments, a DTMLMethod does not look up names in its
-      own namespace. In this sense, it acts only as a method of its
-      container or context. For example, calling absolute_url() on a
-      DTMLMethod will return the URL of its container.  XXX container
-      before context as usual, right??
-
-      DTML Methods can be called three ways:
-
-      From DTML
-
-        A DTML Method can be called from another DTML Method or
-        Document::
-
-          <dtml-var standard_html_header>
-            <dtml-var aDTMLMethod>
-          <dtml-var standard_html_footer>
-
-        In this example, the Method 'aDTMLMethod' is being called
-        from another DTML object by name.  The calling method passes
-        the value 'this' as the client argument and the current DTML
-        namespace as the REQUEST argument.  The above is identical
-        to this following usage in a DTML Python expression::
-
-          <dtml-var standard_html_header>
-            <dtml-var "aDTMLMethod(_.None, _)">
-          <dtml-var standard_html_footer>
-
-      From Python
-
-        Products, External Methods, and Scripts can call a DTML
-        Method in the same way as calling a DTML Method from a
-        Python expression in DTML, as shown in the previous example.
-
-      By the Publisher
-
-        When the URL of a DTML Method is fetched from Zope, the DTML
-        Method is called by the publisher.  The REQUEST object is
-        passed as the second argument to the Method.
-
-      Permission -- 'View'
-
-    XXX PrincipiaSearchSource method?
-
-    XXX manage_proxy method?
-
-    XXX manage_haveProxy method?
-
-    XXX setCacheNamespaceKeys?
-
-    'document_src()'
-
-      Returns the unrendered source text of the DTML Method.
-
-      Permission -- 'View management screens'
-
-    'get_size()'
-
-      Returns the size of the unrendered source text of the DTML
-      Method in bytes.
-
-      Permission -- 'View'
-
-    'manage_edit(data, title, SUBMIT='Change', dtpref_cols='100%', dtpref_rows='20', REQUEST=None)'
-
-      Change the DTML Method, replacing its contents with 'data' and
-      changing its title.
-
-      The data argument may be a file-like object or a string.
-
-      The SUBMIT parameter is also used during through-the-web editing
-      to change the size of the editing area on the default Document
-      edit screen.  If the value is "Smaller", the rows and columns
-      decrease by 5.  If the value is "Bigger", the rows and columns
-      increase by 5.  If any other or no value is supplied, the data
-      gets checked for DTML errors and is saved.
-
-      Permission -- 'Change DTML Methods'
-
-
-    'manage_upload(file='', REQUEST=None)'
-
-      Replace the contents of the document with the text in file.
-
-      Permission -- 'Change DTML Methods'
-
-    ObjectManager Factory
-
-      'manage_addDTMLMethod(id, title='', file='')'
-
-        Add a DTML Method to the current ObjectManager.  The file
-	argument may be a string or a file-like object.
-
-
-module 'ExternalMethod'
-
-  class 'ExternalMethod(Item, Persistent, Acquisition.Explicit,
-  RoleManager, Navigation)'
-
-    XXX do we want all those base classes?
-
-    Web-callable functions that encapsulate external
-    Python functions. 
-
-    The wrapped function is defined in an external file.  This file is
-    treated like a module, but is not a module.  It is not imported
-    directly, but is rather read and evaluated.  The file must reside
-    in the 'Extensions' subdirectory of the Zope installation, or in
-    an 'Extensions' subdirectory of a product directory.
-
-    There are no security restrictions on the code that can be placed
-    in or imported by this external file.
-
-    Due to the way ExternalMethods are loaded, it is not *currently*
-    possible to import Python modules that reside in the 'Extensions'
-    directory.  It is possible to import modules found in the
-    'lib/python' directory of the Zope installation, or in
-    packages that are in the 'lib/python' directory.
-
-
-    '__call__(*args, **kw)'
-
-      Call the External Method.
-
-      Calling an External Method is roughly equivalent to calling
-      the original actual function from Python.  Positional and
-      keyword parameters can be passed as usual.  Note however that
-      unlike the case of a normal Python method, the "self" argument
-      must be passed explicitly.  An exception to this rule is made
-      if:
-
-      - The supplied number of arguments is one less than the
-        required number of arguments, and
-
-      - The name of the function\'s first argument is 'self'.
-
-      In this case, the URL parent of the object is supplied as the
-      first argument. XXX container, not ever context?
-
-    'manage_edit(title, module, function, REQUEST=None)'
-
-      Change the
-      External Method.
-
-      See the description of manage_addExternalMethod for a
-      description of the arguments 'module' and 'function'.
-
-      Note that calling 'manage_edit' causes the "module" to be
-      effectively reloaded.  This is useful during debugging to see
-      the effects of changes, but can lead to problems if functions
-      rely on shared global data.
-
-    ObjectManager Factory
-
-      'manage_addExternalMethod(id, title, module, function, REQUEST=None)'
-
-        Add an external method to an
-          'ObjectManager'.
-
-          In addition to the standard object-creation arguments,
-          'id' and title, the following arguments are defined:
-
-            function -- The name of the python function. This can be
-              an ordinary Python function, or a bound method.
-
-            module -- The name of the file containing the function
-              definition.
-
-          The module normally resides in the 'Extensions' directory;
-          however, the file name may have a prefix a product package
-          name, indicating that it should be found in a product
-          directory.
-
-          For example, if the module is: 'ACMEWidgets.foo', then an
-          attempt will first be made to use the file
-          'Products/ACMEWidgets/Extensions/foo.py'. If this
-          failes, then the file 'Extensions/ACMEWidgets.foo.py' will be
-          used.
-
-
-module 'Folder'
-
-  class 'Folder(ObjectManager, PropertyManager, RoleManager, webdav.Collection.Collection,  Item,  FindSupport.FindSupport)'
-
-
-    A Folder is a generic container object. Folders are the most
-    common ObjectManager subclass in Zope.
-
-    ObjectManager Factory
-
-      'manage_addFolder(id, title='', createPublic=0, createUserF=0, REQUEST=None)'
-
-        Add a Folder to the current ObjectManager with the given
-	*id* and optional *title*.
-
-	If the *createPublic* argument is true, a Page Template
-	with the id index_html will be created in the new folder.
-
-	If the *createUserF* argument is true, a UserFolder with the
-	id acl_users will be created in the new folder.
-
-        Permission -- 'Add Folders'
-
-	
-
-module 'HTTPRequest'
-
-  class 'FileUpload'
-
-    File upload objects are used to represent file-uploaded data.
-
-    File upload objects can be used just like files objects.
-    See the 
-    "Python documentation":http://docs.python.org/lib/bltin-file-objects.html
-    for details on file objects.
-
-    In addition, FileUploads have a 'headers' attribute that is a
-    dictionary containing the file-upload headers, and a 'filename'
-    attribute containing the name of the uploaded file.
-
-    '__init__(aFieldStorage)'
-
-      Create a new FileUpload object. Argument is an instance of
-      'cgi.FieldStorage', see the 'cgi' documentation in the 
-      "Python Library Reference":http://docs.python.org/lib/node403.html
-
-  class 'HTTPRequest(BaseRequest)'
-
-    XXX we don't document the BaseRequest module. Should we???
-  
-    The request object encapsulates all of the information regarding
-    the current request in Zope.  This includes the input headers,
-    form data, server data, and cookies.
-
-    The request object is a mapping object that represents a
-    collection of variable to value mappings.
-
-    Request objects are typically not created by application code; one
-    is created for you by the object publisher and will be passed to
-    published objects through the argument named REQUEST.  
-
-    The current request is also accessible as the REQUEST attribute of
-    any acquisition-aware object. Page Templates also bind the current
-    request to the name "request". The different spelling in these
-    different circumstances is a bit of a wart. Sorry about that.
-
-    The request can also be used as a namespace, in which names are
-    resolved the same as for the mapping interface, as described
-    below.
-
-    HTTPRequest provides a somewhat richer interface than BaseRequest,
-    notably by providing some support for virtual hosting, and by
-    providing richer variable categorization.
-
-    Variables are organized into four categories. Each category is
-    represented as a dictionary and available as an attribute of the
-    REQUEST object, as follows:
-
-      - Environment variables ('.environ')
-
-          These variables include input headers, server data, and
-          other request-related data.  The variable names are as <a
-          "specified":http://hoohoo.ncsa.uiuc.edu/cgi/env.html
-          in the 
-	  "CGI specification.":http://hoohoo.ncsa.uiuc.edu/cgi/interface.html
-
-      - Form data ('.form')
-
-          These are data extracted from either a URL-encoded query
-          string or body, if present.
-
-          The 'form' attribute of a request is actually a FieldStorage
-          object. When file uploads are used, this provides a richer
-          and more complex interface than is provided by accessing
-          form data as items of the request. See the 
-	  "cgi module documentation":http://docs.python.org/lib/node403.html
-	  in the Python library reference for more details.
-
-      - Cookies  ('.cookies')
-
-          The cookie data, if present.
-
-      - Other ('.other')
-
-          Data that may be set by an application object.
-
-
-    When the request object is used as a mapping object, values will
-    be looked up in all of the above categories, in this order:
-    environ, other, form, cookies.
-
-
-    In addition, there is a special 
-    pseudo-category:
-
-      - Lazy Data
-
-          These are callables which are deferred until explicitly
-          referenced, at which point they are resolved (called) and
-          the result stored as "other" data, i.e. regular request data.
-
-          Thus, they are "lazy" data items.  An example is SESSION objects.
-
-          Lazy data in the request may only be set by the Python
-          method 'set_lazy(name,callable)' as described below.
-
-	  Accessing lazy data is no different from accessing any other
-	  request data.
-
-    So, if a request variable *foo* exists only in the *other*
-    category, then the following ways of accessing it will return the
-    same value::
-
-      request = context.REQUEST
-
-      f1 = request['foo']          # mapping, no error-checking.
-
-      f2 = request.foo		   # attribute, no error-checking.
-
-      f3 = request.get('foo')      # mapping, returns None on error.
-
-      f4 = request.other['foo']    # mapping, more specific, no
-                                   # error-checking.
-
-      f5 = request.other.get('foo')   # mapping, more specific, returns
-				      # None on error.
-
-    The following special (XXX read-only? lazy?) variables are
-    always available in the *other* category:
-
-      'PARENTS' -- A list of the objects traversed to get to the
-      published object. So, 'PARENTS[0]' would be the ancestor of
-      the published object.
-
-      'REQUEST' -- The Request object itself.
-
-      'RESPONSE' -- The Response object, generally an instance of
-      HTTPResponse.
-
-      'PUBLISHED' -- The actual object published as a result of
-      url traversal.
-
-      'URL' -- The URL of the published object. 
-
-        This is almost the same as the exact URL the client requested,
-        but it does not include any query parameters, nor does it
-        include any trailing path elements (i.e. the traverse_subpath
-        available to Python Scripts and Page Templates).
-
-      *URLn* -- 'URL0' is the same as 'URL'. 'URL1' is the same as
-      'URL0' with the last path element removed. 'URL2' is the same
-      as 'URL1' with the last element removed. Etcetera.
-      Only as many URLn variables are defined as is necessary.
-
-        For example if URL='http://localhost/foo/bar', then
-        URL1='http://localhost/foo', URL2='http://localhost',
-	and URL3 and higher are not defined.
-
-      *URLPATHn* -- 'URLPATH0' is the path portion of 'URL',
-      'URLPATH1' is the path portion of 'URL1', and so on.
-
-        For example if URL='http://localhost/foo/bar', then
-        URLPATH1='/foo' and URLPATH2='/'.
-
-      *BASEn* -- 'BASE0' is the URL up to but not including the Zope
-      application object. 'BASE1' is the URL of the Zope application
-      object. 'BASE2' is the URL of the Zope application object with
-      an additional path element added in the path to the published
-      object. Etcetera.
-
-        For example if URL='http://localhost/Zope.cgi/foo/bar', then
-        BASE0='http://localhost', BASE1='http://localhost/Zope.cgi',
-        and BASE2='http://localhost/Zope.cgi/foo'.
-
-      *BASEPATHn* -- 'BASEPATH0' is the path portion of 'BASE0',
-      'BASEPATH1' is the path portion of 'BASE1', and so on.
-      'BASEPATH1' is the externally visible path to the root Zope
-      folder, equivalent to CGI's 'SCRIPT_NAME', but virtual-host aware.
-
-        For example if URL='http://localhost/Zope.cgi/foo/bar', then
-        BASEPATH0='/', BASEPATH1='/Zope.cgi', and BASEPATH2='/Zope.cgi/foo'.
-
-
-    In addition, many variables are commonly set by other parts of
-    the system, such as the virtual host machinery, or the published
-    objects, or your own application code.  XXX These should be noted
-    in each relevant section.
-
-    It is very instructive to view all the contents of a request.
-    This is a popular technique during debugging and development.
-    For example, in a Python Script::
-
-      request = context.REQUEST
-      return request
-
-    Or in a Page Template::
-
-      <span tal:replace="request" />
-
-    Or in DTML::
-    
-      <dtml-var REQUEST>
-
-
-
-    'get(key, default=None)'
-
-      Get the value of the request variable *key*.
-      If not found, return *default*.
-
-      The value will be looked up from one of the request data
-      categories. The search order is: environment variables, other
-      variables, form data, and then cookies.
-
-      Permission -- Always available
-
-    'get_header(name, default=None)'
-
-      Return the named HTTP header, or an optional default argument
-      or None if the header is not found. Note that both original
-      and CGI header names without the leading 'HTTP_' are
-      recognized, for example, 'Content-Type', 'CONTENT_TYPE' and
-      'HTTP_CONTENT_TYPE' should all return the Content-Type header,
-      if available.
-
-      Permission -- Always available
-
-    'getClientAddr()'
-
-      The IP address of the client, as a string.
-      If cannot be determined, the string will be empty.
-
-      Permission -- XXX Always available?
-
-    'has_key(key)'
-
-      Returns a true value if the request object contains *key*,
-      otherwise false.
-
-      Permission -- Always available
-
-    'items()'
-
-      Returns a sequence of (key, value) tuples for all the keys in
-      the request object.
-
-      Permission -- Always available
-
-    'keys()'
-
-      Returns a sorted sequence of all keys in the request object.
-
-      Permission -- Always available
-
-
-
-    'physicalPathToVirtualPath(path)'
-        
-      Remove the path to the VirtualRoot from the given
-      physical path. 
-
-      *path* may be a string delimited by slashes, or a sequence of
-       strings.
-
-      Returned value is a sequence of strings.
-
-      XXX example? must call setVirtualRoot first.
-
-      XXX usage? is this intended to be public?
-
-      Permission -- Always available XXX
-
-    'physicalPathFromURL(URL)'
-
-      Convert a *URL* string into a physical path (sequence of
-      strings) in the current context.  If the URL makes no sense in
-      light of the current virtual hosting context, a ValueError is
-      raised.
-
-      Note that this does not verify existence of an object
-      at the resulting path.
-      
-      Permission -- Always available XXX
-
-
-    'physicalPathToURL(path, relative=0)'
-
-      Convert a physical path into a URL in the current context.
-      Returns a url-quoted string.
-
-      *path* is a sequence of strings.
-
-      If *relative* is true, the resulting path begins with the path
-      of the current context. Otherwise, the server URL is included
-      too.
-
-      Intended to be called from publishing traversal hooks.  If you
-      are constructing URLs, you should probably use methods of
-      Traversable instead.
-
-      Permission -- Always available XXX
-
-    'set(name, value)'
-
-      Create a new name in the request object and assign it a value.
-      This name and value is stored in the 'other' category.
-
-      Permission -- Always available
-
-    'set_lazy(key, callable)' 
-
-      Add a lazy variable to the 'other' category.  When *key* is
-      subsequently requested for the first time, *callable* will be
-      called to compute the value, which is then stored in 'other' for
-      the remainder of the request's lifetime.
-
-      Permission -- XXX
-
-
-    'setServerURL(protocol=None, hostname=None, port=None)'
-
-      Sets the specified elements of 'SERVER_URL', also affecting
-      'URL', 'URLn', 'BASEn', and 'absolute_url()' and friends.
-
-      Provides virtual hosting support. Intended to be called from
-      publishing traversal hooks.
-
-      Permission -- Always available
-
-    'setVirtualRoot(path, hard=0)'
-
-      Alters 'URL', 'URLn', 'URLPATHn', 'BASEn', 'BASEPATHn', and
-      virtual-host-aware methods such as 'absolute_url()', such that
-      the current object has path 'path'.  If 'hard' is true,
-      'PARENTS' is emptied.
-
-      Provides virtual hosting support. Intended to be called from
-      publishing traversal hooks.
-
-      Permission -- Always available
-
-    'traverse(path, response=None, validated_hook=None)'
-       
-      Traverse the object space. Return an object if possible
-      and if allowed by the security machinery; otherwise, call
-      an appropriate error method of the response.
-
-      The REQUEST must already have a PARENTS item with at least one
-      object in it.  This is typically the root object.
-
-      *response* can be passed as an HTTPResponse instance.  It
-      defaults to self.response.
-      
-      *validated_hook* is an optional callable which, if passed, will
-      be called after security validation succeeds, with two
-      positional arguments: the request itself, and the validated user
-      object.
-
-      Permission -- Always available
-  
-    'values()'
-
-      Returns a sequence of values for all the keys in the request
-      object.
-
-      Permission -- Always available
-
-
-module 'HTTPResponse'
-
-  class 'HTTPResponse'
-
-    The Response object encapsulates all possible responses to HTTP
-    requests.  Responses are normally created by the object publisher.
-    A published object may recieve the response abject as an argument
-    named 'RESPONSE'.  A published object may also create it's own
-    response object.  
-
-    Normally, published objects use response objects 
-    to:
-
-    - Provide specific control over output headers,
-
-    - Set cookies, or
-
-    - Provide stream-oriented output.
-
-    If stream oriented output is used, then the response object
-    passed into the object must be used.
-
-    'addHeader(name, value)'
-
-      Set a new HTTP return header with the given value, while
-      retaining any previously set headers with the same name.
-
-      Permission -- Always available
-
-    'appendCookie(name, value, delimiter=',')'
-
-      Returns an HTTP header that sets a cookie on cookie-enabled
-      browsers with a key *name* and value *value*. If a value for the
-      cookie has previously been set in the response object, the new
-      value is appended to the old one separated by a colon. 
-
-      Permission -- Always available
-
-    'appendHeader(name, value, delimiter=",")'
-
-      Append a value to a header.
-
-      Sets an HTTP return header "name" with value "value", appending
-      it following *delimiter* if there was a previous value set for
-      the header.
-
-      Permission -- Always available
-
-    'badRequestError(name)'
-
-      Raise a BadRequest error.
-
-    'debugError(entry)'
-
-      Raises NotFound.
-
-
-    'enableHTTPCompression,REQUEST={},force=0,disable=0,query=0)'
-
-      Enable HTTP Content Encoding with gzip compression if possible.
-
-      REQUEST -- used to check if client can accept compression
-      force   -- set true to ignore REQUEST headers
-      disable -- set true to disable compression
-      query   -- just return if compression has been previously requested
-
-      returns -- 1 if compression will be attempted, 2 if compression
-                 is forced, 0 if no compression
-
-      The HTTP specification allows for transfer encoding and content
-      encoding. Unfortunately many web browsers still do not support
-       transfer encoding, but they all seem to support content encoding.
-
-      This function is designed to be called on each request to specify
-      on a request-by-request basis that the response content should
-      be compressed. This is quite useful for xml-rpc transactions, where
-      compression rates of 90% or more can be achieved for text data.
-
-      The REQUEST headers are used to determine if the client accepts
-      gzip content encoding. The force parameter can force the use
-      of gzip encoding regardless of REQUEST, and the disable parameter
-      can be used to "turn off" previously enabled encoding (but note
-      that any existing content-encoding header will not be changed).
-      The query parameter can be used to determine if compression
-      has been previously requested.
-
-      In setBody, the major mime type is used to determine if content
-      encoding should actually be performed.
-
-      By default, image types are not compressed.
-      Additional major mime types can be specified by setting the
-      environment variable DONT_GZIP_MAJOR_MIME_TYPES to a comma-seperated
-      list of major mime types that should also not be gzip compressed.
- 
-
-    'expireCookie(name, **kw)'
-
-      Cause an HTTP cookie to be removed from the browser
-
-      The response will include an HTTP header that will remove the cookie
-      corresponding to "name" on the client, if one exists. This is
-      accomplished by sending a new cookie with an expiration date
-      that has already passed. Note that some clients require a path
-      to be specified - this path must exactly match the path given
-      when creating the cookie. The path can be specified as a keyword
-      argument.
-
-      Permission -- Always available
-
-    'forbiddenError(entry="Unknown")'
-
-      raise NotFound.
-
-    'notFoundError(entry="Unknown")'
-
-      raise NotFound.
-
-    'redirect(location, status=302, lock=0)'
-
-      Cause a redirection without raising an error. If the "lock"
-      keyword argument is passed with a true value, then the HTTP
-      redirect response code will not be changed even if an error
-      occurs later in request processing (after redirect() has
-      been called).
-
-      You can also override the integer status code, e.g. you might
-      want to use 301 ("Moved Permanently") instead of 302 ("Moved
-      Temporarily").
-
-      Permission -- Always available
-
-    'setBase(base)'
-
-      Set the base URL for the returned document.
-      If base is None, or the document already has a base, 
-      has no effect.
-
-      Permission -- Always available
-
-
-
-    'setBody(body, title="", is_error=0)'
-
-      Sets the response  body equal to the (string) argument *body*. Also
-      updates the "content-length" return header.
-
-      You can also specify a title, in which case the title and body
-      will be wrapped up in html, head, title, and body tags.
-
-      If the body is a 2-element tuple, then it will be treated
-      as (title,body).
-
-      If *is_error* is true then the HTML will be formatted as a Zope error
-      message instead of a generic HTML page.
- 
-    'setCookie(name, value, **kw)'
-
-      Set an HTTP cookie on the browser
-
-      The response will include an HTTP header that sets a cookie on
-      cookie-enabled browsers with a key "name" and value
-      "value". This overwrites any previously set value for the
-      cookie in the Response object.
-
-        % Anonymous User - Oct. 13, 2004 11:11 am:
-         (quote from http://wp.netscape.com/newsref/std/cookie_spec.html)
-         expires=DATE
-             The expires attribute specifies a date string that defines the valid life time of
-         that cookie. Once the expiration date has been reached, the cookie will no longer be
-         stored or given out.
-             The date string is formatted as:
-                 Wdy, DD-Mon-YYYY HH:MM:SS GMT
-             This is based on RFC 822, RFC 850, RFC 1036, and RFC 1123, with the variations that
-         the only legal time zone is GMT and the separators between the elements of the date must
-         be dashes.
-             expires is an optional attribute. If not specified, the cookie will expire when the
-         user's session ends.
-             Note: There is a bug in Netscape Navigator version 1.1 and earlier. Only cookies whose
-         path attribute is set explicitly to "/" will be properly saved between sessions if they
-         have an expires attribute.
-
-         domain=DOMAIN_NAME
-             When searching the cookie list for valid cookies, a comparison of the domain attributes
-         of the cookie is made with the Internet domain name of the host from which the URL will be
-         fetched. If there is a tail match, then the cookie will go through path matching to see if
-         it should be sent. "Tail matching" means that domain attribute is matched against the tail
-         of the fully qualified domain name of the host. A domain attribute of "acme.com" would match
-         host names "anvil.acme.com" as well as "shipping.crate.acme.com".
-             Only hosts within the specified domain can set a cookie for a domain and domains must have
-         at least two (2) or three (3) periods in them to prevent domains of the form: ".com", ".edu",
-         and "va.us". Any domain that fails within one of the seven special top level domains listed
-         below only require two periods. Any other domain requires at least three. The seven special top
-         level domains are: "COM", "EDU", "NET", "ORG", "GOV", "MIL", and "INT".
-             The default value of domain is the host name of the server which generated the cookie
-         response.
-         path=PATH
-             The path attribute is used to specify the subset of URLs in a domain for which the cookie
-         is valid. If a cookie has already passed domain matching, then the pathname component of the
-         URL is compared with the path attribute, and if there is a match, the cookie is considered
-         valid and is sent along with the URL request. The path "/foo" would match "/foobar" and
-         "/foo/bar.html". The path "/" is the most general path.
-             If the path is not specified, it as assumed to be the same path as the document being
-         described by the header which contains the cookie.
-         secure
-             If a cookie is marked secure, it will only be transmitted if the communications channel
-         with the host is a secure one. Currently this means that secure cookies will only be sent
-         to HTTPS (HTTP over SSL) servers.
-             If secure is not specified, a cookie is considered safe to be sent in the clear over
-         unsecured channels.
-
-      Permission -- Always available
-
-    'setHeader(name, value, literal=0)'
-
-      Sets an HTTP return header *name* with value *value*, clearing
-      the previous value set for the header, if one exists. If the
-      literal flag is true, the case of the header name is
-      preserved, otherwise word-capitalization will be performed on
-      the header name on output.
-
-      Permission -- Always available
-
-    'setStatus(status, reason=None)'
-
-      Sets the HTTP status code of the response; the *status* may
-      either be an integer or one of the following strings:
-
-          OK,
-          Created,
-          Accepted,
-          NoContent,
-          MovedPermanently,
-          MovedTemporarily,
-          NotModified,
-          BadRequest,
-          Unauthorized,
-          Forbidden,
-          NotFound,
-          InternalError,
-          NotImplemented,
-          BadGateway,
-          ServiceUnavailable
-
-      that will be converted to the correct integer value.
-
-      The *reason* argument is an optional string which may override
-      the default explanatory text (e.g. if you want to describe a 404
-      status with something other than "Not Found").
-
-      Permission -- Always available
-
-    'unauthorized'
-
-      Raise an Unauthorized error.
-
-    'write(data)'
-
-      Return data as a stream.
-
-      HTML data may be returned using a stream-oriented interface.
-      This allows the browser to display partial results while
-      computation of a response to proceed.
-
-      The published object should first set any output headers or
-      cookies on the response object. In particular, the
-      CONTENT-LENGTH header must be set correctly.
-
-      Note that published objects must not generate any errors
-      after beginning stream-oriented output. 
-
-      Permission -- Always available
-
-
-module 'Image'
-
-  class 'File(Persistent, Implicit, PropertyManager, RoleManager, Item_w__name__, Cacheable)'
-
-    A File is a Zope object that contains arbitrary file content.  
-    It can be used to upload or download file information.
-
-    If the File contains some text data, it may be rendered in
-    a Page Template very easily like so::
-
-      <span tal:replace="context/FileObject" />
-
-    A more complex example is presenting the File object for
-    download by the user.  The next example displays a link to every
-    File object in a folder for the user to download::
-
-      <ul>
-        <li tal:repeat="f python:context.objectValues('File')">
-	  <a tal:attributes="f/absolute_url"
-             tal:content="f/getId"> the ID goes here </a>
-        </li>
-      </ul>
-
-    In this example, the 'absolute_url' method and 'getId' are used to
-    create a list of HTML hyperlinks to all of the File objects in
-    the current Object Manager. See ObjectManager for more about
-    the 'objectValues' method.
-
-    'getContentType()'
-
-      Returns the content type of the file.
-
-      Permission -- 'View'
-
-    'get_size()'
-
-      Returns the size of the file in bytes.
-
-      Permission -- 'View'
-
-    'index_html(REQUEST, RESPONSE)'
-
-      The default view of the contents of a File or Image.
-
-      Uses the *RESPONSE* object to output the contents of the file
-      or image.  Also, sets the Content-Type header of *RESPONSE* to
-      the object's content type.
-
-      If the object has a *precondition* (as described in the
-      constructor), it will be called before any data is returned.
-
-      Return value is a string, but it may be empty: the File may
-      elect to set a 304 (Not Modified) status and return immediately;
-      or if the file's size is not tiny, it may elect to use the
-      RESPONSE object's streaming interface. In either case, the
-      return value will be an empty string.
-
-      Permission -- 'View'
-
-    'manage_edit(title, content_type, precondition="", filedata=None, REQUEST=None)'
-
-      Changes the title and content type attributes of the object.
-      
-      If *filedata* is provided, it replaces the object's uploaded
-      data.  It can be either a string or a FileUpload instance.
-      
-      If *precondition* is provided, it replaces any existing
-      precondition. See the ObjectManager constructor for 
-      explanation of precondition.
-
-      Permission -- 'Change Images and Files'
-
-    'manage_upload(file, REQUEST=None)'
-   
-      Replaces the current contents of the File or Image object with 
-      *file*, which may be a string or a FileUpload instance.
-
-      Permission -- 'Change Images and Files'
- 
-    'update_data(data, content_type=None, size=None)'
-      
-      XXX Is this really part of the API?
-
-      Updates the contents of the File with 'data'.
-
-        % Anonymous User - Nov. 6, 2004 6:11 am:
-         I don't get why you can't access this internally.
-
-      The 'data' argument must be a string. If 'content_type' is not
-      provided, then a content type will not be set. If size is not
-      provided, the size of the file will be computed from 'data'.
-
-      Permission -- restricted Python only
-
-    'view_image_or_file(URL1)'
-
-      Used by the UI to redirect to the default view of the 
-      File or Image.
-
-      Permission -- 'View'
-
-    ObjectManager Factory
-
-      'manage_addFile(id, file="", title="", precondition="", content_type="", REQUEST=None)'
-
-        Add a new File object.
-	
-	The optional *file* may be a string or a FileUpload instance.
-	If not provided, the new File object will have no data.
-
-	The optional *precondition* is an ID for a callable object.
-	If non-empty, it will be looked up (via acquisition) and
-	called every time the file is viewed. The intention is
-	that this object may raise an exception if you wish to
-	prevent the file from being viewed.
-
-	*content_type* may be explicitly passed; otherwise,
-	an attempt will be made to guess.
-
-
-
-  class 'Image(File)'
-
-    An Image is a Zope object that contains image content.
-
-    Images have all the same methods as Files, with a few useful
-    additions.
-
-    Images have two read-only properties which define their
-    dimensions, 'height' and 'width'. These are calculated when the
-    image is uploaded. For image types that Zope does not understand,
-    these properties may be undefined.
-
-    Zope only recognizes JPEG, PNG, and GIF images.
-
-    Using an Image object in Zope is easy. The most common usage is
-    to display the contents of an image object in a web page.  This
-    is done by simply referencing the object from a Page Template::
-
-      <img tal:replace="structure context/ImageObject" />
-
-    This will generate an HTML IMG tag referencing the URL to the
-    Image. This is equivalent to::
-
-      <img tal:attributes="src context/ImageObject/absolute_url;
-                           height context/ImageObject/height;
-                           width context/ImageObject/width;
-                           alt context/ImageObject/title_or_id" />
-
-
-    You can control the image display more precisely with the 'tag'
-    method. For example::
-
-      <img tal:replace="structure  
-                        python:context.ImageObject.tag(border='5', 
-                                                       align='left')" />
-
-    'tag(height=None, width=None, alt=None, scale=0, xscale=0, yscale=0, **args)'
-
-      This method returns a string which contains an HTML IMG tag
-      reference to the image.
-
-      Optionally, the 'height', 'width', 'alt', 'scale', 'xscale'
-      and 'yscale' arguments can be provided which are turned into
-      HTML IMG tag attributes. Note, 'height' and 'width' are
-      provided by default, and 'alt' comes from the 'title_or_id'
-      method.
-
-      Keyword arguments may be provided to support other or future IMG
-      tag attributes.  The one exception to this is the HTML Cascading
-      Style Sheet tag 'class'.  Because the word 'class' is a reserved
-      keyword in Python, you must instead use the keyword argument
-      'css_class'.  This will be turned into a 'class' HTML tag attribute
-      on the rendered 'img' tag.
-
-      Permission -- 'View'
-
-    ObjectManager Factory
-
-      'manage_addImage(id, file, title="", precondition="", content_type="", REQUEST=None)'
-
-        Add a new Image object.
-
-        Creates a new Image object 'id' with the contents of 'file',
-        which may be a string or a FileUpload instance.
-
-        *precondition* and *content_type* have the same meaning as for 
-        the 'File' class.
-
-
-module 'MailHost'
-
-  class 'MailHost(Acquisition.Implicit, Item, RoleManager)'
-
-    MailHosts allow you to send mail via the Simple Mail Transfer
-    Protocol (SMTP).
-
-    This object can be used deliver mail by the its send() and 
-    simple_send() methods.  It can also be used from DTML objects
-    with the <dtml-sendmail> tag.
-
-    'manage_makeChanges(title,smtp_host,smtp_port, REQUEST=None)'
-
-      Change the title, smtp_host, and smtp_port.
-
-      Permission -- 'Change configuration'
-
-    'send(messageText, mto=None, mfrom=None, subject=None, encode=None)'
-
-      Sends an email message where the messageText is an rfc822 formatted
-      message. This allows you complete control over the message headers,
-      including setting any extra headers such as Cc: and Bcc:.
-      The arguments are:
-
-        messageText -- The mail message. It can either be a rfc822
-        formed text with header fields, or just a body without any
-        header fields. The other arguments given will override the
-        header fields in the message, if they exist.
-
-        mto -- Recipient(s) of the message, either as a
-        comma-separated string of addresses, or as a list of such
-        strings.
-
-        mfrom -- The address of the message sender.
-
-        subject -- The subject of the message.
-
-        encode -- The rfc822-defined encoding of the message.  The
-        default of 'None' means no encoding is done.  Valid values
-        are 'base64', 'quoted-printable' and 'uuencode'.
-
-        Permission -- 'Use mailhost services'
-
-    'simple_send(mto, mfrom, subject, body)'
-
-      Sends a message. Only To:, From: and Subject: headers can be set.
-      The arguments are:
-
-        mto -- Recipient(s) of the message, either as a
-        comma-separated string of addresses, or as a list of such
-        strings.
-
-        mfrom -- The address of the message sender.
-
-        subject -- The subject of the message.
-
-        body -- The body of the message.
-
-        Permission -- 'Use mailhost services'
-
-    ObjectManager Factory
-
-      'manage_addMailHost(id, title="", smtp_host='localhost', localhost='localhost', smtp_port=25, timeout=1.0, REQUEST=None)'
-
-        Add a mailhost object to an ObjectManager with the given 'id'.
-
-	smtp_host --  is the hostname or IP address (as a string) of the
-	SMTP server that this MailHost will use.
-
-	smtp_port -- is the integer port of the SMTP server that this
-	MailHost will use.
-
-	localhost -- apparently not used.
- 
-        timeout -- apparently not used.
-
-
-module 'ObjectManager'
-
-  class 'ObjectManager(CopySupport.CopyContainer, Acquisition.Implicit, Persistent,  Collection, Traversable)
-'
-    XXX what's Collection?
-
-    An ObjectManager contains other Zope objects. The contained
-    objects are persistent Products, and typically derived from
-    'SimpleItem' or 'Item'.
-    
-    Creating an object inside an ObjectManager requires you to first
-    look up a factory function in a mapping of Products. Therefore,
-    you need to know both the Product name and the factory function
-    name. 
-
-    This can be a little confusing at first.  Here's an example
-    of creating a new Folder::
-
-      self.manage_addProduct['OFS'].manage_addFolder(id, title)
-
-    'self' in this example is the current ObjectManager.
-
-    'manage_addProduct' is the mapping of Products to factory function
-    namespacess.  It is indexed by product id. You need to know the
-    name of the Product (a Python package) which contains the class
-    you are trying to add.  The resulting namespace contains
-    potentially many factory functions - one for each addable class
-    the Product provides.
-
-    'OFS' is a Product which provides the Folder class.  The name
-    *OFS* itself dates back to very early versions of Zope and doesn't
-    really mean anything now. The OFS package is a collection of many
-    core Zope base classes and content types, including Folder, Image,
-    File, and DTMLMethod. Each has its own factory function.
-
-    'manage_addFolder' is the factory function for Folder. Factory
-    functions are registered during product initialization when Zope
-    starts up. The first argument is always the ObjectManager calling
-    the function, and is implicitly passed as if the function were a
-    method of the ObjectManager. The next argument is the 'id' which
-    gives the id for the new object. Some factory functions may have
-    other required or optional arguments.
-
-    Factory functions are also typically protected by permissions
-    relevant to the type in question.  
-
-    Product authors should provide documentation about their factory
-    function arguments and permissions; unfortunately, many do not.
-    For core Zope classes such as Folder, the documentation is this
-    API Reference.  When documentation is lacking, you can always
-    check the source code.
-
-
-    'manage_FTPstat()'
-
-      Generates unix-like object stats for FTP listings.  The return
-      value is not human-readable but is usable by FTP clients.
-      
-      Permission -- 'FTP access'
-
-    'manage_FTPlist(REQUEST)'
-
-      FTP view of ObjectManager contents. The return value is not
-      human-readable but is usable by FTP clients.
-
-      'REQUEST' is an instance of FTPRequest (similar to HTTPRequest).
-
-      If REQUEST.environ has a non-empty 'GLOBBING' variable, it
-      will be used as a pattern to match on the listed objects.
-
-      If REQUEST.environ['FTP_RECURSIVE'] is set to 1, the listing
-      will recursively descend into all child Folders.
-      
-      Permission -- 'FTP access'
-
-    'manage_delObjects(ids=[], REQUEST=None)'
-
-      Delete objects from this ObjectManager.
-      'ids' may be a string giving a single id, or a list of strings.
-
-      Deletion is transactional: all designated objects will be
-      successfully deleted, or none will.
-
-      For each deleted object, its manage_beforeDelete() method will
-      be called, if one is defined.
-
-      Permission -- 'Delete objects'
-
-    'manage_exportObject(id="", download=None, toxml=None, RESPONSE=None,REQUEST=None)'
-
-      Export the object with the given 'id'.
-
-      If 'download' is true, the resulting file data is returned to
-      the client. Otherwise, it is saved to a file in this Zope
-      instance's 'var' directory.  The file is named for 'id' with the
-      extension *.zexp*.
-
-      If 'toxml' is true, the data is in an XML format. (Note: This
-      format is reputedly not very useful to non-Zope applications and
-      it seems not to be widely used.)
-      
-      Permission -- 'Import/Export objects'
-
-    'manage_importObect(file, REQUEST=None, set_owner=1)'
-
-      Import an object from the given path.  *file* is a path relative
-      to this Zope instance's 'import' directory.
-
-      If the optional *set_owner* argument is true, the imported
-      object(s) will belong to the user who called this method.
-
-      Permission -- 'Import/Export objects'
-
-    'objectIds(spec=None)'
-
-      This method returns a list of the string ids of the contained
-      objects.
-
-      Optionally, you can pass an argument specifying what object
-      meta_type(s) to restrict the results to. This argument can be
-      a string specifying one meta_type, or it can be a list of
-      strings to specify many.
-
-      DTML example, with the optional argument::
-
-        <dtml-in "objectIds('DTML Document')">
-          <dtml-var id>
-        <dtml-else>
-          There are no sub-folders.
-        </dtml-in>
-
-      This DTML code will display all the ids of the DTML Documents
-      contained in the current Object Manager.
-
-      Permission -- 'Access contents information'
-
-    'objectItems(type=None)'
-
-      This method returns a sequence of (id, object) tuples.
-
-      Like objectValues and objectIds, it accepts one argument,
-      either a string or a list to restrict the results to objects
-      of a given meta_type or set of meta_types.
-
-      Each tuple's first element is the id of an object contained in
-      the Object Manager, and the second element is the object
-      itself.
-
-      Page Template example, without the optional argument::
-
-        <span tal:define="items ontext/objectItems">
-         <div tal:repeat="item items">
-           id: <span tal:replace=python:item[0]">
-           type: <span tal:replace="python:item[1].meta_type" />
-         </div>
-         <span tal:condition="not: repeat/item">
-          There are no sub-objects.
-         </span>
-        </span>
-
-      Permission -- 'Access contents information'
-
-    'objectValues(spec=None)'
-
-      This method returns a sequence of contained objects.
-
-      Like objectItems and objectIds, it accepts one argument,
-      either a string or a list to restrict the results to objects
-      of a given meta_type or set of meta_types.
-
-      Page Template example, restricted to one meta_type::
-
-        <div tal:repeat="item python:here.objectValues('Folder')">
-          <img tal:replace="item/icon" />
-          This is the icon for the: <span tal:replace="item/getId" /> Folder.
-        </div>
-
-      Python example, restricted to a list of meta_types::
-
-         return context.objectValues(['File','Folder'])
-
-      Permission -- 'Access contents information'
-
-    'superValues(t)'
-
-      This method returns a list of objects of a given meta_type(s)
-      contained in the Object Manager and all its parent Object
-      Managers.
-
-      The required 't' argument specifies the meta_type(s). As with
-      the objectItems(), objectIds(), and objectValues() methods, it
-      can be a string specifying one meta_type, or it can be a list of
-      strings to specify many meta_types.
-
-      Permission -- restricted Python only
-
-
-
-module 'PropertyManager'
-
-  class 'PropertyManager'
-
-    A Property Manager object has a collection of typed attributes
-    called properties. Properties can be managed through the Zope
-    management interface or programmatically via the PropertyManager
-    API.
-
-    In addition to having a type, properties can be writable or
-    read-only and can have default values.
-
-    The PropertyManager mixin class provides an object with
-    transparent property management. An object which wants to
-    have properties should inherit from PropertyManager.
-
-    An object may specify that it has one or more predefined
-    properties, by specifying a _properties structure in its
-    class::
-
-      _properties=({'id':'title', 'type': 'string', 'mode': 'w'},
-                   {'id':'color', 'type': 'string', 'mode': 'w'},
-                   )
-
-    The _properties structure is a sequence of dictionaries, where
-    each dictionary represents a predefined property. Note that if a
-    predefined property is defined in the _properties structure, your
-    class or instance must provide an attribute with that name
-    containing the default value of the predefined property.
-
-    Each entry in the _properties structure must have at least an 'id'
-    and a 'type' key. The 'id' key contains the name of the property,
-    and the 'type' key contains a string representing the object's type.
-    The 'type' string must be one of the values: 'boolean', 'float', 'int', 'long',
-    'string', 'lines', 'text', 'date', 'tokens', 'selection', or
-    'multiple section'.
-
-    For 'selection' and 'multiple selection' properties, there is an
-    addition item in the property dictionay, 'select_variable' which
-    provides the name of a property or method which returns a list of
-    strings from which the selection(s) can be chosen.
-
-    Each entry in the _properties structure may *optionally* provide a
-    'mode' key, which specifies the mutability of the property. The 'mode'
-    string, if present, must contain 0 or more characters from the set
-    'w','d'.
-
-    A 'w' present in the mode string indicates that the value of the
-    property may be changed by the user. A 'd' indicates that the user
-    can delete the property. An empty mode string indicates that the
-    property and its value may be shown in property listings, but that
-    it is read-only and may not be deleted.
-
-    Entries in the _properties structure which do not have a 'mode' key
-    are assumed to have the mode 'wd' (writeable and deleteable).
-
-    To fully support property management, including the system-provided
-    tabs and user interfaces for working with properties, an object which
-    inherits from PropertyManager should include the following entry in
-    its manage_options structure::
-
-      {'label':'Properties', 'action':'manage_propertiesForm',}
-
-    to ensure that a 'Properties' tab is displayed in its management
-    interface. Objects that inherit from PropertyManager should also
-    include the following entry in its __ac_permissions__ structure::
-
-      ('Manage properties', ('manage_addProperty',
-                             'manage_editProperties',
-                             'manage_delProperties',
-                             'manage_changeProperties',)),
-
-    XXX that's the old-school permissions declaration.
-
-    'getProperty(id, d=None)'
-
-      Return the value of the property 'id'. If the property is not
-      found, the optional second argument or None is returned.
-
-      Permission -- 'Access contents information'
-
-    'getPropertyType(id)'
-
-      Get the type of property 'id'. Returns None if no such
-      property exists.
-
-
-      Permission -- 'Access contents information'
-
-    'hasProperty(id)'
-
-      Returns a true value if object has the property
-      'id'. Otherwise returns false.
-
-      Permission -- 'Access contents information'
-
-    'manage_addProperty(id, value, type, REQUEST=None)'
-
-      Add a new property with the iven id, type, and value.
-      If a property with that id already exists, BadRequest will
-      be raised.
-
-
-    'manage_changeProperties(REQUEST=None, **kw)'
-
-      Change existing object properties.
-
-      Change object properties by passing either a mapping object
-      of name:value pairs, e.g. {'foo':6}, or by 
-      passing name=value keyword arguments.
-      Properties that are not passed will not be changed.
-
-      If a given property does not exist, it will be silently ignored.
-      
-      If a given property is read-only, BadRequest will be raised.
-   
-      Permission -- 'Change properties'
-
-    'manage_delProperties(ids=None, REQUEST=None)'
-
-      Delete one or more properties specified by 'ids',
-      or in the REQUEST variable '_ids'.
-
-      If any of the specified ids does not exist, BadRequest
-      will be raised and all changes will be rolled back.
-
-      Permission -- 'Change properties'
-
-    'manage_editProperties(REQUEST)'
-    
-      Edit object properties via the web.  The purpose of this method
-      is to change all property values, even those not listed in
-      REQUEST; otherwise checkboxes that get turned off will be
-      ignored.  Use manage_changeProperties() instead for most
-      situations.
-
-      Permission -- 'Change properties'
-
-
-    'propertyIds()'
-
-      Returns a list of property ids.
-
-      Permission -- 'Access contents information'
-
-    'propertyItems()'
-
-      Return a list of (id, value) tuples.
-
-      Permission -- 'Access contents information'
-
-    'propertyLabel(id)'
-       
-      Return a label for the given property id, defaulting to id.
-
-      XXX is this really part of the API?
-
-      Permission -- restricted Python only XXX ?
-
-    'propertyMap()'
-
-      Returns a tuple of mappings, each iving meta-data for a
-      property, but not its value.The meta-data includes
-      'id', 'type', and 'mode'.  Example::
-
-         >>> app.propertyMap()
-         ({'type': 'string', 'id': 'title', 'mode': 'wd'},)
-
-
-      Permission -- 'Access contents information'
-
-    'propertyValues()'
-
-      Returns a list of property values.
-
-      Permission -- 'Access contents information'
-
-    'valid_property_id(id)'
-
-      Returns true if 'id' is a legal property id.
-
-      Permission -- restricted Python only
-
-
-module 'PropertySheet'
-
-  class 'PropertySheet'
-
-    A PropertySheet is an abstraction for organizing and working
-    with a set of related properties. Conceptually it acts like a
-    container for a set of related properties and meta-data describing 
-    those properties. A PropertySheet may or may not provide a web 
-    interface for managing its properties.
-
-    XXX These are mostly used for ZClasses... are they deprecated??
-
-    'getProperty(id, d=None)'
-
-      Get the property 'id', returning the optional second 
-      argument or None if no such property is found.
-
-      Permission -- restricted Python only
-
-    'getPropertyType(id)'
-
-      Get the type of property 'id'. Returns None if no such
-      property exists.
-
-        % Anonymous User - May 22, 2002 7:25 am:
-         For ZClasses:
-         use as: context.propertysheets.propertysheetname.propertyItems() in Python scripts and as: <dtml-var
-         "propertysheets.propertysheetname.propertyItems()"> in DTML, where propertysheetname is the name of the
-         property sheet you've defined in the ZClass.
-
-      Permission -- restricted Python only
-
-    'hasProperty(id)'
-
-      Returns true if 'self' has a property with the given 'id', 
-      false otherwise.
-
-      Permission -- 'Access contents information'
-
-    'manage_addProperty(id, value, type, REQUEST=None)'
-
-      Add a new property with the given 'id', 'value' and 'type'.
-
-      These are the
-      property types:
-
-        'boolean' -- 1 or 0. 
-
-        'date' -- A 'DateTime' value, for example '12/31/1999 15:42:52 PST'.
-
-        'float' -- A decimal number, for example '12.4'. 
-
-        'int' -- An integer number, for example, '12'. 
-
-        'lines' -- A list of strings, one per line. 
-
-        'long' -- A long integer, for example '12232322322323232323423'. 
-
-        'string' -- A string of characters, for example 'This is a string'. 
-
-        'text' -- A multi-line string, for example a paragraph. 
-
-        'tokens' -- A list of strings separated by white space, for example
-        'one two three'. 
-
-        'selection' -- A string selected by a pop-up menu. 
-
-        'multiple selection' -- A list of strings selected by a selection list.
-
-      This method will use the passed in 'type' to try to convert
-      the 'value' argument to the named type. If the given 'value'
-      cannot be converted, a ValueError will be raised.
-
-      The value given for 'selection' and 'multiple selection'
-      properites may be an attribute or method name.  The attribute
-      or method must return a sequence values.
-
-      If the given 'type' is not recognized, the 'value' and 'type'
-      given are simply stored blindly by the object.
-
-      If no value is passed in for 'REQUEST', the method will return
-      'None'. If a value is provided for 'REQUEST' (as it will when
-      called via the web), the property management form for the
-      object will be rendered and returned.
-
-      This method may be called via the web, from DTML or from
-      Python code.
-
-      Permission -- 'Manage Properties'
-
-    'manage_changeProperties(REQUEST=None, **kw)'
-
-      Change existing object properties by passing either a mapping 
-      object as 'REQUEST' containing name:value pairs or by passing 
-      name=value keyword arguments.
-
-      Some objects have "special" properties defined by product 
-      authors that cannot be changed. If you try to change one of 
-      these properties through this method, an error will be raised.
-
-      Note that no type checking or conversion happens when this 
-      method is called, so it is the caller's responsibility to 
-      ensure that the updated values are of the correct type. 
-      *This should probably change*.
-
-      If a value is provided for 'REQUEST' (as it will be when
-      called via the web), the method will return an HTML message
-      dialog. If no REQUEST is passed, the method returns 'None' on
-      success.
-
-      This method may be called via the web, from DTML or from
-      Python code.
-
-      Permission -- 'Manage Properties'
-
-    'manage_delProperties(ids=None, REQUEST=None)'
-
-      Delete one or more properties with the given 'ids'. The 'ids' 
-      argument should be a sequence (tuple or list) containing the 
-      ids of the properties to be deleted. If 'ids' is empty no 
-      action will be taken. If any of the properties named in 'ids' 
-      does not exist, an error will be raised. 
-
-      Some objects have "special" properties defined by product
-      authors that cannot be deleted. If one of these properties is
-      named in 'ids', an HTML error message is returned.
-
-      If no value is passed in for 'REQUEST', the method will return
-      None. If a value is provided for 'REQUEST' (as it will be when
-      called via the web), the property management form for the
-      object will be rendered and returned.
-
-      This method may be called via the web, from DTML or from
-      Python code.
-
-      Permission -- 'Manage Properties'
-
-    'propertyInfo()'
-
-      Returns a mapping containing property meta-data.
-
-      Permission -- restricted Python only
-
-    'propertyItems()'
-
-      Return a list of (id, property) tuples.
-
-      Permission -- 'Access contents information'
-
-    'propertyValues()'
-
-      Returns a list of actual property values.
-
-      Permission -- 'Access contents information'
-
-    'xml_namespace()'
-
-      Return a namespace string usable as an xml namespace
-      for this property set. This may be an empty string if 
-      there is no default namespace for a given property sheet
-      (especially property sheets added in ZClass definitions).
-
-      Permission -- restricted Python only
-
-    'propertyMap()'
-
-      Returns a tuple of mappings, giving meta-data for properties.
-
-      Permssion -- restricted Python only
-
-    'propertyIds()'
-
-      Returns a list of property ids.
-
-      Permission --  'Access contents information'
-
-module 'PropertySheets'
-
-  class 'PropertySheets'
-
-    A PropertySheet is an abstraction for organizing and working with
-    a set of related properties. Conceptually it acts like a container
-    for a set of related properties and meta-data describing those
-    properties. PropertySheet objects are accessed through a
-    PropertySheets object that acts as a collection of PropertySheet
-    instances.
-
-    Objects that support property sheets (objects that support the
-    PropertyManager interface or ZClass objects) have a
-    'propertysheets' attribute (a PropertySheets instance) that is the
-    collection of PropertySheet objects. The PropertySheets object
-    exposes an interface much like a Python mapping, so that
-    individual PropertySheet objects may be accessed via
-    dictionary-style key indexing.
-
-    'get(name, default=None)'
-
-      Return the PropertySheet identified by 'name', or the value
-      given in 'default' if the named PropertySheet is not found.
-
-      Permission -- restricted Python only
-
-    'items()'
-
-      Return a sequence containing an '(id, object)' tuple for
-      each PropertySheet object in the collection.
-
-      Permission -- restricted Python only
-
-    'values()'
-
-      Return a sequence of all of the PropertySheet objects
-      in the collection.
-
-      Permission -- restricted Python only
-
-module 'PythonScripts'
-
-  class 'PythonScript(Script)'
-
-    XXX When does *traverse_subpath* get set on the request?
-    It is a  list of any remaining path elements after the currently published
-    object.
-
-        For example, if an object at /spam/eggs is published but the
-        requested path was /spam/eggs/bacon/spam/spam, then
-        traverse_subpath =  ['bacon', 'spam',
-        'spam'].
-
-    XXX
-
-    Python Scripts contain python code that gets executed when you call the
-    script by:
-
-      o Calling the script through the web by going to its location with a
-        web browser.
-
-      o Calling the script from another script object.
-
-      o Calling the script from a method object, such as a DTML Method.
-
-    Python Scripts can contain a "safe" subset of the python language.
-    Python Scripts must be safe because they can be potentially edited by
-    many different users through an insecure medium like the web.  The
-    following safety issues drive the need for secure Python Scripts:
-
-      o Because many users can use Zope, a Python Script must make sure it
-        does not allow a user to do something they are not allowed to do,
-        like deleting an object they do not have permission to delete.
-        Because of this requirement, Python Scripts do many security checks
-        in the course of their execution.
-
-      o Because Python Scripts can be edited through the insecure medium of
-        the web, they are not allowed access to the Zope server's
-        file-system.  Normal Python builtins like 'open' are, therefore,
-        not allowed.
-
-      o Because many standard Python modules break the above two security
-        restrictions, only a small subset of Python modules may be imported
-        into a Python Scripts with the "import" statement unless they have
-        been validated by Zope's security policy.  Currently, the following
-        standard python modules have been validated:
-
-          o string
-
-          o math
-
-          o whrandom and random
-
-          o Products.PythonScripts.standard
-
-      o Because it allows you to execute arbitrary python code, the python
-        "exec" statement is not allowed in Python methods.
-
-      o Because they may represent or cause security violations, some
-        Python builtin functions are not allowed.  The following
-        Python builtins are not allowed:
-
-          o open
-
-          o input
-
-          o raw_input
-
-          o eval
-
-          o execfile
-
-          o compile
-
-          o type
-
-          o coerce
-
-          o intern
-
-          o dir
-
-          o globals
-
-          o locals
-
-          o vars
-
-          o buffer
-
-          o reduce
-
-      o Other builtins are restricted in nature.  The following builtins
-        are restricted:
-
-          range -- Due to possible memory denial of service attacks, the
-          range builtin is restricted to creating ranges less than 10,000
-          elements long.
-
-          filter, map, tuple, list -- For the same reason, builtins
-          that construct lists from sequences do not operate on strings.
-
-          getattr, setattr, delattr -- Because these may enable Python
-          code to circumvent Zope's security system, they are replaced with
-          custom, security constrained versions.
-
-      o In order to be consistent with the Python expressions
-        available to DTML, the builtin functions are augmented with a
-        small number of functions and a class:
-
-          o test
-
-          o namespace
-
-          o render
-
-          o same_type
-
-          o DateTime
-
-      o Because the "print" statement cannot operate normally in this
-        context, its effect has been changed.  Rather than sending
-        text to stdout, "print" appends to an internal variable.  The
-        special builtin name "printed" evaluates to the concatenation
-        of all text printed so far during the current execution of the
-        script.
-
-    'ZPythonScriptHTML_editAction(REQUEST, title, params, body)'
-
-      Change the script's main parameters.  This method accepts the
-      following arguments:
-
-        REQUEST -- The current request.
-
-        title -- The new value of the Python Script's title.  This must
-        be a string.
-
-        params -- The new value of the Python Script's parameters.  Must
-        be a comma seperated list of values in valid python function
-        signature syntax.  If it does not contain a valid signature
-        string, a SyntaxError is raised.
-
-        body -- The new value of the Python Script's body.  Must contain
-        valid Python syntax.  If it does not contain valid Python syntax,
-        a SyntaxError is raised.
-
-    'ZPythonScript_edit(params, body)'
-
-      Change the parameters and body of the script.  This method accepts
-      two arguments:
-
-        params -- The new value of the Python Script's parameters.  Must
-        be a comma seperated list of values in valid python function
-        signature syntax.  If it does not contain a valid signature
-        string, a SyntaxError is raised.
-
-        body -- The new value of the Python Script's body.  Must contain
-        valid Python syntax.  If it does not contain valid Python syntax,
-        a SyntaxError is raised.
-
-    'ZPythonScript_setTitle(title)'
-
-      Change the script's title.  This method accepts one argument,
-      'title' which is the new value for the script's title and must be a
-      string.
-
-    'ZPythonScriptHTML_upload(REQUEST, file="")'
-
-      Pass the text in file to the 'write' method.
-
-    'ZScriptHTML_tryParams()'
-
-      XXX is the name right?
-
-      Return a list of the required parameters with which to
-      test the script.
-
-
-    'document_src(REQUEST=None, RESPONSE=None)'
-
-      Return the text of the 'read' method, with content type
-      'text/plain' set on the RESPONSE.
-
-    'read()'
-
-      Return the body of the Python Script, with a special comment
-      block prepended.  This block contains meta-data in the form of
-      comment lines as expected by the 'write' method.
-
-    'write(text)'
-
-      Change the script by parsing the text argument into parts.
-      Leading lines that begin with '##' are stripped off, and if
-      they are of the form '##name=value', they are used to set
-      meta-data such as the title and parameters.  The remainder of
-      the text is set as the body of the Python Script.
-
-
-    ObjectManager Factory
-
-      'manage_addPythonScript(id, REQUEST=None)'
-
-        Add a Python script to a folder.
-
-	XXX that's incomplete and misleading, you have to do 
-        manage_addProduct['PythonScripts'].manage_addPythonScript(...)
-
-
-
-module 'Shared.DC.Scripts.Script'
-
-  Script module
-
-  This provides generic script support.
-
-  class 'Script(SimpleItem, BindingsUI)'
-
-    Web-callable script base interface.
-
-    'ZScriptHTML_tryAction(REQUEST, argvars)'
-
-      Apply the test parameters provided by the dictionary 'argvars'.
-      This will call the current script with the given arguments and
-      return the result.
-
-module 'SessionInterfaces'
-
-  Session API
-
-    See Also
-
-    - TransientObject
-
-  class 'BrowserIdManagerErr'
-
-    Error raised during some browser id manager operations, as
-    explained in the API documentation of the Browser Id Manager.
-
-    This exception may be caught in PythonScripts.  A successful
-    import of the exception for PythonScript use would need to be::
-
-       from Products.Sessions import BrowserIdManagerErr
-
-
-  class 'BrowserIdManagerInterface'
-
-    Zope Browser Id Manager interface.
-
-    A Zope Browser Id Manager is responsible for assigning ids to site
-    visitors, and for servicing requests from Session Data Managers
-    related to the browser id.
-
-    'encodeUrl(url)'
-
-      Encodes a provided URL with the current request's browser id
-      and returns the result.  For example, the call
-      encodeUrl('http://foo.com/amethod') might return
-      'http://foo.com/amethod?_ZopeId=as9dfu0adfu0ad'.
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If there is no current browser id.
-
-    'flushBrowserIdCookie()'
-
-      Deletes the browser id cookie from the client browser, iff the
-      'cookies' browser id namespace is being used.
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If the 'cookies' namespace isn't
-      a browser id namespace at the time of the call.
-
-    'getBrowserId(create=1)'
-
-      If create=0, returns a the current browser id or None if there
-      is no browser id associated with the current request.  If create=1,
-      returns the current browser id or a newly-created browser id if
-      there is no browser id associated with the current request.  This
-      method is useful in conjunction with getBrowserIdName if you wish to
-      embed the browser-id-name/browser-id combination as a hidden value in
-      a POST-based form.  The browser id is opaque, has no business meaning,
-      and its length, type, and composition are subject to change.
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr if ill-formed browser id
-      is found in REQUEST.
-
-    'getBrowserIdName()'
-
-      Returns a string with the name of the cookie/form variable which is
-      used by the current browser id manager as the name to look up when
-      attempting to obtain the browser id value.  For example, '_ZopeId'.
-
-      Permission required: Access contents information
-
-    'hasBrowserId()'
-
-      Returns true if there is a browser id for this request.
-
-      Permission required: Access contents information
-
-    'isBrowserIdFromCookie()'
-
-      Returns true if browser id comes from a cookie.
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If there is no current browser id.
-
-    'isBrowserIdFromForm()'
-
-      Returns true if browser id comes from a form variable (query
-      string or post).
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If there is no current browser id.
-
-    'isBrowserIdNew()'
-
-      Returns true if browser id is 'new'.  A browser id is 'new'
-      when it is first created and the client has therefore not sent it
-      back to the server in any request.  
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If there is no current browser id.
-
-    'setBrowserIdCookieByForce(bid)'
-
-      Sets the browser id cookie to browser id 'bid' by force.
-      Useful when you need to 'chain' browser id cookies across domains
-      for the same user (perhaps temporarily using query strings).
-
-      Permission required: Access contents information
-
-      Raises:  BrowserIdManagerErr.  If the 'cookies' namespace isn't
-      a browser id namespace at the time of the call.
-
-  class 'SessionDataManagerErr'
-
-    Error raised during some session data manager operations, as
-    explained in the API documentation of the Session Data Manager.
-
-    This exception may be caught in PythonScripts.  A successful
-    import of the exception for PythonScript use would need to be::
-
-       from Products.Sessions import SessionDataManagerErr
-
-  class 'SessionDataManagerInterface'
-
-    Zope Session Data Manager interface.
-
-    A Zope Session Data Manager is responsible for maintaining Session
-    Data Objects, and for servicing requests from application code
-    related to Session Data Objects.  It also communicates with a Browser
-    Id Manager to provide information about browser ids.
-
-    'getBrowserIdManager()'
-
-      Returns the nearest acquirable browser id manager.
-
-      Raises SessionDataManagerErr if no browser id manager can be found.
-
-      Permission required: Access session data
-
-    'getSessionData(create=1)'
-
-      Returns a Session Data Object associated with the current
-      browser id.  If there is no current browser id, and create is true,
-      returns a new Session Data Object.  If there is no current
-      browser id and create is false, returns None.
-
-      Permission required: Access session data
-
-    'getSessionDataByKey(key)'
-
-      Returns a Session Data Object associated with 'key'.  If there is
-      no Session Data Object associated with 'key' return None.
-
-      Permission required: Access arbitrary user session data
-
-    'hasSessionData()'
-
-      Returns true if a Session Data Object associated with the
-      current browser id is found in the Session Data Container.  Does
-      not create a Session Data Object if one does not exist.
-
-      Permission required: Access session data
-
-module 'SimpleItem'
-
-  class 'Item(Traversable)'
-
-    A common base class for simple, non-container objects which can be
-    contained within ObjectManagers.  Items provide all the methods of
-    Traversable.Traversable.  In addition, Items have these instance
-    attributes:
-
-      'meta_type' --  A short name for the type of the object.
-
-        This is the name that shows up in product add list for the
-        object and is used when filtering objects by type.
-
-        This attribute is provided by the object's class and should
-
-        not be changed directly.
-
-      'title' -- The title of the object.
-
-        This is an optional one-line string description of the object.
-
-      'REQUEST' -- The current web request.
-
-        This object is acquired and should not be set.
-	It is an instance of HTTPRequest.HTTPRequest.
-
-    'getId()'
-
-      Returns the object's id.
-
-      The 'id' is the unique name of the object within its parent
-      object manager. This should be a string, and can contain
-      letters, digits, underscores, dashes, commas, and spaces.
-
-      This method replaces direct access to the 'id' attribute.
-
-      Permission -- Always available
-
-    'manage_afterAdd(item, container)'
-
-      Hook called after a new instance is added to an ObjectManager.
-      In this base class it's a no-op.
-
-      *item* is the item being deleted, *container* is the ObjectManager.
-    
-      Permission -- restricted Python only
-
-    'manage_beforeDelete(item, container)'
-
-      Hook called before an instance is removed from an
-      ObjectManager. In this base class it's a no-op.
-
-      *item* is the item being deleted, *container* is the ObjectManager.
-
-      Permission -- restricted Python only
-    
-    'manage_afterClone(item)'
-
-      Hook called when an object is copied.
-      In this base class it's a no-op.
-        
-      *item* is the original item.
-
-      Permission -- restricted Python only
-
-    'manage_workspace()'
-
-      This is the web method that is called when a user selects an
-      item in a object manager contents view or in the Zope
-      Management navigation view.
-
-      Permission -- 'View management screens'
-
-    'this()'
-
-      Return the object itself.
-
-      This turns out to be handy in two situations. First, it
-      provides a way to refer to an object in DTML expressions.
-
-      The second use for this is rather deep. It provides a way to
-      acquire an object without getting the full context that it was
-      acquired from.  This is useful, for example, in cases where
-      you are in a method of a non-item subobject of an item and you
-      need to get the item outside of the context of the subobject.
-
-      Permission -- Always available
-
-
-    'title_or_id()'
-
-      Utility that returns the title if it is not blank and the id
-      otherwise.
-
-      Permission -- Always available
-
-    'title_and_id()'
-
-      Utility that returns the title if it is not blank and the id
-      otherwise.  If the title is not blank, then the id is included
-      in parens.
-
-      Permission -- Always available
-
-
-  class 'SimpleItem(Item, ...)'
-
-    XXX should I list all base classes?
-
-    Mix-in class combining the most common set of basic mix-ins
-    for persistent Zope objects.
-
-    SimpleItem has all the same attributes and methods as Item,
-    but inherits from some other mix-in classes to provide
-    additional functionality, namely acquisition, persistence,
-    and role management.
-
-
-
-module 'TransienceInterfaces'
-
-  Transient Objects
-
-  class 'MaxTransientObjectsExceeded'
-
-    An exception importable from the Products.Transience.Transience module
-    which is raised when an attempt is made to add an item to a
-    TransientObjectContainer that is 'full'.
-
-    This exception may be caught in PythonScripts through a normal import.
-    A successful import of the exception can be achieved via::
-
-      from Products.Transience import MaxTransientObjectsExceeded
-
-  class 'TransientObject'
-
-    A transient object is a temporary object contained in a transient
-    object container.
-
-    Most of the time you'll simply treat a transient object as a
-    dictionary. You can use Python sub-item notation::
-
-      SESSION['foo']=1
-      foo=SESSION['foo']
-      del SESSION['foo']
-
-    When using a transient object from Python-based Scripts or DTML
-    (XXX and zpt?)  you can use the 'get', 'set', and 'delete' methods
-    instead::
-
-      XXX test this
-      SESSION.set('foo', 1)
-      foo = SESSION.get('foo')
-      SESSION.delete('foo')
-
-    Methods of transient objects are not protected by security
-    assertions.
-
-    It's necessary to reassign mutuable sub-items when you change
-    them. For example::
-
-      l=SESSION['myList']
-      l.append('spam')
-      SESSION['myList']=l
-
-    This is necessary in order to save your changes.  Note that this caveat
-    is true even for mutable subitems which inherit from the
-    Persistence.Persistent class.
-
-    'clear()'
-
-      Remove all key/value pairs.
-
-      Permission -- Always available
-
-    'delete(k)'
-
-      Call __delitem__ with key k. # XXX ugh, explain it for python noobs!
-
-      Permission -- Always available
-
-    'get(k, default=marker)'
-
-      Return value associated with key k.  If k does not exist and default
-      is not marker, return default, else raise KeyError.
-
-      Permission -- Always available
-
-    'getContainerKey()'
-
-      Returns the key under which the object is "filed" in its container.
-      getContainerKey will often return a differnt value than the value
-      returned by getId.
-
-      Permission -- Always available
-
-    'getCreated()'
-
-      Return the time the transient object was created in integer
-      seconds-since-the-epoch form.
-
-      Permission -- Always available
-
-    'getId()'
-
-      Returns a meaningful unique id for the object.
-
-      Permission -- Always available
-
-    'getLastAccessed()'
-
-      Return the time the transient object was last accessed in
-      integer seconds-since-the-epoch form.
-
-      Permission -- Always available
-
-    'has_key(k)'
-
-      Return true if item referenced by key k exists.
-
-      Permission -- Always available
-
-    'invalidate()'
-
-      Invalidate (expire) the transient object.
-
-      Causes the transient object container's "before destruct" method
-      related to this object to be called as a side effect.
-
-      Permission -- Always available
-
-    'items()'
-
-      Return sequence of (key, value) elements.
-
-      Permission -- Always available
-
-    'keys()'
-
-      Return sequence of key elements.
-
-      Permission -- Always available
-
-    'set(k, v)'
-
-      Call __setitem__ with key k, value v.
-
-      Permission -- Always available
-
-    'setLastAccessed()'
-
-      Cause the last accessed time to be set to now.
-
-      Permission -- Always available
-
-    'update(d)'
-
-      Merge dictionary d into ourselves.
-
-      Permission -- Always available
-
-    'values()'
-
-      Return sequence of value elements.
-
-      Permission -- Always available
-
-  class 'TransientObjectContainer'
-
-    TransientObjectContainers hold transient objects, most often,
-    session data.
-
-    You will rarely have to script a transient object
-    container. You'll almost always deal with a TransientObject
-    itself which you'll usually get as 'REQUEST.SESSION'.
-
-      % Anonymous User - Dec. 31, 2003 11:27 am:
-       but help! sometimes you might want to script one. How should you create a transient object container from
-       within a script?
-
-    'get(k, default=None)'
-
-      Return value associated with key k.  If value associated with k does
-      not exist, return default.
-
-      Permission -- 'Access Transient Objects'
-
-    'getAddNotificationTarget()'
-
-      Returns the current 'after add' function, or None.
-
-      Permission -- 'View management screens'
-
-    'getDelNotificationTarget()'
-
-      Returns the current 'before destruction' function, or None.
-
-      Permission -- 'View management screens'
-
-    'getId()'
-
-      Returns a meaningful unique id for the object.
-
-      Permission -- Always available
-
-    'getTimeoutMinutes()'
-
-      Return the number of minutes allowed for subobject inactivity
-      before expiration.
-
-      Permission -- 'View management screens'
-
-    'has_key(k)'
-
-      Return true if container has value associated with key k, else
-      return false.
-
-      Permission -- 'Access Transient Objects'
-
-    'new(k)'
-
-      Creates a new subobject of the type supported by this container
-      with key "k" and returns it.
-
-      If an object already exists in the container with key "k", a
-      KeyError is raised.
-
-      "k" must be a string, else a TypeError is raised.
-
-      If the container is 'full', a MaxTransientObjectsExceeded will
-      be raised.
-
-      Permission -- 'Create Transient Objects'
-
-    'new_or_existing(k)'
-
-      If an object already exists in the container with key "k", it
-      is returned.
-
-      Otherwiser, create a new subobject of the type supported by this
-      container with key "k" and return it.
-
-      "k" must be a string, else a TypeError is raised.
-
-      If the container is 'full', a MaxTransientObjectsExceeded exception
-      be raised.
-
-      Permission -- 'Create Transient Objects'
-
-    'setAddNotificationTarget(f)'
-
-      Cause the 'after add' function to be 'f'.
-
-      If 'f' is not callable and is a string, treat it as a Zope path to
-      a callable function.
-
-      'after add' functions need accept a single argument: 'item', which
-      is the item being added to the container.
-
-      Permission -- 'Manage Transient Object Container'
-
-    'setDelNotificationTarget(f)'
-
-      Cause the 'before destruction' function to be 'f'.
-
-      If 'f' is not callable and is a string, treat it as a Zope path to
-      a callable function.
-
-      'before destruction' functions need accept a single argument: 'item',
-      which is the item being destroyed.
-
-      Permission -- 'Manage Transient Object Container'
-
-    'setTimeoutMinutes(timeout_mins)'
-
-      Set the number of minutes of inactivity allowable for subobjects
-      before they expire.
-
-      Permission -- 'Manage Transient Object Container'
-
-
-module 'Traversable'
-
-  Traversable objects.
-
-  class 'Traversable'
-
-    This class is a mix-in for traversable objects.  Most persistent
-    Zope objects are Traversable (usually indirectly, via Item or
-    SimpleItem).
-
-    'absolute_url(relative=0)'
-
-      Return the absolute URL of the object.
-
-      This is a canonical URL based on the object's physical
-      containment path and the current virtual hosting configuration,
-      if any.  The result can be reliably used by external agents,
-      such as a browser, to address the object.
-
-      If the 'relative' argument is provided, with a true value, then
-      the value of virtual_url_path() is returned. This usage
-      is being deprecated in favor of virtual_url_path().
-
-      Some Products incorrectly use '/'+absolute_url(1) as an
-      absolute-path reference (see RFC 2396).  This breaks in 
-      "inside-out" virtual hosting situations, as described in
-      the VirtualHostMonster documentation.
-      Use absolute_url_path() for this purpose instead. 
-
-      Some Products also use absolute_url(1) to identify
-      objects for retrieval via (un)restrictedTraverse().
-      This usage too is incorrect, as (un)restrictedTraverse()
-      may not understand the virtual hosting portion of the path.
-      Use getPhysicalPath() instead.
-
-      Permission -- Always available
-
-
-    'absolute_url_path()'
-
-      Return the path portion of the absolute URL of the object.
-
-      This includes the leading slash, and can be used as an
-      'absolute-path reference' as defined in RFC 2396.
-      It is safe for user agents in all virtual hosting 
-      configurations.  
-
-      Should not be used with (un)restrictedTraverse().
-
-      Permission -- Always available
-
-
-    'getPhysicalPath()'
-
-      Returns a path (an immutable sequence of strings)
-      that can be used to access this object again
-      later, for example in a copy/paste operation.  
-      getPhysicalRoot() and getPhysicalPath() are designed to operate 
-      together.  Also works reliably with (un)restrictedTraverse().
-
-      Permission -- Always available
-
-    'getPhysicalRoot()'
-
-      Returns the top-level Zope Application object.
-
-      Permission -- restricted Python only
-
-    'restrictedTraverse(path, default=_marker)'
-
-      Like unrestrictedTraverse, but performs security checks as each
-      object along the path is encountered.
-   
-      Permission -- Always available
-
-    'unrestrictedTraverse(path, default=_marker, restricted=0)'
-      
-      Lookup an object by path.
-        
-      *path* -- The path to the object. May be a sequence of strings
-      or a slash-separated string. If the path begins with an empty
-      path element (i.e., an empty string or a slash) then the lookup
-      is performed from the application root. Otherwise, the lookup is
-      relative to self. Two dots (..) as a path element indicates an
-      upward traversal to the acquisition parent.  
-        
-      *default* -- If provided, this is the value returned if the path cannot
-      be traversed for any reason (i.e., no object exists at that path or
-      the object is inaccessible).
-        
-      *restricted* -- If false (default) then no security checking is
-      performed. If true, then all of the objects along the path are
-      validated with the security machinery. Usually invoked using
-      restrictedTraverse().
-
-      Permission -- restricted Python only
-
-    'virtual_url_path()'
-
-      Return a URL for the object, relative to the site root.
-
-      If a virtual host is configured, the URL is a path relative to
-      the virtual host's root object.  Otherwise, it is the physical
-      path.  In either case, the URL does not begin with a slash.
-
-      Permission -- Always available
-
-module 'User'
-
-  class 'BasicUser'
-
-    This abstract class represents an interface that needs to be
-    supported by objects that are returned by user validation and used
-    for access control.  
-
-    For example, the user objects returned by SecurityManager.getUser().
-
-    'getDomains()'
-
-      Return the list of domain restrictions for a user.
-
-      Permission -- Always available
-
-    'getId()'
-
-      Get the ID of the user. The ID can be used, at least from
-      restricted Python, to get the user from the user's UserFolder.
-
-      Permission -- Always available
-
-    'getRoles()'
-
-      Return the list of roles assigned to a user.
-
-      Permission -- Always available
-
-
-    'getRolesInContext(object)'
-
-      Return the list of roles assigned to the user, including local
-      roles assigned in context of the passed in object.
-
-      Permission -- Always available
-
-    'getUserName()'
-
-      Return the name of a user
-
-      Permission -- Always available
-
-    'has_permission(permission, object)'
-
-      Return true if the user has *permission* on *object*.
-
-      Permission -- Always available
-
-    'has_role(roles, object=None)'
-
-      Return true if the user has at least one role from the given
-      list of *roles*, optionally in the context of *object*.
-
-      Permission -- Always available
-
-  class 'UserFolder'
-
-    User Folder objects are containers for user objects. Programmers
-    can work with collections of user objects using the API shared by
-    User Folder implementations.
-
-    'maxlistusers'
-
-      The number of users in the folder above which Role assignment
-      presents a search dialog. Default is 250. (integer)
-
-    'encrypt_passwords'
-
-      If the encrypt_passwords attribute is True, all additions and
-      edits of users in the folder will encrypt the password before
-      saving to the database. (boolean)
-
-    'getUser(name)'
-      
-      Return the named user object or None.
-
-      Permission -- Manage users
-
-    'getUsers()'
-
-      Returns a sequence of all user objects which reside in the user
-      folder.
-
-      Permission -- Manage users
-
-    'getUserNames()'
-
-      Returns a sequence of names of the users which reside in the user
-      folder.
-
-      Permission -- Manage users
-
-    'userFolderAddUser(name, password, roles, domains, **kw)'
-
-      API method for creating a new user object. Note that not all
-      user folder implementations support dynamic creation of user
-      objects. Implementations that do not support dynamic creation
-      of user objects will raise NotImplementedError for this method.
-
-      Arguments:
-
-      *name* -- The name of the new user object (string).
-
-      *password* -- The name of the new user object (string).
-
-      *roles* -- The roles assigned to the new user object. (tuple or list)
-
-      *domains* -- Optionally allows you to restrict the Internet domains 
-       from which the user can log in. (tuple or list) 
-
-      *kw* -- This argument allows for implementations to accept additional
-       parameters. It is not used in the default implementation. 
-
-      Permission -- Manage users
-
-    'userFolderEditUser(name, password, roles, domains, **kw)'
-
-      API method for changing user object attributes. Note that not
-      all user folder implementations support changing of user object
-      attributes. Implementations that do not support changing of user
-      object attributes will raise NotImplementedError for this method.
-
-      Arguments:
-
-      *name* -- The name of the new user object (string).
-
-      *password* -- The name of the new user object (string).
-
-      *roles* -- The roles assigned to the new user object. (tuple or list)
-
-      *domains* -- Optionally allows you to restrict the Internet domains 
-       from which the user can log in. (tuple or list) 
-
-      *kw* -- This argument allows for implementations to accept additional
-       parameters. It is not used in the default implementation. 
-
-      Permission -- Manage users
-
-    'userFolderDelUsers(names)'
-
-      API method for deleting one or more user objects. Note that not
-      all user folder implementations support deletion of user objects.
-      Implementations that do not support deletion of user objects
-      will raise NotImplementedError for this method.
-
-      Arguments:
-
-      *names* -- The names of the user objects to delete (tuple or list).
-
-      Permission -- Manage users
-
-module 'Vocabulary'
-
-  class 'Vocabulary'
-
-    A Vocabulary manages words and language rules for text indexing.
-    Text indexing is done by the ZCatalog and other third party
-    Products.
-
-    'insert(word)'
-
-      Insert a word in the Vocabulary.
-
-    'query(pattern)'
-
-      Query Vocabulary for words matching pattern.
-
-    'words()'
-
-      Return list of words.
-
-    ObjectManager Factory
-
-      'manage_addVocabulary(id, title, globbing=None, REQUEST=None)'
-
-        Add a Vocabulary object to an ObjectManager.
-
-module 'ZCatalog'
-
-  class 'ZCatalog'
-
-    ZCatalog object
-
-    A ZCatalog contains arbitrary index like references to Zope
-    objects.  ZCatalog's can index either 'Field' values of object,
-    'Text' values, or 'KeyWord' values:
-
-    ZCatalogs have three types of
-    indexes:
-
-      Text -- Text indexes index textual content.  The index can be
-      used to search for objects containing certain words.
-
-      Field -- Field indexes index atomic values.  The index can be
-      used to search for objects that have certain properties.
-
-      Keyword -- Keyword indexes index sequences of values.  The index
-      can be used to search for objects that match one or more of the
-      search terms.
-
-      XXX there are more types now!!!
-
-    The ZCatalog can maintain a table of extra data about cataloged
-    objects.  This information can be used on search result pages to
-    show information about a search result.
-
-    The meta-data table schema is used to build the schema for
-    ZCatalog Result objects.  The objects have the same attributes
-    as the column of the meta-data table.
-
-    ZCatalog does not store references to the objects themselves, but
-    rather to a unique identifier that defines how to get to the
-    object.  In Zope, this unique identifier is the object's relative
-    path to the ZCatalog (since two Zope objects cannot have the same 
-    URL, this is an excellent unique qualifier in Zope).
-
-    '__call__(REQUEST=None, **kw)'
-
-      Search the catalog, the same way as 'searchResults'.
-
-    'catalog_object(obj, uid)'
-
-      Catalogs the object 'obj' with the unique identifier 'uid'.
-
-    'getobject(rid, REQUEST=None)'
-
-      Return a cataloged object given a 'data_record_id_'
-
-        % Anonymous User - June 2, 2004 8:56 pm:
-         What about getObject()
-
-    'getpath(rid)'
-
-      Return the path to a cataloged object given a
-      'data_record_id_'
-
-    'index_objects()'
-
-      Returns a sequence of actual index objects.
-
-    'indexes()'
-
-      Returns a sequence of names that correspond to indexes.
-
-    'schema()'
-
-      Returns a sequence of names that correspond to columns in the
-      meta-data table.
-
-    'searchResults(REQUEST=None, **kw)'
-
-      Search the catalog.  Search terms can be passed in the REQUEST
-      or as keyword arguments.
-
-      Search queries consist of a mapping of index names to search
-      parameters.  You can either pass a mapping to searchResults as
-      the variable 'REQUEST' or you can use index names and search
-      parameters as keyword arguments to the method, in other words::
-
-        searchResults(title='Elvis Exposed',
-                      author='The Great Elvonso')
-
-      is the same as::
-
-        searchResults({'title' : 'Elvis Exposed',
-                       'author' : 'The Great Elvonso'})
-
-
-      In these examples, 'title' and 'author' are indexes.  This
-      query will return any objects that have the title *Elvis
-      Exposed* AND also are authored by *The Great Elvonso*.  Terms
-      that are passed as keys and values in a searchResults() call
-      are implicitly ANDed together. To OR two search results, call
-      searchResults() twice and add concatenate the results like this::
-
-        results = ( searchResults(title='Elvis Exposed') +
-                    searchResults(author='The Great Elvonso') )
-
-      This will return all objects that have the specified title OR
-      the specified author.
-
-      There are some special index names you can pass to change the
-      behavior of the search query:
-
-        sort_on -- This parameters specifies which index to sort the
-        results on.
-
-        sort_order -- You can specify 'reverse' or 'descending'.
-        Default behavior is to sort ascending.
-
-      There are some rules to consider when querying this method:
-
-          - an empty query mapping (or a bogus REQUEST) returns all
-            items in the
-          catalog.
-
-          - results from a query involving only field/keyword
-            indexes, e.g.  {'id':'foo'} and no 'sort_on' will be
-            returned unsorted.
-
-          - results from a complex query involving a field/keyword
-            index *and* a text index,
-            e.g. {'id':'foo','PrincipiaSearchSource':'bar'} and no
-            'sort_on' will be returned unsorted.
-
-          - results from a simple text index query
-            e.g.{'PrincipiaSearchSource':'foo'} will be returned
-            sorted in descending order by 'score'.  A text index
-            cannot beused as a 'sort_on' parameter, and attempting
-            to do so will raise an error.
-
-      Depending on the type of index you are querying, you may be
-      able to provide more advanced search parameters that can
-      specify range searches or wildcards.  These features are
-      documented in The Zope Book.
-
-    'uncatalog_object(uid)'
-
-      Uncatalogs the object with the unique identifier 'uid'.
-
-    'uniqueValuesFor(name)'
-
-      returns the unique values for a given FieldIndex named 'name'.
-
-    ObjectManager Factory
-
-      'manage_addZCatalog(id, title, vocab_id=None)'
-
-        Add a ZCatalog object.
-
-        'vocab_id' is the name of a Vocabulary object this catalog should
-        use.  A value of None will cause the Catalog to create its own
-        private vocabulary.
-
-module 'ZSQLMethod'
-
-  class 'ZSQLMethod'
-
-    ZSQLMethods abstract SQL code in Zope.
-
-    SQL Methods behave like methods of the folders they are
-    accessed in.  In particular, they can be used from other
-    methods, like Documents, ExternalMethods, and even other SQL
-    Methods.
-
-    Database methods support the Searchable Object Interface.
-    Search interface wizards can be used to build user
-    interfaces to them.  They can be used in joins and
-    unions. They provide meta-data about their input parameters
-    and result data.
-
-    For more information, see the searchable-object interface
-    specification.  XXX where is that??
-
-    Database methods support URL traversal to access and invoke
-    methods on individual record objects. For example, suppose you
-    had an 'employees' database method that took a single argument
-    'employee_id'.  Suppose that employees had a 'service_record'
-    method (defined in a record class or acquired from a
-    folder). The 'service_record' method could be accessed with a
-    URL like::
-
-       employees/employee_id/1234/service_record
-
-    Search results are returned as Record objects.  The schema of
-    a Record objects matches the schema of the table queried in
-    the search.
-
-    'manage_edit(title, connection_id, arguments, template)'
-
-      Change database method properties.
-
-      The 'connection_id' argument is the id of a database
-      connection that resides in the current folder or in a folder
-      above the current folder.  The database should understand SQL.
-
-      The 'arguments' argument is a string containing an arguments
-      specification, as would be given in the SQL method creation
-      form.
-
-      The 'template' argument is a string containing the source for
-      the SQL Template.
-
-    '__call__(REQUEST=None, **kw)'
-
-      Call the ZSQLMethod.
-
-      The arguments to the method should be passed via keyword
-      arguments, or in a single mapping object. If no arguments are
-      given, and if the method was invoked through the Web, then the
-      method will try to acquire and use the Web REQUEST object as
-      the argument mapping.
-
-      The returned value is a sequence of record objects.
-
-    ObjectManager Factory
-
-      'manage_addZSQLMethod(id, title, connection_id, arguments, template)'
-
-        Add an SQL Method to an ObjectManager.
-
-        The 'connection_id' argument is the id of a database connection
-        that resides in the current folder or in a folder above the
-        current folder.  The database should understand SQL.
-
-        The 'arguments' argument is a string containing an arguments
-        specification, as would be given in the SQL method cration form.
-
-        The 'template' argument is a string containing the source for the
-        SQL Template.
-
-module 'ZTUtils'
-
-  ZTUtils: Page Template Utilities
-
-    The classes in this module are available from Page Templates.
-
-  class 'Batch'
-
-    Batch - a section of a large sequence.
-
-    You can use batches to break up large sequences (such as search
-    results) over several pages.
-
-    Batches provide Page Templates with similar functions as those
-    built-in to '<dtml-in>'.
-
-    You can access elements of a batch just as you access elements of
-    a list. For example::
-
-      >>> b=Batch(range(100), 10)
-      >>> b[5]
-      4
-      >>> b[10]
-      IndexError: list index out of range
-
-    Batches have these public attributes:
-
-    start -- The first element number (counting from 1).
-
-    first -- The first element index (counting from 0). Note that this
-    is that same as start - 1.
-
-    end -- The last element number (counting from 1).
-
-    orphan -- The desired minimum batch size. This controls how
-    sequences are split into batches. If a batch smaller than the
-    orphan size would occur, then no split is performed, and a batch
-    larger than the batch size results.
-
-    overlap -- The number of elements that overlap between batches.
-
-    length -- The actual length of the batch. Note that this can be
-    different than size due to orphan settings.
-
-    size -- The desired size. Note that this can be different than the
-    actual length of the batch due to orphan settings.
-
-    previous -- The previous batch or None if this is the first batch.
-
-    next -- The next batch or None if this is the last batch.
-
-    '__init__(sequence, size, start=0, end=0, orphan=0, overlap=0)'
-
-      Creates a new batch given a sequence and a desired batch
-          size.
-
-          sequence -- The full sequence.
-
-          size -- The desired batch size.
-
-          start -- The index of the start of the batch (counting from 0).
-
-          end -- The index of the end of the batch (counting from  0).
-
-          orphan -- The desired minimum batch size. This controls how
-          sequences are split into batches. If a batch smaller than the
-          orphan size would occur, then no split is performed, and a
-          batch larger than the batch size results.
-
-          overlap -- The number of elements that overlap between
-          batches.
-
-
-module 'math'
-
-  math: Python 'math' module
-
-    The 'math' module provides trigonometric and other math
-    functions. 
-
-    This module is documented in the standard Python library
-    documentation.  Make sure to consult the documentation
-    for your Python version, since Zope requires very specific 
-    versions of Python; e.g.  Zope 2.7 requires Python 2.3. 
-
-    See Also
-
-      "Python 'math' module":http://www.python.org/doc/current/lib/module-math.html
-      documentation at Python.org
-
-
-module 'random'
-
-  random: Python 'random' module
-
-    The 'random' module provides pseudo-random number functions. With
-    it, you can generate random numbers and select random elements from
-    sequences. 
-
-    This module is documented in the standard Python library
-    documentation.  Make sure to consult the documentation
-    for your Python version, since Zope requires very specific 
-    versions of Python; e.g.  Zope 2.7 requires Python 2.3. 
-
-
-    See Also
-
-      "Python 'random' module":http://www.python.org/doc/current/lib/module-random.html
-      documentation at Python.org
-
-
-module 'sequence'
-
-  sequence: Sequence sorting module
-
-    This module provides a 'sort' function for use with DTML, Page
-    Templates, and Python-based Scripts.
-
-  function 'sort(seq, sort, _=None, mapping=0)'
-
-    Sort the sequence *seq* of objects by the optional sort schema
-       *sort*.  
-
-    *sort* is a sequence of tuples '(key, func, direction)'
-       that describe the sort order.
-
-       key -- Attribute of the object to be sorted. If callable,
-       it will be called.
-
-       func -- Defines the compare function (optional).  Allowed values:
-
-         "cmp" -- Standard Python comparison function
-
-         "nocase" -- Case-insensitive comparison
-
-         "strcoll" or "locale" -- Locale-aware string comparison
-
-         "strcoll_nocase" or "locale_nocase" -- Locale-aware
-         case-insensitive string comparison
-
-         other -- A specified, user-defined comparison function, should
-         return 1, 0, -1.
-
-         direction -- defines the sort direction for the key (optional).
-         (allowed values: "asc", "desc")
-
-    The *_* argument is an optional namespace in which to look up sort
-    functions.
-
-    *mapping* is an optional boolean argument that toggles whether to treat
-    the sequunce as a sequence of dictionaries (off by default).
-
-       DTML Examples
-
-         Sort child object (using the 'objectValues' method) by id (using
-         the 'getId' method), ignoring case::
-
-           <dtml-in expr="_.sequence.sort(objectValues(),
-                                          (('getId', 'nocase'),))">
-             <dtml-var getId> <br>
-           </dtml-in>
-
-         Sort child objects by title (ignoring case) and date (from newest
-         to oldest)::
-
-           <dtml-in expr="_.sequence.sort(objectValues(),
-                                          (('title', 'nocase'),
-                                           ('bobobase_modification_time',
-                                           'cmp', 'desc')
-                                          ))">
-             <dtml-var title> <dtml-var bobobase_modification_time> <br>
-           </dtml-in>
-
-
-       Page Template Examples
-
-         You can use the 'sequence.sort' function in Python expressions
-         to sort objects. Here's an example that mirrors the DTML example
-         above::
-
-           <table tal:define="objects here/objectValues;
-                              sort_on python:(('title', 'nocase', 'asc'),
-                                              ('bobobase_modification_time', 'cmp', 'desc'));
-                              sorted_objects python:sequence.sort(objects, sort_on)">
-             <tr tal:repeat="item sorted_objects">
-               <td tal:content="item/title">title</td>
-               <td tal:content="item/bobobase_modification_time">
-                 modification date</td>  
-             </tr>
-           </table>
-
-         This example iterates over a sorted list of objects, drawing a
-         table row for each object. The objects are sorted by title and
-         modification time.
-
-
-       See Also
-
-         "Python cmp function":http://www.python.org/doc/lib/built-in-funcs.html
-
-module 'standard'
-
-  Products.PythonScripts.standard: Utility functions and classes
-
-    The functions and classes in this module are available from
-    Python-based scripts, DTML, and Page Templates.
-
-    Example of accessing a function from a Script (Python):
-
-      from Products.PythonScripts import standard
-      return standard.structured_text('this is some *italic text*')
-
-    Example of accessing a function from ZPT::
-
-      <p tal:define="t_c python:modules['Products'].PythonScripts.standard.thousands_commas"
-     tal:content="python:t_c(123456789)"> formatted number goes here </p>
- 
-
-     or (slightly better)
-
-      <p tal:define="t_c nocall:modules/Products/PythonScripts/standard/thousands_commas"
-     tal:content="python:t_c(123456789)"> formatted number goes here </p>
- 
-
-
-  class 'DTML'
-
-    DTML - temporary, security-restricted DTML objects
-
-    '__init__(source, **kw)'
-
-      Create a DTML object with source text and keyword
-      variables. The source text defines the DTML source
-      content. The optinal keyword arguments define variables.
-
-    'call(client=None, REQUEST={}, **kw)'
-
-      Render the DTML.
-
-      To accomplish its task, DTML often needs to resolve various
-      names into objects.  For example, when the code <dtml-var
-      spam> is executed, the DTML engine tries to resolve the
-      name 'spam'.
-
-      In order to resolve names, you must be pass a namespace to the
-      DTML.  This can be done several ways:
-
-      * By passing a 'client' object - If the argument 'client' is
-        passed, then names are looked up as attributes on the
-        argument.
-
-      * By passing a 'REQUEST' mapping - If the argument 'REQUEST'
-        is passed, then names are looked up as items on the
-        argument.  If the object is not a mapping, an TypeError
-        will be raised when a name lookup is attempted.
-
-      * By passing keyword arguments -- names and their values can
-        be passed as keyword arguments to the Method.
-
-      The namespace given to a DTML object is the composite of these
-      three methods.  You can pass any number of them or none at
-      all. Names will be looked up first in the keyword argument,
-      next in the client and finally in the mapping.
-
-
-  function 'dollars_and_cents(number)'
-
-    Show a numeric value as a string with a dollar symbol and two 
-    decimal places.
-   
-
-  function 'html_quote(s)'
-
-    Convert characters that have special meaning in HTML to HTML
-    character entities.
-
-    See Also
-
-      "Python 'cgi' module":http://www.python.org/doc/lib/module-cgi.html
-      'escape' function.
-
-  function 'newline_to_br(s)'
-
-    Convert newlines and carriage-return and newline combinations to
-    break tags.
-
-  function 'restructured_text(s)'
-
-    Convert a string in reStructuredText format to HTML.
-
-    See Also
-
-      "reStructuredText documentation":http://docutils.sourceforge.net/rst.html
-
-
-  function 'sql_quote(s)'
-
-    Convert single quotes to pairs of single quotes. This is needed to
-    safely include values in Standard Query Language (SQL) strings.
-
-  attribute 'special_formats'
-
-    A mapping of format names to functions in this module.
-    For example, 'structured-text' maps to structured_text().
-
-
-  function 'structured_text(s)'
-
-    Convert a string in structured-text format to HTML.
-
-    See Also
-
-      "Structured-Text Rules":http://dev.zope.org/Members/jim/StructuredTextWiki/StructuredTextNGRules
-
-  function 'thousands_commas(number)'
-
-    Insert commas every three digits to the left of a decimal point in
-    values containing numbers.  For example, the value, "12000
-    widgets" becomes "12,000 widgets".
-
-
-  function 'urlencode(query)'
-
-    Convert a mapping object or a sequence of two-element tuples to a 
-    "url-encoded" query string.
-
-    See Also
-
-       "Python 'urllib' module":http://www.python.org/doc/current/lib/module-urllib.html
-       'urlencode' function.
-
-
-
-
-  function 'url_quote(s)'
-
-    Convert characters that have special meaning in URLS to HTML
-    character entities using decimal values.
-
-    See Also
-
-       "Python 'urllib' module":http://www.python.org/doc/current/lib/module-urllib.html
-       'url_quote' function.
-
-
-  function 'url_quote_plus(s)'
-
-    Like url_quote but also replace blank space characters with
-    '+'. This is needed for building query strings in some cases.
-
-    See Also
-
-      "Python 'urllib' module":http://www.python.org/doc/current/lib/module-urllib.html
-      'url_quote_plus' function.
-
-
-  function 'url_unquote(s)' 
-
-    Convert HTML character entities in strings
-    back to their real values.
-
-    See Also
-
-      "Python 'urllib' module":http://www.python.org/doc/current/lib/module-urllib.html
-      'url_unquote' function.
-
-
-  function 'url_unquote_plus(s)'
-
-     Like url_unquote, but also replace '+' characters with spaces.
-
-    See Also
-
-      "Python 'urllib' module":http://www.python.org/doc/current/lib/module-urllib.html
-      'url_unquote_plus' function.
-
-
-  function 'whole_dollars(number)'
-
-    Show a numeric (int or float) value with a dollar symbol. 
-
-
-
-module 'string'
-
-  string: Python 'string' module
-
-    The 'string' module provides string manipulation, conversion, and
-    searching functions. It is a standard Python module. 
-
-    This module is provided for backwards compatibility, but since
-    Python 2.0, it has become increasingly common to use the
-    equivalent methods of string objects instead. These methods are
-    listed in the Python standard library reference.
-
-    This module is documented in the standard Python library
-    documentation.  Make sure to consult the documentation
-    for your Python version, since Zope requires very specific 
-    versions of Python; e.g.  Zope 2.7 requires Python 2.3. 
-
-    See Also
-
-      "Python 'string' methods":http://docs.python.org/lib/string-methods.html
-      documentation at Python.org
-
-      "Python 'string' module":http://www.python.org/doc/current/lib/module-string.html
-      documentation at Python.org

Modified: zope2book/trunk/TODO.txt
===================================================================
--- zope2book/trunk/TODO.txt	2009-02-16 21:13:59 UTC (rev 96607)
+++ zope2book/trunk/TODO.txt	2009-02-16 21:30:29 UTC (rev 96608)
@@ -29,3 +29,9 @@
 - This uses ../Figures/zopearchitecture.gif which still includes ZClasses and
   should replace the `Products` naming with a more general packages.
 
+AppendixB.rst
+=============
+
+- This was the manually maintained API documentation. Horribly outdated and
+  with all the formatting impossible to convert from stx in an automated way.
+

Added: zope2book/trunk/source/AppendixB.rst
===================================================================
--- zope2book/trunk/source/AppendixB.rst	                        (rev 0)
+++ zope2book/trunk/source/AppendixB.rst	2009-02-16 21:30:29 UTC (rev 96608)
@@ -0,0 +1,27 @@
+Appendix B: API Reference
+#########################
+
+Introduction
+============
+
+This reference describes the interfaces to the most common set of basic Zope
+objects. This reference is useful while writing Page Templates, DTML, Python
+scripts, and Product code.
+
+The intended audience is able to read simple Python code and has at least
+passing experience with object-oriented programming.
+
+The reference is not a tutorial. Nor is it a substitute for reading the rest of
+the Zope Book. Examples, where they are provided, are intended to be
+illustrative, but not comprehensive.
+
+Sorry
+=====
+
+The manually maintained API reference wasn't such a good idea.
+
+Converting it from the original source of structured text to reStructuredText
+was too much work to be done. We will look into auto-generating the API
+documentation from docstrings at some point.
+
+Reading the code is your best bet for now.


Property changes on: zope2book/trunk/source/AppendixB.rst
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: zope2book/trunk/source/index.rst
===================================================================
--- zope2book/trunk/source/index.rst	2009-02-16 21:13:59 UTC (rev 96607)
+++ zope2book/trunk/source/index.rst	2009-02-16 21:30:29 UTC (rev 96608)
@@ -35,6 +35,7 @@
    ZEO.rst
    MaintainingZope.rst
    AppendixA.rst
+   AppendixB.rst
    AppendixD.rst
    AppendixE.rst
    Contributions.rst



More information about the Checkins mailing list