CMF 1.3.3 (2003/10/26)

  Bug Fixes

    - Ensure that e-mail address to which we mail the user's password
      in 'registeredNotify' comes from the member, rather than the
      request (thanks to Yvo Schubbe for the report).

    - Restrict ability to search members to users who have the 'List
      portal members' permission (Collector #189).

CMF 1.3.2 (2003/09/05)

  Bug Fixes

    - Initialize class security correctly on ActionProviderBase
      (Collector #186).

    - Remove ownership from filesystem-based skin methods, which
      can't be trojaned, and therefore need not pay the performance
      penalty of ownership checking.

    - Skinnable: Fix __of__ method so that it does not remove previous
      acquisition wrappers, which leads to invalid UIDs in the catalog
      when indexing objects using methods acquired from "above" the CMF
      site.

    - Sort candiate selection list when adding a FilesystemTypeInfo
      or ScriptableTypeInfo object to the types tool.

    - Open filesystem-based skin methods as text files, to avoid
      platform-specific line-ending issues (Collector #185).

    - Correct security assertion on CMFDefault.Image's manage_afterAdd
      (Collector #141).

    - Ensure that the security attributes are reindexed on all
      subobjects too when a folderish object changes state in the
      workflow (Collector #115).

    - Backport fix of CMFCore/tests/test_FSImage.py to work with
      recent Zopes (> 2.6), which force HTTP headers to be strings.

    - Use return instead of raise in RegistrationTool.testPropertiesValidity
      if id is incorrect (Collector #48).

    - CookieCrumbler: Accept authentication on HEAD requests.
      Thanks to Brent Hendricks.

    - Correctly cleanup temporaries in CMFCore.MemberDataTool when
      wrapping a user object (Collector #136).

CMF 1.3.1 (2003/03/06)

  Bug Fixes

    - Fixed editSyInformationProperties in SyndicationTool to ensure
      that updateBase is saved as a DateTime instance.

CMF 1.3.1beta1 (2003/02/26)

  New Features

    - Implemented PUT and GET support to CMFCalendar.Event for
      editing via FTP/WebDAV (thanks to Sidnei da Silva).

  Bug Fixes

    - Fixed incorrect security declaration in File.py (Collector #91).

    - Remove over-helpful default argument values in
      'CMFDefault.DefaultDublinCoreImpl._editMetadata'.  Now, if
      called without a value for an argument, the method will not
      change that value.  Collector #10.

    - Remove workaround in CMFCore.utils for recognizing links in
      StructuredText:  STX in CMF content should now recognize exactly
      the same links as the underlying Zope.  Note that we *do* still
      provide a customized HTML class, to permit embedding images without
      generating the "whole" page.  Collector #6.

    - Remove bizarre, shadowing import of CMFCore.utils as 'utils'
      into package namespace of CMFDefault;  instead, import specific
      names from that package directly (thanks to Paul Winkler for
      pointing out the incongruity).

    - Fix (theoretical) bug in CMFCore.DirectoryView which allowed
      non-registered directories to slip through (UI didn't exercise it).

    - Merge Christian Theune's fix for funky default argument values on
      CMFCalendar.Event's constructor and edit methods (collector #76).

    - FSPageTemplates overwrote a user-generated 'Content-Type' header.
      We now check to make sure a Content-Type header is not already set
      before allowing a page template to set its own.

    - Fixed bugs around 'addActionProvider' in ActionsTool (Collector #42).

    - Fixed race condition in lazy initialization of filesystem-based skin
      methods;  the bug led to odd name errors on 'context' for
      FSPythonScripts (Collector #37).

    - Removed crufty 'isDesktop' stuff from 'folder_factories' and
      'folder_contents' methods.

    - Fixed HTML-invalidating call to 'filterCookie' in 'folder_contents'.

    - Fixed unclosed 'tr' element  in ZPT version of 'folder_edit_form'
      (Collector #57).

    - Fixed CalendarTool to use portal_type and not Type to search for
      events in the catalog (Collector #28, thanks to Heimo Laukkanen
      for the report).

    - Fixed a bug in CalendarTool where events were not showing on the
      last day of the month.

CMF 1.3 (2002/08/06)

  New Features

    - FSPageTemplates now autodetect XML if a document has the standard
      '&lt;?xml version="xx"?&gt;' at the top, setting the content_type to
      "text/xml" so that it is parsed and served as XML.

    - Added a 'Workflows' tab in the ZMI that displays the workflow
      state of the object.

    - Wired 'scrubHTML' check into default versions of 'document_edit'
      and 'newsitem_edit' skins (site managers who prefer to allow
      JavaScript in content can customize to remove the check).

    - Added utility methods for checking / scrubbing HTML content of
      unwanted tags:

      CMFDefault.utils:  scrubHTML, isHTMLSafe

      Known bad tags ('script', 'applet', 'embed', 'object'),
      attributes (starting with 'on'), and values (starting with
      'javascript:') cause 'scrubHTML' to raise an exception;  unknown
      tags are silently dropped.  'isHTMLSafe' returns true if
      'scrubHTML' would not raise an exception on the same text.

    - Exposed useful utility methods to scripting / skinning.

      CMFCore.utils:  getToolByName, cookString, tuplize, format_stx,
        keywordsplitter, normalize, expandpath, minimalpath

      CMFDefault.utils:  formatRFC822Headers, parseHeadersBody,
        semi_split, comma_split, seq_strip, tuplize, bodyfinder,
        html_headcheck.

    - Added two utility functions, 'isHTMLSafe' and 'scrubHTML', to
      CMFDefault utils;  these modules check for / remove undesirable
      tags from textual content.

    - Made public functions of 'CMFCore.utils' and 'CMFDefault.utils'
      available for scripting.

    - Allowed Portal Folders to be discussable.

    - Improved the ActionsTool so that permission checking for actions
      is done in the context of the object for all categories that start
      with 'object' or 'workflow', in the context of the folder for
      those that start with 'folder', and in the context of the portal
      otherwise. This is useful for admin-defined additional categories.

  Bug Fixes

    - Fixed Image and File so that they reindex on PUT.

    - Fixed WorkflowTool so that it doesn't pretend to workflow non-CMF
      objects (Collector #19).

    - Removed redundant block of code from CMFDefault/Link.py (Collector
      #18).

    - Fixed discussion tree display not to embed entire HTML document
      (Collector #17, thanks to Jeffrey Shell for the inspiration).

    - Fixed CookieCrumbler to emit "Basic" and not "basic" auth as per
      HTTP spec (Collector #14, thanks to Simon Eisenmann for the
      report). This fixes some WebDAV locking problems with (rightfully)
      picky clients, like ExternalEditor.

    - Made old ListCriterion instances forward-compatible across earlier
      addition of 'operator' field.

    - Defaulted CMFCore.MembershipTool's createMemberArea flag to true,
      to preserve existing behavior:  member area should be created by
      default on first login (Collector #5).

    - Hardened DefaultDublinCoreImpl's EffectiveDate() and
      ExpirationDate() methods to deal better with older / uninitialzed
      content.

    - Refactored content construction in the Types tool to make
      cataloguing and workflow notification more uniform.

    - Made Undo work again by removing any LF in transaction ids.

    - Made WorkflowTool.updateRoleMappings update security-related
      indexes.

    - Append '/' to links in skin templates to the root of the site, to
      pacify clients which won't send Basic Auth tokens because the path
      doesn't match.

    - Removed the binding of Folder and Topic types to the default
      workflow for newly-created CMFSites (Collector #4).  Note that
      existing sites will still need to remove these bindings manually,
      as indicated in the "Upgrading" section of INSTALL.txt.

    - Updated initial action reported by CMFDefault's DefaultWorkflow:
      was "joined", now "created".

    - Fix 'index_html' template to filter using 'View' permission
      (folders which were not viewable were triggering authentication,
      instead of being skipped).

    - Repair free-form subject entry on 'full_metadata_edit_form' (was
      merging all keywords onto the same line, plus soft-wrapping!).
      Likewise the "Contributors" textarea.

    - Ensured that Link, File, and Image content objects reindex
      themselves after edit (wrapping 'edit' as a WorkflowMethod no
      longer guarantees that).

    - Fixed CMFCalendar's "day view" to accomodate the removal of
      'title' metadata from catalog in favor of 'Title' (thanks to
      Dieter Maurer for pointing this out).

    - Corrected a skins performance optimization (the version as
      released in the beta did not take effect).

CMF 1.3 beta2 (2002/07/07)

  New Features

    - Changed the modification date so that it is updated at reindex
      time and does not rely anymore on bobobase_modification_time. This
      makes export+import of objects not lose the modification date.
      Before exporting objects created with an older CMF version,
      reindex the "modified" index in the catalog (you just have to do
      it once, and only if you need to export objects).

    - Made the workflow tool compute chains using type names, as well
      as instances (Tracker #441).

    - Made the DCWorkflow worklists accept a list of formatted values
      for cataloged variable matches. The separator is a semicolon
      (Tracker #496).

    - Made the security-related indexes of the portal catalog be updated
      for all impacted objects whenever local roles are changed (Tracker
      #494). This feature makes use of the 'path' index.

    - Made 'path' (PathIndex) a standard index inside CMF. When
      upgrading from earlier versions this index will have to be created
      by hand.

    - Enabled "within day" queries for FriendlyDateCriteria E.g.,
      field="modified", value="Now", operation="within_day",
      daterange="old" -> content which was modified "today".
      (Tracker #474).

    - Made the id of the current user available to old action providers
      (DCWorkflow being a prime example) as 'user_id' (Tracker #495,
      thanks to Luca Olivetti for the patch).

    - Modified the 'standard_error_message' page template to show the
      'error_log_url', if passed in (Zope 2.6 will pass this argument
      if an error log is installed).

    - Extended the metadata tool to permit passing the type name
      directly (e.g., when building a new object, one might need to know
      the allowed subjects before construction).

    - Added a working calendar implementation to the CMFCalendar product,
      which had previously provided only an Event content type.  Thanks to
      Andy Dawkins for the work.

    - Updated FS-based skin methods to read optional '.security files,
      whcih control the role-permission mappings for each skin method.
      See CMFCore/tests/fake_skins/fake_skin/test4.py.security for an
      example.

  Bugs Fixed

    - Fixed PortalFolder's filtering so that it correctly restricts
      itself to the portal types allowed by the TypesTool (Tracker #483).

    - Fixed the TypesTool so that TypeInformation's Title is
      decorrelated from its Id (the old TypeInformation.Type() should
      not be used anymore). The Id is what gets put in the "portal_type"
      attribute of a content object, which one gets at using
      somecontent.getPortalTypeName(). The Title is returned by
      somecontent.Type(). "portal_type" is now indexed, and in most
      cases should be used when doing catalog queries instead of "Type".

    - Provided all default skins (content_hide_form, content_show_form)
      for the DCWorkflow default workflow [rev 2]. Note that, when using
      this workflow, the descriptions in the retract and reject forms
      are slightly incorrect as they mention the "private" state but in
      fact go to the "visible" state.

    - Fixed verification of portal types in the TypesTool to work in the
      presence of portal types with a non-empty title (Tracker #497).

    - Removed unintentional sharing of ActionInformation data between
      class defaults and persistent instances derived from
      ActionProviderBase.  Likewise for TypeInformation instances.

    - Enabled creation of "My Stuff" folder for users (e.g., the manager)
      authenticated "above" the normal user folder (Tracker #485, thanks
      to Dieter Maurer for the patch).

    - Fixed handling of discussion items so that they are correctly
      indexed, unindexed and reinserted into the workflows when copied
      or moved.

    - Correctly reindex the just-reset workflow variables of an object
      in a DCWorkflow after a paste.

    - Correctly insert into the workflows the objects created by a
      Scriptable Type.

    - Fixed Friendly Date Criterion edit form to correctly display the
      duration in its menu (Tracker #475, thanks to Axel Joester for the
      patch).

    - Fixed relative URL in metadata_edit_form that broke if the
      main_template had a base tag (Tracker #506).

    - Made discussion replies work correctly when hitting Enter in the
      title field (Tracker #515), and corrected discussion Preview
      followed by an Edit that lost body information (Tracker #516).

    - Fixed the deletion of replies (Tracker #513, thanks to Stefan H.
      Holek for the patch).

    - Made the Link objects deal correctly with empty remote urls
      (Tracker #507) and not strip trailing slashes (Tracker #451).

    - Made content_type_registry deal correctly with TypeInfos that have
      a title (Tracker #465, thanks to Juan Antonio Valio Garca for
      the patch).

    - Changed CMFDefault.MembershipTool to not create a member folder at
      member creation time when the memberareaCreationFlag is false
      (Tracker #519). Note that any code that depended on the member
      folder being created after addMember will fail, that code should
      call createMemberarea directly if needed.

    - Fixed CMFDefault.RegistrationTool to correctly check the lack of
      'email' property when creating a new member or when checking
      member's properties validity (Tracker #508).

    - Fixed addtoFavorites to correctly add a favorite of someone else's
      document (Tracker #501).

    - Fixed CatalogTool to create a meta_type index; this is needed now
      that ZCatalog doesn't create any default indexes when
      instantiated.

    - Fixed recent_news to use 'Title' instead of 'title' to display the
      title of each news ('title' isn't indexed anymore).

    - Fixed listFolderContents to take into account its optional 'spec'
      argument.

    - Fixed index_html to correctly filter out unauthorized subfolders
      (Tracker #503).

    - Fixed exception handling to not use a string exception in
      PortalFolder (Tracker #512).

    - Changed the permission protecting the "Join" action provided by
      the default registration tool from "View" to "Add portal member"
      (Tracker #509).

    - Removed redundant "Syndication" action from SkinnedFolder; the
      SyndicationTool provides this aciton. (Tracker #481)

    - Updated INSTALL.txt to note the dependency of CMF on the TAL and
      ZTUtils packages and on the PageTemplates product for Zopes < 2.5.
      (Tracker #489).

    - Updated CatalogTool to create a Vocabulary if none present (as
      won't be for catalogs created under Zope 2.6).

    - Adapted interface checks to work with new spellings in Zope 2.6
      (older Zopes should still work).

    - Removed '##bind' headers from FSPythonScripts where they only
      repeat the defaults.

    - Corrected patterns used for "HTML body stripping" to avoid
      HTML embedded within structured text.

    - Fixed computed action of form in 'folder_rename_form' (Tracker #511;
      thanks to "yuppie" for the patch).

    - Improved cacheability of skin images by using absolute URLs.

    - Suppressed repeated load of FSImage content from filesystem
      (should only happen when in debug mode).

    - Repaired skin methods' read of '.properties' files, which hold
      additional metadata about the skin method beyond what can be
      expressed in the body.

    - Updated caching policy manager tool to use correct date format
      (RFC 1123 instead of RFC 822).

CMF 1.3 beta 1 (2001/04/03)

 New Features

   - CMFDefault Documents, News Items and Discussion Items now support
     a 'plain' text format, which simply HTML-quote's the text before
     displaying it.

   - Added CachingPolicyManager tool, which manages caching policies
     for skin methods, and updated FSPageTemplate to use a CPM if
     found.

   - Added functionality such that only users who have the
     view permission on the relevent Type object can create
     content of that type.

   - Added the ability to limit what types of object an
     object of a given Portal Type can be created in.

     If 'Implicity Addable' is set (the default), then
     objects of that Type can be added anywhere.

     If it is not set, then objects of that Type can only be
     added to objects whose Type's allowed_content_types
     contains the Type.

   - Enabled querying actions from workflow tool in absence
     of actions tool (Tracker #401).

   - Added 'operator' attribute to CMFTopic.ListCriterion, to permit
     specifying an operator ('and', for the most part) for indexes which
     support it, e.g., KeywordIndex (Tracker #442).

   - Added ZMI interface for editing Link URL (Tracker #364).

 Bugs Fixed

   - Make ZMI editing of NewsItems safe (Tracker #472).

   - Made generated home pages for new members participate fully in
     workflow (Tracker #467).

   - Added 'text_format' wiget to NewsItem's edit forms (Tracker #460).

   - Fix sharing bug pointed out by Dieter Maurer (Tracker #484)
     in ActionProviderBase.  Thanks for the patch!

   - Added forwared-compatibility for "old" content (pre CMF 1.0!;
     Tracker #454, thanks to Lucas Hofman for the patch).

   - Made 'PortalFolder.invokeFactory' enforce the 'filter_content_types'
     property of the folder's type information object.

   - Added stripping of leading / trailing whitespace from
     Subject keywords (Tracker #479, thanks to Lucas Hofman
     for the patch!)

   - Gave URL tool explicit __roles__, to enable use in 'nocall:'
     expressions.

   - Turned off auto-expansion of customized FSPageTemplates
     (Tracker #477).

   - Fixed ActionProvidorBase for the case when no permission
     is specified for an action that is added TTW.

   - Fixed ActionsTool so that duplicate actions are stripped.

   - Caused CMFDefault Portal constructor to strip passed-in id
     before creating a portal object with that id.

   - Allowed the ActionsTool to gracefully handle objects
     which return ActionInformation objects. Thanks to
     Andy Dawkins for the analysis. (Tracker #457)

   - Made workflow Expressions use the correct ModuleImporter
     so that they operate correctly in their restricted
     environment. Thanks to Dieter Maurer for the patch.
     (Tracker 463)

   - Fixed incorrent permissions in "pending" state of default
     DCWorkflows. Thanks for Lynn Walton for the report and
     Florent Guillaume for the patch. (Tracker #464)

   - Fixed missing comma that affected manager permission to modify
     in the published state. Thanks to Florent Guillaume for the
     patch (Tracker #459)

   - html_quote'd errors raised by FSPageTemplates. Thanks to
     Dieter Maurer for the patch. (Tracker #462)

   - Fixed typo in zpt_stylesheet.css. Thanks to Florent Guillaume
     for the patch. (Tracker #461)

   - Fixed long standing bug in FSPythonScript where get_size returned
     the incorrect length. This broke editing using EMACS via FTP or
     WebDAV. Thanks to John Glavin at South River Technologies for
     help finding the bug.

   - Reworked functionality added in Tracker #409 which broke the
     Types Tool. (Tracker #458)

   - Fixed bug whereby DirectoryView instances were not noticing
     some of the changes they should when Zope was running in debug mode
     on Windows (Tracker #305)

   - Fixed a bug where the workflow notifyCreated method was called during
     manage_afterAdd in PortalContent, making it possible for the
     notification to occur on the wrong workflow.  The notification has
     moved to the contstructInstance method on the TypesTool after
     the _setPortalTypeName method has been called on the object.

   - Extended TypesTool to permit registration of new TypeInformation
     implementations (Tracker #409, thanks to Jeffrey Shell for the
     work!)

   - Fixed a bug in Favorites.getObject to use restrictedTraverse on the portal
     object.

   - Made all tool-generated actions configurable through-the-web,
     via an "Actions" tab on each tool;  made the list of ActionProviders
     configurable TTW as well.

   - Fixed setting the Link.format to URL_FORMAT so the initially returned
     metadata headers would return 'text/url' properly.  Added unittests.

   - Enabled querying actions from workflow tool in absence
     of actions tool (Tracker #401).

   - Fixed CMFDefault.utils.parseHeadersBody to properly handle the headers
     generated on a windows app (i.e. Dreamweaver) with /r/n; added the
     compiled regular expression object to the method signature.

   - Added full webdav sipport code to Link.py.  Changed _writeFromPUT to call
     _editMetadata instead of editMetadata.

   - Made links emitted by 'topic_view' play nice with virtual hosting
     (Tracker #433).

   - Cleaned up emission of RFC822-style headers (Tracker #407),
     terminating headers must be terminated with CRLF, and padding
     continuation lines (for values with embedded newlines) with
     leading whitespace).

   - Ensure that package initialization files are non-empty, to prevent
       suspicion that they were corrupted in download (Tracker #426).

   - Added external method update_catalogIndexes.py to run as part of a
     upgrade to CMFs migrating to Zope2.4+ from from CMF sites which were built
     using Zope2.3 catalog

   - Use ID to label Favorite when target has an empty Title (Tracker #440).

   - Allowed sub-folders to have different syndication properties
     than parents (Tracker #421).

   - Added 'CMFDefault.Upgrade.upgrade_decor_skins' external method to
     convert existing sites which had installed skin directories from the
     now-deprecated 'CMFDecor' product (Tracker #434).  Added note
     explaining the issue, and the workaround, to 'ISSUES.txt'.

   - Ensure that Favorites display the correct, absolute URL to their
     target, without needing to have <base> tag set (Tracker #419).

   - Worked around Opera's strange insistence on selecting an option,
     even for multi-select lists (Tracker #332).

   - Hardened CMFCore to initialize correctly in the absence of
     the PageTemplates product (Tracker #430).

   - Restored slot in <head> of ZPT main template into which content
     can insert the <base> tag (Tracker #418).

   - Fixed 'CMFTopic.SimpleIntegerCriterion.edit' to require a pair
     of values when 'direction' is 'min:max';  updated skins to use
     new 'getValueString', which renders such values properly
     (Tracker #439).

   - Ensured that Documents created with initial STX get cooked
     (Tracker #435).

   - Made links emitted by 'topic_view' play nice with virtual hosting
     (Tracker #433).

   - Made 'CMFCore/interfaces/__init__.py' non-empty, to remove suspicion
     that the file was corrupted in the download (Tracker #426).

CMF 1.2 beta (2001/12/07)

 New features

  - Added docs from the crack ZC docs guys; these docs live in
    the top-level 'docs' directory.

  - Merged CMFDecor product's artifacts into CMFCore /
    CMFDefault;  theses aretifacts allow use of filesystem-based
    Zope Page Templates as skins.

    Note that the CMFDecor skin is the one which will be
    receiving all our development focus:  we will fix bugs in the
    DTML skins, but are not likely to invest significant effort
    in upgrading it.

  - Hooked 'manage_addFolder' to allow creation of PortalFolders
    from both WebDAV, FTP, and ZMI.

  - Improved tracebacks from broken FSDTMLMethods, which no longer
    indicate that every problem is in RestrictedDTML.

  - Made it possible to add CookieCrumblers in nested folders.
    You can just drop in a cookie crumbler anywhere to change the
    login form for that area of the site.  In fact, now you don't
    have to create a user folder just to change the login
    process.

  - Made Link objects editable via FTP / WebDAV.

  - Merged Chris Withers' FSSQLMethod into CMFCore.

  - Added documentation for installing from CVS.

  - Moved permission checking inside personalize_form to make
    sure Anonymous cannot access it without logging in (CMF Tracker
    Issue 349, thanks go to Bill Anderson).

  - Added initial CMF use cases as FSSTXMethods in CMFDefault/help.

  - Made validation methods of 'portal_metadata' available to
    scripts.

  - Made skinned 'index_html' reflect generic view on folder
    content, rather than simple title/description of the portal.

  - Added "Change and View" submit button to content editing
    forms;  added check for this button to POST handlers in CMFDefault,
    and indirected redirect targets in those methods through
    'getActionByID'.

  - Added knob for skin cookie persistence to SkinsTool's
    "properties" tab.  The default policy (unchanged) is that
    skin cookies expire at the end of the browser session.  if
    Skin Cookie Persistence is checked the cookie will last a
    full yesr.

  - Added an API to the 'portal_actions' interface for querying,
    adding, and removing action providers.

  - Added a "multi-review" form, enabling a reviewer to publish
    or reject multiple items at once, using a common comment.

  - Added ZMI tab to DirectoryView to allow re-basing the
    filesystem path.

  - Added "breadcrumbs" to CMFDecor skins.

  - Added initial support for WebDAV locaking to PortalContent.

  - Added SortCriterion to list of criterion types for Topics,
    to permit sorting of results.

  - Added "Local Roles" action to folders to ease collaboration.

  - Add scarecrow assertions for the CMF-centric interfaces, and
    made the actual interfaces compatible with the standard
    Zope Interface package.

  - Made FSSTXMethod display skinnable, and added ZPT version.

  - Added 'visible' attribute to TypeInformation actions, to
    permit indirection (via 'getActionById') without exposing the
    action in the CMF UI.

  - Extended MetadataTool to allow adding / removing element specs
    (i.e., it can now manage policies for "custom" schemas, as
    well as Dublin Core).

 Bug fixes

  - Refactored content and metadata editing methods of
    DefaultDublinCoreImpl, Document, and NewsItem to disentangle
    the excessive coupling.  Each "path" for editing now has a
    "presentation"-level method, which directs traffic and
    reindexes the object;  the underlying methods are much
    simplified.

  - Fixed inner / named links in Document / News Item (thanks to
    Kenichi Sato for the patch!)

  - Ensured that editing methods handle WebDAV locks correctly,
    using a new 'failIfLocked' assertion.

  - Added cookString method to CMFCore.utils for taking a string
    and making it id friendly, it also does a string.lower on the
    resultant regex.  Changed TypesTool to utilize cookString to
    ensure that action ids are properly formated if the name is
    being used as the id.

  - Added 'getReply' to CMFDefault.DiscussionItem.DiscussionItemContainer,
    to permit access to an individual reply without needing to
    do traversal.

  - Corrected pass-through of 'file' and 'seatbelt' arguments in
    new 'CMFDefault.Document.edit' method;  also sync'ed ZMI edit
    method for documents with standard protocol (Tracker #417).

  - Added cookString method to CMFCore.utils for taking a string and
    making it id friendly, it also does a string.lower on the resultant
    regex.

  - Made examples in INSTALL.txt less terse, and added notes on
    Windows-specific issues (thanks to Johan Mukhsein for the
    suggestions).

  - Made error message generated by FSPropertiesObject capture the
    offending line and line #;  also, added logic to allow blank
    lines and comment lines beginning with '#' (tracker #338).

  - Added fixup to Link objects for user-entered URLs which don't
    supply scheme:  for example, fix up 'www.zope.com' to
    'http://www.zope.com'.  (tracker #361)

  - Updated CMFCore.CatalogTool to allow new, optional 'idxs'
    argument to 'catalog_object' (tracker #405).

  - Added a workaround for the problem where the CookieCrumber
    set cookies even though the user entered an incorrect password.
    RESPONSE.unauthorized() now cancels the cookie response
    header.  The new login_form and logged_in form both try to
    invoke unauthorized(), so make sure you install the new
    forms.

  - Implement the notional 'search results item' interface for
    SkinnedFolder.

  - Corrected solecism in Topic (use of 'criteria' for singular);
    removed the need to know about the funky generated IDs for
    criterion objects.  Fixed derived bug in skins (tracker #408).

  - Modified error-logging code to avoid potential leaks of
    traceback frame.

  - Made Document's 'manage_FTPget' use 'EditableBody', rather than
    accessing 'text' attribute directly (improves reusability).
    Likewise 'Document.SearchableText'.

  - Merged Seb Bacon's refactoring of 'getDefaultView' into
    'CMFCore.utils._getView'; clients can now specify a view by name,
    as well.

  - Made the default content type for Image 'image/png', instead
    of the unintuitive 'text/html' inherited from DefaultDublinCoreImpl
    (tracker #384).

  - Corrected typo in ActionsTool which broke actions for the root
    portal object (tracker #379).

  - Updated the MemberDataTool to use an OOBTree, instead of the
    old-style BTree, to store member data wrappers (CMF Tracker 375).

  - Corrected 'personalize_form' to use 'getProperty' where feasible,
    rather than relying on direct attribute access (tracker #372).

  - Removed an incompatibility with LoginManager in
    CMFCore.MembershipTool (tracker #365).

  - Removed an infinite loop condition that arises when
    MembershipTool.createMemberArea gets called inside wrapUser
    (this could only happen if "Create Member Area" was checked
    in the Membership tool.)

  - Added new 'TitleOrId' skin method, and updated skins to
    depend on it rather than SimpleItem.title_or_id.

  - Made unit tests runnable without reliance on 'zctl test'.

  - Corrected initial column set in catalog to include
    "ModificationDate" instead of "ModifiedDate".

  - Ensured that object is recatalogued (e.g., after setting
    'portal_type';  thanks to Florent Guillaume).

  - Removed silly dependency of 'CatalogTool.searchResults' on
    REQUEST (catalog already does the Right Thing (tm) when no
    REQUEST is available).  Note that this requires updates to
    the 'search' skins, as they didn't pass it in.

  - Changed redirect target after rejecting an item to the search
    page for pending content items;  this resolves the problem
    that the non-Manager reviewr who rejects an item no longer
    has View permission on it, and therefore gets an Unauthorized
    when redirecting to the object's view action.

  - Moved generation of the "Add to Favorites" and "My Favorites"
    links from the CMFCore/ActionsTool into the
    CMFDefault/MembershipTool, which is a more logical location
    for it because it relies on information from the membership tool.

  - Made Topic directly publishable (like PortalContent), using its
    'view' action (or the first action found, if view is not present).

  - Set title for newly-created member folders;  fixes
    breadcrumbs that expect a title on the object.

  - Allow URLs with query strings in StructuredText links.

  - Update 'news_box' to search based on 'Type', rather than
    'meta_type'.

  - Fix 'SkinnedFolder.Creator()' to call 'getOwner()' with
    info argument.

  - Made CookieCrumbler check for 'WEBDAV_SOURCE_PORT'
    environment variable (supplied by Zope 2.4.1+), and bail on
    intercepting authentication if found.

  - Included 'Owner' in list of significant roles returned by
    'MembershipTool.getPortalRoles' (e.g., so that the
   "Local Roles" interface can allow assignment of it).

  - Allow users with local role of "Reviewer" to see the "pending
    review" action.

  - Made TypesTool, rather than individual type objects,
    responsible for generating "immediate view" URL;  type
    objects now return the newly-created object, which makes
    scripting them much simpler.

  - Remove fossilized reference to 'getSecurityManager' from
    'PortalContent._verifyActionPermissions'.

  - Modified the redirect after "Add to Favorites" to us the
    view action, rather than 'view'.

  - Fixed 'Document.guessFormat()' to use
    'utils.html_headcheck()' instead of 'bodyfinder' regex to
    detect structured text versus html;  avoids recursion limit
    for large HTML files.

  - Removed spurious 'afterCreate' protocol for content objects.

  - Added mapping of 'css' file extension to FSDTMLMethods.

  - Modifed PortalFolder.listFolderContents to handle
    permission-based filtering; duplicates what skip_unauthorized
    is doing in DocumentTemplate/DT_IN.py (but works for ZPT as
    well).

  - Modified CMFDefault.RegistrationTool.addMember to avoid
    flunking validation if properties are not passed (Tracker
    #335).

  - Applied patch from Chris Withers to 'register' skin method;
    the patch which avoids quoting problems for the error message
    if a problem occurs (Tracker #339).

  - Added 'DiscussionItem.replyCount' (Tracker #328).
    'DiscussionItem.hasReplies' now returns only a boolean value.
    Standard skins don't call 'replyCount' due to performance
    concerns.

  - Factored content filtering logic into a Python Script.

  - Improved handling of multiple rename targets (thanks to Chris
    Withers for the patch.)

  - Completed conversion of form targets from DTML Methods to
    Python Scripts.

  - Improved compatibility with Zope 2.4:

    o support for new "restricted execution" mode;

    o support for new catalog initialization API.

    o updated 'test_all' unit test drivers to use standard
      'unittest' module from Python 2.1 (it no longer has
      'JUnitTestTextRunner' class).

CMF 1.1 final (2001/06/20)

 New features

  - Landed "skinned folder" module, which permits creation of
    "folderish" types with customized replacements for 'index_html'.

  - Added 'run_all_tests' script, to simplify running all unit
    tests for CMF-related products.

  - Factored out index and column lists, to ease customization
    (Tracker #289)

  - Modified DefaultDublinCoreImpl#setContributors() to use new
    tuplize functionality (the ability to pass in a different
    splitter function).  If a string is passed in to
    setContributors(), it gets split on semicolons.  This allows
    setting of contributor strings to be like

     "Doe, John E (john@doe.a.deer); The Mertz Family Foundation; PBS"

    If one so deeply and dearly desired.  (The above would turn
    into a three element tuple).

  - Made it possible to map "normal" Zope objects as content
    (Tracker #283):

    o Skin and tool code which used to query the object
      for its Type in order to then ask the types tool for a
      TypeInfo object now just asks the types tool for type
      TypeInfo object directly.

    o Modified the TypesTool interface to signal that passing an
      object to 'getTypeInfo' is acceptable, with the semantic
      that the tool will attempt to find a TypeInfo object based
      on the tool's type or metatype.

  - Expanded signature of Document.CookedBody to change the
    header levels Structured Text starts rendering at, and
    whether to preserve those changes, following the following
    logic:

      If the format is html, and 'stx_level' is not passed in or
      is the same as the object's current settings, return the
      cached cooked text.  Otherwise, recook.  If we recook and
      'setlevel' is true, then set the recooked text and
      stx_level on the object.

 Bug fixes

  - Hardened DirectoryView against objects which raise exceptions
    during initial reads (typically due to permission problems);
    these objects now capture and log the exception, and create
    a BadFile object which allows browsing the traceback via the
    ZMI (Tracker #317).

  - Stopped polluting the browser with persistent skin cookie;
    clear it as well on logout (Tracker #304).

  - Cleaned up folder content filtering (Tracker #298, thanks
    to Chris Withers for the patch).

  - Implement new "List folder contents" permission (Tracker
    #320), to prevent non-privileged users from being able to
    browse 'folder_contents' (permission is by default mapped
    to 'Owner' and 'Manager').

    Note that this is really only a UI change:
    'PortalFolder.contentIds', 'PortalFolder.contentValues', and
    'PortalFolder.contentItems' are still public, to allow for
    reasonable "site map" views on folders.

  - Use saner type ID listing in 'search_form' (Tracker #324).

  - Rewired "POST target" skin methods, replacing filesystem-based
    DTML Methods with filesystem-based Python Scripts (from
    Tracker #301 -- thanks to Chris Withers).

  - Implemented *LARGE* patch to CMFDefault.DiscussionItem and
    CMFDefault.DiscussionTool, plus removal of
    CMFDefault.Discussions:  changed threading strategy to remove
    dependency on the path of the "host" content object.  Includes
    an ExternalMethod, CMFDefault/Extensions/update_discussion.py,
    which must be run to convert existing content which contains
    discussion.

  - Overrode DublinCore's isEffective in CMFCalendar.Event to
    always return true;  this change prevents blocking view of
    the event by standard_html_header.

  - Updated INSTALL.txt to note that:

     o Use with Zope 2.4.0a1 is *not* recommended.

     o CMFDecor requires Zope Page Templates (Tracker #291).

    and to describe upgrade process from CMF 1.0.

  - Fixed typo in 'Unauthorized' exception raised by
    'PortalContent._getDefaultView'.

  - Made all content types findable by catalog (Tracker #286).

  - Ensured that ContentTypeRegistry's "Test" tab doesn't puke if
    no MIMEtype is entered, or if one is entered which doesn't
    have a '/' in it (Tracker #292).

  - Suppressed overwrite of Subject when no 'Subject' or
    'Keywords' headers were present (Tracker #294).

  - Ensured that 'Type' is indexed in newly-created
    'portal_catalog'.

  - Fixed acquisition stripping in PortalContent.objectItems().

  - Modified CMFDefault.DublinCore.getMetadataHeaders() to join
    Subject by commas, instead of spaces.  Since we parse/split
    Subject on commas or semicolons now when a document is saved
    by FTP or WebDAV, we need to feed it out in the same format.

  - Fleshed out security declarations for 'portal_metadata' tool.

  - Corrected pathname of 'MemberDataTool.memberdataContents' to
    account for use of '_dtmldir' (thanks to Ricardo Newbery for
    the patch!).

  - Fixed buglet resulting from uninitialized local in
    'PortalContent.objectItems' (thanks to Seb Bacon for the
    patch).

  - Modified stock 'search_form' to query 'Type' rather than
    'meta_type'.

  - Removed debugging / "paranoia" print statements (thanks to
    Chris Withers for the patches).

CMF 1.1 beta (2001/06/01)

 New features

  - Added CMFCore.utils.keywordsplitter to construct 'Subject'
    dublin core header from both 'Keywords' and 'Subject' headers
    passed in (meta tags/rfc822).

  - CMF Document now uses StructuredTextNG for structured text
    handling.  Nicely enough, it uses the "with images" features, and
    also enables named and inner links.

  - CMF Document exposes two new accessor methods for getting at the
    "cooked" and editable body, 'CookedBody()', and 'EditableBody()'.
    Using the 'cooked_text' and 'text' instance attributes should be
    considered deprecated.

  - Added new "exemplar" content product, CMFCalendar, which
    (for now) adds a simple content object, Event.  This product
    serves a similar didactic purpose as CMFTopic (which is now
    "in the core"):  it shows how to build new content types as
    filesystem products.

  - Implemented improved "safety belt" for concurrent Document
    editing.  See the dogbowl proposal,
     http://cmf.zope.org/rqmts/proposals/ContentSafetyBelt

  - Added new filesystem-based skin method type, FSSTXMethod, for
    creating "methods" which render STX.

  - Exposed "controlled vocabulary" for Subject in
    'metadata_edit_form'.

  - Gave 'portal_skins' tool its own PUT_factory (Tracker #238).
    Allows site builder to create skin methods via WebDAV/FTP,
    including ZPT, PythonScripts, etc.

  - Implemented "outbound" segment of the "Syndication tool"
    proposal, q.v.,
     http://cmf.zope.org/CMF/Members/andrew/folderRSS

  - Made 'PUT_factory' use new 'content_type_registry' tool.

  - Made 'PUT_factory' use 'invokeFactory', so that objects
    created via PUT have their 'portal_type' set properly.

  - Added ContentTypeRegistry class and related predicates for
    mapping PUT requests (name,content_type,body) to type object
    names.

  - Allowed Reviewers to "retract" published content owned by
    others.

  - Added "Overview" ZMI view to tools.

  - Added "Dublin Core" ZMI view to PortalContent;  added an
    editing view for Document and derivatives.

  - Added "drop-in" workflow objects to the WorkflowTool,
    including the ability to map workflows onto content types.

  - Changed CMFDefault.Portal to install CMF Topic by default
    when building a new CMF Site.

  - Added a new criteria type, *FriendlyDateCriterion*, to
    CMFTopic for building queries like 'When effective_date is
    less than five days old'.

  - Implemented 'portal_metadata' tool.  See the dogbowl
    proposal,
    http://cmf.zope.org/rqmts/proposals/completed/metadata_tool.

  - Extended DirectoryView objects to reload when the directory
    they represent has changed, if Zope is running in debug mode.

  - Added hooks to CookieCrumbler to permit site managers to
    customize seting/expiring of the authentication cookie by
    adding PythonScripts; two default filesystem implementations
    are in CMFDefault's "control" skin.

  - Extended TypesTool to deal appropriately with DTML factory
    methods (e.g., for ZClasses).

  - Made FSDTMLMethods searchable from the ZMI (Issue PTK(251)[]).

 Bug Fixes

  - Added 'manage_beforeDelete' to DiscussionItemContainer class,
    and propagated to it from content deletion (Tracker #269).

  - Only display the "join" action if the user has the "Add
    portal member" permission.

  - Check for appropriate REQUEST variables before invoking
    CopySupport machinery, return a nice 'portal_status_message'
    instead of allowing the traceback to kick in (Tracker #247).

  - Initialize default DublinCore metadata for the site, so that
    *some* value is available everywhere (Tracker #285).

  - Add module-level globals aliases, to permit other products
    to use elements of skins (Tracker #273).

  - Replaced 'metadata_edit' DTMLMethod with PythonScript.

  - Updated 'metadata_edit' to avoid clearing values not passed
    in REQUEST (Tracker #268).

  - Removed spurious whitespace being added to Subject.

  - Fixed FSPythonScript to open file in text mode, so that
    Windows verstions with CR don't cause the parser to choke
    (Tracker #284).

  - Simplified login-disabling logic in CookieCrumbler.

  - Added '<base>' tag to headers of Document, NewsItem, and
    DiscussionItem so that relative links work properly.

  - Fixed the ActionsTool to suppress adding a trailing '/' to
    "empty" action URL's.

  - Fixed Document's content type sniffing to deal with odd case
    in which "entire" HTML document was embedded as an STX
    example.

  - Replaced literal string permissins with "named permissions",
    imported from modules in most places. (Please report any
    which escaped!)

  - Moved 'factory_type_information' registry entries back out
    to the relevant modules (instead of lumping them in
    CMFDefault.Portal).

  - Simplified NewsItem to "Document with a twist" (NewsItems now
    inherit lots of useful behavior from Document.

  - Aliased DublinCore's Format() as 'content_type', so that
    Zope's WebDAV support will do the Right Thing (TM) when
    handling a PROPFIND.

  - Suppressed "eager redirect" behavior in CookieCrumbler for
    FTP or WebDAV (note that WebDAV fix only works for "extra"
    HTTP methods; GET/PUT/POST still redirect).

  - Made sure to update the catalog when a content object's
    parent is deleted / moved (Tracker #261).

  - Fixed lossage to File objects when no upload supplied
    (Tracker #271).

  - Fixed "Add to Favorites" when applied to Folders.

  - Suppressed "Members" link in topbar (pointed to 'roster' method)
    for users who would not be able to see it.

  - Fixed irritating bugs in setting of skin-selection cookie.

  - Removed ugly '_mimetype_registry' hack for 'PUT_factory'.

  - Fixed a bug in CMFDefault.Document with PUT that only affected
    FTP: when a StructuredText document that contained a full HTML
    example (complete with <html>, <head>, and <body> tags) in its
    body, it would pass the "does it smell like HTML" test and throw
    everything away that wasn't inside the first matching pair of
    <body> tags it found.  Funnily enough, this bug was exposed when
    trying to save an article about how to use FTP with Zope and the
    CMF that contained such an example.

  - Fixed glitch caused by '<dtml-return>' in
    CMFDefault/skins/control/reconfig.dtml.  Thanks to Hans de Wit
    <hw@scp.nl> for reporting this!

  - Allowed 'portal_type' to be a method, as well as an attribute
    (eases ZClass-as-content).

  - Fixed search form to pass 'created' instead of 'date' (probably
    need 'modified', too);  also, added selection list for 'Subject',
    and fixed the "Last Month" option value.

  - Fixed non-import in CMFCore/WorkflowCore.py (Tracker #239,
    thanks to 'snej' for the patch).

  - Updated CatalogTool to handle searchable vs. displayable DublinCore
    dates properly.

  - Replaced usage of .id with .getId() all through the CMF, to
    conform with the new SimpleItem API. Thanks to Jens Quade
    <jq@jquade.de> for pointing this out. (Issue PTK(241)[]).

  - Extended 'index_html' to render portal description using STX
    (Tracker #246).

  - Updated CMFDefault skins to use Contentish.getIcon, including
    the portal catalog. This greatly simplifies using ZClasses as
    content. In CMFDefault/scripts you will find
    'convertCatalogGetIconColumn.pys), a Python Script that will
    convert your existing Catalog to use 'getIcon' instead of
    'icon' (Issue PTK(244)[]). Also, synched interface definition
    to show the 'relative_to_portal' argument.

  - Extended 'folder_factories' to filter type objects using
    'isConstructionAllowed' in 'PortalFolder.allowedContentTypes'
    (Tracker #249).

  - Fixed display of replies on discussion items.

  - Made appropriate use of 'portal_url', instead of BASEPATH
    ad hockery, in skin methods (Tracker #259).

  - Synched interface definition of 'Contentish.getIcon' with
    reality (documented 'relative' parameter).

  - Fixed "Ever" entry in 'search_form' to use a value safe in
    timezones east of GMT (Tracker #236).

  - Deprecated the CMFDefault.File.download method; it is still
    available, but is no longer called by the current CMF skin,
    nor is index_html aliased to it.

    The method was necessary when the "View' method was the
    default action when calling the URL of the File object, this
    is no longer the case. The setting of the Content-Disposition
    header is not needed when using the absolute URL of the
    object, and causes certain browsers to misbehave.

CMF 1.0 final (2001/03/29)

 - Removed embedded spaces in 'portal_status_message' strings
   (thanks to Dieter Maurer for pointing this out)

 - Added 'index_html' (copy/paste from CMFCore.PortalContent?!?) so
   that topics become directly publishable (thanks to Dieter
   Maurer for pointing this out).

 - Removed references to 'Images/' in skin DTML, adding an extra
   item to the default skins' lookup path. In CMFDefault/scripts
   you will find 'addImagesToSkinPaths.pys', a Python Script that
   adds the extra name to all your skin paths. (Tracker issue
   #205).

 - Added FSPythonScripts, allowing filesystem-based skins to
   expose customizable PythonScripts.

 - Fixed CMF Tracker item (207), "HTML test when editing a Portal
   Document is ambiguous".  Now, the same regular expression used
   to scoop out the contents of the <body> tags, which is case
   insensitive, is also used to detect whether the document may
   be HTML.

 - Converted physical path to string (Tracker #224).

 - Fixed 'Creator' metadata for DiscussionItems (tracker issue
   #206, thanks to Jeff Sasmor for the patch!).

 - Added simple search field for 'Subject' (Tracker #213).

 - Fixed CMF Tracker issue 211, "Topics have Folder icon" by
   finally moving the Topic icon into the skins, and writing a
   custom icon() method that uses getIcon (Subclassing from
   PortalFolder made this behavior strange).

 - Changed CMFDefault.Document__init__ to call self.edit at the
   end, instead of self._parse, which means that HTML can finally
   be passed into the constructor.  Unit tests verify that
   initializing with just the 'id' gives the proper results.

 - Added installation script (external method) for CMFTopic.

 - Ensured that content metatypes show up in the types list of the
   portal_catalog tool (Tracker issue #209, thanks to Jeff
   Sasmor).

 - Fixed unwanted multiple font reductions on 'recent_news'
   (Tracker issue #215).

 - Changed visited link color to enhance readability.

 - Fixed PNG transparency of logo (for NS 4.7).

 - Allowed Contributors to publish content directly (Tracker
   issue #216).

 - Gave more real estate to skin path fields (Tracker issue
   #226).

 - Added simple listing of subtopics to the default view (Tracker
   issue #214).

 - Regularized DiscussionItem.absolute_url (further work on
   Tracker issues #203 & #206).

 - Made 'addToFavorites' work as skinned method of target, and
   work for DiscussionItems (Tracker issue #227).

 - Moved actual mail sending into CMFDefault.RegistrationTool, to
   avoid having to give proxy roles to the skin methods involved
   (Tracker issue #160).

 - Add member count to roster display.

 - Made 'review_state' workflow info publically visible.

 - Made DiscussionItem.getReplies() and
   DiscussionItemContainter.getReplies() show only 'published'
   replies (allows retraction, for now).

 - Fixed WorkflowAction.__call__ to use the correct method name
   for exception notification (Tracker issue #232).

 - Ensure that reply's Creator propagates through preview (thanks
   to Jeff Sasmor for reporting that our fix to Tracker issue
   #206 missed the "Preview" case).

 - Removed crufty calls to registerPortalContent.

 - Trimmed over-long item IDs in actions box (Tracker issue #
   234;  thanks to Jeff Sasmor and Steve Alexandar for the patch).

1.0 beta (2001/03/05)

 * Migrated from old PTK repository on cvs.zope.org.

 * Changed package and module names:  'PTKBase' has become
   (mostly) 'CMFCore';  'PTKDemo', 'CMFDefault'.

 * Added package 'CMFTopic', which provides a new content type,
   'Topic';  topics are "logical" folders, which aggregate
   content based on catalog searches against metadata.

 * Revised discussion mechanism to store discussion with its
   underlying content (rather than in members' "Correspondence"
   folders).

 * Mad the membership system agnostic to the kind of user
   folder, including whether it is found in the portal or not.

 * "Skinned" the portal UI and all the content objects,
   enabling portal managers to replace it "piecemeal", safely.

 * Implemented local type registration, allowing portal
   managers to configure and extend the types addable in the
   portal.

 * Add 'PortalFolder.allowedContentTypes' and supporting machinery
   in type info objects, to permit configuration of the content
   types addable to a given folder type.

CMF 0.10alpha (2001/02/02)

 * Fixed breakage of "reply" feature introduced by new
   constructor regime (PTK Tracker #159).

 * Make creation of an 'acl_users' in the portal itself optional.

 * Add mapping of external roles (i.e., belonging to a user
   retrieved from an acquired user folder) onto "portal-specific"
   roles.  For example, users from the root user folder may
   have the "Employee" role;  the 'portal_membership' tool can
   map this role onto the "Member" role needed by the portal.

 * Corrected HTML quoting of Document text (PTK Tracker #154).

 * If content_url is not None and the user has their own member
   folder (as returned by 'portal_membership.getHomeUrl') then
   two new actions will show up in the user-related action box:

   - "Add to Favorites", adds an item to the user's "Favorites"
     folder, which will get created underneath the user's home
     folder if not present.

   - "My Favorites", linked to the Favorites folder (if the
     member has one).

 * Add 'Favorites' content type (derived from 'Link', optimized
   for objects within the same site).

 * Add 'PTKBase.interfaces.Contentish', an interface describing
   non-metadata methods for all content objects.

 * Added cool new portal icon -- thanks to Michael Bernstein!

 * Add 'simple_metadata' and 'metadata_help' methods, for easing
   "constructorish" capture of metadata.  Also demos "skinning"
   object-specific DTML.

 * Rearranged base classes to deal with the fact that SimpleItem
   now has a _setId() method.

 * Added a "quick start" script for creating a new INSTANCE_HOME
   sandbox (e.g., to allow easy experimentation with new-style
   portal).

 * Remove "metadata" editing from most "normal" edit forms.

 * Tweak stylesheets to make Netscrape 4.x more happy (links on
   secondary accent areas wouldn't show).

 * Enforced standard construction interface (only 'id' is
   required) on all "stock" content types.

 * Added default factory registration in 'portal_types' for all
   "stock" content types.

 * Add 'portal_types' tool, allowing registry of type / constructor
   information about portal content which may be created in a given
   portal instance (replaces 'Wizards' folder as type registry).

 * Added the description property to those attributes shown on the
   "view" screen for a file object (PTK Tracker #153).

 * Added credentialsChanged hook which can now work with
   CookieCrumblers.

 * Added Shane Hathaway's CookieCrumbler product, which spoofs
   HTTP Basic Auth for "don't know from cookies" user folders.

 * Add object for mapping property lists as filesystem object (to
   support parameterized stylesheet).  These objects are
   customized as normal Folders, which allows a great deal of
   flexibility.

 * Corrected 'PTKDemo.File.edit' to avoid replacing file contents
   with empty string when no file is uploaded (PTK Tracker #152).

 * Remove distribution-tab verisons of TTW products.

 * Remove derived UML model files (UML-HTML).

 * Added the PortalGenerator class, which is a subclassable portal
   instance creator, and created a new addable meta type.

 * Removed ZClass dependency from PropertiesTool.

 * Corrected glitch that 'PTKDemo.PortalObject.manage_options'
   was inherited from ObjectManager rather than PortalFolder.

 * Add 'PUT_factory' to PTKBase.PortalFolder (make it replaceable,
   too!)

 * Register PTKDemo content class metatypes with PTKBase.PortalFolder's
   MIME-type registry.

 * Unscrew PTKDemo.Document's dependence on vanished
   NullPortalResource.

 * Clean up CSS in DemoPortal (PTK Tracker #124).

 * Remove dependency on PythonMethod in DemoPortal (PTK Tracker #151).

 * Integrated user preference for "skin" with 'portal_skins'
   options.

 * Added capability to filter * 'PortalFolder.content{Ids,ValuesItems}'
   based on metadata queries.

 * Migrated skins from 'DemoPortal/Interfaces' folders into
   filesystem skins directories.

 * Improved integration of FSDTMLMethod and FSImage with output from
   the FSDump product.

 * New tab for the member data tool: 'contents' displays the number
   of members stored in the member data tool and also the number
   of "orphaned" members, meaning those that do not appear in the
   underlying acl_users anymore. a button is provided to "prune"
   those orphaned members.

 * Added methods to examine the contents of the meber data tool and to
   prune all those members who have been deleted out of the underlying
   'acl_users'.

 * Fixed bug when adding the mailhost during Portal initialization.

 * Added the portal_memberdata tool, which can wrap any user object with
   member properties.  Yeehaw!  the portal no longer needs a special
   user folder!

 * Add 'portal_skins' tool, enabling safe TTW customization of the default
   portal UI, which will be delivered as filesystem-based skin folders.
   Huge kudos to Shane Hathaway, who figured out a sane way to do this!

 * Extend fix for PTK Tracker #149 to 'generic' and 'sweng' interfaces.

 * Append '/view' to search results in order to allow navigation
  to objects which don't use standard header/footer in their
  'index_html', e.g., Images.  (PTK Tracker Issue #149)

 * Add meta_type to DiscussionItem (PTK Tracker Issue #150).

 * Integrate Dan Pierson's patch to show discussion threads inline
   (PTK Tracker issue #93).

 * Fix PTK Tracker #145 (PTKDemo/Portal.py or MailHost broken):  the
   2000/12/08 hotfix removed the "legacy" name, 'manage_addMailHost'.

 * Fix PTK Tracker #148 ('Table rows need vertical align')

 * Fix PTK Tracker #147 ("PTKDemo's Metadata HTML is ugly").

 * Fix PTK Tracker issue #136 ('CSS selection broken').

 * Fix Tracker issue #141 ('Wizard product has broken subobjects list').

 * Remove redundant 'description' arg from constructors (PTK Tracker
   issue #142;  thanks to jon@totient.demon.co.uk for reporting this).

 * Enable FTP upload/creation of NewsItems

 * Add the ability to query and set DublinCore metadata via FTP:

   - Updated PTKDemo.DemoDublinCore.DemoDublinCore to add a
     method, 'getMetadataHeaders()', which builds a list of
     DublinCore headers, suitable for inclusion in <meta> tags
     or in "Structured Text Headers".

   - Updated PTKDemo.Document.Document to export/import the
     metadata when accessed via FTP.

 * Fix PortalFolder.all_meta_types() to allow non-content.

 * Fix PortalFolder.listActions() to return a tuple, not a list
