Remove docs/html directory. There is no need to keep the HTML documentation inside the package itself, since it is available on packages.python.org/plone.app.discussion.

svn path=/plone.app.discussion/trunk/; revision=36875
This commit is contained in:
Timo Stollenwerk 2010-06-01 15:11:33 +00:00
parent 125a1beb7e
commit 518b89b043
14 changed files with 621 additions and 162 deletions

View File

@ -0,0 +1,25 @@
API/Interfaces
--------------
The conversation and replies adapters.
The conversation is responsible for storing all comments. It provides a
dict-like API for accessing comments, where keys are integers and values
are IComment objects. It also provides features for finding comments quickly.
The IReplies adapter provides an API for finding and manipulating the comments
directly in reply to a particular comment (implemented by the CommentReplies
adpater) or at the top level of the conversation (implemented by the
ConversationReplies adapter).
.. autointerface:: plone.app.discussion.interfaces.IConversation
:members:
.. autointerface:: plone.app.discussion.interfaces.IReplies
:members:
.. autointerface:: plone.app.discussion.interfaces.IComment
:members:

View File

@ -10,7 +10,7 @@ plone.app.discussion.
CMF and Plone UI constructs.
**Discussion items are cataloged**
It is be possible to search for discussion items like any other type of
It is possible to search for discussion items like any other type of
content.
**Discussion items are subject to workflow and permission**
@ -19,26 +19,26 @@ plone.app.discussion.
permissions.
**Discussion items are light weight objects**
Discussion item objects are as light weight as possible.
Ideally, a discussion item should be as lightweight as a catalog brain.
This may mean that we forego convenience base classes and re-implement
certain interfaces. Comments should not provide the full set of dublin
core metadata, though custom indexers can be used to provide values for
standard catalog indexes.
Discussion item objects are as light weight as possible. Ideally, a
discussion item should be as lightweight as a catalog brain. This may mean
that we forego convenience base classes and re-implement certain interfaces.
Comments should not provide the full set of dublin core metadata, though
custom indexers can be used to provide values for standard catalog indexes.
**Optimise for retrival speed**
HTML filtering and other processing should happen on save, not on render,
to make rendering quick.
**Settings are stored using plone.registry**
Any global setting should be stored in plone.registry records
Any global setting should be stored in plone.registry records.
**Forms are constructed using extensible z3c.form forms**
This allows plugins (such as spam protection algorithms) to provide
additional validation
additional validation. It also allows integrators to write add-ons that add
new fields to the comment form.
**Discussion items are stored in a BTree container**
This allows faster lookup and manipulation
This allows faster lookup and manipulation.
**Discussion items are accessed using a dict-like interface**
This makes iteration and manipulation more natural. Even if comments are

View File

@ -0,0 +1,30 @@
===========================
Captcha Plugin Architecture
===========================
This document contains design notes for the plone.app.discussion Captcha plugin
architecture. It also explains how to write your own Captcha plugin (???).
Currently there are two plugins that work with plone.app.discussion:
1) plone.formwidget.captcha
2) plone.formwidget.recaptcha
1) Captcha plugin must provide the feature "plone.app.discussion-captcha":
Add this to your configure.zcml::
<configure ...
xmlns:meta="http://namespaces.zope.org/meta">
<!-- Declare that plone.formwidget.captcha provides a Captcha field that
can be used by plone.app.discussion to add a Captcha field to comment
forms. -->
<meta:provides feature="plone.app.discussion-captcha" />
...
</configure>
For examples have a look at plone.formwidget.captcha
https://svn.plone.org/svn/plone/plone.formwidget.captcha/trunk/plone/formwidget/captcha/configure.zcml

View File

@ -150,20 +150,18 @@ an auto-moderation 'white-list', e.g. by email address or username.
Forms and UI
------------
The basic commenting display/reply form should be placed in a viewlet.
The basic commenting display/reply form is placed in a viewlet.
Ideally, the reply form should be inline, perhaps revealed with JavaScript
if enabled. This allows full contextualisation of replies. The current
solution, with a separate form that shows some context, is brittle and
over-complicated.
The reply form is dynamically created right under the comment when the user hits
the reply button. To do so, we copy the standard comment form with a jQuery
function. This function sets the form's hidden in_reply_to field to the id of
the comment the user wants to reply to. This also makes is possible to use
z3c.form validation for the reply forms, because we can uniquely identify the
a reply form request and return the reply form with validation errors.
If we support quoting of comments in replies, we can load the text to quote
using JavaScript as well.
Since we rely on JavaScript for the reply form creation, the reply button is
removed for nonJavaScript enabled browsers.
As a fall-back for non-JavaScript enabled browsers, it is probably OK not to
support quoting and/or viewing of context, e.g. the user is taken to a standalone
'comment reply' form.
All actual forms should be handled using z3c.form and plone.z3cform's
ExtensibleForm support. This makes it possible to plug in additional fields
declaratively, e.g. to include spam protection.
The comment form uses z3c.form and plone.z3cform's ExtensibleForm support. This
makes it possible to plug in additional fields declaratively, e.g. to include
SPAM protection.

View File

@ -16,18 +16,9 @@ Contents:
architecture.txt
design.txt
API
---
.. automodule:: plone.app.discussion
.. autoclass:: plone.app.discussion.conversation.Conversation
.. automethod:: plone.app.discussion.conversation.Conversation.enabled
api.txt
.. include:: ../../CHANGES.txt
Indices and tables
==================

306
docs/html/api.html Normal file
View File

@ -0,0 +1,306 @@
<!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>API/Interfaces &mdash; plone.app.discussion v1.0b4 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: '#',
VERSION: '1.0b4',
COLLAPSE_MODINDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="plone.app.discussion v1.0b4 documentation" href="index.html" />
<link rel="prev" title="Design Notes" href="design.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="design.html" title="Design Notes"
accesskey="P">previous</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="api-interfaces">
<h1>API/Interfaces<a class="headerlink" href="#api-interfaces" title="Permalink to this headline"></a></h1>
<p>The conversation and replies adapters.</p>
<p>The conversation is responsible for storing all comments. It provides a
dict-like API for accessing comments, where keys are integers and values
are IComment objects. It also provides features for finding comments quickly.</p>
<p>The IReplies adapter provides an API for finding and manipulating the comments
directly in reply to a particular comment (implemented by the CommentReplies
adpater) or at the top level of the conversation (implemented by the
ConversationReplies adapter).</p>
<dl class="interface">
<dt id="plone.app.discussion.interfaces.IConversation">
<em class="property">interface </em><tt class="descclassname">plone.app.discussion.interfaces.</tt><tt class="descname">IConversation</tt><a class="headerlink" href="#plone.app.discussion.interfaces.IConversation" title="Permalink to this definition"></a></dt>
<dd><p>Extends: <tt class="xref docutils literal"><span class="pre">zope.interface.common.mapping.IIterableMapping</span></tt></p>
<p>A conversation about a content object.</p>
<p>This is a persistent object in its own right and manages all comments.</p>
<p>The dict interface allows access to all comments. They are stored by
long integer key, in the order they were added.</p>
<p>Note that __setitem__() is not supported - use addComment() instead.
However, comments can be deleted using __delitem__().</p>
<p>To get replies at the top level, adapt the conversation to IReplies.</p>
<p>The conversation can be traversed to via the ++comments++ namespace.
For example, path/to/object/++comments++/123 retrieves comment 123.</p>
<p>The __parent__ of the conversation (and the acquisition parent during
traversal) is the content object. The conversation is the __parent__
(and acquisition parent) for all comments, regardless of threading.</p>
<dl class="method">
<dt id="IConversation.__delitem__">
<tt class="descname">__delitem__</tt><big>(</big><em>key</em><big>)</big><a class="headerlink" href="#IConversation.__delitem__" title="Permalink to this definition"></a></dt>
<dd>Delete the comment with the given key. The key is a long id.</dd></dl>
<dl class="attribute">
<dt id="IConversation.last_comment_date">
<tt class="descname">last_comment_date</tt><a class="headerlink" href="#IConversation.last_comment_date" title="Permalink to this definition"></a></dt>
<dd>Date of the most recent comment</dd></dl>
<dl class="attribute">
<dt id="IConversation.total_comments">
<tt class="descname">total_comments</tt><a class="headerlink" href="#IConversation.total_comments" title="Permalink to this definition"></a></dt>
<dd>Total number of comments on this item</dd></dl>
<dl class="method">
<dt id="IConversation.getComments">
<tt class="descname">getComments</tt><big>(</big><em>start=0</em>, <em>size=None</em><big>)</big><a class="headerlink" href="#IConversation.getComments" title="Permalink to this definition"></a></dt>
<dd><p>Return an iterator of comment objects for rendering.</p>
<p>The &#8216;start&#8217; parameter is the id of the comment from which to start the
batch. If no such comment exists, the next higher id will be used.
This means that you can use max key from a previous batch + 1 safely.</p>
<p>The &#8216;size&#8217; parameter is the number of comments to return in the
batch.</p>
<p>The comments are returned in creation date order, in the exact batch
size specified.</p>
</dd></dl>
<dl class="method">
<dt id="IConversation.enabled">
<tt class="descname">enabled</tt><big>(</big><big>)</big><a class="headerlink" href="#IConversation.enabled" title="Permalink to this definition"></a></dt>
<dd><p>Returns True if discussion is enabled for this conversation.</p>
<p>This method checks five different settings in order to figure out if
discussion is enable on a specific content object:</p>
<ol class="arabic simple">
<li>Check if discussion is enabled globally in the plone.app.discussion
registry/control panel.</li>
<li>If the current content object is a folder, always return False, since
we don&#8217;t allow comments on a folder. This setting is used to allow/
disallow comments for all content objects inside a folder, not for
the folder itself.</li>
<li>Check if the allow_discussion boolean flag on the content object is
set. If it is set to True or False, return the value. If it set to
None, try further.</li>
<li>Traverse to a folder with allow_discussion set to either True or
False. If allow_discussion is not set (None), traverse further until
we reach the PloneSiteRoot.</li>
<li>Check if discussion is allowed for the content type.</li>
</ol>
</dd></dl>
<dl class="method">
<dt id="IConversation.getThreads">
<tt class="descname">getThreads</tt><big>(</big><em>start=0</em>, <em>size=None</em>, <em>root=0</em>, <em>depth=None</em><big>)</big><a class="headerlink" href="#IConversation.getThreads" title="Permalink to this definition"></a></dt>
<dd><p>Return a batch of comment objects for rendering.</p>
<p>The &#8216;start&#8217; parameter is the id of the comment from which to start
the batch. If no such comment exists, the next higher id will be used.
This means that you can use max key from a previous batch + 1 safely.
This should be a root level comment.</p>
<p>The &#8216;size&#8217; parameter is the number of threads to return in the
batch. Full threads are always returned (although you can stop
consuming the iterator if you want to abort).</p>
<p>&#8216;root&#8217;, if given, is the id of the comment to which reply
threads will be found. &#8216;root&#8217; itself is not included. If not given,
all threads are returned.</p>
<p>If &#8216;depth&#8217; is given, it can be used to limit the depth of threads
returned. For example, depth=1 will return only direct replies.</p>
<p>Comments are returned as an iterator of dicts with keys &#8216;comment&#8217;,
the comment, &#8216;id&#8217;, the comment id, and &#8216;depth&#8217;, which is 0 for
top-level comments, 1 for their replies, and so on. The list is
returned in depth-first order.</p>
</dd></dl>
<dl class="method">
<dt id="IConversation.addComment">
<tt class="descname">addComment</tt><big>(</big><em>comment</em><big>)</big><a class="headerlink" href="#IConversation.addComment" title="Permalink to this definition"></a></dt>
<dd>Adds a new comment to the list of comments, and returns the
comment id that was assigned. The comment_id property on the comment
will be set accordingly.</dd></dl>
<dl class="attribute">
<dt id="IConversation.commentators">
<tt class="descname">commentators</tt><a class="headerlink" href="#IConversation.commentators" title="Permalink to this definition"></a></dt>
<dd>The set of unique commentators (usernames)</dd></dl>
</dd></dl>
<dl class="interface">
<dt id="plone.app.discussion.interfaces.IReplies">
<em class="property">interface </em><tt class="descclassname">plone.app.discussion.interfaces.</tt><tt class="descname">IReplies</tt><a class="headerlink" href="#plone.app.discussion.interfaces.IReplies" title="Permalink to this definition"></a></dt>
<dd><p>Extends: <tt class="xref docutils literal"><span class="pre">zope.interface.common.mapping.IIterableMapping</span></tt></p>
<p>A set of related comments in reply to a given content object or
another comment.</p>
<p>Adapt a conversation or another comment to this interface to obtain the
direct replies.</p>
<dl class="method">
<dt id="IReplies.__delitem__">
<tt class="descname">__delitem__</tt><big>(</big><em>key</em><big>)</big><a class="headerlink" href="#IReplies.__delitem__" title="Permalink to this definition"></a></dt>
<dd>Delete the comment with the given key. The key is a long id.</dd></dl>
<dl class="method">
<dt id="IReplies.addComment">
<tt class="descname">addComment</tt><big>(</big><em>comment</em><big>)</big><a class="headerlink" href="#IReplies.addComment" title="Permalink to this definition"></a></dt>
<dd>Adds a new comment as a child of this comment, and returns the
comment id that was assigned. The comment_id property on the comment
will be set accordingly.</dd></dl>
</dd></dl>
<dl class="interface">
<dt id="plone.app.discussion.interfaces.IComment">
<em class="property">interface </em><tt class="descclassname">plone.app.discussion.interfaces.</tt><tt class="descname">IComment</tt><a class="headerlink" href="#plone.app.discussion.interfaces.IComment" title="Permalink to this definition"></a></dt>
<dd><p>A comment.</p>
<p>Comments are indexed in the catalog and subject to workflow and security.</p>
<dl class="attribute">
<dt id="IComment.author_username">
<tt class="descname">author_username</tt><a class="headerlink" href="#IComment.author_username" title="Permalink to this definition"></a></dt>
<dd>Name</dd></dl>
<dl class="attribute">
<dt id="IComment.modification_date">
<tt class="descname">modification_date</tt><a class="headerlink" href="#IComment.modification_date" title="Permalink to this definition"></a></dt>
<dd>Modification date</dd></dl>
<dl class="attribute">
<dt id="IComment.title">
<tt class="descname">title</tt><a class="headerlink" href="#IComment.title" title="Permalink to this definition"></a></dt>
<dd>Subject</dd></dl>
<dl class="attribute">
<dt id="IComment.author_email">
<tt class="descname">author_email</tt><a class="headerlink" href="#IComment.author_email" title="Permalink to this definition"></a></dt>
<dd>Email</dd></dl>
<dl class="attribute">
<dt id="IComment.text">
<tt class="descname">text</tt><a class="headerlink" href="#IComment.text" title="Permalink to this definition"></a></dt>
<dd>Comment</dd></dl>
<dl class="attribute">
<dt id="IComment.portal_type">
<tt class="descname">portal_type</tt><a class="headerlink" href="#IComment.portal_type" title="Permalink to this definition"></a></dt>
<dd>Portal type</dd></dl>
<dl class="attribute">
<dt id="IComment.comment_id">
<tt class="descname">comment_id</tt><a class="headerlink" href="#IComment.comment_id" title="Permalink to this definition"></a></dt>
<dd>A comment id unique to this conversation</dd></dl>
<dl class="attribute">
<dt id="IComment.author_name">
<tt class="descname">author_name</tt><a class="headerlink" href="#IComment.author_name" title="Permalink to this definition"></a></dt>
<dd>Name</dd></dl>
<dl class="attribute">
<dt id="IComment.creation_date">
<tt class="descname">creation_date</tt><a class="headerlink" href="#IComment.creation_date" title="Permalink to this definition"></a></dt>
<dd>Creation date</dd></dl>
<dl class="attribute">
<dt id="IComment.mime_type">
<tt class="descname">mime_type</tt><a class="headerlink" href="#IComment.mime_type" title="Permalink to this definition"></a></dt>
<dd>MIME type</dd></dl>
<dl class="attribute">
<dt id="IComment.__name__">
<tt class="descname">__name__</tt><a class="headerlink" href="#IComment.__name__" title="Permalink to this definition"></a></dt>
<dd>Name</dd></dl>
<dl class="attribute">
<dt id="IComment.in_reply_to">
<tt class="descname">in_reply_to</tt><a class="headerlink" href="#IComment.in_reply_to" title="Permalink to this definition"></a></dt>
<dd>Id of comment this comment is in reply to</dd></dl>
<dl class="attribute">
<dt id="IComment.creator">
<tt class="descname">creator</tt><a class="headerlink" href="#IComment.creator" title="Permalink to this definition"></a></dt>
<dd>Author name (for display)</dd></dl>
<dl class="attribute">
<dt id="IComment.__parent__">
<tt class="descname">__parent__</tt><a class="headerlink" href="#IComment.__parent__" title="Permalink to this definition"></a></dt>
<dd>Conversation</dd></dl>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="design.html"
title="previous chapter">Design Notes</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/api.txt"
rel="nofollow">Show Source</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="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="design.html" title="Design Notes"
>previous</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2010, Timo Stollenwerk.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.4.
</div>
</body>
</html>

View File

@ -30,9 +30,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
accesskey="M">modules</a> |</li>
<li class="right" >
<a href="design.html" title="Design Notes"
accesskey="N">next</a> |</li>
@ -58,29 +55,29 @@ plone.app.discussion.</p>
<dd>This makes it easier to search for them and manage them using existing
CMF and Plone UI constructs.</dd>
<dt><strong>Discussion items are cataloged</strong></dt>
<dd>It is be possible to search for discussion items like any other type of
<dd>It is possible to search for discussion items like any other type of
content.</dd>
<dt><strong>Discussion items are subject to workflow and permission</strong></dt>
<dd>Moderation, anonymous commenting, and auto approve/reject should be
handled using workflow states, automatic and manual transitions, and
permissions.</dd>
<dt><strong>Discussion items are light weight objects</strong></dt>
<dd>Discussion item objects are as light weight as possible.
Ideally, a discussion item should be as lightweight as a catalog brain.
This may mean that we forego convenience base classes and re-implement
certain interfaces. Comments should not provide the full set of dublin
core metadata, though custom indexers can be used to provide values for
standard catalog indexes.</dd>
<dd>Discussion item objects are as light weight as possible. Ideally, a
discussion item should be as lightweight as a catalog brain. This may mean
that we forego convenience base classes and re-implement certain interfaces.
Comments should not provide the full set of dublin core metadata, though
custom indexers can be used to provide values for standard catalog indexes.</dd>
<dt><strong>Optimise for retrival speed</strong></dt>
<dd>HTML filtering and other processing should happen on save, not on render,
to make rendering quick.</dd>
<dt><strong>Settings are stored using plone.registry</strong></dt>
<dd>Any global setting should be stored in plone.registry records</dd>
<dd>Any global setting should be stored in plone.registry records.</dd>
<dt><strong>Forms are constructed using extensible z3c.form forms</strong></dt>
<dd>This allows plugins (such as spam protection algorithms) to provide
additional validation</dd>
additional validation. It also allows integrators to write add-ons that add
new fields to the comment form.</dd>
<dt><strong>Discussion items are stored in a BTree container</strong></dt>
<dd>This allows faster lookup and manipulation</dd>
<dd>This allows faster lookup and manipulation.</dd>
<dt><strong>Discussion items are accessed using a dict-like interface</strong></dt>
<dd>This makes iteration and manipulation more natural. Even if comments are
not stored threaded, the dict interface should act as if they are, i.e.
@ -139,9 +136,6 @@ discussion items are added, removed, or modified.</dd>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
>modules</a> |</li>
<li class="right" >
<a href="design.html" title="Design Notes"
>next</a> |</li>

View File

@ -5,7 +5,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Global Module Index &mdash; plone.app.discussion v1.0b4 documentation</title>
<title>Captcha Plugin Architecture &mdash; plone.app.discussion v1.0b4 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">
@ -19,10 +19,7 @@
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="plone.app.discussion v1.0b4 documentation" href="index.html" />
<link rel="top" title="plone.app.discussion v1.0b4 documentation" href="index.html" />
</head>
<body>
<div class="related">
@ -31,9 +28,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="#" title="Global Module Index"
accesskey="M">modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>
@ -43,23 +37,34 @@
<div class="bodywrapper">
<div class="body">
<div class="section" id="captcha-plugin-architecture">
<h1>Captcha Plugin Architecture<a class="headerlink" href="#captcha-plugin-architecture" title="Permalink to this headline"></a></h1>
<p>This document contains design notes for the plone.app.discussion Captcha plugin
architecture. It also explains how to write your own Captcha plugin (???).</p>
<p>Currently there are two plugins that work with plone.app.discussion:</p>
<blockquote>
<ol class="arabic simple">
<li>plone.formwidget.captcha</li>
<li>plone.formwidget.recaptcha</li>
</ol>
</blockquote>
<ol class="arabic simple">
<li>Captcha plugin must provide the feature &#8220;plone.app.discussion-captcha&#8221;:</li>
</ol>
<p>Add this to your configure.zcml:</p>
<div class="highlight-python"><pre>&lt;configure ...
xmlns:meta="http://namespaces.zope.org/meta"&gt;
&lt;!-- Declare that plone.formwidget.captcha provides a Captcha field that
can be used by plone.app.discussion to add a Captcha field to comment
forms. --&gt;
&lt;meta:provides feature="plone.app.discussion-captcha" /&gt;
<h1 id="global-module-index">Global Module Index</h1>
<a href="#cap-P"><strong>P</strong></a>
<hr/>
<table width="100%" class="indextable" cellspacing="0" cellpadding="2"><tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
<tr class="cap"><td></td><td><a name="cap-P"><strong>P</strong></a></td><td></td></tr><tr>
<td><img src="_static/minus.png" id="toggle-1"
class="toggler" style="display: none" alt="-" /></td>
<td>
<tt class="xref">plone</tt></td><td>
<em></em></td></tr><tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="index.html#module-plone.app.discussion"><tt class="xref">plone.app.discussion</tt></a></td><td>
<em></em></td></tr>
</table>
...
&lt;/configure&gt;</pre>
</div>
<p>For examples have a look at plone.formwidget.captcha</p>
<p><a class="reference external" href="https://svn.plone.org/svn/plone/plone.formwidget.captcha/trunk/plone/formwidget/captcha/configure.zcml">https://svn.plone.org/svn/plone/plone.formwidget.captcha/trunk/plone/formwidget/captcha/configure.zcml</a></p>
</div>
</div>
@ -67,6 +72,11 @@
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/captcha.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
@ -90,9 +100,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="#" title="Global Module Index"
>modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>

View File

@ -20,6 +20,7 @@
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="plone.app.discussion v1.0b4 documentation" href="index.html" />
<link rel="next" title="API/Interfaces" href="api.html" />
<link rel="prev" title="Architectural Principles" href="architecture.html" />
</head>
<body>
@ -30,8 +31,8 @@
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
accesskey="M">modules</a> |</li>
<a href="api.html" title="API/Interfaces"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="architecture.html" title="Architectural Principles"
accesskey="P">previous</a> |</li>
@ -219,19 +220,18 @@ an auto-moderation &#8216;white-list&#8217;, e.g. by email address or username.<
</div>
<div class="section" id="forms-and-ui">
<h2>Forms and UI<a class="headerlink" href="#forms-and-ui" title="Permalink to this headline"></a></h2>
<p>The basic commenting display/reply form should be placed in a viewlet.</p>
<p>Ideally, the reply form should be inline, perhaps revealed with JavaScript
if enabled. This allows full contextualisation of replies. The current
solution, with a separate form that shows some context, is brittle and
over-complicated.</p>
<p>If we support quoting of comments in replies, we can load the text to quote
using JavaScript as well.</p>
<p>As a fall-back for non-JavaScript enabled browsers, it is probably OK not to
support quoting and/or viewing of context, e.g. the user is taken to a standalone
&#8216;comment reply&#8217; form.</p>
<p>All actual forms should be handled using z3c.form and plone.z3cform&#8217;s
ExtensibleForm support. This makes it possible to plug in additional fields
declaratively, e.g. to include spam protection.</p>
<p>The basic commenting display/reply form is placed in a viewlet.</p>
<p>The reply form is dynamically created right under the comment when the user hits
the reply button. To do so, we copy the standard comment form with a jQuery
function. This function sets the form&#8217;s hidden in_reply_to field to the id of
the comment the user wants to reply to. This also makes is possible to use
z3c.form validation for the reply forms, because we can uniquely identify the
a reply form request and return the reply form with validation errors.</p>
<p>Since we rely on JavaScript for the reply form creation, the reply button is
removed for nonJavaScript enabled browsers.</p>
<p>The comment form uses z3c.form and plone.z3cform&#8217;s ExtensibleForm support. This
makes it possible to plug in additional fields declaratively, e.g. to include
SPAM protection.</p>
</div>
</div>
@ -258,6 +258,9 @@ declaratively, e.g. to include spam protection.</p>
<h4>Previous topic</h4>
<p class="topless"><a href="architecture.html"
title="previous chapter">Architectural Principles</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="api.html"
title="next chapter">API/Interfaces</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/design.txt"
@ -287,8 +290,8 @@ declaratively, e.g. to include spam protection.</p>
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
>modules</a> |</li>
<a href="api.html" title="API/Interfaces"
>next</a> |</li>
<li class="right" >
<a href="architecture.html" title="Architectural Principles"
>previous</a> |</li>

View File

@ -28,9 +28,6 @@
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
accesskey="M">modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>
@ -43,30 +40,100 @@
<h1 id="index">Index</h1>
<a href="#C"><strong>C</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#P"><strong>P</strong></a>
<a href="#_"><strong>_</strong></a> | <a href="#A"><strong>A</strong></a> | <a href="#C"><strong>C</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#G"><strong>G</strong></a> | <a href="#I"><strong>I</strong></a> | <a href="#L"><strong>L</strong></a> | <a href="#M"><strong>M</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#T"><strong>T</strong></a>
<hr />
<h2 id="_">_</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IConversation.__delitem__">__delitem__() (IConversation method)</a></dt>
<dd><dl>
<dt><a href="api.html#IReplies.__delitem__">(IReplies method)</a></dt>
</dl></dd>
<dt><a href="api.html#IComment.__name__">__name__ (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IComment.__parent__">__parent__ (IComment attribute)</a></dt>
</dl></td></tr></table>
<h2 id="A">A</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IConversation.addComment">addComment() (IConversation method)</a></dt>
<dd><dl>
<dt><a href="api.html#IReplies.addComment">(IReplies method)</a></dt>
</dl></dd>
<dt><a href="api.html#IComment.author_email">author_email (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IComment.author_name">author_name (IComment attribute)</a></dt>
<dt><a href="api.html#IComment.author_username">author_username (IComment attribute)</a></dt>
</dl></td></tr></table>
<h2 id="C">C</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="index.html#plone.app.discussion.conversation.Conversation">Conversation (class in plone.app.discussion.conversation)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IComment.comment_id">comment_id (IComment attribute)</a></dt>
<dt><a href="api.html#IConversation.commentators">commentators (IConversation attribute)</a></dt>
<dt><a href="api.html#IComment.creation_date">creation_date (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IComment.creator">creator (IComment attribute)</a></dt>
</dl></td></tr></table>
<h2 id="E">E</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="index.html#plone.app.discussion.conversation.Conversation.enabled">enabled() (plone.app.discussion.conversation.Conversation method)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IConversation.enabled">enabled() (IConversation method)</a></dt></dl></td><td width="33%" valign="top"><dl>
</dl></td></tr></table>
<h2 id="G">G</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IConversation.getComments">getComments() (IConversation method)</a></dt>
<dt><a href="api.html#IConversation.getThreads">getThreads() (IConversation method)</a></dt></dl></td><td width="33%" valign="top"><dl>
</dl></td></tr></table>
<h2 id="I">I</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#plone.app.discussion.interfaces.IComment">IComment (interface in plone.app.discussion.interfaces)</a></dt>
<dt><a href="api.html#plone.app.discussion.interfaces.IConversation">IConversation (interface in plone.app.discussion.interfaces)</a></dt>
<dt><a href="api.html#IComment.in_reply_to">in_reply_to (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#plone.app.discussion.interfaces.IReplies">IReplies (interface in plone.app.discussion.interfaces)</a></dt>
</dl></td></tr></table>
<h2 id="L">L</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IConversation.last_comment_date">last_comment_date (IConversation attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
</dl></td></tr></table>
<h2 id="M">M</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IComment.mime_type">mime_type (IComment attribute)</a></dt>
<dt><a href="api.html#IComment.modification_date">modification_date (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
</dl></td></tr></table>
<h2 id="P">P</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="index.html#module-plone.app.discussion">plone.app.discussion (module)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IComment.portal_type">portal_type (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
</dl></td></tr></table>
<h2 id="T">T</h2>
<table width="100%" class="indextable"><tr><td width="33%" valign="top">
<dl>
<dt><a href="api.html#IComment.text">text (IComment attribute)</a></dt>
<dt><a href="api.html#IComment.title">title (IComment attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
<dt><a href="api.html#IConversation.total_comments">total_comments (IConversation attribute)</a></dt>
</dl></td></tr></table>
@ -102,9 +169,6 @@
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
>index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
>modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>

View File

@ -29,9 +29,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
accesskey="M">modules</a> |</li>
<li class="right" >
<a href="architecture.html" title="Architectural Principles"
accesskey="N">next</a> |</li>
@ -59,31 +56,44 @@
<li class="toctree-l2"><a class="reference external" href="design.html#forms-and-ui">Forms and UI</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference external" href="api.html">API/Interfaces</a></li>
</ul>
<div class="section" id="module-plone.app.discussion">
<h2>API<a class="headerlink" href="#module-plone.app.discussion" title="Permalink to this headline"></a></h2>
<dl class="class">
<dt id="plone.app.discussion.conversation.Conversation">
<em class="property">class </em><tt class="descclassname">plone.app.discussion.conversation.</tt><tt class="descname">Conversation</tt><big>(</big><em>id='++conversation++default'</em><big>)</big><a class="headerlink" href="#plone.app.discussion.conversation.Conversation" title="Permalink to this definition"></a></dt>
<dd><p>A conversation is a container for all comments on a content object.</p>
<p>It manages internal data structures for comment threading and efficient
comment lookup.</p>
<dl class="method">
<dt id="plone.app.discussion.conversation.Conversation.enabled">
<tt class="descname">enabled</tt><big>(</big><big>)</big><a class="headerlink" href="#plone.app.discussion.conversation.Conversation.enabled" title="Permalink to this definition"></a></dt>
<dd>hi world</dd></dl>
</dd></dl>
</div>
</div>
<div class="section" id="changelog">
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline"></a></h1>
<div class="section" id="b4-unreleased">
<h2>1.0b4 (unreleased)<a class="headerlink" href="#b4-unreleased" title="Permalink to this headline"></a></h2>
<div class="section" id="b5-unreleased">
<h2>1.0b5 (unreleased)<a class="headerlink" href="#b5-unreleased" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Fix #662654: As an administrator, I can configure a Collection to show recent comments.
Comment.Type() now correctly returns the FTI title (&#8216;Comment&#8217;)
<li>Fix encoding error in migration procedure, otherwise migration procedure
breaks on joining output list in case we have there any non-ascii characters.
[piv]</li>
<li>plone.z3cform 0.6.0 compatibility (fix maximum recursion depth error which
appears with plone.z3cform higher than 0.5.10).
[piv]</li>
<li>Removed moderation.js from js registry and include it only in moderation.pt as
that is the only place where it is used.
[ggozad]</li>
</ul>
</div>
<div class="section" id="b4-2010-04-04">
<h2>1.0b4 (2010-04-04)<a class="headerlink" href="#b4-2010-04-04" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>New feature: As a moderator, I am notified when new comments require my
attention.
[timo]</li>
<li>Sphinx-based developer documentation added. See
<a class="reference external" href="http://packages.python.org/plone.app.discussion">http://packages.python.org/plone.app.discussion</a>.
[timo]</li>
<li>Rename &#8220;Single State Workflow&#8221; to &#8220;Comment Single State Workflow&#8221;.
[timo]</li>
<li>Rename &#8216;publish comment&#8217; to &#8216;approve comment&#8217;. This fixes #1608470.
[timo]</li>
<li>Show a warning in the moderation view if the moderation workflow is disabled.
[timo]</li>
<li>Move &#8216;Moderate comments&#8217; link from site actions to user actions.
[timo]</li>
<li>Fix #662654: As an administrator, I can configure a Collection to show recent
comments. Comment.Type() now correctly returns the FTI title (&#8216;Comment&#8217;)
[chaoflow]</li>
<li>German translation updated.
[juh]</li>
@ -97,15 +107,15 @@ translated button titles can differ in size from the English titles.
<li>Fix unicode error when non-ASCII characters are typed into the name field of a
comment by anonymous users.
[regebro]</li>
<li>New feature: As a moderator, I am notified when new comments require my
attention.
[timo]</li>
<li>Make p.a.d. work with the recent version of plone.z3cform (0.5.10)
[timo]</li>
<li>Make p.a.d. styles less generic. This fixes #10253.
[timo]</li>
<li>Added greek translation.
[ggozad]</li>
<li>A bug in the moderator panel meant you couldn&#8217;t delete items in a virtual
host, if your portal was named &#8220;plone&#8221;.
[regebro]</li>
</ul>
</div>
<div class="section" id="b3-2010-01-28">
@ -158,42 +168,58 @@ have this workflow installed.
<h2>1.0b2 (2010-01-22)<a class="headerlink" href="#b2-2010-01-22" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Bugfix for #2010181: The name of a commenter who commented while not logged in
should not appear as a link.</li>
should not appear as a link.
[timo]</li>
<li>Bugfix for #2010078: Comments that await moderation are visually distinguished
from published comments.</li>
from published comments.
[timo]</li>
<li>Bugfix for #2010085: Use object_provides instead of portal_type to query the
catalog for comment.</li>
catalog for comment.
[timo]</li>
<li>Bugfix for #2010071: p.a.d. works with plone.z3cform 0.5.7 and
plone.app.z3cform 0.4.9 now.</li>
plone.app.z3cform 0.4.9 now.
[timo]</li>
<li>Bugfix for #1513398: Show &#8220;anonymous&#8221; when name field is empty in comment
form.</li>
form.
[timo]</li>
<li>Migration view: Dry run option added, abort transaction when something goes
wrong during migration, be more verbose about errors.</li>
wrong during migration, be more verbose about errors.
[timo]</li>
</ul>
</div>
<div class="section" id="b1-2009-12-08">
<h2>1.0b1 (2009-12-08)<a class="headerlink" href="#b1-2009-12-08" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Fix redirect after a adding a comment</li>
<li>Replace yes/no widgets with check boxes in the discussion control panel</li>
<li>Make comments viewlet show up in Plone 4</li>
<li>Apply Plone 4 styles to comment form</li>
<li>Simplify moderation view by removing the filters</li>
<li>Fix redirect after a adding a comment
[timo]</li>
<li>Replace yes/no widgets with check boxes in the discussion control panel
[timo]</li>
<li>Make comments viewlet show up in Plone 4
[timo]</li>
<li>Apply Plone 4 styles to comment form
[timo]</li>
<li>Simplify moderation view by removing the filters
[timo]</li>
</ul>
</div>
<div class="section" id="a2-2009-10-18">
<h2>1.0a2 (2009-10-18)<a class="headerlink" href="#a2-2009-10-18" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Plone 4 / Zope 2.12 support</li>
<li>Comment migration script added</li>
<li>Pluggable plone.z3cform comment forms</li>
<li>Captcha and ReCaptcha support added</li>
<li>Plone 4 / Zope 2.12 support
[timo]</li>
<li>Comment migration script added
[timo]</li>
<li>Pluggable plone.z3cform comment forms
[timo]</li>
<li>Captcha and ReCaptcha support added
[timo]</li>
</ul>
</div>
<div class="section" id="a1-2009-06-07">
<h2>1.0a1 (2009-06-07)<a class="headerlink" href="#a1-2009-06-07" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Basic commenting functionality and batch moderation.</li>
<li>Basic commenting functionality and batch moderation.
[timo]</li>
</ul>
</div>
</div>
@ -215,11 +241,11 @@ wrong during migration, be more verbose about errors.</li>
<h3><a href="#">Table Of Contents</a></h3>
<ul>
<li><a class="reference external" href="#">Welcome to plone.app.discussion&#8217;s documentation!</a><ul>
<li><a class="reference external" href="#module-plone.app.discussion">API</a></li>
</ul>
</li>
<li><a class="reference external" href="#changelog">Changelog</a><ul>
<li><a class="reference external" href="#b4-unreleased">1.0b4 (unreleased)</a></li>
<li><a class="reference external" href="#b5-unreleased">1.0b5 (unreleased)</a></li>
<li><a class="reference external" href="#b4-2010-04-04">1.0b4 (2010-04-04)</a></li>
<li><a class="reference external" href="#b3-2010-01-28">1.0b3 (2010-01-28)</a></li>
<li><a class="reference external" href="#b2-2010-01-22">1.0b2 (2010-01-22)</a></li>
<li><a class="reference external" href="#b1-2009-12-08">1.0b1 (2009-12-08)</a></li>
@ -261,9 +287,6 @@ wrong during migration, be more verbose about errors.</li>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
>modules</a> |</li>
<li class="right" >
<a href="architecture.html" title="Architectural Principles"
>next</a> |</li>

View File

@ -1,6 +1,30 @@
# Sphinx inventory version 1
# Project: plone.app.discussion
# Version: 1.0b4
plone.app.discussion mod index.html
plone.app.discussion.conversation.Conversation class index.html
plone.app.discussion.conversation.Conversation.enabled method index.html
IConversation.getComments method api.html
IComment.title attribute api.html
IComment.modification_date attribute api.html
IConversation.getThreads method api.html
IComment.comment_id attribute api.html
plone.app.discussion.interfaces.IReplies interface api.html
IConversation.enabled method api.html
plone.app.discussion.interfaces.IComment interface api.html
IComment.creator attribute api.html
IComment.author_email attribute api.html
IComment.author_name attribute api.html
IConversation.__delitem__ method api.html
IComment.creation_date attribute api.html
IConversation.total_comments attribute api.html
IComment.__parent__ attribute api.html
IComment.in_reply_to attribute api.html
IComment.__name__ attribute api.html
IComment.text attribute api.html
plone.app.discussion.interfaces.IConversation interface api.html
IComment.author_username attribute api.html
IConversation.last_comment_date attribute api.html
IComment.portal_type attribute api.html
IComment.mime_type attribute api.html
IReplies.addComment method api.html
IConversation.commentators attribute api.html
IConversation.addComment method api.html
IReplies.__delitem__ method api.html

View File

@ -29,9 +29,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
accesskey="M">modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>
@ -80,9 +77,6 @@
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="modindex.html" title="Global Module Index"
>modules</a> |</li>
<li><a href="index.html">plone.app.discussion v1.0b4 documentation</a> &raquo;</li>
</ul>
</div>

File diff suppressed because one or more lines are too long