Version 1.5: 15 March 2006

    Separate Publisher class by pushing the Durus-using methods into a
    DurusPublisher subclass.  This clears the path for using QP for applications
    that use other databases, and for those that use no database at all.

    Obtain "SitePublisher" from the module named "slash" in the site
    directory instead of from the site package itself.  The extra
    redirection seemed pointless.
    
    Obtain "SiteDirectory" from the module named "slash" in the site
    directory instead of getting "SiteRootDirectory" from the site package 
    itself.   If you have an existing QP site, make sure that the root
    directory class is qp.sites.<site_name>.slash.SiteDirectory .
    Because some sites may not use Directory-based traversal at all,
    the SiteDirectory is now optional.
    
    Change the "hello" demo to show how to make an application that does
    not use any of the normal QP traversal or page generation patterns.

    Change the "echo" demo to be a Durus-less QP application.
    
    Store the global publisher in a dictionary by thread id.  This should
    make it easier for people to experiment with using a QP publisher in
    a multi-threaded server.  
    
    Add a __call__ to the Publisher class so that a Publisher instance can
    act as a wsgi application.  This should make it easier for people to
    try using a Publisher within a wsgi server.
    
    Make the core QP server class usable when passfd is not available.  The
    server reverts to a non-forking mode, so the performance is expected to
    be lower.  This should, however, make it possible for people to use QP on 
    Windows machines.
    

Version 1.4: 2 February 2006

    Add an email field to the qp user.
    Specify the email and id attributes using a pattern.
    
    Add charset and mime_type options to sendmail options and 
    use them to add a Content-Type header.

    Add access_time recording to qp sessions.
    
    Remove side-effect from is_valid(), the caller takes care of this.
    
    Add "proper" spec operator so that we can say something like
    [proper(Answer)] to specify a list of spec-correct Answer instances.
    
    Remove cruft from is_granted() that Mario Ruggier found.

    Allow calls to footer to have non-keyword arguments.
      
Version 1.3: 13 December 2005

	Add form demo to proto site.
	
	Add add_javascript_code() and get_javascript_code()  utilities to the form
	module.
	
	Simplify basic form css.  Change form widget rendering to conform to 
	xhtml-strict.  Remove render_br keyword option.
	
	Add DOCTYPE to the default header.
	
	Add style and doctype keyword options to header().	

	Add HTTPRequest.get_content_type().
	
	Use "User Name" instead of "Email" as the widget title on the default login
	form.
	
	Use / instead of "" for the path, when there is no script name.

	Change secure() so that it does not raise an exception when there is no
	https_address.
	
	Set site in Publisher.__init__() before calling 
	ensure_database_initialized(), (formerly named ensure_initialized()).
	
	In redirect(), use the existing response instead of making a new one.
	This allows cookie headers to be part of a redirect response.
	
	In DurusDirectory._q_lookup, call self.__class__ instead of DurusDirectory.
	
Version 1.2: 4 November 2005

	Add read_body() and get_content_length() methods to the request class.

Version 1.1: 2 November 2005
    
    Change request default charset from 'iso-8859-1' to 'utf-8'.  In qp, html
    pages will use utf-8 encoding, so we will assume, in the absence of other 
    information, that requests use utf-8.  
    
    Allow for sessions when there is no https support.
    
    Remove Persistent from the __bases__ of Keyed and Keep so that they can
    be used as mixins with classes that already inherit from Persistent.


Version 1.0: 20 October 2005
    
    First release.

