def test_object(self): captcha = MathCaptcha('1 * 2') self.assertFalse(captcha.validate(1)) self.assertTrue(captcha.validate(2)) restored = MathCaptcha.unserialize(captcha.serialize()) self.assertEqual(captcha.question, restored.question) self.assertTrue(restored.validate(2))
class CaptchaForm(forms.Form): captcha = forms.IntegerField(required=True) def __init__(self, request, form=None, data=None, *args, **kwargs): super().__init__(data, *args, **kwargs) self.fresh = False self.request = request self.form = form if data is None or "captcha" not in request.session: self.generate_captcha() self.fresh = True else: self.captcha = MathCaptcha.unserialize(request.session.pop("captcha")) def generate_captcha(self): self.captcha = MathCaptcha() self.request.session["captcha"] = self.captcha.serialize() # Set correct label self.fields["captcha"].label = ( pgettext( "Question for a mathematics-based CAPTCHA, " "the %s is an arithmetic problem", "What is %s?", ) % self.captcha.display ) def clean_captcha(self): """Validation for CAPTCHA.""" if self.fresh or not self.captcha.validate(self.cleaned_data["captcha"]): self.generate_captcha() rotate_token(self.request) raise forms.ValidationError( # Translators: Shown on wrong answer to the mathematics-based CAPTCHA _("That was not correct, please try again.") ) if self.form.is_valid(): mail = self.form.cleaned_data["email"] else: mail = "NONE" LOGGER.info( "Correct CAPTCHA for %s (%s = %s)", mail, self.captcha.question, self.cleaned_data["captcha"], )