fix errors that are thrown when plone.formwidget.captcha is not installed.

svn path=/plone.app.discussion/trunk/; revision=28755
This commit is contained in:
Timo Stollenwerk 2009-08-13 10:01:40 +00:00
parent e1b068dbbc
commit f4f0e29e96

View File

@ -1,5 +1,6 @@
from persistent import Persistent from persistent import Persistent
from z3c.form import validator
from z3c.form.field import Fields from z3c.form.field import Fields
from zope import interface, schema from zope import interface, schema
@ -20,15 +21,27 @@ from plone.app.discussion.browser.comments import CommentForm
from plone.app.discussion.comment import Comment from plone.app.discussion.comment import Comment
from plone.app.discussion.interfaces import IDiscussionSettings, ICaptcha from plone.app.discussion.interfaces import IDiscussionSettings, ICaptcha
HAS_CAPTCHA = False
try: try:
from plone.formwidget.captcha import CaptchaFieldWidget from plone.formwidget.captcha import CaptchaFieldWidget
from plone.formwidget.captcha.validator import CaptchaValidator
HAS_CAPTCHA = True
except ImportError: except ImportError:
pass # Fall back to SimpleFieldValidator, when Captcha is not installed,
# since otherwise the registration of the Captcha validator adapter
# would fail.
from z3c.form.validator import SimpleFieldValidator as CaptchaValidator
HAS_RECAPTCHA = False
try: try:
from plone.formwidget.recaptcha import ReCaptchaFieldWidget from plone.formwidget.recaptcha import ReCaptchaFieldWidget
HAS_RECAPTCHA = True
except ImportError: except ImportError:
pass # Fall back to SimpleFieldValidator, when ReCaptcha is not installed,
# since otherwise the registration of the ReCaptcha validator adapter
# would fail.
from z3c.form.validator import SimpleFieldValidator as CaptchaValidator
class Captcha(Persistent): class Captcha(Persistent):
interface.implements(ICaptcha) interface.implements(ICaptcha)
@ -37,11 +50,12 @@ class Captcha(Persistent):
Captcha = factory(Captcha) Captcha = factory(Captcha)
if HAS_CAPTCHA or HAS_RECAPTCHA:
# Extend the comment form with captcha, only if a captcha solution is installed.
class CaptchaExtender(extensible.FormExtender): class CaptchaExtender(extensible.FormExtender):
adapts(Interface, IDefaultBrowserLayer, CommentForm) # context, request, form adapts(Interface, IDefaultBrowserLayer, CommentForm) # context, request, form
fields = Fields(ICaptcha) fields = Fields(ICaptcha)
fields['captcha'].widgetFactory = CaptchaFieldWidget
def __init__(self, context, request, form): def __init__(self, context, request, form):
self.context = context self.context = context
@ -54,14 +68,31 @@ class CaptchaExtender(extensible.FormExtender):
def update(self): def update(self):
if self.captcha != 'disabled': if self.captcha != 'disabled':
# Add all fields from the captcha interface # Add captcha field if captcha is enabled in the registry
self.add(ICaptcha, prefix="") self.add(ICaptcha, prefix="")
if self.captcha == 'captcha': if HAS_CAPTCHA and self.captcha == 'captcha':
# If Captcha is installed and Captcha is enabled,
# use the CaptchaFieldWidget
self.form.fields['captcha'].widgetFactory = CaptchaFieldWidget self.form.fields['captcha'].widgetFactory = CaptchaFieldWidget
elif self.captcha == 'recaptcha': elif HAS_RECAPTCHA and self.captcha == 'recaptcha':
# If ReCaptcha is installed and ReCaptcha is enabled,
# use the ReCaptchaFieldWidget
self.form.fields['captcha'].widgetFactory = ReCaptchaFieldWidget self.form.fields['captcha'].widgetFactory = ReCaptchaFieldWidget
else:
#
pass
from z3c.form import validator
from plone.formwidget.captcha.validator import CaptchaValidator
# Register Captcha validator for the captcha field in the ICaptchaForm # Register Captcha validator for the captcha field in the ICaptchaForm
validator.WidgetValidatorDiscriminators(CaptchaValidator, field=ICaptcha['captcha']) validator.WidgetValidatorDiscriminators(CaptchaValidator, field=ICaptcha['captcha'])
else:
# This is necessary, otherwise the zcml registration of the CaptchaExtender
# would fail if no captcha solution is installed.
class CaptchaExtender(extensible.FormExtender):
adapts(Interface, IDefaultBrowserLayer, CommentForm)
def __init__(self, context, request, form):
pass
def update(self):
pass