Browse Source

July 25: [ADD] Initital Commits 'user_password_strength'

pull/331/head
Cybrosys Technologies 11 months ago
parent
commit
f0a6700231
  1. 43
      user_password_strength/README.rst
  2. 23
      user_password_strength/__init__.py
  3. 47
      user_password_strength/__manifest__.py
  4. 22
      user_password_strength/controllers/__init__.py
  5. 86
      user_password_strength/controllers/main.py
  6. 7
      user_password_strength/doc/RELEASE_NOTES.md
  7. 23
      user_password_strength/models/__init__.py
  8. 82
      user_password_strength/models/change_password_user.py
  9. 54
      user_password_strength/models/restrict_password.py
  10. BIN
      user_password_strength/static/description/assets/icons/check.png
  11. BIN
      user_password_strength/static/description/assets/icons/chevron.png
  12. BIN
      user_password_strength/static/description/assets/icons/cogs.png
  13. BIN
      user_password_strength/static/description/assets/icons/consultation.png
  14. BIN
      user_password_strength/static/description/assets/icons/ecom-black.png
  15. BIN
      user_password_strength/static/description/assets/icons/education-black.png
  16. BIN
      user_password_strength/static/description/assets/icons/hotel-black.png
  17. BIN
      user_password_strength/static/description/assets/icons/license.png
  18. BIN
      user_password_strength/static/description/assets/icons/lifebuoy.png
  19. BIN
      user_password_strength/static/description/assets/icons/logo.png
  20. BIN
      user_password_strength/static/description/assets/icons/manufacturing-black.png
  21. BIN
      user_password_strength/static/description/assets/icons/pos-black.png
  22. BIN
      user_password_strength/static/description/assets/icons/puzzle.png
  23. BIN
      user_password_strength/static/description/assets/icons/restaurant-black.png
  24. BIN
      user_password_strength/static/description/assets/icons/service-black.png
  25. BIN
      user_password_strength/static/description/assets/icons/trading-black.png
  26. BIN
      user_password_strength/static/description/assets/icons/training.png
  27. BIN
      user_password_strength/static/description/assets/icons/update.png
  28. BIN
      user_password_strength/static/description/assets/icons/user.png
  29. BIN
      user_password_strength/static/description/assets/icons/wrench.png
  30. 9
      user_password_strength/static/description/assets/misc/star (1) 2.svg
  31. BIN
      user_password_strength/static/description/assets/modules/pic1.png
  32. BIN
      user_password_strength/static/description/assets/modules/pic2.png
  33. BIN
      user_password_strength/static/description/assets/modules/pic3.png
  34. BIN
      user_password_strength/static/description/assets/modules/pic4.jpg
  35. BIN
      user_password_strength/static/description/assets/modules/pic5.png
  36. BIN
      user_password_strength/static/description/assets/modules/pic6.jpg
  37. BIN
      user_password_strength/static/description/assets/screenshots/PSC03.png
  38. BIN
      user_password_strength/static/description/assets/screenshots/PSC04.png
  39. BIN
      user_password_strength/static/description/assets/screenshots/final.png
  40. BIN
      user_password_strength/static/description/assets/screenshots/hero.gif
  41. BIN
      user_password_strength/static/description/assets/screenshots/psc02.png
  42. BIN
      user_password_strength/static/description/assets/screenshots/psc1.png
  43. BIN
      user_password_strength/static/description/banner.png
  44. BIN
      user_password_strength/static/description/icon.png
  45. 727
      user_password_strength/static/description/index.html
  46. 135
      user_password_strength/static/src/js/signup_user.js
  47. 50
      user_password_strength/views/restrict_password.xml
  48. 11
      user_password_strength/views/signup_page_view.xml

43
user_password_strength/README.rst

@ -0,0 +1,43 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
User Password Strength -Restrict Weak Password
==============================================
This module helps you to restrict weak password in user signup form.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developers: Farha V C @cybrosys,
version 17: Farha @cybrosys
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

23
user_password_strength/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import controllers
from . import models

47
user_password_strength/__manifest__.py

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################
{
'name': "User Password Strength",
'version': "17.0.1.0.0",
'summary': """ User password strength - restrict weak password""",
'description': """ Customized setting to restrict weak password which is
completely configurable. Also, allows the preset password strength checkup
while resetting.""",
'author': "Cybrosys Techno Solutions",
'company': "Cybrosys Techno Solutions",
'maintainer': "Cybrosys Techno Solutions",
'website': "https://cybrosys.com/",
'category': 'Tools',
'depends': ['base', 'website'],
'data': [
'views/signup_page_view.xml',
'views/restrict_password.xml',
],
'images': ['static/description/banner.png'],
'assets': {
'web.assets_frontend': ['user_password_strength/static/src/js/signup_user.js', ],
},
'license': "AGPL-3",
'installable': True,
'auto_install': True,
'application': False
}

22
user_password_strength/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import main

86
user_password_strength/controllers/main.py

@ -0,0 +1,86 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import http, _
from odoo.addons.web.controllers.home import Home, LOGIN_SUCCESSFUL_PARAMS
from odoo.exceptions import UserError
from odoo.http import request
import re
LOGIN_SUCCESSFUL_PARAMS.add('account_created')
class PasswordSecurity(Home):
"""overriding the website signup controller"""
def _prepare_signup_values(self, qcontext):
"""getting the values from config settings"""
values = {key: qcontext.get(key) for key in ('login', 'name',
'password')}
get_param = request.env['ir.config_parameter'].sudo().get_param
config_strength = get_param('user_password_strength.is_strength')
config_digit = get_param('user_password_strength.is_digit')
config_upper = get_param('user_password_strength.is_upper')
config_lower = get_param('user_password_strength.is_lower')
config_special_symbol = get_param('user_password_strength'
'.is_special_symbol')
if not values:
raise UserError(_("The form was not properly filled in."))
if values.get('password') != qcontext.get('confirm_password'):
raise UserError(_("Passwords do not match; please retype them."))
if values.get('password'):
current_password = str(values.get('password'))
if config_strength and (len(current_password) < 8):
raise UserError(_("*****The Password Should have 8 characters."
""))
else:
if config_digit and (re.search('[0-9]', current_password)
is None):
raise UserError(_(
"*****The Password Should have at least one number."))
if config_upper and (re.search('[A-Z]', current_password)
is None):
raise UserError(_(
"*****The Password Should have at least "
"one uppercase character."))
if config_lower and (re.search("[a-z]", current_password)
is None):
raise UserError(_(
"*****The Password Should have at least one "
"lowercase character."))
if config_special_symbol and \
(re.search("[~!@#$%^&*]", current_password) is None):
raise UserError(_(
"*****The Password Should have at least "
"one special symbol."))
return super()._prepare_signup_values(qcontext)
@http.route('/web/config_params', type='json', auth="public")
def website_get_config_value(self):
"""returning the values from config settings to js"""
get_param = request.env['ir.config_parameter'].sudo().get_param
return {
'config_strength': get_param('user_password_strength.is_strength'),
'config_digit': get_param('user_password_strength.is_digit'),
'config_upper': get_param('user_password_strength.is_upper'),
'config_lower': get_param('user_password_strength.is_lower'),
'config_special_symbol': get_param('user_password_strength'
'.is_special_symbol')
}

7
user_password_strength/doc/RELEASE_NOTES.md

@ -0,0 +1,7 @@
## Module <user_password_strength>
#### 12.07.2024
#### Version 17.0.1.0.0
#### ADD
- Initial Commit for User Password Strength

23
user_password_strength/models/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import restrict_password
from . import change_password_user

82
user_password_strength/models/change_password_user.py

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, _
import re
from odoo.exceptions import UserError
from odoo.http import request
class ChangePasswordUser(models.TransientModel):
""" Inherited model to configure users in the change password wizard. """
_inherit = 'change.password.user'
def change_password_button(self):
"""Overriding the password reset function"""
for line in self:
get_param = request.env['ir.config_parameter'].sudo().get_param
config_strength = get_param(
'user_password_strength.is_strength')
config_digit = get_param('user_password_strength.is_digit')
config_upper = get_param('user_password_strength.is_upper')
config_lower = get_param('user_password_strength.is_lower')
config_special_symbol = get_param('user_password_strength'
'.is_special_symbol')
if line.new_passwd:
current_password = line.new_passwd
if config_strength and (len(current_password) < 8):
raise UserError(
_("*****The Password Should have 8 characters."
""))
else:
if config_digit and (
re.search('[0-9]', current_password)
is None):
raise UserError(_(
"*****The Password Should have at least one number."))
if config_upper and (
re.search('[A-Z]', current_password)
is None):
raise UserError(_(
"*****The Password Should have at least "
"one uppercase character."))
if config_lower and (
re.search("[a-z]", current_password)
is None):
raise UserError(_(
"*****The Password Should have at least one "
"lowercase character."))
if config_special_symbol and \
(re.search("[~!@#$%^&*]",
current_password) is None):
raise UserError(_(
"*****The Password Should have at least "
"one special symbol."))
line.user_id._change_password(line.new_passwd)
else:
if (not config_strength and not
config_digit and not config_upper and not
config_lower and not config_special_symbol):
# don't keep temporary passwords in the database longer
# than necessary
self.write({'new_passwd': False})
else:
raise UserError(_("The password cannot be empty."))

54
user_password_strength/models/restrict_password.py

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Farha V C (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, fields
class ConfSettings(models.TransientModel):
"""inheriting configuration settings."""
_inherit = "res.config.settings"
user_password_restrict = fields.Boolean(string="Restrict User Password",
help="Tick this to enable password"
"restriction", default=True)
is_strength = fields.Boolean(string="Should have 8 characters",
help="Enable this to check for 8 characters",
config_parameter='user_password_strength.'
'is_strength')
is_digit = fields.Boolean(string="Should have at least one number",
help="Enable this to check for at least a digit",
config_parameter='user_password_strength.'
'is_digit')
is_upper = fields.Boolean(string="Should have at least one uppercase",
help="Enable this to check for uppercase letter",
config_parameter='user_password_strength.'
'is_upper')
is_lower = fields.Boolean(string="Should have at least one "
"lowercase character",
help="Enable this to check for lowercase letter",
config_parameter='user_password_strength.'
'is_lower')
is_special_symbol = fields.Boolean(string="Should have at least one "
"special symbol",
help="Enable this to check for "
"special symbol",
config_parameter='user_password_strength'
'.is_special_symbol')

BIN
user_password_strength/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
user_password_strength/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
user_password_strength/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
user_password_strength/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
user_password_strength/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
user_password_strength/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
user_password_strength/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
user_password_strength/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
user_password_strength/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
user_password_strength/static/description/assets/icons/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
user_password_strength/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
user_password_strength/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
user_password_strength/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
user_password_strength/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
user_password_strength/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
user_password_strength/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
user_password_strength/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
user_password_strength/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
user_password_strength/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
user_password_strength/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

9
user_password_strength/static/description/assets/misc/star (1) 2.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

BIN
user_password_strength/static/description/assets/modules/pic1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
user_password_strength/static/description/assets/modules/pic2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
user_password_strength/static/description/assets/modules/pic3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
user_password_strength/static/description/assets/modules/pic4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
user_password_strength/static/description/assets/modules/pic5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
user_password_strength/static/description/assets/modules/pic6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
user_password_strength/static/description/assets/screenshots/PSC03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
user_password_strength/static/description/assets/screenshots/PSC04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
user_password_strength/static/description/assets/screenshots/final.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
user_password_strength/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
user_password_strength/static/description/assets/screenshots/psc02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
user_password_strength/static/description/assets/screenshots/psc1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
user_password_strength/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
user_password_strength/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

727
user_password_strength/static/description/index.html

@ -0,0 +1,727 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Odoo App 3 Index</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body>
<section>
<div class="container"
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center"
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)">
<div class="my-3">
<img src="./assets/icons/logo.png" style="width: auto !important; height: 40px !important;">
</div>
<div class="my-3 d-flex align-items-center">
<div class="text-center"
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Community
</div>
<div class="text-center"
style="background-color:#875A7B !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important;min-width: 120px !important;">
Enterprise
</div>
<div class="text-center"
style="background-color:#7C7BAD !important; color:#fff !important;font-size: 0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Odoo.sh
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column"
style="margin: 80px 0px !important;">
<h1 style="font-size: 2.8rem;font-weight: 700; color:
#1A202C;">
USER PASSWORD STRENGTH</h1>
<p class="my-3 mb-4"
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;">
User Password Strength - Configurable setting to restrict
Weak Password</p>
<!-- END OF APP HERO -->
</p>
<div style="width: 80%; margin-top: 3rem;">
<img src="assets/screenshots/hero.gif"
class="img-responsive" width="100%" height="auto">
</div>
</div>
</div>
<div class="container mt-5 mb-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#714b67 !important">
Key Highlights
</p>
</div>
<div class="row py-4">
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Configurable Password Strength</p>
<p class="m-0" style="color:#718096">This allows to restrict
the weak passwords based on five different types
of custom settings which can be configured
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Gives User Error Warnings</p>
<p class="m-0" style="color:#718096"> This module checks the
configured custom conditions every time when the
user sets the password or changes the password from
the User form view</p>
</div>
</div>
</div>
</div>
</div>
<div class="container rounded">
<ul class="nav nav-tabs d-flex"
style="width: fit-content;margin: 0 auto;gap: 1rem;">
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
class="active show" data-toggle="tab" href="#tab1"
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;">
<i class="fa-regular fa-image pr-2"
style="color: #fff;"></i>
Screenshots </a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab2"
style="color: #fff;font-weight: 500; text-decoration: none;"><i
class="fa-solid fa-star pr-2"
style="color: #fff;"></i> Features </a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab3"
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i
class="fa-solid fa-book-open pr-2"
style="color: #fff;"></i> Released Notes </a></li>
</ul>
<div class="tab-content"
style="background-color: rgba(121, 113, 119, 0.04);">
<div id="tab1" class="tab-pane fade in active show">
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="px-3">
<u>
<h4 class="my-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Choose Conditions</h4>
</u>
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/psc1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
We can select the required conditions of a strong password.</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="px-3">
<u>
<h4 class="my-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Progressbar for password</h4>
</u>
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/psc02.png"
class="img-responsive" width="100%"
height="auto">
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="px-3">
<u>
<h4 class="my-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Warnings on conditions</h4>
</u>
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/PSC04.png"
class="img-responsive" width="100%"
height="auto">
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="px-3">
<u>
<h4 class="my-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Password Length Restriction.</h4>
</u>
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/PSC03.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
If selected conditions of the password is not satisfies the user password an error message will appear as warning about the conditions in signup form and restricting further signup.</h4>
</div>
</div>
</div><div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="px-3">
<u>
<h4 class="my-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Strong Password</h4>
</u>
</div>
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/final.png"
class="img-responsive" width="100%"
height="auto">
</div>
</div>
</div>
</div>
<div id="tab2" class="tab-pane fade">
<div class="col-mg-12" style="padding: 1rem 4rem;">
<ul style="list-style: none; padding: 1rem 0;font-weight: 500;">
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Configurable Password Strength
</li>
<li class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<span style="margin-right: 12px;"><img
src="assets/misc/star (1) 2.svg"
alt=""
width="16px"></span>Gives User Error Warnings
</li>
</ul>
</div>
</div>
<div id="tab3" class="tab-pane fade">
<div class="col-mg-12 active" style="padding: 1rem 4rem;">
<div class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="d-flex mb-3"
style="font-size: 0.8rem; font-weight: 500;"><span>Version
17.0.1.0.0</span><span
class="px-2">|</span><span
style="color: #714B67;font-weight: 600;">Released on:12th July 2024</span>
</div>
<p class="m-0"
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;">
Initial Commit for User Password Strength</p>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Related Products</p>
</div>
</div>
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/product_barcode/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/pic1.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Product Barcode Generator</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/export_stockinfo_xls/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/pic2.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Export Product Stock In Excel</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/inventory_barcode_scanning/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/pic3.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Barcode Scanning In Inventory</p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/whatsapp_redirect/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/pic4.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Send Whatsapp Message</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/invoice_format_editor/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/pic5.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Invoice Format Editor</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/mobile_service_shop/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/pic6.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Mobile Service Management</p>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<a class="carousel-control-prev" href="#myCarousel"
data-slide="prev" style="width: 35px; color: #000;">
<span class="carousel-control-prev-icon">
<i class="fa fa-chevron-left"
style="font-size: 24px;"></i>
</span>
</a>
<a class="carousel-control-next" href="#myCarousel"
data-slide="next" style="width: 35px; color: #000;">
<span class="carousel-control-next-icon">
<i class="fa fa-chevron-right"
style="font-size: 24px;"></i>
</span>
</a>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Services</p>
</div>
</div>
<div class="container my-5">
<div class="row py-3">
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/cogs.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Customization</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/wrench.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/lifebuoy.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Support</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/user.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Hire
Odoo Developer</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/puzzle.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Integration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/update.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Migration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/consultation.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Consultancy</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/training.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/license.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Licensing Consultancy</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Industries</p>
</div>
</div>
<div class="container">
<div class="row my-5 py-4">
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100 "
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/trading-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Trading</p>
<p>Easily procure and sell your products</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/pos-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">POS</p>
<p>Easy configuration and convivial experience</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)">
<img src="assets/icons/education-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Education</p>
<p>A platform for educational management</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/manufacturing-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Manufacturing</p>
<p>Plan, track and schedule your operations</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/ecom-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">E-commerce &
Website</p>
<p>Mobile friendly, awe-inspiring product pages</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/service-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Service
Management</p>
<p>Keep track of services and invoice</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/restaurant-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Restaurant</p>
<p>Run your bar or restaurant methodically</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/hotel-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Hotel
Management</p>
<p>An all-inclusive hotel management application</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Support</p>
</div>
</div>
<div class="container my-5">
<div class="row" style="background-color: #FFFAFE;">
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"
style="border-right: 1px solid #D9D9D9;">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/support (1) 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div style="padding: 0px 8px;">
<span
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need
Help?</span>
<p class="m-0" style="color:#718096;">Got
questions or need help? Get in touch.</p>
<div style="font-weight: 400;"><span><img
src="assets/misc/support-email.svg"
alt=""
width="18px"
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/whatsapp 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div>
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span>
<p class="m-0" style="color:#718096;">Say hi to
us on WhatsApp!</p>
<div style="font-weight: 400; font-size: 16px;"><span><img
src="assets/misc/phone.svg"
alt="" width="14px"
style="filter: invert(1); margin-right: 0.8rem;"></span>+91
99456767686
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

135
user_password_strength/static/src/js/signup_user.js

@ -0,0 +1,135 @@
/** @odoo-module **/
/*Extending the public widget of the signup form for checking the user
password strength conditions on key up function of the password field in
the sign up form,Based on the conditions from configuration settings.*/
import { jsonrpc } from "@web/core/network/rpc_service";
import publicWidget from "@web/legacy/js/public/public_widget";
var password = document.getElementById("password");
publicWidget.registry.SignUpFormKeyupChange = publicWidget.Widget.extend({
selector: '.oe_signup_form',
events: {
'keypress input': '_onKeypress',
},
init() {
this._super(...arguments);
},
_onKeypress: function () {
jsonrpc('/web/config_params',{}).then(function (data) {
var list=[]
for (let x in data) {
list.push(data[x]);
}
var flag = 0
for(var i=0;i<=list.length;i++){
if(list[i] == 'True'){
flag +=1
}
}
var prog = [/[$@$!%*#?&]/, /[A-Z]/, /[0-9]/, /[a-z]/]
.reduce((memo, test) => memo + test.test(current_pwd),
0);
if(prog > 2 && current_pwd.length > 7){
prog++;
}
var progress = "";
var colors = ['#FF0000', '#00FF00','#0000FF'];
var currentColor = 0;
//When 5 conditions are enabled in config settings
if (flag == 5){
switch (prog) {
case 0:
case 1:
progress = "20";
currentColor = colors[0];
break;
case 2:
progress = "25";
currentColor = colors[0];
break;
case 3:
progress = "100";
currentColor = colors[1];
break;
case 4:
progress = "75";
currentColor = colors[1];
break;
case 5:
progress = "100";
currentColor = colors[1];
break;
}
}
//When 4 conditions are enabled in config settings
if (flag == 4){
switch (prog) {
case 0:
case 1:
case 2:
progress = "25";
currentColor = colors[0];
break;
case 3:
progress = "50";
currentColor = colors[0];
break;
case 4:
progress = "75";
currentColor = colors[1];
break;
case 5:
progress = "100";
currentColor = colors[1];
break;
}
}
//When 3 conditions are enabled in config settings
if (flag == 3){
switch (prog) {
case 0:
case 1:
case 2:
case 3:
progress = "33.33";
currentColor = colors[0];
break;
case 4:
progress = "66.66";
currentColor = colors[1];
break;
case 5:
progress = "100";
currentColor = colors[1];
break;
}
}
//When 2 conditions are enabled in config settings
if (flag == 2) {
if (prog != 5) {
progress = "50";
currentColor = colors[0];
} else{
progress = "100";
currentColor = colors[1];
}
}
//When only 1 condition is enabled in config settings
if (flag == 1){
progress = "100";
currentColor = colors[1];
}
var val = document.getElementById("progress")
if(val!== null){
document.getElementById("progress").value = progress;
document.getElementById("progress").style
.backgroundColor = currentColor;
}
});
// Reset if password length is zero
var current_pwd = password.value
if (current_pwd.length === 0) {
document.getElementById("progress").value = "0";
return;
}
},
});

50
user_password_strength/views/restrict_password.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="res_config_settings_inherit_view_form" model="ir.ui.view">
<field name="name">res.config.settings.inherit.view</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//setting[@id='enable_password_reset']" position="after">
<div class="col-12 col-lg-6 o_setting_box"
id="enable_password_restrict">
<div class="o_setting_left_pane">
<field name="user_password_restrict"/>
</div>
<div class="o_setting_right_pane">
<label string="Restrict User Password"
for="user_password_restrict"/>
<div class="text-muted">
Enable user password strength -
restricting weak password
</div>
<div class="mt16" invisible="user_password_restrict==False">
<div class="content-group" id="restrict">
<div>
<field name="is_strength"/>
<label for="is_strength"/>
</div>
<div>
<field name="is_digit"/>
<label for="is_digit"/>
</div>
<div>
<field name="is_upper"/>
<label for="is_upper"/>
</div>
<div>
<field name="is_lower"/>
<label for="is_lower"/>
</div>
<div>
<field name="is_special_symbol"/>
<label for="is_special_symbol"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

11
user_password_strength/views/signup_page_view.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template id="document_fields" inherit_id="auth_signup.fields">
<xpath expr="//input[@name='password']" position="after">
<div>
<progress id="progress" value="0" max="100"
style="color: red;">70</progress>
</div>
</xpath>
</template>
</odoo>
Loading…
Cancel
Save