diff --git a/requirements.txt b/requirements.txt index c571b86..83b5ee5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ flask-appconfig==0.9.1 itsdangerous==0.24 nose==1.3.3 pydns==2.3.6 +recaptcha-client==1.0.6 six==1.7.3 validate-email==1.1 wsgiref==0.1.2 diff --git a/users/default_config.py b/users/default_config.py index a47aff1..07e30f9 100644 --- a/users/default_config.py +++ b/users/default_config.py @@ -56,3 +56,6 @@ # http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html # for details. SQLALCHEMY_DATABASE_URI = "postgresql://scott:tiger@localhost:5432/mydatabase" + +RECAPTCHA_PUBLIC_KEY = "" +RECAPTCHA_PRIVATE_KEY = "" diff --git a/users/static/css/user-map.css b/users/static/css/user-map.css index f2b7e71..92cc15d 100644 --- a/users/static/css/user-map.css +++ b/users/static/css/user-map.css @@ -61,3 +61,7 @@ html, body, #map { line-height: 18px; color: #555; } + +#recaptcha_image img { + width: 280px; +} diff --git a/users/static/js/user-map-component.js b/users/static/js/user-map-component.js index df7b36c..0d2e35b 100644 --- a/users/static/js/user-map-component.js +++ b/users/static/js/user-map-component.js @@ -213,6 +213,12 @@ function onMapClick(e) { }; var popup = getUserFormPopup(user, ADD_USER_MODE); marker_new_user.bindPopup(popup).openPopup() + + // activate captcha + var captcha_element = document.getElementById("recaptcha-container"); + if (captcha_element !== null) { + showCaptcha(captcha_element); + } } /** diff --git a/users/static/js/user-map.js b/users/static/js/user-map.js index 9ae783d..b50183e 100644 --- a/users/static/js/user-map.js +++ b/users/static/js/user-map.js @@ -96,6 +96,9 @@ function addUser() { var twitter = $("#twitter").val(); + var recaptcha_response_field = $("#recaptcha_response_field").val(); + var recaptcha_challenge_field = $("#recaptcha_challenge_field").val(); + var is_client_side_valid = validate_user_form(name, email, website); if (is_client_side_valid) { $.ajax({ @@ -108,18 +111,28 @@ function addUser() { email_updates: email_updates, latitude: latitude, longitude: longitude, - twitter: twitter + twitter: twitter, + recaptcha_response_field: recaptcha_response_field, + recaptcha_challenge_field: recaptcha_challenge_field }, success: function (response) { if (response.type.toString() == 'Error') { if (typeof response.name != 'undefined') { $name_input.parent().addClass('has-error'); - $name_input.attr('placeholder', response.name.toString()); + var $name_err = $("#name-error"); + $name_err.text(response.name.toString()); } if (typeof response.email != 'undefined') { $email_input.parent().addClass('has-error'); - $email_input.attr('placeholder', response.email.toString()); + var $email_err = $("#email-error"); + $email_err.text(response.email.toString()); + } + if (typeof response.recaptcha_response_field != 'undefined') { + var $captha_input = $("#recaptcha_response_field"); + $captha_input.parent().addClass('has-error'); + var $captcha_err = $("#captcha-error"); + $captcha_err.text(response.recaptcha_response_field.toString()); } } else { //Clear marker diff --git a/users/templates/html/base.html b/users/templates/html/base.html index 5e127f9..e34d509 100644 --- a/users/templates/html/base.html +++ b/users/templates/html/base.html @@ -25,6 +25,19 @@ + + {% endblock head_resources %}
diff --git a/users/templates/html/user_form.html b/users/templates/html/user_form.html index 26956c5..0734f37 100644 --- a/users/templates/html/user_form.html +++ b/users/templates/html/user_form.html @@ -61,6 +61,29 @@