diff --git a/fs_attachment/tests/test_fs_storage.py b/fs_attachment/tests/test_fs_storage.py index f0111abf09..2401b48c5b 100644 --- a/fs_attachment/tests/test_fs_storage.py +++ b/fs_attachment/tests/test_fs_storage.py @@ -388,6 +388,7 @@ def test_url_for_image_dir_optimized_and_not_obfuscated(self): { "name": "FS Product Image Backend", "code": "file", + "protocol": "odoofs", "base_url": "https://localhost/images", "optimizes_directory_path": True, "use_filename_obfuscation": False, diff --git a/fs_storage/README.rst b/fs_storage/README.rst index 7ac52faa6a..275ef037d5 100644 --- a/fs_storage/README.rst +++ b/fs_storage/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ========================== Filesystem Storage Backend ========================== @@ -17,7 +13,7 @@ Filesystem Storage Backend .. |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/license-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png :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 @@ -129,9 +125,6 @@ When you create a new backend, you must specify the following: depend on the protocol used and are described in the fsspec documentation. -- Resolve env vars. This options resolves the protocol options values - starting with $ from environment variables - - Check Connection Method. If set, Odoo will always check the connection before using a storage and it will remove the fs connection from the cache if the check fails. @@ -166,35 +159,6 @@ follows: In this example, the SimpleCacheFileSystem protocol will be used as a wrapper around the odoofs protocol. -Server Environment ------------------- - -To ease the management of the filesystem storages configuration accross -the different environments, the configuration of the filesystem storages -can be defined in environment files or directly in the main -configuration file. For example, the configuration of a filesystem -storage with the code fsprod can be provided in the main configuration -file as follows: - -.. code:: ini - - [fs_storage.fsprod] - protocol=s3 - options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"} - directory_path=my_bucket - -To work, a storage.backend record must exist with the code fsprod into -the database. In your configuration section, you can specify the value -for the following fields: - -- protocol -- options -- directory_path - -When evaluating directory_path, ``{db_name}`` is replaced by the -database name. This is usefull in multi-tenant with a setup completly -controlled by configuration files. - Migration from storage_backend ------------------------------ diff --git a/fs_storage/__manifest__.py b/fs_storage/__manifest__.py index 279adc90f5..3ab375755b 100644 --- a/fs_storage/__manifest__.py +++ b/fs_storage/__manifest__.py @@ -5,14 +5,14 @@ { "name": "Filesystem Storage Backend", "summary": "Implement the concept of Storage with amazon S3, sftp...", - "version": "17.0.2.1.1", + "version": "17.0.2.1.2", "category": "FS Storage", "website": "https://github.com/OCA/storage", "author": " ACSONE SA/NV, Odoo Community Association (OCA)", "license": "LGPL-3", "development_status": "Beta", "installable": True, - "depends": ["base", "base_sparse_field", "server_environment"], + "depends": ["base", "base_sparse_field"], "data": [ "views/fs_storage_view.xml", "security/ir.model.access.csv", diff --git a/fs_storage/models/fs_storage.py b/fs_storage/models/fs_storage.py index fce61a5c99..e21c430f06 100644 --- a/fs_storage/models/fs_storage.py +++ b/fs_storage/models/fs_storage.py @@ -87,7 +87,6 @@ def wrapper(self, *args, **kwargs): class FSStorage(models.Model): _name = "fs.storage" - _inherit = "server.env.mixin" _description = "FS Storage" __slots__ = ("__fs", "__odoo_storage_path") @@ -141,17 +140,6 @@ def __init__(self, env, ids=(), prefetch_ids=()): inverse="_inverse_json_options", ) - eval_options_from_env = fields.Boolean( - string="Resolve env vars", - help="""Resolve options values starting with $ from environment variables. e.g - { - "endpoint_url": "$AWS_ENDPOINT_URL", - } - """, - ) - - # When accessing this field, use the method get_directory_path instead so that - # parameter expansion is done. directory_path = fields.Char( help="Relative path to the directory to store the file", ) @@ -192,8 +180,6 @@ def __init__(self, env, ids=(), prefetch_ids=()): ), ] - _server_env_section_name_field = "code" - @api.model def _get_check_connection_method_selection(self): return [ @@ -201,16 +187,6 @@ def _get_check_connection_method_selection(self): ("ls", _("List File")), ] - @property - def _server_env_fields(self): - return { - "protocol": {}, - "options": {}, - "directory_path": {}, - "eval_options_from_env": {}, - "check_connection_method": {}, - } - @api.model_create_multi @prevent_call_from_safe_eval("create") def create(self, vals_list): @@ -416,32 +392,10 @@ def _recursive_add_odoo_storage_path(self, options: dict) -> dict: self._recursive_add_odoo_storage_path(target_options) return options - def _eval_options_from_env(self, options): - values = {} - for key, value in options.items(): - if isinstance(value, dict): - values[key] = self._eval_options_from_env(value) - elif isinstance(value, str) and value.startswith("$"): - env_variable_name = value[1:] - env_variable_value = os.getenv(env_variable_name) - if env_variable_value is not None: - values[key] = env_variable_value - else: - values[key] = value - _logger.warning( - "Environment variable %s is not set for fs_storage %s.", - env_variable_name, - self.display_name, - ) - else: - values[key] = value - return values - def _get_fs_options(self): - options = self.json_options - if not self.eval_options_from_env: - return options - return self._eval_options_from_env(self.json_options) + # We need this hook to be able to override + # the options in the dependent modules + return self.json_options def _get_filesystem(self) -> fsspec.AbstractFileSystem: """Get the fsspec filesystem for this backend. diff --git a/fs_storage/readme/USAGE.md b/fs_storage/readme/USAGE.md index 82fc3553a9..580c63cc1f 100644 --- a/fs_storage/readme/USAGE.md +++ b/fs_storage/readme/USAGE.md @@ -16,8 +16,6 @@ When you create a new backend, you must specify the following: fsspec python package when creating the filesystem. These options depend on the protocol used and are described in the fsspec documentation. -- Resolve env vars. This options resolves the protocol options values - starting with \$ from environment variables - Check Connection Method. If set, Odoo will always check the connection before using a storage and it will remove the fs connection from the cache if the check fails. @@ -51,34 +49,6 @@ follows: In this example, the SimpleCacheFileSystem protocol will be used as a wrapper around the odoofs protocol. -## Server Environment - -To ease the management of the filesystem storages configuration accross -the different environments, the configuration of the filesystem storages -can be defined in environment files or directly in the main -configuration file. For example, the configuration of a filesystem -storage with the code fsprod can be provided in the main configuration -file as follows: - -``` ini -[fs_storage.fsprod] -protocol=s3 -options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"} -directory_path=my_bucket -``` - -To work, a storage.backend record must exist with the code fsprod into -the database. In your configuration section, you can specify the value -for the following fields: - -- protocol -- options -- directory_path - -When evaluating directory_path, `{db_name}` is replaced by the database name. -This is usefull in multi-tenant with a setup completly controlled by -configuration files. - ## Migration from storage_backend The fs_storage addon can be used to replace the storage_backend addon. diff --git a/fs_storage/static/description/index.html b/fs_storage/static/description/index.html index 4596359e2c..b8fd1e1572 100644 --- a/fs_storage/static/description/index.html +++ b/fs_storage/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Filesystem Storage Backend -
+
+

Filesystem Storage Backend

- - -Odoo Community Association - -
-

Usage

+

Usage

-

Configuration

+

Configuration

When you create a new backend, you must specify the following:

  • The name of the backend. This is the name that will be used to @@ -493,8 +487,6 @@

    Configuration

    fsspec python package when creating the filesystem. These options depend on the protocol used and are described in the fsspec documentation.
  • -
  • Resolve env vars. This options resolves the protocol options values -starting with $ from environment variables
  • Check Connection Method. If set, Odoo will always check the connection before using a storage and it will remove the fs connection from the cache if the check fails.
      @@ -527,34 +519,8 @@

      Configuration

      In this example, the SimpleCacheFileSystem protocol will be used as a wrapper around the odoofs protocol.

-
-

Server Environment

-

To ease the management of the filesystem storages configuration accross -the different environments, the configuration of the filesystem storages -can be defined in environment files or directly in the main -configuration file. For example, the configuration of a filesystem -storage with the code fsprod can be provided in the main configuration -file as follows:

-
-[fs_storage.fsprod]
-protocol=s3
-options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"}
-directory_path=my_bucket
-
-

To work, a storage.backend record must exist with the code fsprod into -the database. In your configuration section, you can specify the value -for the following fields:

-
    -
  • protocol
  • -
  • options
  • -
  • directory_path
  • -
-

When evaluating directory_path, {db_name} is replaced by the -database name. This is usefull in multi-tenant with a setup completly -controlled by configuration files.

-
-

Migration from storage_backend

+

Migration from storage_backend

The fs_storage addon can be used to replace the storage_backend addon. (It has been designed to be a drop-in replacement for the storage_backend addon). To ease the migration, the fs.storage model @@ -579,7 +545,7 @@

Migration from storage_backend

-

Known issues / Roadmap

+

Known issues / Roadmap

  • Transactions: fsspec comes with a transactional mechanism that once started, gathers all the files created during the transaction, and if @@ -594,11 +560,11 @@

    Known issues / Roadmap

-

Changelog

+

Changelog

-

17.0.2.1.0 (2025-10-22)

+

17.0.2.1.0 (2025-10-22)

-

Features

+

Features

  • Replace {db_name} by the database name in directory_path (#db_name)
  • @@ -606,18 +572,18 @@

    Features

-

17.0.2.0.4 (2025-08-19)

+

17.0.2.0.4 (2025-08-19)

-

Features

+

Features

  • Allow setting check_connection_method in configuration file.
-

17.0.2.0.0 (2024-10-07)

+

17.0.2.0.0 (2024-10-07)

-

Features

+

Features

  • Invalidate FS filesystem object cache when the connection fails, forcing a reconnection. @@ -626,7 +592,7 @@

    Features

-

16.0.1.1.0 (2023-12-22)

+

16.0.1.1.0 (2023-12-22)

Features

-

16.0.1.0.3 (2023-10-17)

+

16.0.1.0.3 (2023-10-17)

Bugfixes

-

16.0.1.0.2 (2023-10-09)

+

16.0.1.0.2 (2023-10-09)

Bugfixes

  • Avoid config error when using the webdav protocol. The auth option is @@ -657,7 +623,7 @@

    16.0.1.0.2 (2023-10-09)

-

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 @@ -665,22 +631,22 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -693,6 +659,5 @@

Maintainers

-
diff --git a/fs_storage/tests/test_fs_storage.py b/fs_storage/tests/test_fs_storage.py index 8536ac6f51..3aff1f85bd 100644 --- a/fs_storage/tests/test_fs_storage.py +++ b/fs_storage/tests/test_fs_storage.py @@ -1,7 +1,6 @@ # Copyright 2023 ACSONE SA/NV (http://acsone.eu). # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). import warnings -from unittest import mock from odoo.exceptions import ValidationError from odoo.tests import Form @@ -70,7 +69,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) @@ -133,31 +137,6 @@ def test_interface_values(self): # this is still true after saving self.assertEqual(new_storage.options_protocol, protocol) - def test_options_env(self): - self.backend.json_options = {"key": {"sub_key": "$KEY_VAR"}} - eval_json_options = {"key": {"sub_key": "TEST"}} - options = self.backend._get_fs_options() - self.assertDictEqual(options, self.backend.json_options) - self.backend.eval_options_from_env = True - with mock.patch.dict("os.environ", {"KEY_VAR": "TEST"}): - options = self.backend._get_fs_options() - self.assertDictEqual(options, eval_json_options) - with self.assertLogs(level="WARNING") as log: - options = self.backend._get_fs_options() - self.assertIn( - ( - f"Environment variable KEY_VAR is not set for " - f"fs_storage {self.backend.display_name}." - ), - log.output[0], - ) - - def test_directory_path_substitution(self): - template = "dir/{db_name}" - self.backend.directory_path = template - # Assert different (db name should be replaced) - self.assertNotEqual(template, self.backend.get_directory_path()) - def test_no_create_in_safe_eval(self): # check that we can't create a file in safe_eval with self.assertRaisesRegex( diff --git a/fs_storage/views/fs_storage_view.xml b/fs_storage/views/fs_storage_view.xml index 712bb2a656..b6bec33dd6 100644 --- a/fs_storage/views/fs_storage_view.xml +++ b/fs_storage/views/fs_storage_view.xml @@ -35,7 +35,6 @@ - `_. +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 +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Laurent Mignon +- Sébastien BEAU +- Maksym Yankin + +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/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_environment/__init__.py b/fs_storage_environment/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/fs_storage_environment/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/fs_storage_environment/__manifest__.py b/fs_storage_environment/__manifest__.py new file mode 100644 index 0000000000..2564fadcbf --- /dev/null +++ b/fs_storage_environment/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2017 Akretion (http://www.akretion.com). +# @author Sébastien BEAU +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Filesystem Storage Backend - Server Environment", + "summary": "Use Server Environment feature to manage the concept of Storage", + "version": "17.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": True, + "depends": ["fs_storage", "server_environment"], + "data": [ + "views/fs_storage_view.xml", + ], + "auto_install": True, +} diff --git a/fs_storage_environment/models/__init__.py b/fs_storage_environment/models/__init__.py new file mode 100644 index 0000000000..349bb0495a --- /dev/null +++ b/fs_storage_environment/models/__init__.py @@ -0,0 +1 @@ +from . import fs_storage diff --git a/fs_storage_environment/models/fs_storage.py b/fs_storage_environment/models/fs_storage.py new file mode 100644 index 0000000000..eb7dfef51e --- /dev/null +++ b/fs_storage_environment/models/fs_storage.py @@ -0,0 +1,60 @@ +# Copyright 2023 ACSONE SA/NV (https://www.acsone.eu). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import logging +import os + +from odoo import fields, models + +_logger = logging.getLogger(__name__) + + +class FSStorage(models.Model): + _name = "fs.storage" + _inherit = ["fs.storage", "server.env.mixin"] + + eval_options_from_env = fields.Boolean( + string="Resolve env vars", + help="""Resolve options values starting with $ from environment variables. e.g + { + "endpoint_url": "$AWS_ENDPOINT_URL", + } + """, + ) + + _server_env_section_name_field = "code" + + @property + def _server_env_fields(self): + return { + "protocol": {}, + "options": {}, + "directory_path": {}, + "eval_options_from_env": {}, + } + + def _eval_options_from_env(self, options): + values = {} + for key, value in options.items(): + if isinstance(value, dict): + values[key] = self._eval_options_from_env(value) + elif isinstance(value, str) and value.startswith("$"): + env_variable_name = value[1:] + env_variable_value = os.getenv(env_variable_name) + if env_variable_value is not None: + values[key] = env_variable_value + else: + values[key] = value + _logger.warning( + "Environment variable %s is not set for fs_storage %s.", + env_variable_name, + self.display_name, + ) + else: + values[key] = value + return values + + def _get_fs_options(self): + # OVERRIDE: to resolve env vars in options + if not self.eval_options_from_env: + return super()._get_fs_options() + return self._eval_options_from_env(self.json_options) diff --git a/fs_storage_environment/pyproject.toml b/fs_storage_environment/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/fs_storage_environment/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fs_storage_environment/readme/CONTRIBUTORS.md b/fs_storage_environment/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..0f9ffcf810 --- /dev/null +++ b/fs_storage_environment/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Laurent Mignon \ +- Sébastien BEAU \ +- Maksym Yankin \ diff --git a/fs_storage_environment/readme/DESCRIPTION.md b/fs_storage_environment/readme/DESCRIPTION.md new file mode 100644 index 0000000000..ecefddd113 --- /dev/null +++ b/fs_storage_environment/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Glue module to make Server Environment features available for the +Filesystem Storage Backend addon. diff --git a/fs_storage_environment/readme/USAGE.md b/fs_storage_environment/readme/USAGE.md new file mode 100644 index 0000000000..88e3886133 --- /dev/null +++ b/fs_storage_environment/readme/USAGE.md @@ -0,0 +1,30 @@ +## Configuration + +When you create a new backend, you must specify the following: + +- Resolve env vars. This options resolves the protocol options values + starting with \$ from environment variables + +## Server Environment + +To ease the management of the filesystem storages configuration accross +the different environments, the configuration of the filesystem storages +can be defined in environment files or directly in the main +configuration file. For example, the configuration of a filesystem +storage with the code fsprod can be provided in the main configuration +file as follows: + +``` ini +[fs_storage.fsprod] +protocol=s3 +options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"} +directory_path=my_bucket +``` + +To work, a storage.backend record must exist with the code fsprod into +the database. In your configuration section, you can specify the value +for the following fields: + +- protocol +- options +- directory_path diff --git a/fs_storage_environment/static/description/icon.png b/fs_storage_environment/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/fs_storage_environment/static/description/icon.png differ diff --git a/fs_storage_environment/static/description/index.html b/fs_storage_environment/static/description/index.html new file mode 100644 index 0000000000..7c258aec80 --- /dev/null +++ b/fs_storage_environment/static/description/index.html @@ -0,0 +1,465 @@ + + + + + +Filesystem Storage Backend - Server Environment + + + +
+

Filesystem Storage Backend - Server Environment

+ + +

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

+

Glue module to make Server Environment features available for the +Filesystem Storage Backend addon.

+

Table of contents

+ +
+

Usage

+
+

Configuration

+

When you create a new backend, you must specify the following:

+
    +
  • Resolve env vars. This options resolves the protocol options values +starting with $ from environment variables
  • +
+
+
+

Server Environment

+

To ease the management of the filesystem storages configuration accross +the different environments, the configuration of the filesystem storages +can be defined in environment files or directly in the main +configuration file. For example, the configuration of a filesystem +storage with the code fsprod can be provided in the main configuration +file as follows:

+
+[fs_storage.fsprod]
+protocol=s3
+options={"endpoint_url": "https://my_s3_server/", "key": "KEY", "secret": "SECRET"}
+directory_path=my_bucket
+
+

To work, a storage.backend record must exist with the code fsprod into +the database. In your configuration section, you can specify the value +for the following fields:

+
    +
  • protocol
  • +
  • options
  • +
  • directory_path
  • +
+
+
+
+

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

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

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/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_environment/tests/__init__.py b/fs_storage_environment/tests/__init__.py new file mode 100644 index 0000000000..84bbda192b --- /dev/null +++ b/fs_storage_environment/tests/__init__.py @@ -0,0 +1 @@ +from . import test_fs_storage diff --git a/fs_storage_environment/tests/test_fs_storage.py b/fs_storage_environment/tests/test_fs_storage.py new file mode 100644 index 0000000000..ed6e4e25e7 --- /dev/null +++ b/fs_storage_environment/tests/test_fs_storage.py @@ -0,0 +1,32 @@ +# Copyright 2023 ACSONE SA/NV (http://acsone.eu). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +from unittest import mock + +from odoo.addons.fs_storage.tests.common import TestFSStorageCase + + +class TestFSStorageEnv(TestFSStorageCase): + def test_options_env(self): + self.backend.json_options = {"key": {"sub_key": "$KEY_VAR"}} + eval_json_options = {"key": {"sub_key": "TEST"}} + options = self.backend._get_fs_options() + self.assertDictEqual(options, self.backend.json_options) + self.backend.eval_options_from_env = True + with mock.patch.dict("os.environ", {"KEY_VAR": "TEST"}): + options = self.backend._get_fs_options() + self.assertDictEqual(options, eval_json_options) + with mock.patch.dict("os.environ", {}, clear=True): + with self.assertLogs( + "odoo.addons.fs_storage_environment.models.fs_storage", + level="WARNING", + ) as log: + options = self.backend._get_fs_options() + + self.assertDictEqual(options, self.backend.json_options) + self.assertIn( + ( + f"Environment variable KEY_VAR is not set for " + f"fs_storage {self.backend.display_name}." + ), + log.output[0], + ) diff --git a/fs_storage_environment/views/fs_storage_view.xml b/fs_storage_environment/views/fs_storage_view.xml new file mode 100644 index 0000000000..2c34eb6197 --- /dev/null +++ b/fs_storage_environment/views/fs_storage_view.xml @@ -0,0 +1,12 @@ + + + + fs.storage + + + + + + + + diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml deleted file mode 100644 index d72dbaccc0..0000000000 --- a/setup/_metapackage/pyproject.toml +++ /dev/null @@ -1,24 +0,0 @@ -[project] -name = "odoo-addons-oca-storage" -version = "17.0.20250915.0" -dependencies = [ - "odoo-addon-fs_attachment>=17.0dev,<17.1dev", - "odoo-addon-fs_attachment_s3>=17.0dev,<17.1dev", - "odoo-addon-fs_base_multi_image>=17.0dev,<17.1dev", - "odoo-addon-fs_base_multi_media>=17.0dev,<17.1dev", - "odoo-addon-fs_file>=17.0dev,<17.1dev", - "odoo-addon-fs_file_demo>=17.0dev,<17.1dev", - "odoo-addon-fs_image>=17.0dev,<17.1dev", - "odoo-addon-fs_image_thumbnail>=17.0dev,<17.1dev", - "odoo-addon-fs_product_brand_multi_image>=17.0dev,<17.1dev", - "odoo-addon-fs_product_multi_image>=17.0dev,<17.1dev", - "odoo-addon-fs_product_multi_media>=17.0dev,<17.1dev", - "odoo-addon-fs_storage>=17.0dev,<17.1dev", - "odoo-addon-image_tag>=17.0dev,<17.1dev", - "odoo-addon-storage_backend>=17.0dev,<17.1dev", -] -classifiers=[ - "Programming Language :: Python", - "Framework :: Odoo", - "Framework :: Odoo :: 17.0", -]