From 92b0b7e674d814b53fc7d67823cba8b90030e26f Mon Sep 17 00:00:00 2001 From: sygel Date: Mon, 16 Jun 2025 17:36:45 +0200 Subject: [PATCH 1/3] [ADD] apikey_scope_editable --- apikey_scope_editable/README.rst | 95 ++++ apikey_scope_editable/__init__.py | 4 + apikey_scope_editable/__manifest__.py | 19 + apikey_scope_editable/models/__init__.py | 3 + .../models/res_users_apikeys.py | 13 + apikey_scope_editable/pyproject.toml | 3 + apikey_scope_editable/readme/CONTRIBUTORS.md | 4 + apikey_scope_editable/readme/DESCRIPTION.md | 3 + apikey_scope_editable/readme/USAGE.md | 5 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/icon.svg | 79 ++++ .../static/description/index.html | 443 ++++++++++++++++++ apikey_scope_editable/tests/__init__.py | 3 + .../tests/test_apikey_scope_editable.py | 68 +++ apikey_scope_editable/wizards/__init__.py | 3 + .../wizards/res_users_apikeys_description.py | 28 ++ .../res_users_apikeys_description_views.xml | 28 ++ 17 files changed, 801 insertions(+) create mode 100644 apikey_scope_editable/README.rst create mode 100644 apikey_scope_editable/__init__.py create mode 100644 apikey_scope_editable/__manifest__.py create mode 100644 apikey_scope_editable/models/__init__.py create mode 100644 apikey_scope_editable/models/res_users_apikeys.py create mode 100644 apikey_scope_editable/pyproject.toml create mode 100755 apikey_scope_editable/readme/CONTRIBUTORS.md create mode 100755 apikey_scope_editable/readme/DESCRIPTION.md create mode 100755 apikey_scope_editable/readme/USAGE.md create mode 100644 apikey_scope_editable/static/description/icon.png create mode 100644 apikey_scope_editable/static/description/icon.svg create mode 100644 apikey_scope_editable/static/description/index.html create mode 100644 apikey_scope_editable/tests/__init__.py create mode 100644 apikey_scope_editable/tests/test_apikey_scope_editable.py create mode 100644 apikey_scope_editable/wizards/__init__.py create mode 100644 apikey_scope_editable/wizards/res_users_apikeys_description.py create mode 100644 apikey_scope_editable/wizards/res_users_apikeys_description_views.xml diff --git a/apikey_scope_editable/README.rst b/apikey_scope_editable/README.rst new file mode 100644 index 0000000000..336d84cab8 --- /dev/null +++ b/apikey_scope_editable/README.rst @@ -0,0 +1,95 @@ +====================== +API Key Scope Editable +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:45e890b116365cd303ddcd47ff6510fb78066703b4ef77b3a1a75ea3b4e11af0 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/17.0/apikey_scope_editable + :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-17-0/server-auth-17-0-apikey_scope_editable + :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=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the built-in `Odoo API +Keys `__ +by allowing you to define a scope at the moment of creation. + +With scopes, you can restrict an API Key so that it only grants access +to a specific application, model, or functional area of the system. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +1. Click on your user icon and then "Preferences" +2. Go to the "Account Security" tab, and then click the "New Api Key" + button. +3. Fill the data, a new field will appear to set the key scope. + +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 +------- + +* Sygel + +Contributors +------------ + +- `Sygel `__: + + - Alberto Martínez + - Valentin Vinagre + - Harald Panten + +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/server-auth `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/apikey_scope_editable/__init__.py b/apikey_scope_editable/__init__.py new file mode 100644 index 0000000000..adc6207fdd --- /dev/null +++ b/apikey_scope_editable/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizards diff --git a/apikey_scope_editable/__manifest__.py b/apikey_scope_editable/__manifest__.py new file mode 100644 index 0000000000..43469f49c0 --- /dev/null +++ b/apikey_scope_editable/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2025 Alberto Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "API Key Scope Editable", + "summary": "Set the API Key scope at creation", + "version": "17.0.1.0.0", + "category": "Technical", + "website": "https://github.com/OCA/server-auth", + "author": "Sygel, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "base", + ], + "data": [ + "wizards/res_users_apikeys_description_views.xml", + ], +} diff --git a/apikey_scope_editable/models/__init__.py b/apikey_scope_editable/models/__init__.py new file mode 100644 index 0000000000..7396852919 --- /dev/null +++ b/apikey_scope_editable/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import res_users_apikeys diff --git a/apikey_scope_editable/models/res_users_apikeys.py b/apikey_scope_editable/models/res_users_apikeys.py new file mode 100644 index 0000000000..9aaecce159 --- /dev/null +++ b/apikey_scope_editable/models/res_users_apikeys.py @@ -0,0 +1,13 @@ +# Copyright 2025 Alberto Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class APIKeys(models.Model): + _inherit = "res.users.apikeys" + + def _generate(self, scope, name): + new_scope = self.env.context.get("apikey_scope") + scope = new_scope if new_scope else scope + return super()._generate(scope, name) diff --git a/apikey_scope_editable/pyproject.toml b/apikey_scope_editable/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/apikey_scope_editable/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/apikey_scope_editable/readme/CONTRIBUTORS.md b/apikey_scope_editable/readme/CONTRIBUTORS.md new file mode 100755 index 0000000000..f566245042 --- /dev/null +++ b/apikey_scope_editable/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- [Sygel](https://www.sygel.es): + - Alberto Martínez + - Valentin Vinagre + - Harald Panten diff --git a/apikey_scope_editable/readme/DESCRIPTION.md b/apikey_scope_editable/readme/DESCRIPTION.md new file mode 100755 index 0000000000..f6a4d76f97 --- /dev/null +++ b/apikey_scope_editable/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module extends the built-in [Odoo API Keys](https://www.odoo.com/documentation/17.0/developer/reference/external_api.html#api-keys) by allowing you to define a scope at the moment of creation. + +With scopes, you can restrict an API Key so that it only grants access to a specific application, model, or functional area of the system. diff --git a/apikey_scope_editable/readme/USAGE.md b/apikey_scope_editable/readme/USAGE.md new file mode 100755 index 0000000000..795895d71e --- /dev/null +++ b/apikey_scope_editable/readme/USAGE.md @@ -0,0 +1,5 @@ +To use this module, you need to: + +1. Click on your user icon and then "Preferences" +2. Go to the "Account Security" tab, and then click the "New Api Key" button. +3. Fill the data, a new field will appear to set the key scope. diff --git a/apikey_scope_editable/static/description/icon.png b/apikey_scope_editable/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/apikey_scope_editable/static/description/icon.svg b/apikey_scope_editable/static/description/icon.svg new file mode 100644 index 0000000000..a7a26d0932 --- /dev/null +++ b/apikey_scope_editable/static/description/icon.svg @@ -0,0 +1,79 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/apikey_scope_editable/static/description/index.html b/apikey_scope_editable/static/description/index.html new file mode 100644 index 0000000000..61f22e069b --- /dev/null +++ b/apikey_scope_editable/static/description/index.html @@ -0,0 +1,443 @@ + + + + + +API Key Scope Editable + + + +
+

API Key Scope Editable

+ + +

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

+

This module extends the built-in Odoo API +Keys +by allowing you to define a scope at the moment of creation.

+

With scopes, you can restrict an API Key so that it only grants access +to a specific application, model, or functional area of the system.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Click on your user icon and then “Preferences”
  2. +
  3. Go to the “Account Security” tab, and then click the “New Api Key” +button.
  4. +
  5. Fill the data, a new field will appear to set the key scope.
  6. +
+
+
+

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

+
    +
  • Sygel
  • +
+
+
+

Contributors

+
    +
  • Sygel:
      +
    • Alberto Martínez
    • +
    • Valentin Vinagre
    • +
    • Harald Panten
    • +
    +
  • +
+
+
+

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/server-auth project on GitHub.

+

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

+
+
+
+ + diff --git a/apikey_scope_editable/tests/__init__.py b/apikey_scope_editable/tests/__init__.py new file mode 100644 index 0000000000..0efecd864d --- /dev/null +++ b/apikey_scope_editable/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_apikey_scope_editable diff --git a/apikey_scope_editable/tests/test_apikey_scope_editable.py b/apikey_scope_editable/tests/test_apikey_scope_editable.py new file mode 100644 index 0000000000..749bbbac04 --- /dev/null +++ b/apikey_scope_editable/tests/test_apikey_scope_editable.py @@ -0,0 +1,68 @@ +# Copyright 2025 Alberto Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import time + +from odoo.http import _request_stack +from odoo.tests.common import HttpCase +from odoo.tools import DotDict + + +class TestApiKeyScopeEditable(HttpCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.test_user = cls.env["res.users"].create( + { + "name": "Tyrion", + "login": "imp", + "password": "dracarys123", + "tz": "Pacific/Chatham", + } + ) + + def setUp(self): + def json_data(): + raise ValueError("Expected JSON content is missing") + + super().setUp() + mock_http = DotDict( + { + "httprequest": DotDict( + { + "environ": {"REMOTE_ADDR": "127.0.0.1"}, + "cookies": {}, + "args": {}, + } + ), + "session": {"identity-check-last": time.time()}, + "geoip": {}, + "get_json_data": json_data, + } + ) + _request_stack.push(mock_http) + self.addCleanup(lambda: _request_stack.pop()) + + def test_scope_generation(self): + scoped_env = self.env(user=self.test_user) + description = scoped_env["res.users.apikeys.description"].create( + {"name": "API Entry", "scope": "rpc"} + ) + description.make_key() + matching_keys = scoped_env["res.users.apikeys"].search([("scope", "=", "rpc")]) + self.assertTrue(matching_keys) + + def test_custom_scope_generation(self): + scoped_env = self.env(user=self.test_user) + description = scoped_env["res.users.apikeys.description"].create( + { + "name": "API Entry", + "has_custom_scope": True, + "custom_scope": "Custom Scope", + } + ) + description.make_key() + matching_keys = scoped_env["res.users.apikeys"].search( + [("scope", "=", "Custom Scope")] + ) + self.assertTrue(matching_keys) diff --git a/apikey_scope_editable/wizards/__init__.py b/apikey_scope_editable/wizards/__init__.py new file mode 100644 index 0000000000..65e51f8fc5 --- /dev/null +++ b/apikey_scope_editable/wizards/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import res_users_apikeys_description diff --git a/apikey_scope_editable/wizards/res_users_apikeys_description.py b/apikey_scope_editable/wizards/res_users_apikeys_description.py new file mode 100644 index 0000000000..b51442d6cc --- /dev/null +++ b/apikey_scope_editable/wizards/res_users_apikeys_description.py @@ -0,0 +1,28 @@ +# Copyright 2025 Alberto Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + +from odoo.addons.base.models.res_users import check_identity + + +class APIKeyDescription(models.TransientModel): + _inherit = "res.users.apikeys.description" + + scope = fields.Selection( + [("rpc", "rpc")], + ) + has_custom_scope = fields.Boolean() + custom_scope = fields.Char() + + @check_identity + def make_key(self): + return super( + APIKeyDescription, + self.with_context( + apikey_scope=self.scope + if not self.has_custom_scope + else self.custom_scope + ), + ).make_key() diff --git a/apikey_scope_editable/wizards/res_users_apikeys_description_views.xml b/apikey_scope_editable/wizards/res_users_apikeys_description_views.xml new file mode 100644 index 0000000000..88edcd59e1 --- /dev/null +++ b/apikey_scope_editable/wizards/res_users_apikeys_description_views.xml @@ -0,0 +1,28 @@ + + + + + + form_res_users_key_description + res.users.apikeys.description + + + +
+

Enter the optional scope for the key. If set, the key access would be restricted.

+

APIKey scope:

+

+

I want a custom scope

+
+
+
+ +
From 10f81f8552d7d31ea4c34b207e52766008f65fc6 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 21 Aug 2025 06:24:41 +0000 Subject: [PATCH 2/3] [UPD] Update apikey_scope_editable.pot --- .../i18n/apikey_scope_editable.pot | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 apikey_scope_editable/i18n/apikey_scope_editable.pot diff --git a/apikey_scope_editable/i18n/apikey_scope_editable.pot b/apikey_scope_editable/i18n/apikey_scope_editable.pot new file mode 100644 index 0000000000..9102c52a88 --- /dev/null +++ b/apikey_scope_editable/i18n/apikey_scope_editable.pot @@ -0,0 +1,71 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * apikey_scope_editable +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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: apikey_scope_editable +#: model:ir.model,name:apikey_scope_editable.model_res_users_apikeys_description +msgid "API Key Description" +msgstr "" + +#. module: apikey_scope_editable +#: model_terms:ir.ui.view,arch_db:apikey_scope_editable.form_res_users_key_description +msgid "APIKey scope:" +msgstr "" + +#. module: apikey_scope_editable +#: model:ir.model.fields,field_description:apikey_scope_editable.field_res_users_apikeys_description__custom_scope +msgid "Custom Scope" +msgstr "" + +#. module: apikey_scope_editable +#: model_terms:ir.ui.view,arch_db:apikey_scope_editable.form_res_users_key_description +msgid "" +"Enter the optional scope for the key. If set, the key access would be " +"restricted." +msgstr "" + +#. module: apikey_scope_editable +#: model:ir.model.fields,field_description:apikey_scope_editable.field_res_users_apikeys_description__has_custom_scope +msgid "Has Custom Scope" +msgstr "" + +#. module: apikey_scope_editable +#: model_terms:ir.ui.view,arch_db:apikey_scope_editable.form_res_users_key_description +msgid "I want a custom scope" +msgstr "" + +#. module: apikey_scope_editable +#: model_terms:ir.ui.view,arch_db:apikey_scope_editable.form_res_users_key_description +msgid "No scope" +msgstr "" + +#. module: apikey_scope_editable +#: model:ir.model.fields,field_description:apikey_scope_editable.field_res_users_apikeys_description__scope +msgid "Scope" +msgstr "" + +#. module: apikey_scope_editable +#: model:ir.model,name:apikey_scope_editable.model_res_users_apikeys +msgid "Users API Keys" +msgstr "" + +#. module: apikey_scope_editable +#: model_terms:ir.ui.view,arch_db:apikey_scope_editable.form_res_users_key_description +msgid "What's the key scope?" +msgstr "" + +#. module: apikey_scope_editable +#: model:ir.model.fields.selection,name:apikey_scope_editable.selection__res_users_apikeys_description__scope__rpc +msgid "rpc" +msgstr "" From 4a54e5d8480fe9bf289ee138c7e71fea08ba873e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 21 Aug 2025 06:30:07 +0000 Subject: [PATCH 3/3] [BOT] post-merge updates --- README.md | 1 + apikey_scope_editable/README.rst | 16 +++++++---- .../static/description/index.html | 28 +++++++++++-------- setup/_metapackage/pyproject.toml | 3 +- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 6530da64c5..5bd64b86a6 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- +[apikey_scope_editable](apikey_scope_editable/) | 17.0.1.0.0 | | Set the API Key scope at creation [auth_admin_passkey](auth_admin_passkey/) | 17.0.1.0.0 | | Allows system administrator to authenticate with any account [auth_admin_passkey_totp_mail_enforce](auth_admin_passkey_totp_mail_enforce/) | 17.0.1.0.0 | | Disable 2FA if Passkey is being used [auth_api_key](auth_api_key/) | 17.0.1.1.2 | | Authenticate http requests from an API key diff --git a/apikey_scope_editable/README.rst b/apikey_scope_editable/README.rst index 336d84cab8..981912a9e7 100644 --- a/apikey_scope_editable/README.rst +++ b/apikey_scope_editable/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ====================== API Key Scope Editable ====================== @@ -7,13 +11,13 @@ API Key Scope Editable !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:45e890b116365cd303ddcd47ff6510fb78066703b4ef77b3a1a75ea3b4e11af0 + !! source digest: sha256:4e8aad6a07761c4885a96c95f07720d4041319afed525392ae71aeb48913aac7 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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 @@ -71,11 +75,11 @@ Authors Contributors ------------ -- `Sygel `__: +- `Sygel `__: - - Alberto Martínez - - Valentin Vinagre - - Harald Panten + - Alberto Martínez + - Valentin Vinagre + - Harald Panten Maintainers ----------- diff --git a/apikey_scope_editable/static/description/index.html b/apikey_scope_editable/static/description/index.html index 61f22e069b..54f4432c04 100644 --- a/apikey_scope_editable/static/description/index.html +++ b/apikey_scope_editable/static/description/index.html @@ -3,7 +3,7 @@ -API Key Scope Editable +README.rst -
-

API Key Scope Editable

+
+ + +Odoo Community Association + +
+

API Key Scope Editable

-

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 extends the built-in Odoo API Keys by allowing you to define a scope at the moment of creation.

@@ -389,7 +394,7 @@

API Key Scope Editable

-

Usage

+

Usage

To use this module, you need to:

  1. Click on your user icon and then “Preferences”
  2. @@ -399,7 +404,7 @@

    Usage

-

Bug Tracker

+

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 @@ -407,15 +412,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Sygel
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -439,5 +444,6 @@

Maintainers

+
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index a717ce93ce..39792048d1 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,7 +1,8 @@ [project] name = "odoo-addons-oca-server-auth" -version = "17.0.20250811.0" +version = "17.0.20250821.0" dependencies = [ + "odoo-addon-apikey_scope_editable>=17.0dev,<17.1dev", "odoo-addon-auth_admin_passkey>=17.0dev,<17.1dev", "odoo-addon-auth_admin_passkey_totp_mail_enforce>=17.0dev,<17.1dev", "odoo-addon-auth_api_key>=17.0dev,<17.1dev",