bbf7cb5685
svn path=/plone.app.discussion/trunk/; revision=28902
93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
from persistent import Persistent
|
|
|
|
from Products.CMFCore.utils import getToolByName
|
|
|
|
from z3c.form import validator
|
|
from z3c.form.field import Fields
|
|
|
|
from zope import interface, schema
|
|
|
|
from zope.annotation import factory
|
|
|
|
from zope.component import adapts, provideAdapter, queryUtility
|
|
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
|
|
|
|
from zope.interface import Interface, implements
|
|
|
|
from plone.registry.interfaces import IRegistry
|
|
|
|
from plone.z3cform.fieldsets import extensible
|
|
from plone.z3cform.fieldsets.interfaces import IFormExtender
|
|
|
|
from plone.app.discussion.browser.comments import CommentForm
|
|
from plone.app.discussion.comment import Comment
|
|
from plone.app.discussion.interfaces import IDiscussionSettings, ICaptcha
|
|
|
|
from plone.app.discussion.browser.validator import CaptchaValidator
|
|
|
|
HAS_CAPTCHA = False
|
|
try:
|
|
from plone.formwidget.captcha import CaptchaFieldWidget
|
|
HAS_CAPTCHA = True
|
|
except ImportError:
|
|
pass
|
|
|
|
HAS_RECAPTCHA = False
|
|
try:
|
|
from plone.formwidget.recaptcha import ReCaptchaFieldWidget
|
|
HAS_RECAPTCHA = True
|
|
except ImportError:
|
|
pass
|
|
|
|
class Captcha(Persistent):
|
|
interface.implements(ICaptcha)
|
|
adapts(Comment)
|
|
captcha = u""
|
|
|
|
Captcha = factory(Captcha)
|
|
|
|
if HAS_CAPTCHA or HAS_RECAPTCHA:
|
|
# Extend the comment form with captcha, if a captcha solution is installed.
|
|
class CaptchaExtender(extensible.FormExtender):
|
|
adapts(Interface, IDefaultBrowserLayer, CommentForm) # context, request, form
|
|
|
|
fields = Fields(ICaptcha)
|
|
|
|
def __init__(self, context, request, form):
|
|
self.context = context
|
|
self.request = request
|
|
self.form = form
|
|
|
|
registry = queryUtility(IRegistry)
|
|
settings = registry.forInterface(IDiscussionSettings)
|
|
self.captcha = settings.captcha
|
|
portal_membership = getToolByName(self.context, 'portal_membership')
|
|
self.isAnon = portal_membership.isAnonymousUser()
|
|
|
|
def update(self):
|
|
if self.captcha != 'disabled' and self.isAnon:
|
|
# Add captcha field if captcha is enabled in the registry
|
|
self.add(ICaptcha, prefix="")
|
|
if HAS_CAPTCHA and self.captcha == 'captcha':
|
|
# If Captcha is installed and Captcha is enabled,
|
|
# use the CaptchaFieldWidget
|
|
self.form.fields['captcha'].widgetFactory = CaptchaFieldWidget
|
|
elif HAS_RECAPTCHA and self.captcha == 'recaptcha':
|
|
# If ReCaptcha is installed and ReCaptcha is enabled,
|
|
# use the ReCaptchaFieldWidget
|
|
self.form.fields['captcha'].widgetFactory = ReCaptchaFieldWidget
|
|
|
|
# Register Captcha validator for the Captcha field in the ICaptcha Form
|
|
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 |