From 63017be7493b991e2d2ea9dcb35558c804e66972 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Thu, 18 Apr 2024 20:53:05 +0200 Subject: [PATCH 1/6] Add module base_user_empty_password --- base_user_empty_password/__init__.py | 2 ++ base_user_empty_password/__manifest__.py | 22 +++++++++++++ base_user_empty_password/models/__init__.py | 1 + base_user_empty_password/models/res_users.py | 25 +++++++++++++++ .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 3 ++ .../security/ir.model.access.csv | 2 ++ base_user_empty_password/views/res_users.xml | 15 +++++++++ base_user_empty_password/wizard/__init__.py | 1 + .../wizard/empty_password.py | 24 ++++++++++++++ .../wizard/empty_password.xml | 31 +++++++++++++++++++ 11 files changed, 127 insertions(+) create mode 100644 base_user_empty_password/__init__.py create mode 100644 base_user_empty_password/__manifest__.py create mode 100644 base_user_empty_password/models/__init__.py create mode 100644 base_user_empty_password/models/res_users.py create mode 100644 base_user_empty_password/readme/CONTRIBUTORS.md create mode 100644 base_user_empty_password/readme/DESCRIPTION.md create mode 100644 base_user_empty_password/security/ir.model.access.csv create mode 100644 base_user_empty_password/views/res_users.xml create mode 100644 base_user_empty_password/wizard/__init__.py create mode 100644 base_user_empty_password/wizard/empty_password.py create mode 100644 base_user_empty_password/wizard/empty_password.xml diff --git a/base_user_empty_password/__init__.py b/base_user_empty_password/__init__.py new file mode 100644 index 0000000000..9b4296142f --- /dev/null +++ b/base_user_empty_password/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/base_user_empty_password/__manifest__.py b/base_user_empty_password/__manifest__.py new file mode 100644 index 0000000000..a85edc633c --- /dev/null +++ b/base_user_empty_password/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +{ + "name": "Empty users password", + "summary": "Allows to empty password of users", + "version": "14.0.1.0.0", + "development_status": "Beta", + "category": "Uncategorized", + "website": "https://github.com/OCA/server-auth", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["grindtildeath"], + "license": "AGPL-3", + "depends": [ + "base", + ], + "data": [ + # "data/ir_actions.xml", + "security/ir.model.access.csv", + "views/res_users.xml", + "wizard/empty_password.xml", + ], +} diff --git a/base_user_empty_password/models/__init__.py b/base_user_empty_password/models/__init__.py new file mode 100644 index 0000000000..8835165330 --- /dev/null +++ b/base_user_empty_password/models/__init__.py @@ -0,0 +1 @@ +from . import res_users diff --git a/base_user_empty_password/models/res_users.py b/base_user_empty_password/models/res_users.py new file mode 100644 index 0000000000..84cb481682 --- /dev/null +++ b/base_user_empty_password/models/res_users.py @@ -0,0 +1,25 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + has_password = fields.Boolean(compute="_compute_has_password") + + def _compute_has_password(self): + # Bypass ORM as password is always empty in cache + self.env.cr.execute( + """SELECT id, password FROM res_users WHERE id IN %s;""", (tuple(self.ids),) + ) + res = {row[0]: row[1] for row in self.env.cr.fetchall()} + for user in self: + user.has_password = bool(res.get(user.id)) + + def _empty_password(self): + # Update in DB to avoid using crypt context + self.env.cr.execute( + """UPDATE res_users SET password = %s WHERE id IN %s""", + ("", (tuple(self.ids),)), + ) diff --git a/base_user_empty_password/readme/CONTRIBUTORS.md b/base_user_empty_password/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..911d30d42f --- /dev/null +++ b/base_user_empty_password/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Akim Juillerat diff --git a/base_user_empty_password/readme/DESCRIPTION.md b/base_user_empty_password/readme/DESCRIPTION.md new file mode 100644 index 0000000000..cdb902d245 --- /dev/null +++ b/base_user_empty_password/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module provides a wizard to allow emptying users password field. + +This could be useful to force the user to use another sign on method than Odoo. diff --git a/base_user_empty_password/security/ir.model.access.csv b/base_user_empty_password/security/ir.model.access.csv new file mode 100644 index 0000000000..ca08092624 --- /dev/null +++ b/base_user_empty_password/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_empty_password_wizard,access_empty_password_wizard,model_empty_password_wizard,base.group_erp_manager,1,1,1,1 diff --git a/base_user_empty_password/views/res_users.xml b/base_user_empty_password/views/res_users.xml new file mode 100644 index 0000000000..83ef384cbb --- /dev/null +++ b/base_user_empty_password/views/res_users.xml @@ -0,0 +1,15 @@ + + + + res.users.form + res.users + + + + + + + + + + diff --git a/base_user_empty_password/wizard/__init__.py b/base_user_empty_password/wizard/__init__.py new file mode 100644 index 0000000000..00e7d95e31 --- /dev/null +++ b/base_user_empty_password/wizard/__init__.py @@ -0,0 +1 @@ +from . import empty_password diff --git a/base_user_empty_password/wizard/empty_password.py b/base_user_empty_password/wizard/empty_password.py new file mode 100644 index 0000000000..c1ddfa2f85 --- /dev/null +++ b/base_user_empty_password/wizard/empty_password.py @@ -0,0 +1,24 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import fields, models + + +class EmptyPasswordWizard(models.TransientModel): + _name = "empty.password.wizard" + _description = "Empty Password Wizard" + + user_ids = fields.Many2many( + "res.users", readonly=True, default=lambda w: w._default_user_ids() + ) + + def _default_user_ids(self): + return ( + self.env.context.get("active_model") == "res.users" + and self.env.context.get("active_ids") + or [] + ) + + def empty_password_button(self): + self.ensure_one() + self.user_ids._empty_password() + return {"type": "ir.actions.client", "tag": "reload"} diff --git a/base_user_empty_password/wizard/empty_password.xml b/base_user_empty_password/wizard/empty_password.xml new file mode 100644 index 0000000000..158f05b126 --- /dev/null +++ b/base_user_empty_password/wizard/empty_password.xml @@ -0,0 +1,31 @@ + + + + Empty Password + empty.password.wizard + +
+ +
+

Are you sure you want to empty password of selected users?

+
+
+
+ +
+
+ + Empty Password + empty.password.wizard + form + new + + +
From 2a5f61526dd89d4761fe5c9b6e607610ad0a9e4a Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 8 May 2024 07:08:24 +0000 Subject: [PATCH 2/6] [UPD] Update base_user_empty_password.pot --- .../i18n/base_user_empty_password.pot | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 base_user_empty_password/i18n/base_user_empty_password.pot diff --git a/base_user_empty_password/i18n/base_user_empty_password.pot b/base_user_empty_password/i18n/base_user_empty_password.pot new file mode 100644 index 0000000000..ad4928560a --- /dev/null +++ b/base_user_empty_password/i18n/base_user_empty_password.pot @@ -0,0 +1,88 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_user_empty_password +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \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: base_user_empty_password +#: model_terms:ir.ui.view,arch_db:base_user_empty_password.empty_password_wizard_view +msgid "Are you sure you want to empty password of selected users?" +msgstr "" + +#. module: base_user_empty_password +#: model_terms:ir.ui.view,arch_db:base_user_empty_password.empty_password_wizard_view +msgid "Cancel" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__display_name +#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users__display_name +msgid "Display Name" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.actions.act_window,name:base_user_empty_password.empty_password_wizard_action +#: model_terms:ir.ui.view,arch_db:base_user_empty_password.empty_password_wizard_view +msgid "Empty Password" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model,name:base_user_empty_password.model_empty_password_wizard +msgid "Empty Password Wizard" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users__has_password +msgid "Has Password" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__id +#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users__id +msgid "ID" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard____last_update +#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__user_ids +msgid "User" +msgstr "" + +#. module: base_user_empty_password +#: model:ir.model,name:base_user_empty_password.model_res_users +msgid "Users" +msgstr "" From 25a581322cf6293fc359072090985758bc55cb05 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 8 May 2024 07:14:48 +0000 Subject: [PATCH 3/6] [BOT] post-merge updates --- base_user_empty_password/README.rst | 87 ++++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 424 ++++++++++++++++++ 3 files changed, 511 insertions(+) create mode 100644 base_user_empty_password/README.rst create mode 100644 base_user_empty_password/static/description/icon.png create mode 100644 base_user_empty_password/static/description/index.html diff --git a/base_user_empty_password/README.rst b/base_user_empty_password/README.rst new file mode 100644 index 0000000000..a85c2d7b46 --- /dev/null +++ b/base_user_empty_password/README.rst @@ -0,0 +1,87 @@ +==================== +Empty users password +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:512d1e5b2dee0d04bf83cf2186bc757d4bc2e0f660342c92128bce2ba1bb571c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fserver--auth-lightgray.png?logo=github + :target: https://github.com/OCA/server-auth/tree/14.0/base_user_empty_password + :alt: OCA/server-auth +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-auth-14-0/server-auth-14-0-base_user_empty_password + :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/server-auth&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides a wizard to allow emptying users password field. + +This could be useful to force the user to use another sign on method +than Odoo. + +**Table of contents** + +.. contents:: + :local: + +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 +------- + +* Camptocamp + +Contributors +------------ + +- Akim Juillerat akim.juilllerat@camptocamp.com + +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. + +.. |maintainer-grindtildeath| image:: https://github.com/grindtildeath.png?size=40px + :target: https://github.com/grindtildeath + :alt: grindtildeath + +Current `maintainer `__: + +|maintainer-grindtildeath| + +This module is part of the `OCA/server-auth `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_user_empty_password/static/description/icon.png b/base_user_empty_password/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/base_user_empty_password/static/description/index.html b/base_user_empty_password/static/description/index.html new file mode 100644 index 0000000000..c040865eba --- /dev/null +++ b/base_user_empty_password/static/description/index.html @@ -0,0 +1,424 @@ + + + + + +Empty users password + + + +
+

Empty users password

+ + +

Beta License: AGPL-3 OCA/server-auth Translate me on Weblate Try me on Runboat

+

This module provides a wizard to allow emptying users password field.

+

This could be useful to force the user to use another sign on method +than Odoo.

+

Table of contents

+ +
+

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

+
    +
  • Camptocamp
  • +
+
+ +
+

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.

+

Current maintainer:

+

grindtildeath

+

This module is part of the OCA/server-auth project on GitHub.

+

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

+
+
+
+ + From ff3ea595e2d5186e057e4f81ed8a72ae78edc2ec Mon Sep 17 00:00:00 2001 From: chaule97 Date: Thu, 26 Sep 2024 18:11:08 +0700 Subject: [PATCH 4/6] [IMP] base_user_empty_password: pre-commit auto fixes --- base_user_empty_password/pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 base_user_empty_password/pyproject.toml diff --git a/base_user_empty_password/pyproject.toml b/base_user_empty_password/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/base_user_empty_password/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" From da8c346fb6ecf3505e3e9bdf588e79c24aeda072 Mon Sep 17 00:00:00 2001 From: chaule97 Date: Fri, 27 Sep 2024 12:20:31 +0700 Subject: [PATCH 5/6] [MIG] base_user_empty_password: Migration to 18.0 --- base_user_empty_password/README.rst | 17 +++++++---- base_user_empty_password/__manifest__.py | 3 +- .../i18n/base_user_empty_password.pot | 20 ++++++------- .../readme/CONTRIBUTORS.md | 1 + base_user_empty_password/readme/CREDITS.md | 1 + .../static/description/index.html | 28 +++++++++++++------ .../wizard/empty_password.py | 23 ++++++++------- 7 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 base_user_empty_password/readme/CREDITS.md diff --git a/base_user_empty_password/README.rst b/base_user_empty_password/README.rst index a85c2d7b46..1c779f7128 100644 --- a/base_user_empty_password/README.rst +++ b/base_user_empty_password/README.rst @@ -17,13 +17,13 @@ Empty users password :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--auth-lightgray.png?logo=github - :target: https://github.com/OCA/server-auth/tree/14.0/base_user_empty_password + :target: https://github.com/OCA/server-auth/tree/18.0/base_user_empty_password :alt: OCA/server-auth .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-auth-14-0/server-auth-14-0-base_user_empty_password + :target: https://translation.odoo-community.org/projects/server-auth-18-0/server-auth-18-0-base_user_empty_password :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/server-auth&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-auth&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -44,7 +44,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -60,6 +60,13 @@ Contributors ------------ - Akim Juillerat akim.juilllerat@camptocamp.com +- Chau Le chaulb@trobz.com + +Other credits +------------- + +The migration of this module from 14.0 to 18.0 was financially supported +by Camptocamp. Maintainers ----------- @@ -82,6 +89,6 @@ Current `maintainer `__: |maintainer-grindtildeath| -This module is part of the `OCA/server-auth `_ project on GitHub. +This module is part of the `OCA/server-auth `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_user_empty_password/__manifest__.py b/base_user_empty_password/__manifest__.py index a85edc633c..881a57834a 100644 --- a/base_user_empty_password/__manifest__.py +++ b/base_user_empty_password/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Empty users password", "summary": "Allows to empty password of users", - "version": "14.0.1.0.0", + "version": "18.0.1.0.0", "development_status": "Beta", "category": "Uncategorized", "website": "https://github.com/OCA/server-auth", @@ -14,7 +14,6 @@ "base", ], "data": [ - # "data/ir_actions.xml", "security/ir.model.access.csv", "views/res_users.xml", "wizard/empty_password.xml", diff --git a/base_user_empty_password/i18n/base_user_empty_password.pot b/base_user_empty_password/i18n/base_user_empty_password.pot index ad4928560a..a421ed92e2 100644 --- a/base_user_empty_password/i18n/base_user_empty_password.pot +++ b/base_user_empty_password/i18n/base_user_empty_password.pot @@ -4,8 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 18.1alpha1+e\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-27 05:16+0000\n" +"PO-Revision-Date: 2024-09-27 05:16+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -35,7 +37,6 @@ msgstr "" #. module: base_user_empty_password #: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__display_name -#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users__display_name msgid "Display Name" msgstr "" @@ -57,16 +58,9 @@ msgstr "" #. module: base_user_empty_password #: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__id -#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users__id msgid "ID" msgstr "" -#. module: base_user_empty_password -#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard____last_update -#: model:ir.model.fields,field_description:base_user_empty_password.field_res_users____last_update -msgid "Last Modified on" -msgstr "" - #. module: base_user_empty_password #: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__write_uid msgid "Last Updated by" @@ -78,11 +72,13 @@ msgid "Last Updated on" msgstr "" #. module: base_user_empty_password -#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__user_ids -msgid "User" +#. odoo-python +#: code:addons/base_user_empty_password/wizard/empty_password.py:0 +msgid "This can only be used on users." msgstr "" #. module: base_user_empty_password #: model:ir.model,name:base_user_empty_password.model_res_users -msgid "Users" +#: model:ir.model.fields,field_description:base_user_empty_password.field_empty_password_wizard__user_ids +msgid "User" msgstr "" diff --git a/base_user_empty_password/readme/CONTRIBUTORS.md b/base_user_empty_password/readme/CONTRIBUTORS.md index 911d30d42f..fd802b9c91 100644 --- a/base_user_empty_password/readme/CONTRIBUTORS.md +++ b/base_user_empty_password/readme/CONTRIBUTORS.md @@ -1 +1,2 @@ - Akim Juillerat +- Chau Le diff --git a/base_user_empty_password/readme/CREDITS.md b/base_user_empty_password/readme/CREDITS.md new file mode 100644 index 0000000000..573d68b7e8 --- /dev/null +++ b/base_user_empty_password/readme/CREDITS.md @@ -0,0 +1 @@ +The migration of this module from 14.0 to 18.0 was financially supported by Camptocamp. diff --git a/base_user_empty_password/static/description/index.html b/base_user_empty_password/static/description/index.html index c040865eba..61ac6795b2 100644 --- a/base_user_empty_password/static/description/index.html +++ b/base_user_empty_password/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,7 +369,7 @@

Empty users password

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:512d1e5b2dee0d04bf83cf2186bc757d4bc2e0f660342c92128bce2ba1bb571c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/server-auth Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-auth Translate me on Weblate Try me on Runboat

This module provides a wizard to allow emptying users password field.

This could be useful to force the user to use another sign on method than Odoo.

@@ -379,7 +380,8 @@

Empty users password

  • Credits
  • @@ -389,7 +391,7 @@

    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.

    +feedback.

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

    @@ -404,18 +406,26 @@

    Authors

    Contributors

    +
    +

    Other credits

    +

    The migration of this module from 14.0 to 18.0 was financially supported +by Camptocamp.

    +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +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.

    Current maintainer:

    grindtildeath

    -

    This module is part of the OCA/server-auth project on GitHub.

    +

    This module is part of the OCA/server-auth project on GitHub.

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

    diff --git a/base_user_empty_password/wizard/empty_password.py b/base_user_empty_password/wizard/empty_password.py index c1ddfa2f85..d19a291e81 100644 --- a/base_user_empty_password/wizard/empty_password.py +++ b/base_user_empty_password/wizard/empty_password.py @@ -1,22 +1,25 @@ # Copyright 2024 Camptocamp SA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -from odoo import fields, models +from odoo import _, api, fields, models +from odoo.exceptions import UserError class EmptyPasswordWizard(models.TransientModel): _name = "empty.password.wizard" _description = "Empty Password Wizard" - user_ids = fields.Many2many( - "res.users", readonly=True, default=lambda w: w._default_user_ids() - ) + user_ids = fields.Many2many("res.users", readonly=True) - def _default_user_ids(self): - return ( - self.env.context.get("active_model") == "res.users" - and self.env.context.get("active_ids") - or [] - ) + @api.model + def default_get(self, fields): + res = super().default_get(fields) + + if self.env.context.get("active_model") != "res.users": + raise UserError(_("This can only be used on users.")) + + res["user_ids"] = self.env.context.get("active_ids") or [] + + return res def empty_password_button(self): self.ensure_one() From b445dcbc9ee6220b6fa0d2fb5cc987be338b64c8 Mon Sep 17 00:00:00 2001 From: chaule97 Date: Thu, 10 Oct 2024 14:17:56 +0700 Subject: [PATCH 6/6] base_user_empty_password: add testcase --- base_user_empty_password/tests/__init__.py | 1 + .../tests/test_user_empty_password.py | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 base_user_empty_password/tests/__init__.py create mode 100644 base_user_empty_password/tests/test_user_empty_password.py diff --git a/base_user_empty_password/tests/__init__.py b/base_user_empty_password/tests/__init__.py new file mode 100644 index 0000000000..da234a960b --- /dev/null +++ b/base_user_empty_password/tests/__init__.py @@ -0,0 +1 @@ +from . import test_user_empty_password diff --git a/base_user_empty_password/tests/test_user_empty_password.py b/base_user_empty_password/tests/test_user_empty_password.py new file mode 100644 index 0000000000..933a497403 --- /dev/null +++ b/base_user_empty_password/tests/test_user_empty_password.py @@ -0,0 +1,39 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo.exceptions import UserError + +from odoo.addons.base.tests.common import SavepointCaseWithUserDemo + + +class TestUserEmptyPassword(SavepointCaseWithUserDemo): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.wizard_model = cls.env["empty.password.wizard"] + + def test_empty_password_button(self): + """Test that the wizard's default_get correctly assigns user_ids.""" + context = { + "active_model": "res.users", + "active_ids": [self.user_demo.id], + } + + wizard = self.wizard_model.with_context(**context).create({}) + + wizard.empty_password_button() + + self.assertIn(self.user_demo, wizard.user_ids) + self.assertFalse(self.user_demo.has_password) + + def test_invalid_model(self): + """Test that the wizard raises a UserError + when active_model is not res.users. + """ + context = { + "active_model": "res.partner", + "active_ids": [self.user_demo.id], + } + + with self.assertRaises(UserError): + self.wizard_model.with_context(**context).create({})