diff --git a/docs/html/_sources/api.txt b/docs/html/_sources/api.txt new file mode 100644 index 0000000..31819ab --- /dev/null +++ b/docs/html/_sources/api.txt @@ -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: + + + \ No newline at end of file diff --git a/docs/html/_sources/architecture.txt b/docs/html/_sources/architecture.txt index 1e2de51..c99a265 100644 --- a/docs/html/_sources/architecture.txt +++ b/docs/html/_sources/architecture.txt @@ -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 diff --git a/docs/html/_sources/captcha.txt b/docs/html/_sources/captcha.txt new file mode 100644 index 0000000..c4426cf --- /dev/null +++ b/docs/html/_sources/captcha.txt @@ -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:: + + + + + + ... + + +For examples have a look at plone.formwidget.captcha + +https://svn.plone.org/svn/plone/plone.formwidget.captcha/trunk/plone/formwidget/captcha/configure.zcml + diff --git a/docs/html/_sources/design.txt b/docs/html/_sources/design.txt index 20079a9..b2a6577 100644 --- a/docs/html/_sources/design.txt +++ b/docs/html/_sources/design.txt @@ -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. diff --git a/docs/html/_sources/index.txt b/docs/html/_sources/index.txt index 0e152d2..d107d98 100644 --- a/docs/html/_sources/index.txt +++ b/docs/html/_sources/index.txt @@ -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 ================== diff --git a/docs/html/api.html b/docs/html/api.html new file mode 100644 index 0000000..45fbde2 --- /dev/null +++ b/docs/html/api.html @@ -0,0 +1,306 @@ + + + + + + + API/Interfaces — plone.app.discussion v1.0b4 documentation + + + + + + + + + + + +
+
+
+
+ +
+

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).

+
+
+interface plone.app.discussion.interfaces.IConversation
+

Extends: zope.interface.common.mapping.IIterableMapping

+

A conversation about a content object.

+

This is a persistent object in its own right and manages all comments.

+

The dict interface allows access to all comments. They are stored by +long integer key, in the order they were added.

+

Note that __setitem__() is not supported - use addComment() instead. +However, comments can be deleted using __delitem__().

+

To get replies at the top level, adapt the conversation to IReplies.

+

The conversation can be traversed to via the ++comments++ namespace. +For example, path/to/object/++comments++/123 retrieves comment 123.

+

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.

+
+
+__delitem__(key)
+
Delete the comment with the given key. The key is a long id.
+ +
+
+last_comment_date
+
Date of the most recent comment
+ +
+
+total_comments
+
Total number of comments on this item
+ +
+
+getComments(start=0, size=None)
+

Return an iterator of comment objects for rendering.

+

The ‘start’ 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.

+

The ‘size’ parameter is the number of comments to return in the +batch.

+

The comments are returned in creation date order, in the exact batch +size specified.

+
+ +
+
+enabled()
+

Returns True if discussion is enabled for this conversation.

+

This method checks five different settings in order to figure out if +discussion is enable on a specific content object:

+
    +
  1. Check if discussion is enabled globally in the plone.app.discussion +registry/control panel.
  2. +
  3. If the current content object is a folder, always return False, since +we don’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.
  4. +
  5. 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.
  6. +
  7. 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.
  8. +
  9. Check if discussion is allowed for the content type.
  10. +
+
+ +
+
+getThreads(start=0, size=None, root=0, depth=None)
+

Return a batch of comment objects for rendering.

+

The ‘start’ 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.

+

The ‘size’ 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).

+

‘root’, if given, is the id of the comment to which reply +threads will be found. ‘root’ itself is not included. If not given, +all threads are returned.

+

If ‘depth’ is given, it can be used to limit the depth of threads +returned. For example, depth=1 will return only direct replies.

+

Comments are returned as an iterator of dicts with keys ‘comment’, +the comment, ‘id’, the comment id, and ‘depth’, which is 0 for +top-level comments, 1 for their replies, and so on. The list is +returned in depth-first order.

+
+ +
+
+addComment(comment)
+
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.
+ +
+
+commentators
+
The set of unique commentators (usernames)
+ +
+ +
+
+interface plone.app.discussion.interfaces.IReplies
+

Extends: zope.interface.common.mapping.IIterableMapping

+

A set of related comments in reply to a given content object or +another comment.

+

Adapt a conversation or another comment to this interface to obtain the +direct replies.

+
+
+__delitem__(key)
+
Delete the comment with the given key. The key is a long id.
+ +
+
+addComment(comment)
+
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.
+ +
+ +
+
+interface plone.app.discussion.interfaces.IComment
+

A comment.

+

Comments are indexed in the catalog and subject to workflow and security.

+
+
+author_username
+
Name
+ +
+
+modification_date
+
Modification date
+ +
+
+title
+
Subject
+ +
+
+author_email
+
Email
+ +
+
+text
+
Comment
+ +
+
+portal_type
+
Portal type
+ +
+
+comment_id
+
A comment id unique to this conversation
+ +
+
+author_name
+
Name
+ +
+
+creation_date
+
Creation date
+ +
+
+mime_type
+
MIME type
+ +
+
+__name__
+
Name
+ +
+
+in_reply_to
+
Id of comment this comment is in reply to
+ +
+
+creator
+
Author name (for display)
+ +
+
+__parent__
+
Conversation
+ +
+ +
+ + +
+
+
+
+
+

Previous topic

+

Design Notes

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/architecture.html b/docs/html/architecture.html index 7809648..d7a9b9e 100644 --- a/docs/html/architecture.html +++ b/docs/html/architecture.html @@ -30,9 +30,6 @@
  • index
  • -
  • - modules |
  • next |
  • @@ -58,29 +55,29 @@ plone.app.discussion.

    This makes it easier to search for them and manage them using existing 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
    Moderation, anonymous commenting, and auto approve/reject should be handled using workflow states, automatic and manual transitions, and 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 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.
  • index
  • -
  • - modules |
  • next |
  • diff --git a/docs/html/modindex.html b/docs/html/captcha.html similarity index 60% rename from docs/html/modindex.html rename to docs/html/captcha.html index 2e43beb..f0e732e 100644 --- a/docs/html/modindex.html +++ b/docs/html/captcha.html @@ -5,7 +5,7 @@ - Global Module Index — plone.app.discussion v1.0b4 documentation + Captcha Plugin Architecture — plone.app.discussion v1.0b4 documentation - - - - + @@ -43,23 +37,34 @@
    +
    +

    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. +
    3. plone.formwidget.recaptcha
    4. +
    +
    +
      +
    1. Captcha plugin must provide the feature “plone.app.discussion-captcha”:
    2. +
    +

    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" />
     
    -   

    Global Module Index

    - P -
    - - - - - - - -
     
    P
    - plone -
        - plone.app.discussion -
    + ... +</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

    +
    @@ -67,6 +72,11 @@
    +

    This Page

    + diff --git a/docs/html/design.html b/docs/html/design.html index 2379a13..53ad19b 100644 --- a/docs/html/design.html +++ b/docs/html/design.html @@ -20,6 +20,7 @@ + @@ -30,8 +31,8 @@ index
  • - modules |
  • + next |
  • previous |
  • @@ -219,19 +220,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.

    -

    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.

    -

    If we support quoting of comments in replies, we can load the text to quote -using JavaScript as well.

    -

    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 basic commenting display/reply form is placed in a viewlet.

    +

    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.

    +

    Since we rely on JavaScript for the reply form creation, the reply button is +removed for nonJavaScript enabled browsers.

    +

    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.

    @@ -258,6 +258,9 @@ declaratively, e.g. to include spam protection.

    Previous topic

    Architectural Principles

    +

    Next topic

    +

    API/Interfaces

    This Page

    @@ -43,30 +40,100 @@

    Index

    - C | E | P + _ | A | C | E | G | I | L | M | P | T
    +

    _

    +
    +
    + +
    __delitem__() (IConversation method)
    +
    +
    (IReplies method)
    +
    +
    __name__ (IComment attribute)
    +
    __parent__ (IComment attribute)
    +
    + +

    A

    +
    +
    + +
    addComment() (IConversation method)
    +
    +
    (IReplies method)
    +
    +
    author_email (IComment attribute)
    +
    author_name (IComment attribute)
    +
    author_username (IComment attribute)
    +
    +

    C

    -
    Conversation (class in plone.app.discussion.conversation)
    +
    comment_id (IComment attribute)
    +
    commentators (IConversation attribute)
    +
    creation_date (IComment attribute)
    +
    creator (IComment attribute)

    E

    -
    enabled() (plone.app.discussion.conversation.Conversation method)
    +
    enabled() (IConversation method)
    +
    + +

    G

    +
    +
    + +
    getComments() (IConversation method)
    +
    getThreads() (IConversation method)
    +
    + +

    I

    +
    +
    + +
    IComment (interface in plone.app.discussion.interfaces)
    +
    IConversation (interface in plone.app.discussion.interfaces)
    +
    in_reply_to (IComment attribute)
    +
    IReplies (interface in plone.app.discussion.interfaces)
    +
    + +

    L

    +
    +
    + +
    last_comment_date (IConversation attribute)
    +
    + +

    M

    +
    +
    + +
    mime_type (IComment attribute)
    +
    modification_date (IComment attribute)

    P

    -
    plone.app.discussion (module)
    +
    portal_type (IComment attribute)
    +
    + +

    T

    +
    +
    + +
    text (IComment attribute)
    +
    title (IComment attribute)
    +
    total_comments (IConversation attribute)
    @@ -102,9 +169,6 @@
  • index
  • -
  • - modules |
  • plone.app.discussion v1.0b4 documentation »
  • diff --git a/docs/html/index.html b/docs/html/index.html index 66e4b6b..7cc328e 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -29,9 +29,6 @@
  • index
  • -
  • - modules |
  • next |
  • @@ -59,31 +56,44 @@
  • Forms and UI
  • +
  • API/Interfaces
  • -
    -

    API

    -
    -
    -class plone.app.discussion.conversation.Conversation(id='++conversation++default')
    -

    A conversation is a container for all comments on a content object.

    -

    It manages internal data structures for comment threading and efficient -comment lookup.

    -
    -
    -enabled()
    -
    hi world
    - -
    - -

    Changelog

    -
    -

    1.0b4 (unreleased)

    +
    +

    1.0b5 (unreleased)

      -
    • Fix #662654: As an administrator, I can configure a Collection to show recent comments. -Comment.Type() now correctly returns the FTI title (‘Comment’) +
    • Fix encoding error in migration procedure, otherwise migration procedure +breaks on joining output list in case we have there any non-ascii characters. +[piv]
    • +
    • plone.z3cform 0.6.0 compatibility (fix maximum recursion depth error which +appears with plone.z3cform higher than 0.5.10). +[piv]
    • +
    • Removed moderation.js from js registry and include it only in moderation.pt as +that is the only place where it is used. +[ggozad]
    • +
    +
    +
    +

    1.0b4 (2010-04-04)

    +
      +
    • New feature: As a moderator, I am notified when new comments require my +attention. +[timo]
    • +
    • Sphinx-based developer documentation added. See +http://packages.python.org/plone.app.discussion. +[timo]
    • +
    • Rename “Single State Workflow” to “Comment Single State Workflow”. +[timo]
    • +
    • Rename ‘publish comment’ to ‘approve comment’. This fixes #1608470. +[timo]
    • +
    • Show a warning in the moderation view if the moderation workflow is disabled. +[timo]
    • +
    • Move ‘Moderate comments’ link from site actions to user actions. +[timo]
    • +
    • Fix #662654: As an administrator, I can configure a Collection to show recent +comments. Comment.Type() now correctly returns the FTI title (‘Comment’) [chaoflow]
    • German translation updated. [juh]
    • @@ -97,15 +107,15 @@ translated button titles can differ in size from the English titles.
    • Fix unicode error when non-ASCII characters are typed into the name field of a comment by anonymous users. [regebro]
    • -
    • New feature: As a moderator, I am notified when new comments require my -attention. -[timo]
    • Make p.a.d. work with the recent version of plone.z3cform (0.5.10) [timo]
    • Make p.a.d. styles less generic. This fixes #10253. [timo]
    • Added greek translation. [ggozad]
    • +
    • A bug in the moderator panel meant you couldn’t delete items in a virtual +host, if your portal was named “plone”. +[regebro]
    @@ -158,42 +168,58 @@ have this workflow installed.

    1.0b2 (2010-01-22)

    • Bugfix for #2010181: The name of a commenter who commented while not logged in -should not appear as a link.
    • +should not appear as a link. +[timo]
    • Bugfix for #2010078: Comments that await moderation are visually distinguished -from published comments.
    • +from published comments. +[timo]
    • Bugfix for #2010085: Use object_provides instead of portal_type to query the -catalog for comment.
    • +catalog for comment. +[timo]
    • Bugfix for #2010071: p.a.d. works with plone.z3cform 0.5.7 and -plone.app.z3cform 0.4.9 now.
    • +plone.app.z3cform 0.4.9 now. +[timo]
    • Bugfix for #1513398: Show “anonymous” when name field is empty in comment -form.
    • +form. +[timo]
    • Migration view: Dry run option added, abort transaction when something goes -wrong during migration, be more verbose about errors.
    • +wrong during migration, be more verbose about errors. +[timo]

    1.0b1 (2009-12-08)

      -
    • Fix redirect after a adding a comment
    • -
    • Replace yes/no widgets with check boxes in the discussion control panel
    • -
    • Make comments viewlet show up in Plone 4
    • -
    • Apply Plone 4 styles to comment form
    • -
    • Simplify moderation view by removing the filters
    • +
    • Fix redirect after a adding a comment +[timo]
    • +
    • Replace yes/no widgets with check boxes in the discussion control panel +[timo]
    • +
    • Make comments viewlet show up in Plone 4 +[timo]
    • +
    • Apply Plone 4 styles to comment form +[timo]
    • +
    • Simplify moderation view by removing the filters +[timo]

    1.0a2 (2009-10-18)

      -
    • Plone 4 / Zope 2.12 support
    • -
    • Comment migration script added
    • -
    • Pluggable plone.z3cform comment forms
    • -
    • Captcha and ReCaptcha support added
    • +
    • Plone 4 / Zope 2.12 support +[timo]
    • +
    • Comment migration script added +[timo]
    • +
    • Pluggable plone.z3cform comment forms +[timo]
    • +
    • Captcha and ReCaptcha support added +[timo]

    1.0a1 (2009-06-07)

      -
    • Basic commenting functionality and batch moderation.
    • +
    • Basic commenting functionality and batch moderation. +[timo]
    @@ -215,11 +241,11 @@ wrong during migration, be more verbose about errors.

    Table Of Contents

    @@ -80,9 +77,6 @@
  • index
  • -
  • - modules |
  • plone.app.discussion v1.0b4 documentation »
  • diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index 1aa49a4..18c0e54 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({desctypes:{"0":"class","1":"method"},terms:{represent:1,all:[0,1],chain:1,queri:0,global:[1,2],pluggabl:0,modul:0,children:1,profil:0,readabl:2,send:2,string:1,util:1,fall:1,portalcont:1,administr:0,level:1,cmf:2,itravers:1,list:1,iter:2,factori:[0,1],item:[1,2],quick:2,outlin:2,natur:2,sync:0,design:[0,1,2],further:1,btree:2,even:[1,2],index:[0,1,2],appear:0,repli:[1,2],abl:1,"while":0,access:2,delet:[0,1],version:0,"new":0,method:0,metadata:[1,2],widget:0,full:[0,1,2],gener:[0,1],updateact:0,address:1,modifi:[1,2],implicit:1,valu:[0,1,2],dry:0,search:[0,2],convers:[0,1],dublin:2,action:0,implement:[1,2],via:1,appli:0,app:[0,1,2],api:[0,1],icontentish:1,instal:0,plone:[0,1,2],"__parent__":1,from:[0,1],would:1,regist:0,handler:1,call:[1,2],taken:1,type:[0,1,2],more:[0,2],henc:1,relat:1,site:0,visual:0,actual:1,iobjectaddedev:1,must:1,retriev:[0,1,2],viewlet:[0,1],work:[0,1],annot:1,remain:1,can:[0,1,2],fetch:1,control:[0,1],complic:1,want:1,process:2,share:0,indic:0,captcha:0,abort:0,tab:1,commenttitl:0,alwai:[1,2],mai:[1,2],quot:1,iobjectcreatedev:1,how:0,reject:[1,2],instead:0,css:0,updat:0,resourc:1,await:0,befor:1,catalog:[0,2],attent:0,date:[1,2],data:[0,1],light:2,explicit:[1,2],element:1,inform:1,allow:[0,1,2],anoth:1,order:[1,2],over:1,approv:2,brain:2,style:0,ifactori:1,fix:0,bypass:1,persist:1,easier:2,them:2,good:1,"return":[0,1,2],thei:[0,2],handl:[1,2],auto:[1,2],untransl:0,initi:1,now:0,discuss:[0,1,2],name:0,changelog:0,revers:2,separ:1,zcml:0,each:1,unicod:0,button:0,mean:2,domain:0,weight:2,replac:[0,1],brittl:1,our:0,happen:2,imutabledublincor:1,event:[0,1,2],out:0,shown:[0,1],goe:0,publish:[0,1],content:[0,1,2],adapt:1,fti:[0,1],extensibleform:1,correct:0,after:0,workflow:[0,1,2],migrat:0,manipul:[1,2],standard:[1,2],standalon:1,base:[0,1,2],copysourc:1,thread:[0,1,2],could:1,wrong:0,keep:1,filter:[0,2],perhap:1,place:1,principl:[0,2],assign:1,size:0,notifi:0,render:2,number:1,acquisit:1,construct:2,regebro:0,differ:0,script:0,top:1,messag:0,white:1,conveni:2,"final":1,friend:1,option:0,namespac:1,copi:0,consult:1,ipropertymanag:1,undosupport:1,provid:[0,2],remov:[0,2],tree:1,structur:0,charact:0,ggozad:0,store:[0,1,2],posit:1,browser:1,ani:[1,2],simpleitem:1,have:[0,1,2],tabl:0,need:[1,2],optimis:2,greek:0,note:[0,1],also:1,ideal:[1,2],z3c:[1,2],simplifi:0,though:2,usernam:1,object:[0,1,2],most:[1,2],plai:0,propertymanag:1,icom:1,"class":[0,1,2],renam:[],request:1,declar:[0,1],neg:1,link:0,usual:[1,2],review:1,show:[0,1],german:0,text:[0,1],verbos:0,permiss:[0,1,2],redirect:0,current:1,just:1,transact:0,configur:0,solut:1,should:[0,1,2],dict:[1,2],factor:0,z3cform:[0,1],local:1,hit:0,variou:1,get:1,express:1,requir:[0,1],reveal:1,enabl:[0,1],"0b2":0,across:0,"default":0,hannosch:0,contain:[0,1,2],where:1,view:[0,1],manger:1,forego:2,set:[0,1,2],chaoflow:0,creator:1,subject:2,statu:0,wire:1,kei:2,correctli:0,someth:0,state:[0,1,2],email:1,rolemanag:1,parent:1,javascript:1,extens:2,distinguish:0,addit:[1,2],protect:[1,2],plugin:2,howev:1,linguaplon:0,etc:1,instanc:1,context:1,load:[0,1],respect:0,"0a1":0,"0a2":0,rebuild:0,empti:0,mark:1,basic:[0,1],box:0,fire:[1,2],bulk:0,i18n:0,those:1,properti:1,batch:0,calcul:0,error:0,anonym:[0,1,2],iundosupport:1,increment:1,helper:1,canon:0,non:[0,1],lightweight:2,discussionitem:1,ascii:0,disappear:0,subscrib:0,welcom:0,perform:1,make:[0,1,2],html:2,zope:[0,2],document:[0,1,2],iown:1,ipermissionmappingsupport:1,effect:1,retriv:2,portal:1,user:[0,1],ownership:1,icopysourc:1,recent:[0,2],travers:[0,1],moder:[0,1,2],choos:0,thu:1,well:[0,1],inherit:1,without:0,thi:[0,1,2],english:0,unchang:1,comment:[0,1,2],portal_typ:[0,2],less:0,obtain:1,speed:2,mix:1,other:[0,2],iobjectremovedev:1,lookup:[0,1,2],save:2,transit:[1,2],match:0,real:0,transpar:1,recaptcha:0,world:0,like:[1,2],manual:2,integ:1,collect:0,page:0,italian:0,visibl:1,some:1,back:1,inavigationroot:0,intern:0,genericsetup:0,guarante:1,keul:0,avoid:0,irolemanag:1,per:1,track:1,iobjectmodifiedev:1,notabl:1,core:2,who:0,run:0,allow_com:0,post:1,cmfcatalogawar:1,panel:[0,1],plug:1,about:0,obj:1,column:0,absolute_url:1,iconvers:1,lifecycleev:2,act:[1,2],contextualis:1,own:[0,1],effici:0,automat:[0,1,2],storag:[0,1],manag:[0,1,2],log:0,spam:[1,2],aren:0,support:[0,1,2],custom:[1,2],width:0,interfac:[0,1,2],includ:1,"function":0,creation:2,form:[0,1,2],juh:0,idublincor:1,idynamictyp:1,translat:0,inlin:1,"true":[1,2],faster:2,"0b4":0,"0b1":0,"0b3":0,possibl:[1,2],whether:1,bugfix:0,displai:1,record:2,below:1,allow_discuss:1,similar:1,isimpleitem:1,featur:0,creat:1,certain:2,dure:0,object_provid:0,unreleas:0,exist:[1,2],file:0,check:0,probabl:1,titl:0,when:[0,1,2],field:[0,1],valid:2,role:1,architectur:[0,2],registri:[1,2],icatalogabledublincor:1,algorithm:2,defaultdublincoreimpl:1,directori:0,rule:0,dynamictyp:1,conversationcanonicaladapterfactori:0,time:1,timo:0},titles:["Welcome to plone.app.discussion’s documentation!","Design Notes","Architectural Principles"],modules:{"plone.app.discussion":0},descrefs:{"plone.app.discussion.conversation":{Conversation:[0,0]},"plone.app.discussion.conversation.Conversation":{enabled:[0,1]}},filenames:["index","design","architecture"]}) \ No newline at end of file +Search.setIndex({desctypes:{"0":"method","1":"attribute","2":"interface"},terms:{represent:2,all:[4,1,2],chain:2,queri:4,consum:1,pluggabl:4,children:2,content:[4,1,2,3],readabl:3,send:3,under:2,global:[1,2,3],string:2,fals:1,mime_typ:1,util:2,join:4,exact:1,portalcont:2,administr:4,level:[1,2],cmf:3,itravers:2,list:[4,1,2],iter:[1,3],factori:[4,2],"try":1,item:[4,1,2,3],quick:3,work:[0,2,4],getthread:1,natur:3,idublincor:2,direct:1,annot:2,design:[0,2,3,4],further:[1,2],adpat:1,compat:4,last_comment_d:1,appear:4,repli:[1,2,3],abl:2,calcul:4,access:[1,3],delet:[4,1,2],version:4,"new":[4,1,3],method:[4,1],metadata:[2,3],widget:4,full:[4,1,3],gener:[4,2],modif:1,trunk:0,path:1,modifi:[2,3],implicit:2,valu:[4,1,2,3],dry:4,search:[4,3],convers:[4,1,2],dublin:3,action:4,implement:[1,2,3],explain:0,via:[1,2],regardless:1,appli:4,app:[0,1,2,3,4],"boolean":1,visibl:2,instal:4,total:1,plone:[0,1,2,3,4],"__parent__":[1,2],from:[4,1,2],would:2,regist:4,two:0,next:1,handler:2,call:[2,3],type:[4,1,2,3],until:1,more:[4,3],henc:2,relat:[1,2],warn:4,flag:1,addcom:1,particular:1,obj:2,iobjectaddedev:2,must:[0,2],none:1,retriev:[4,1,2,3],viewlet:[4,2],outlin:3,uniqu:[1,2],remain:2,can:[0,1,2,3,4],root:1,fetch:2,control:[4,1,2],tab:2,process:3,share:4,indic:4,captcha:[0,4],abort:[4,1],want:[1,2],commenttitl:4,alwai:[1,2,3],mai:[2,3],secur:1,iobjectcreatedev:2,write:[0,3],how:[0,4],iiterablemap:1,reject:[2,3],instead:[4,1],css:4,updat:4,map:1,resourc:2,max:1,after:4,befor:2,wrong:4,attent:4,date:[1,2,3],data:2,modification_d:1,object:[4,1,2,3],nonjavascript:2,explicit:[2,3],element:2,greek:4,allow:[4,1,2,3],anoth:[1,2],order:[1,2,3],move:4,approv:[4,3],becaus:2,brain:3,idynamictyp:2,dynam:2,paramet:1,style:4,ifactori:2,fix:4,bypass:2,persist:[1,2],hidden:2,easier:3,them:3,good:2,"return":[4,1,2,3],thei:[4,1,3],handl:3,auto:[2,3],safe:1,initi:2,"break":4,now:4,discuss:[0,1,2,3,4],"__delitem__":1,name:[4,1],changelog:4,revers:3,zcml:[0,4],each:2,found:1,unicod:4,button:[4,2],mean:[1,3],domain:4,weight:3,replac:[4,2],procedur:4,meta:0,our:4,happen:3,imutabledublincor:2,event:[4,2,3],out:[4,1],shown:[4,2],goe:4,author_nam:1,publish:[4,2],profil:4,adapt:[1,2],fti:[4,2],extensibleform:2,correct:4,integr:3,await:4,insid:1,workflow:[4,1,2,3],migrat:4,manipul:[1,2,3],given:1,standard:[2,3],"__setitem__":1,base:[4,2,3],mime:1,org:[0,4],copysourc:2,couldn:4,thread:[1,2,3],could:2,catalog:[4,1,3],keep:2,filter:[4,3],place:[4,2],formwidget:0,principl:[4,3],assign:[1,2],first:1,notifi:4,render:[1,3],number:[1,2],acquisit:[1,2],messag:4,size:[4,1],commentrepli:1,differ:[4,1],script:4,top:[1,2],construct:3,white:2,conveni:3,"final":2,store:[4,1,2,3],xmln:0,option:4,namespac:[0,1,2],comment_id:1,specifi:1,sync:4,regebro:4,consult:2,moder:[4,2,3],than:4,undosupport:2,provid:[0,1,3,4],remov:[4,2,3],tree:2,charact:4,jqueri:2,ggozad:4,friend:2,were:1,posit:2,browser:2,ani:[4,2,3],simpleitem:2,increment:2,tabl:4,need:[2,3],optimis:3,btree:3,inform:2,note:[0,1,2,4],mix:2,ideal:3,exampl:[0,1],which:[4,1],z3c:[2,3],singl:4,even:[2,3],copi:[4,2],though:3,track:2,previou:1,reach:1,most:[1,2,3],plai:4,propertymanag:2,icom:[1,2],"class":[4,2,3],don:1,request:2,declar:[0,2,4],neg:2,irepli:1,usual:[2,3],review:2,show:4,german:4,text:[4,1],verbos:4,getcom:1,directli:1,permiss:[4,2,3],find:1,redirect:4,current:[0,1],onli:[4,1],portal_typ:[4,1,3],transact:4,configur:[0,4],state:[4,2,3],should:[4,1,2,3],dict:[1,2,3],factor:4,z3cform:[4,2],folder:1,local:2,meant:4,"0b5":4,hit:[4,2],variou:2,get:[1,2],express:2,stop:1,requir:[4,2],enabl:[1,2],possibl:[2,3],email:[1,2],"default":4,hannosch:4,common:1,contain:[0,2,3],where:[4,1,2],view:[4,2],manger:2,forego:3,set:[4,1,2,3],chaoflow:4,creator:[1,2],displai:[1,2],see:4,respons:1,subject:[1,3],statu:4,wire:2,parent:[1,2],correctli:4,someth:4,figur:1,across:4,rolemanag:2,kei:[1,3],javascript:2,disallow:1,extens:3,allow_discuss:[1,2],distinguish:4,addit:[2,3],protect:[2,3],plugin:[0,3],howev:[1,2],linguaplon:4,etc:2,instanc:2,updateact:4,comment:[0,1,2,3,4],address:2,non:[4,2],respect:4,"0a1":4,"0a2":4,light:3,rebuild:4,author_usernam:1,empti:4,sinc:[1,2],basic:[4,2],quickli:1,box:4,fire:[2,3],bulk:4,child:1,i18n:4,those:2,"case":4,look:0,packag:4,properti:[1,2],batch:[4,1],"while":4,error:[4,2],anonym:[4,2,3],iundosupport:2,have:[0,2,3,4],helper:2,canon:4,site:4,itself:1,lightweight:3,discussionitem:2,ascii:4,disappear:4,develop:4,welcom:4,author:1,perform:2,make:[4,2,3],python:4,html:3,zope:[0,1,3,4],transit:[2,3],document:[0,2,3,4],start:1,higher:[4,1],untransl:4,http:[0,4],ipermissionmappingsupport:2,effect:2,retriv:3,portal:[4,1,2],user:[4,2],ownership:2,icopysourc:2,recent:[4,1,3],travers:[4,1,2],ipropertymanag:2,choos:4,thu:2,page:4,well:[4,2],inherit:2,without:4,thi:[0,1,2,3,4],english:4,unchang:2,load:4,identifi:2,just:2,less:4,when:[4,2,3],obtain:[1,2],speed:3,also:[0,1,2,3],add:[0,1,3],valid:[2,3],iobjectremovedev:2,lookup:[2,3],save:3,modul:4,match:4,real:4,transpar:2,recaptcha:[0,4],five:1,recurs:4,like:[1,2,3],specif:1,manual:3,integ:[1,2],collect:4,api:[4,1,2],index:[4,1,2,3],either:1,output:4,manag:[1,2,3],italian:4,right:[1,2],simplifi:4,icontentish:2,some:2,inavigationroot:4,genericsetup:4,guarante:2,keul:4,avoid:4,irolemanag:2,per:2,usernam:[1,2],plonesiteroot:1,iobjectmodifiedev:2,notabl:2,core:3,who:4,run:4,allow_com:4,host:4,although:1,"__name__":1,post:2,cmfcatalogawar:2,panel:[4,1,2],plug:2,about:[4,1],actual:2,column:4,absolute_url:2,iconvers:[1,2],lifecycleev:3,act:[2,3],disabl:4,own:[0,1,2,4],encod:4,automat:[4,2,3],mark:2,storag:[4,2],your:[0,4],accordingli:1,log:4,spam:[2,3],aren:4,support:[4,1,2,3],"long":1,custom:[2,3],width:4,reli:2,interfac:[4,1,2,3],includ:[4,1,2],"function":[4,2],creation:[1,2,3],form:[0,2,3,4],juh:4,subscrib:4,link:4,translat:4,renam:4,in_reply_to:[1,2],"true":[1,2,3],bug:4,faster:3,extend:1,"0b4":4,"0b1":4,total_com:1,"0b3":4,"0b2":4,whether:2,bugfix:4,conversationrepli:1,maximum:4,record:3,below:2,limit:1,otherwis:4,similar:2,isimpleitem:2,featur:[0,1,4],creat:2,certain:3,dure:[4,1],object_provid:4,unreleas:4,exist:[1,2,3],file:4,check:[4,1],piv:4,probabl:2,author_email:1,titl:[4,1],creation_d:1,virtual:4,field:[0,2,3,4],other:[4,3],role:2,you:[4,1],architectur:[0,3,4],registri:[4,1,2,3],svn:0,iown:2,sphinx:4,icatalogabledublincor:2,algorithm:3,defaultdublincoreimpl:2,directori:4,visual:4,rule:4,dynamictyp:2,depth:[4,1],conversationcanonicaladapterfactori:4,time:2,timo:4},titles:["Captcha Plugin Architecture","API/Interfaces","Design Notes","Architectural Principles","Welcome to plone.app.discussion’s documentation!"],modules:{},descrefs:{IConversation:{getComments:[1,0],last_comment_date:[1,1],total_comments:[1,1],"__delitem__":[1,0],enabled:[1,0],addComment:[1,0],commentators:[1,1],getThreads:[1,0]},"plone.app.discussion.interfaces":{IConversation:[1,2],IReplies:[1,2],IComment:[1,2]},IComment:{author_username:[1,1],modification_date:[1,1],creator:[1,1],author_email:[1,1],text:[1,1],portal_type:[1,1],comment_id:[1,1],author_name:[1,1],creation_date:[1,1],mime_type:[1,1],"__name__":[1,1],title:[1,1],in_reply_to:[1,1],"__parent__":[1,1]},IReplies:{"__delitem__":[1,0],addComment:[1,0]}},filenames:["captcha","api","design","architecture","index"]}) \ No newline at end of file