Commits

illume committed dc3e7aa

Making newsletterapp more extensible.

Can now define a config item custom_webnewsletter in pypackages.
Can provide custom newsletter.newsletterapp.newsletterapp.WebNewsletter

Comments (0)

Files changed (27)

 newsletter changelog
 ====================
 
+0.1.22pre (2014-01-28)
+~~~~~~~~~~~~~~~~~~~~~~
+
+* make newsletterapp more extensible.
+
+
+0.1.21pre (2014-01-10)
+~~~~~~~~~~~~~~~~~~~~~~
+
+* clean so it works in modern packaging tools.
+
 
 0.1.20pre (2011-09-12)
 ~~~~~~~~~~~~~~~~~~~~~~
 testall:
 	python2.5 setup.py test
 	python2.6 setup.py test
-	python3.2 setup.py test
+	python2.7 setup.py test
+	python3.3 setup.py test
 	make checkdocs
 
 #docs:	install
 
 sdist:
 	make clean
-	make testall
+	#make testall
 	$(PYTHON) setup.py sdist
 
 checkdocs:
 
 * do release to get feedback.
 
+* docs for setting up as a newsletter.
+	* set up new instance.
+	* configure newsletterapp.ini
+		* set up admin password.
 
+			tools.basic_auth.users = {"admin": newsletter.newsletterapp.newsletterapp.encrypt_pwd("youradminpassword")}
+		* 
+
+
+
+

docs/build/doctrees/environment.pickle

Binary file modified.

docs/build/doctrees/index.doctree

Binary file modified.

docs/build/doctrees/newsletterapp.doctree

Binary file modified.

docs/build/doctrees/project.doctree

Binary file modified.

docs/build/html/_static/basic.css

     font-size: 1em;
 }
 
+div.sphinxsidebar #searchbox input[type="text"] {
+    width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    width: 30px;
+}
+
 img {
     border: 0;
 }
 }
 
 .align-center {
-    clear: both;
     text-align: center;
 }
 
     font-style: oblique;
 }
 
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
 /* -- code displays --------------------------------------------------------- */
 
 pre {
     #top-link {
         display: none;
     }
-}
+}

docs/build/html/_static/doctools.js

  * doctools.js
  * ~~~~~~~~~~~
  *
- * Sphinx JavaScript utilties for all documentation.
+ * Sphinx JavaScript utilities for all documentation.
  *
  * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
           body.highlightText(this.toLowerCase(), 'highlighted');
         });
       }, 10);
-      $('<li class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
-          .appendTo($('.sidebar .this-page-menu'));
+      $('<p class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+          .appendTo($('#searchbox'));
     }
   },
 
    * helper function to hide the search marks again
    */
   hideSearchWords : function() {
-    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('#searchbox .highlight-link').fadeOut(300);
     $('span.highlighted').removeClass('highlighted');
   },
 

docs/build/html/_static/pygments.css

 .highlight .gr { color: #FF0000 } /* Generic.Error */
 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #303030 } /* Generic.Output */
+.highlight .go { color: #333333 } /* Generic.Output */
 .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
 .highlight .gs { font-weight: bold } /* Generic.Strong */
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0040D0 } /* Generic.Traceback */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
 .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
 .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
 .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */

docs/build/html/_static/searchtools.js

 /*
- * searchtools.js
- * ~~~~~~~~~~~~~~
+ * searchtools.js_t
+ * ~~~~~~~~~~~~~~~~
  *
  * Sphinx JavaScript utilties for the full-text search.
  *
   return rv;
 }
 
+
 /**
  * Porter Stemmer
  */
-var PorterStemmer = function() {
+var Stemmer = function() {
 
   var step2list = {
     ational: 'ate',
   },
 
   query : function(query) {
-    var stopwords = ['and', 'then', 'into', 'it', 'as', 'are', 'in',
-                     'if', 'for', 'no', 'there', 'their', 'was', 'is',
-                     'be', 'to', 'that', 'but', 'they', 'not', 'such',
-                     'with', 'by', 'a', 'on', 'these', 'of', 'will',
-                     'this', 'near', 'the', 'or', 'at'];
+    var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
 
-    // stem the searchterms and add them to the correct list
-    var stemmer = new PorterStemmer();
+    // Stem the searchterms and add them to the correct list
+    var stemmer = new Stemmer();
     var searchterms = [];
     var excluded = [];
     var hlterms = [];
     var tmp = query.split(/\s+/);
-    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    var objectterms = [];
     for (var i = 0; i < tmp.length; i++) {
+      if (tmp[i] != "") {
+          objectterms.push(tmp[i].toLowerCase());
+      }
+
       if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
           tmp[i] == "") {
         // skip this "word"
     var filenames = this._index.filenames;
     var titles = this._index.titles;
     var terms = this._index.terms;
-    var objects = this._index.objects;
-    var objtypes = this._index.objtypes;
-    var objnames = this._index.objnames;
     var fileMap = {};
     var files = null;
     // different result priorities
     $('#search-progress').empty();
 
     // lookup as object
-    if (object != null) {
-      for (var prefix in objects) {
-        for (var name in objects[prefix]) {
-          var fullname = (prefix ? prefix + '.' : '') + name;
-          if (fullname.toLowerCase().indexOf(object) > -1) {
-            match = objects[prefix][name];
-            descr = objnames[match[1]] + _(', in ') + titles[match[0]];
-            // XXX the generated anchors are not generally correct
-            // XXX there may be custom prefixes
-            result = [filenames[match[0]], fullname, '#'+fullname, descr];
-            switch (match[2]) {
-            case 1: objectResults.push(result); break;
-            case 0: importantResults.push(result); break;
-            case 2: unimportantResults.push(result); break;
-            }
-          }
-        }
-      }
+    for (var i = 0; i < objectterms.length; i++) {
+      var others = [].concat(objectterms.slice(0,i),
+                             objectterms.slice(i+1, objectterms.length))
+      var results = this.performObjectSearch(objectterms[i], others);
+      // Assume first word is most likely to be the object,
+      // other words more likely to be in description.
+      // Therefore put matches for earlier words first.
+      // (Results are eventually used in reverse order).
+      objectResults = results[0].concat(objectResults);
+      importantResults = results[1].concat(importantResults);
+      unimportantResults = results[2].concat(unimportantResults);
     }
 
-    // sort results descending
-    objectResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-    importantResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-    unimportantResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-
     // perform the search on the required terms
     for (var i = 0; i < searchterms.length; i++) {
       var word = searchterms[i];
             listItem.slideDown(5, function() {
               displayNextItem();
             });
-          });
+          }, "text");
         } else {
           // no source available, just display title
           Search.output.append(listItem);
       }
     }
     displayNextItem();
+  },
+
+  performObjectSearch : function(object, otherterms) {
+    var filenames = this._index.filenames;
+    var objects = this._index.objects;
+    var objnames = this._index.objnames;
+    var titles = this._index.titles;
+
+    var importantResults = [];
+    var objectResults = [];
+    var unimportantResults = [];
+
+    for (var prefix in objects) {
+      for (var name in objects[prefix]) {
+        var fullname = (prefix ? prefix + '.' : '') + name;
+        if (fullname.toLowerCase().indexOf(object) > -1) {
+          var match = objects[prefix][name];
+          var objname = objnames[match[1]][2];
+          var title = titles[match[0]];
+          // If more than one term searched for, we require other words to be
+          // found in the name/title/description
+          if (otherterms.length > 0) {
+            var haystack = (prefix + ' ' + name + ' ' +
+                            objname + ' ' + title).toLowerCase();
+            var allfound = true;
+            for (var i = 0; i < otherterms.length; i++) {
+              if (haystack.indexOf(otherterms[i]) == -1) {
+                allfound = false;
+                break;
+              }
+            }
+            if (!allfound) {
+              continue;
+            }
+          }
+          var descr = objname + _(', in ') + title;
+          anchor = match[3];
+          if (anchor == '')
+            anchor = fullname;
+          else if (anchor == '-')
+            anchor = objnames[match[1]][1] + '-' + fullname;
+          result = [filenames[match[0]], fullname, '#'+anchor, descr];
+          switch (match[2]) {
+          case 1: objectResults.push(result); break;
+          case 0: importantResults.push(result); break;
+          case 2: unimportantResults.push(result); break;
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+    importantResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+    unimportantResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+    return [importantResults, objectResults, unimportantResults]
   }
 }
 
 $(document).ready(function() {
   Search.init();
-});
+});

docs/build/html/_static/sidebar.js

   var sidebar = $('.sphinxsidebar');
   var sidebarwrapper = $('.sphinxsidebarwrapper');
 
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
   // original margin-left of the bodywrapper and width of the sidebar
   // with the sidebar expanded
   var bw_margin_expanded = bodywrapper.css('margin-left');

docs/build/html/_static/underscore.js

+// Underscore.js 0.5.5
+// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the terms of the MIT license.
+// Portions of Underscore are inspired by or borrowed from Prototype.js,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore/
 (function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
 a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
 var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,

docs/build/html/genindex.html

+
+
 
 
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
+
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Index &mdash; newsletter v0.1.11pre documentation</title>
+    <title>Index &mdash; newsletter 0.1.11pre documentation</title>
+    
     <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="newsletter v0.1.11pre documentation" href="index.html" /> 
+    <link rel="top" title="newsletter 0.1.11pre documentation" href="index.html" /> 
   </head>
   <body>
     <div class="related">
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>  
 
           <div class="body">
             
 
-   <h1 id="index">Index</h1>
+<h1 id="index">Index</h1>
 
-   <div class="genindex-jumpbox">
-   
-   </div>
+<div class="genindex-jumpbox">
+ 
+</div>
 
 
           </div>
 <div id="searchbox" style="display: none">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
-      <input type="text" name="q" size="18" />
+      <input type="text" name="q" />
       <input type="submit" value="Go" />
       <input type="hidden" name="check_keywords" value="yes" />
       <input type="hidden" name="area" value="default" />
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              >index</a></li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer">
         &copy; Copyright 2011, Rene Dudfield.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
     </div>
   </body>
 </html>

docs/build/html/index.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
+
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Welcome to newsletter’s documentation! &mdash; newsletter v0.1.11pre documentation</title>
+    <title>Welcome to newsletter’s documentation! &mdash; newsletter 0.1.11pre documentation</title>
+    
     <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="newsletter v0.1.11pre documentation" href="#" />
+    <link rel="top" title="newsletter 0.1.11pre documentation" href="#" />
     <link rel="next" title="newsletterapp" href="newsletterapp.html" /> 
   </head>
   <body>
         <li class="right" >
           <a href="newsletterapp.html" title="newsletterapp"
              accesskey="N">next</a> |</li>
-        <li><a href="#">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="#">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>  
 
 <col width="84%" />
 </colgroup>
 <tbody valign="top">
-<tr><td rowspan="2"><strong>About</strong></td>
+<tr class="row-odd"><td rowspan="2"><strong>About</strong></td>
 <td rowspan="2">newsletter is for making newsletters with python.
 In <em>very</em> early stages of development.
 See COPYING for LGPL licence details.</td>
 </tr>
-<tr></tr>
-<tr><td><strong>Bugs</strong></td>
+<tr class="row-even"></tr>
+<tr class="row-odd"><td><strong>Bugs</strong></td>
 <td><a class="reference external" href="https://bitbucket.org/illume/newsletter/issues">https://bitbucket.org/illume/newsletter/issues</a></td>
 </tr>
-<tr><td><strong>Source</strong></td>
+<tr class="row-even"><td><strong>Source</strong></td>
 <td><p class="first">hg clone <a class="reference external" href="https://bitbucket.org/illume/newsletter">https://bitbucket.org/illume/newsletter</a></p>
 <p class="last"><a class="reference external" href="https://bitbucket.org/illume/newsletter">https://bitbucket.org/illume/newsletter</a></p>
 </td>
 </tr>
-<tr><td><strong>Docs</strong></td>
+<tr class="row-odd"><td><strong>Docs</strong></td>
 <td><a class="reference external" href="http://packages.python.org/newsletter/">http://packages.python.org/newsletter/</a></td>
 </tr>
-<tr><td><strong>pypi</strong></td>
+<tr class="row-even"><td><strong>pypi</strong></td>
 <td><a class="reference external" href="http://pypi.python.org/pypi/newsletter">http://pypi.python.org/pypi/newsletter</a></td>
 </tr>
-<tr><td rowspan="2"><strong>Authors</strong></td>
+<tr class="row-odd"><td rowspan="2"><strong>Authors</strong></td>
 <td rowspan="2"><p class="first">Only one developer so far, maybe more if it becomes useful.</p>
-<div class="figure">
-<img alt="http://rene.f0o.com/renef0o.gif" src="http://rene.f0o.com/renef0o.gif" />
-</div>
 <p class="last">Rene Dudfield &lt;<a class="reference external" href="mailto:renesd&#37;&#52;&#48;gmail&#46;com">renesd<span>&#64;</span>gmail<span>&#46;</span>com</a>&gt; is a lead developer and
 maintainer of <a class="reference external" href="http://www.pygame.org">pygame</a>,
 and is also a <a class="reference external" href="http://rene.f0o.com">Website developer, and App developer</a></p>
 </td>
 </tr>
-<tr></tr>
+<tr class="row-even"></tr>
 </tbody>
 </table>
 <p>newsletter contains a library for newsletters and a newsletterapp</p>
 <div class="highlight-python"><pre>virtualenv --no-site-packages --distribute myvirtualpython
 cd myvirtualpython
 source bin/activate
-pip install newsletter
+pip install newsletter --pre
 newsletterapp --help</pre>
 </div>
 <p>Installing with virtualenv and pip is recommended.</p>
 <li class="toctree-l1"><a class="reference internal" href="newsletterapp.html#run-the-web-application">Run the web application</a></li>
 <li class="toctree-l1"><a class="reference internal" href="newsletterapp.html#using-newsletter-web-admin">Using newsletter web admin</a></li>
 <li class="toctree-l1"><a class="reference internal" href="project.html">newsletter changelog</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2014-01-10">0.1.21pre (2014-01-10)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-09-12">0.1.20pre (2011-09-12)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-09-09">0.1.19pre (2011-09-09)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-09-08">0.1.18pre (2011-09-08)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#id1">0.1.17pre (2011-09-08)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-09-01">0.1.16pre (2011-09-01)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#id2">0.1.15pre (2011-09-01)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="project.html#bugs-fixed">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#features-added">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id1">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id2">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id3">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id4">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id5">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id6">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id7">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id8">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id9">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id10">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id11">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id12">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id13">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id14">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id15">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id16">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id17">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id18">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id19">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id20">Features added</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id21">Bugs fixed</a></li>
-<li class="toctree-l2"><a class="reference internal" href="project.html#id22">Features added</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#id3">0.1.14pre (2011-09-01)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-08-31">0.1.13pre (2011-08-31)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-07-25">0.1.12pre (2011-07-25)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-07-17">0.1.11pre (2011-07-17)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-06-06">0.1.10pre (2011-06-06)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-05-28">0.1.9pre (2011-05-28)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-05-23">0.1.8pre (2011-05-23)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-05-21">0.1.7pre (2011-05-21)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-04-17">0.1.5pre (2011-04-17)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-03-21">0.1.4pre (2011-03-21)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#id4">0.1.3pre (2011-03-21)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-03-18">0.1.2pre (2011-03-18)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-03-16">0.1.1pre (2011-03-16)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="project.html#pre-2011-03-15">0.1.0pre (2011-03-15)</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="project.html#todo">TODO</a></li>
 <div id="searchbox" style="display: none">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
-      <input type="text" name="q" size="18" />
+      <input type="text" name="q" />
       <input type="submit" value="Go" />
       <input type="hidden" name="check_keywords" value="yes" />
       <input type="hidden" name="area" value="default" />
         <li class="right" >
           <a href="newsletterapp.html" title="newsletterapp"
              >next</a> |</li>
-        <li><a href="#">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="#">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer">
         &copy; Copyright 2011, Rene Dudfield.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
     </div>
   </body>
 </html>

docs/build/html/newsletterapp.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
+
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>newsletterapp &mdash; newsletter v0.1.11pre documentation</title>
+    <title>newsletterapp &mdash; newsletter 0.1.11pre documentation</title>
+    
     <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="newsletter v0.1.11pre documentation" href="index.html" />
+    <link rel="top" title="newsletter 0.1.11pre documentation" href="index.html" />
     <link rel="next" title="newsletter changelog" href="project.html" />
     <link rel="prev" title="Welcome to newsletter’s documentation!" href="index.html" /> 
   </head>
         <li class="right" >
           <a href="index.html" title="Welcome to newsletter’s documentation!"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>  
 
 <div id="searchbox" style="display: none">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
-      <input type="text" name="q" size="18" />
+      <input type="text" name="q" />
       <input type="submit" value="Go" />
       <input type="hidden" name="check_keywords" value="yes" />
       <input type="hidden" name="area" value="default" />
         <li class="right" >
           <a href="index.html" title="Welcome to newsletter’s documentation!"
              >previous</a> |</li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer">
         &copy; Copyright 2011, Rene Dudfield.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
     </div>
   </body>
 </html>

docs/build/html/project.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
+
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>newsletter changelog &mdash; newsletter v0.1.11pre documentation</title>
+    <title>newsletter changelog &mdash; newsletter 0.1.11pre documentation</title>
+    
     <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="newsletter v0.1.11pre documentation" href="index.html" />
+    <link rel="top" title="newsletter 0.1.11pre documentation" href="index.html" />
     <link rel="prev" title="newsletterapp" href="newsletterapp.html" /> 
   </head>
   <body>
         <li class="right" >
           <a href="newsletterapp.html" title="newsletterapp"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>  
 
             
   <div class="section" id="newsletter-changelog">
 <h1>newsletter changelog<a class="headerlink" href="#newsletter-changelog" title="Permalink to this headline">¶</a></h1>
-<p>0.1.15pre (2011-09-1)</p>
+<div class="section" id="pre-2014-01-10">
+<h2>0.1.21pre (2014-01-10)<a class="headerlink" href="#pre-2014-01-10" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>clean so it works in modern packaging tools.</li>
+</ul>
+</div>
+<div class="section" id="pre-2011-09-12">
+<h2>0.1.20pre (2011-09-12)<a class="headerlink" href="#pre-2011-09-12" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>newsletterapp bug fix related to contact form functionality.</li>
+</ul>
+</div>
+<div class="section" id="pre-2011-09-09">
+<h2>0.1.19pre (2011-09-09)<a class="headerlink" href="#pre-2011-09-09" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>Adding a pypackages directory for newsletterapp for extending newsletterapp.</li>
+<li>port listened on respects config file setting.</li>
+</ul>
+</div>
+<div class="section" id="pre-2011-09-08">
+<h2>0.1.18pre (2011-09-08)<a class="headerlink" href="#pre-2011-09-08" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>doc error fix</li>
+</ul>
+</div>
+<div class="section" id="id1">
+<h2>0.1.17pre (2011-09-08)<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>newsletterapp more secure by default.  Does not setup default users for admin section.</li>
+<li>fixed some test failures.</li>
+<li>removed single new line at end of template files, that is put there by editors like vim.</li>
+<li>newsletterapp can be used for contact forms through send_message config items in the config file.</li>
+</ul>
+</div>
+<div class="section" id="pre-2011-09-01">
+<h2>0.1.16pre (2011-09-01)<a class="headerlink" href="#pre-2011-09-01" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>installation fixes.</li>
+<li>newsletterapp checks database directory exists and gives error message if it does not.</li>
+<li>newsletterapp &#8211;newinstall does not copy in .py files to install directory.</li>
+<li>newsletterapp &#8211;newinstall creates database directory by default.</li>
+</ul>
+</div>
+<div class="section" id="id2">
+<h2>0.1.15pre (2011-09-01)<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
+</div>
 <div class="section" id="bugs-fixed">
 <h2>Bugs fixed<a class="headerlink" href="#bugs-fixed" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>install.rst rst syntax errors fixed.</li>
 </ul>
 </div>
-<div class="section" id="features-added">
-<h2>Features added<a class="headerlink" href="#features-added" title="Permalink to this headline">¶</a></h2>
-<p>0.1.14pre (2011-09-1)</p>
+<div class="section" id="id3">
+<h2>0.1.14pre (2011-09-01)<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>install works correctly.</li>
 <li>updated documentation for installation.</li>
-</ul>
-</div>
-<div class="section" id="id1">
-<h2>Bugs fixed<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
 <li>removed buildout files.</li>
 <li>setuptools enabled by default.</li>
 <li>added package requirements for newsletterapp</li>
 </ul>
-<p>0.1.13pre (2011-08-31)</p>
 </div>
-<div class="section" id="id2">
-<h2>Features added<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-08-31">
+<h2>0.1.13pre (2011-08-31)<a class="headerlink" href="#pre-2011-08-31" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>updated documentation</li>
+<li>got buildout working.</li>
 </ul>
 </div>
-<div class="section" id="id3">
-<h2>Bugs fixed<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>got buildout working.</li>
-</ul>
-<p>0.1.12pre (2011-07-25)</p>
-</div>
-<div class="section" id="id4">
-<h2>Features added<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-07-25">
+<h2>0.1.12pre (2011-07-25)<a class="headerlink" href="#pre-2011-07-25" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>Adding cmd to send mail locally on unix using sendmail</li>
 <li>Added a default server port to ini file</li>
 <li>Made use instructions more clear.</li>
+<li>fixed setup file to continue if reading CHANGES,TODO, and readme fails.</li>
 </ul>
 </div>
-<div class="section" id="id5">
-<h2>Bugs fixed<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>fixed setup file to continue if reading CHANGES,TODO, and readme fails.</li>
-</ul>
-<p>0.1.11pre (2011-07-17)</p>
-</div>
-<div class="section" id="id6">
-<h2>Features added<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-07-17">
+<h2>0.1.11pre (2011-07-17)<a class="headerlink" href="#pre-2011-07-17" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>help page in the newsletter.newsletterapp admin section.</li>
 <li>new documentation, using the sphinx tool.</li>
 <li>command line control of some newsletter.newsletterapp functions.</li>
 <li>source code repository moved to bitbucket and hg from launchpad and bzr.</li>
 </ul>
-<p>0.1.10pre (2011-06-06)</p>
 </div>
-<div class="section" id="id7">
-<h2>Features added<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-06-06">
+<h2>0.1.10pre (2011-06-06)<a class="headerlink" href="#pre-2011-06-06" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>tests for newsletter application.</li>
 <li>templates sanitize html.</li>
 <li>newsletterapp sets cherrypy in production mode by default.</li>
 <li>can add subscribers by tag to a send.</li>
 </ul>
-<p>0.1.9pre (2011-05-28)</p>
 </div>
-<div class="section" id="id8">
-<h2>Features added<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-05-28">
+<h2>0.1.9pre (2011-05-28)<a class="headerlink" href="#pre-2011-05-28" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>many improvements to example newsletter application.</li>
 </ul>
-<p>0.1.8pre (2011-05-23)</p>
 </div>
-<div class="section" id="id9">
-<h2>Features added<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-05-23">
+<h2>0.1.8pre (2011-05-23)<a class="headerlink" href="#pre-2011-05-23" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>example application now uses the cherrypy config api and a newsletter.ini file for configuration.</li>
 </ul>
-<p>0.1.7pre (2011-05-21)</p>
 </div>
-<div class="section" id="id10">
-<h2>Features added<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-05-21">
+<h2>0.1.7pre (2011-05-21)<a class="headerlink" href="#pre-2011-05-21" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>improved example application.</li>
-</ul>
-</div>
-<div class="section" id="id11">
-<h2>Bugs fixed<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
 <li>Fixed bug with removing a user from a send.</li>
 <li>Updated TODO.txt</li>
 </ul>
-<p>0.1.5pre (2011-04-17)</p>
 </div>
-<div class="section" id="id12">
-<h2>Features added<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-04-17">
+<h2>0.1.5pre (2011-04-17)<a class="headerlink" href="#pre-2011-04-17" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>the first draft of an example newsletter web app using cherrypy and pywebsite.sqlitepickle</li>
 <li>Added some extra methods to Newsletter and NewsletterSend to support the example application.</li>
 </ul>
-<p>0.1.4pre (2011-03-21)</p>
 </div>
-<div class="section" id="id13">
-<h2>Features added<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="pre-2011-03-21">
+<h2>0.1.4pre (2011-03-21)<a class="headerlink" href="#pre-2011-03-21" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>Fixed NewsletterSend so it can have an almost dict like object that uses d.update({k:v}) method instead of d[k] = v.</li>
+<li>Made tests more resiliant.</li>
 </ul>
 </div>
-<div class="section" id="id14">
-<h2>Bugs fixed<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Made tests more resiliant.</li>
-</ul>
-<div class="section" id="pre-2011-03-21">
-<h3>0.1.3pre (2011-03-21)<a class="headerlink" href="#pre-2011-03-21" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="id15">
-<h2>Bugs fixed<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h2>
-</div>
-<div class="section" id="id16">
-<h2>Features added<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="id4">
+<h2>0.1.3pre (2011-03-21)<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>implementation of basic NewsletterSend interface, with some doctests.</li>
 </ul>
+</div>
 <div class="section" id="pre-2011-03-18">
-<h3>0.1.2pre (2011-03-18)<a class="headerlink" href="#pre-2011-03-18" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="id17">
-<h2>Bugs fixed<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h2>
-</div>
-<div class="section" id="id18">
-<h2>Features added<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h2>
+<h2>0.1.2pre (2011-03-18)<a class="headerlink" href="#pre-2011-03-18" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>implementation of basic Newsletter interface, with some doctests.</li>
 </ul>
+</div>
 <div class="section" id="pre-2011-03-16">
-<h3>0.1.1pre (2011-03-16)<a class="headerlink" href="#pre-2011-03-16" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="id19">
-<h2>Bugs fixed<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h2>
+<h2>0.1.1pre (2011-03-16)<a class="headerlink" href="#pre-2011-03-16" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>fixed some basecode.</li>
 </ul>
 </div>
-<div class="section" id="id20">
-<h2>Features added<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="pre-2011-03-15">
-<h3>0.1.0pre (2011-03-15)<a class="headerlink" href="#pre-2011-03-15" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="id21">
-<h2>Bugs fixed<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h2>
+<h2>0.1.0pre (2011-03-15)<a class="headerlink" href="#pre-2011-03-15" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li>only bugs added so far.</li>
-</ul>
-</div>
-<div class="section" id="id22">
-<h2>Features added<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
 <li>adding base code.</li>
 <li>basic newsletter object sketching out.</li>
 </ul>
   <h3><a href="index.html">Table Of Contents</a></h3>
   <ul>
 <li><a class="reference internal" href="#">newsletter changelog</a><ul>
+<li><a class="reference internal" href="#pre-2014-01-10">0.1.21pre (2014-01-10)</a></li>
+<li><a class="reference internal" href="#pre-2011-09-12">0.1.20pre (2011-09-12)</a></li>
+<li><a class="reference internal" href="#pre-2011-09-09">0.1.19pre (2011-09-09)</a></li>
+<li><a class="reference internal" href="#pre-2011-09-08">0.1.18pre (2011-09-08)</a></li>
+<li><a class="reference internal" href="#id1">0.1.17pre (2011-09-08)</a></li>
+<li><a class="reference internal" href="#pre-2011-09-01">0.1.16pre (2011-09-01)</a></li>
+<li><a class="reference internal" href="#id2">0.1.15pre (2011-09-01)</a></li>
 <li><a class="reference internal" href="#bugs-fixed">Bugs fixed</a></li>
-<li><a class="reference internal" href="#features-added">Features added</a></li>
-<li><a class="reference internal" href="#id1">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id2">Features added</a></li>
-<li><a class="reference internal" href="#id3">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id4">Features added</a></li>
-<li><a class="reference internal" href="#id5">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id6">Features added</a></li>
-<li><a class="reference internal" href="#id7">Features added</a></li>
-<li><a class="reference internal" href="#id8">Features added</a></li>
-<li><a class="reference internal" href="#id9">Features added</a></li>
-<li><a class="reference internal" href="#id10">Features added</a></li>
-<li><a class="reference internal" href="#id11">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id12">Features added</a></li>
-<li><a class="reference internal" href="#id13">Features added</a></li>
-<li><a class="reference internal" href="#id14">Bugs fixed</a><ul>
-<li><a class="reference internal" href="#pre-2011-03-21">0.1.3pre (2011-03-21)</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id15">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id16">Features added</a><ul>
+<li><a class="reference internal" href="#id3">0.1.14pre (2011-09-01)</a></li>
+<li><a class="reference internal" href="#pre-2011-08-31">0.1.13pre (2011-08-31)</a></li>
+<li><a class="reference internal" href="#pre-2011-07-25">0.1.12pre (2011-07-25)</a></li>
+<li><a class="reference internal" href="#pre-2011-07-17">0.1.11pre (2011-07-17)</a></li>
+<li><a class="reference internal" href="#pre-2011-06-06">0.1.10pre (2011-06-06)</a></li>
+<li><a class="reference internal" href="#pre-2011-05-28">0.1.9pre (2011-05-28)</a></li>
+<li><a class="reference internal" href="#pre-2011-05-23">0.1.8pre (2011-05-23)</a></li>
+<li><a class="reference internal" href="#pre-2011-05-21">0.1.7pre (2011-05-21)</a></li>
+<li><a class="reference internal" href="#pre-2011-04-17">0.1.5pre (2011-04-17)</a></li>
+<li><a class="reference internal" href="#pre-2011-03-21">0.1.4pre (2011-03-21)</a></li>
+<li><a class="reference internal" href="#id4">0.1.3pre (2011-03-21)</a></li>
 <li><a class="reference internal" href="#pre-2011-03-18">0.1.2pre (2011-03-18)</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id17">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id18">Features added</a><ul>
 <li><a class="reference internal" href="#pre-2011-03-16">0.1.1pre (2011-03-16)</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id19">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id20">Features added</a><ul>
 <li><a class="reference internal" href="#pre-2011-03-15">0.1.0pre (2011-03-15)</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#id21">Bugs fixed</a></li>
-<li><a class="reference internal" href="#id22">Features added</a></li>
-</ul>
-</li>
 <li><a class="reference internal" href="#todo">TODO</a></li>
 </ul>
 
 <div id="searchbox" style="display: none">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
-      <input type="text" name="q" size="18" />
+      <input type="text" name="q" />
       <input type="submit" value="Go" />
       <input type="hidden" name="check_keywords" value="yes" />
       <input type="hidden" name="area" value="default" />
         <li class="right" >
           <a href="newsletterapp.html" title="newsletterapp"
              >previous</a> |</li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer">
         &copy; Copyright 2011, Rene Dudfield.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
     </div>
   </body>
 </html>

docs/build/html/search.html

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
+
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Search &mdash; newsletter v0.1.11pre documentation</title>
+    <title>Search &mdash; newsletter 0.1.11pre documentation</title>
+    
     <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="_static/searchtools.js"></script>
-    <link rel="top" title="newsletter v0.1.11pre documentation" href="index.html" />
+    <link rel="top" title="newsletter 0.1.11pre documentation" href="index.html" />
   <script type="text/javascript">
     jQuery(function() { Search.loadIndex("searchindex.js"); });
   </script>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>  
 
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
-        <li><a href="index.html">newsletter v0.1.11pre documentation</a> &raquo;</li> 
+        <li><a href="index.html">newsletter 0.1.11pre documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer">
         &copy; Copyright 2011, Rene Dudfield.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
+      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
     </div>
   </body>
 </html>

docs/build/html/searchindex.js

-Search.setIndex({objects:{},terms:{"12pre":0,all:[0,2],code:[0,2],feedback:0,just:2,web_admin_templ:2,move:0,rest:0,trade:2,front:2,concurr:2,through:2,"14pre":0,follow:0,"5pre":0,dynam:2,help:[0,1],impact:2,"2pre":0,onli:[0,1,2],lgpl:1,launchpad:0,also:1,fix:[0,1],configur:[0,1,2],activ:1,send:[0,2],add:[0,2],other:2,dict:0,mail:[0,2],main:2,local:[0,2],bounc:2,sent:2,sanit:0,applic:[0,1,2],them:2,sourc:[0,1],earli:1,sick:2,thei:2,mayb:1,python:[1,2],pollut:1,pypi:1,sitewid:1,email_templ:2,tiny_mc:2,"import":2,veri:1,now:0,net:[],requir:0,like:[0,2],school:1,csv:2,name:2,"13pre":0,changelog:[0,1],edit:2,cmd:0,manual:[0,2],instruct:0,server:[0,2],separ:2,send_part:2,basecod:0,mode:0,myvirtualpython:1,pygam:1,comma:2,attribut:2,where:2,page:[0,1,2],"function":0,app:[0,1,2],sketch:0,set:0,old:1,newslett:[0,1,2],list:2,some:[0,2],continu:0,sign:2,see:1,"static":2,resili:0,"0pre":0,fail:0,run:[1,2],fullnam:2,todo:[0,1],click:2,librari:[1,2],out:[0,2],virtualenv:1,index:1,statu:2,buildout:0,lead:1,confirm:2,databas:2,section:[0,2],per:2,content:1,"new":[0,2],subscript:2,method:0,either:2,process:2,full:2,themselv:2,sendmail:0,got:0,screen:2,contain:[1,2],subject:2,isol:1,maintain:1,bodi:2,base:[0,2],web:[0,1,2],repositori:0,releas:0,org:1,becom:1,dudfield:1,stage:1,newsletter_send:2,great:2,postgresql:2,admin:[0,1,2],"15pre":0,area:2,everyon:2,newsletterapp:[0,1,2],throttl:2,doctest:0,pywebsit:0,setup:[0,1,2],improv:0,chang:0,com:1,first:[0,2],"7pre":0,sqlitepickl:[0,2],extra:0,onc:2,modul:1,each:2,automat:2,"8pre":0,ask:2,unix:[0,1],api:0,done:2,instal:[0,1,2],web_front_templ:2,txt:0,open:2,your:[1,2],select:2,websit:[1,2],differ:2,from:[0,2],log:2,wai:[],script:[0,2],support:0,enabl:0,system:[0,1,2],been:2,next:2,"11pre":0,almost:0,draft:0,compos:2,basic:0,interfac:[0,2],licenc:1,wait:2,"final":2,store:2,editor:2,newinstal:2,illum:1,option:2,peopl:[1,2],hundr:2,recommend:1,setuptool:0,about:1,site:1,link:2,templat:[0,2],rst:0,attempt:2,line:[0,2],gmail:1,bug:[0,1],present:2,bzr:0,anoth:2,made:0,have:[0,2],"default":0,remov:0,access:2,until:2,project:[],directori:[1,2],limit:[1,2],can:[0,2],error:0,otherwis:2,"3pre":0,more:[0,1],email:[0,2],bitbucket:[0,1],control:0,bin:1,sqlite:2,featur:[0,1,2],rene:1,cherrypi:0,creat:2,"1pre":0,"9pre":0,descript:[1,2],modern:2,readm:0,customis:2,indic:1,packag:[0,1],tag:[0,2],ini:[0,2],file:[0,1,2],tabl:1,pip:1,plan:0,work:0,attach:2,newslettersend:0,subscrib:[0,2],password:2,develop:1,welcom:1,want:2,author:1,check:[0,2],protect:2,make:[0,1],get:[0,2],detail:[1,2],same:0,port:0,write:2,field:2,need:2,html:[0,2],read:0,unsubscrib:2,which:2,test:[0,2],instead:[0,2],you:[1,2],document:[0,1,2],config:0,imag:2,css:2,updat:0,variabl:2,product:0,"4pre":0,http:1,distribut:1,plenti:2,normal:1,track:2,clone:1,"10pre":0,tool:0,search:1,user:[0,2],mani:[0,2],extern:2,end:2,implement:0,demonstr:2,reduc:2,handl:2,sphinx:0,correctli:0,save:2,tmp:2,syntax:0,doc:1,clear:0,well:2,object:0,doe:[1,2],issu:1,test_newsletterapp:2,exampl:0,command:[0,2],thi:[1,2],enter:2,far:[0,1],renesd:1,copi:1},objtypes:{},titles:["newsletter changelog","Welcome to newsletter&#8217;s documentation!","newsletterapp"],objnames:{},filenames:["project","index","newsletterapp"]})
+Search.setIndex({objects:{},terms:{"12pre":[0,1],all:[0,2],code:[0,2],feedback:0,just:2,from:[0,2],api:0,thi:[1,2],move:0,remov:0,rest:0,trade:2,front:2,concurr:2,through:[0,2],modul:1,file:[0,1,2],"14pre":[0,1],follow:0,user:[0,2],"5pre":[0,1],dynam:2,help:[0,1],impact:2,"2pre":[0,1],onli:[0,1,2],lgpl:1,launchpad:0,field:2,fix:[0,1],configur:[0,1,2],activ:1,send:[0,2],either:2,click:2,add:[0,2],html:[0,2],dict:0,about:1,creat:[0,2],bin:1,mail:[0,2],main:2,local:[0,2],app:[0,1,2],sent:2,sanit:0,applic:[0,1,2],them:2,sourc:[0,1],which:2,thei:2,mayb:1,python:[1,2],pollut:1,pypi:1,virtualenv:1,email_templ:2,next:2,automat:2,failur:0,veri:1,syntax:0,now:0,enter:2,subscript:2,requir:0,like:[0,2],school:1,document:[0,1,2],instead:[0,2],name:2,"13pre":[0,1],changelog:[0,1],edit:2,config:0,cmd:0,list:2,"16pre":[0,1],server:[0,2],separ:2,item:0,send_part:2,basecod:0,mode:0,myvirtualpython:1,pygam:1,comma:2,updat:0,where:2,page:[0,1,2],"function":0,sketch:0,"18pre":[0,1],old:1,manual:[0,2],some:[0,2],continu:0,sign:2,ask:2,see:1,"static":2,"0pre":[0,1],fail:0,themselv:2,fullnam:2,todo:[0,1],port:0,librari:[1,2],out:[0,2],variabl:2,index:1,statu:2,buildout:0,implement:0,lead:1,confirm:2,"19pre":[0,1],databas:[0,2],section:[0,2],per:2,content:1,write:2,basic:0,"import":2,net:[],method:0,attribut:2,full:2,run:[1,2],extend:0,sendmail:0,got:0,screen:2,contain:[1,2],subject:2,isol:1,sphinx:0,bodi:2,base:[0,2],web:[0,1,2],repositori:0,"21pre":[0,1],releas:0,org:1,becom:1,dudfield:1,stage:1,newsletter_send:2,protect:2,postgresql:2,admin:[0,1,2],"15pre":[0,1],script:[0,2],put:0,exampl:0,"9pre":[0,1],throttl:2,doctest:0,done:2,pywebsit:0,improv:0,chang:0,com:1,first:[0,2],control:0,sqlitepickl:[0,2],extra:0,onc:2,bounc:2,each:2,tiny_mc:2,vim:0,email:[0,2],instruct:0,set:0,resili:0,been:2,respect:0,web_front_templ:2,txt:0,open:2,your:[1,2],select:2,"11pre":[0,1],differ:2,newslett:[0,1,2],log:2,wai:[],area:2,css:2,support:0,system:[0,1,2],messag:0,newsletterapp:[0,1,2],websit:[1,2],almost:0,unix:[0,1],draft:0,compos:2,recommend:1,interfac:[0,2],licenc:1,wait:2,instal:[0,1,2],"final":2,store:2,listen:0,newinstal:[0,2],illum:1,option:2,form:0,peopl:[1,2],hundr:2,relat:0,setuptool:0,great:2,customis:2,link:2,indic:1,rst:0,attempt:2,line:[0,2],editor:[0,2],gmail:1,bug:[0,1],present:2,correctli:0,"8pre":[0,1],send_messag:0,made:0,"default":0,"20pre":[0,1],setup:[0,1,2],access:2,until:2,project:[],limit:[1,2],can:[0,2],error:0,otherwis:2,"3pre":[0,1],more:[0,1],everyon:2,bitbucket:[0,1],pre:1,earli:1,sqlite:2,featur:[1,2],rene:1,cherrypi:0,"7pre":[0,1],give:0,process:2,well:2,modern:[0,2],readm:0,site:1,templat:[0,2],packag:[0,1],tag:[0,2],exist:0,ini:[0,2],have:[0,2],tabl:1,pip:1,work:0,attach:2,subscrib:[0,2],password:2,develop:1,welcom:1,want:2,author:1,anoth:2,make:[0,1],get:[0,2],detail:[1,2],same:0,check:[0,2],"1pre":[0,1],also:1,need:2,other:2,read:0,unsubscrib:2,sick:2,test:[0,2],"new":[0,2],you:[1,2],csv:2,maintain:1,imag:2,singl:0,enabl:0,tmp:2,product:0,"4pre":[0,1],http:1,distribut:1,plenti:2,normal:1,track:2,clone:1,"10pre":[0,1],tool:0,search:1,"17pre":[0,1],plan:0,mani:[0,2],extern:2,end:[0,2],pypackag:0,web_admin_templ:2,demonstr:2,reduc:2,handl:2,sitewid:1,bzr:0,save:2,directori:[0,1,2],doc:[0,1],clear:0,secur:0,descript:[1,2],object:0,doe:[0,1,2],issu:1,test_newsletterapp:2,contact:0,command:[0,2],clean:0,newslettersend:0,far:[0,1],renesd:1,copi:[0,1]},objtypes:{},titles:["newsletter changelog","Welcome to newsletter&#8217;s documentation!","newsletterapp"],objnames:{},filenames:["project","index","newsletterapp"]})
 	virtualenv --no-site-packages --distribute myvirtualpython
 	cd myvirtualpython
 	source bin/activate
-	pip install newsletter
+	pip install newsletter --pre
 	newsletterapp --help
 
 Installing with virtualenv and pip is recommended.

newsletter/newsletterapp/newsletterapp.ini

 smtp_sleep_between_sends = 1.0
 
 
+# We can override the newslatterapp.WebNewsletter class here.
+custom_webnewsletter = None
+#custom_webnewsletter = custom_webnewsletter.MyWebNewsletter
+
+
+
 
 # ----------------------
 #  send_message_ parts...
 
+# This part is set up for a contact page.  Remove it if you don't want to do that.
+
 
 [send_message_a_contact]
 # ----------------------

newsletter/newsletterapp/newsletterapp.py

 
         cherrypy.tree.mount(wnl, mount_point, config = cfg)
 
+        # See if we have a custom WebNewsletter. If so, use that.
+        newsletter_cfg = cherrypy.tree.apps[mount_point].config['newsletter']
+        if newsletter_cfg.get('custom_webnewsletter', None):
+            wnl = newsletter_cfg.get('custom_webnewsletter', None)()
+            cherrypy.tree.mount(wnl, mount_point, config = cfg)
+
         # Need to call load() after mounting it so we 
         #   have the config from cherrypy.
         wnl.load(cherrypy.tree.apps[mount_point].config)

newsletter/newsletterapp/pypackages/custom_webnewsletter.py

+# custom newsletter app
+
+import newsletter.newsletterapp.newsletterapp
+
+
+class MyWebNewsletter(newsletter.newsletterapp.newsletterapp.WebNewsletter):
+
+
+    # Here we show a subscribe function that just has an email, no full_name.
+    def subscribe(self, email, wrap_it = True):
+        """ subscribe(email, wrap_it = True)
+        """
+        if newsletter.newsletterapp.newsletterapp.validate_email(email):
+            tags = ""
+            info = {"full_name": '',
+                    "tags": tags}
+            if self._n.subscribe(email, info):
+                return self.html_template("subscribe", wrap_it)
+        else:
+            return self.html_template("subscribe_email_invalid", wrap_it)
+
+    subscribe.exposed = True

newsletter/newsletterapp/pypackages/validators.py

 # you can place your validation functions in there.
 
-def myvalidationfunc(kwargs)
+def myvalidationfunc(kwargs):
     return kwargs.get('url', '').startwith('http://localhost')

newsletter/newsletterapp/static/web_admin_templates/help.html

 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.10: http://docutils.sourceforge.net/" />
 <title>Using newsletter web admin</title>
 <style type="text/css">
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $
+:Id: $Id: html4css1.css 7514 2012-09-14 14:27:12Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
 
 div.attention p.admonition-title, div.caution p.admonition-title,
 div.danger p.admonition-title, div.error p.admonition-title,
-div.warning p.admonition-title {
+div.warning p.admonition-title, .code .error {
   color: red ;
   font-weight: bold ;
   font-family: sans-serif }
   margin-top: 0 ;
   font: inherit }
 
-pre.literal-block, pre.doctest-block, pre.math {
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
   margin-left: 2em ;
   margin-right: 2em }
 
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
 span.classifier {
   font-family: sans-serif ;
   font-style: oblique }
 +------------+----------------------------------------------------------------+
 |**Authors** | Only one developer so far, maybe more if it becomes useful.    |
 +            |                                                                +
-|            | .. figure:: http://rene.f0o.com/renef0o.gif                    |
 |            |                                                                |
 |            | Rene Dudfield <renesd@gmail.com> is a lead developer and       |
 |            | maintainer of `pygame <http://www.pygame.org>`_,               |
 
 METADATA = {
     'name':             'newsletter',
-    'version':          '0.1.20pre',
+    'version':          '0.1.22pre',
     'license':          'LGPL',
     'url':              'https://bitbucket.org/illume/newsletter',
     'author':           'Rene Dudfield',
     'author_email':     'renesd@gmail.com',
-    'description':      'alpha newsletter software for #python. CHANGES: newsletterapp bug fixes.',
+    'description':      'alpha newsletter software for #python. Fix for new pip, and example custom validators.',
     'long_description': long_description,
     'classifiers':      [
             'Development Status :: 3 - Alpha',
             'Programming Language :: Python :: 3.0',
             'Programming Language :: Python :: 3.1',
             'Programming Language :: Python :: 3.2',
+            'Programming Language :: Python :: 3.3',
             'Topic :: Internet :: WWW/HTTP',
             'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
             'Topic :: Internet :: WWW/HTTP :: WSGI',