diff --git a/README.md b/README.md index ee9557a725..12221a1d6c 100644 --- a/README.md +++ b/README.md @@ -35,15 +35,15 @@ addon | version | maintainers | summary [fs_storage_ms_drive](fs_storage_ms_drive/) | 18.0.2.0.0 | lmignon | Add the microsoft drives (OneDrive, Sharepoint) as a storage backend [image_tag](image_tag/) | 18.0.1.0.0 | | Image tag model [microsoft_drive_account](microsoft_drive_account/) | 18.0.2.0.1 | lmignon | Link user with Microsoft -[storage_backend](storage_backend/) | 18.0.1.0.0 | | Implement the concept of Storage with amazon S3, sftp... +[storage_backend](storage_backend/) | 18.0.1.1.0 | | Implement the concept of Storage with amazon S3, sftp... [storage_backend_ftp](storage_backend_ftp/) | 18.0.1.0.0 | | Implement FTP Storage [storage_backend_s3](storage_backend_s3/) | 18.0.1.1.0 | | Implement amazon S3 Storage [storage_backend_sftp](storage_backend_sftp/) | 18.0.1.0.0 | | Implement SFTP Storage -[storage_file](storage_file/) | 18.0.1.2.0 | | Storage file in storage backend +[storage_file](storage_file/) | 18.0.1.3.0 | | Storage file in storage backend [storage_file_swap_backend_queue](storage_file_swap_backend_queue/) | 18.0.1.1.0 | simahawk | Delegate storage file backend swap to queue jobs -[storage_image](storage_image/) | 18.0.1.2.0 | | Store image and resized image in a storage backend +[storage_image](storage_image/) | 18.0.1.3.0 | | Store image and resized image in a storage backend [storage_image_product](storage_image_product/) | 18.0.1.1.0 | | Link images to products and categories -[storage_media](storage_media/) | 18.0.1.3.0 | | Give the posibility to store media data in Odoo +[storage_media](storage_media/) | 18.0.1.4.0 | | Give the posibility to store media data in Odoo [storage_media_product](storage_media_product/) | 18.0.1.1.0 | | Link media to products and categories [storage_thumbnail](storage_thumbnail/) | 18.0.1.1.0 | | Abstract module that add the possibility to have thumbnail diff --git a/storage_backend/README.rst b/storage_backend/README.rst index 381ab35a67..e565dc2c16 100644 --- a/storage_backend/README.rst +++ b/storage_backend/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 + =============== Storage Backend =============== @@ -7,13 +11,13 @@ Storage Backend !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:7b577a9f96f6fa3f26a6fa5603de86b8bca5cc78f82d1ed2948b84766989f458 + !! source digest: sha256:93486c7bc0b8c99e2e3fa71a055f5e4e43bf92c40926732f17bb557116c84b97 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status :alt: Production/Stable -.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-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 @@ -66,15 +70,15 @@ Authors Contributors ------------ -- Sébastien BEAU -- Raphaël Reverdy -- Florian da Costa -- Cédric Pigeon -- Renato Lima -- Benoît Guillot -- Laurent Mignon -- Denis Roussel -- Thien Vo +- Sébastien BEAU +- Raphaël Reverdy +- Florian da Costa +- Cédric Pigeon +- Renato Lima +- Benoît Guillot +- Laurent Mignon +- Denis Roussel +- Thien Vo Other credits ------------- diff --git a/storage_backend/__manifest__.py b/storage_backend/__manifest__.py index 3959cdbe63..54910063b2 100644 --- a/storage_backend/__manifest__.py +++ b/storage_backend/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Storage Backend", "summary": "Implement the concept of Storage with amazon S3, sftp...", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "category": "Storage", "website": "https://github.com/OCA/storage", "author": " Akretion, Odoo Community Association (OCA)", @@ -15,6 +15,7 @@ "depends": ["base", "component", "server_environment"], "data": [ "views/backend_storage_view.xml", + "views/storage_backend_category_view.xml", "data/data.xml", "security/ir.model.access.csv", ], diff --git a/storage_backend/i18n/es.po b/storage_backend/i18n/es.po index dd0bbfcc51..d314dff078 100644 --- a/storage_backend/i18n/es.po +++ b/storage_backend/i18n/es.po @@ -32,6 +32,23 @@ msgstr "Tipo de servidor" msgid "Backend Type Env Default" msgstr "Tipo de servidor Ent Por defecto" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__backend_ids +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +msgid "Backends" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend__categ_id +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_search +msgid "Category" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,help:storage_backend.field_storage_backend__categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_backend #. odoo-python #: code:addons/storage_backend/models/storage_backend.py:0 @@ -46,14 +63,21 @@ msgstr "¡Conexión de Prueba Exitosa!" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_uid msgid "Created by" msgstr "Creado por" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_date msgid "Created on" msgstr "Creado el" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__description +msgid "Description" +msgstr "" + #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__directory_path msgid "Directory Path" @@ -66,6 +90,7 @@ msgstr "Ruta del Directorio Ent Predet" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__display_name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__display_name msgid "Display Name" msgstr "Mostrar Nombre" @@ -87,21 +112,25 @@ msgstr "Tiene Validación" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__id +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__id msgid "ID" msgstr "ID(identificación)" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_uid msgid "Last Updated by" msgstr "Última Actualización por" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_date msgid "Last Updated on" msgstr "Última Actualización el" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__name msgid "Name" msgstr "Nombre" @@ -126,6 +155,15 @@ msgstr "Valores por defecto del Entorno de Servidor" msgid "Storage Backend" msgstr "Servidor de Almacenamiento" +#. module: storage_backend +#: model:ir.actions.act_window,name:storage_backend.act_open_storage_backend_category_view +#: model:ir.model,name:storage_backend.model_storage_backend_category +#: model:ir.ui.menu,name:storage_backend.menu_storage_backend_category +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_search +msgid "Storage Backend Category" +msgstr "" + #. module: storage_backend #: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_form msgid "Test connection" diff --git a/storage_backend/i18n/it.po b/storage_backend/i18n/it.po index 857e437968..2b3f1d59f2 100644 --- a/storage_backend/i18n/it.po +++ b/storage_backend/i18n/it.po @@ -32,6 +32,23 @@ msgstr "Tipo backend" msgid "Backend Type Env Default" msgstr "Tipo backend ambiente predefinito" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__backend_ids +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +msgid "Backends" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend__categ_id +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_search +msgid "Category" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,help:storage_backend.field_storage_backend__categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_backend #. odoo-python #: code:addons/storage_backend/models/storage_backend.py:0 @@ -46,14 +63,21 @@ msgstr "Test connessione avvenuto con successo!" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_uid msgid "Created by" msgstr "Creato da" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_date msgid "Created on" msgstr "Creato il" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__description +msgid "Description" +msgstr "" + #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__directory_path msgid "Directory Path" @@ -66,6 +90,7 @@ msgstr "Percorso cartella ambiente predefinito" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__display_name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__display_name msgid "Display Name" msgstr "Nome visualizzato" @@ -87,21 +112,25 @@ msgstr "Ha validazione" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__id +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__id msgid "ID" msgstr "ID" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_uid msgid "Last Updated by" msgstr "Ultimo aggiornamento di" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_date msgid "Last Updated on" msgstr "Ultimo aggiornamento il" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__name msgid "Name" msgstr "Nome" @@ -126,6 +155,15 @@ msgstr "Predefiniti ambiente server" msgid "Storage Backend" msgstr "Backend deposito" +#. module: storage_backend +#: model:ir.actions.act_window,name:storage_backend.act_open_storage_backend_category_view +#: model:ir.model,name:storage_backend.model_storage_backend_category +#: model:ir.ui.menu,name:storage_backend.menu_storage_backend_category +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_search +msgid "Storage Backend Category" +msgstr "" + #. module: storage_backend #: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_form msgid "Test connection" diff --git a/storage_backend/i18n/storage_backend.pot b/storage_backend/i18n/storage_backend.pot index 2ad02802f2..65aca79709 100644 --- a/storage_backend/i18n/storage_backend.pot +++ b/storage_backend/i18n/storage_backend.pot @@ -29,6 +29,23 @@ msgstr "" msgid "Backend Type Env Default" msgstr "" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__backend_ids +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +msgid "Backends" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend__categ_id +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_search +msgid "Category" +msgstr "" + +#. module: storage_backend +#: model:ir.model.fields,help:storage_backend.field_storage_backend__categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_backend #. odoo-python #: code:addons/storage_backend/models/storage_backend.py:0 @@ -43,14 +60,21 @@ msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_uid msgid "Created by" msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__create_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__create_date msgid "Created on" msgstr "" +#. module: storage_backend +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__description +msgid "Description" +msgstr "" + #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__directory_path msgid "Directory Path" @@ -63,6 +87,7 @@ msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__display_name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__display_name msgid "Display Name" msgstr "" @@ -84,21 +109,25 @@ msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__id +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__id msgid "ID" msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_uid +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_uid msgid "Last Updated by" msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__write_date +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__write_date msgid "Last Updated on" msgstr "" #. module: storage_backend #: model:ir.model.fields,field_description:storage_backend.field_storage_backend__name +#: model:ir.model.fields,field_description:storage_backend.field_storage_backend_category__name msgid "Name" msgstr "" @@ -123,6 +152,15 @@ msgstr "" msgid "Storage Backend" msgstr "" +#. module: storage_backend +#: model:ir.actions.act_window,name:storage_backend.act_open_storage_backend_category_view +#: model:ir.model,name:storage_backend.model_storage_backend_category +#: model:ir.ui.menu,name:storage_backend.menu_storage_backend_category +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_form +#: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_category_view_search +msgid "Storage Backend Category" +msgstr "" + #. module: storage_backend #: model_terms:ir.ui.view,arch_db:storage_backend.storage_backend_view_form msgid "Test connection" diff --git a/storage_backend/models/__init__.py b/storage_backend/models/__init__.py index f45f402268..4a96db5b72 100644 --- a/storage_backend/models/__init__.py +++ b/storage_backend/models/__init__.py @@ -1 +1,2 @@ from . import storage_backend +from . import storage_backend_category diff --git a/storage_backend/models/storage_backend.py b/storage_backend/models/storage_backend.py index 2c4e5af464..bb8541d510 100644 --- a/storage_backend/models/storage_backend.py +++ b/storage_backend/models/storage_backend.py @@ -60,6 +60,12 @@ class StorageBackend(models.Model): _description = "Storage Backend" name = fields.Char(required=True) + categ_id = fields.Many2one( + "storage.backend.category", + string="Category", + ondelete="restrict", + help="Category to group backends for swapping operations", + ) backend_type = fields.Selection( selection=[("filesystem", "Filesystem")], required=True, default="filesystem" ) diff --git a/storage_backend/models/storage_backend_category.py b/storage_backend/models/storage_backend_category.py new file mode 100644 index 0000000000..a4e898435b --- /dev/null +++ b/storage_backend/models/storage_backend_category.py @@ -0,0 +1,14 @@ +# Copyright 2026 Camptocamp SA +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class StorageBackendCategory(models.Model): + _name = "storage.backend.category" + _description = "Storage Backend Category" + _order = "name" + + name = fields.Char(required=True, index=True) + description = fields.Text() + backend_ids = fields.One2many("storage.backend", "categ_id", string="Backends") diff --git a/storage_backend/security/ir.model.access.csv b/storage_backend/security/ir.model.access.csv index dd245d4814..1dbee96e50 100644 --- a/storage_backend/security/ir.model.access.csv +++ b/storage_backend/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_storage_backend_edit,storage_backend edit,model_storage_backend,base.group_system,1,1,1,1 +access_storage_backend_category_edit,storage_backend_category edit,model_storage_backend_category,base.group_system,1,1,1,1 diff --git a/storage_backend/static/description/index.html b/storage_backend/static/description/index.html index 046d42905f..fa49bd30f7 100644 --- a/storage_backend/static/description/index.html +++ b/storage_backend/static/description/index.html @@ -3,7 +3,7 @@ -Storage Backend +README.rst -
-

Storage Backend

+
+ + +Odoo Community Association + +
+

Storage Backend

-

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

+

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

Table of contents

    @@ -386,13 +391,13 @@

    Storage Backend

-

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 @@ -400,15 +405,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Akretion
-

Contributors

+

Contributors

-

Other credits

+

Other credits

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

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -440,5 +445,6 @@

Maintainers

+
diff --git a/storage_backend/views/backend_storage_view.xml b/storage_backend/views/backend_storage_view.xml index 5c9735111a..339bf9bf53 100644 --- a/storage_backend/views/backend_storage_view.xml +++ b/storage_backend/views/backend_storage_view.xml @@ -5,6 +5,7 @@ + @@ -30,6 +31,7 @@
+ @@ -42,6 +44,12 @@ + + diff --git a/storage_backend/views/storage_backend_category_view.xml b/storage_backend/views/storage_backend_category_view.xml new file mode 100644 index 0000000000..b85bb63f4e --- /dev/null +++ b/storage_backend/views/storage_backend_category_view.xml @@ -0,0 +1,54 @@ + + + + storage.backend.category + + + + + + + + + storage.backend.category + +
+ + + + + + + + + + + +
+
+
+ + + storage.backend.category + + + + + + + + + Storage Backend Category + ir.actions.act_window + storage.backend.category + list,form + + + + +
diff --git a/storage_file/README.rst b/storage_file/README.rst index eb7a8e63af..36208ba90d 100644 --- a/storage_file/README.rst +++ b/storage_file/README.rst @@ -11,7 +11,7 @@ Storage File !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c7ccd99c8428f973c93fbbdde0021b61a5db3077bc2d7722a2f929611f8ac415 + !! source digest: sha256:1a39ce2643e5a57b4e3f701fc78da93169b1f50f769ad33acdeda1de1691fa4f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png diff --git a/storage_file/__manifest__.py b/storage_file/__manifest__.py index 87c22813d0..510b1d59b9 100644 --- a/storage_file/__manifest__.py +++ b/storage_file/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Storage File", "summary": "Storage file in storage backend", - "version": "18.0.1.2.0", + "version": "18.0.1.3.0", "category": "Storage", "website": "https://github.com/OCA/storage", "author": " Akretion, Odoo Community Association (OCA)", diff --git a/storage_file/i18n/it.po b/storage_file/i18n/it.po index fc633a1c24..f1283e7f61 100644 --- a/storage_file/i18n/it.po +++ b/storage_file/i18n/it.po @@ -56,6 +56,11 @@ msgstr "" msgid "Backend" msgstr "" +#. module: storage_file +#: model:ir.model.fields,field_description:storage_file.field_storage_file__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_backend__backend_view_use_internal_url msgid "Backend View Use Internal Url" @@ -81,6 +86,12 @@ msgstr "URL base per i file" msgid "Cancel" msgstr "" +#. module: storage_file +#: model:ir.model.fields,help:storage_file.field_storage_file__backend_categ_id +#: model:ir.model.fields,help:storage_file.field_storage_file_swap_backend__source_backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_file__checksum msgid "Checksum/SHA1" @@ -149,6 +160,12 @@ msgstr "" msgid "Destination Storage" msgstr "" +#. module: storage_file +#. odoo-python +#: code:addons/storage_file/models/storage_file.py:0 +msgid "Destination backend category must match source backend category for %s." +msgstr "" + #. module: storage_file #. odoo-python #: code:addons/storage_file/wizards/swap_backend.py:0 @@ -392,6 +409,11 @@ msgstr "Frazione" msgid "Slug-ified name with ID for URL" msgstr "Nome frazionato con ID per URL" +#. module: storage_file +#: model:ir.model.fields,field_description:storage_file.field_storage_file_swap_backend__source_backend_categ_id +msgid "Source Backend Category" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_file_swap_backend__source_backend_id msgid "Source Storage" diff --git a/storage_file/i18n/storage_file.pot b/storage_file/i18n/storage_file.pot index 5078abea17..ca4b408bf3 100644 --- a/storage_file/i18n/storage_file.pot +++ b/storage_file/i18n/storage_file.pot @@ -51,6 +51,11 @@ msgstr "" msgid "Backend" msgstr "" +#. module: storage_file +#: model:ir.model.fields,field_description:storage_file.field_storage_file__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_backend__backend_view_use_internal_url msgid "Backend View Use Internal Url" @@ -76,6 +81,12 @@ msgstr "" msgid "Cancel" msgstr "" +#. module: storage_file +#: model:ir.model.fields,help:storage_file.field_storage_file__backend_categ_id +#: model:ir.model.fields,help:storage_file.field_storage_file_swap_backend__source_backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_file__checksum msgid "Checksum/SHA1" @@ -133,6 +144,13 @@ msgstr "" msgid "Destination Storage" msgstr "" +#. module: storage_file +#. odoo-python +#: code:addons/storage_file/models/storage_file.py:0 +msgid "" +"Destination backend category must match source backend category for %s." +msgstr "" + #. module: storage_file #. odoo-python #: code:addons/storage_file/wizards/swap_backend.py:0 @@ -367,6 +385,11 @@ msgstr "" msgid "Slug-ified name with ID for URL" msgstr "" +#. module: storage_file +#: model:ir.model.fields,field_description:storage_file.field_storage_file_swap_backend__source_backend_categ_id +msgid "Source Backend Category" +msgstr "" + #. module: storage_file #: model:ir.model.fields,field_description:storage_file.field_storage_file_swap_backend__source_backend_id msgid "Source Storage" diff --git a/storage_file/models/storage_file.py b/storage_file/models/storage_file.py index b76c0d05e5..f5b5282c12 100644 --- a/storage_file/models/storage_file.py +++ b/storage_file/models/storage_file.py @@ -36,6 +36,11 @@ class StorageFile(models.Model): required=True, default=lambda self: self._get_default_backend_id(), ) + backend_categ_id = fields.Many2one( + "storage.backend.category", + related="backend_id.categ_id", + string="Backend Category", + ) url = fields.Char(compute="_compute_url", help="HTTP accessible path to the file") url_path = fields.Char( compute="_compute_url_path", help="Accessible path, no base URL" @@ -293,6 +298,18 @@ def _swap_backend(self, new_backend): new_backend.name, ) ) + if not self.env.context.get("swap_backend_bypass_category_check"): + for record in self.sudo(): + if not record.exists() or record.backend_id == new_backend: + continue + if record.backend_id.categ_id != new_backend.categ_id: + raise UserError( + self.env._( + "Destination backend category must match source backend " + "category for %s.", + record.name, + ) + ) moved = [] failed = [] for record in self.sudo(): diff --git a/storage_file/static/description/index.html b/storage_file/static/description/index.html index 8f336fd518..4391f4351a 100644 --- a/storage_file/static/description/index.html +++ b/storage_file/static/description/index.html @@ -372,7 +372,7 @@

Storage File

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:c7ccd99c8428f973c93fbbdde0021b61a5db3077bc2d7722a2f929611f8ac415 +!! source digest: sha256:1a39ce2643e5a57b4e3f701fc78da93169b1f50f769ad33acdeda1de1691fa4f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

External file management depending on Storage Backend module.

diff --git a/storage_file/tests/test_swap_backend.py b/storage_file/tests/test_swap_backend.py index 5575be4b77..16b237e9db 100644 --- a/storage_file/tests/test_swap_backend.py +++ b/storage_file/tests/test_swap_backend.py @@ -5,6 +5,8 @@ import base64 from unittest import mock +from lxml import etree + from odoo.exceptions import UserError from odoo.tests import Form @@ -74,6 +76,33 @@ def test_swap_requires_destination_filename_strategy(self): with self.assertRaisesRegex(UserError, "The filename strategy is empty"): stfile._swap_backend(self.backend_b) + def test_swap_rejects_different_backend_category(self): + src_categ = self.env["storage.backend.category"].create({"name": "SRC"}) + dst_categ = self.env["storage.backend.category"].create({"name": "DST"}) + self.backend_a.categ_id = src_categ + self.backend_b.categ_id = dst_categ + stfile = self._create_storage_file(backend=self.backend_a) + + with self.assertRaisesRegex( + UserError, "Destination backend category must match source backend category" + ): + stfile._swap_backend(self.backend_b) + + def test_swap_allows_different_backend_category_with_bypass(self): + src_categ = self.env["storage.backend.category"].create({"name": "SRC"}) + dst_categ = self.env["storage.backend.category"].create({"name": "DST"}) + self.backend_a.categ_id = src_categ + self.backend_b.categ_id = dst_categ + stfile = self._create_storage_file(backend=self.backend_a, data=b"payload") + + result = stfile.with_context( + swap_backend_bypass_category_check=True + )._swap_backend(self.backend_b) + + self.assertEqual(stfile.backend_id, self.backend_b) + self.assertEqual(base64.b64decode(stfile.data), b"payload") + self.assertIn(stfile.name, result["moved"][0]) + def test_swap_failure_reports_in_failed(self): """Upload failure is caught and reported in the failed list.""" stfile = self._create_storage_file(data=b"payload") @@ -204,3 +233,57 @@ def test_write_backend_id_noop_if_same(self): stfile.backend_id = self.backend_a self.assertEqual(stfile.backend_id, self.backend_a) self.assertEqual(stfile.relative_path, old_path) + + # -- category-based filtering ---------------------------------------- + + def test_wizard_form_same_category_shown_as_dest(self): + """Wizard declares and applies a same-category destination domain.""" + categ = self.env["storage.backend.category"].create({"name": "Group A"}) + categ2 = self.env["storage.backend.category"].create({"name": "Group B"}) + backend_a_cat = self.backend_a.copy( + { + "name": "Backend A (Group A)", + "categ_id": categ.id, + "directory_path": "a_cat", + } + ) + backend_b_cat = self.backend_b.copy( + { + "name": "Backend B (Group A)", + "categ_id": categ.id, + "directory_path": "b_cat", + } + ) + backend_other = self.backend_a.copy( + { + "name": "Backend (Group B)", + "categ_id": categ2.id, + "directory_path": "other", + } + ) + stfile = self._create_storage_file(backend=backend_a_cat) + + # Assert the actual domain declared in the form view arch. + view = self.env.ref("storage_file.storage_file_swap_backend_view_form") + xml = etree.fromstring(view.arch_db.encode()) + dest_field = xml.xpath("//field[@name='dest_backend_id']") + self.assertEqual(len(dest_field), 1) + domain = dest_field[0].get("domain") + self.assertIn("('id', '!=', source_backend_id)", domain) + self.assertIn("('categ_id', '=', source_backend_categ_id)", domain) + self.assertNotIn("source_backend_id.categ_id", domain) + + with Form( + self.env["storage.file.swap.backend"].with_context( + active_model="storage.file", + active_ids=stfile.ids, + ) + ) as wiz_form: + self.assertEqual(wiz_form.source_backend_id, backend_a_cat) + # domain: categ_id = Group A → Group B backend excluded + same_categ_backends = self.env["storage.backend"].search( + [("categ_id", "=", categ.id), ("id", "!=", backend_a_cat.id)] + ) + self.assertIn(backend_b_cat, same_categ_backends) + self.assertNotIn(backend_other, same_categ_backends) + wiz_form.dest_backend_id = backend_b_cat diff --git a/storage_file/views/storage_file_view.xml b/storage_file/views/storage_file_view.xml index a922416d1d..acc313b06f 100644 --- a/storage_file/views/storage_file_view.xml +++ b/storage_file/views/storage_file_view.xml @@ -23,7 +23,11 @@ - + + diff --git a/storage_file/wizards/swap_backend.py b/storage_file/wizards/swap_backend.py index 6cb36245c8..fe82cb5eda 100644 --- a/storage_file/wizards/swap_backend.py +++ b/storage_file/wizards/swap_backend.py @@ -19,10 +19,15 @@ class StorageFileSwapBackend(models.TransientModel): string="Source Storage", readonly=True, ) + source_backend_categ_id = fields.Many2one( + "storage.backend.category", + related="source_backend_id.categ_id", + string="Source Backend Category", + readonly=True, + ) dest_backend_id = fields.Many2one( "storage.backend", string="Destination Storage", - domain="[('id', '!=', source_backend_id)]", ) file_ids = fields.Many2many( "storage.file", diff --git a/storage_file/wizards/swap_backend.xml b/storage_file/wizards/swap_backend.xml index 5aac2f5e81..66c5e0a11b 100644 --- a/storage_file/wizards/swap_backend.xml +++ b/storage_file/wizards/swap_backend.xml @@ -10,11 +10,26 @@
- - + + + - + diff --git a/storage_image/README.rst b/storage_image/README.rst index b119ddd1e8..bf59199252 100644 --- a/storage_image/README.rst +++ b/storage_image/README.rst @@ -11,7 +11,7 @@ Storage Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5d665efc3d0b5c44f7dec44b33a76b1f1d53557ca28803cdaf1613f2814bb73b + !! source digest: sha256:712e4584c2da173c5f4276cd4c4a84ede999188592a0ff0c8f82c118754bc178 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png diff --git a/storage_image/__manifest__.py b/storage_image/__manifest__.py index e91a2d1dd4..14761d5c7a 100644 --- a/storage_image/__manifest__.py +++ b/storage_image/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Storage Image", "summary": "Store image and resized image in a storage backend", - "version": "18.0.1.2.0", + "version": "18.0.1.3.0", "category": "Storage", "website": "https://github.com/OCA/storage", "author": " Akretion, Odoo Community Association (OCA)", diff --git a/storage_image/i18n/it.po b/storage_image/i18n/it.po index d779ad2cf3..5131eadb18 100644 --- a/storage_image/i18n/it.po +++ b/storage_image/i18n/it.po @@ -48,11 +48,21 @@ msgstr "Nome alternativo immagine" msgid "Backend" msgstr "" +#. module: storage_image +#: model:ir.model.fields,field_description:storage_image.field_storage_image__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_image #: model_terms:ir.ui.view,arch_db:storage_image.storage_file_replace_view_form msgid "Cancel" msgstr "Annulla" +#. module: storage_image +#: model:ir.model.fields,help:storage_image.field_storage_image__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_image #: model:ir.model.fields,field_description:storage_image.field_storage_image__checksum msgid "Checksum/SHA1" diff --git a/storage_image/i18n/storage_image.pot b/storage_image/i18n/storage_image.pot index c8dc2ae4e6..ebafffa6f0 100644 --- a/storage_image/i18n/storage_image.pot +++ b/storage_image/i18n/storage_image.pot @@ -45,11 +45,21 @@ msgstr "" msgid "Backend" msgstr "" +#. module: storage_image +#: model:ir.model.fields,field_description:storage_image.field_storage_image__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_image #: model_terms:ir.ui.view,arch_db:storage_image.storage_file_replace_view_form msgid "Cancel" msgstr "" +#. module: storage_image +#: model:ir.model.fields,help:storage_image.field_storage_image__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_image #: model:ir.model.fields,field_description:storage_image.field_storage_image__checksum msgid "Checksum/SHA1" diff --git a/storage_image/static/description/index.html b/storage_image/static/description/index.html index da1d4dfef7..b1cce27b65 100644 --- a/storage_image/static/description/index.html +++ b/storage_image/static/description/index.html @@ -372,7 +372,7 @@

Storage Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:5d665efc3d0b5c44f7dec44b33a76b1f1d53557ca28803cdaf1613f2814bb73b +!! source digest: sha256:712e4584c2da173c5f4276cd4c4a84ede999188592a0ff0c8f82c118754bc178 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

External image management depending on Storage File module.

diff --git a/storage_image/views/storage_image.xml b/storage_image/views/storage_image.xml index 42338506e2..be5c875edd 100644 --- a/storage_image/views/storage_image.xml +++ b/storage_image/views/storage_image.xml @@ -40,7 +40,11 @@ - + + diff --git a/storage_media/__manifest__.py b/storage_media/__manifest__.py index abc65c1a52..983e18c01b 100644 --- a/storage_media/__manifest__.py +++ b/storage_media/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Storage Media", "summary": "Give the posibility to store media data in Odoo", - "version": "18.0.1.3.0", + "version": "18.0.1.4.0", "category": "Uncategorized", "website": "https://github.com/OCA/storage", "author": " Akretion, Odoo Community Association (OCA)", diff --git a/storage_media/i18n/it.po b/storage_media/i18n/it.po index 35fdc13e77..6940df6f06 100644 --- a/storage_media/i18n/it.po +++ b/storage_media/i18n/it.po @@ -42,11 +42,21 @@ msgstr "In archivio" msgid "Backend" msgstr "" +#. module: storage_media +#: model:ir.model.fields,field_description:storage_media.field_storage_media__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_media #: model_terms:ir.ui.view,arch_db:storage_media.storage_file_replace_view_form msgid "Cancel" msgstr "Annulla" +#. module: storage_media +#: model:ir.model.fields,help:storage_media.field_storage_media__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_media #: model:ir.model.fields,field_description:storage_media.field_storage_media__checksum msgid "Checksum/SHA1" diff --git a/storage_media/i18n/storage_media.pot b/storage_media/i18n/storage_media.pot index 7203d9caea..753eda546b 100644 --- a/storage_media/i18n/storage_media.pot +++ b/storage_media/i18n/storage_media.pot @@ -39,11 +39,21 @@ msgstr "" msgid "Backend" msgstr "" +#. module: storage_media +#: model:ir.model.fields,field_description:storage_media.field_storage_media__backend_categ_id +msgid "Backend Category" +msgstr "" + #. module: storage_media #: model_terms:ir.ui.view,arch_db:storage_media.storage_file_replace_view_form msgid "Cancel" msgstr "" +#. module: storage_media +#: model:ir.model.fields,help:storage_media.field_storage_media__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_media #: model:ir.model.fields,field_description:storage_media.field_storage_media__checksum msgid "Checksum/SHA1" diff --git a/storage_media/views/storage_media_view.xml b/storage_media/views/storage_media_view.xml index 20ba7494c6..0f84abd25f 100644 --- a/storage_media/views/storage_media_view.xml +++ b/storage_media/views/storage_media_view.xml @@ -35,7 +35,11 @@ - + +
diff --git a/storage_thumbnail/i18n/it.po b/storage_thumbnail/i18n/it.po index 5403a71050..f1a5fc5009 100644 --- a/storage_thumbnail/i18n/it.po +++ b/storage_thumbnail/i18n/it.po @@ -26,6 +26,16 @@ msgstr "Percorso accessibile, non URL base" msgid "Active" msgstr "Attivo" +#. module: storage_thumbnail +#: model:ir.model.fields,field_description:storage_thumbnail.field_storage_thumbnail__backend_categ_id +msgid "Backend Category" +msgstr "" + +#. module: storage_thumbnail +#: model:ir.model.fields,help:storage_thumbnail.field_storage_thumbnail__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_thumbnail #: model:ir.model.fields,field_description:storage_thumbnail.field_storage_thumbnail__checksum msgid "Checksum/SHA1" diff --git a/storage_thumbnail/i18n/storage_thumbnail.pot b/storage_thumbnail/i18n/storage_thumbnail.pot index adc4158782..86177432aa 100644 --- a/storage_thumbnail/i18n/storage_thumbnail.pot +++ b/storage_thumbnail/i18n/storage_thumbnail.pot @@ -23,6 +23,16 @@ msgstr "" msgid "Active" msgstr "" +#. module: storage_thumbnail +#: model:ir.model.fields,field_description:storage_thumbnail.field_storage_thumbnail__backend_categ_id +msgid "Backend Category" +msgstr "" + +#. module: storage_thumbnail +#: model:ir.model.fields,help:storage_thumbnail.field_storage_thumbnail__backend_categ_id +msgid "Category to group backends for swapping operations" +msgstr "" + #. module: storage_thumbnail #: model:ir.model.fields,field_description:storage_thumbnail.field_storage_thumbnail__checksum msgid "Checksum/SHA1"