Zope Changes

  This file contains change information for the current Zope release.
  Change information for previous versions of Zope can be found in the
  file HISTORY.txt.

  For information on future releases, see ROADMAP.txt.

  Some future release (Zope X3 3.1.0)

    New features

      - A handler attribute is now used in subscriber directives for
        event subscribers that don't create objects, which is the case
        for most subscribers.  Using the factory attribute without a
        provides attribute to register a handler is deprecated.
         

      - It is no longer necessary to supply a for attribute in adapter
        directives if the factory declares the interfaces or classes that it
        adapts.

      - It is no longer necessary to specify a provides attribute in
        an adapter or utility directive if the factory/component
        implements/provides a single interface.

      - Added `zope.security.canAccess` and `zope.security.canWrite`
        convenience methods.  Often code wants to check if a certain option is 
        open to a user before presenting it.  If the code relies on a certain
        permission, the Zope 3 goal of keeping knowledge of security  
        assertions out of the code and only in configuration is broken. 
        Instead, ask if the current intreaction canAccess or canWrite some 
        pertinent aspect of the object.  canAccess is used for both read 
        access on an attribute and call access to methods.

      - Added lazy properties. (See zope/cachedescriptors/README.txt)

      - Added new `getNextUtility()`, `queryNextUtility()`, and
        `testingNextUtility()` functions to make it easier to find and test
        for utilities in higher-up sites. These mimic their service-based
        equivalents.

      - Added an API for declaring interfaces adapted by classes

      - Added a simplified Python API for registering global utilities
        and adapters.

      - Added initial indexing and cataloging support

      - Added an integer-id facility for assigning integer identifiers
        to objects.  In Zope 2, this functionality is internal to
        catalogs. By separating id management out, multiple catalogs
        and indexing structures can share the same id scheme, allowing
        cross-catalog joins and other sorts of aggregated analyses.

      - Added `getInfo(generation)` method to `zope.app.generations`'s
        `ISchemaManager`. It will return some information about the evolver
        that brings the database to the specified generation. This way we can
        document the various evolutions. The standard `ISchemaManager`
        implementation uses the `evolve()` function's docstring to determine
        the information string. Added a view showing the information strings
        via the Web UI.

      - Implemented local permission. This is not really that interesting
        right now, since we do not support TTW development yet, but it will
        become important somewhen.

      - Page templates now allow metal:define-macro and
        metal:use-macro in the same tag.  This allows a macro to
        extend another macro, which is particularly useful for writing
        a skin that customizes another skin.

      - Added pagelet concept. Pagelets are responsible for a piece 
        of content in a view. They can be used to render additionaly 
        provided information into a pagetemplate.

        + Added tales expression 'pagelet'

        + Added tales expression 'pagelets'

        + Added tales expression 'pagedata'
        
      - Added pagelet chooser for store pagelet name in the annotation
        of a object.

      - Allow the <widget> subdirective to be used without specifying
        a "class" attribute.  This allows overriding some attributes
        for the default widget implementation without having to
        specify the widget class itself.

      - Added a "debug" command to zopectl.  This loads the Zope
        configuration and provides an interactive Python session in
        which a `zope.app.debug.debug.Debugger` instance has been
        provided as "debugger".  This allows exercising Zope under the
        debugger using the same appserver configuration that the
        server process uses.  The servers themselves are not started.

      - Created a new granting UI that allows advanced searching of
        principal sources.

      - Implemented the `zope:localService` directive, so that you can use it
        instead of the `zope:content` directive, which we had to use
        before. The new directive automatically makes the service implement
        `ISimpleService`. I also changed all the local service declarations to
        use this new directive.

      - Implemented the `zope:localUtility` directive, so that you can use it
        instead of the `zope:content` directive, which we had to use
        before. The new directive automatically makes the utility implement
        `ILocalUtility` and `IAttributeAnnotatable`. I also changed all the
        local utility declarations to use this new directive.

        The directive now also makes sure that the class implements the
        `IPersistent` and `ILocation` interfaces; without those a class cannot
        be a local utility. This addresses issue 297.  

      - The `Attribute` and `Method` class of the `zope.interface` have now a
        new public `interface` attribute that stores the interface they are
        defined in.  

      - New Pluggable Authentication Service, which is similar in philosophy to
        the Zope 2 PAS.  One of the main reasons for this is to support 
        principal groups. The following features are available in the core:

        o Extraction Plugins: Basic HTTP Auth, Session

        o Challenger Plugins: Basic HTTP Auth, No Challenge if Authenticated,
          Form Challenger

        o Authentication Plugins: Persistent (ZODB), SQL-based (LDAP is also
          available, but needs to be separately be downloaded)
        
        o Principal Factory Plugins: Default factory

        o Principal Search Plugins: Persistent (ZODB), SQL-based

        o Group Folder: The group folder allows the developer to assign groups
          to principals.

        o Home Folder: This utility allows you assign a home folder to a
          principal.

      - Added "sources", which are like vocabularies except that they
        support very large collections of values that must be
        searched, rather than browsed.

      - Ported Zope Version Control

      - Added an option (-1) to the test runner to suppress doctest
        errors after the first within each doctest.

      - If the adapter factory returns `None` as adapter instance, the default
        is returned instead of `None`. For benefits and the discussions see
        http://mail.zope.org/pipermail/interface-dev/2004-September/000070.html

      - Added new API method `getAdapters(objects, provided)` to `zapi`. It
        will return all available adapters for this configuration. Note that
        every name will be only returned once.

      - When parsing a DSN, allow the host to be specified without a port.

      - Added `apidoc:rootModule` directive, so that third-party products can
        add their packages to the class browser documentation module.

      - Separated the trusted and untrusted behaviors of page
        templates in the application server.  File-system-based
        templates are trusted, and database-based templates are
        untrusted.

      - Implemented rdb:gadflyRoot directive.    

      - Schemas are now copied before they are appended to content type or
        instance. This should probably become a policy later.

      - Implemented ICacheable view's current_cache_url() method, so that a
        link to the cache utility can be provided.

      - Added ++debug++ traversal adapter that allows you to turn on debugging
        flags in request.debug.  Currently the following flags are defined:

        + "source" adds HTML comments to rendered page templates showing
           where each code snippet came from.

        + "tal" leaves TAL/METAL markup in rendered page templates allowing
          you to see how it was generated.

        + "errors" shows full tracebacks when a system error occurs.

        Try e.g. http://localhost:8080/++debug++source,tal/@@contents.html
        and view the source of the resulting page.

      - Added 'url' adapter for IPathAdapter. It provides quoting mechanisms
        to strings (and string-like objects) from within ZPT, e.g:

        tal:attributes="href string:login.html?nextURL=${request/URL/url:quote}
        
        Other functions available are quote_plus, unquote, unquote_plus.

      - Added basic cataloging functionality.

      - Added functions (zope.app.container.constraints.contains and
        zope.app.container.constraints.containers) that greatly simplify
        expressing containment constraints.

    Restructuring

      - Changed the test-counting mechanism for doctests.  Now a
        doctest count a test for every example that is preceeded by
        prose. (Although a doctest will never count less than 1 test.)

      - Removal of Services.

        + Converted Error Reporting Service to a utility. Added database
          evolution code to convert all service instances to utilities.

        + Converted Authentication Service to be a utility. Renamed PAS to
          PAU.

        + Converted Principal Annotation Service to be a utility. Added
          database evolution code to convert all service instances to
          utilities.
 

      - The `pluggableauth` package has been deprecated. The `pas` module
        provides a much more modular approach with many more capabilities.

      - Removed special `DomainRegistration` now that we have events for
        notification.

      - Removed special `RoleRegistration` now that we have events for
        notification. Also, renamed `PersistentRole` to `LocalRole`.

      - Refactored Registration component for local components
      
        + Deprecated the `activated()` and `deactivated()` method. It is now
          replaced with the 'IRegistrationActivatedEvent' and
          'IRegistrationDectivatedEvent', respectively.

        + Restructured registration framework to use direct references rather
          than paths.

      - Replaced NotFoundError uses with more specific and meaningful
        exceptions. Eventually, NotFoundError will be deprecated.

        - Publishing traversal components noew raise NotFound

        - Other traversal components raise TraversalError

        - getPrincipal of IAuthenticationService now raises
          PrincipalLookupError. 

      - Removed Browser Menu Service and implemented menus as subscriber
        adapters. Menu Item Types (in other words, menus) are now utilities
        that provide `IMenuItemType`. 

        + Completes http://dev.zope.org/Zope3/AdaptersForMenuItems. New
          features such as sub-menus, icons, disabled entries and so on were
          not well defined and should be reconsidered in a different proposal.

        + Backward-compatibility of the existing `browser` directives was
          ensured. 

        + If you have a directive that accepts a menu as attribute, it now
          needs to be a `MenuField`, so that it is correctly resolved to a menu
          interface.

        + The `browser:menu` directive has now an optional `interface`
          attribute that allows you to specify a particular menu interface
          instead of having the machinery create one for you.

        + The two API methods `getMenu()` and `getFirstItemOfMenu()` of the
          Browser Menu Service are now available as functions in 
          `zope.app.publisher.browser.menu` having identical semantics.

        + Added `order` attribute to the menu item that declares the item's
          relative position. In general the menu items are always sorted from
          most to least specific, which is determined by the order of the
          implemented interfaces of the object. If ambiguities still exists,
          the order and then the title of the menu item are taken account. 

      - Removed Presentation Serivce and implemented views as adapters. This
        mainly means that layers and skins became adapters. Here are some
        other points:
        
        + Completes http://dev.zope.org/Zope3/ImplementViewsAsAdapters.

        + Backward-compatibility of the Zope component API and the browser
          directives was ensured.

        + The `setPresentationSkin()` and `getPresentationSkin()` directives
          of `IRequest` objects were removed. They were not used anywhere but 
          testing anyways.

        + The default skin is now just an adapter from `IRequest` to
          `IDefaultSkin`. You have to use `adapter_service.lookup()`, since
          the returned component is a skin interface and not a factory.

        + The adapter service can now provide adapters from objects as well,
          like it was possible in the presentation service before.

        + Gave `browser:skin` and `browser:layer` directive a new attribute
          `interface`, which allows you to directly specify the skin's or
          layer's interface instead of autogenerating it.

        + Created function `applySkin(request, skin)`
          (`zope.app.publisher.browser`) that allows you to assign a new skin
          to a request. This effectively replaces the `setPresentationSkin()`
          method.

    Bug Fixes

      - Fixed issue #293 (SequenceWidget and CustomWidgetFactory).

      - TextWidgets set the value attribute to "value" when the field
        has a missing value set and was not required and when there
        was no input.

      - Fixed a bug in the adapter registry that would prevent `dict`-derived
        utilites from being retrieved correctly.

      - Resolved issue 304 (Slash involve dbname). We require now that all
        values in a DSN are properly URL-encoded, so that all values can
        contain any special character, except for the hostname and the port.

      - Fixed intid utility: Registration and unregistration of
        local utitlity services, context aware registration of nested 
        components that may provide their own intids utiltities.

      - Fixed browser:defaultView metaconfigure: for_ passes a GlobalObject
        and not a Token of GlobalObjects.

      - Changed negotiator import with "INegotiator" utility lookup in
        default global "TranslationDomain". This makes it possible to
        use local INegotiator utilities with the standard translation
        domain. 

      - contents.html no longer breaks when no IAdding is available.

      - Fixed the page that reports "system errors", errors that
        represent a failure of the system, rather than the user, to set
        the response status to 500.

      - NotFound pages and stattus codes are now returned only when
        something can't be found during publishing-path (e.g. URL)
        traversal. Traversal errors within application code are no
        longer treated as "Not Found" errors. 

      - Added missing modification events when add forms modified
        objects (assigned properties) after they were added.

      - Small but important fix to security map. It was not marking objects
        with modified permissions as changed, due to a missing assignment.

      - Contents/contents.pt didn't quote the values that were used in
        href:s, thus it couldn't function properly if the items contained
        certain characters.

      - If the content-type was text/*, HTTPResponse.write re-set the
        content-length header to the first chunk of data.

    Much thanks to everyone who contributed to this release:

      Jim Fulton, Fred Drake, Philipp von Weitershausen, Stephan Richter,
      Gustavo Niemeyer, Daniel Nouri, Volker Bachschneider, Roger Ineichen,
      Shane Hathaway, Bjorn Tillenius

      Note: If you are not listed and contributed, please add yourself. This
      note will be deleted before the release.

  ------------------------------------------------------------------

  Zope X3.0.0

    New Features

      - Improved using documentation files as tests. (Needed to test
        new security policy):

        Changed DocFileSuite:

        o If a package is passed, it must be passed as a keyword argument.
          (For now, a package can also be passed before passing any file
          names, but this generates a deprecation warning.)

        o File paths may contain '/'s as separators. These will be converted
          to native file separators at run time.

        o It is now possible to pass set-up and tear-down methods

        o It is now possible to pass a dictionary of initial global variables.

        o Error output is improved as is meta data used for verbose output.

    Restructuring

      - Implemented both, getCell and queryCell, for ISecurityMap. Also
        updated the interface.

      - Removed CacheName field and replaced it by a 'Cache Names' vocabulary
        and a Choice field.

      - Templated Pages are now called ZPT Pages.

      - The "layer" and "skin" ZCML directives were redundantly
        registered for both the zope and the browser namespace. They
        now only exist in the browser namespace; the "defaultSkin"
        directive was moved to the browser namespace.

      - Updating of all doc strings to ReStructuredText begun

    Bug fixes

      - Changed the security policy:

        o Fix a bug (actually a missfeature). It wasn't possible for
          local settings to override global (zcml) settings.

        o Changed the way role denies work.  A role deny simply
          prevents a principal from having a role.  A principal may
          still have access through other roles or through principal
          grants.  Role grants or denies never override principal
          grants or denies *even* if the role-based grants or denies
          are more local.

        o Implemented a caching scheme that provides huge performance
          benefits when the authenticated principal is defined in a
          local auth service, rather than a global one (zcml).

      - Fixed bug in TypeRegistry for
        zope.app.publisher.browser.globalbrowsermenuservice which allows
        passing classes instead of interfaces as well but has a missing import.

      - Assuming a "text/" content type for all files by default
        broke the edit form. "" is the default by now.

      - A monkey patch to cope with weakref problems in Python 2.3.3
        was removed, so Python 2.3.4 is required now.

      - utilities/runurl.py hadn't been updated to reflect recent
        changes in the debugging support.

      - Views for I18nFile/I18nImage now use contentType attribute instead
        of outdated getContentType method.

      - ZopeVersion now knows about Subversion.

      - Fixed issue 264.  Substituting a Unicode value containing
        non-ASCII text into a translated string caused a
        UnicodeDecodeError.

      - Fixed issue 228.

      - Fixed issue 248.  Path expressions in page templates that
        contain empty segments now cause an error to be raised when
        the expression is compiled rather than when it is evaluated.
        This has always been illegal according to the specification,
        and most often caused a runtime error before.  Template
        authors can now get an error up front, avoiding embarrasment
        when once an application is moved into production after
        insufficient testing.

      - Removed 'grants' module from zope.app.security.interfaces
        (ISecurityMap). It is (including implementation) available at
        zope.app.securitypolicy.interfaces.

      - Wrote tests for security map implementation.

      - Factory IDs have to be real IDs now, i.e. either a dotted
        name or a URI.

    Much thanks to everyone who contributed to this release:

      Jim Fulton, Marius Gedminas, Fred Drake, Philipp von Weitershausen,
      Stephan Richter, Dmitry Vasiliev, Scott Pascoe, Bjorn Tillenius,
      Eckart Hertzler, Roger Ineichen, Stuart Bishop, Viktorija Zaksiene

  ------------------------------------------------------------------

  Zope X3.0.0 Beta 1

    New features

      - Event handlers can now be implemented as regular Python
        functions.

      - Hit logging is now configurable in zope.conf.

    Bug fixes

      - Fixed so that a UnicodeDecodeError isn't produced when Internet
        Explorer requests a page containing non-ISO-8859-1 characters.

      - Fixed the TextWidget and TextAreaWidget, added convertion
        from string to unicode in the method _toFieldValue.

      - Location-event subscribers weren't notified when containing
        objects were moved, added, or removed.

      - Changed ILocation interface: __name__ is not required anymore
        and its default is None.

      - The request's PATH_INFO variable is a unicode string now, so that
        the error service doesn't bail out when unicode urls are used.

      - Made AbsoluteURL handle unicode names. __str__ and __call__ encode
        the name into UTF-8 and url quote it to convert the name to ASCII.
        Also added __unicode__ to get a unicode representation of the url.

      - Cut startup time in half

    Restructuring

      - New api for getting sublocations and adapters for containers
        and folders.

      - Implemented a sub-location event dispatcher do notify
        subscribers when containing objects are removed.

      - The event system was completely reimplemented:

        - Converted event subscribers to simple handlers implemented as
          simple Python functions.

        - Now all handlers are registered as subscription adapters using the
          subscriber directive (rather than event:subscribe).

        - No longer have IEvent.  There's no need for a common base
          interface.

        - No longer have event publication or subscription services.

      - We had an object hub service. The object hub service was responsible
        for:

        - Managing short ids for objects, useful for indexing

        - Keeping track of object locations.  This was important when the
          object hub was created, because it wasn't practical to use direct
          object references. No it is, so hub ids are no-longer useful for
          implementing location-independent object references.

        The object hub service is dead.

        In the future, there will be a utility for use by indexes, that
        maintains short ids for objects. Perhaps this will be an indexing id
        service.

        The index and catalog machinery depend heavily on a facility for
        assigning shot ids to objects, currently the hub.  Rather than trying
        to remove this dependency now, and ad it back later when we have an
        index-id utility, it makes more sense to just remove the index and
        catalog facilities for now.

        Later, when we create an index-id utility, we'll port the code, which
        will still be in the repository, back.

      - Turned the OnlineHelp service into an utility.

    Much thanks to everyone who contributed to this release:

      Jim Fulton, Marius Gedminas, Fred Drake, Philipp von Weitershausen,
      Stephan Richter, Dmitry Vasiliev, Scott Pascoe, Bjorn Tillenius,
      Eckart Hertzler, Roger Ineichen, Stuart Bishop

  ------------------------------------------------------------------

  Zope X3.0.0 Alpha 2

    New features

      - It is no longer necessary to pass context arguments to api
        functions to provide a place to look up services.

    Bug fixes

    Restructuring

    Much thanks to everyone who contributed to this release:

      Jim Fulton, Marius Gedminas, Fred Drake, Philipp von Weitershausen,
      Stephan Richter, Dmitry Vasiliev, Scott Pascoe, Bjorn Tillenius,
      Eckart Hertzler

  ------------------------------------------------------------------

  Zope X3.0.0 Alpha 1

    New features

    - Distribution, packaging an installation system.

    - It is now possible to use a sub-directive called 'browser:widget' inside
      'browser:addform' and 'browser:editform' to specify custom widgets and
      customized properties of widgets for certain fields. Therefore it should
      not be necessary anymore to create custom edit and add view classes just
      to create custom widgets using 'CustomWidgetFactory'.

    - Until now, only a checkbox widget was available for boolean fields. This
      situation has changed, as we now also have BooleanRadioWidget,
      BoolenSelectWidget, and BoolenDropdownWidget.

    - A new vocabulary called Object Interfaces extracts the provided
      interfaces of its context and provides them as the term of the
      vocabulary. The vocabulary is named "Object Interfaces".

    - Developed Utility Vocabulary that provides a vocabulary for a particular
      utility. The constructor of the vocabulary expects a string or interface
      that expresses the interface provided by the utility.

    - Implemented 'registrations()' method for all adapter, utility and
      presentation services. This method is particularly aimed for people
      building informational GUIs and documentation. Examples of its use are
      in the 'apidoc' package.

      The change was motivated by the desirable removal of the
      'getRegisteredMatching()' method, which has been done now.

    - 'Content-Type' header now updates with charset information if
      necessary.

    - Implemented ObservableAdapter and Observers registry for
      Instance-based subscriptions.

    - RuntimeInfo now has two new methods (getPreferredEncoding,
      getFileSystemEncoding) and return unicode strings there appropriate.

    - Removed usages. We do not need them. Instead the macroname is now
      available in TAL. The standard macros can now have aliases, so that you
      can provide different macro names and still use the same template.

    - The macro name is now available via 'macroname' (reserved name) in the
      TALES namespace.

    - Implemented type based message subscriptions
      (http://dev.zope.org/Zope3/InstanceAndTypeBasedSubscriptions)
      Removed IAddNotifiable, IRemoveNotifiable interfaces.

    - Hard restart and shutdown works now. A utility is used to do the work
      and is server specific. So if someone uses Twisted instead of
      zope.server they just need to provide their own implementation of the
      utility.

    - You can run Zope 3 using zdaemon now. Thanks to Chris McDonough for his
      help there. Just use 'make runners' and start with 'bin/zopectl start'.

    - http://dev.zope.org/Zope3/InstanceAndTypeBasedSubscriptions

      - Added ZCML to create subscription adapters by creating a new
        directive (subscriber).

    - Redesigned the undo functionality according to
      http://dev.zope.org/Zope3/SimplifyUndoModel. There are three types
      of undo now:

      o Undo/redo my last transaction (the "Undo!" button)

      o Undo one or more of my last transactions

      o Undo one or more of anybody's transactions

      By default, transactions are looked up by location and can
      optionally be looked up everywhere. Undo security is
      permission-driven now.

    - Implemented Tools

      o Implement the tool ZCML directive.

      o Register utility interface as 'IToolType'.

      o Implement tools overview.

      o Create back-links from utilities and services to the tools screens.

      o Implement tool management screen. We need an overview, add, delete,
        rename.

    - Write generic get/queryType(object, type) that returns the interface of
      the 'object' that provides 'type'.

    - Implemented Permission Redefinition portion of ZCMLEnhancements.

    - Implemented http://dev.zope.org/Zope3/MinimalDefaultViewDirectives
      'zope:defaultView' can no longer *define* a view. It also only accepts
      one "for" interface.

    - Implemented http://dev.zope.org/Zope3/Use303RedirectsByDefault
      Browsers which support HTTP/1.1 will now receive 303 redirects.

    - The ZCML zope:adapter and zope:view directives now support
      multiple for interfaces, thus defining multi-adapters and
      multi-views.

    - Added broken-object support.  If an object can't be loaded from
      the database because it's class has been removed or moved, then
      a placeholder "broken" object is loaded instead.  This allows
      containing objects to be loaded properly and provides diagnostic
      information needed to restore the missing class, if necessary.

    - Now use ZODB 3.3, rather than ZODB 4.  If your Data.fs file is
      in the ZODB 4 format, you need to convert it using the following
      command executed from the Zope3 directory::

        PYTHONPATH=src python2.3 src/ZODB/zodb4/main.py Data.fs

    - Removed source type service and replaced source types by source
      factories. Updated the vocabulary accordingly.

    - Import checker utility that can tell you which import statements in
      your Python files are unused.

    - New dependency finder utility for determining dependencies of Python
      packages and modules.

    - Renamed the "Common Tasks" box in the default skin to "Add:",
      since this is really just a list of things to be added.

    - Implemented 'apidoc' tool for online browsing of the Zope 3 framework
      API and configuration. The documentation can be accessed via a new
      namespace '++apidoc++'::

        http://localhost:8080/++apidoc++/

    - Added a stateful tree implementation, e.g. to produce static
      trees in page templates. It includes browser views that store the
      tree state in cookies, a browser layer that replaces the tree
      navigation with a cookie-based stateful tree and a skin using that
      layer based on Rotterdam.

    - Ported Zope 2's StructuredText implementation. It is available
      in the 'zope.structuredtext' module and used by apidoc and wiki
      (through renderer).

    - Copy/Move now checks constraints and preconditions, instead of just
      expecting the source's and target's class to be the same.

    - Added new switch '-P' to test.py, to allow profiling of
      tests. Profile data is saved into <zope3>/tests_profile.prof. All
      the additional switches and options apply. This is useful for
      running a profile on a single test (specially useful for
      functional tests) without having to do the whole profile setup.

    - Session support implemented and usable from Python code.

    - The factory directive and subdirective do not accept a permission
      attribute anymore, since all factories are publically available,
      i.e. all attributes/methods have the permission 'zope.Public'.

    - Traversing views and schema field widgets are no longer looked
      up by name but by a providing interface.

    Bug fixes

    - when adding content to a container, check the preconditions.

    - 'mail:queuedDelivery' and 'mail:directDelivery' directives have now
      "Mail" as a default name as the interface claims. Also, the
      'mail:smtpMailer' directive interface specifies now a port default of 25
      as it should be.

    - Content-Length header bug fixed. The problem was that while encoding
      an output data to output encoding data length can be changed, but
      headers were already sent.

    - Fixed issue 159. barryp sent in a patch concerning timezone handling in
      the HTTP server date utility.

    - Fixed issue 154. Page Template code entered TTW is now stored as
      unicode, which had no side effect whatsoever. We only had to allow in
      the general page template code for the source to be unicode.

    - Removed 'zope.app' and 'zope.component' dependency from
      'zope.publisher'. Now it only depends on 'zope.proxy' (eek, should also
      go), 'zope.interface', 'zope.exceptions' and 'zope.i18n'.

      Moved the 'zope.component'-specific code to zope.app.publisher. Updated
      all of Zope to catch up with these API changes.

    - Fixed issue 80. There were only a few very contained spots that made
      DTML non-unicode aware. Once I removed these spots, unicode input works
      like a charm. I converted all the tests to use unicode, so that
      everything is well-tested.

    - Fixed issue 140. The problem was that a 'FileUpload' object was created,
      even though no file was uploaded. On top of it the underlying
      'FieldStorage' object provided an empty filename and the data of the
      storage was '\r'. Fixed all this by not adding a 'FileUpload' object to
      the request's form when the filename is empty. Added explanatory comment.
      Added new functional tests for 'Image' objects to verify the correct
      behavior.

    - Fixed issue 119. Unicode-based names are handled correctly now.

    - Fixed issue 128. The TALES Iterator class is now up-to-date.

    - BTreeContainer's '__contains__()' and 'has_key()' methods return 'True'
      and 'False' now instead 0 or a positive integer. Added tests for
      BTreeContainer.

    - All IContainer objects are tree items now by default.

    - Fixed issue 126. HTML entities and elements are now correctly escaped
      when editing via the browser. The fix has been made in the browser
      widget code.

    - Fixed issue 195. The remove language buttons for I18n File and Image have
      now a value.

    - Removed last TAB characters from Python code.

    - The configuration machinery's resolve() method can now handle single
      ".", which refers to the current package. Therefore you can reference a
      module in ZCML simply by ".".

    - Fixed inline-code support for Windows.

    - Reimplemented 'getRegisteredMatching()' of the Presentation Service,
      since it was not functioning at all.

    - Fixed Utility Service 'getRegisteredMatching()' method.

    - Validation of object field fixed (zope.schema.Object). Validate only
      attributes of the schema that are implemented as fields.

    - Security-proxied adapter support for the form framework. It provides
      LocationProxies for all adapters which do not implement ILocation itself.

    Restructuring

    - Restructured widget base classes.

    - Changed widget title and description to label and hint, respectively.

    - Redid the way names input in add forms.

      See: http://dev.zope.org/Zope3/AddingNameControl

    - Removed __doc__ keyword argument from Field constructor. Moved __name__
      behind title and description. However, values should always be inserted
      as keywords, since a lot of mixins to the field base class do not honor
      the order.

    - All enumerated fields are gone. Instead there is now a 'Choice' field
      that can take a listing of values, vocabulary or vocabulary name as
      source for the choices. The Sequence field has been improved to cope
      better with Choice value types.

    - A new attribute 'unique' was added to sequence to require uniqueness of
      the values. This way all four container classes, set, bag, list and
      unique list can be expressed using only two fields.

    - All vocabulary widgets are gone. They were replaced by widgets that
      expect choice- or sequence-like fields and vocabularies. Convenience
      broker widgets are provided to provide simple views for the fields only.

    - Use new Utility Vocabulary is now used to provide fields for permissions
      and interfaces. This allowed us to get rid of PermissionField and
      InterfaceField and their associated widgets.

    - Moved stateful workflow interfaces and browser code to
      zope.app.workflow.stateful. This way we can distribute the workflow
      package without specific implementations or choose the implementations
      we want to distribute.

    - The workflow XML import/export functionality uses now a set of adapters
      instead of a complicated utility and custom registry structure.

    - Reimplemented the utility services using adapter registries.

    - Replaced the *used* names in schema.errornames to exceptions in
      schema.interfaces. Deprecated schema.errornames. The doc strings of the
      exceptions/errors is now used for user output. Eventually we should
      write custom views for all of them.

    - The application control has been cleanup to mostly use views and not do
      the adapter redirection. Only the runtime info control still uses an
      adapter, since its information might be otherwise useful.

    - Modernized File and Image (as well as their I18n equivalent) to use
      schemas. I also removed a lot of unnecessary methods in the objects and
      their views.

    - Removed session-specific mapping interfaces. The two that were not yet
      available in zope.interface.common.mapping were added there.

    - Reorganize software into a much flatter package structure.

      o Folded interfaces and browser back into packages. For example

        zope.app.foo
        zope.app.interfaces.foo
        zope.app.browser.foo

        became

        zope.app.foo
        zope.app.foo.interfaces
        zope.app.foo.browser

      o Moved packages from the following container packages to zope.app:

        zope.app.content
        zope.app.services
        zope.app.utilities

      o Created a bunch of new packages:

        dependable (formerly just a file-based module)
        exception (was scattered everywhere before)
        errorservice (contains error reporting service)
        module
        principalannotation (Principal Annotation Service)
        session
        site (contains 'folder' and 'service' from zope.app.services)
        utility (Utility service)
        ...

    - Converting Service-managed components to be utilities:

      o Removed workflow service. Process Definitions were already utilities,
        so this was particularly easy.

      o Various Code Interpreters were managed by a special service. They are
        now registered with the utility service.

      o DAV Schema. The interface representing the DAV schema is the
        utility. For it to work correctly, I gave all DAV schemas the
        interface type IDAVNamespace. This is also the interface through which
        the utilities are found in the utility service.

      o Language Negotiator. The language negotiator is now a utility instead
        of a service.

      o Converted MailService --> MailDelivery utility; also the Mailer is now
        a utility, instead of using its own registry.

      o Made Zope-specific Vocabulary Registry use utilities. The vocabulary
        directive now registers vocabulary factories as utilities.

      o Roles are now stored as utilities. While doing this, I also schemafied
        the IRole interface to use 'id', 'title', 'description' instead of
        'getId()', 'getTitle()' and 'getDescription()'. This was done for
        global and local roles. Local roles only have a valid 'id' if they are
        registered "active" and the id value is the registration name for the
        utility.

      o Permissions are now stored as utilities. As for roles, I schemafied
        the API to use 'id', 'title', and 'description'.

      o Interfaces are now registered and looked up as utilities. The local
        interface service, which *only* provided an interface browsing UI has
        been replaced by an interface-browsing view on site managers.

      o SQL database connections are now managed as named utilities.

      o The Translation Service has been removed. Instead we are using
        Translation Domain utilities to hold translations. Since the API would
        would have been a good bit more complex than before, a convenience
        function was added to 'zope.i18n'::

          translate(location, msgid, domain=None, mapping=None, context=None,
                    target_language=None, default=None):

      o The Factory Service was removed and factories became utilities. The
        'getFactoryInterfaces()' and 'createObject()' functions are still
        available via 'zope.app.zapi'. I also added the 'getFactoriesFor()'
        function to zapi, since it was only available from the service before.

      o Removed the Caching Service; Caches were already utilities, so it was
        easy to rip it out. Updated the views, so that the only example usage,
        the SQL Script, can make use of caches.

    - The IPrincipal now uses 'id', 'title' and 'description instead of
      'getId()', 'getTitle()', and 'getDescription()'. For
      backwards-compatiblity 'getTitle()' and 'getDescription()' are available
      with a deprecation warning.

    - Converted local Workflow Definitions from being registrable components
      to be local utilities. Therefore, **a lot** of boiler-plate registration
      code became obsolete and was removed. Using utilities is a huge
      improvement!

    - Rearranged the package hierarchy below zope.app.

      o Moved content types, including their interfaces and browser
        views, to their individual packages below zope.app.

      o Moved packages that were formerly in zope.products to zope.app.

      o ... more to come here ...

    - Moved the i18n message string extraction utility to the
      'utilities' directory

    - Moved placefulsetup to zope.app.site.tests.

    - Changed the way that adapters and views are registered:

      o Simplified adapter registries with a simpler, more general api
        and without factory semantics.

      o Updated the adapter and presentation service registration apis
        based on changes in the adapter registries.

      o The adapter service and presentation services no longer take
        sequences of factories.  ZCML directives are now responsible
        for supporting multiple factories (chained adapters) in the
        rare cases when they are used by computing composite
        factories.

    - http://dev.zope.org/Zope3/UnificationOfRequestsAndSecurityContextsThroughUse

      - Replaced security managers and security contexts with interactions
        and participations.

      - Requests are now participations, therefore request.user is renamed to
        request.principal.


    Miscellaneous

    - Keep Zope3 Wiki product up-to-date with API changes. Furthermore update
      code to implement "modern" patterns.

    - Gave many empty module doc strings a title. There are still many files
      without titles.

    - Added file headers (license) to Python and Python-C files. Still, not
      all files have one yet.

    - Gave many class and function doc strings some meaning, including some
      that just contained XXX statements. Many more files exist that have
      meaningless or incomplete doc strings.

    - Removed unused imports.

    - Removed the simple local authentication service
      zope.app.services.auth. It was deprecated for a while already.

    - Removed all fixup entries in zope/app/backward.zcml. backward.zcml was
      not included anywhere anyways, so that this should not pose a
      problem. Removed all fixup code as well.

    - Renamed __implements__ in zope.interface to __implemented__ to
      make Zope 3 code interoperate with Zope 2 code.

    Much thanks to everyone who contributed to this release:

      Jim Fulton, Marius Gedminas, Jeremy Hylton, Fred Drake, Sidnei da Silva,
      Philipp von Weitershausen, Steve Alexander, Andreas Jung, Anthony
      Baxter, Kevin Littlejohn, Stuart Bishop, Christian Theune, Adam Summers,
      Stephan Richter, Chris McDonough, Garrett Smith, Roger Ineichen, Gary
      Poster, Martijn Faassen, Dominik Huber, Bjorn Tillenius, Nathan Yergler,
      Dmitry Vasiliev, Michael Bernstein, Eckart Hertzler, Suresh Babu Eddala

  ------------------------------------------------------------------


  Zope X3.0.0 Milestone 4

    What is Zope X3? It's Zope 3 "experimental". This is the release
    that will provide the new features of Zope 3 without any Zope 2
    support. Zope 3.0 will provide support for Zope 2 content and
    products, probably using conversion utilities of some sort.


    Backward compatibility notes

    - If you have any add-on products that used the old context-wrapper or
      "context awareness" APIs, you will need to update them to use the new,
      and much simpler, location API. See zope/app/interfaces/location.py.

    - If you have add-on products that register views or resources using the
      view or resource directives from the zope ZCML namespace, you will need
      to change the value of the 'type' attribute to refer to a request type,
      rather than a presentation type.

    - If you have an add-on product that defines new layers, you need to use
      the zope:layer or browser:layer directive to define the layer before you
      use it in a skin definition or a view or resource definition:

        <browser:layer name="rotterdam" />

    - If you had a local (through the web) adapter service, you will need to
      recreate it and reactivate your adapter registrations.

    - If you had a local (through the web) view service, you will need to
      create a local presentation service and reactivate your page or view
      registrations.

    Features

    - Changed the way presentation components are managed.

      o The view, resource, and skin services have been combined into a new
        presentation service.

      o Views and resources now adapt requests. They are registered for request
        types rather than presentation types.

    - Refactored the way interfaces, declarations and adapters are
      implemented. We now use a cleaner architecture that no-longer requires a
      caching mechanism beyond what's provided by the underlying data
      structures. This has led to a significant speed up for Zope 3.

    - Refactored the way location-related events are generated and handled.

      For more details, see:
      http://dev.zope.org/Zope3/LocationRelatedEvents
      http://dev.zope.org/Zope3/SimplifyObjectLifecycleAndLocationEvents

    - Refactored the way object location is modeled. Zope 3 no longer uses
      context wrappers. Instead, objects have __parent__ attributes that
      reference their containers.  Objects that don't maintain these
      attributes themselves are wrapped in persistent proxy objects that do
      so.

      For more details, see:
      http://dev.zope.org/Zope3/ParentGeddon

    - Added catalogs.  Catalogs can be used in two-ways:

      o Site-wide utilities

        A catalog is created in a site-management folder and
        registered as a named utility.

      o Local content objects.

        A catalog is added to a regular content folder.

    - Added object fields. Object fields provide a simple composite field
      mechanism. An object field is defined by a schema and, thus, can contain
      sub-fields.

    - Added working widgets for list fields. List fields contain a sequence of
      monogenous values.

    - Improved forms error reporting. Error messages now appear next to fields
      where errors occurred.

    - Major fixes to the TAL I18n-Namespace support. Almost all fixes were
      backported to Zope 2.7 as well.

    - ZPT Pages support for a <script> tag, that allows inline Python
      code. The <script> tag can be used in other TAL sources as well, but is
      turned off by default.

    - Internationalized all Zope 3 (Python, ZCML and Page Templates)
      user-readable strings. Zope 3 was then localized to German and partially
      to Spanish, Brazilian Portuguese and French.

    - Implemented explicit message ids in ZCML

    - New Persistent/Mutable Schemas allow us to generate Schema-based
      interfaces through the Web.

    - New local Menu Service and Content Component Definitions allow you to
      create simple Content objects TTW.

    - Major fssync improvements. The commands to use now are "zsync" and
      "zbundle". New flags include: copy, login (+ new options for checkout),
      logout, mkdir, resolve, revert. fssync behaves now very similar to SVN.

    - Introspector uses the Interface service now, instead of the ++module++
      namespace.

    - Refactoring and cleanup of the schema/form code.

    - Improvements to the OnlineHelp, which has been deactivated for this
      release since it is broken since the recent geddons.

    - ZODB 4: Changed serialization logic to support persistent proxies.
      Added an add() method to Connection and allowed it to run during
      commit().

    - In the future, Zope 3 will use ZODB 3, which will support new-style
      classes, since the development of ZODB 4 stopped in late summer.

    - Various improvements to ZConfig


    Miscellaneous

    - Progress with the TUV-IT security accreditation

    - Much maintenance work and bug fixes.


    Much thanks to everyone who contributed to this release:

      Jim Fulton, Christian Theune, Marius Gedminas, Tim Peters, Jeremy
      Hylton, Fred Drake, Sidnei da Silva, Philipp von Weitershausen, Steve
      Alexander, Guido van Rossum, Barry Warsaw, Albertas Agejevas, Viktorija
      Zaksiene, Andreas Jung, Anthony Baxter, Phillip Eby, Richard Jones, Tom
      Cameron, Kevin Littlejohn, Stuart Bishop, Andy Hird, Peter Simmons,
      Christian Theune, Adam Summers, Stephan Richter, Chris McDonough,
      Garrett Smith, Godefroid Chapelle, Paul Roe, Kiki Pruvot, Don Baarda,
      David Fregon, Rob Zaar, Jan Smith, Richard Volpato, Roger Ineichen, Gary
      Poster, Bjorn Tillenius, Martijn Faassen, Chris Withers, Paul Everitt,
      Dominik Huber

  ------------------------------------------------------------------


  Zope X3.0.0 Milestone 3

    - Major changes have been made to the way local components are
      registered in a first step toward simplifying local (through the
      web) component registration.

    - The interface framework has been refactored in major ways:

      * Object interfaces are declared differently.

      * Interface introspection and component registry lookup
        performance has been improved.

      * Interface are now inherited.

    - Added a framework for decorators, which are context wrappers
      that also ease integration with the Zope application framework.

    - Configuration of the application server using a ZConfig-syntax
      configuration file with a simple schema.  This replaces
      zserver.zcml.

    - New schema field types for vocabularies.  See
      schema/vocabularies.txt for detailed documentation.

    - Added low-level support in TALES for path expressions of the form
      'a/b:c', which work by finding an adapter named 'b' for the
      object named by 'a' and traversing the adapter with the name
      'c'.

      Also defined and registered an adapter named 'zope', that
      provides a number of handy functions. For example, to get an
      object's name, use::

         someobject/zope:name

      Many more utility functions will be added over time.

      We still need a way to define other adapters. The mechanism for
      doing so is still undecided.

   - Added zope.app.zapi module that collects common application
     functions and other objects. This is to simplify imports for
     application code.  To get at many common objects, you can simply
     import zapi and then access the functions through zapi::

        from zope.app import zapi

        ...

        adapter = zapi.getAdapter(x, IFoo)

   - Added a pluggable authentication service.  The service supports
     pluggable principal sources and authentication methods (through
     views on principal sources).

     Deprecated the simple auth service.

   - Initial implementation of file-system synchronization.  This
     allows:

     * Checking out objects from Zope to files in a local directory

     * Checking in Zope objects, with conflict resolution

     * Exporting objects

     * Importing objects

     (We need docs for this.)

   - Very preliminary local interface service

     The interface service will someday provide a tool for browsing
     and modifying all of the configurations for a interface (type).

     The initial version demonstrates browsing component configurations
     be showing you all views configured for an interface.

   - WebDAV:

     Added PROPFIND and MKCOL to DAV support. Also added
     IDAVSchemaService, to allow registering an adapter to be used for
     a given namespace on PROPFIND requests.



  ------------------------------------------------------------------

  Zope X3.0.0 Milestone 2

    What is Zope X3? It's Zope 3 "experimental". This is the release
    that will provide the new features of Zope 3 without any Zope 2
    support.   Zope 3.0 will provide support for Zope 2 content and
    products, probably using conversion utilities of some sort.
    This release is the second Zope 3 release. The goals of
    this release are to:

    - Provide a relatively firm foundation for Zope 3
      developers who want to start building Zope 3 products or to
      contribute to development.

    - Provide wider exposure of Zope 3.

    - Solicit input on features, current and missing.

    The first release was very slow.  This release is much less
    slow, but it's not fast.  We have mostly avoided
    optimization to keep the code as clean as possible. Optimization
    will be performed prior to the first beta release.

    This is STILL an EARLY release. There is very little organized
    documentation, although there are some tutorials
    (http://dev.zope.org/Zope3/ProgrammerTutorial) and lots of bits of
    documentation spread around the system.

    A lot of work has been done since the last release, including:

    - General UI improvements

    - Performance improvements (much more to come)

      This release is much less slow than the previous release.

    - Improvements to the through-the-web site management experience
      (There's still a lot more to do.)

    - Internationalization improvements

    - FTP Support

    - PUT support (Allowing editing with Mozilla/Netscape Composer and
                   Amaya).

    - Partial WebDAV support

    - A basic workflow system

    - Improvements to Zope 3 schemas and form generation

    - A functional testing framework

    - Virtual Hosting support

    - A Utility service

    - XML "interfaces" derived from XML Schema URIs.
      These marker interfaces can be used to control application
      of XML processing using the component architecture.

    - New search indexes

    - Views on exceptions.

    Much thanks to everyone who contributed to this release:

        Alan Runyan, Albertas Agejevas, Alexander Limi, Andreas Jung,
        Anthony Baxter, Axel Bringenberg, Barry Warsaw, Bruce Eckel,
        Christian Heimes, Christian Theune, Fred Drake, Gary Poster,
        Godefroid Chapelle, Gregoire Weber, Guido van Rossum, Jeremy
        Hylton, Jim Fulton, Marius Gedminas, Martijn Faassen, Michael
        Howitz, Nathan Yergler, Paul Winkler, Philipp von
        Weitershausen, Phillip Eby, R. David Murray, R. Sean Bowman,
        Sathya Rangaswami, Sidnei da Silva, Stephan Richter, Steve
        Alexander, Tim Peters, Tres Seaver, Ulrich Eck, Viktorija
        Zaksiene, Volker Bachschneider, and Mark McEahern


  ------------------------------------------------------------------

  Zope X3.0.0 Milestone 1 (formerly known as 3x.0.0 Alpha 1)

    This release was the first Zope 3 release. The goals of
    this release are to:

    - Provide a relatively firm foundation for Zope 3
      developers who want to start building Zope 3 products or to
      contribute to development.

    - Provide wider exposure of Zope 3.

    - Solicit input on features, current and missing.

    The alpha release *was* very slow. We have intentionally avoided
    optimization to keep the code as clean as possible. Optimization
    will be performed prior to the first beta release.

    Features

      - An initial management interface including folders and various
        content types such as files, images, DTML pages, ZPT pages,
        and SQL scripts.

        The initial user interface is a prototype. We welcome
        feedback, ideas, and even code!

      - A framework for configuring and installing file-system-based
        products.

      - An initial through-the-web configuration and development system based
        on services. Services are similar to CMF tools except that
        they are managed in service managers, rather than in folders.

        A number of predefined services will be included:

        - Simple authentication service (similar to Zope 2's
          original user folder).

        - Event service.

        - RDB Connection service. This is used to manage database
          connection objects used by SQL scripts.

        - Translation service, to manage software (as opposed to
          content) translation services.

        - Caching service.

        - Site error reporting service (like Zope 2's site error log)

        - Session service (uh, that nobody has tried to use yet :)

        - Role service

        - Adapter service

        - View services

        - Object Hub, which tracks object locations, allowing
          location-independent object references

        - A principal annotation (user data) service. Nobody has tried
          to use this yet. It passes it's tests.

        Through the web development will take place in packages, which
        can contain:

        - Persistent python modules (These might work now. Give em a
          try. :)

        - Templates

        - Component instances

        - Configuration objects

        Configuration objects are used to configure component
        instances and component factories and register with the
        appropriate services.

      - FTP support (not sure if this works)

      - XML-RPC support  (not sure if this works)


