Django Sitemap Framework integriert

This commit is contained in:
2016-10-11 23:54:18 +02:00
parent 07db651002
commit 4659eced63
22 changed files with 249 additions and 176 deletions

View File

@@ -9,9 +9,11 @@ from django.conf import settings
from django.core import validators
from django.core.validators import EMPTY_VALUES
from django.forms import utils, Form, ModelForm, ValidationError
import sys
import django.forms.fields
from django.utils.translation import gettext as _
from . import widgets
@@ -28,6 +30,9 @@ class Html5Mixin(object):
if self.help_text:
attrs['title'] = self.help_text
attrs['placeholder'] = self.help_text
if hasattr(self, 'placeholder'):
attrs['placeholder'] = self.placeholder
if self.accesskey:
attrs['accesskey'] = self.accesskey
return attrs
@@ -124,6 +129,7 @@ class CharField(Html5Mixin, django.forms.CharField):
class DateField(Html5Mixin, django.forms.fields.DateField):
placeholder = _('yyyy-mm-dd')
widget = widgets.DateInput
@@ -200,63 +206,36 @@ class ReCaptchaField(django.forms.fields.CharField):
self.required = True
super(ReCaptchaField, self).__init__(*args, **kwargs)
def _check_recaptcha(self, challenge_value, response_value, remote_ip=None):
"""
Submits a reCAPTCHA request for verification.
Returns RecaptchaResponse for the request
@param challenge_value: value of recaptcha_challenge_field
@param response_value: value of recaptcha_response_field
@param remoteip -- the user's ip address
"""
import urllib
import urllib2
private_key = settings.RECAPTCHA_PRIVATE_KEY
challenge_value = challenge_value.encode('utf-8')
response_value = response_value.encode('utf-8')
params = urllib.urlencode({
'privatekey': private_key,
'remoteip': remote_ip,
'challenge': challenge_value,
'response': response_value,
})
request = urllib2.Request(
url="http://www.google.com/recaptcha/api/verify",
data=params,
headers={
"Content-type": "application/x-www-form-urlencoded",
"User-agent": "reCAPTCHA Python"
}
)
httpresp = urllib2.urlopen(request)
return_values = httpresp.read().splitlines()
httpresp.close()
return_code = return_values[0]
if (return_code == "true"):
return True
else:
return False
def get_remote_ip(self):
f = sys._getframe()
while f:
if 'request' in f.f_locals:
request = f.f_locals['request']
if request:
remote_ip = request.META.get('REMOTE_ADDR', None)
forwarded_ip = request.META.get('HTTP_X_FORWARDED_FOR', None)
return forwarded_ip or remote_ip
f = f.f_back
def clean(self, values):
""" test the google recaptcha"""
import json, urllib, urllib2
url = "https://www.google.com/recaptcha/api/siteverify"
challenge_value = values[0]
response_value = values[1]
super(ReCaptchaField, self).clean(response_value)
if not challenge_value:
data = urllib.urlencode({
'secret': settings.RECAPTCHA_PRIVATE_KEY,
'response': values[1],
'remoteip': self.get_remote_ip()
})
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
result = json.loads(response.read())
# result["success"] will be True on a success
if not result["success"]:
raise ValidationError(
_(u'The CAPTCHA challenge is missing.'))
elif not response_value:
raise ValidationError(
_(u'The CAPTCHA solution is missing.'))
elif self._check_recaptcha(challenge_value, response_value):
return challenge_value
else:
raise ValidationError(
_(u'The CAPTCHA solution was incorrect.'))
_(u'Only humans are allowed to submit this form.'))
class RegexField(Html5Mixin, django.forms.RegexField):