From 596fc91a0a751a68ecc87a519238a0d64f402e89 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 19 Feb 2025 14:06:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BD=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 2 ++ __manifest__.py | 17 +++++++++ controllers.py | 10 ++++++ i18n/auth_password_policy_signup.pot | 15 ++++++++ .../password_meter/password_meter.js | 35 +++++++++++++++++++ .../password_meter/password_meter.xml | 6 ++++ static/src/public/scss/signup_policy.scss | 6 ++++ views/signup_templates.xml | 8 +++++ 8 files changed, 99 insertions(+) create mode 100644 __init__.py create mode 100644 __manifest__.py create mode 100644 controllers.py create mode 100644 i18n/auth_password_policy_signup.pot create mode 100644 static/src/public/components/password_meter/password_meter.js create mode 100644 static/src/public/components/password_meter/password_meter.xml create mode 100644 static/src/public/scss/signup_policy.scss create mode 100644 views/signup_templates.xml diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..153a9e3 --- /dev/null +++ b/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import controllers diff --git a/__manifest__.py b/__manifest__.py new file mode 100644 index 0000000..7319f38 --- /dev/null +++ b/__manifest__.py @@ -0,0 +1,17 @@ +{ + 'name': "Password Policy support for Signup", + 'depends': ['auth_password_policy', 'auth_signup'], + 'category': 'Hidden/Tools', + 'auto_install': True, + 'data': [ + 'views/signup_templates.xml', + ], + 'assets': { + 'web.assets_frontend': [ + 'auth_password_policy_signup/static/src/public/**/*', + 'auth_password_policy/static/src/password_meter.js', + 'auth_password_policy/static/src/password_policy.js', + ], + }, + 'license': 'LGPL-3', +} diff --git a/controllers.py b/controllers.py new file mode 100644 index 0000000..278ac20 --- /dev/null +++ b/controllers.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + +from odoo.http import request +from odoo.addons.auth_signup.controllers.main import AuthSignupHome + +class AddPolicyData(AuthSignupHome): + def get_auth_signup_config(self): + d = super(AddPolicyData, self).get_auth_signup_config() + d['password_minimum_length'] = request.env['ir.config_parameter'].sudo().get_param('auth_password_policy.minlength') + return d diff --git a/i18n/auth_password_policy_signup.pot b/i18n/auth_password_policy_signup.pot new file mode 100644 index 0000000..06d842d --- /dev/null +++ b/i18n/auth_password_policy_signup.pot @@ -0,0 +1,15 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 21:55+0000\n" +"PO-Revision-Date: 2023-10-26 21:55+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" diff --git a/static/src/public/components/password_meter/password_meter.js b/static/src/public/components/password_meter/password_meter.js new file mode 100644 index 0000000..834b6f7 --- /dev/null +++ b/static/src/public/components/password_meter/password_meter.js @@ -0,0 +1,35 @@ +/** @odoo-module */ + +import { Meter } from "@auth_password_policy/password_meter"; +import { ConcretePolicy, recommendations } from "@auth_password_policy/password_policy"; +import { Component, useExternalListener, useState, xml } from "@odoo/owl"; +import { registry } from "@web/core/registry"; + +class PasswordMeter extends Component { + static template = xml` + `; + static components = { Meter }; + static props = { + selector: String, + }; + + setup() { + const inputEl = document.querySelector(this.props.selector); + useExternalListener(inputEl, "input", (e) => { + this.state.password = e.target.value || ""; + }); + + const minlength = Number(inputEl.getAttribute("minlength")); + this.hasMinlength = !isNaN(minlength); + this.state = useState({ + password: inputEl.value || "", + }); + this.required = new ConcretePolicy({ minlength }); + this.recommended = recommendations; + } +} + +registry.category("public_components").add("password_meter", PasswordMeter); diff --git a/static/src/public/components/password_meter/password_meter.xml b/static/src/public/components/password_meter/password_meter.xml new file mode 100644 index 0000000..2aba44b --- /dev/null +++ b/static/src/public/components/password_meter/password_meter.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/src/public/scss/signup_policy.scss b/static/src/public/scss/signup_policy.scss new file mode 100644 index 0000000..1b22a12 --- /dev/null +++ b/static/src/public/scss/signup_policy.scss @@ -0,0 +1,6 @@ +.field-password { + position: relative; + meter.o_password_meter { + bottom: calc(#{$input-height} / 2 - 7px); + } +} diff --git a/views/signup_templates.xml b/views/signup_templates.xml new file mode 100644 index 0000000..f797da3 --- /dev/null +++ b/views/signup_templates.xml @@ -0,0 +1,8 @@ + + +