From b81cbdbeb0872d5457c0adff319b9ee43afc1645 Mon Sep 17 00:00:00 2001 From: cyrilmanuel Date: Wed, 8 Oct 2025 15:16:58 +0200 Subject: [PATCH 1/6] [19.0][MIG] fs_storage Migration 19.0 --- .pre-commit-config.yaml | 1 - fs_storage/README.rst | 10 +++--- fs_storage/__manifest__.py | 4 +-- fs_storage/models/fs_storage.py | 39 ++++++++++++------------ fs_storage/static/description/index.html | 21 +++++-------- fs_storage/tests/test_fs_storage.py | 7 ++++- requirements.txt | 8 ----- test-requirements.txt | 2 ++ 8 files changed, 42 insertions(+), 50 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f737dac10a..bc2df15a45 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,6 @@ exclude: | ^fs_folder_demo/| ^fs_folder_ms_drive/| ^fs_image/| - ^fs_storage/| ^fs_storage_ms_drive/| ^image_tag/| ^microsoft_drive_account/| diff --git a/fs_storage/README.rst b/fs_storage/README.rst index 95bbcb6801..f319eacdac 100644 --- a/fs_storage/README.rst +++ b/fs_storage/README.rst @@ -21,13 +21,13 @@ Filesystem Storage Backend :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstorage-lightgray.png?logo=github - :target: https://github.com/OCA/storage/tree/18.0/fs_storage + :target: https://github.com/OCA/storage/tree/19.0/fs_storage :alt: OCA/storage .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/storage-18-0/storage-18-0-fs_storage + :target: https://translation.odoo-community.org/projects/storage-19-0/storage-19-0-fs_storage :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/storage&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -287,7 +287,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. @@ -319,6 +319,6 @@ 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/storage `_ project on GitHub. +This module is part of the `OCA/storage `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fs_storage/__manifest__.py b/fs_storage/__manifest__.py index 401e5748eb..d01e6dcb68 100644 --- a/fs_storage/__manifest__.py +++ b/fs_storage/__manifest__.py @@ -5,13 +5,12 @@ { "name": "Filesystem Storage Backend", "summary": "Implement the concept of Storage with amazon S3, sftp...", - "version": "18.0.2.0.1", + "version": "19.0.1.0.0", "category": "FS Storage", "website": "https://github.com/OCA/storage", "author": " ACSONE SA/NV, Odoo Community Association (OCA)", "license": "LGPL-3", "development_status": "Beta", - "installable": False, "depends": ["base", "base_sparse_field", "server_environment"], "data": [ "views/fs_storage_view.xml", @@ -20,4 +19,5 @@ ], "demo": ["demo/fs_storage_demo.xml"], "external_dependencies": {"python": ["fsspec>=2024.5.0"]}, + "installable": True, } diff --git a/fs_storage/models/fs_storage.py b/fs_storage/models/fs_storage.py index 14941c540b..1b51b31f02 100644 --- a/fs_storage/models/fs_storage.py +++ b/fs_storage/models/fs_storage.py @@ -14,7 +14,7 @@ import fsspec -from odoo import _, api, fields, models, tools +from odoo import api, fields, models, tools from odoo.exceptions import ValidationError from odoo.addons.base_sparse_field.models.fields import Serialized @@ -189,13 +189,10 @@ def __init__(self, env, ids=(), prefetch_ids=()): "* List File : List all files from root directory", ) - _sql_constraints = [ - ( - "code_uniq", - "unique(code)", - "The code must be unique", - ), - ] + _uniq_code = models.Constraint( + "unique(code)", + "The code must be unique", + ) _server_env_section_name_field = "code" @@ -210,7 +207,7 @@ def _check_model_xmlid_storage_unique(self): xmlids = rec.model_xmlids.split(",") for xmlid in xmlids: other_storages = ( - self.env["fs.storage"] + self.env["fs.storage"] # pylint: disable=no-search-all .search([]) .filtered_domain( [ @@ -221,7 +218,7 @@ def _check_model_xmlid_storage_unique(self): ) if other_storages: raise ValidationError( - _( + self.env._( "Model %(model)s already stored in another " "FS storage ('%(other_storage)s')" ) @@ -239,7 +236,7 @@ def _check_field_xmlid_storage_unique(self): xmlids = rec.field_xmlids.split(",") for xmlid in xmlids: other_storages = ( - self.env["fs.storage"] + self.env["fs.storage"] # pylint: disable=no-search-all .search([]) .filtered_domain( [ @@ -250,7 +247,7 @@ def _check_field_xmlid_storage_unique(self): ) if other_storages: raise ValidationError( - _( + self.env._( "Field %(field)s already stored in another " "FS storage ('%(other_storage)s')" ) @@ -260,8 +257,8 @@ def _check_field_xmlid_storage_unique(self): @api.model def _get_check_connection_method_selection(self): return [ - ("marker_file", _("Create Marker file")), - ("ls", _("List File")), + ("marker_file", self.env._("Create Marker file")), + ("ls", self.env._("List File")), ] @property @@ -338,7 +335,7 @@ def get_storage_code_by_model_field(self, model_name, field_name=None): ) if field: storage = ( - self.env["fs.storage"] + self.env["fs.storage"] # pylint: disable=no-search-all .sudo() .search([]) .filtered_domain([("field_ids", "in", [field.id])]) @@ -353,7 +350,7 @@ def get_storage_code_by_model_field(self, model_name, field_name=None): ) if model: storage = ( - self.env["fs.storage"] + self.env["fs.storage"] # pylint: disable=no-search-all .sudo() .search([]) .filtered_domain([("model_ids", "in", [model.id])]) @@ -399,7 +396,9 @@ def _check_options(self) -> None: try: json.loads(rec.options or "{}") except Exception as e: - raise ValidationError(_("The options must be a valid JSON")) from e + raise ValidationError( + self.env._("The options must be a valid JSON") + ) from e @api.depends("options") def _compute_json_options(self) -> None: @@ -703,11 +702,11 @@ def action_test_config(self): def _test_config(self, connection_method): try: self._check_connection(self.fs, connection_method) - title = _("Connection Test Succeeded!") - message = _("Everything seems properly set up!") + title = self.env._("Connection Test Succeeded!") + message = self.env._("Everything seems properly set up!") msg_type = "success" except Exception as err: - title = _("Connection Test Failed!") + title = self.env._("Connection Test Failed!") message = str(err) msg_type = "danger" return { diff --git a/fs_storage/static/description/index.html b/fs_storage/static/description/index.html index 13eba13760..420b47cca8 100644 --- a/fs_storage/static/description/index.html +++ b/fs_storage/static/description/index.html @@ -8,11 +8,10 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ +:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z 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. @@ -275,7 +274,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: gray; } /* line numbers */ +pre.code .ln { color: grey; } /* 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 } @@ -301,7 +300,7 @@ span.pre { white-space: pre } -span.problematic, pre.problematic { +span.problematic { color: red } span.section-subtitle { @@ -363,9 +362,7 @@
- -Odoo Community Association - +Odoo Community Association

Filesystem Storage Backend

-

Beta License: LGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon that allows you to define filesystem like storage for your data. It’s used by other addons to store their data in a transparent way into different kind of storages.

@@ -644,7 +641,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.

@@ -666,13 +663,11 @@

Contributors

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.

-

This module is part of the OCA/storage project on GitHub.

+

This module is part of the OCA/storage project on GitHub.

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

diff --git a/fs_storage/tests/test_fs_storage.py b/fs_storage/tests/test_fs_storage.py index 3d23512a4c..a6e554bc18 100644 --- a/fs_storage/tests/test_fs_storage.py +++ b/fs_storage/tests/test_fs_storage.py @@ -82,7 +82,12 @@ def test_ensure_one_fs_by_record(self): for i in range(4): backend_ids.append( self.backend.create( - {"name": f"name{i}", "directory_path": f"{i}", "code": f"code{i}"} + { + "name": f"name{i}", + "directory_path": f"{i}", + "code": f"code{i}", + "protocol": "odoofs", + } ).id ) records = self.backend.browse(backend_ids) diff --git a/requirements.txt b/requirements.txt index aeccb5304f..0905f9449e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,2 @@ # generated from manifests external_dependencies -boto3 fsspec>=2024.5.0 -fsspec>=2025.0.0 -fsspec>=2025.3.0 -fsspec[s3] -msgraphfs -paramiko -pyftpdlib -python_slugify diff --git a/test-requirements.txt b/test-requirements.txt index e63f876677..e1d2a97b18 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -2,3 +2,5 @@ odoo_test_helper requests_mock vcrpy-unittest s3fs>=2025.3.0 + +odoo-addon-server_environment @ git+https://github.com/OCA/server-env@refs/pull/247/head#subdirectory=server_environment From ffebf6f62bf0d67efe3c1513d7a7cc6d695bbf6e Mon Sep 17 00:00:00 2001 From: jcoux Date: Fri, 28 Nov 2025 10:36:00 +0100 Subject: [PATCH 2/6] fixup! [19.0][MIG] fs_storage Migration 19.0 --- fs_storage/README.rst | 1 + fs_storage/__manifest__.py | 1 - fs_storage/demo/fs_storage_demo.xml | 8 -------- fs_storage/readme/CONTRIBUTORS.md | 1 + fs_storage/static/description/index.html | 16 +++++++++++----- fs_storage/tests/common.py | 24 ++++++++++++++++++++++-- fs_storage/tests/test_fs_storage.py | 1 - 7 files changed, 35 insertions(+), 17 deletions(-) delete mode 100644 fs_storage/demo/fs_storage_demo.xml diff --git a/fs_storage/README.rst b/fs_storage/README.rst index f319eacdac..35ebd9f687 100644 --- a/fs_storage/README.rst +++ b/fs_storage/README.rst @@ -305,6 +305,7 @@ Contributors - Laurent Mignon - Sébastien BEAU - Marie Lejeune +- Julien Coux Maintainers ----------- diff --git a/fs_storage/__manifest__.py b/fs_storage/__manifest__.py index d01e6dcb68..d6bb9bf5f4 100644 --- a/fs_storage/__manifest__.py +++ b/fs_storage/__manifest__.py @@ -17,7 +17,6 @@ "security/ir.model.access.csv", "wizards/fs_test_connection.xml", ], - "demo": ["demo/fs_storage_demo.xml"], "external_dependencies": {"python": ["fsspec>=2024.5.0"]}, "installable": True, } diff --git a/fs_storage/demo/fs_storage_demo.xml b/fs_storage/demo/fs_storage_demo.xml deleted file mode 100644 index 0917d06221..0000000000 --- a/fs_storage/demo/fs_storage_demo.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Odoo Filesystem Backend - odoofs - odoofs - - diff --git a/fs_storage/readme/CONTRIBUTORS.md b/fs_storage/readme/CONTRIBUTORS.md index 139cad9973..0ec48212d3 100644 --- a/fs_storage/readme/CONTRIBUTORS.md +++ b/fs_storage/readme/CONTRIBUTORS.md @@ -1,3 +1,4 @@ - Laurent Mignon \<\> - Sébastien BEAU \<\> - Marie Lejeune \<\> +- Julien Coux \<\> diff --git a/fs_storage/static/description/index.html b/fs_storage/static/description/index.html index 420b47cca8..d72205ab97 100644 --- a/fs_storage/static/description/index.html +++ b/fs_storage/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 { @@ -362,7 +363,9 @@
-Odoo Community Association + +Odoo Community Association +

Filesystem Storage Backend

-

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

+

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

In some cases, you need to store attachment in another system that the Odoo’s filestore. For example, when your deployment is based on a multi-server architecture to ensure redundancy and scalability, your @@ -772,7 +772,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.

@@ -815,7 +815,7 @@

Maintainers

promote its widespread use.

Current maintainer:

lmignon

-

This module is part of the OCA/storage project on GitHub.

+

This module is part of the OCA/storage project on GitHub.

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

diff --git a/fs_attachment/tests/common.py b/fs_attachment/tests/common.py index 076717a90b..9f3c36f180 100644 --- a/fs_attachment/tests/common.py +++ b/fs_attachment/tests/common.py @@ -4,6 +4,7 @@ import shutil import tempfile +from odoo.fields import Command from odoo.tests.common import TransactionCase @@ -13,6 +14,13 @@ def setUpClass(cls): super().setUpClass() cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) temp_dir = tempfile.mkdtemp() + cls.default_backend = cls.env["fs.storage"].create( + { + "name": "Odoo Filesystem Backend", + "protocol": "odoofs", + "code": "odoofs", + } + ) cls.temp_backend = cls.env["fs.storage"].create( { "name": "Temp FS Storage", @@ -33,6 +41,20 @@ def setUpClass(cls): cls.temp_dir = temp_dir cls.gc_file_model = cls.env["fs.file.gc"] cls.ir_attachment_model = cls.env["ir.attachment"] + cls.demo_user = ( + cls.env["res.users"] + .with_context(no_reset_password=True) + .create( + { + "name": "Test User", + "login": "demo", + "password": "demo", + "email": "test@yourcompany.com", + "company_id": cls.env.ref("base.main_company").id, + "group_ids": [Command.link(cls.env.ref("base.group_user").id)], + } + ) + ) @cls.addClassCleanup def cleanup_tempdir(): diff --git a/fs_attachment/tests/test_fs_attachment.py b/fs_attachment/tests/test_fs_attachment.py index 22c186ecac..a6579c20da 100644 --- a/fs_attachment/tests/test_fs_attachment.py +++ b/fs_attachment/tests/test_fs_attachment.py @@ -3,6 +3,7 @@ import os from unittest import mock +from odoo.fields import Domain from odoo.tools import mute_logger from .common import MyException, TestFSAttachmentCommon @@ -389,21 +390,20 @@ def test_storage_use_filename_obfuscation(self): self.assertEqual(attachment.mimetype, "text/plain") def test_create_attachments_basic_user(self): - demo_user = self.env.ref("base.user_demo") - demo_partner = self.env.ref("base.partner_demo") self.temp_backend.use_as_default_for_attachments = True # Ensure basic access group_user = self.env.ref("base.group_user") group_partner_manager = self.env.ref("base.group_partner_manager") - demo_user.write( - {"groups_id": [(6, 0, [group_user.id, group_partner_manager.id])]} + self.demo_user.write( + {"group_ids": [(6, 0, [group_user.id, group_partner_manager.id])]} ) + demo_partner = self.demo_user.partner_id # Create basic attachment - self.ir_attachment_model.with_user(demo_user).create( + self.ir_attachment_model.with_user(self.demo_user).create( {"name": "test.txt", "raw": b"content"} ) # Create attachment related to model - self.ir_attachment_model.with_user(demo_user).create( + self.ir_attachment_model.with_user(self.demo_user).create( { "name": "test.txt", "raw": b"content", @@ -415,7 +415,7 @@ def test_create_attachments_basic_user(self): partner_image_field = self.env["ir.model.fields"].search( [("model", "=", "res.partner"), ("name", "=", "image1920")] ) - self.ir_attachment_model.with_user(demo_user).create( + self.ir_attachment_model.with_user(self.demo_user).create( { "name": "test.txt", "raw": b"content", @@ -479,11 +479,15 @@ def test_store_in_db_instead_of_object_storage_domain(self): ) self.assertEqual( self.env["ir.attachment"]._store_in_db_instead_of_object_storage_domain(), - [ - "|", - ("mimetype", "=like", "text/plain%"), - "&", - ("mimetype", "=like", "image/png%"), - ("file_size", "<=", 100), - ], + Domain.OR( + [ + Domain("mimetype", "=like", "text/plain%"), + Domain.AND( + [ + Domain("mimetype", "=like", "image/png%"), + Domain("file_size", "<=", 100), + ] + ), + ] + ), ) diff --git a/fs_attachment/tests/test_fs_storage.py b/fs_attachment/tests/test_fs_storage.py index 5f6835dbbe..f947f455d4 100644 --- a/fs_attachment/tests/test_fs_storage.py +++ b/fs_attachment/tests/test_fs_storage.py @@ -7,12 +7,6 @@ class TestFsStorage(TestFSAttachmentCommon): - @classmethod - def setUpClass(cls): - res = super().setUpClass() - cls.default_backend = cls.env.ref("fs_storage.fs_storage_demo") - return res - def test_force_model_create_attachment(self): """ Force 'res.partner' model to temp_backend diff --git a/fs_attachment/tests/test_stream.py b/fs_attachment/tests/test_stream.py index 38ee7a4c0f..69f42bf9f1 100644 --- a/fs_attachment/tests/test_stream.py +++ b/fs_attachment/tests/test_stream.py @@ -170,7 +170,7 @@ def test_serving_field_image(self): demo_partner = self.env.ref("base.partner_demo") demo_partner.with_context( storage_location=self.temp_backend.code, - ).write({"image_128": base64.encodebytes(self._create_image(128, 128))}) + ).write({"image_128": base64.encodebytes(self.env.create_image(128, 128))}) url = f"/web/image/{demo_partner._name}/{demo_partner.id}/image_128" res = self.assertDownload( url, diff --git a/requirements.txt b/requirements.txt index 0905f9449e..0afb75a1a5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ # generated from manifests external_dependencies -fsspec>=2024.5.0 +fsspec>=2025.3.0 +python_slugify diff --git a/test-requirements.txt b/test-requirements.txt index e1d2a97b18..c9666736c7 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -4,3 +4,4 @@ vcrpy-unittest s3fs>=2025.3.0 odoo-addon-server_environment @ git+https://github.com/OCA/server-env@refs/pull/247/head#subdirectory=server_environment +odoo-addon-fs_storage @ git+https://github.com/OCA/storage@refs/pull/524/head#subdirectory=fs_storage From 09537128f3e74637a3db521c926afee65ef26cb4 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Mon, 8 Dec 2025 14:09:52 +0100 Subject: [PATCH 4/6] Upgrade pylint rule definitions --- .copier-answers.yml | 2 +- .pylintrc | 32 -------------------------------- .pylintrc-mandatory | 32 -------------------------------- 3 files changed, 1 insertion(+), 65 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index a406cf7de8..f63257825c 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.34 +_commit: v1.35 _src_path: git+https://github.com/OCA/oca-addons-repo-template additional_ruff_rules: [] ci: GitHub diff --git a/.pylintrc b/.pylintrc index 16996cb36f..f3d017a8f5 100644 --- a/.pylintrc +++ b/.pylintrc @@ -23,21 +23,12 @@ disable=all # config as a blocking check. enable=anomalous-backslash-in-string, - api-one-deprecated, - api-one-multi-together, assignment-from-none, attribute-deprecated, - class-camelcase, dangerous-default-value, - dangerous-view-replace-wo-priority, development-status-allowed, - duplicate-id-csv, duplicate-key, - duplicate-xml-fields, - duplicate-xml-record-id, - eval-referenced, eval-used, - incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -48,56 +39,33 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, attribute-string-redundant, - character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, - create-user-wo-reset-password, - dangerous-filter-wo-user, - dangerous-qweb-replace-wo-priority, - deprecated-data-xml-node, - deprecated-openerp-xml-node, - duplicate-po-message-definition, except-pass, - file-not-used, invalid-commit, manifest-maintainers-list, - missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, external-request-timeout, bad-builtin-groupby, category-allowed, diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index dc9b71ed30..80567de1e7 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -15,21 +15,12 @@ valid-odoo-versions=19.0 disable=all enable=anomalous-backslash-in-string, - api-one-deprecated, - api-one-multi-together, assignment-from-none, attribute-deprecated, - class-camelcase, dangerous-default-value, - dangerous-view-replace-wo-priority, development-status-allowed, - duplicate-id-csv, duplicate-key, - duplicate-xml-fields, - duplicate-xml-record-id, - eval-referenced, eval-used, - incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -40,56 +31,33 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, - redundant-modulename-xml, reimported, - relative-import, return-in-init, - rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, - wrong-tabs-instead-of-spaces, - xml-syntax-error, attribute-string-redundant, - character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, - create-user-wo-reset-password, - dangerous-filter-wo-user, - dangerous-qweb-replace-wo-priority, - deprecated-data-xml-node, - deprecated-openerp-xml-node, - duplicate-po-message-definition, except-pass, - file-not-used, invalid-commit, manifest-maintainers-list, - missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, - old-api7-method-defined, - po-msgstr-variables, - po-syntax-error, renamed-field-parameter, resource-not-exist, - str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, - unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - xml-attribute-translatable, - xml-deprecated-qweb-directive, - xml-deprecated-tree-attribute, external-request-timeout, bad-builtin-groupby, category-allowed, From 2f0670b79b82f94b311f8da22536e2f5ee633d75 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Mon, 8 Dec 2025 14:18:58 +0100 Subject: [PATCH 5/6] [MIG] fs_storage: Use lazy % or .format() or % formatting in odoo._ functions --- fs_storage/models/fs_storage.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs_storage/models/fs_storage.py b/fs_storage/models/fs_storage.py index 1b51b31f02..3e516be4f7 100644 --- a/fs_storage/models/fs_storage.py +++ b/fs_storage/models/fs_storage.py @@ -220,9 +220,10 @@ def _check_model_xmlid_storage_unique(self): raise ValidationError( self.env._( "Model %(model)s already stored in another " - "FS storage ('%(other_storage)s')" + "FS storage ('%(other_storage)s')", + model=xmlid, + other_storage=other_storages[0].name, ) - % {"model": xmlid, "other_storage": other_storages[0].name} ) @api.constrains("field_xmlids") @@ -249,9 +250,10 @@ def _check_field_xmlid_storage_unique(self): raise ValidationError( self.env._( "Field %(field)s already stored in another " - "FS storage ('%(other_storage)s')" + "FS storage ('%(other_storage)s')", + field=xmlid, + other_storage=other_storages[0].name, ) - % {"field": xmlid, "other_storage": other_storages[0].name} ) @api.model From a151ac882ccf3cb0e3f72a90c640d18c0641498f Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Mon, 8 Dec 2025 14:19:40 +0100 Subject: [PATCH 6/6] [MIG] fix pre-commit --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 0afb75a1a5..35567e0740 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ # generated from manifests external_dependencies +fsspec>=2024.5.0 fsspec>=2025.3.0 python_slugify