From 1ef89a34d23e9111a20c2e15f8e0c0ae20137512 Mon Sep 17 00:00:00 2001 From: edescalona Date: Fri, 6 Dec 2024 08:20:48 -0500 Subject: [PATCH 1/4] [17.0][ADD] website_recaptcha_v2_form: Adding recaptcha version 2 for the form snippets and also in the login, password reset and register forms. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [FIX] Tests [FIX] Ttests [IMP] Add new tests [IMP] Add new tests [16.0][IMP] website_recaptcha_v2_form: Update site-key values ​​from the write method.Tests. [FIX] Valid views with recaptcha [IMP] Add tests [IMP] Add tests [IMP] Update sitekey on web forms created by changing settings [IMP] Add tests [IMP] Add tests [FIX] Tests [FIX] Tests [ADD] Tests [FIX] Tests [FIX] Tests [ADD] Tests [ADD] Tests [FIX] Tests [ADD] Tests [ADD] Tests [REM] Tests [ADD] Tests [ADD] Tests [ADD] Tests [FIX] Rename import class [FIX] website_recaptcha_v2_form: Readme [FIX] website_recaptcha_v2_form: Correcting CONTRIBUTORS file structure [FIX] website_recaptcha_v2_form: Remove comments [IMP] website_recaptcha_v2_form: Change name class [IMP] Valid send data website form with recaptcha [IMP] Readme [IMP] Readme [FIX] Tests --- website_recaptcha_v2_form/README.rst | 108 +++++ website_recaptcha_v2_form/__init__.py | 2 + website_recaptcha_v2_form/__manifest__.py | 30 ++ .../controllers/__init__.py | 2 + website_recaptcha_v2_form/controllers/form.py | 30 ++ website_recaptcha_v2_form/controllers/main.py | 85 ++++ website_recaptcha_v2_form/i18n/es.po | 28 ++ website_recaptcha_v2_form/models/__init__.py | 1 + website_recaptcha_v2_form/models/website.py | 50 ++ website_recaptcha_v2_form/readme/CONFIGURE.md | 19 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 3 + .../static/description/index.html | 447 ++++++++++++++++++ .../static/description/recaptcha_ico.png | Bin 0 -> 2228 bytes .../static/src/css/recaptcha.css | 5 + .../static/src/css/recaptcha.css.map | 1 + .../static/src/img/readme/img.png | Bin 0 -> 15590 bytes .../static/src/img/readme/img_1.png | Bin 0 -> 2036 bytes .../static/src/img/readme/img_2.png | Bin 0 -> 5210 bytes .../static/src/img/readme/img_3.png | Bin 0 -> 29619 bytes .../static/src/scss/recaptcha.scss | 5 + .../src/snippets/s_website_form/options.js | 44 ++ .../static/src/xml/website_form_editor.xml | 25 + website_recaptcha_v2_form/tests/__init__.py | 2 + .../tests/test_controller_form.py | 94 ++++ .../tests/test_recaptcha.py | 99 ++++ .../views/auth_signup_login_templates.xml | 14 + .../views/s_website_form.xml | 16 + .../views/webclient_templates.xml | 8 + 29 files changed, 1121 insertions(+) create mode 100644 website_recaptcha_v2_form/README.rst create mode 100644 website_recaptcha_v2_form/__init__.py create mode 100644 website_recaptcha_v2_form/__manifest__.py create mode 100644 website_recaptcha_v2_form/controllers/__init__.py create mode 100644 website_recaptcha_v2_form/controllers/form.py create mode 100644 website_recaptcha_v2_form/controllers/main.py create mode 100644 website_recaptcha_v2_form/i18n/es.po create mode 100644 website_recaptcha_v2_form/models/__init__.py create mode 100644 website_recaptcha_v2_form/models/website.py create mode 100644 website_recaptcha_v2_form/readme/CONFIGURE.md create mode 100644 website_recaptcha_v2_form/readme/CONTRIBUTORS.md create mode 100644 website_recaptcha_v2_form/readme/DESCRIPTION.md create mode 100644 website_recaptcha_v2_form/static/description/index.html create mode 100644 website_recaptcha_v2_form/static/description/recaptcha_ico.png create mode 100644 website_recaptcha_v2_form/static/src/css/recaptcha.css create mode 100644 website_recaptcha_v2_form/static/src/css/recaptcha.css.map create mode 100644 website_recaptcha_v2_form/static/src/img/readme/img.png create mode 100644 website_recaptcha_v2_form/static/src/img/readme/img_1.png create mode 100644 website_recaptcha_v2_form/static/src/img/readme/img_2.png create mode 100644 website_recaptcha_v2_form/static/src/img/readme/img_3.png create mode 100644 website_recaptcha_v2_form/static/src/scss/recaptcha.scss create mode 100644 website_recaptcha_v2_form/static/src/snippets/s_website_form/options.js create mode 100644 website_recaptcha_v2_form/static/src/xml/website_form_editor.xml create mode 100644 website_recaptcha_v2_form/tests/__init__.py create mode 100644 website_recaptcha_v2_form/tests/test_controller_form.py create mode 100644 website_recaptcha_v2_form/tests/test_recaptcha.py create mode 100644 website_recaptcha_v2_form/views/auth_signup_login_templates.xml create mode 100644 website_recaptcha_v2_form/views/s_website_form.xml create mode 100644 website_recaptcha_v2_form/views/webclient_templates.xml diff --git a/website_recaptcha_v2_form/README.rst b/website_recaptcha_v2_form/README.rst new file mode 100644 index 0000000000..d15095a54f --- /dev/null +++ b/website_recaptcha_v2_form/README.rst @@ -0,0 +1,108 @@ +========================= +Website reCAPTCHA v2 form +========================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:82c3625280a3850676447d821ae41a770088a52928f19dc3d67a5aa695b2e677 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhttps://github.com/BinhexTeam/website.git-lightgray.png?logo=github + :target: https://github.com/OCA/https://github.com/BinhexTeam/website.git/tree/16.0-add-website_recaptcha_v2_form/website_recaptcha_v2_form + :alt: OCA/https://github.com/BinhexTeam/website.git +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/https://github.com/BinhexTeam/website.git-16-0-add-website_recaptcha_v2_form/https://github.com/BinhexTeam/website.git-16-0-add-website_recaptcha_v2_form-website_recaptcha_v2_form + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/https://github.com/BinhexTeam/website.git&target_branch=16.0-add-website_recaptcha_v2_form + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to use the recaptcha in its version 2 for the +login, password reset and signup views; it is also configured as needed +in the Form type snippets that appear on the Website. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +#. Go to **Website > Configuration > Settings**. + +#. Search 'reCAPTCHA v2' option. + +|reCaptcha v2| + +#. Click the link `Get reCAPTCHA v2 +keys `__ to generate the keys +needed to use the recaptcha. + +|Get reCAPTCHA v2 keys| + +#. Fill in the generated **Site Key** and **Secret key**. + +|reCAPTCHA v2 keys| + +#. Enable recaptcha in form website. |reCAPTCHA v2 enable website| + +.. |reCaptcha v2| image:: https://raw.githubusercontent.com/OCA/https:/github.com/BinhexTeam/website.git/16.0-add-website_recaptcha_v2_form/website_recaptcha_v2_form/static/src/img/readme/img.png +.. |Get reCAPTCHA v2 keys| image:: https://raw.githubusercontent.com/OCA/https:/github.com/BinhexTeam/website.git/16.0-add-website_recaptcha_v2_form/website_recaptcha_v2_form/static/src/img/readme/img_1.png +.. |reCAPTCHA v2 keys| image:: https://raw.githubusercontent.com/OCA/https:/github.com/BinhexTeam/website.git/16.0-add-website_recaptcha_v2_form/website_recaptcha_v2_form/static/src/img/readme/img_2.png +.. |reCAPTCHA v2 enable website| image:: https://raw.githubusercontent.com/OCA/https:/github.com/BinhexTeam/website.git/16.0-add-website_recaptcha_v2_form/website_recaptcha_v2_form/static/src/img/readme/img_3.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Binhex + +Contributors +------------ + +-``BINHEX ``\ \_: + +- Edilio Escalona Almira + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/https://github.com/BinhexTeam/website.git `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_recaptcha_v2_form/__init__.py b/website_recaptcha_v2_form/__init__.py new file mode 100644 index 0000000000..f7209b1710 --- /dev/null +++ b/website_recaptcha_v2_form/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import controllers diff --git a/website_recaptcha_v2_form/__manifest__.py b/website_recaptcha_v2_form/__manifest__.py new file mode 100644 index 0000000000..fd648ea266 --- /dev/null +++ b/website_recaptcha_v2_form/__manifest__.py @@ -0,0 +1,30 @@ +{ + "name": "Website reCAPTCHA v2 form", + "version": "16.0.1.0.0", + "category": "Website", + "depends": ["web", "auth_signup", "website", "website_recaptcha_v2"], + "author": """ + Binhex, + Odoo Community Association (OCA) + """, + "license": "AGPL-3", + "website": "https://github.com/OCA/website", + "summary": """ Module that allows you to use recaptcha v2 for login, password reset, + signup and snippet form on the website. + """, + "data": [ + "views/webclient_templates.xml", + "views/auth_signup_login_templates.xml", + "views/s_website_form.xml", + ], + "assets": { + "website.assets_wysiwyg": [ + "website_recaptcha_v2_form/static/src/xml/website_form_editor.xml", + "website_recaptcha_v2_form/static/src/snippets/s_website_form/options.js", + ], + "web.assets_frontend": [ + "website_recaptcha_v2_form/static/src/css/recaptcha.css", + ], + }, + "installable": True, +} diff --git a/website_recaptcha_v2_form/controllers/__init__.py b/website_recaptcha_v2_form/controllers/__init__.py new file mode 100644 index 0000000000..b26463d6cb --- /dev/null +++ b/website_recaptcha_v2_form/controllers/__init__.py @@ -0,0 +1,2 @@ +from . import main +from . import form diff --git a/website_recaptcha_v2_form/controllers/form.py b/website_recaptcha_v2_form/controllers/form.py new file mode 100644 index 0000000000..590efff291 --- /dev/null +++ b/website_recaptcha_v2_form/controllers/form.py @@ -0,0 +1,30 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import json + +from odoo import http + +from odoo.addons.website.controllers.form import WebsiteForm + +from .main import RecaptchaHome + + +class WebsiteRecaptchaForm(WebsiteForm): + @http.route( + "/website/form/", + type="http", + auth="public", + methods=["POST"], + website=True, + csrf=False, + ) + def website_form(self, model_name, **kwargs): + if kwargs.get("recaptcha_enabled", False): + valid = RecaptchaHome.verify_recaptcha_v2(self, values=kwargs) + if not isinstance(valid, bool): + return json.dumps( + { + "error": valid, + } + ) + return super().website_form(model_name, **kwargs) diff --git a/website_recaptcha_v2_form/controllers/main.py b/website_recaptcha_v2_form/controllers/main.py new file mode 100644 index 0000000000..bd9026ee25 --- /dev/null +++ b/website_recaptcha_v2_form/controllers/main.py @@ -0,0 +1,85 @@ +import logging + +from odoo import _, http +from odoo.exceptions import AccessDenied +from odoo.http import request + +from odoo.addons.auth_signup.controllers.main import AuthSignupHome +from odoo.addons.web.controllers.home import SIGN_UP_REQUEST_PARAMS, Home + +logger = logging.getLogger(__name__) + +SIGN_UP_REQUEST_PARAMS.add("g-recaptcha-response") + + +class RecaptchaHome(Home): + def verify_recaptcha_v2(self, kw=None, template="", values=None): + Website = request.env["website"].sudo() + try: + request.env["ir.http"]._auth_method_public() + valid = Website.get_current_website().valid_recaptcha(values) + if valid: + if template == "web.login": + return super().web_login(values.get("redirect", ""), **kw) + else: + return True + except AccessDenied as e: + message_error = str( + e.args[0] if len(e.args) > 0 else _("Recaptcha is not valid.") + ) + if template in ( + "web.login", + "auth_signup.reset_password", + "auth_signup.signup", + ): + values.update({"error": message_error}) + response = request.render(template, values) + response.headers["X-Frame-Options"] = "SAMEORIGIN" + response.headers["Content-Security-Policy"] = "frame-ancestors 'self'" + return response + else: + return message_error + + @http.route("/web/login", type="http", auth="none") + def web_login(self, redirect=None, **kw): + if request.httprequest.method == "POST": + values = { + k: v for k, v in request.params.items() if k in SIGN_UP_REQUEST_PARAMS + } + # Checking that if the request comes from the creation of the account, + # that the recaptcha is not checked again to avoid errors. + + if ( + values.get("confirm_password", "") == "" + and request.httprequest.url.find("web/signup") == -1 + ): + return self.verify_recaptcha_v2( + kw=kw, template="web.login", values=values + ) + return super().web_login(redirect, **kw) + + +class RecaptchaAuthSignupHome(AuthSignupHome): + @http.route( + "/web/reset_password", type="http", auth="public", website=True, sitemap=False + ) + def web_auth_reset_password(self, *args, **kw): + qcontext = self.get_auth_signup_qcontext() + if request.httprequest.method == "POST": + valid = self.verify_recaptcha_v2( + kw=kw, template="auth_signup.reset_password", values=qcontext + ) + if not isinstance(valid, bool): + return valid + return super().web_auth_reset_password(*args, **kw) + + @http.route("/web/signup", type="http", auth="public", website=True, sitemap=False) + def web_auth_signup(self, *args, **kw): + qcontext = self.get_auth_signup_qcontext() + if request.httprequest.method == "POST": + valid = self.verify_recaptcha_v2( + template="auth_signup.signup", values=qcontext + ) + if not isinstance(valid, bool): + return valid + return super().web_auth_signup(*args, **kw) diff --git a/website_recaptcha_v2_form/i18n/es.po b/website_recaptcha_v2_form/i18n/es.po new file mode 100644 index 0000000000..ad619481ec --- /dev/null +++ b/website_recaptcha_v2_form/i18n/es.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * binhex_website_recaptcha_v2 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-12-02 16:23+0000\n" +"PO-Revision-Date: 2024-12-02 16:23+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: binhex_website_recaptcha_v2 +#. odoo-python +#: code:addons/binhex_website_recaptcha_v2/controllers/main.py:0 +#, python-format +msgid "Recaptcha is not valid." +msgstr "Recaptcha no es válido." + +#. module: binhex_website_recaptcha_v2 +#: model:ir.model,name:binhex_website_recaptcha_v2.model_website +msgid "Website" +msgstr "Sitio web" diff --git a/website_recaptcha_v2_form/models/__init__.py b/website_recaptcha_v2_form/models/__init__.py new file mode 100644 index 0000000000..bd190fa80b --- /dev/null +++ b/website_recaptcha_v2_form/models/__init__.py @@ -0,0 +1 @@ +from . import website diff --git a/website_recaptcha_v2_form/models/website.py b/website_recaptcha_v2_form/models/website.py new file mode 100644 index 0000000000..168b299737 --- /dev/null +++ b/website_recaptcha_v2_form/models/website.py @@ -0,0 +1,50 @@ +from odoo import api, models +from odoo.exceptions import AccessDenied + + +class Website(models.Model): + _inherit = "website" + + def valid_recaptcha(self, values): + valid, message = self.is_recaptcha_v2_valid(values) + if not valid: + raise AccessDenied(message) + return True + + @api.model + def get_recaptcha_v2_site_key(self): + return self.sudo().get_current_website().recaptcha_v2_site_key + + def update_recaptcha_v2_site_key(self): + views_recaptcha = ( + self.env["ir.ui.view"] + .sudo() + .search( + [ + ("arch_db", "ilike", 'class="g-recaptcha"'), + ("website_id", "!=", False), + ] + ) + ) + if views_recaptcha: + for view in views_recaptcha: + site_key_old = view.arch_db.split('data-sitekey="') + if len(site_key_old) > 1: + site_key_old = site_key_old[1].split('"')[0] + if site_key_old: + div_start = '
'.format(div_start, site_key_old, div_end), + '{} "{}" {}/>'.format( + div_start, self.recaptcha_v2_site_key, div_end + ), + ) + view.sudo().write({"arch": updated_arch}) + + def write(self, vals): + res = super().write(vals) + if "recaptcha_v2_site_key" in vals: + self.update_recaptcha_v2_site_key() + return res diff --git a/website_recaptcha_v2_form/readme/CONFIGURE.md b/website_recaptcha_v2_form/readme/CONFIGURE.md new file mode 100644 index 0000000000..012a2de128 --- /dev/null +++ b/website_recaptcha_v2_form/readme/CONFIGURE.md @@ -0,0 +1,19 @@ + To configure this module, you need to: + +#. Go to **Website > Configuration > Settings**. + +#. Search 'reCAPTCHA v2' option. + +![reCaptcha v2](../static/src/img/readme/img.png) + +#. Click the link [Get reCAPTCHA v2 keys](https://www.google.com/recaptcha/admin) + to generate the keys needed to use the recaptcha. + +![Get reCAPTCHA v2 keys](../static/src/img/readme/img_1.png) + +#. Fill in the generated **Site Key** and **Secret key**. + +![reCAPTCHA v2 keys](../static/src/img/readme/img_2.png) + +#. Enable recaptcha in form website. +![reCAPTCHA v2 enable website](../static/src/img/readme/img_3.png) diff --git a/website_recaptcha_v2_form/readme/CONTRIBUTORS.md b/website_recaptcha_v2_form/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..7c56c94d4c --- /dev/null +++ b/website_recaptcha_v2_form/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +-`BINHEX `_: + + - Edilio Escalona Almira diff --git a/website_recaptcha_v2_form/readme/DESCRIPTION.md b/website_recaptcha_v2_form/readme/DESCRIPTION.md new file mode 100644 index 0000000000..2c2e102a86 --- /dev/null +++ b/website_recaptcha_v2_form/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module allows you to use the recaptcha in its version 2 for the login, +password reset and signup views; it is also configured as needed in the +Form type snippets that appear on the Website. diff --git a/website_recaptcha_v2_form/static/description/index.html b/website_recaptcha_v2_form/static/description/index.html new file mode 100644 index 0000000000..ab87f33978 --- /dev/null +++ b/website_recaptcha_v2_form/static/description/index.html @@ -0,0 +1,447 @@ + + + + + +Website reCAPTCHA v2 form + + + +
+

Website reCAPTCHA v2 form

+ + +

Beta License: AGPL-3 OCA/https://github.com/BinhexTeam/website.git Translate me on Weblate Try me on Runboat

+

This module allows you to use the recaptcha in its version 2 for the +login, password reset and signup views; it is also configured as needed +in the Form type snippets that appear on the Website.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Go to Website > Configuration > Settings.
  2. +
  3. Search ‘reCAPTCHA v2’ option.
  4. +
+

reCaptcha v2

+

#. Click the link Get reCAPTCHA v2 +keys to generate the keys +needed to use the recaptcha.

+

Get reCAPTCHA v2 keys

+
    +
  1. Fill in the generated Site Key and Secret key.
  2. +
+

reCAPTCHA v2 keys

+
    +
  1. Enable recaptcha in form website. reCAPTCHA v2 enable website
  2. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Binhex
  • +
+
+
+

Contributors

+

-BINHEX <https://binhex.cloud>_:

+
    +
  • Edilio Escalona Almira
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/https://github.com/BinhexTeam/website.git project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/website_recaptcha_v2_form/static/description/recaptcha_ico.png b/website_recaptcha_v2_form/static/description/recaptcha_ico.png new file mode 100644 index 0000000000000000000000000000000000000000..65f4e0147fd40aca822db867dee902794e30db33 GIT binary patch literal 2228 zcmV;l2ut^gP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_00T1qZoK+t#nD+} z6P+$96in@nLDI6u_g+?MtV}(pYrij#{$=R%pmiFgrN9DM6M857q z!IJRsRBhu2fACbGlqsM=0)0fXW{i+C1Xil2?a9zjzPb5@k#t|Th+U$1-+OPf;oT9~ z@G1xt_5gT4Ay*F*$!epMK%xpqJw;@eSVpU=nwGhc5Y^X@O57DiKMD~qU7DdkaN`D7 z?Yk0427zQXB_LNpE2zz!0tu=qGIEXWE8W(iCvj^y@#yt0NK@8Zthn2`b%=j@@ST@X z7b^F#|C24CK>~dM{u%@cj1x&9;ZXYwffWT)&>GW(vV6Rf1u4?$wo6kqrjxPCNdnHL z?!fz3w*U1&xvQ?jQ~PrQ{c{2uBw&D8IpOKZ@}~$z*?0{-z;(JRX-c8#6oSVBp|0Tl zo@@QMh7aDI+9$h^njxTJ3K)r%Dl4Y|f~TV>8{V3eQx=+BXqt)3qu{YXm=OHp?XSG0 z;_LIS;JF2cNr5Ew1SOy{fq)4FY`g;T0F2II+_B8``PcbPB_l zI0>Af1XM;0Zvt=>E3ZI224}*@=Gp`W#1$={O}d2d5bip(K#Jxl!1v7ws0^e)qJw}L zz^y(J5IwtZW^EZ)O?v^40%hg~EQ!!W%W}5K(yF@?lmmAX9R$o&3QPcRbAtC&KvH(( z);pep>kfZ8tKRp~H8wmJcpT3d5s({!6dB;3(SPT)Q3=5tRkkhNA){!QrW@m)?DghGz({pYBLxX;4_i zlX2PIpD+bv@Hals1hLxT-4aMrC_?pZU;jr4*a5!n?sw6$)djeq#rCxmNaWZ3@%I7( z_Nf|u7ap0Yh*O-HrQs<76pLMg-F>(OM8&&@GfD-3*#kAR;!q=8w+w?gE&xNqS0M?# zumJh6Oh`zJUYR%eAsappMM+7p;bRoe0)ERHbm;Rt0RaIro&^<_ zShgy^;e$(PG06A4DKGzdXj;+O3=J>Kx8Rzm;89}9zc!ZwlA@+hMrpv3wtG~Le8ZXS zpN(|knMEYD6c1dwJQkJB_5G$zI{^N~DIs{&3b9Hn8Bzkna|r}#58nI`!Re2DP3T+i zQfc{;jE=fChL7ijhvcGjeu3ciuiXAh2hh61|00SH{e#e< z9K6MusKm55R^NB~C8@mJ86M63Z1}i57JRN1!09*(gz8)V`9OF0HU-)IIidaS4MKb1 zI-z~}Q!+)2!0#X9*?kavCCtfrCMa$F@acs7ahNhuCLjhvriA1gi1^$IkU%j2G&+YU zCWttNflO=;l^6(nIURQS@@2x4T)K40DMq95-I9_Lp%)D_9-e??K+yAJtrtPptw!D6 zLEyrL3xu~hfBrl%Ffed6BqT)6GiaIPLV|BTp9Hd7I?P*el-}OnKTD<33>P!gf*xU> z05gN(e}v%|FM32r7#EzY0Q@zvSp3N0y%HE38@mbcnLdCQRaaL_=iBu>7C3qGB8&~?O-{|sd^0jO*4@?BrQEY;Pn29Pm!P1} z-QC^F(b3VPr%#{0#|6%osH>}6<%xt(1eifBb@AdwGU(hDG>?SaW5VYG-as>R=FAxw zU#C!aN_J0J8e$zri3&Gdd*Pp^%l30Wbh}pDxb2aqG?-vpr#bU91UsPPY z3)g(0yHEK5IO6dZh=}JUBq};OT6OH$vG>u97NXWWIy(LY_fW&Vmg9T6y+q;LL2!8d zL(ps>*J`!fp}T$NjR+TbUtizfluG4`sBC->|Akt1)8ir%lA4{Jy{)yi^$oMx{9jMO zZ8qEemX?+`GBba?4V8s=u>&90dxalXd$;&k(c*8OnJvUJ3Ft8jEwxIkl^3=4EldJL-i{tl@l)j0000 div.g-recaptcha { + margin-left: 18% !important; +} + +/*# sourceMappingURL=recaptcha.css.map */ diff --git a/website_recaptcha_v2_form/static/src/css/recaptcha.css.map b/website_recaptcha_v2_form/static/src/css/recaptcha.css.map new file mode 100644 index 0000000000..5b27d9f714 --- /dev/null +++ b/website_recaptcha_v2_form/static/src/css/recaptcha.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/recaptcha.scss"],"names":[],"mappings":"AACI;EACI","file":"recaptcha.css"} diff --git a/website_recaptcha_v2_form/static/src/img/readme/img.png b/website_recaptcha_v2_form/static/src/img/readme/img.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9875d7cdaa602f5d63770324c12cd16511c150 GIT binary patch literal 15590 zcmd72Wl&tv_a#aUx8P22Nq{u&B)AjYA<#4~!D%!kI5Y%lXxt&VyCy*6?jD@R-R1S~ zKW}QLYGyvnr}yrM?!I;E*52pb(`T=>_6q-^Du;tffr)~Gf}mkDon?$13lcKl+}GJ}x0pqM=biTvk#?)67z6qN5@ z{MSvcBtIc9bc~P8uV23o8bbm8=N=vB|K=7#3L2Up=Lxub=f1U&u?Yx)S9D8JSo z&h^wI^qq%YZNHZY@UyC8vV@P?t=#wQTMI@DtoZMXozk+88X2E7TS+MRafpgCuRNY` zi&flP&W^W{D>yx_59^xvxb~{5%i2tKmd+j?CAOa4z3Iq!4TC0=}d{P4G2-LR|CtG07gehO|~ z+XCLpYXy-NFVADsrC5w3Bb~ONtsw_jgKbtMdgm#)t-+#=n$4cifo(laMIx(kl12B6 zy|TdE9-rqgVUo?RXe3+ZczqQ;#cKA}aFI4NnTj0p*cyL^kzewjZP!O79et0|jR4Z- z=aa!%)1LarOSz=n#oL2#hEEqO`xOT_m*v;jN5cw!SY`Wlc@oBuRP2{8>FFe4fMX*u z16KcIU8mfjQz-RuyRIKGo>3)lQiNyD(jKH?RbhVi1}qqyCeH8~yiTd$v)B=3X^7>i zmpq%Uwh}*<&=?f}=R^>)|opADv9hD+8FLm=>_6Hl4^#lF1{ zC&8{ys1sauo94>{1y|EPxLOMxJuHbOqZgK(DIHfK!dT{G_59s$ZRFr@dMZm^-@76f z%kkew>kU;M1~(5fFYTC&noY`-CD}Gt&dqu%Ax$5BE_tRoH`iyS`2_yf^isx?|1A^} zO(ct7yt@@%gn2g07b_7+S$5#YF$y!ci{AMp2u4z#YW{)rM0l9-T2i!}c8&;`tj5k* zn9Y+TUvR8>Bs_0WP4z%DEK&y!YbB?R5DA#SSBe`O?^qGMTd}L?pkNC^cqn_cUODc? zmW;bWM`5&wzKH-&M$kY0FU%UA?fu-__BER-d4IQUyzfeAvum%D?wgI5WMY?YhqWF{ z?^Um9S1b=-ie1(C$tP7j$xe$6roTnTHd{9&KNpkntgv}Upv&^D*jng^T$?s`ry+E- ze)}j)lVfC=x$m{|XpEQBX*=F^iEVT`qOM1$@f2>?PXt?BBPVOoX%w{*W!D1`L-)z{ZbWn2Ap$k)hYlirSpFds9_) zCP+EwNx*aaH~r#yApu||Br4wHXyMp5?q}qwam$J?C^Vs8VLbb$71b)Kqk_D#E13ov zd>k2Edb@Z&*!1_(X~qR!KAQN4A(dfKila_v(?>mJ0)?~k(fcNH@}lF1^~0z{{pQh7 z&C!YA+xH^jQ}q_g4fliF*Q-oTdy68Pd2!eI0Vi5pZd~8`ZQm*$cTuSxnb< z?&oMkrwAj)vicmgIFaYb=0BaVYw@o_*WJ@MD;~)G_d2YMg0Sac8m@6VVruTxei!Mv zI%pr^0p@CP%E0STQ;iv((*>r1Y;PF^fJth?+9&U&k2oj@@iGs^Jl+9kD?I-Z+z(S9 zGv@n$aotXaGot$PofE1GgD>By`grQBZkGEcw;mFm!?%W0R=bHWTVR~-{|Sp_1`qm< zy#C)a9q<3I5C_yjbuaN_o|KAK$mqCPf zzB!{gi~yerN4x%=87MEAVy(2Om5H9H?+1Q8p*#{rraCJ1gX}!jsXf`qOK+w=&OnYS zp!LazBYIhGRz_~tlksuq8EW)PSAXOQ@Vx*%+OMENn*VKQ3#NDoC` zi=Z18_UYZ%jBk;tI-Yh_te({R&&#ow0kfsgzB^R`bKtvUPmi{{j?qF=Qv^SU=nDEf zr-g&}?Y%FKG`?H?^Ne!SB36p`I1ZP!Rc+r+o8Q_|#X`a8jpQ!q_i_z*LaZNXo(6{G zRxOd=cyR)AiXVndXRmlgyPKl`1xK_V6i-j4qpfEZJ5NWZBW;iOD;tNV#x=`}HP;b? zkH1=o{@Hj93pcUWWhpN%tSp<6RbHe|Y+41kCF?9$U%Kp|eD7WlCL`Rh{%)ES#f$Y? zL9-E{J|ZZ1E4VM%vl~Z7h&XFd2iCWpRb}YFxXVaj!LQPGCsVcDZw(wwuL2)n^I$LKru2-1- zOM8)-YLOoD z2`e9AeMj3PglTlqIa68Z^oq()2ivnq4T415LoK9B5D&sa7)qTgRErO9KA0O&auew~mmeryB+L(S_saQU-~q zmXNyu_mWq$$8_ojg^5_I91iyOSvF%GDVBqy0gv;mPv^;*Z9XK3v%+U0E9IRm9Xhqq zcQ(dv;)Tg^*Wxr2m@4+t@~EY8iemLG3hAe9up`AV$B(G;o3&~U4fqH$g7__a-kpmK z%*I{kS@*)KN`8X+eI_Vbl1-)j-_K~O4zo7spXkH$LU6<5xwW)0Z8VAp8mTg(;1VJA zpS1w;YRWivV;;6nH&Wsf;-BbRVaDID0SB6=Q~TdBPBLXN|<-+x0AU zIc&iwi*;HJhJ5&KSO`CsVt1=0h+-l>+?l)=HprYOKW>JV%N`9tgm2Uc!C^uR>J3)& zkzEes1A1^b@~tAD3HSIZoK}WgE5Yrv)Vhg0YzR3mWk(&&qmi7yS@}zY)}H|7)8A8b2>9y4G?r&!h5bhteniX2M#G(1{8Pn}K% z9NeUudI%oD`4`N95hb#JJEHf;D?p^-@8q9ksCM|+uNd>ElQ-N*FiCrE8{fop+vO?r z=O5MvSYsqoQV%-z4(TOP2)J=8;r5VEI+ZJKjb4TUfEPgw_CxbJLfjPP#Xlz@+!G)0 zTVg45-Pv05`E(@OM1H$iB|v1C`PtM_n~#@1IE|`&D-Ch9{S=#RU7yWyJ$kio$9o5l zm=l0>!ahl!n?stouH!2TkLY#R4_wZ06@?gb+ogczWo60ci2eN*-`lf^2?DV{8@(~c zoJkBMg_Gpy-R&{tc0&-ly0Crb1fCFAWyc;WOhb)v|5Qn@ko|8pUk62Lq$qi+(=2S- zM_S3o=b42peMvC^1zPhqRR+D^q9~x!-E**7CRam;60bx4rF-cJNB;Jz6y+s~PuZcL zxz$g;HZwT?kg?%|^JPZvLg^?M#FIfl94R@THI;cF~ z`BaAngu;!CjSsP0W4|FL^5^IE%keWYSb7;d21b=d97U49ZPbpsss}5x+a*UcT4R^| zRBUzw$8qU@tk^e68?R_HNnNZO*GkzC>roM*{IH~nJp$|z&}b>=C+vcMA6`M zM54s*Htev2&2h&b4By2D-^D8Qoasb5_{QOGm@NhVBotE>VMZ$ls4H5180>sbk}Y@O zOA`uh+0foOQ1fZ&Q=2dZZ{XM1rVf|NP-YfHd#q0mxsMG;SI>aGQPj;;wF~D(&FKJ# zYj)qzIq=vSg29X~#30P{aa)8)ZhU+dn=Q}2HVcY8FS2ZP>|6sjAmFV5VvliZY}DhG zHW5+LsF2l;00|FA5-K3QQR24Lrg4vjvv)?b9j9no%CVi!V0F)?-w;)D&WNDrsvf86 zKq*g6zWhZ{Dpuw!jMd65C3QNVV8WSefc+P(xK%E{0CTXZO@s&UTT#-=KZAEdcoKSoZ*UR!$$K;ZsC7z>olgAp)Bu+B*+72(i{L+0XK~L}p zCZ6f!@4s?I$R zXC&QjwmjS7yyI!V!yA2PG*hl42YYJmTNZ}-4k{91D$6P%@A%>u!`rn$%q_M-OwUcckaLZn zXLINef9U`9ev%}c1PYZG-+T+`2}NTcEUCkBNMcFM=mM!~O5Gw(cVK~*1#;SxJU^ce zPOpQVma>YcpQr1#&&$dja-Yr4tu6D8Q#Rguo?v}-I8xMAa^Ul})MB@Dzf&@;kdeJT z2r0(Yo}C>(zv<>1(+jVNcqHB`URa1ve>I6Gm7O0b>rzy?@!j$JgK?+a2<0*dPVrA- zTJ{p{%fgn9lb{U2s1(IV_nC2%-7=keJ-t^i8@x;KvTTC}=RTqFn`aAZLs{zYbvZSPhH7QVTz-SW-IUpaX(KHjp+gh?QA%i9YIxbZ>ny- zOR!=0MH4q5v$2yt*GbS7AhUWo2U}y55$StCm?wNvcGG&lcrcXS>Lybn3V!qaIs5y$ z0UqaXD0I5lTNWm=?7F1~>M~8HWTroo(=6Daoz0=z?E1NIWRuuWU9k6Rh(de$W|Z~x zQ1$ED`Q*ZaZFM>|a6gcIvVVc%VLy~L7huAlF;k=k-9oFwkrheL5;JHtzkw;6PUF`! ztMGHxUe%o@B-)!ebiETVe&5x67EjVz%ToTH17}*haT$f0scUDg`#jugeH~#SN=5tv z2dAJ3wxhXZg9$#6P20~7cXycG{YeblE9ZEgtL?nE$lbcpZ8^0DakK@UbpAfb7;>ML z_GG!(+~?PJUnDxGTsUjbC7w1mb>-Qzq9DvPH(pI*z!_Mm;i;mOoAFv2D1B>8uIQ+K z_HEMwptp>|Z@atsH+zIe zvvZlT@Y8^y>A4b1oIHRC{dM2;gLRHnzVN)j2Kb`Wc}uJA>_V_Tl4fZv7tECnrY&D` zExUnHx!V4`w~D0o8xIVP544*#7?5Z`fDayMQBS$6HO|m9GJCskO{WvyByQ*ukbHUE z3Px*}!xObTh$1+~UEr#Qv$z>bKOEhB;DAmqUqSg+7tXrmE-K&^voo~i%Bi&jm=0X? zZytF3LUY;cGfd@@e8o7{C3+e*{AfF<7A-jYD$qUV{>6$~BA~;uq?kVnJToIY z!sTrXT{sHHPxNw<0z35fy`&MJ&gGDBXOLA+n+)32Hr4mL3h^1<$=LmaC&2=wJ=}Q+ z@ZmWD6-J~vU+*-ZrI^SX+0VbB5iU!gMzd{U(AXe5Um>oo6Q#xVPXv&9*KPH3yjP@r3UYD#7DWd|e>}dn0KYbVvmVUYQ z*9_?B>sO!BPfrU;=hUrUc#R%dqzckzaeU{!zFS_#KSn9L;d((`QhpddXd8Hl`PflK z*aK74V&f|Fq7jc!8lZ2W_wLIz;&vHb!=-iEhf}x~9RuBzDkZ@S)g$SoHOT;l$1v_l zIZD$8?MWLf150V`uu$D!Z@$ruRxk#_mn=Lp%#|NLq6@tHs?IGTapRpORVb`i=Fq}T zSfleajP)iFE+1YdJj1izi8da(%lCC8 zPK!T^nu}fOU7YW>qaf4MR@sX?Ao@R1{kFYP_&)E~;~-OguXUosjigqAuuulp-tKTS z>>KeIX15>&4Y4AvSH+D_QeAQ4`&nUaT2qg8jLPC07vN~ODhB~*Z5_y3Gi+SD;j$FsZ);spVp8!Sl~EzaLxB0mi^7r z%%q|=+N8xP5irEJZ+q*qjqsYL98ASfXqRcG%vh8Qou*DqW_mdLxmeY0KSAIhs_edZ zHph{0${|F0kO=5yXzndoZ2!^Hs<2eEt4-Y4!(-xMF9^pDo@w9xLjBwE;|k1$Gkc3m zd9`v#bW>lx8^+kcXJl$VbN_D*Q&9r1o2j^bunx^mTN@{KO^~PTFj=xU?R#ooU{WA$ zCg4^iNgc7-cowb$M%iM+vFea+_~GCQN#y$W=z7=jC56P zoL$_qG^Xc-)}w~2y!g2)zfP?AA3j0{7UHccHlX5zusuC7g8iml_l?2>!r3&c%-$W zW|eADi_LosUlIY=+h#5}D+MSK_ZyhR0_sdSZ+d0vpEtf1wD4~`e1Wi8(sg<;1x7Wc zqu;y?bWh4x8Pr^V)WawR>(JcLINZ!6w#(K@9QD8Wo`myp8wS7+t)ZK95r z2kR#b1D6erKy=Gm9|{-U|8LaE|1OQ5-~Ty2y=&^qc)6ATW62B!<>4P=BS64$mq~w5 zoa>fp7w_>CMULz~V^f(&_6Snb*y%GU6lm;vfpQb5@D7N&yiHQ~K`AYvRW5;v%Z@yE z>{CO2oBLRx))tR0s1L_=DVe{k7+QeTNlaTw9Llu{7_gRJJ|VV^id@2GJg7=0;oiZF zQfUe7&?4c|L5qKfuD9e7oM!hpD67PjC2r0e*F(c1^ia#3GK5oOW)%@Qz6uO=&-Iq4fvG zy1bAnjs7B=qp42U>Z*RT=eHYm^~EQI!un|emg1H})e0HKyOP%`V;WGMG3yv|j4{S& z08)se4-Vh2L+B_J!>RHhO)NG7;h5aXixZ_tT`pWkKcA0uM~La8!w`;bb(1vvIE<7* zAY*mDP%~RuCqd`kZ0y>I>upi~VMFq`C4{#Pkd`(fh0AkvZlo1%aaSpve%NDv8w~57 z9A_qlrn&ygEHXQopQl~K=@6aI*W4M*W7~quT-f2~@0f3O&Qw!3RHeBG{X7q8J$cg^ z)M!g4kT6u=7jNO68Y5P*TJTGn6pcT6%1_d zjUK#_>c&;|>vd0TPc0}>US8bcQlU-5_~NGL#jG>)GBa|ePMefRVg>LPlJpOQ0q_J$ z%LhvTiIni8O!F#fk=+xG=(p+EF%cs~IS~D9r_J5CCHWllws{%wHfo85IXEVDDPj{% z`dc*ssj~fD`2J6{c?TgvXl!v7W|*V`+O@KB`}<{VzE16fU9y#b54{dK_$Va^1RT*z zG|sZ;Sxh&H5D!`%f$e%#XDa;OyzoMN!?nSZZW1E+71$PxCwx3A|wK z!XE!c1T2~Nnleeq#TBSp=!VfO z3dO;~G%@)OJ&xu+_QBS$!`e~*dWG;J$cs4(K4jgocgMNN2oL1Jm~P81g%Deq3dP=G z;?xJsXG1@H55IN`-iQudZ2P+_hFG$CNY(R4aOz{{%FhcK7}}fC9kZI3-x%=~(9s;` zDyC_~1Q;K1LR6~QdFrB#YRgb>6BUq? zCXm$+_TTmJVgTc1Q67dR_`orCZy1(cLmlx524L8~t2If(s{3#%!vO-ayp5I$(Wr&v zzl^?Z&p!z(6xWuD7}fZwfJ*gG5QUM}Zby^f&Kl?RQ*tPxY{=0K^x)F7C6Zd^M%dot z#wh{J>(&)bCK(!~F;n7X%xso83ie~kiiwJ6V~@bdCvQrb= zDW%*r)fG)jIi=h%Dt2>PMgm@cVLcou-)~WIc>Nencag<@=yFCmIj&EkGU~TIe9zjb zErbfHzVD8cow38SCg%42@q4`a!l-TeSk7E=R*zMp9<}}J!*9i~j2VcT$`tHoFDF&! zn?Xu9Cq+F!rtbcFwSVjI)GvdefvmnamGi6<8LWzgld*BV7l3v8|Fl%-ddOFg#OU>x z@tamEr*eiL_1fdMzm+4~$4Kq%pN^87FFhX1i1+ncTbO<$tR?wf@Oh)pxQcnQkWL=8EB=;S?OoDA8}2^EP(uo^DQ3B+UXne#+HFx_#Z)t3*$@GjjUB8=zt)W09Q_H zxIgp<8?L1C#-;U*uS`_9ovmBdnrL(oS-SXkf`bE5|4p1nr1PVa>{?{gucL}pUm{a? zs)(lVY<9rUcXT`))p|v1{7V;oGA-c%X9dnleYPb!2C2lnXBN~|Zy*Uxnqxw2?}{ZF zzQEx2RFt%u;~Z=(`t}gta)=hUBlAo>QovwKf1Cx3jg;5zR}B1Jk-ibp<3*O2Q+g_i zf*qiVja*BgDYj&ahXILn`zt}QK@(=*+8dXIWneUjtL~t7^wf!|FCG=T(8)@?V=6t9psj=%DOAxbCNafY=;Rf5QPjNs zm$Lq#K0S^Fv`!DS%l%dt%U(tic66}*jXFM197NPGy0A}|z6FSR&{k5>Q6;{WAgY36 zt24MGY+MdIFX&UoS7JxW2)CBktFiJ%Cxc`7mq()sEsO)vlNUOg03eE7>V^mdLt?gM z+iKOPS79NGZZ7JwMOT04N(T>}hds4F!h_n+oO+NFb2}QcYqnX8Ex_O6E)_|t%@#a* z+QB%SLWS`t-W!84;8@BotNlZeNo`qN^@@fv{&8ZJ1_OMLc@5oQQ^>Rzix)fnM^(y} zuwJWPfJmil^EhzxzovQk@!Ih$+HW}W&$2c_xn2=Cx1LwbK~2Npv%i@tLHnA*aSfcn zHG1jyLxK+EgM$rGuzNfu*f{AsCFWHY)mYW-Z=55aSRd)oA<8BCa5teiPVQ)c^CNE- z*IS{&cUW7xAeDkgDI+FH)&!WPW*&Bp!p(3% z>IRCP_^77tZkB-^dJX7!v$zENdonU&zc=Z{pLUMx=)+pc5r(*ZVIDpSz~j1q@f!G& zOM*z%m;SMyF;5WB`$g-4zysEss3r~+;LFj!YBChUU7tV4;kKf5!jO&u$rnJRYY+WR z6b1^)JEH&QlIw(Z;=$dKCWz~a+co4<|Lgew@xlK#;3&s>HcgcMnr-x485gB9@dZ$v zHkK=??bFiFfe$Mkm?NX>Z?wIeVs9gOQBb(zUUM_wzdzGIt4=(AD8X|C3SBP-@lJg= zNEr0JByy0=6lMXL%3X-$kD`HQw&f{$Z#u$BE(}Jewg$WDANT}RTG9`40-A+%4K5SZ zFkW?Hb;l^uKMnG|RiFaqXelKWaYv1CH810~fW&Rl<|-B z_6AD@jQQ5QcAcK^ZLD)zYT8ZXFLsTy7-}#*X%Cgy#jLy)xBWpYu)6M4+ycQYDrI^= ztR)3?1DKz%c~?z`dQHdK+2j?NGHr9>xx3F`pCJ-$?~x6A&ymm{svBz>+o{dO%nu-4 zfm?pAr`KSc;U4fAx(pmUAb|Zr#*_jM^Zzfv@Vi0QU16SUs^2v~N2@3=XS$i{i4h?q z+j0{>48GXWCO^Sn@M{>|s%f7CIl)&MAPNi)cNbdPv~8SsEk!?~C$B8Q)k=jUNeY?+ z{nzfd?d|Vjb1Clxo%%L>$yJQ_q9k+#7U|_iGhi{W_!ws9o{W^?Z?*mL{6aT|ly!je zB*xsfZ7~0N%vsB@!zQ;9No2JWboggY?5lcVhf-a6?(Q2xmttJsHzC=UsFbI~s^SVd zrH)kowjrNY1V|&1Nb=N*-d5SA+MzPJ;znnT1xajjN=NoCIF>bfbD8(E<-feA+##A#!_M8tMe(AIO9zF z<^{4y^ojX%ScOB)Q(Hd#>|yR8)cX2%I5Z#8+`o%`qcl8mA+M1KKH}h0oxkmac8aM}wWufG;Bh{6fvP<`f6ia%kc*=_?z*fU*Ip2cX>wTw;< zMB=kW`623g_HLiy;xBJy)ur}`+#D*MVzrgDN&I@?->VG@eCZJUqdVz8kLc1RC9Trg zHS=PvPIDARW%sqd5N;rR_q zB0wN*TlUR}ERbb|lQ986{smOXi4R(%>?|1kBcSZUn8!CW1`m@>D5|NZwXTA96Lt^P z$+_6xk;8`^>Y^#3^XqPxUvF-Yd5Pd37}>NTk=DL#ahq?!Rnh5bSUu@}g1@-aItcXl!J1rm;$ z@KFiHH2!045nQfQ8=(4>q@Izzn<6XFl!JwLvY3J;{XZB&k8OR|`GCQWl(-VkQ-r|% z!rTJu8SH}q2Ws1{qP!5*ByN`gCX~&5yK3O2HamT@K7-^~cyvgV@1dC6ecFe*cW10I zl>mdJxO{}G2BrAG8nzSE=L?%A`SPYnY!ra)Li#Q7UWnxq&FsaOwlrht`%qT77{@2<63Mmvbrypbea%>VyBi7RC2Pz3pJ_z4u!5~kQv53H!TlAUubN;& z{}G`Qg+7AV;El~#mhAq7>!n8rZ8)1TF#Ca|c5|DYF~2GW+h+PBkDRg`TDi<_y=7V= zvrN71AQJbC@OETvswWJvf4GqYLofl8QC;RF`SAcqrHNgxXg=e^6I`(Q2@(4F1HapR z5`T2F{wyPChNw@WnS!ri^#`u}Fso~o^8x@W<*(7RlhxAMW!sB=n#hIWhzix; zHH%*C5c_Q|=|P!pdZE$yXNs7gqWNw-zw0{9^guo9;9ZKU$(OKdmx-FcHbnC-;26R! z6~@1lWw`4!9tA_bY^Pab5Lnof59pDo0s!7e6-SC04ylxj{e)DL6NNOihBni0G_?zs zK8E_IPg%yVnIzax;LMXH0u6-0~LhUH0B!=~w)6r#fuMHVZ#2B8sOq9y)yucYnwB>`qlreLYmzkUOp2S2HJ zL|3m;@iD*JA{!s%*_C}o13a4wSd0n+6s)djvdHmKbNc5am?)$gu}~Yp#5`S~OG{bV zy!UBGP4U@LKY_|Ykr&WhjFZ%uvZ%_mpM1d@wXCtqlfB;3t_x-A6s!syW9vEqOebj6 zP@H;JRBc$U;dPW~3TxFGul~9Z5KmJ%xUWU7A3)t+t1^a~hrU0zT>mfbqZH7R20I=y zzqzu(!yK^ODP^Scoi_6gBn|$#qlvu~Z>cqGMC%QB<40+;t;Kl)=Iqq&-P=M7d4;fX zgnVISNErlk%|!%h3?!ln=30=vt929};Q6!wn8#qK)~=Bc2n&HJ3s|54FB$1S5TrP|h2 zy5}zYzp;uw-o@BFwP`-ml}b>r06~>YB{}pKwH0rg;QX?mJ^I*%% zF;cllXRl1F5l~(*FZ%rp@xGU*pdV+FNHZZQvnaz%#k*Pyi6+vWIh)h2D1Z9#J6VHQ zJQkI1AEuUs+=7H0s7pPRCo11hlJz3lv`&{}Dd2R{B)+TluZ+sId#ZygQd4Q@vMi1} zROoHr=CSXY z;UE2c*!o#bslfM6wO_MglB?xk>PP0@?8V^Q{SdD?zCYLkVse3mfThjhdsEcDeKa>y zd_JeCM7RgeMvIsXFkC2ncay&2zflTk!r(*FYt*GL-?!H1e2GQ~A5~pTm@_#+)tjK^ z-FuiattDfe5`)usZ^yI}wnEciM1?zSwwxoHxx)I)BVd{2H=x1~X}JU3maKPYC@F#r zET&Q>H2)|F8_={s1ic|&$C^2fgz zWfm<|rG{&smoFhW}x(_WxM^>ifsWq!B!{|D(^E zdpn**?Z3FoDC&P$%L&yxn;-viXup2(U*;HGWLga@-<}h@>fqFvDB*JEpc77V#98$&&qw)d;%Z4T;G(Z7B7h?;8_6io$Z7&DQe;v?gy*LXuWt z{tfxSv8>~m?ketP{+;*&U>?2Z>J_oi7nn~y!#vBLw{eMG31KF3LSm_>C3`ya{l0rRER`Sk`j2xTs$ z^#R_>XY|<mmwWk#YkE~1#Kp(soUNn1M`HH!m<+C7UUM#&JgSrO)96BQWznLMeH!VbBR~U%p0K zhm5=;*3{RIUJk8`Ur=FO%qCnSX%&5Vy0 z9q4|^e?Z)x?#qpxhs@u6XIS_|j%ExsG;V{c$V9wFyL!hLG}Fhnf^p5|P6CC%3@@36 z0b-Z?JhS^QO%4SpmCN!d!0K$~i;&h~Hw8UvKw?^gePJysEXw&7o*}w&9 zQaz?`n`j{EE2DI)Bc9Q%A6dOF7bels_w*_SNCjdnhqqSy4-W0^QMj+JnH#7*mY>s3 z?+}ywR5Te~>lkB2S1D;mzjGXkhvKNkayk)|o4kqN@9B@m>4kZv##qpD+@4o%DP2GM zX+QNCmFQucr0OMVy(8)Rfu!NA?|gZ{OYRrux{F-YwqXRI8f~6 zkX@>1*GzHaB;IQ$167(SQc#>H%{jL1GGn^Idiz;5VdD!xO_8L4%;5S{oqsb+L*B&S zfo(y!H2t^KOX_=2V^1Y(MXo?xVtLCj$Ikn+latm1LMXDFTwAJc&(Jmvxsmf|LdYVy zMM8AeLA}f)utsW+y@Ob_)6_T%)9Bs8BZ(f^jbFiB2Gx?4yJWpn(6U?LNz8Rpn1Tqy z<9^-wP+-2)gAEsA#q4XF@un$RQ9_!ajm+)YhG84&bg+s=@1=WE4tqDkHxKM)bEc{^Uhp-hzQ*f{UECUXn>b>~q!}#aF%Kyv%S;0h#@JP$;cZWCsNBHo+4xBx|*qnjrQHqr5BEblX Nf{dzkx#ZU${}1nhnj!!I literal 0 HcmV?d00001 diff --git a/website_recaptcha_v2_form/static/src/img/readme/img_1.png b/website_recaptcha_v2_form/static/src/img/readme/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..92fbe95fbeb6416d572d7da08bf97b05a1dc4b92 GIT binary patch literal 2036 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 literal 0 HcmV?d00001 diff --git a/website_recaptcha_v2_form/static/src/img/readme/img_3.png b/website_recaptcha_v2_form/static/src/img/readme/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1882ca3aa409b41a488880af62b6906ebae60744 GIT binary patch literal 29619 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 literal 0 HcmV?d00001 diff --git a/website_recaptcha_v2_form/static/src/scss/recaptcha.scss b/website_recaptcha_v2_form/static/src/scss/recaptcha.scss new file mode 100644 index 0000000000..918be7fe04 --- /dev/null +++ b/website_recaptcha_v2_form/static/src/scss/recaptcha.scss @@ -0,0 +1,5 @@ +div.s_website_form_recaptcha_v2 { + > div.g-recaptcha { + margin-left: 18% !important; + } +} diff --git a/website_recaptcha_v2_form/static/src/snippets/s_website_form/options.js b/website_recaptcha_v2_form/static/src/snippets/s_website_form/options.js new file mode 100644 index 0000000000..e9cffdefaa --- /dev/null +++ b/website_recaptcha_v2_form/static/src/snippets/s_website_form/options.js @@ -0,0 +1,44 @@ +odoo.define("website_recaptcha_v2_form.form_editor", function (require) { + "use strict"; + + var options = require("web_editor.snippets.options"); + const core = require("web.core"); + const rpc = require("web.rpc"); + const qweb = core.qweb; + require("website.form_editor"); + + options.registry.WebsiteFormEditor.include({ + willStart: async function () { + var res = this._super(...arguments); + this.recaptcha_site_key = await rpc.query({ + model: "website", + method: "get_recaptcha_v2_site_key", + }); + return res; + }, + toggleRecaptchaV2: async function () { + const recaptchaV2 = this.$target[0].querySelector( + ".s_website_form_recaptcha_v2" + ); + if (recaptchaV2) { + recaptchaV2.remove(); + } else { + const legal = qweb.render("website_recaptcha_v2_form.recaptcha_v2", { + recaptcha_site_key: this.recaptcha_site_key, + }); + this.$target.find(".s_website_form_submit").before(legal); + } + }, + _computeWidgetState: function (methodName, params) { + switch (methodName) { + case "toggleRecaptchaV2": + return ( + !this.$target[0].querySelector( + ".s_website_form_recaptcha_v2" + ) || "" + ); + } + return this._super(methodName, params); + }, + }); +}); diff --git a/website_recaptcha_v2_form/static/src/xml/website_form_editor.xml b/website_recaptcha_v2_form/static/src/xml/website_form_editor.xml new file mode 100644 index 0000000000..7ccfa89e67 --- /dev/null +++ b/website_recaptcha_v2_form/static/src/xml/website_form_editor.xml @@ -0,0 +1,25 @@ + + + + +
+ + +