15 |
15 |
16 |
16 |
17 from time import time |
17 from time import time |
18 |
18 |
19 from cubicweb import tags |
19 from cubicweb import tags |
20 from cubicweb.web import formwidgets as fw |
20 from cubicweb.web import ProcessFormError, formwidgets as fw |
21 |
21 |
22 |
22 |
23 def pil_captcha(text, fontfile, fontsize): |
23 def pil_captcha(text, fontfile, fontsize): |
24 """Generate a captcha image. Return a PIL image object. |
24 """Generate a captcha image. Return a PIL image object. |
25 |
25 |
61 |
61 |
62 |
62 |
63 class CaptchaWidget(fw.TextInput): |
63 class CaptchaWidget(fw.TextInput): |
64 def render(self, form, field, renderer=None): |
64 def render(self, form, field, renderer=None): |
65 # t=int(time()*100) to make sure img is not cached |
65 # t=int(time()*100) to make sure img is not cached |
66 src = form._cw.build_url('view', vid='captcha', t=int(time()*100)) |
66 src = form._cw.build_url('view', vid='captcha', t=int(time()*100), |
|
67 captchakey=field.input_name(form)) |
67 img = tags.img(src=src, alt=u'captcha') |
68 img = tags.img(src=src, alt=u'captcha') |
68 img = u'<div class="captcha">%s</div>' % img |
69 img = u'<div class="captcha">%s</div>' % img |
69 return img + super(CaptchaWidget, self).render(form, field, renderer) |
70 return img + super(CaptchaWidget, self).render(form, field, renderer) |
|
71 |
|
72 def process_field_data(self, form, field): |
|
73 captcha = form._cw.get_session_data(field.input_name(form), None, |
|
74 pop=True) |
|
75 val = super(CaptchaWidget, self).process_field_data(form, field) |
|
76 if val is None: |
|
77 return val # required will be checked by field |
|
78 if captcha is None: |
|
79 msg = form._cw._('unable to check captcha, please try again') |
|
80 raise ProcessFormError(msg) |
|
81 elif val.lower() != captcha.lower(): |
|
82 msg = form._cw._('incorrect captcha value') |
|
83 raise ProcessFormError(msg) |
|
84 return val |