Skip to content
collective.z3cform.norobots provides a "human" captcha widget based on a list of questions/answers.
Python Shell
Find file
New pull request
Fetching latest commit...
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
.gitignore Plone 4.0 is no longer supported Move source code in "src" directory
README.rst Update README.rst Update tests buildouts Add useful test script
test-plone-4.2.x.cfg Update tests buildouts
test-plone-base.cfg Update tests buildouts




collective.z3cform.norobots provides a "human" captcha widget based on a list of question/answer(s).

This captcha can be used :

  • as a (Plone Discussions) captcha plugin
  • as a z3c form field
  • as a PloneFormGen field with collective.pfg.norobots

The widget is based on z3c.form.TextWidget.

Since version 1.4, questions configuration uses a dedicated control panel (using instead of a simple properties sheet. An upgrade step provides migration from earlier versions.

Interface is translated in the following languages: Czech [cs], Danish [da], German [de], Basque [eu], Spanish [es], Suomeksi [fi], French [fr], Dutch [nl], Simplified Chinese [zh_CN] and Italian [it].


I have tested this release with Plone 4.3, Plone 4.2.5 and Plone 4.1.6 (

See previous releases for Plone 4.0.




Getting the module

Add collective.z3cform.norobots to your plone.recipe.zope2instance buildout section e.g.:

eggs =


zcml =

Or, you can add it as a dependency on your own product


Enabling the module

In the Addons control panel, install "Norobots captcha field (collective.z3cform.norobots)".

Add a new question

In the "Norobots widget settings" control panel, add a new line in the field "Norobots question::answer":


Example : What is 10 + 12 ?::22

Answer can contain multiple values delimited by semicolon:


Example : What is 5 + 5 ?::10;ten

Quickly test ?

Download collective.z3cform.norobots and use virtualenv and buildout to test the module:

easy_install virtualenv
cd collective.z3cform.norobots
virtualenv .
source bin/activate
(collective.z3cform.norobots) easy_install zc.buildout
!!! check the buildout config file ``test-plone-base.cfg`` before running !!!
(collective.z3cform.norobots) ln -s test-plone-4.2.x.cfg buildout.cfg
(collective.z3cform.norobots) python
(collective.z3cform.norobots) bin/buildout
[...] be patient... [...]
(collective.z3cform.norobots) ./bin/instance fg

Go to http://localhost:8080, add a new Plone Site and install collective.z3cform.norobots (see above).

Launch tests:

(collective.z3cform.norobots) ./bin/test -s collective.z3cform.norobots

Launch code coverage:

(collective.z3cform.norobots) bin/coverage
(collective.z3cform.norobots) bin/report
And open with a browser htmlcov/index.html

Usage in a z3c form

You can use this widget setting the "widgetFactory" property of a form field:

from zope import interface, schema
from z3c.form import interfaces, form, field, button, validator
from import wrap_form

from collective.z3cform.norobots.i18n import MessageFactory as _
from collective.z3cform.norobots.widget import NorobotsFieldWidget
from collective.z3cform.norobots.validator import NorobotsValidator

class INorobotsForm(interface.Interface):
    norobots = schema.TextLine(title=_(u'Are you a human ?'),
                               description=_(u'In order to avoid spam, please answer the question below.'),

class NorobotsForm(form.Form):
    fields = field.Fields(INorobotsForm)
    fields['norobots'].widgetFactory = NorobotsFieldWidget

# wrap the form with's Form wrapper
NorobotsFormView = wrap_form(NorobotsForm)

# Register Norobots validator for the correponding field in the IContactInfo interface
validator.WidgetValidatorDiscriminators(NorobotsValidator, field=INorobotsForm['norobots'])

for more information see in the plone_forms directory.

Possible problems


Source code

Source code is hosted on Github.

How to contribute and submit a patch ?

Source code and an issue tracker is hosted on Github.


  • Sylvain Boureliou [sylvainb]
  • Mikel Larreategi [erral]
  • Aijun Jian
  • Radim Novotny [naro]
  • Thomas Clement Mogensen [tmog]
  • Peter Mathis [petschki]
  • Petri Savolainen [petri]
  • Helmut Toplitzer
  • Luca Fabbri [keul]
Something went wrong with that request. Please try again.